diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2020-11-25 12:23:11 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2020-11-25 12:25:05 -0700 |
commit | f06d29ca9da724866ae99ee2225d53f382d32bcd (patch) | |
tree | fbec7a13e7e05654898116037d7506637aa0ebff /src | |
parent | d7d50cc81f72d1275140d7a15c52b6f9e272896f (diff) | |
download | stm32l4-f06d29ca9da724866ae99ee2225d53f382d32bcd.tar.gz stm32l4-f06d29ca9da724866ae99ee2225d53f382d32bcd.tar.bz2 stm32l4-f06d29ca9da724866ae99ee2225d53f382d32bcd.zip |
Add priv.h/c to allow switching to user mode. Change some things with the MPU in main() to actually work.
Diffstat (limited to 'src')
-rw-r--r-- | src/kern/main.c | 37 | ||||
-rw-r--r-- | src/kern/priv.c | 24 |
2 files changed, 59 insertions, 2 deletions
diff --git a/src/kern/main.c b/src/kern/main.c index e3995b1..df2f0bf 100644 --- a/src/kern/main.c +++ b/src/kern/main.c @@ -7,6 +7,7 @@ #include "kern/mem.h" #include "kern/mpu/mpu_manager.h" #include "kern/panic.h" +#include "kern/priv.h" void on_hard_fault() { @@ -60,7 +61,7 @@ int main() memopts.sharable = 0; memopts.tex = 0; memopts.size = REGION_SIZE_256Kb; - memopts.perms = ACCESS_PERMS_BOTH_RO; + memopts.perms = ACCESS_PERMS_ONLY_PRIV_RO; memopts.subregion_disable = 0; memopts.executable = 1; memopts.enable = 1; @@ -72,7 +73,7 @@ int main() memopts.cacheable = 1; memopts.sharable = 0; memopts.tex = 0; - memopts.size = REGION_SIZE_32Kb; + memopts.size = REGION_SIZE_64Kb; memopts.perms = ACCESS_PERMS_FULL; memopts.subregion_disable = 0; memopts.executable = 1; @@ -93,6 +94,19 @@ int main() mpu_configure_region(2, &memopts); + memopts.region = (void*) 0x40000000 /* Peripheral base. */; + memopts.bufferable = 1; + memopts.cacheable = 0; + memopts.sharable = 1; + memopts.tex = 0; + memopts.size = REGION_SIZE_512Mb; + memopts.perms = ACCESS_PERMS_ONLY_PRIV; + memopts.subregion_disable = 0; + memopts.executable = 0; + memopts.enable = 1; + + mpu_configure_region(3, &memopts); + for (uint32_t i = 0; i < 8; ++ i) { MPU.rn_r = i; klogf("--- %d ---\n", i); @@ -112,8 +126,27 @@ int main() // memopts.size = REGION_SIZE_16Kb; // memopts.perms = ACCESS_PERMS_NO_ACCESS; + klogf("CONTROL: %p\n", get_control_register()); + klogf("CONTROL: %p\n", get_control_register()); klogf("MPU not enabled\n"); + + volatile int x; + klogf("x location: %p\n", &x); + mpu_set_enabled(1); + + x = 5; + klogf("Still alive?\n"); + + klogf("Entering User Mode\n"); + enter_user_mode(); + + asm volatile ( + "svc #4\n" + ); + + klogf("Should Kernel Panic\n"); + for(;;); // klogf("MPU enabled\n"); diff --git a/src/kern/priv.c b/src/kern/priv.c new file mode 100644 index 0000000..9d64005 --- /dev/null +++ b/src/kern/priv.c @@ -0,0 +1,24 @@ +#include "kern/priv.h" + +void set_control_register(uint32_t reg) +{ + asm volatile("msr control, %0" : "=r"(reg) :); +} + +uint32_t get_control_register() +{ + uint32_t control; + asm volatile("mrs %0, control" : "=r"(control) :); + return control; +} + +void enter_user_mode() +{ + asm volatile ( + "mov r0, #1\n\t" + "msr control, r0\n\t" + ); + + // uint32_t creg = get_control_register(); + // set_control_register(creg | 1); +} |