2015-01-14 02:37:10 +00:00
|
|
|
package proctl
|
|
|
|
|
|
|
|
// #include "threads_darwin.h"
|
|
|
|
import "C"
|
2015-02-28 16:39:21 +00:00
|
|
|
import "fmt"
|
2015-01-14 02:37:10 +00:00
|
|
|
|
|
|
|
type Regs struct {
|
|
|
|
pc, sp uint64
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Regs) PC() uint64 {
|
|
|
|
return r.pc
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Regs) SP() uint64 {
|
|
|
|
return r.sp
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *Regs) SetPC(thread *ThreadContext, pc uint64) error {
|
|
|
|
C.set_pc(thread.os.thread_act, C.uint64_t(pc))
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func registers(thread *ThreadContext) (Registers, error) {
|
2015-02-28 16:39:21 +00:00
|
|
|
var state C.x86_thread_state64_t
|
|
|
|
kret := C.get_registers(C.mach_port_name_t(thread.os.thread_act), &state)
|
|
|
|
if kret != C.KERN_SUCCESS {
|
|
|
|
return nil, fmt.Errorf("could not get registers")
|
|
|
|
}
|
2015-01-14 02:37:10 +00:00
|
|
|
regs := &Regs{pc: uint64(state.__rip), sp: uint64(state.__rsp)}
|
|
|
|
return regs, nil
|
|
|
|
}
|