github.com/undoio/delve@v1.9.0/pkg/proc/native/ptrace_linux_64bit.go (about) 1 //go:build (linux && amd64) || (linux && arm64) 2 // +build linux,amd64 linux,arm64 3 4 package native 5 6 import ( 7 "syscall" 8 "unsafe" 9 10 sys "golang.org/x/sys/unix" 11 ) 12 13 // processVmRead calls process_vm_readv 14 func processVmRead(tid int, addr uintptr, data []byte) (int, error) { 15 len_iov := uint64(len(data)) 16 local_iov := sys.Iovec{Base: &data[0], Len: len_iov} 17 remote_iov := remoteIovec{base: addr, len: uintptr(len_iov)} 18 p_local := uintptr(unsafe.Pointer(&local_iov)) 19 p_remote := uintptr(unsafe.Pointer(&remote_iov)) 20 n, _, err := syscall.Syscall6(sys.SYS_PROCESS_VM_READV, uintptr(tid), p_local, 1, p_remote, 1, 0) 21 if err != syscall.Errno(0) { 22 return 0, err 23 } 24 return int(n), nil 25 } 26 27 // processVmWrite calls process_vm_writev 28 func processVmWrite(tid int, addr uintptr, data []byte) (int, error) { 29 len_iov := uint64(len(data)) 30 local_iov := sys.Iovec{Base: &data[0], Len: len_iov} 31 remote_iov := remoteIovec{base: addr, len: uintptr(len_iov)} 32 p_local := uintptr(unsafe.Pointer(&local_iov)) 33 p_remote := uintptr(unsafe.Pointer(&remote_iov)) 34 n, _, err := syscall.Syscall6(sys.SYS_PROCESS_VM_WRITEV, uintptr(tid), p_local, 1, p_remote, 1, 0) 35 if err != syscall.Errno(0) { 36 return 0, err 37 } 38 return int(n), nil 39 }