X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/378393581903b274cb7a4d18e0d978071a6b592d..c0fea4742e91338fffdcf79f86a7c1d5e2b97eb1:/pexpert/i386/pe_interrupt.c diff --git a/pexpert/i386/pe_interrupt.c b/pexpert/i386/pe_interrupt.c index 322de1037..49afab3d5 100644 --- a/pexpert/i386/pe_interrupt.c +++ b/pexpert/i386/pe_interrupt.c @@ -26,7 +26,7 @@ #include -void PE_incoming_interrupt(int, void *); +void PE_incoming_interrupt(x86_saved_state_t *); struct i386_interrupt_handler { @@ -43,21 +43,43 @@ i386_interrupt_handler_t PE_interrupt_handler; void -PE_incoming_interrupt(int interrupt, void *state) +PE_incoming_interrupt(x86_saved_state_t *state) { i386_interrupt_handler_t *vector; + uint64_t rip; + int interrupt; + boolean_t user_mode = FALSE; + + if (is_saved_state64(state) == TRUE) { + x86_saved_state64_t *state64; + + state64 = saved_state64(state); + rip = state64->isf.rip; + interrupt = state64->isf.trapno; + user_mode = TRUE; + } else { + x86_saved_state32_t *state32; + + state32 = saved_state32(state); + if (state32->cs & 0x03) + user_mode = TRUE; + rip = state32->eip; + interrupt = state32->trapno; + } - KERNEL_DEBUG_CONSTANT(MACHDBG_CODE(DBG_MACH_EXCP_INTR, 0) | DBG_FUNC_START, - 0, ((unsigned int *)state)[7], 0, 0, 0); + KERNEL_DEBUG_CONSTANT( + MACHDBG_CODE(DBG_MACH_EXCP_INTR, 0) | DBG_FUNC_START, + interrupt, (unsigned int)rip, user_mode, 0, 0); vector = &PE_interrupt_handler; if (!lapic_interrupt(interrupt, state)) { - vector->handler(vector->target, state, vector->nub, interrupt); + vector->handler(vector->target, NULL, vector->nub, interrupt); } - KERNEL_DEBUG_CONSTANT(MACHDBG_CODE(DBG_MACH_EXCP_INTR, 0) | DBG_FUNC_END, - 0, 0, 0, 0, 0); + KERNEL_DEBUG_CONSTANT( + MACHDBG_CODE(DBG_MACH_EXCP_INTR, 0) | DBG_FUNC_END, + 0, 0, 0, 0, 0); } void PE_install_interrupt_handler(void *nub,