re PR go/81393 (Bootstrap failure on s390x-linux while building libgo against recent...
authorIan Lance Taylor <ian@gcc.gnu.org>
Thu, 13 Jul 2017 03:44:14 +0000 (03:44 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Thu, 13 Jul 2017 03:44:14 +0000 (03:44 +0000)
PR go/81393
    syscall: don't use GETREGS/SETREGS on s390

    They were removed in recent glibc.

    Patch by Andreas Krebbel for GCC PR 81393.

    Reviewed-on: https://go-review.googlesource.com/48231

From-SVN: r250174

gcc/go/gofrontend/MERGE
libgo/go/syscall/syscall_linux_s390.go
libgo/go/syscall/syscall_linux_s390x.go

index 289383f929aadd93e916cede0fc4e47672dba4fa..efa2c018dfb51d0f740de2ee6bb20282d1bca179 100644 (file)
@@ -1,4 +1,4 @@
-12c65e8310956eb3cc412d9dc9f9e88cbd928c8e
+9294e79fced202ade7eb236bbe78b766e7e0374f
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index d6d3f6ab8924692b88c7b189b109d3b8da4ace88..8b005427eef1fe0c80a0741c613268b62851cf1b 100644 (file)
@@ -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 { 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)
 }
index f3701dc8f90d675428b0f32409d82087fb69fd94..1767a6e5c616c9644df72b13686f50fc58c37495 100644 (file)
@@ -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 { 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)
 }