Signed-off-by: SU Hang <darcy.sh@xxxxxxxxxxxx> --- lib/x86/usermode.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/x86/usermode.c b/lib/x86/usermode.c index 477cb9f..e4cb899 100644 --- a/lib/x86/usermode.c +++ b/lib/x86/usermode.c @@ -12,7 +12,6 @@ #include <stdint.h> #define USERMODE_STACK_SIZE 0x2000 -#define RET_TO_KERNEL_IRQ 0x20 static jmp_buf jmpbuf; @@ -40,9 +39,11 @@ uint64_t run_in_user(usermode_func func, unsigned int fault_vector, static unsigned char user_stack[USERMODE_STACK_SIZE]; *raised_vector = 0; - set_idt_entry(RET_TO_KERNEL_IRQ, &ret_to_kernel, 3); handle_exception(fault_vector, restore_exec_to_jmpbuf_exception_handler); + wrmsr(MSR_EFER, rdmsr(MSR_EFER) | EFER_SCE); + wrmsr(MSR_STAR, ((u64)(USER_CS32 << 16) | KERNEL_CS) << 32); + wrmsr(MSR_LSTAR, (u64)&ret_to_kernel); if (setjmp(jmpbuf) != 0) { *raised_vector = 1; @@ -73,7 +74,7 @@ uint64_t run_in_user(usermode_func func, unsigned int fault_vector, "mov %[arg4], %%rcx\n\t" "call *%[func]\n\t" /* Return to kernel via system call */ - "int %[kernel_entry_vector]\n\t" + "syscall\n\t" /* Kernel Mode */ "ret_to_kernel:\n\t" "mov %[rsp0], %%rsp\n\t" @@ -89,8 +90,7 @@ uint64_t run_in_user(usermode_func func, unsigned int fault_vector, [user_ds]"i"(USER_DS), [user_cs]"i"(USER_CS), [user_stack_top]"r"(user_stack + - sizeof(user_stack)), - [kernel_entry_vector]"i"(RET_TO_KERNEL_IRQ) + sizeof(user_stack)) : "rsi", "rdi", "rbx", "rcx", "rdx", "r8", "r9", "r10", "r11"); -- 2.32.0.3.g01195cf9f