Handle more kern return values and general cleanup

This commit is contained in:
Derek Parker 2015-02-28 10:44:36 -06:00
parent b065674fe3
commit 4d918aeb2c
3 changed files with 20 additions and 27 deletions

@ -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)&regs, &count); kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)&regs, &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)&regs, count); kret = thread_set_state(thread, x86_THREAD_STATE64, (thread_state_t)&regs, 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)&regs, &count); kret = thread_get_state(thread, x86_THREAD_STATE64, (thread_state_t)&regs, &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)&regs, 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)&regs, 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);