]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
arm-linux: zero out the least significant bit of R15 that we
authorJulian Seward <jseward@acm.org>
Thu, 23 Sep 2010 11:02:48 +0000 (11:02 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 23 Sep 2010 11:02:48 +0000 (11:02 +0000)
ptrace into the child, so as to be a legitimate instruction
address in both ARM and Thumb mode.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11375

coregrind/m_debugger.c

index 76861031b69f3dead233e243306295275038f0cf..eaf80d1892269267622cf3b71b13daeab99316d7 100644 (file)
@@ -223,7 +223,10 @@ static Int ptrace_setregs(Int pid, VexGuestArchState* vex)
    uregs.ARM_ip   = vex->guest_R12; 
    uregs.ARM_sp   = vex->guest_R13; 
    uregs.ARM_lr   = vex->guest_R14; 
-   uregs.ARM_pc   = vex->guest_R15T;
+   // Remove the T bit from the bottom of R15T.  It will get shipped
+   // over in CPSR.T instead, since LibVEX_GuestARM_get_cpsr copies
+   // it from R15T[0].
+   uregs.ARM_pc   = vex->guest_R15T & 0xFFFFFFFE;
    uregs.ARM_cpsr = LibVEX_GuestARM_get_cpsr(vex);
    return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &uregs);