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 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>
This commit is contained in:
parent
1a1220a5b0
commit
d432049f28
@ -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");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user