diff options
author | Wojtek Kosior <kwojtus@protonmail.com> | 2019-11-12 18:23:39 +0100 |
---|---|---|
committer | Wojtek Kosior <kwojtus@protonmail.com> | 2019-11-12 18:23:39 +0100 |
commit | 11541f1d1eaaefebd6d01b42e92a65606e4bc382 (patch) | |
tree | b36a67dd6ab8e6e7804e1ff9daf9a683b1b76269 | |
parent | 533976feb8ea79c15fa905642d75adb58a0e6996 (diff) | |
download | rpi-MMU-example-11541f1d1eaaefebd6d01b42e92a65606e4bc382.tar.gz rpi-MMU-example-11541f1d1eaaefebd6d01b42e92a65606e4bc382.zip |
some ugly instructions (I wouldn't call this code), that switch to PL0 and check that MMU really works here - it's temporary, don't merge! (merge commit b4 PL0_test.c was added, if you really want)
-rw-r--r-- | PL0_test.c | 18 | ||||
-rw-r--r-- | kernel.c | 7 |
2 files changed, 23 insertions, 2 deletions
@@ -1,9 +1,25 @@ #include "uart.h" +#include "psr.h" void PL0_main(void) { - uart_puts("hello PL0!\n\r"); + uart_puts("hello PL0! Switching to user mode!\n\r"); + asm("cps #0b10000\n\r" + "isb" ::: "memory"); + + // if all went correct, Success! gets printed + uart_puts("Success!\n\r"); + + // if we're indeed i PL0, we should crash now, when trying to access + // memory we're not allowed to + char first_kernel_byte[2]; + + first_kernel_byte[0] = *(char*) ((uint32_t) 0x8000); + first_kernel_byte[1] = '\0'; + + uart_puts(first_kernel_byte); + while (1) { char c; @@ -229,7 +229,12 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags) (&_binary_PL_0_test_img_start)[i]; // jump to that copied code (no switch to PL0 yet, just testing) - ((void(*)(void)) (((uint32_t) 0b101010101010) << 20))(); + asm volatile("mov r5, #0\n\r" + "movt r5, #0b1010101010101111\n\r" + "mov sp, r5\n\r" + "mov r5, #0\n\r" + "movt r5, #0b1010101010100000\n\r" + "blx r5\n\r"); while(1); |