|
From: <sv...@va...> - 2012-08-05 02:23:19
|
petarj 2012-08-05 03:22:52 +0100 (Sun, 05 Aug 2012)
New Revision: 12836
Log:
Fixing incorrect case in putSyscallArgsIntoGuestState for __NR_syscall.
Previously unused arg8 is now used to hold NR_syscall value when that call is
executed. This is important, so putSyscallArgsIntoGuestState can correctly
fill up the guest state. This is MIPS-only change.
Modified files:
trunk/coregrind/m_syswrap/syswrap-main.c
Modified: trunk/coregrind/m_syswrap/syswrap-main.c (+21 -8)
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-main.c 2012-08-05 01:08:25 +01:00 (rev 12835)
+++ trunk/coregrind/m_syswrap/syswrap-main.c 2012-08-05 03:22:52 +01:00 (rev 12836)
@@ -473,6 +473,7 @@
canonical->arg4 = gst->guest_r7; // a3
canonical->arg5 = *((UInt*) (gst->guest_r29 + 16)); // 16(guest_SP/sp)
canonical->arg6 = *((UInt*) (gst->guest_r29 + 20)); // 20(sp)
+ canonical->arg8 = 0;
} else {
// Fixme hack handle syscall()
canonical->sysno = gst->guest_r4; // a0
@@ -482,6 +483,7 @@
canonical->arg4 = *((UInt*) (gst->guest_r29 + 16)); // 16(guest_SP/sp)
canonical->arg5 = *((UInt*) (gst->guest_r29 + 20)); // 20(guest_SP/sp)
canonical->arg6 = *((UInt*) (gst->guest_r29 + 24)); // 24(guest_SP/sp)
+ canonical->arg8 = __NR_syscall;
}
#elif defined(VGP_x86_darwin)
@@ -719,14 +721,25 @@
#elif defined(VGP_mips32_linux)
VexGuestMIPS32State* gst = (VexGuestMIPS32State*)gst_vanilla;
- gst->guest_r2 = canonical->sysno;
- gst->guest_r4 = canonical->arg1;
- gst->guest_r5 = canonical->arg2;
- gst->guest_r6 = canonical->arg3;
- gst->guest_r7 = canonical->arg4;
- *((UInt*) (gst->guest_r29 + 16)) = canonical->arg5; // 16(guest_GPR29/sp)
- *((UInt*) (gst->guest_r29 + 20)) = canonical->arg6; // 20(sp)
-
+ if (canonical->arg8 != __NR_syscall) {
+ gst->guest_r2 = canonical->sysno;
+ gst->guest_r4 = canonical->arg1;
+ gst->guest_r5 = canonical->arg2;
+ gst->guest_r6 = canonical->arg3;
+ gst->guest_r7 = canonical->arg4;
+ *((UInt*) (gst->guest_r29 + 16)) = canonical->arg5; // 16(guest_GPR29/sp)
+ *((UInt*) (gst->guest_r29 + 20)) = canonical->arg6; // 20(sp)
+ } else {
+ canonical->arg8 = 0;
+ gst->guest_r2 = __NR_syscall;
+ gst->guest_r4 = canonical->sysno;
+ gst->guest_r5 = canonical->arg1;
+ gst->guest_r6 = canonical->arg2;
+ gst->guest_r7 = canonical->arg3;
+ *((UInt*) (gst->guest_r29 + 16)) = canonical->arg4; // 16(guest_GPR29/sp)
+ *((UInt*) (gst->guest_r29 + 20)) = canonical->arg5; // 20(sp)
+ *((UInt*) (gst->guest_r29 + 24)) = canonical->arg6; // 24(sp)
+ }
#else
# error "putSyscallArgsIntoGuestState: unknown arch"
#endif
|