From c488c0cfe2339142872c73d291b865d9ba75c6a1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 20 Jul 2017 22:04:02 +0000 Subject: [PATCH] re PR go/81393 (Bootstrap failure on s390x-linux while building libgo against recent glibc) PR go/81393 syscall: don't use GETREGS/SETREGS on s390 They were removed in recent glibc. This is a backport of https://golang.org/cl/48231 to earlier branches. Define required type and constants in syscall package directly, don't try to pull them from the system header files. From-SVN: r250404 --- libgo/go/syscall/syscall_linux_s390.go | 25 ++++++++++++++++++++++--- libgo/go/syscall/syscall_linux_s390x.go | 25 ++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/libgo/go/syscall/syscall_linux_s390.go b/libgo/go/syscall/syscall_linux_s390.go index a744f6b78419..4903783b61a2 100644 --- a/libgo/go/syscall/syscall_linux_s390.go +++ b/libgo/go/syscall/syscall_linux_s390.go @@ -12,10 +12,29 @@ 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))) +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) } diff --git a/libgo/go/syscall/syscall_linux_s390x.go b/libgo/go/syscall/syscall_linux_s390x.go index 44d567983c8d..daa094c6f175 100644 --- a/libgo/go/syscall/syscall_linux_s390x.go +++ b/libgo/go/syscall/syscall_linux_s390x.go @@ -12,10 +12,29 @@ 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))) +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) } -- 2.47.2