From 8a29c78d34f1924c4e39a3a951b36c4512ffe9c1 Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Fri, 23 Jul 2021 13:50:00 +0200
Subject: update the process' EIP/ESP when it syscalls

---
 src/kernel/arch/generic.h       | 2 +-
 src/kernel/arch/i386/sysenter.s | 8 +++++---
 2 files changed, 6 insertions(+), 4 deletions(-)

(limited to 'src/kernel/arch')

diff --git a/src/kernel/arch/generic.h b/src/kernel/arch/generic.h
index 6200320..8db079c 100644
--- a/src/kernel/arch/generic.h
+++ b/src/kernel/arch/generic.h
@@ -17,7 +17,7 @@ void halt_cpu();
 // src/arch/i386/sysenter.s
 void sysexit(void (*fun)(), void *stack_top);
 void sysenter_setup();
-int syscall_handler(int, int, int, int);
+int syscall_handler(int, int, int, int, void *stack, void *eip);
 
 // all of those can allocate memory
 struct pagedir *pagedir_new();
diff --git a/src/kernel/arch/i386/sysenter.s b/src/kernel/arch/i386/sysenter.s
index 7375e06..64b7d01 100644
--- a/src/kernel/arch/i386/sysenter.s
+++ b/src/kernel/arch/i386/sysenter.s
@@ -49,6 +49,8 @@ sysenter_setup:
 
 sysenter_handler:
 	pushal
+	push %edx
+	push %ecx
 	push %edi
 	push %esi
 	push %ebx
@@ -61,13 +63,13 @@ sysenter_handler:
 	call syscall_handler
 
 	// save the return value
-	mov %eax, 44(%esp) // 16 [top of eflags] + 7*4 [skip until EAX]
-	mov %edx, 32(%esp) // 16                 + 4*4 [skip until EBX]
+	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 $16, %esp
+	add $24, %esp
 	popal
 	sysexit
-- 
cgit v1.2.3