This is painful. There is no way for u-mode code to know if we're currently executing in u-mode without generating a fault, besides stealing a general purpose register away from the standard ABI that is. And a global variable doesn't work on SMP as this must be per-CPU and we could be migrated to another CPU just at the right moment to peek at the wrong CPU variable (and u-mode can't disable preemption either). So, given that we'll have to pay the price of an exception entry anyway, let's at least make it free to privileged threads by using the mscratch register as the non-user context indicator (it must be zero in m-mode for exception entry to work properly). In the case of u-mode we'll simulate a proper return value in the exception trap code. Let's settle on the return value in t0 and omit the volatile to give the compiler a chance to cache the result. Signed-off-by: Nicolas Pitre <npitre@baylibre.com> |
||
|---|---|---|
| .. | ||
| common | ||
| riscv-privilege | ||
| arch_inlines.h | ||
| arch.h | ||
| csr.h | ||
| error.h | ||
| exp.h | ||
| syscall.h | ||
| thread.h | ||