Commit 6eecb293 by Ian Lance Taylor

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
parent 258d772a
12c65e8310956eb3cc412d9dc9f9e88cbd928c8e 9294e79fced202ade7eb236bbe78b766e7e0374f
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// See the s390x version for why we don't use GETREGSET/SETREGSET
package syscall package syscall
import "unsafe" import "unsafe"
...@@ -12,10 +14,20 @@ func (r *PtraceRegs) PC() uint64 { return uint64(r.Psw.addr) } ...@@ -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 (r *PtraceRegs) SetPC(pc uint64) { r.Psw.addr = uint32(pc) }
func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) 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) { 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)
} }
...@@ -4,6 +4,23 @@ ...@@ -4,6 +4,23 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // 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 package syscall
import "unsafe" import "unsafe"
...@@ -12,10 +29,20 @@ func (r *PtraceRegs) PC() uint64 { return r.Psw.addr } ...@@ -12,10 +29,20 @@ func (r *PtraceRegs) PC() uint64 { return r.Psw.addr }
func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.addr = pc } func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.addr = pc }
func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { func PtraceGetRegs(pid int, regs *PtraceRegs) (err error) {
return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) 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) { 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)
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment