diff options
author | vetch <vetch97@gmail.com> | 2019-10-22 16:30:57 +0200 |
---|---|---|
committer | vetch <vetch97@gmail.com> | 2019-10-22 16:30:57 +0200 |
commit | d2b5a5f97b71c2966796f2287fda2bfd6cc531ec (patch) | |
tree | 06364df08dac547bee8c6882f1468540f91df7b6 /kernel.c | |
parent | f742223614e126c7d485a5bbcdb15b97e73055aa (diff) | |
parent | c68891456e3b3c4ad37c36293413405151b87951 (diff) | |
download | rpi-MMU-example-d2b5a5f97b71c2966796f2287fda2bfd6cc531ec.tar.gz rpi-MMU-example-d2b5a5f97b71c2966796f2287fda2bfd6cc531ec.zip |
Merge branch 'bob' of https://repo.or.cz/RPi-MMU-example into alice
Diffstat (limited to 'kernel.c')
-rw-r--r-- | kernel.c | 30 |
1 files changed, 29 insertions, 1 deletions
@@ -8,6 +8,12 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags) (void) atags; uart_init(); + + // When we attach screen session after loading kernel with socat + // we miss kernel's greeting... So we'll make the kernel wait for + // one char we're going to send from within screen + uart_getc(); + uart_puts("Hello, kernel World!\r\n"); uint32_t ID_MMFR0; @@ -16,7 +22,7 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags) char *paging; - switch(ID_MMFR0 & 7) /* lowest 4 bits indicate VMSA support */ { + switch(ID_MMFR0 & 0xf) /* lowest 4 bits indicate VMSA support */ { case 0 : paging = "no paging\n\r"; break; case 1 : paging = "implementation defined paging\n\r"; break; case 2 : paging = "VMSAv6, with cache and TLB type registers\n\r"; break; @@ -27,6 +33,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()); |