diff options
Diffstat (limited to 'src/kernel/arch/amd64/sysenter.c')
-rw-r--r-- | src/kernel/arch/amd64/sysenter.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/kernel/arch/amd64/sysenter.c b/src/kernel/arch/amd64/sysenter.c index 75b825f..543e5bc 100644 --- a/src/kernel/arch/amd64/sysenter.c +++ b/src/kernel/arch/amd64/sysenter.c @@ -7,22 +7,17 @@ struct registers _sysexit_regs; void sysexit(struct registers regs) { _sysexit_regs = regs; - _sysexit_regs.ecx = (uintptr_t) regs.esp; - _sysexit_regs.edx = (uintptr_t) regs.eip; - kprintf("here we go!\n"); + kprintf("ring3...\n"); _sysexit_real(); __builtin_unreachable(); } _Noreturn void sysenter_stage2(void) { - kprintf("ring0 again!\n"); struct registers *regs = &process_current->regs; + *regs = _sysexit_regs; - *regs = _sysexit_regs; // save the registers - regs->esp = (userptr_t) regs->ecx; // fix them up - regs->eip = (userptr_t) regs->edx; + kprintf("ring0!\n"); - _syscall(regs->eax, regs->ebx, - regs->esi, regs->edi, (uintptr_t)regs->ebp); + _syscall(regs->rdi, regs->rsi, regs->rdx, regs->r10, regs->r8); process_switch_any(); } |