diff options
Diffstat (limited to 'coregrind/m_debugger.c')
-rw-r--r-- | coregrind/m_debugger.c | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/coregrind/m_debugger.c b/coregrind/m_debugger.c index eaf80d18..0638755c 100644 --- a/coregrind/m_debugger.c +++ b/coregrind/m_debugger.c @@ -242,6 +242,76 @@ static Int ptrace_setregs(Int pid, VexGuestArchState* vex) #elif defined(VGP_amd64_darwin) 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 |