aboutsummaryrefslogtreecommitdiff
path: root/src/kern/main.c
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2020-11-25 12:23:11 -0700
committerJosh Rahm <joshuarahm@gmail.com>2020-11-25 12:25:05 -0700
commitf06d29ca9da724866ae99ee2225d53f382d32bcd (patch)
treefbec7a13e7e05654898116037d7506637aa0ebff /src/kern/main.c
parentd7d50cc81f72d1275140d7a15c52b6f9e272896f (diff)
downloadstm32l4-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/kern/main.c')
-rw-r--r--src/kern/main.c37
1 files changed, 35 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");