aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvetch <vetch97@gmail.com>2019-12-17 16:44:13 +0100
committervetch <vetch97@gmail.com>2019-12-17 16:44:13 +0100
commit9891df79dc55cbab3b542b9ee67ea50d8b82542f (patch)
tree3992c661050af92af509a0d9cd59731cc0c948ec
parent15c7742381d7c63d8fb9d664eab56f3fed96f824 (diff)
parent37821a7d49e78132e7bdf12e04a9ed339588650c (diff)
downloadrpi-MMU-example-9891df79dc55cbab3b542b9ee67ea50d8b82542f.tar.gz
rpi-MMU-example-9891df79dc55cbab3b542b9ee67ea50d8b82542f.zip
Merge branch 'bob' of https://repo.or.cz/RPi-MMU-example into alice
-rw-r--r--libkernel.c12
-rw-r--r--libkernel.h6
2 files changed, 18 insertions, 0 deletions
diff --git a/libkernel.c b/libkernel.c
new file mode 100644
index 0000000..0955e0e
--- /dev/null
+++ b/libkernel.c
@@ -0,0 +1,12 @@
+// This is the privileged code, that gets placed somewhere in
+// unprivileged process' address space. It's compiled as relocatable,
+// so it can be loaded at different address for different processes.
+
+void call_unprivileged(void (*address) (void)) {
+ // switch to PL0
+ asm("cps #0b10000\n\r"
+ "isb" ::: "memory");
+
+ // jump to that unprivileged code
+ address();
+}
diff --git a/libkernel.h b/libkernel.h
new file mode 100644
index 0000000..a8af348
--- /dev/null
+++ b/libkernel.h
@@ -0,0 +1,6 @@
+#ifndef LIBKERNEL_H
+#define LIBKERNEL_H
+
+void call_unprivileged(void (*address) (void));
+
+#endif // LIBKERNEL_H