From a4785b9adf80eef3b9604c67dddc4cb2e5e0a8b3 Mon Sep 17 00:00:00 2001 From: Petar Jovanovic Date: Sun, 5 Aug 2012 02:22:52 +0000 Subject: [PATCH] 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. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12836 --- coregrind/m_syswrap/syswrap-main.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-main.c b/coregrind/m_syswrap/syswrap-main.c index 8c31dd1b0e..095951da83 100644 --- a/coregrind/m_syswrap/syswrap-main.c +++ b/coregrind/m_syswrap/syswrap-main.c @@ -473,6 +473,7 @@ void getSyscallArgsFromGuestState ( /*OUT*/SyscallArgs* canonical, 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 @@ void getSyscallArgsFromGuestState ( /*OUT*/SyscallArgs* canonical, 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 @@ void putSyscallArgsIntoGuestState ( /*IN*/ SyscallArgs* canonical, #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 -- 2.47.2