Support 'r' format for printing raw bytes with fdtget
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@milecki.pl> Message-Id: <20211209061420.29466-1-zajec5@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
45f3d1a095
commit
17739b7ef5
7 changed files with 18 additions and 5 deletions
|
@ -712,7 +712,7 @@ The syntax of the fdtget command is:
|
||||||
|
|
||||||
where options are:
|
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:
|
Optional modifier prefix:
|
||||||
hh or b=byte, h=2 byte, l=4 byte (default)
|
hh or b=byte, h=2 byte, l=4 byte (default)
|
||||||
|
|
||||||
|
|
5
fdtget.c
5
fdtget.c
|
@ -97,6 +97,11 @@ static int show_data(struct display_info *disp, const char *data, int len)
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (disp->type == 'r') {
|
||||||
|
fwrite(data, 1, len, stdout);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
is_string = (disp->type) == 's' ||
|
is_string = (disp->type) == 's' ||
|
||||||
(!disp->type && util_is_printable_string(data, len));
|
(!disp->type && util_is_printable_string(data, len));
|
||||||
if (is_string) {
|
if (is_string) {
|
||||||
|
|
2
fdtput.c
2
fdtput.c
|
@ -433,6 +433,8 @@ int main(int argc, char *argv[])
|
||||||
if (utilfdt_decode_type(optarg, &disp.type,
|
if (utilfdt_decode_type(optarg, &disp.type,
|
||||||
&disp.size))
|
&disp.size))
|
||||||
usage("Invalid type string");
|
usage("Invalid type string");
|
||||||
|
if (disp.type == 'r')
|
||||||
|
usage("Unsupported raw data type");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'v':
|
case 'v':
|
||||||
|
|
|
@ -855,6 +855,8 @@ fdtget_tests () {
|
||||||
run_fdtget_test 8000 -tx $dtb /cpus/PowerPC,970@1 d-cache-size
|
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 "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 "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
|
# Here the property size is not a multiple of 4 bytes, so it should fail
|
||||||
run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed
|
run_wrap_error_test $DTGET -tlx $dtb /randomnode mixed
|
||||||
|
|
|
@ -73,6 +73,9 @@ static void check_sizes(char *modifier, int expected_size)
|
||||||
|
|
||||||
*ptr = 's';
|
*ptr = 's';
|
||||||
check(fmt, 's', -1);
|
check(fmt, 's', -1);
|
||||||
|
|
||||||
|
*ptr = 'r';
|
||||||
|
check(fmt, 'r', -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_utilfdt_decode_type(void)
|
static void test_utilfdt_decode_type(void)
|
||||||
|
@ -90,7 +93,7 @@ static void test_utilfdt_decode_type(void)
|
||||||
/* try every other character */
|
/* try every other character */
|
||||||
checkfail("");
|
checkfail("");
|
||||||
for (ch = ' '; ch < 127; ch++) {
|
for (ch = ' '; ch < 127; ch++) {
|
||||||
if (!strchr("iuxs", ch)) {
|
if (!strchr("iuxsr", ch)) {
|
||||||
*fmt = ch;
|
*fmt = ch;
|
||||||
fmt[1] = '\0';
|
fmt[1] = '\0';
|
||||||
checkfail(fmt);
|
checkfail(fmt);
|
||||||
|
|
4
util.c
4
util.c
|
@ -353,11 +353,11 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we should now have a type */
|
/* we should now have a type */
|
||||||
if ((*fmt == '\0') || !strchr("iuxs", *fmt))
|
if ((*fmt == '\0') || !strchr("iuxsr", *fmt))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* convert qualifier (bhL) to byte size */
|
/* convert qualifier (bhL) to byte size */
|
||||||
if (*fmt != 's')
|
if (*fmt != 's' && *fmt != 'r')
|
||||||
*size = qualifier == 'b' ? 1 :
|
*size = qualifier == 'b' ? 1 :
|
||||||
qualifier == 'h' ? 2 :
|
qualifier == 'h' ? 2 :
|
||||||
qualifier == 'l' ? 4 : -1;
|
qualifier == 'l' ? 4 : -1;
|
||||||
|
|
3
util.h
3
util.h
|
@ -143,6 +143,7 @@ int utilfdt_write_err(const char *filename, const void *blob);
|
||||||
* i signed integer
|
* i signed integer
|
||||||
* u unsigned integer
|
* u unsigned integer
|
||||||
* x hex
|
* x hex
|
||||||
|
* r raw
|
||||||
*
|
*
|
||||||
* TODO: Implement ll modifier (8 bytes)
|
* TODO: Implement ll modifier (8 bytes)
|
||||||
* TODO: Implement o type (octal)
|
* TODO: Implement o type (octal)
|
||||||
|
@ -160,7 +161,7 @@ int utilfdt_decode_type(const char *fmt, int *type, int *size);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define USAGE_TYPE_MSG \
|
#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" \
|
"\tOptional modifier prefix:\n" \
|
||||||
"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
|
"\t\thh or b=byte, h=2 byte, l=4 byte (default)";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue