github.com/undoio/delve@v1.9.0/pkg/proc/native/registers_freebsd_amd64.go (about)

     1  package native
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sys "golang.org/x/sys/unix"
     7  
     8  	"github.com/undoio/delve/pkg/dwarf/op"
     9  	"github.com/undoio/delve/pkg/proc"
    10  	"github.com/undoio/delve/pkg/proc/amd64util"
    11  	"github.com/undoio/delve/pkg/proc/fbsdutil"
    12  )
    13  
    14  // SetPC sets RIP to the value specified by 'pc'.
    15  func (thread *nativeThread) setPC(pc uint64) error {
    16  	ir, err := registers(thread)
    17  	if err != nil {
    18  		return err
    19  	}
    20  	r := ir.(*fbsdutil.AMD64Registers)
    21  	r.Regs.Rip = int64(pc)
    22  	thread.dbp.execPtraceFunc(func() { err = sys.PtraceSetRegs(thread.ID, (*sys.Reg)(r.Regs)) })
    23  	return err
    24  }
    25  
    26  // SetReg changes the value of the specified register.
    27  func (thread *nativeThread) SetReg(regNum uint64, reg *op.DwarfRegister) error {
    28  	ir, err := registers(thread)
    29  	if err != nil {
    30  		return err
    31  	}
    32  	r := ir.(*fbsdutil.AMD64Registers)
    33  	fpchanged, err := r.SetReg(regNum, reg)
    34  	if err != nil {
    35  		return err
    36  	}
    37  	return setRegisters(thread, r, fpchanged)
    38  }
    39  
    40  func registers(thread *nativeThread) (proc.Registers, error) {
    41  	var (
    42  		regs fbsdutil.AMD64PtraceRegs
    43  		err  error
    44  	)
    45  	thread.dbp.execPtraceFunc(func() { err = sys.PtraceGetRegs(thread.ID, (*sys.Reg)(&regs)) })
    46  	if err != nil {
    47  		return nil, err
    48  	}
    49  	var fsbase int64
    50  	thread.dbp.execPtraceFunc(func() { err = sys.PtraceGetFsBase(thread.ID, &fsbase) })
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  	r := fbsdutil.NewAMD64Registers(&regs, uint64(fsbase), func(r *fbsdutil.AMD64Registers) error {
    55  		var floatLoadError error
    56  		r.Fpregs, r.Fpregset, floatLoadError = thread.fpRegisters()
    57  		return floatLoadError
    58  	})
    59  	return r, nil
    60  }
    61  
    62  func (thread *nativeThread) fpRegisters() (regs []proc.Register, fpregs *amd64util.AMD64Xstate, err error) {
    63  	thread.dbp.execPtraceFunc(func() { fpregs, err = ptraceGetRegset(thread.ID) })
    64  	if err != nil {
    65  		err = fmt.Errorf("could not get floating point registers: %v", err.Error())
    66  	}
    67  	regs = fpregs.Decode()
    68  	return
    69  }
    70  
    71  func setRegisters(thread *nativeThread, r *fbsdutil.AMD64Registers, setFP bool) (err error) {
    72  	thread.dbp.execPtraceFunc(func() {
    73  		err = sys.PtraceSetRegs(thread.ID, (*sys.Reg)(r.Regs))
    74  		if err != nil {
    75  			return
    76  		}
    77  		if setFP && r.Fpregset != nil {
    78  			err = ptraceSetRegset(thread.ID, r.Fpregset)
    79  		}
    80  	})
    81  	return
    82  }