+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+static void handle_v4(void)
+{
+}
+
+static void handle_unknown(void)
+{
+}
+
+static void (*handlers[16])(void) = {
+ [4] = handle_v4,
+};
+
+// XXX: LPAE?
+static void dump_mem_registers(unsigned int address)
+{
+ unsigned int *regs;
+ int fd;
+
+ fd = open("/dev/mem", O_RDONLY | O_SYNC);
+ if (fd == -1) {
+ perror("open(/dev/mem)");
+ return;
+ }
+
+ regs = mmap(NULL, 0x1000, PROT_READ, MAP_SHARED, fd, address);
+ if (regs == MAP_FAILED) {
+ perror("mmap");
+ close(fd);
+ return;
+ }
+
+ printf("\nmemory mapped registers:\n");
+ printf("DIDR: %08x\n", regs[0]);
+ printf("AUTHSTATUS: %08x\n", regs[1006]);
+ printf("DEVID: %08x\n", regs[1010]);
+
+ munmap(regs, 0x1000);
+ close(fd);
+}
+
+int main(int argc, char *argv[])
+{
+ unsigned int didr = 0, drar = 0, dsar = 0, dscr = 0;
+ unsigned int i, arch_version;
+
+ asm ("mrc p14, 0, %0, c0, c0, 0" : "=r"(didr));
+ asm ("mrc p14, 0, %0, c1, c0, 0" : "=r"(drar));
+ asm ("mrc p14, 0, %0, c2, c0, 0" : "=r"(dsar));
+ asm ("mrc p14, 0, %0, c0, c1, 0" : "=r"(dscr));
+
+ for (i = 0; i < 16; i++)
+ if (handlers[i] == NULL)
+ handlers[i] = handle_unknown;
+
+ printf("DIDR: %08x\n", didr);
+ arch_version = (didr >> 16) & 0x0f;
+ printf(" Revision: %d\n", didr & 0x0f);
+ printf(" Variant: %d\n", (didr >> 4) & 0x0f);
+ printf(" Debug arch version: %d\n", arch_version);
+
+ printf("DRAR: %08x\n", drar);
+ printf("DSAR: %08x\n", dsar);
+ printf("DSCR: %08x\n", dscr);
+
+ if ((drar & 3) != 3)
+ printf(" (debug ROM table not available)\n");
+ if ((dsar & 3) != 3)
+ printf(" (debug self address not available\n");
+ if ((drar & 3) == 3 && (dsar & 3) == 3 && argv[1] != NULL)
+ dump_mem_registers((drar & ~0xfff) + (dsar & ~0xfff));
+ if (argv[1] != NULL && !strcmp(argv[1], "pnd"))
+ dump_mem_registers(0x54011000);
+
+ handlers[arch_version]();
+
+ return 0;
+}