From d432049f288c9acdc4a7caa729c68ceba3c5dca1 Mon Sep 17 00:00:00 2001 From: Aaro Koskinen 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 Signed-off-by: Aaro Koskinen Signed-off-by: Denys Vlasenko Signed-off-by: Mingli Yu --- 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