86 lines
2.7 KiB
Diff
86 lines
2.7 KiB
Diff
--- libgo/go/syscall/syscall_linux_s390x.go (revision 250173)
|
|
+++ libgo/go/syscall/syscall_linux_s390x.go (revision 250174)
|
|
@@ -4,6 +4,23 @@
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
+// The PtraceRegs struct generated for go looks like this:
|
|
+//
|
|
+// type PtraceRegs struct
|
|
+// {
|
|
+// Psw _psw_t;
|
|
+// Gprs [15+1]uint64;
|
|
+// Acrs [15+1]uint32;
|
|
+// Orig_gpr2 uint64;
|
|
+// Fp_regs _s390_fp_regs;
|
|
+// Per_info _per_struct;
|
|
+// Ieee_instruction_pointer uint64;
|
|
+// }
|
|
+//
|
|
+// The GETREGSET/SETREGSET ptrace commands on S/390 only read/write
|
|
+// the content up to Orig_gpr2. Hence, we use
|
|
+// PEEKUSR_AREA/POKEUSR_AREA like GDB does.
|
|
+
|
|
package syscall
|
|
|
|
import "unsafe"
|
|
@@ -12,10 +29,20 @@ func (r *PtraceRegs) PC() uint64 { retur
|
|
|
|
func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.addr = pc }
|
|
|
|
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
|
|
- return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
|
|
+func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
|
|
+ parea := _ptrace_area{
|
|
+ _sizeof_ptrace_area,
|
|
+ 0,
|
|
+ uint64(uintptr(unsafe.Pointer(regs))),
|
|
+ }
|
|
+ return ptrace(PTRACE_PEEKUSR_AREA, pid, uintptr(unsafe.Pointer(&parea)), 0)
|
|
}
|
|
|
|
func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
|
|
- return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
|
|
+ parea := _ptrace_area{
|
|
+ _sizeof_ptrace_area,
|
|
+ 0,
|
|
+ uint64(uintptr(unsafe.Pointer(regs))),
|
|
+ }
|
|
+ return ptrace(PTRACE_POKEUSR_AREA, pid, uintptr(unsafe.Pointer(&parea)), 0)
|
|
}
|
|
--- libgo/go/syscall/syscall_linux_s390.go (revision 250173)
|
|
+++ libgo/go/syscall/syscall_linux_s390.go (revision 250174)
|
|
@@ -4,6 +4,8 @@
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
+// See the s390x version for why we don't use GETREGSET/SETREGSET
|
|
+
|
|
package syscall
|
|
|
|
import "unsafe"
|
|
@@ -12,10 +14,20 @@ func (r *PtraceRegs) PC() uint64 { retur
|
|
|
|
func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.addr = uint32(pc) }
|
|
|
|
-func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
|
|
- return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
|
|
+func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
|
|
+ parea := _ptrace_area{
|
|
+ _sizeof_ptrace_area,
|
|
+ 0,
|
|
+ uint32(uintptr(unsafe.Pointer(regs))),
|
|
+ }
|
|
+ return ptrace(PTRACE_PEEKUSR_AREA, pid, uintptr(unsafe.Pointer(&parea)), 0)
|
|
}
|
|
|
|
func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
|
|
- return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
|
|
+ parea := _ptrace_area{
|
|
+ _sizeof_ptrace_area,
|
|
+ 0,
|
|
+ uint32(uintptr(unsafe.Pointer(regs))),
|
|
+ }
|
|
+ return ptrace(PTRACE_POKEUSR_AREA, pid, uintptr(unsafe.Pointer(&parea)), 0)
|
|
}
|