This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] PR81393: S/390: libgo: Fix ptrace register set accessors.
- From: Andreas Krebbel <krebbel at linux dot vnet dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org, gofrontend-dev at googlegroups dot com
- Date: Wed, 12 Jul 2017 16:44:28 +0200
- Subject: [PATCH] PR81393: S/390: libgo: Fix ptrace register set accessors.
- Authentication-results: sourceware.org; auth=none
ptrace SETREGS and GETREGS were never supported on S/390. The macros
were accidentally defined in the Glibc header though. A recent Glibc
change removed them breaking libgo build on S/390.
This patch changes the ptrace calls to use PEEKUSR_AREA/POKEUSR_AREA to
access the register sets. That's what GDB does.
Bootstrapped and regression tested on s390x.
Bye,
-Andreas-
---
libgo/go/syscall/syscall_linux_s390.go | 16 +++++++++++++---
libgo/go/syscall/syscall_linux_s390x.go | 30 +++++++++++++++++++++++++++---
2 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/libgo/go/syscall/syscall_linux_s390.go b/libgo/go/syscall/syscall_linux_s390.go
index d6d3f6a..9364bcd 100644
--- a/libgo/go/syscall/syscall_linux_s390.go
+++ b/libgo/go/syscall/syscall_linux_s390.go
@@ -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,18 @@ func (r *PtraceRegs) PC() uint64 { return uint64(r.Psw.addr) }
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)
}
diff --git a/libgo/go/syscall/syscall_linux_s390x.go b/libgo/go/syscall/syscall_linux_s390x.go
index f3701dc..8d9ca84 100644
--- a/libgo/go/syscall/syscall_linux_s390x.go
+++ b/libgo/go/syscall/syscall_linux_s390x.go
@@ -4,6 +4,24 @@
// 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 +30,16 @@ func (r *PtraceRegs) PC() uint64 { return r.Psw.addr }
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)
}
--
2.9.1