I've committed the appended patch to the GCC 5, 6, and 7 branches to
backport https://golang.org/cl/48231, which fixes building libgo with
recent versions of glibc on s390.  Thanks to Jakub for testing the
patch.

Ian
Index: libgo/go/syscall/syscall_linux_s390.go
===================================================================
--- libgo/go/syscall/syscall_linux_s390.go      (revision 247776)
+++ libgo/go/syscall/syscall_linux_s390.go      (working copy)
@@ -12,10 +12,29 @@ 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)))
+const syscall_PTRACE_PEEKUSR_AREA = 0x5000
+const syscall_PTRACE_POKEUSR_AREA = 0x5001
+
+type syscall_ptrace_area struct {
+       len          uint32
+       kernel_addr  uint32
+       process_addr uint32
+}
+
+func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
+       parea := syscall_ptrace_area{
+               12,
+               0,
+               uint32(uintptr(unsafe.Pointer(regs))),
+       }
+       return ptrace(syscall_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 := syscall_ptrace_area{
+               12,
+               0,
+               uint32(uintptr(unsafe.Pointer(regs))),
+       }
+       return ptrace(syscall_PTRACE_POKEUSR_AREA, pid, 
uintptr(unsafe.Pointer(&parea)), 0)
 }
Index: libgo/go/syscall/syscall_linux_s390x.go
===================================================================
--- libgo/go/syscall/syscall_linux_s390x.go     (revision 247776)
+++ libgo/go/syscall/syscall_linux_s390x.go     (working copy)
@@ -12,10 +12,29 @@ 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)))
+const syscall_PTRACE_PEEKUSR_AREA = 0x5000
+const syscall_PTRACE_POKEUSR_AREA = 0x5001
+
+type syscall_ptrace_area struct {
+       len          uint32
+       kernel_addr  uint64
+       process_addr uint64
+}
+
+func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
+       parea := syscall_ptrace_area{
+               24,
+               0,
+               uint64(uintptr(unsafe.Pointer(regs))),
+       }
+       return ptrace(syscall_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 := syscall_ptrace_area{
+               24,
+               0,
+               uint64(uintptr(unsafe.Pointer(regs))),
+       }
+       return ptrace(syscall_PTRACE_POKEUSR_AREA, pid, 
uintptr(unsafe.Pointer(&parea)), 0)
 }

Reply via email to