[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