X-Git-Url: https://rtime.felk.cvut.cz/gitweb/l4.git/blobdiff_plain/f4122e6e085938b6d216a9ec724b974a603f6992..983fe7c4ac262f56d38a143b1efab1e4afb77a52:/l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_debugger.c diff --git a/l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_debugger.c b/l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_debugger.c index 8f3f9df69..5ea04efdc 100644 --- a/l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_debugger.c +++ b/l4/pkg/valgrind/src/valgrind-3.6.0-svn/coregrind/m_debugger.c @@ -30,6 +30,7 @@ #include "pub_core_basics.h" #include "pub_core_vki.h" +#include "pub_core_libcsetjmp.h" #include "pub_core_threadstate.h" #include "pub_core_xarray.h" #include "pub_core_clientstate.h" @@ -223,7 +224,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); @@ -242,6 +246,76 @@ static Int ptrace_setregs(Int pid, VexGuestArchState* vex) #elif defined(VGP_x86_l4re) I_die_here; +#elif defined(VGP_s390x_linux) + struct vki_user_regs_struct regs; + vki_ptrace_area pa; + + /* We don't set the psw mask and start at offset 8 */ + pa.vki_len = (unsigned long) ®s.per_info - (unsigned long) ®s.psw.addr; + pa.vki_process_addr = (unsigned long) ®s.psw.addr; + pa.vki_kernel_addr = 8; + + VG_(memset)(®s, 0, sizeof(regs)); + regs.psw.addr = vex->guest_IA; + + /* We don't set the mask */ + regs.gprs[0] = vex->guest_r0; + regs.gprs[1] = vex->guest_r1; + regs.gprs[2] = vex->guest_r2; + regs.gprs[3] = vex->guest_r3; + regs.gprs[4] = vex->guest_r4; + regs.gprs[5] = vex->guest_r5; + regs.gprs[6] = vex->guest_r6; + regs.gprs[7] = vex->guest_r7; + regs.gprs[8] = vex->guest_r8; + regs.gprs[9] = vex->guest_r9; + regs.gprs[10] = vex->guest_r10; + regs.gprs[11] = vex->guest_r11; + regs.gprs[12] = vex->guest_r12; + regs.gprs[13] = vex->guest_r13; + regs.gprs[14] = vex->guest_r14; + regs.gprs[15] = vex->guest_r15; + + regs.acrs[0] = vex->guest_a0; + regs.acrs[1] = vex->guest_a1; + regs.acrs[2] = vex->guest_a2; + regs.acrs[3] = vex->guest_a3; + regs.acrs[4] = vex->guest_a4; + regs.acrs[5] = vex->guest_a5; + regs.acrs[6] = vex->guest_a6; + regs.acrs[7] = vex->guest_a7; + regs.acrs[8] = vex->guest_a8; + regs.acrs[9] = vex->guest_a9; + regs.acrs[10] = vex->guest_a10; + regs.acrs[11] = vex->guest_a11; + regs.acrs[12] = vex->guest_a12; + regs.acrs[13] = vex->guest_a13; + regs.acrs[14] = vex->guest_a14; + regs.acrs[15] = vex->guest_a15; + + /* only used for system call restart and friends, just use r2 */ + regs.orig_gpr2 = vex->guest_r2; + + regs.fp_regs.fprs[0].ui = vex->guest_f0; + regs.fp_regs.fprs[1].ui = vex->guest_f1; + regs.fp_regs.fprs[2].ui = vex->guest_f2; + regs.fp_regs.fprs[3].ui = vex->guest_f3; + regs.fp_regs.fprs[4].ui = vex->guest_f4; + regs.fp_regs.fprs[5].ui = vex->guest_f5; + regs.fp_regs.fprs[6].ui = vex->guest_f6; + regs.fp_regs.fprs[7].ui = vex->guest_f7; + regs.fp_regs.fprs[8].ui = vex->guest_f8; + regs.fp_regs.fprs[9].ui = vex->guest_f9; + regs.fp_regs.fprs[10].ui = vex->guest_f10; + regs.fp_regs.fprs[11].ui = vex->guest_f11; + regs.fp_regs.fprs[12].ui = vex->guest_f12; + regs.fp_regs.fprs[13].ui = vex->guest_f13; + regs.fp_regs.fprs[14].ui = vex->guest_f14; + regs.fp_regs.fprs[15].ui = vex->guest_f15; + regs.fp_regs.fpc = vex->guest_fpc; + + return VG_(ptrace)(VKI_PTRACE_POKEUSR_AREA, pid, &pa, NULL); + #else # error Unknown arch #endif