devicetree-compiler.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Support 'b' format for printing raw bytes with fdtget
@ 2021-12-06 15:49 Rafał Miłecki
       [not found] ` <20211206154953.17089-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-06 15:49 UTC (permalink / raw)
  To: David Gibson, Jon Loeliger
  Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

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 'b' (binary) format. Example usage:
fdtget -t b firmware.itb /images/foo data > image.raw

Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
 fdtget.c |  5 +++++
 util.c   | 24 ++++++++++++++----------
 2 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/fdtget.c b/fdtget.c
index 54fc6a0..6e4abf1 100644
--- a/fdtget.c
+++ b/fdtget.c
@@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
 	if (len == 0)
 		return 0;
 
+	if (disp->type == 'b') {
+		fwrite(data, 1, len, stdout);
+		return 0;
+	}
+
 	is_string = (disp->type) == 's' ||
 		(!disp->type && util_is_printable_string(data, len));
 	if (is_string) {
diff --git a/util.c b/util.c
index 40274fb..4fa76c5 100644
--- a/util.c
+++ b/util.c
@@ -340,24 +340,28 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
 
 	/* get the conversion qualifier */
 	*size = -1;
-	if (strchr("hlLb", *fmt)) {
-		qualifier = *fmt++;
-		if (qualifier == *fmt) {
-			switch (*fmt++) {
-/* TODO:		case 'l': qualifier = 'L'; break;*/
-			case 'h':
+	for (; *(fmt + 1); fmt++) {
+		if (!strchr("hlLb", *fmt))
+			return -1;
+		if (qualifier) {
+			if (*fmt == 'h' && qualifier == 'h')
 				qualifier = 'b';
-				break;
-			}
+			else
+				return -1;
+		} else {
+			qualifier = *fmt;
 		}
 	}
 
 	/* we should now have a type */
-	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
+	if (!strchr("iuxsb", *fmt)) {
+		if (*fmt)
+			fprintf(stderr, "invalid type: %c\n", *fmt);
 		return -1;
+	}
 
 	/* convert qualifier (bhL) to byte size */
-	if (*fmt != 's')
+	if (*fmt != 's' && *fmt != 'b')
 		*size = qualifier == 'b' ? 1 :
 				qualifier == 'h' ? 2 :
 				qualifier == 'l' ? 4 : -1;
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH] Support 'b' format for printing raw bytes with fdtget
       [not found] ` <20211206154953.17089-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2021-12-07 15:07   ` Simon Glass
  2021-12-08 17:00   ` [PATCH V2] " Rafał Miłecki
  1 sibling, 0 replies; 12+ messages in thread
From: Simon Glass @ 2021-12-07 15:07 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: David Gibson, Jon Loeliger,
	devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

Hi Rafał,

On Mon, 6 Dec 2021 at 09:09, Rafał Miłecki <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
>
> 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 'b' (binary) format. Example usage:
> fdtget -t b firmware.itb /images/foo data > image.raw
>
> Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
>  fdtget.c |  5 +++++
>  util.c   | 24 ++++++++++++++----------
>  2 files changed, 19 insertions(+), 10 deletions(-)

I think this is a good idea.

I'm worried about using 'b' which we already use as a modifier. Won't
that be ambiguous? Perhaps not, but it needs a doc update, at least.

Please add to fdtput also

Please add some tests too.

Regards,
SImon

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH V2] Support 'b' format for printing raw bytes with fdtget
       [not found] ` <20211206154953.17089-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2021-12-07 15:07   ` Simon Glass
@ 2021-12-08 17:00   ` Rafał Miłecki
       [not found]     ` <20211208170055.13811-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-08 17:00 UTC (permalink / raw)
  To: David Gibson, Jon Loeliger
  Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

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 'b' (binary) format. Example usage:
fdtget -t b 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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
V2: Update usage info & add tests

Alternatively I could use e.g. "r" (raw) instead of "b" (binary) if you
find it more accurate. Please let me know.
---
 Documentation/manual.txt |  2 +-
 fdtget.c                 |  5 +++++
 fdtput.c                 |  2 ++
 tests/run_tests.sh       |  2 ++
 tests/utilfdt_test.c     |  5 ++++-
 util.c                   | 21 +++++++++++----------
 util.h                   |  3 ++-
 7 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/Documentation/manual.txt b/Documentation/manual.txt
index 97e53b9..73e0593 100644
--- 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, b=binary
         Optional modifier prefix:
             hh or b=byte, h=2 byte, l=4 byte (default)
 
diff --git a/fdtget.c b/fdtget.c
index 54fc6a0..6e4abf1 100644
--- a/fdtget.c
+++ b/fdtget.c
@@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
 	if (len == 0)
 		return 0;
 
+	if (disp->type == 'b') {
+		fwrite(data, 1, len, stdout);
+		return 0;
+	}
+
 	is_string = (disp->type) == 's' ||
 		(!disp->type && util_is_printable_string(data, len));
 	if (is_string) {
diff --git a/fdtput.c b/fdtput.c
index 428745a..99b0bf9 100644
--- 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 == 'b')
+				usage("Unsupported binary data type");
 			break;
 
 		case 'v':
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index d100d5a..484be18 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -855,6 +855,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" -tb $dtb / compatible
+    run_fdtget_test "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" -tb $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
diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
index c621759..906f250 100644
--- a/tests/utilfdt_test.c
+++ b/tests/utilfdt_test.c
@@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
 
 	*ptr = 's';
 	check(fmt, 's', -1);
+
+	*ptr = 'b';
+	check(fmt, 'b', -1);
 }
 
 static void test_utilfdt_decode_type(void)
@@ -90,7 +93,7 @@ static void test_utilfdt_decode_type(void)
 	/* try every other character */
 	checkfail("");
 	for (ch = ' '; ch < 127; ch++) {
-		if (!strchr("iuxs", ch)) {
+		if (!strchr("iuxsb", ch)) {
 			*fmt = ch;
 			fmt[1] = '\0';
 			checkfail(fmt);
diff --git a/util.c b/util.c
index 40274fb..b9e88f1 100644
--- a/util.c
+++ b/util.c
@@ -340,24 +340,25 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
 
 	/* get the conversion qualifier */
 	*size = -1;
-	if (strchr("hlLb", *fmt)) {
-		qualifier = *fmt++;
-		if (qualifier == *fmt) {
-			switch (*fmt++) {
-/* TODO:		case 'l': qualifier = 'L'; break;*/
-			case 'h':
+	for (; *(fmt + 1); fmt++) {
+		if (!strchr("hlLb", *fmt))
+			return -1;
+		if (qualifier) {
+			if (*fmt == 'h' && qualifier == 'h')
 				qualifier = 'b';
-				break;
-			}
+			else
+				return -1;
+		} else {
+			qualifier = *fmt;
 		}
 	}
 
 	/* we should now have a type */
-	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
+	if (!strchr("iuxsb", *fmt))
 		return -1;
 
 	/* convert qualifier (bhL) to byte size */
-	if (*fmt != 's')
+	if (*fmt != 's' && *fmt != 'b')
 		*size = qualifier == 'b' ? 1 :
 				qualifier == 'h' ? 2 :
 				qualifier == 'l' ? 4 : -1;
diff --git a/util.h b/util.h
index c45b2c2..fa381fc 100644
--- a/util.h
+++ b/util.h
@@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
  *		i	signed integer
  *		u	unsigned integer
  *		x	hex
+ *		b	binary
  *
  * TODO: Implement ll modifier (8 bytes)
  * TODO: Implement o type (octal)
@@ -160,7 +161,7 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size);
  */
 
 #define USAGE_TYPE_MSG \
-	"<type>\ts=string, i=int, u=unsigned, x=hex\n" \
+	"<type>\ts=string, i=int, u=unsigned, x=hex, b=binary\n" \
 	"\tOptional modifier prefix:\n" \
 	"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH V2] Support 'b' format for printing raw bytes with fdtget
       [not found]     ` <20211208170055.13811-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2021-12-09  2:22       ` David Gibson
  2021-12-09  5:30       ` [PATCH V3] Support 'r' " Rafał Miłecki
  1 sibling, 0 replies; 12+ messages in thread
From: David Gibson @ 2021-12-09  2:22 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

[-- Attachment #1: Type: text/plain, Size: 6188 bytes --]

On Wed, Dec 08, 2021 at 06:00:55PM +0100, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> 
> 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 'b' (binary) format. Example usage:
> fdtget -t b 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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
> V2: Update usage info & add tests
> 
> Alternatively I could use e.g. "r" (raw) instead of "b" (binary) if you
> find it more accurate. Please let me know.
> ---
>  Documentation/manual.txt |  2 +-
>  fdtget.c                 |  5 +++++
>  fdtput.c                 |  2 ++
>  tests/run_tests.sh       |  2 ++
>  tests/utilfdt_test.c     |  5 ++++-
>  util.c                   | 21 +++++++++++----------
>  util.h                   |  3 ++-
>  7 files changed, 27 insertions(+), 13 deletions(-)
> 
> diff --git a/Documentation/manual.txt b/Documentation/manual.txt
> index 97e53b9..73e0593 100644
> --- 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, b=binary
>          Optional modifier prefix:
>              hh or b=byte, h=2 byte, l=4 byte (default)

I don't think using "b" as both a type specifier, and a length
modifier is a good idea.  You can probably disambiguate them in
parsing, but it's still likely to cause confusion.

How about "r" for "raw"?

>  
> diff --git a/fdtget.c b/fdtget.c
> index 54fc6a0..6e4abf1 100644
> --- a/fdtget.c
> +++ b/fdtget.c
> @@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
>  	if (len == 0)
>  		return 0;
>  
> +	if (disp->type == 'b') {
> +		fwrite(data, 1, len, stdout);
> +		return 0;
> +	}
> +
>  	is_string = (disp->type) == 's' ||
>  		(!disp->type && util_is_printable_string(data, len));
>  	if (is_string) {
> diff --git a/fdtput.c b/fdtput.c
> index 428745a..99b0bf9 100644
> --- 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 == 'b')
> +				usage("Unsupported binary data type");
>  			break;
>  
>  		case 'v':
> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> index d100d5a..484be18 100755
> --- a/tests/run_tests.sh
> +++ b/tests/run_tests.sh
> @@ -855,6 +855,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" -tb $dtb / compatible
> +    run_fdtget_test "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" -tb $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
> diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
> index c621759..906f250 100644
> --- a/tests/utilfdt_test.c
> +++ b/tests/utilfdt_test.c
> @@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
>  
>  	*ptr = 's';
>  	check(fmt, 's', -1);
> +
> +	*ptr = 'b';
> +	check(fmt, 'b', -1);
>  }
>  
>  static void test_utilfdt_decode_type(void)
> @@ -90,7 +93,7 @@ static void test_utilfdt_decode_type(void)
>  	/* try every other character */
>  	checkfail("");
>  	for (ch = ' '; ch < 127; ch++) {
> -		if (!strchr("iuxs", ch)) {
> +		if (!strchr("iuxsb", ch)) {
>  			*fmt = ch;
>  			fmt[1] = '\0';
>  			checkfail(fmt);
> diff --git a/util.c b/util.c
> index 40274fb..b9e88f1 100644
> --- a/util.c
> +++ b/util.c
> @@ -340,24 +340,25 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
>  
>  	/* get the conversion qualifier */
>  	*size = -1;
> -	if (strchr("hlLb", *fmt)) {
> -		qualifier = *fmt++;
> -		if (qualifier == *fmt) {
> -			switch (*fmt++) {
> -/* TODO:		case 'l': qualifier = 'L'; break;*/
> -			case 'h':
> +	for (; *(fmt + 1); fmt++) {
> +		if (!strchr("hlLb", *fmt))
> +			return -1;
> +		if (qualifier) {
> +			if (*fmt == 'h' && qualifier == 'h')
>  				qualifier = 'b';
> -				break;
> -			}
> +			else
> +				return -1;
> +		} else {
> +			qualifier = *fmt;
>  		}
>  	}
>  
>  	/* we should now have a type */
> -	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
> +	if (!strchr("iuxsb", *fmt))
>  		return -1;
>  
>  	/* convert qualifier (bhL) to byte size */
> -	if (*fmt != 's')
> +	if (*fmt != 's' && *fmt != 'b')
>  		*size = qualifier == 'b' ? 1 :
>  				qualifier == 'h' ? 2 :
>  				qualifier == 'l' ? 4 : -1;
> diff --git a/util.h b/util.h
> index c45b2c2..fa381fc 100644
> --- a/util.h
> +++ b/util.h
> @@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
>   *		i	signed integer
>   *		u	unsigned integer
>   *		x	hex
> + *		b	binary
>   *
>   * TODO: Implement ll modifier (8 bytes)
>   * TODO: Implement o type (octal)
> @@ -160,7 +161,7 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size);
>   */
>  
>  #define USAGE_TYPE_MSG \
> -	"<type>\ts=string, i=int, u=unsigned, x=hex\n" \
> +	"<type>\ts=string, i=int, u=unsigned, x=hex, b=binary\n" \
>  	"\tOptional modifier prefix:\n" \
>  	"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH V3] Support 'r' format for printing raw bytes with fdtget
       [not found]     ` <20211208170055.13811-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2021-12-09  2:22       ` David Gibson
@ 2021-12-09  5:30       ` Rafał Miłecki
       [not found]         ` <20211209053041.17984-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-09  5:30 UTC (permalink / raw)
  To: David Gibson, Jon Loeliger
  Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
V2: Update usage info & add tests
V3: Use "r" instead of "b" to avoid confusiong with qualifier
---
 Documentation/manual.txt |  2 +-
 fdtget.c                 |  5 +++++
 fdtput.c                 |  2 ++
 tests/run_tests.sh       |  2 ++
 tests/utilfdt_test.c     |  5 ++++-
 util.c                   | 21 +++++++++++----------
 util.h                   |  3 ++-
 7 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/Documentation/manual.txt b/Documentation/manual.txt
index 97e53b9..cf4b253 100644
--- 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)
 
diff --git a/fdtget.c b/fdtget.c
index 54fc6a0..dd70985 100644
--- a/fdtget.c
+++ b/fdtget.c
@@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
 	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) {
diff --git a/fdtput.c b/fdtput.c
index 428745a..c2fecf4 100644
--- 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':
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index d100d5a..11068e1 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -855,6 +855,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
diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
index c621759..ba6462f 100644
--- a/tests/utilfdt_test.c
+++ b/tests/utilfdt_test.c
@@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
 
 	*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(void)
 	/* 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);
diff --git a/util.c b/util.c
index 40274fb..f4625a0 100644
--- a/util.c
+++ b/util.c
@@ -340,24 +340,25 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
 
 	/* get the conversion qualifier */
 	*size = -1;
-	if (strchr("hlLb", *fmt)) {
-		qualifier = *fmt++;
-		if (qualifier == *fmt) {
-			switch (*fmt++) {
-/* TODO:		case 'l': qualifier = 'L'; break;*/
-			case 'h':
+	for (; *(fmt + 1); fmt++) {
+		if (!strchr("hlLb", *fmt))
+			return -1;
+		if (qualifier) {
+			if (*fmt == 'h' && qualifier == 'h')
 				qualifier = 'b';
-				break;
-			}
+			else
+				return -1;
+		} else {
+			qualifier = *fmt;
 		}
 	}
 
 	/* we should now have a type */
-	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
+	if (!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;
diff --git a/util.h b/util.h
index c45b2c2..7a4e910 100644
--- a/util.h
+++ b/util.h
@@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
  *		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, int *type, int *size);
  */
 
 #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)";
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH V3] Support 'r' format for printing raw bytes with fdtget
       [not found]         ` <20211209053041.17984-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2021-12-09  5:52           ` David Gibson
  2021-12-09  6:06             ` Rafał Miłecki
  2021-12-09  6:14           ` [PATCH V4] " Rafał Miłecki
  1 sibling, 1 reply; 12+ messages in thread
From: David Gibson @ 2021-12-09  5:52 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

[-- Attachment #1: Type: text/plain, Size: 6196 bytes --]

On Thu, Dec 09, 2021 at 06:30:41AM +0100, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> 
> 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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
> V2: Update usage info & add tests
> V3: Use "r" instead of "b" to avoid confusiong with qualifier

Thanks for the update.

> ---
>  Documentation/manual.txt |  2 +-
>  fdtget.c                 |  5 +++++
>  fdtput.c                 |  2 ++
>  tests/run_tests.sh       |  2 ++
>  tests/utilfdt_test.c     |  5 ++++-
>  util.c                   | 21 +++++++++++----------
>  util.h                   |  3 ++-
>  7 files changed, 27 insertions(+), 13 deletions(-)
> 
> diff --git a/Documentation/manual.txt b/Documentation/manual.txt
> index 97e53b9..cf4b253 100644
> --- 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)
>  
> diff --git a/fdtget.c b/fdtget.c
> index 54fc6a0..dd70985 100644
> --- a/fdtget.c
> +++ b/fdtget.c
> @@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
>  	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) {
> diff --git a/fdtput.c b/fdtput.c
> index 428745a..c2fecf4 100644
> --- 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");

It would be nice to allow this for fdtput as well as a follow up.

>  			break;
>  
>  		case 'v':
> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> index d100d5a..11068e1 100755
> --- a/tests/run_tests.sh
> +++ b/tests/run_tests.sh
> @@ -855,6 +855,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

I think using \ escapes in strings will be shell dependent behaviour.
Have you tested this in shells other than bash?

>      # Here the property size is not a multiple of 4 bytes, so it should fail
>      run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed
> diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
> index c621759..ba6462f 100644
> --- a/tests/utilfdt_test.c
> +++ b/tests/utilfdt_test.c
> @@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
>  
>  	*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(void)
>  	/* 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);
> diff --git a/util.c b/util.c
> index 40274fb..f4625a0 100644
> --- a/util.c
> +++ b/util.c
> @@ -340,24 +340,25 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
>  
>  	/* get the conversion qualifier */
>  	*size = -1;
> -	if (strchr("hlLb", *fmt)) {
> -		qualifier = *fmt++;
> -		if (qualifier == *fmt) {
> -			switch (*fmt++) {
> -/* TODO:		case 'l': qualifier = 'L'; break;*/
> -			case 'h':
> +	for (; *(fmt + 1); fmt++) {

With 'r' instead of 'b', I'm not sure you need this extra loop any more.

> +		if (!strchr("hlLb", *fmt))
> +			return -1;
> +		if (qualifier) {
> +			if (*fmt == 'h' && qualifier == 'h')
>  				qualifier = 'b';
> -				break;
> -			}
> +			else
> +				return -1;
> +		} else {
> +			qualifier = *fmt;
>  		}
>  	}
>  
>  	/* we should now have a type */
> -	if ((*fmt == '\0') || !strchr("iuxs", *fmt))
> +	if (!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;
> diff --git a/util.h b/util.h
> index c45b2c2..7a4e910 100644
> --- a/util.h
> +++ b/util.h
> @@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
>   *		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, int *type, int *size);
>   */
>  
>  #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)";
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3] Support 'r' format for printing raw bytes with fdtget
  2021-12-09  5:52           ` David Gibson
@ 2021-12-09  6:06             ` Rafał Miłecki
       [not found]               ` <c59e41fd-bdfc-c419-e68f-0f6086c9b61e-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-09  6:06 UTC (permalink / raw)
  To: David Gibson
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

On 09.12.2021 06:52, David Gibson wrote:
>> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
>> index d100d5a..11068e1 100755
>> --- a/tests/run_tests.sh
>> +++ b/tests/run_tests.sh
>> @@ -855,6 +855,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
> 
> I think using \ escapes in strings will be shell dependent behaviour.
> Have you tested this in shells other than bash?

It isn't back dependent but printf dependent. See fdtget-runtest.sh :
printf '%b\n' "$expect" > $EXPECT

It seems even busybox's printf supports %b:
# printf "%b" "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" | hexdump -C
00000000  0a 0b 0c 0d de ea ad be  ef                       |.........|
00000009

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH V4] Support 'r' format for printing raw bytes with fdtget
       [not found]         ` <20211209053041.17984-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2021-12-09  5:52           ` David Gibson
@ 2021-12-09  6:14           ` Rafał Miłecki
       [not found]             ` <20211209061420.29466-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-09  6:14 UTC (permalink / raw)
  To: David Gibson, Jon Loeliger
  Cc: devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
---
V2: Update usage info & add tests
V3: Use "r" instead of "b" to avoid confusiong with qualifier
V4: Don't rework utilfdt_decode_type() code handling qualifiers
---
 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(-)

diff --git a/Documentation/manual.txt b/Documentation/manual.txt
index 97e53b9..cf4b253 100644
--- 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)
 
diff --git a/fdtget.c b/fdtget.c
index 54fc6a0..dd70985 100644
--- a/fdtget.c
+++ b/fdtget.c
@@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
 	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) {
diff --git a/fdtput.c b/fdtput.c
index 428745a..c2fecf4 100644
--- 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':
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index d100d5a..11068e1 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -855,6 +855,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
diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
index c621759..ba6462f 100644
--- a/tests/utilfdt_test.c
+++ b/tests/utilfdt_test.c
@@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
 
 	*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(void)
 	/* 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);
diff --git a/util.c b/util.c
index 40274fb..14d3868 100644
--- a/util.c
+++ b/util.c
@@ -353,11 +353,11 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
 	}
 
 	/* 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;
diff --git a/util.h b/util.h
index c45b2c2..7a4e910 100644
--- a/util.h
+++ b/util.h
@@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
  *		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, int *type, int *size);
  */
 
 #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)";
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH V3] Support 'r' format for printing raw bytes with fdtget
       [not found]               ` <c59e41fd-bdfc-c419-e68f-0f6086c9b61e-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2021-12-09  6:17                 ` Rafał Miłecki
  2021-12-09  6:23                 ` David Gibson
  1 sibling, 0 replies; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-09  6:17 UTC (permalink / raw)
  To: David Gibson
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

On 09.12.2021 07:06, Rafał Miłecki wrote:
> On 09.12.2021 06:52, David Gibson wrote:
>>> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
>>> index d100d5a..11068e1 100755
>>> --- a/tests/run_tests.sh
>>> +++ b/tests/run_tests.sh
>>> @@ -855,6 +855,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
>>
>> I think using \ escapes in strings will be shell dependent behaviour.
>> Have you tested this in shells other than bash?
> 
> It isn't back dependent but printf dependent. See fdtget-runtest.sh :
> printf '%b\n' "$expect" > $EXPECT
> 
> It seems even busybox's printf supports %b:
> # printf "%b" "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" | hexdump -C
> 00000000  0a 0b 0c 0d de ea ad be  ef                       |.........|
> 00000009

busybox proof:

# busybox printf 2>&1 | head -n 1
BusyBox v1.30.1 () multi-call binary.

# busybox printf "%b" "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" | hexdump -C
00000000  0a 0b 0c 0d de ea ad be  ef                       |.........|
00000009

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V3] Support 'r' format for printing raw bytes with fdtget
       [not found]               ` <c59e41fd-bdfc-c419-e68f-0f6086c9b61e-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2021-12-09  6:17                 ` Rafał Miłecki
@ 2021-12-09  6:23                 ` David Gibson
  1 sibling, 0 replies; 12+ messages in thread
From: David Gibson @ 2021-12-09  6:23 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

[-- Attachment #1: Type: text/plain, Size: 1476 bytes --]

On Thu, Dec 09, 2021 at 07:06:52AM +0100, Rafał Miłecki wrote:
> On 09.12.2021 06:52, David Gibson wrote:
> > > diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> > > index d100d5a..11068e1 100755
> > > --- a/tests/run_tests.sh
> > > +++ b/tests/run_tests.sh
> > > @@ -855,6 +855,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
> > 
> > I think using \ escapes in strings will be shell dependent behaviour.
> > Have you tested this in shells other than bash?
> 
> It isn't back dependent but printf dependent. See fdtget-runtest.sh :
> printf '%b\n' "$expect" > $EXPECT
> 
> It seems even busybox's printf supports %b:
> # printf "%b" "\x0a\x0b\x0c\x0d\xde\xea\xad\xbe\xef" | hexdump -C
> 00000000  0a 0b 0c 0d de ea ad be  ef                       |.........|
> 00000009

Ah, sorry, I'd forgotten that fdtget-runtest.sh invoked printf.  In
that case, it should be fine.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V4] Support 'r' format for printing raw bytes with fdtget
       [not found]             ` <20211209061420.29466-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2021-12-09  6:52               ` David Gibson
  2021-12-09  7:09                 ` Rafał Miłecki
  0 siblings, 1 reply; 12+ messages in thread
From: David Gibson @ 2021-12-09  6:52 UTC (permalink / raw)
  To: Rafał Miłecki
  Cc: Jon Loeliger, devicetree-compiler-u79uwXL29TY76Z2rM5mHXA,
	Rafał Miłecki

[-- Attachment #1: Type: text/plain, Size: 5459 bytes --]

On Thu, Dec 09, 2021 at 07:14:20AM +0100, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> 
> 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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>

Applied, thanks.

> ---
> V2: Update usage info & add tests
> V3: Use "r" instead of "b" to avoid confusiong with qualifier
> V4: Don't rework utilfdt_decode_type() code handling qualifiers
> ---
>  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(-)
> 
> diff --git a/Documentation/manual.txt b/Documentation/manual.txt
> index 97e53b9..cf4b253 100644
> --- 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)
>  
> diff --git a/fdtget.c b/fdtget.c
> index 54fc6a0..dd70985 100644
> --- a/fdtget.c
> +++ b/fdtget.c
> @@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
>  	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) {
> diff --git a/fdtput.c b/fdtput.c
> index 428745a..c2fecf4 100644
> --- 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':
> diff --git a/tests/run_tests.sh b/tests/run_tests.sh
> index d100d5a..11068e1 100755
> --- a/tests/run_tests.sh
> +++ b/tests/run_tests.sh
> @@ -855,6 +855,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
> diff --git a/tests/utilfdt_test.c b/tests/utilfdt_test.c
> index c621759..ba6462f 100644
> --- a/tests/utilfdt_test.c
> +++ b/tests/utilfdt_test.c
> @@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
>  
>  	*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(void)
>  	/* 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);
> diff --git a/util.c b/util.c
> index 40274fb..14d3868 100644
> --- a/util.c
> +++ b/util.c
> @@ -353,11 +353,11 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
>  	}
>  
>  	/* 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;
> diff --git a/util.h b/util.h
> index c45b2c2..7a4e910 100644
> --- a/util.h
> +++ b/util.h
> @@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
>   *		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, int *type, int *size);
>   */
>  
>  #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)";
>  

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH V4] Support 'r' format for printing raw bytes with fdtget
  2021-12-09  6:52               ` David Gibson
@ 2021-12-09  7:09                 ` Rafał Miłecki
  0 siblings, 0 replies; 12+ messages in thread
From: Rafał Miłecki @ 2021-12-09  7:09 UTC (permalink / raw)
  To: David Gibson
  Cc: Rafał Miłecki, Jon Loeliger,
	devicetree-compiler-u79uwXL29TY76Z2rM5mHXA

On 2021-12-09 07:52, David Gibson wrote:
> On Thu, Dec 09, 2021 at 07:14:20AM +0100, Rafał Miłecki wrote:
>> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
>> 
>> 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 <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> 
> Applied, thanks.

Thank you!

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-12-09  7:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-12-06 15:49 [PATCH] Support 'b' format for printing raw bytes with fdtget Rafał Miłecki
     [not found] ` <20211206154953.17089-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2021-12-07 15:07   ` Simon Glass
2021-12-08 17:00   ` [PATCH V2] " Rafał Miłecki
     [not found]     ` <20211208170055.13811-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2021-12-09  2:22       ` David Gibson
2021-12-09  5:30       ` [PATCH V3] Support 'r' " Rafał Miłecki
     [not found]         ` <20211209053041.17984-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2021-12-09  5:52           ` David Gibson
2021-12-09  6:06             ` Rafał Miłecki
     [not found]               ` <c59e41fd-bdfc-c419-e68f-0f6086c9b61e-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2021-12-09  6:17                 ` Rafał Miłecki
2021-12-09  6:23                 ` David Gibson
2021-12-09  6:14           ` [PATCH V4] " Rafał Miłecki
     [not found]             ` <20211209061420.29466-1-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2021-12-09  6:52               ` David Gibson
2021-12-09  7:09                 ` Rafał Miłecki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).