diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-07-20 22:03:26 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-07-20 22:03:26 +0000 |
commit | 096b453144caa00f321d99522f5d56db6a06f6fd (patch) | |
tree | c440b2984df9e5a6476da9e52cd5a40afcf64dba | |
parent | 2bcf7f73db33a8a1c48a422b4bfbdfdbbb04f2c4 (diff) |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@250402 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | libgo/go/syscall/syscall_linux_s390.go | 25 | ||||
-rw-r--r-- | 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) } |