blob: 985e2bf1d9baaa93679370664c29c98c903cb11a [file] [log] [blame]
Andrew Geissler87f5cff2022-09-30 13:13:31 -05001From d432049f288c9acdc4a7caa729c68ceba3c5dca1 Mon Sep 17 00:00:00 2001
2From: Aaro Koskinen <aaro.koskinen@nokia.com>
3Date: Thu, 25 Aug 2022 18:47:02 +0300
4Subject: [PATCH] devmem: add 128-bit width
5
6Add 128-bit width if the compiler provides the needed type.
7
8function old new delta
9devmem_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
14Upstream-Status: Backport [https://git.busybox.net/busybox/commit/?id=d432049f288c9acdc4a7caa729c68ceba3c5dca1]
15
16Signed-off-by: Aaro Koskinen <aaro.koskinen@nokia.com>
17Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
18Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
19Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
20---
21 miscutils/devmem.c | 68 ++++++++++++++++++++++++++++++----------------
22 1 file changed, 44 insertions(+), 24 deletions(-)
23
24diff --git a/miscutils/devmem.c b/miscutils/devmem.c
25index 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--
1272.25.1
128