Переглянути джерело

dtc: support printing binary data with fdtget

It's needed for extracting binary images.

Cc: Yousong Zhou <[email protected]>
Signed-off-by: Rafał Miłecki <[email protected]>
Rafał Miłecki 3 роки тому
батько
коміт
a2cf659ad8

+ 137 - 0
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?= <[email protected]>
+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 <[email protected]>
+Message-Id: <[email protected]>
+Signed-off-by: David Gibson <[email protected]>
+---
+ 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:
+ 
+-    <type>    s=string, i=int, u=unsigned, x=hex
++    <type>    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 \
+-	"<type>\ts=string, i=int, u=unsigned, x=hex\n" \
++	"<type>\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)";
+