void VISIBLE NORETURN c_handle_interrupt(int irq, int syscall) { /* Only grab the lock if we are not handeling 'int_remote_call_ipi' interrupt * also flag this lock as IRQ lock if handling the irq interrupts. */ NODE_LOCK_IF(irq != int_remote_call_ipi, irq >= int_irq_min && irq <= int_irq_max); c_entry_hook(); if (irq == int_unimpl_dev) { handleFPUFault(); #ifdef TRACK_KERNEL_ENTRIES ksKernelEntry.path = Entry_UnimplementedDevice; ksKernelEntry.word = irq; #endif } else if (irq == int_page_fault) { /* Error code is in Error. Pull out bit 5, which is whether it was instruction or data */ vm_fault_type_t type = (NODE_STATE(ksCurThread)->tcbArch.tcbContext.registers[Error] >> 4u) & 1u; #ifdef TRACK_KERNEL_ENTRIES ksKernelEntry.path = Entry_VMFault; ksKernelEntry.word = type; #endif handleVMFaultEvent(type); #ifdef CONFIG_HARDWARE_DEBUG_API } else if (irq == int_debug || irq == int_software_break_request) {
void VISIBLE NORETURN c_handle_interrupt(int irq, int syscall) { /* need to run this first as the NODE_LOCK code might end up as a function call * with a return, and we need to make sure returns are not exploitable yet * on x64 this code ran already */ if (config_set(CONFIG_ARCH_IA32) && config_set(CONFIG_KERNEL_X86_IBRS_BASIC)) { x86_enable_ibrs(); } /* Only grab the lock if we are not handeling 'int_remote_call_ipi' interrupt * also flag this lock as IRQ lock if handling the irq interrupts. */ NODE_LOCK_IF(irq != int_remote_call_ipi, irq >= int_irq_min && irq <= int_irq_max); c_entry_hook(); if (irq == int_unimpl_dev) { handleFPUFault(); #ifdef TRACK_KERNEL_ENTRIES ksKernelEntry.path = Entry_UnimplementedDevice; ksKernelEntry.word = irq; #endif } else if (irq == int_page_fault) { /* Error code is in Error. Pull out bit 5, which is whether it was instruction or data */ vm_fault_type_t type = (NODE_STATE(ksCurThread)->tcbArch.tcbContext.registers[Error] >> 4u) & 1u; #ifdef TRACK_KERNEL_ENTRIES ksKernelEntry.path = Entry_VMFault; ksKernelEntry.word = type; #endif handleVMFaultEvent(type); #ifdef CONFIG_HARDWARE_DEBUG_API } else if (irq == int_debug || irq == int_software_break_request) {