From: Julian Seward Date: Mon, 18 Jul 2005 11:41:15 +0000 (+0000) Subject: Track API changes in vex r1272. X-Git-Tag: svn/VALGRIND_3_0_0~159 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ce1682b2d860ea55dc9cec3e2f8024a074764799;p=thirdparty%2Fvalgrind.git Track API changes in vex r1272. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4159 --- diff --git a/coregrind/m_sigframe/sigframe-ppc32-linux.c b/coregrind/m_sigframe/sigframe-ppc32-linux.c index 6d9e00427f..d99e8d2a49 100644 --- a/coregrind/m_sigframe/sigframe-ppc32-linux.c +++ b/coregrind/m_sigframe/sigframe-ppc32-linux.c @@ -151,8 +151,8 @@ void stack_mcontext ( struct vki_mcontext *mc, mc->mc_gregs[VKI_PT_ORIG_R3] = tst->arch.vex.guest_GPR3; mc->mc_gregs[VKI_PT_CTR] = tst->arch.vex.guest_CTR; mc->mc_gregs[VKI_PT_LNK] = tst->arch.vex.guest_LR; - mc->mc_gregs[VKI_PT_XER] = tst->arch.vex.guest_XER; - mc->mc_gregs[VKI_PT_CCR] = LibVEX_GuestPPC32_get_cr(&tst->arch.vex); + mc->mc_gregs[VKI_PT_XER] = LibVEX_GuestPPC32_get_XER(&tst->arch.vex); + mc->mc_gregs[VKI_PT_CCR] = LibVEX_GuestPPC32_get_CR(&tst->arch.vex); mc->mc_gregs[VKI_PT_MQ] = 0; mc->mc_gregs[VKI_PT_TRAP] = 0; mc->mc_gregs[VKI_PT_DAR] = fault_addr; @@ -908,12 +908,11 @@ void VG_(sigframe_destroy)( ThreadId tid, Bool isRT ) // Umm ... ? (jrs 2005 July 8) // tst->arch.m_orig_gpr3 = mc->mc_gregs[VKI_PT_ORIG_R3]; - //tst->arch.m_cr = mc->mc_gregs[VKI_PT_CCR]; - LibVEX_GuestPPC32_put_cr( mc->mc_gregs[VKI_PT_CCR], &tst->arch.vex ); + LibVEX_GuestPPC32_put_CR( mc->mc_gregs[VKI_PT_CCR], &tst->arch.vex ); tst->arch.vex.guest_LR = mc->mc_gregs[VKI_PT_LNK]; tst->arch.vex.guest_CTR = mc->mc_gregs[VKI_PT_CTR]; - tst->arch.vex.guest_XER = mc->mc_gregs[VKI_PT_XER]; + LibVEX_GuestPPC32_put_XER( mc->mc_gregs[VKI_PT_XER], &tst->arch.vex ); tst->arch.vex_shadow = priv->shadow; diff --git a/coregrind/m_syswrap/syscall-ppc32-linux.S b/coregrind/m_syswrap/syscall-ppc32-linux.S index e33ddc3477..e829802074 100644 --- a/coregrind/m_syswrap/syscall-ppc32-linux.S +++ b/coregrind/m_syswrap/syscall-ppc32-linux.S @@ -103,14 +103,11 @@ ML_(do_syscall_for_client_WRK): 2: sc /* do the syscall */ /* put the result back in the threadstate */ - /* HACK: killing all of CR0 for simplicity (should get from gst) */ 3: stw 3,OFFSET_ppc32_GPR3(30) /* gst->GPR3 = sc result */ - li 4,1 - stw 4,OFFSET_ppc32_CC_OP(30) /* gst->CC_OP = 1 */ + /* copy cr0.so back to simulated state */ mfcr 5 /* r5 = CR */ - andis. 5,5,0x1000 /* mask to only CR7.SO */ - oris 5,5,0x2000 /* set CR7.EQ */ - stw 5,OFFSET_ppc32_CC_DEP1(30) /* gst->CR7 = CR7 */ + rlwinm 5,5,4,31,31 /* r5 = (CR >> 28) & 1 */ + stb 5,OFFSET_ppc32_CR0_0(30) /* gst->CR0.SO = cr0.so */ /* block signals again */ /* set up for sigprocmask(SIG_SETMASK, postmask, NULL) */ diff --git a/coregrind/m_syswrap/syswrap-main.c b/coregrind/m_syswrap/syswrap-main.c index 0760947dfc..7e0233e6c7 100644 --- a/coregrind/m_syswrap/syswrap-main.c +++ b/coregrind/m_syswrap/syswrap-main.c @@ -360,8 +360,8 @@ void getSyscallStatusFromGuestState ( /*OUT*/SyscallStatus* canonical, #elif defined(VGP_ppc32_linux) VexGuestPPC32State* gst = (VexGuestPPC32State*)gst_vanilla; - UInt cr = LibVEX_GuestPPC32_get_cr7( gst ); - UInt err = (cr >> 28) & 1; // CR7.SO + UInt cr = LibVEX_GuestPPC32_get_CR( gst ); + UInt err = (cr >> 28) & 1; // CR0.SO canonical->what = (err == 1) ? SsFailure : SsSuccess; canonical->val = (UWord)gst->guest_GPR3; @@ -399,15 +399,17 @@ void putSyscallStatusIntoGuestState ( /*IN*/ SyscallStatus* canonical, #elif defined(VGP_ppc32_linux) VexGuestPPC32State* gst = (VexGuestPPC32State*)gst_vanilla; + UInt old_cr = LibVEX_GuestPPC32_get_CR(gst); + gst->guest_GPR3 = canonical->val; - gst->guest_CC_OP = 1; - /* XXX: Setting all of CR0, not just SO flag */ - if (canonical->what == SsFailure) /* set cr0.SO */ - gst->guest_CC_DEP1 = 0x30000000; - else /* clear cr0.SO */ - gst->guest_CC_DEP1 = 0x20000000; -// CAB: Need to set gpr0? - gst->guest_GPR0 = 0; + + if (canonical->what == SsFailure) { + /* set CR0.SO */ + LibVEX_GuestPPC32_put_CR( old_cr | (1<<28), gst ); + } else { + /* clear CR0.SO */ + LibVEX_GuestPPC32_put_CR( old_cr & ~(1<<28), gst ); + } #else # error "putSyscallStatusIntoGuestState: unknown arch" diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index ffe6d16eff..e814e9191f 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -1543,7 +1543,8 @@ PRE(sys_sigreturn) SET_STATUS_from_SysRes( VG_(mk_SysRes_ppc32_linux)( tst->arch.vex.guest_GPR3, - (LibVEX_GuestPPC32_get_cr7( &tst->arch.vex ) >> 28) & 1 + /* get CR0.SO */ + (LibVEX_GuestPPC32_get_CR( &tst->arch.vex ) >> 28) & 1 ) ); diff --git a/memcheck/mc_translate.c b/memcheck/mc_translate.c index 0579897b08..8eee505ec9 100644 --- a/memcheck/mc_translate.c +++ b/memcheck/mc_translate.c @@ -1706,6 +1706,8 @@ IRAtom* expr2vbits_Binop ( MCEnv* mce, cheap_AddSub32: case Iop_Mul32: + case Iop_CmpORD32S: + case Iop_CmpORD32U: return mkLeft32(mce, mkUifU32(mce, vatom1,vatom2)); case Iop_Add64: @@ -1902,6 +1904,7 @@ IRExpr* expr2vbits_Unop ( MCEnv* mce, IROp op, IRAtom* atom ) case Iop_64to32: case Iop_64HIto32: case Iop_1Uto32: + case Iop_1Sto32: case Iop_8Uto32: case Iop_16Uto32: case Iop_16Sto32: @@ -2059,7 +2062,6 @@ IRAtom* expr2vbits_Load ( MCEnv* mce, v64lo = expr2vbits_Load_WRK(mce, end, Ity_I64, addr, bias); v64hi = expr2vbits_Load_WRK(mce, end, Ity_I64, addr, bias+8); } else { - tl_assert(0 /* awaiting test case */); v64hi = expr2vbits_Load_WRK(mce, end, Ity_I64, addr, bias); v64lo = expr2vbits_Load_WRK(mce, end, Ity_I64, addr, bias+8); }