[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);
}