From a2cf659ad8ecbc5be6b0fca4efd29441e1a13be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Tue, 7 Dec 2021 13:00:02 +0100 Subject: [PATCH] dtc: support printing binary data with fdtget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's needed for extracting binary images. Cc: Yousong Zhou Signed-off-by: Rafał Miłecki --- ...t-for-printing-raw-bytes-with-fdtget.patch | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch diff --git a/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch b/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch new file mode 100644 index 00000000000..f7731f1a9d5 --- /dev/null +++ b/package/utils/dtc/patches/0001-Support-r-format-for-printing-raw-bytes-with-fdtget.patch @@ -0,0 +1,137 @@ +From 17739b7ef510917471409d71fb45d8eaf6a1e1fb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Thu, 9 Dec 2021 07:14:20 +0100 +Subject: [PATCH] Support 'r' format for printing raw bytes with fdtget +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +FT is sometimes used for storing raw data. That is quite common for +U-Boot FIT images. + +Extracting such data is not trivial currently. Using type 's' (string) +will replace every 0x00 (NUL) with 0x20 (space). Using type 'x' will +print bytes but in xxd incompatible format. + +This commit adds support for 'r' (raw) format. Example usage: +fdtget -t r firmware.itb /images/foo data > image.raw + +Support for encoding isn't added as there isn't any clean way of passing +binary data as command line argument. + +Signed-off-by: Rafał Miłecki +Message-Id: <20211209061420.29466-1-zajec5@gmail.com> +Signed-off-by: David Gibson +--- + Documentation/manual.txt | 2 +- + fdtget.c | 5 +++++ + fdtput.c | 2 ++ + tests/run_tests.sh | 2 ++ + tests/utilfdt_test.c | 5 ++++- + util.c | 4 ++-- + util.h | 3 ++- + 7 files changed, 18 insertions(+), 5 deletions(-) + +--- a/Documentation/manual.txt ++++ b/Documentation/manual.txt +@@ -712,7 +712,7 @@ The syntax of the fdtget command is: + + where options are: + +- s=string, i=int, u=unsigned, x=hex ++ s=string, i=int, u=unsigned, x=hex, r=raw + Optional modifier prefix: + hh or b=byte, h=2 byte, l=4 byte (default) + +--- a/fdtget.c ++++ b/fdtget.c +@@ -91,6 +91,11 @@ static int show_data(struct display_info + if (len == 0) + return 0; + ++ if (disp->type == 'r') { ++ fwrite(data, 1, len, stdout); ++ return 0; ++ } ++ + is_string = (disp->type) == 's' || + (!disp->type && util_is_printable_string(data, len)); + if (is_string) { +--- a/fdtput.c ++++ b/fdtput.c +@@ -433,6 +433,8 @@ int main(int argc, char *argv[]) + if (utilfdt_decode_type(optarg, &disp.type, + &disp.size)) + usage("Invalid type string"); ++ if (disp.type == 'r') ++ usage("Unsupported raw data type"); + break; + + case 'v': +--- a/tests/run_tests.sh ++++ b/tests/run_tests.sh +@@ -852,6 +852,8 @@ fdtget_tests () { + run_fdtget_test 8000 -tx $dtb /cpus/PowerPC,970@1 d-cache-size + run_fdtget_test "61 62 63 0" -tbx $dtb /randomnode tricky1 + run_fdtget_test "a b c d de ea ad be ef" -tbx $dtb /randomnode blob ++ run_fdtget_test "MyBoardName\0MyBoardFamilyName\0" -tr $dtb / compatible ++ run_fdtget_test "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" -tr $dtb /randomnode blob + + # Here the property size is not a multiple of 4 bytes, so it should fail + run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed +--- a/tests/utilfdt_test.c ++++ b/tests/utilfdt_test.c +@@ -73,6 +73,9 @@ static void check_sizes(char *modifier, + + *ptr = 's'; + check(fmt, 's', -1); ++ ++ *ptr = 'r'; ++ check(fmt, 'r', -1); + } + + static void test_utilfdt_decode_type(void) +@@ -90,7 +93,7 @@ static void test_utilfdt_decode_type(voi + /* try every other character */ + checkfail(""); + for (ch = ' '; ch < 127; ch++) { +- if (!strchr("iuxs", ch)) { ++ if (!strchr("iuxsr", ch)) { + *fmt = ch; + fmt[1] = '\0'; + checkfail(fmt); +--- a/util.c ++++ b/util.c +@@ -353,11 +353,11 @@ int utilfdt_decode_type(const char *fmt, + } + + /* we should now have a type */ +- if ((*fmt == '\0') || !strchr("iuxs", *fmt)) ++ if ((*fmt == '\0') || !strchr("iuxsr", *fmt)) + return -1; + + /* convert qualifier (bhL) to byte size */ +- if (*fmt != 's') ++ if (*fmt != 's' && *fmt != 'r') + *size = qualifier == 'b' ? 1 : + qualifier == 'h' ? 2 : + qualifier == 'l' ? 4 : -1; +--- a/util.h ++++ b/util.h +@@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filena + * i signed integer + * u unsigned integer + * x hex ++ * r raw + * + * TODO: Implement ll modifier (8 bytes) + * TODO: Implement o type (octal) +@@ -160,7 +161,7 @@ int utilfdt_decode_type(const char *fmt, + */ + + #define USAGE_TYPE_MSG \ +- "\ts=string, i=int, u=unsigned, x=hex\n" \ ++ "\ts=string, i=int, u=unsigned, x=hex, r=raw\n" \ + "\tOptional modifier prefix:\n" \ + "\t\thh or b=byte, h=2 byte, l=4 byte (default)"; +