| From d432049f288c9acdc4a7caa729c68ceba3c5dca1 Mon Sep 17 00:00:00 2001 |
| From: Aaro Koskinen <aaro.koskinen@nokia.com> |
| Date: Thu, 25 Aug 2022 18:47:02 +0300 |
| Subject: [PATCH] devmem: add 128-bit width |
| |
| Add 128-bit width if the compiler provides the needed type. |
| |
| function old new delta |
| devmem_main 405 464 +59 |
| .rodata 109025 109043 +18 |
| ------------------------------------------------------------------------------ |
| (add/remove: 0/0 grow/shrink: 2/0 up/down: 77/0) Total: 77 bytes |
| |
| Upstream-Status: Backport [https://git.busybox.net/busybox/commit/?id=d432049f288c9acdc4a7caa729c68ceba3c5dca1] |
| |
| Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com> |
| Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> |
| Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| Signed-off-by: Mingli Yu <mingli.yu@windriver.com> |
| --- |
| miscutils/devmem.c | 68 ++++++++++++++++++++++++++++++---------------- |
| 1 file changed, 44 insertions(+), 24 deletions(-) |
| |
| diff --git a/miscutils/devmem.c b/miscutils/devmem.c |
| index f9f0276bc..f21621bd6 100644 |
| --- a/miscutils/devmem.c |
| +++ b/miscutils/devmem.c |
| @@ -29,7 +29,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| { |
| void *map_base, *virt_addr; |
| uint64_t read_result; |
| - uint64_t writeval = writeval; /* for compiler */ |
| off_t target; |
| unsigned page_size, mapped_size, offset_in_page; |
| int fd; |
| @@ -64,9 +63,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| width = strchrnul(bhwl, (argv[2][0] | 0x20)) - bhwl; |
| width = sizes[width]; |
| } |
| - /* VALUE */ |
| - if (argv[3]) |
| - writeval = bb_strtoull(argv[3], NULL, 0); |
| } else { /* argv[2] == NULL */ |
| /* make argv[3] to be a valid thing to fetch */ |
| argv--; |
| @@ -96,28 +92,46 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| virt_addr = (char*)map_base + offset_in_page; |
| |
| if (!argv[3]) { |
| - switch (width) { |
| - case 8: |
| - read_result = *(volatile uint8_t*)virt_addr; |
| - break; |
| - case 16: |
| - read_result = *(volatile uint16_t*)virt_addr; |
| - break; |
| - case 32: |
| - read_result = *(volatile uint32_t*)virt_addr; |
| - break; |
| - case 64: |
| - read_result = *(volatile uint64_t*)virt_addr; |
| - break; |
| - default: |
| - bb_simple_error_msg_and_die("bad width"); |
| +#ifdef __SIZEOF_INT128__ |
| + if (width == 128) { |
| + unsigned __int128 rd = |
| + *(volatile unsigned __int128 *)virt_addr; |
| + printf("0x%016llX%016llX\n", |
| + (unsigned long long)(uint64_t)(rd >> 64), |
| + (unsigned long long)(uint64_t)rd |
| + ); |
| + } else |
| +#endif |
| + { |
| + switch (width) { |
| + case 8: |
| + read_result = *(volatile uint8_t*)virt_addr; |
| + break; |
| + case 16: |
| + read_result = *(volatile uint16_t*)virt_addr; |
| + break; |
| + case 32: |
| + read_result = *(volatile uint32_t*)virt_addr; |
| + break; |
| + case 64: |
| + read_result = *(volatile uint64_t*)virt_addr; |
| + break; |
| + default: |
| + bb_simple_error_msg_and_die("bad width"); |
| + } |
| +// printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n", |
| +// target, virt_addr, |
| +// (unsigned long long)read_result); |
| + /* Zero-padded output shows the width of access just done */ |
| + printf("0x%0*llX\n", (width >> 2), (unsigned long long)read_result); |
| } |
| -// printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n", |
| -// target, virt_addr, |
| -// (unsigned long long)read_result); |
| - /* Zero-padded output shows the width of access just done */ |
| - printf("0x%0*llX\n", (width >> 2), (unsigned long long)read_result); |
| } else { |
| + /* parse VALUE */ |
| +#ifdef __SIZEOF_INT128__ |
| + unsigned __int128 writeval = strtoumax(argv[3], NULL, 0); |
| +#else |
| + uint64_t writeval = bb_strtoull(argv[3], NULL, 0); |
| +#endif |
| switch (width) { |
| case 8: |
| *(volatile uint8_t*)virt_addr = writeval; |
| @@ -135,6 +149,12 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| *(volatile uint64_t*)virt_addr = writeval; |
| // read_result = *(volatile uint64_t*)virt_addr; |
| break; |
| +#ifdef __SIZEOF_INT128__ |
| + case 128: |
| + *(volatile unsigned __int128 *)virt_addr = writeval; |
| +// read_result = *(volatile uint64_t*)virt_addr; |
| + break; |
| +#endif |
| default: |
| bb_simple_error_msg_and_die("bad width"); |
| } |
| -- |
| 2.25.1 |
| |