[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH] kernel2: Stack fuers Aufrufen der Syscallhandler richtig sichern



! kernel2: Stack fuers Aufrufen der Syscallhandler richtig sichern. Der
           aktuelle Code kann so nicht funktionieren. Das Register ecx,
           das die Differenz zum original-esp sichert, ist erstens nicht
           callee-save und zweitens eh 0 nach dem rep. Wir speichern
           also besser den original esp in einem Vernuenftigen Register.

Signed-off-by: Antoine Kaufmann <toni@xxxxxxxxxx>
---
 src/kernel2/src/arch/i386/syscall.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/kernel2/src/arch/i386/syscall.c b/src/kernel2/src/arch/i386/syscall.c
index 7d5724e..04c3f4c 100644
--- a/src/kernel2/src/arch/i386/syscall.c
+++ b/src/kernel2/src/arch/i386/syscall.c
@@ -99,16 +99,16 @@ void syscall_arch(machine_state_t* isf)
         uint32_t eax, edx;
 
         asm volatile(
+            "mov %%esp, %%ebx;"
             "sub %%ecx, %%esp;"
             "shr $0x2, %%ecx;"
             "mov %%esp, %%edi;"
             "rep movsd;"
             "call *%4;"
-            "shl $0x2, %%ecx;"
-            "add %%ecx, %%esp;"
+            "mov %%ebx, %%esp;"
             : "=a" (eax), "=d" (edx), "=S" (stack)
             : "S" (stack), "r" (handler), "c" (syscalls[number].arg_count * 4)
-            : "edi");
+            : "edi", "ebx");
 
         isf->eax = eax;
         if (handler == syscall_get_tick_count) {
-- 
1.6.3.3