Handle more kern return values and general cleanup
This commit is contained in:
parent
b065674fe3
commit
4d918aeb2c
@ -46,7 +46,6 @@ get_registers(mach_port_name_t task, x86_thread_state64_t *state) {
|
|||||||
return thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)state, &stateCount);
|
return thread_get_state(task, x86_THREAD_STATE64, (thread_state_t)state, &stateCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(dp) this should return kret instead of void
|
|
||||||
kern_return_t
|
kern_return_t
|
||||||
set_pc(thread_act_t task, uint64_t pc) {
|
set_pc(thread_act_t task, uint64_t pc) {
|
||||||
kern_return_t kret;
|
kern_return_t kret;
|
||||||
@ -61,26 +60,20 @@ set_pc(thread_act_t task, uint64_t pc) {
|
|||||||
return thread_set_state(task, x86_THREAD_STATE64, (thread_state_t)&state, stateCount);
|
return thread_set_state(task, x86_THREAD_STATE64, (thread_state_t)&state, stateCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(dp) this should return kret instead of void
|
kern_return_t
|
||||||
void
|
|
||||||
single_step(thread_act_t thread) {
|
single_step(thread_act_t thread) {
|
||||||
kern_return_t kret;
|
kern_return_t kret;
|
||||||
x86_thread_state64_t regs;
|
x86_thread_state64_t regs;
|
||||||
mach_msg_type_number_t count = x86_THREAD_STATE64_COUNT;
|
mach_msg_type_number_t count = x86_THREAD_STATE64_COUNT;
|
||||||
|
|
||||||
kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, &count);
|
kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, &count);
|
||||||
if (kret != KERN_SUCCESS) {
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
puts("get state fail");
|
|
||||||
puts(mach_error_string(kret));
|
|
||||||
}
|
|
||||||
// Set trap bit in rflags
|
// Set trap bit in rflags
|
||||||
regs.__rflags |= 0x100UL;
|
regs.__rflags |= 0x100UL;
|
||||||
|
|
||||||
kret = thread_set_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, count);
|
kret = thread_set_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, count);
|
||||||
if (kret != KERN_SUCCESS) {
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
puts("set state fail");
|
|
||||||
puts(mach_error_string(kret));
|
|
||||||
}
|
|
||||||
// TODO(dp) vm deallocate state?
|
// TODO(dp) vm deallocate state?
|
||||||
|
|
||||||
// Continue here until we've fully decremented suspend_count
|
// Continue here until we've fully decremented suspend_count
|
||||||
@ -88,27 +81,22 @@ single_step(thread_act_t thread) {
|
|||||||
kret = thread_resume(thread);
|
kret = thread_resume(thread);
|
||||||
if (kret != KERN_SUCCESS) break;
|
if (kret != KERN_SUCCESS) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return KERN_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(dp) return kret
|
kern_return_t
|
||||||
void
|
|
||||||
clear_trap_flag(thread_act_t thread) {
|
clear_trap_flag(thread_act_t thread) {
|
||||||
kern_return_t kret;
|
kern_return_t kret;
|
||||||
x86_thread_state64_t regs;
|
x86_thread_state64_t regs;
|
||||||
mach_msg_type_number_t count = x86_THREAD_STATE64_COUNT;
|
mach_msg_type_number_t count = x86_THREAD_STATE64_COUNT;
|
||||||
|
|
||||||
kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, &count);
|
kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, &count);
|
||||||
if (kret != KERN_SUCCESS) {
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
puts("get state fail");
|
|
||||||
puts(mach_error_string(kret));
|
|
||||||
}
|
|
||||||
// Clear trap bit in rflags
|
// Clear trap bit in rflags
|
||||||
regs.__rflags ^= 0x100UL;
|
regs.__rflags ^= 0x100UL;
|
||||||
|
|
||||||
kret = thread_set_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, count);
|
|
||||||
if (kret != KERN_SUCCESS) {
|
|
||||||
puts("set state fail");
|
|
||||||
puts(mach_error_string(kret));
|
|
||||||
}
|
|
||||||
// TODO(dp) vm deallocate state?
|
// TODO(dp) vm deallocate state?
|
||||||
|
return thread_set_state(thread, x86_THREAD_STATE64, (thread_state_t)®s, count);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,9 +22,15 @@ func (t *ThreadContext) Halt() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *ThreadContext) singleStep() error {
|
func (t *ThreadContext) singleStep() error {
|
||||||
C.single_step(t.os.thread_act)
|
kret := C.single_step(t.os.thread_act)
|
||||||
|
if kret != C.KERN_SUCCESS {
|
||||||
|
return fmt.Errorf("could not single step")
|
||||||
|
}
|
||||||
trapWait(t.Process, 0)
|
trapWait(t.Process, 0)
|
||||||
C.clear_trap_flag(t.os.thread_act)
|
kret = C.clear_trap_flag(t.os.thread_act)
|
||||||
|
if kret != C.KERN_SUCCESS {
|
||||||
|
return fmt.Errorf("could not clear CPU trap flag")
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <mach/mach.h>
|
#include <mach/mach.h>
|
||||||
#include <mach/mach_vm.h>
|
#include <mach/mach_vm.h>
|
||||||
@ -16,8 +15,8 @@ get_registers(mach_port_name_t, x86_thread_state64_t*);
|
|||||||
kern_return_t
|
kern_return_t
|
||||||
set_pc(thread_act_t, uint64_t);
|
set_pc(thread_act_t, uint64_t);
|
||||||
|
|
||||||
void
|
kern_return_t
|
||||||
single_step(thread_act_t);
|
single_step(thread_act_t);
|
||||||
|
|
||||||
void
|
kern_return_t
|
||||||
clear_trap_flag(thread_act_t thread);
|
clear_trap_flag(thread_act_t thread);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user