diff options
author | Wojtek Kosior <kwojtus@protonmail.com> | 2019-10-22 16:28:47 +0200 |
---|---|---|
committer | Wojtek Kosior <kwojtus@protonmail.com> | 2019-10-22 16:28:47 +0200 |
commit | f2f81de9973b5a3028eb6cbbaf3942cc68446f9b (patch) | |
tree | 5730872a525f29d3ee99cef1d4b096312931c83c | |
parent | 35fceb4649a142a9936355bfa090f8e8ce22f9fd (diff) | |
download | rpi-MMU-example-f2f81de9973b5a3028eb6cbbaf3942cc68446f9b.tar.gz rpi-MMU-example-f2f81de9973b5a3028eb6cbbaf3942cc68446f9b.zip |
check current execution mode
-rw-r--r-- | kernel.c | 22 |
1 files changed, 22 insertions, 0 deletions
@@ -36,6 +36,28 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags) } uart_puts(paging); + + uint32_t CPSR; + // get content of current program status register to check the current + // processor mode + asm("mrs %0, cpsr" : "=r" (CPSR) :: "memory"); + + char *mode; + + switch(CPSR & 0x1f) /* lowest 5 bits indicate processor mode */ { + case 0x10 : mode = "User (PL0)"; break; + case 0x11 : mode = "FIQ (PL1)"; break; + case 0x12 : mode = "IRQ (PL1)"; break; + case 0x13 : mode = "Supervisor (PL1)"; break; + case 0x16 : mode = "Monitor (PL1)"; break; + case 0x17 : mode = "Abort (PL1)"; break; + case 0x1a : mode = "Hyp (PL2)"; break; + case 0x1b : mode = "Undefined (PL1)"; break; + case 0x1f : mode = "System (PL1)"; break; + default : mode = "Unknown mode"; break; + } + + uart_puts(mode); while (1) uart_putc(uart_getc()); |