// 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(); }