Andrew Geissler | 87f5cff | 2022-09-30 13:13:31 -0500 | [diff] [blame^] | 1 | From d432049f288c9acdc4a7caa729c68ceba3c5dca1 Mon Sep 17 00:00:00 2001 |
| 2 | From: Aaro Koskinen <aaro.koskinen@nokia.com> |
| 3 | Date: Thu, 25 Aug 2022 18:47:02 +0300 |
| 4 | Subject: [PATCH] devmem: add 128-bit width |
| 5 | |
| 6 | Add 128-bit width if the compiler provides the needed type. |
| 7 | |
| 8 | function old new delta |
| 9 | devmem_main 405 464 +59 |
| 10 | .rodata 109025 109043 +18 |
| 11 | ------------------------------------------------------------------------------ |
| 12 | (add/remove: 0/0 grow/shrink: 2/0 up/down: 77/0) Total: 77 bytes |
| 13 | |
| 14 | Upstream-Status: Backport [https://git.busybox.net/busybox/commit/?id=d432049f288c9acdc4a7caa729c68ceba3c5dca1] |
| 15 | |
| 16 | Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com> |
| 17 | Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> |
| 18 | Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com> |
| 19 | Signed-off-by: Mingli Yu <mingli.yu@windriver.com> |
| 20 | --- |
| 21 | miscutils/devmem.c | 68 ++++++++++++++++++++++++++++++---------------- |
| 22 | 1 file changed, 44 insertions(+), 24 deletions(-) |
| 23 | |
| 24 | diff --git a/miscutils/devmem.c b/miscutils/devmem.c |
| 25 | index f9f0276bc..f21621bd6 100644 |
| 26 | --- a/miscutils/devmem.c |
| 27 | +++ b/miscutils/devmem.c |
| 28 | @@ -29,7 +29,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| 29 | { |
| 30 | void *map_base, *virt_addr; |
| 31 | uint64_t read_result; |
| 32 | - uint64_t writeval = writeval; /* for compiler */ |
| 33 | off_t target; |
| 34 | unsigned page_size, mapped_size, offset_in_page; |
| 35 | int fd; |
| 36 | @@ -64,9 +63,6 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| 37 | width = strchrnul(bhwl, (argv[2][0] | 0x20)) - bhwl; |
| 38 | width = sizes[width]; |
| 39 | } |
| 40 | - /* VALUE */ |
| 41 | - if (argv[3]) |
| 42 | - writeval = bb_strtoull(argv[3], NULL, 0); |
| 43 | } else { /* argv[2] == NULL */ |
| 44 | /* make argv[3] to be a valid thing to fetch */ |
| 45 | argv--; |
| 46 | @@ -96,28 +92,46 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| 47 | virt_addr = (char*)map_base + offset_in_page; |
| 48 | |
| 49 | if (!argv[3]) { |
| 50 | - switch (width) { |
| 51 | - case 8: |
| 52 | - read_result = *(volatile uint8_t*)virt_addr; |
| 53 | - break; |
| 54 | - case 16: |
| 55 | - read_result = *(volatile uint16_t*)virt_addr; |
| 56 | - break; |
| 57 | - case 32: |
| 58 | - read_result = *(volatile uint32_t*)virt_addr; |
| 59 | - break; |
| 60 | - case 64: |
| 61 | - read_result = *(volatile uint64_t*)virt_addr; |
| 62 | - break; |
| 63 | - default: |
| 64 | - bb_simple_error_msg_and_die("bad width"); |
| 65 | +#ifdef __SIZEOF_INT128__ |
| 66 | + if (width == 128) { |
| 67 | + unsigned __int128 rd = |
| 68 | + *(volatile unsigned __int128 *)virt_addr; |
| 69 | + printf("0x%016llX%016llX\n", |
| 70 | + (unsigned long long)(uint64_t)(rd >> 64), |
| 71 | + (unsigned long long)(uint64_t)rd |
| 72 | + ); |
| 73 | + } else |
| 74 | +#endif |
| 75 | + { |
| 76 | + switch (width) { |
| 77 | + case 8: |
| 78 | + read_result = *(volatile uint8_t*)virt_addr; |
| 79 | + break; |
| 80 | + case 16: |
| 81 | + read_result = *(volatile uint16_t*)virt_addr; |
| 82 | + break; |
| 83 | + case 32: |
| 84 | + read_result = *(volatile uint32_t*)virt_addr; |
| 85 | + break; |
| 86 | + case 64: |
| 87 | + read_result = *(volatile uint64_t*)virt_addr; |
| 88 | + break; |
| 89 | + default: |
| 90 | + bb_simple_error_msg_and_die("bad width"); |
| 91 | + } |
| 92 | +// printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n", |
| 93 | +// target, virt_addr, |
| 94 | +// (unsigned long long)read_result); |
| 95 | + /* Zero-padded output shows the width of access just done */ |
| 96 | + printf("0x%0*llX\n", (width >> 2), (unsigned long long)read_result); |
| 97 | } |
| 98 | -// printf("Value at address 0x%"OFF_FMT"X (%p): 0x%llX\n", |
| 99 | -// target, virt_addr, |
| 100 | -// (unsigned long long)read_result); |
| 101 | - /* Zero-padded output shows the width of access just done */ |
| 102 | - printf("0x%0*llX\n", (width >> 2), (unsigned long long)read_result); |
| 103 | } else { |
| 104 | + /* parse VALUE */ |
| 105 | +#ifdef __SIZEOF_INT128__ |
| 106 | + unsigned __int128 writeval = strtoumax(argv[3], NULL, 0); |
| 107 | +#else |
| 108 | + uint64_t writeval = bb_strtoull(argv[3], NULL, 0); |
| 109 | +#endif |
| 110 | switch (width) { |
| 111 | case 8: |
| 112 | *(volatile uint8_t*)virt_addr = writeval; |
| 113 | @@ -135,6 +149,12 @@ int devmem_main(int argc UNUSED_PARAM, char **argv) |
| 114 | *(volatile uint64_t*)virt_addr = writeval; |
| 115 | // read_result = *(volatile uint64_t*)virt_addr; |
| 116 | break; |
| 117 | +#ifdef __SIZEOF_INT128__ |
| 118 | + case 128: |
| 119 | + *(volatile unsigned __int128 *)virt_addr = writeval; |
| 120 | +// read_result = *(volatile uint64_t*)virt_addr; |
| 121 | + break; |
| 122 | +#endif |
| 123 | default: |
| 124 | bb_simple_error_msg_and_die("bad width"); |
| 125 | } |
| 126 | -- |
| 127 | 2.25.1 |
| 128 | |