Implemented arch_debug_call_with_fault_handler for x86_64.

This commit is contained in:
Alex Smith
2012-07-14 09:23:48 +01:00
parent 368f253347
commit b2cd72d8f3
2 changed files with 47 additions and 10 deletions
+47
View File
@@ -260,3 +260,50 @@ FUNCTION(arch_cpu_user_strlcpy):
movq $-1, %rax
ret
FUNCTION_END(arch_cpu_user_strlcpy)
/*! \fn void arch_debug_call_with_fault_handler(cpu_ent* cpu,
jmp_buf jumpBuffer, void (*function)(void*), void* parameter)
Called by debug_call_with_fault_handler() to do the dirty work of setting
the fault handler and calling the function. If the function causes a page
fault, the arch_debug_call_with_fault_handler() calls longjmp() with the
given \a jumpBuffer. Otherwise it returns normally.
debug_call_with_fault_handler() has already saved the CPU's fault_handler
and fault_handler_stack_pointer and will reset them later, so
arch_debug_call_with_fault_handler() doesn't need to care about it.
\param cpu The \c cpu_ent for the current CPU.
\param jumpBuffer Buffer to be used for longjmp().
\param function The function to be called.
\param parameter The parameter to be passed to the function to be called.
*/
FUNCTION(arch_debug_call_with_fault_handler):
push %rbp
movq %rsp, %rbp
// Preserve the jump buffer address for the fault return.
push %rsi
// Set fault handler address, and fault handler stack pointer address. We
// don't need to save the previous values, since that's done by the caller.
movq $.L_debug_call_fault_handler, CPU_ENT_fault_handler(%rdi)
movq %rbp, CPU_ENT_fault_handler_stack_pointer(%rdi)
// Call the function.
movq %rcx, %rdi
call *%rdx
// Regular return.
movq %rbp, %rsp
pop %rbp
ret
.L_debug_call_fault_handler:
// Fault -- return via longjmp(jumpBuffer, 1)
movq %rbp, %rsp
movq -8(%rsp), %rdi
movq $1, %rsi
call longjmp
FUNCTION_END(arch_debug_call_with_fault_handler)
-10
View File
@@ -51,16 +51,6 @@ arch_commpage_init_post_cpus(void)
}
void
arch_debug_call_with_fault_handler(cpu_ent* cpu, jmp_buf jumpBuffer,
void (*function)(void*), void* parameter)
{
// To be implemented in asm, not here.
function(parameter);
}
// The software breakpoint instruction (int3).
const uint8 kX86SoftwareBreakpoint[1] = { 0xcc };