From 4d5e930c48cded790f77497911706aa8f5ff0965 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sat, 24 Jul 2021 16:55:15 +0200 Subject: save all registers on syscalls --- src/kernel/arch/i386/sysenter.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/kernel/arch/i386/sysenter.c (limited to 'src/kernel/arch/i386/sysenter.c') diff --git a/src/kernel/arch/i386/sysenter.c b/src/kernel/arch/i386/sysenter.c new file mode 100644 index 0000000..91dac2e --- /dev/null +++ b/src/kernel/arch/i386/sysenter.c @@ -0,0 +1,27 @@ +#include +#include + +void sysenter_stage2(int edi, int esi, void *ebp, void *esp, + int ebx, int edx, int ecx, int eax) +{ + uint64_t val; + process_current->regs = (struct registers) { + // EAX and EDX will get overriden with the return value later on + + .eax = eax, + .ecx = ecx, + .edx = edx, + .ebx = ebx, + .esi = esi, + .edi = edi, + + .esp = (void*) ecx, // not a typo, part of my calling convention + .eip = (void*) edx, // ^ + .ebp = ebp, + }; + + val = syscall_handler(eax, ebx, esi, edi); + regs_savereturn(&process_current->regs, val); + + process_switch(process_current); // TODO process_resume +} -- cgit v1.2.3