From b26098268eb443f1ed3dc50d902b2beee40c8342 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sat, 16 Jul 2022 19:35:05 +0200 Subject: amd64: seemingly working syscalls (SYSCALL/SYSRET) --- src/kernel/arch/amd64/sysenter.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'src/kernel/arch/amd64/sysenter.c') 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(); } -- cgit v1.2.3