diff options
Diffstat (limited to 'libcpu/risc-v/t-head/c906')
| -rw-r--r-- | libcpu/risc-v/t-head/c906/stackframe.h | 6 | ||||
| -rw-r--r-- | libcpu/risc-v/t-head/c906/trap.c | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/libcpu/risc-v/t-head/c906/stackframe.h b/libcpu/risc-v/t-head/c906/stackframe.h index 1e191900b4..d6fd0c3c5e 100644 --- a/libcpu/risc-v/t-head/c906/stackframe.h +++ b/libcpu/risc-v/t-head/c906/stackframe.h @@ -13,6 +13,10 @@ #ifndef __STACKFRAME_H__ #define __STACKFRAME_H__ +#define BYTES(idx) ((idx) * REGBYTES) +#define FRAME_OFF_SSTATUS BYTES(2) +#define FRAME_OFF_SP BYTES(32) + #include "cpuport.h" #include "encoding.h" @@ -54,7 +58,7 @@ /** * The register `tp` always save/restore when context switch, * we call `lwp_user_setting_save` when syscall enter, - * call `lwp_user_setting_restore` when syscall exit + * call `lwp_user_setting_restore` when syscall exit * and modify context stack after `lwp_user_setting_restore` called * so that the `tp` can be the correct thread area value. */ diff --git a/libcpu/risc-v/t-head/c906/trap.c b/libcpu/risc-v/t-head/c906/trap.c index aaf5be893f..2600ee0c37 100644 --- a/libcpu/risc-v/t-head/c906/trap.c +++ b/libcpu/risc-v/t-head/c906/trap.c @@ -277,6 +277,9 @@ static void handle_nested_trap_panic( rt_hw_cpu_shutdown(); } +#define IN_USER_SPACE (stval >= USER_VADDR_START && stval < USER_VADDR_TOP) +#define PAGE_FAULT (id == EP_LOAD_PAGE_FAULT || id == EP_STORE_PAGE_FAULT) + /* Trap entry */ void handle_trap(rt_size_t scause, rt_size_t stval, rt_size_t sepc, struct rt_hw_stack_frame *sp) { @@ -314,7 +317,7 @@ void handle_trap(rt_size_t scause, rt_size_t stval, rt_size_t sepc, struct rt_hw else { #ifdef RT_USING_SMART - if (!(sp->sstatus & 0x100)) + if (!(sp->sstatus & 0x100) || (PAGE_FAULT && IN_USER_SPACE)) { handle_user(scause, stval, sepc, sp); // if handle_user() return here, jump to u mode then |
