From ae9c1d1b16061242068353ff9064c8c9ef63b577 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Sat, 24 Jul 2021 18:53:34 +0200 Subject: sysexit() now overrides all registers when doing anything more complex than starting a new program, you pretty much need to pass a full register dump. otherwise stuff will break --- src/kernel/arch/i386/sysenter.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/kernel/arch/i386/sysenter.c') diff --git a/src/kernel/arch/i386/sysenter.c b/src/kernel/arch/i386/sysenter.c index 91dac2e..f3f5987 100644 --- a/src/kernel/arch/i386/sysenter.c +++ b/src/kernel/arch/i386/sysenter.c @@ -1,6 +1,27 @@ #include #include +struct registers_pushad _sysexit_regs; // a hack + +extern void _sysexit_real(); + +void sysexit(struct registers regs) { + _sysexit_regs = (struct registers_pushad) { + .eax = regs.eax, + .ebx = regs.ebx, + .ebp = regs.ebp, + .esi = regs.esi, + .edi = regs.edi, + + // sysexit args + .ecx = regs.esp, + .edx = regs.eip, + + // ESP doesn't matter + }; + _sysexit_real(); +} + void sysenter_stage2(int edi, int esi, void *ebp, void *esp, int ebx, int edx, int ecx, int eax) { -- cgit v1.2.3