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  }