aboutsummaryrefslogtreecommitdiff
path: root/src/kern/priv.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/priv.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/priv.c')
-rw-r--r--src/kern/priv.c24
1 files changed, 24 insertions, 0 deletions
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);
+}