tests: add armv7 debug test and a register dumper
[pandora-misc.git] / tests / regread_dump.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 #include <fcntl.h>
6 #include <sys/mman.h>
7 #include <unistd.h>
8 #include <signal.h>
9 #include <sys/ucontext.h>
10
11 static volatile int fault;
12
13 static void sigbus_sigaction(int num, siginfo_t *info, void *ctx)
14 {
15         struct ucontext *context = ctx;
16         unsigned int *regs = (unsigned int *)&context->uc_mcontext.arm_r0;
17
18         //printf("\nsigbus %d %p @ %08x\n", info->si_code, info->si_addr, regs[15]);
19         fault = 1;
20         regs[15] += 4;
21
22         usleep(1000);
23 }
24
25 int main(int argc, char *argv[])
26 {
27         struct sigaction sigbus_action = {
28                 .sa_sigaction = sigbus_sigaction,
29                 .sa_flags = SA_SIGINFO,
30         };
31         unsigned int base = 0x5401d000;
32         volatile unsigned int *regs;
33         unsigned int val;
34         int i, fd;
35
36         fd = open("/dev/mem", O_RDONLY | O_SYNC);
37         if (fd == -1)
38         {
39                 perror("open /dev/mem");
40                 return 1;
41         }
42
43         regs = mmap(0, 0x1000, PROT_READ, MAP_SHARED, fd, base);
44         if (regs == MAP_FAILED) {
45                 close(fd);
46                 perror("mmap");
47                 return 1;
48         }
49
50         sigemptyset(&sigbus_action.sa_mask);
51         sigaction(SIGBUS, &sigbus_action, NULL);
52
53         for (i = 0; i < 1024; i++) {
54                 printf("%08x ", base + i * 4);
55
56                 fault = 0;
57
58                 val = regs[i];
59
60                 if (!fault)
61                         printf("%08x\n", val);
62                 else
63                         printf("fault\n");
64                 fflush(stdout);
65         }
66
67         munmap((void *)regs, 0x1000);
68         close(fd);
69
70         return 0;
71 }