From 912d2e3c7eb1baa71dda2c0a28aa5809eaa96f27 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sat, 16 Jul 2022 13:33:00 +0200 Subject: amd64: barely boot into kernel code --- src/kernel/arch/amd64/sysenter.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/kernel/arch/amd64/sysenter.c (limited to 'src/kernel/arch/amd64/sysenter.c') diff --git a/src/kernel/arch/amd64/sysenter.c b/src/kernel/arch/amd64/sysenter.c new file mode 100644 index 0000000..e42ec7d --- /dev/null +++ b/src/kernel/arch/amd64/sysenter.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include + +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; + _sysexit_real(); + __builtin_unreachable(); +} + +_Noreturn void sysenter_stage2(void) { + kprintf("ring0 again!\n"); + struct registers *regs = &process_current->regs; + + *regs = _sysexit_regs; // save the registers + regs->esp = (userptr_t) regs->ecx; // fix them up + regs->eip = (userptr_t) regs->edx; + + _syscall(regs->eax, regs->ebx, + regs->esi, regs->edi, (uintptr_t)regs->ebp); + process_switch_any(); +} -- cgit v1.2.3