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

[Lost] [Patch] Fixes für Syscallaufrufe (-O1)



Dieser Patch behebt zwei Probleme in der Userspace-libc beim Aufruf von Syscalls.
Index: src/modules/lib/syscalls/shared_memory.c
===================================================================
--- src/modules/lib/syscalls/shared_memory.c	(Revision 682)
+++ src/modules/lib/syscalls/shared_memory.c	(Arbeitskopie)
@@ -9,7 +9,7 @@
         "pushl %2;"
         "mov %1, %%eax;"
         "int $0x30;"
-        "add $0x8, %%esp;"
+        "add $0x4, %%esp;"
     : "=a" (id) : "i" (SYSCALL_SHM_CREATE), "r" (size));
 
     return id;
Index: src/modules/lib/syscalls/rpc.c
===================================================================
--- src/modules/lib/syscalls/rpc.c	(Revision 682)
+++ src/modules/lib/syscalls/rpc.c	(Arbeitskopie)
@@ -16,10 +16,17 @@
     } while (result != 0);
 }
 
-void send_message(dword pid, dword function, dword correlation_id, dword len, char* data)
+void send_message
+    (dword pid, dword function, dword correlation_id, dword len, char* data)
 {
     dword result = 0;
-    dword metadata[2] = { function, correlation_id };
+
+    // Auf die Variable wird zwar sonst nirgends schreibend zugegriffen, aber
+    // das volatile ist noetig, weil gcc sonst der Meinung ist, der Arrayinhalt
+    // wuerde nicht benutzt (dem asm-Block wird nur der Pointer uebergeben).
+    // Ohne volatile laesst gcc mit -O1 die Initialisierung des Arrays daher
+    // grosszuegig unter den Tisch fallen.
+    volatile dword metadata[2] = { function, correlation_id };
     
     do {
         asm(
@@ -31,7 +38,10 @@
             "mov %1, %%eax;"
             "int $0x30;"
             "add $0x14, %%esp;"
-        : "=a" (result) : "i" (SYSCALL_FASTRPC), "g" (pid), "i" (0x8), "g" (metadata), "g" (len), "g" (data), "0" (result));
+        : "=a" (result) 
+        : "i" (SYSCALL_FASTRPC), "g" (pid), "i" (0x8), "g" (metadata), 
+            "g" (len), "g" (data), "0" (result));
+
     } while (result != 0);
 }