]> Cypherpunks.ru repositories - gostls13.git/commitdiff
syscall: implement Ptrace{Set,Get}Regs using PTRACE_{GET,SET}REGSET on all linux...
authorchenguoqi <chenguoqi@loongson.cn>
Thu, 8 Jun 2023 06:04:26 +0000 (14:04 +0800)
committerGopher Robot <gobot@golang.org>
Sat, 10 Jun 2023 16:02:54 +0000 (16:02 +0000)
In the ptrace system call, most of the newer architectures (e.g. arm64,riscv64,loong64)
do not provide support for the command PTRACE_{GET, SET}REGS.

The Linux kernel 2.6.33-rc7[1] introduces support for the command PTRACE_{GET,SET}REGSET,
which exports different types of register sets depending on the NT_* types, completely
overriding the functionality provided by PTRACE_{GET,SET}REGS.

[1] https://lore.kernel.org/all/20100211195614.886724710@sbs-t61.sc.intel.com/

Fixes #60679.

Change-Id: I8c2671d64a7ecd654834740f4f1e1e50c00edcae
Reviewed-on: https://go-review.googlesource.com/c/go/+/501756
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>

src/syscall/syscall_linux.go

index 618b2e6d42f00434857216ab20101196088b7252..a2768e18450b346695a6f6a0886cd07fe6f08b54 100644 (file)
@@ -936,12 +936,22 @@ func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) {
        return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data)
 }
 
+const (
+       _NT_PRSTATUS = 1
+)
+
 func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
-       return ptracePtr(PTRACE_GETREGS, pid, 0, unsafe.Pointer(regsout))
+       var iov Iovec
+       iov.Base = (*byte)(unsafe.Pointer(regsout))
+       iov.SetLen(int(unsafe.Sizeof(*regsout)))
+       return ptracePtr(PTRACE_GETREGSET, pid, uintptr(_NT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
-       return ptracePtr(PTRACE_SETREGS, pid, 0, unsafe.Pointer(regs))
+       var iov Iovec
+       iov.Base = (*byte)(unsafe.Pointer(regs))
+       iov.SetLen(int(unsafe.Sizeof(*regs)))
+       return ptracePtr(PTRACE_SETREGSET, pid, uintptr(_NT_PRSTATUS), unsafe.Pointer(&iov))
 }
 
 func PtraceSetOptions(pid int, options int) (err error) {