From 6eecb2932650cab7b3a19cce9e0cc90daf093f12 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 13 Jul 2017 03:44:14 +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. Patch by Andreas Krebbel for GCC PR 81393. Reviewed-on: https://go-review.googlesource.com/48231 From-SVN: r250174 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/syscall/syscall_linux_s390.go | 18 +++++++++++--- libgo/go/syscall/syscall_linux_s390x.go | 33 ++++++++++++++++++++++--- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 289383f929a..efa2c018dfb 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/libgo/go/syscall/syscall_linux_s390.go b/libgo/go/syscall/syscall_linux_s390.go index d6d3f6ab892..8b005427eef 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,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) } diff --git a/libgo/go/syscall/syscall_linux_s390x.go b/libgo/go/syscall/syscall_linux_s390x.go index f3701dc8f90..1767a6e5c61 100644 --- a/libgo/go/syscall/syscall_linux_s390x.go +++ b/libgo/go/syscall/syscall_linux_s390x.go @@ -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) } -- 2.30.2