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)(®s)) }) 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(®s, 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 }