diff options
-rw-r--r-- | libkernel.c | 12 | ||||
-rw-r--r-- | libkernel.h | 6 |
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 |