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.s | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) (limited to 'src/kernel/arch/i386/sysenter.s') diff --git a/src/kernel/arch/i386/sysenter.s b/src/kernel/arch/i386/sysenter.s index 64b7d01..a982dd8 100644 --- a/src/kernel/arch/i386/sysenter.s +++ b/src/kernel/arch/i386/sysenter.s @@ -42,34 +42,17 @@ sysenter_setup: wrmsr mov $IA32_SYSENTER_EIP, %ecx - mov $sysenter_handler, %eax + mov $sysenter_stage1, %eax wrmsr ret -sysenter_handler: - pushal - push %edx - push %ecx - push %edi - push %esi - push %ebx - push %eax +sysenter_stage1: + pushal // register dump mov %cr0, %eax and $0x7FFFFFFF, %eax // disable paging mov %eax, %cr0 - call syscall_handler - - // save the return value - mov %eax, 52(%esp) // 24 [top of eflags] + 7*4 [skip until EAX] - mov %edx, 40(%esp) // 24 + 4*4 [skip until EBX] - - mov %cr0, %eax - or $0x80000000, %eax // enable paging - mov %eax, %cr0 - - add $24, %esp - popal - sysexit + call sysenter_stage2 + jmp halt_cpu -- cgit v1.2.3