aboutsummaryrefslogtreecommitdiff
path: root/libkernel.c
blob: 0955e0e907476f11d021e0c685d485309cda65e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
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();
}