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)
}