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
This commit is contained in:
parent
258d772a7c
commit
6eecb29326
3 changed files with 46 additions and 7 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue