From c49887c0d8f9a7c09b206c03db850636b23706db Mon Sep 17 00:00:00 2001 From: Philipp Tomsich Date: Wed, 22 Mar 2017 21:00:00 +0100 Subject: devmem2: add support for LP64 architecture --- devmem2.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/devmem2.c b/devmem2.c index 7732ecb..5460088 100644 --- a/devmem2.c +++ b/devmem2.c @@ -48,7 +48,8 @@ #include #include #include - +#include + #define FATAL do { fprintf(stderr, "Error at line %d, file %s (%d) [%s]\n", \ __LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0) @@ -58,19 +59,19 @@ int main(int argc, char **argv) { int fd; void *map_base, *virt_addr; - unsigned long read_result, writeval; + uint64_t read_result, writeval; off_t target; int access_type = 'w'; if(argc < 2) { fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n" "\taddress : memory address to act upon\n" - "\ttype : access operation type : [b]yte, [h]alfword, [w]ord\n" + "\ttype : access operation type : [b]yte, [h]alfword, [w]ord, [d]oubleword\n" "\tdata : data to be written\n\n", argv[0]); exit(1); } - target = strtoul(argv[1], 0, 0); + target = strtoull(argv[1], 0, 0); if(argc > 2) access_type = tolower(argv[2][0]); @@ -89,14 +90,18 @@ int main(int argc, char **argv) { virt_addr = map_base + (target & MAP_MASK); switch(access_type) { case 'b': - read_result = *((unsigned char *) virt_addr); + read_result = *((uint8_t *) virt_addr); break; case 'h': - read_result = *((unsigned short *) virt_addr); + read_result = *((uint16_t *) virt_addr); break; case 'w': - read_result = *((unsigned long *) virt_addr); + read_result = *((uint32_t *) virt_addr); break; + case 'd': + read_result = *((uint64_t *) virt_addr); + break; + default: fprintf(stderr, "Illegal data type '%c'.\n", access_type); exit(2); @@ -108,16 +113,20 @@ int main(int argc, char **argv) { writeval = strtoul(argv[3], 0, 0); switch(access_type) { case 'b': - *((unsigned char *) virt_addr) = writeval; - read_result = *((unsigned char *) virt_addr); + *((uint8_t *) virt_addr) = writeval; + read_result = *((uint8_t *) virt_addr); break; case 'h': - *((unsigned short *) virt_addr) = writeval; - read_result = *((unsigned short *) virt_addr); + *((uint16_t *) virt_addr) = writeval; + read_result = *((uint16_t *) virt_addr); break; case 'w': - *((unsigned long *) virt_addr) = writeval; - read_result = *((unsigned long *) virt_addr); + *((uint32_t *) virt_addr) = writeval; + read_result = *((uint32_t *) virt_addr); + break; + case 'd': + *((uint64_t *) virt_addr) = writeval; + read_result = *((uint64_t *) virt_addr); break; } printf("Written 0x%X; readback 0x%X\n", writeval, read_result); @@ -128,4 +137,3 @@ int main(int argc, char **argv) { close(fd); return 0; } - -- cgit v1.2.3