X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..c0fea4742e91338fffdcf79f86a7c1d5e2b97eb1:/pexpert/i386/pe_interrupt.c diff --git a/pexpert/i386/pe_interrupt.c b/pexpert/i386/pe_interrupt.c index 533bf485c..49afab3d5 100644 --- a/pexpert/i386/pe_interrupt.c +++ b/pexpert/i386/pe_interrupt.c @@ -22,6 +22,12 @@ #include #include #include +#include +#include + + +void PE_incoming_interrupt(x86_saved_state_t *); + struct i386_interrupt_handler { IOInterruptHandler handler; @@ -34,25 +40,50 @@ typedef struct i386_interrupt_handler i386_interrupt_handler_t; i386_interrupt_handler_t PE_interrupt_handler; -void PE_platform_interrupt_initialize(void) -{ -} + void -PE_incoming_interrupt(int interrupt, struct i386_saved_state *ssp) +PE_incoming_interrupt(x86_saved_state_t *state) { - boolean_t save_int; - 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, + interrupt, (unsigned int)rip, user_mode, 0, 0); vector = &PE_interrupt_handler; - save_int = ml_set_interrupts_enabled(FALSE); - vector->handler(vector->target, vector->refCon, vector->nub, interrupt); - ml_set_interrupts_enabled(save_int); + if (!lapic_interrupt(interrupt, state)) { + 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); } -void PE_install_interrupt_handler(void *nub, int source, +void PE_install_interrupt_handler(void *nub, + __unused int source, void *target, IOInterruptHandler handler, void *refCon)