函数源码 |
Source File:arch\x86\kernel\apic\apic.c |
Create Date:2022-07-27 09:26:59 |
首页 | Copyright©Brick |
2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 | /* * Local APIC interrupts */ /* * This interrupt should _never_ happen with our APIC/SMP architecture */ __visible void __irq_entry smp_spurious_interrupt( struct pt_regs *regs) { u8 vector = ~regs->orig_ax; u32 v; entering_irq(); trace_spurious_apic_entry(vector); inc_irq_stat(irq_spurious_count); /* * If this is a spurious interrupt then do not acknowledge */ if (vector == SPURIOUS_APIC_VECTOR) { /* See SDM vol 3 */ pr_info( "Spurious APIC interrupt (vector 0xFF) on CPU#%d, should never happen.\n" , smp_processor_id()); goto out; } /* * If it is a vectored one, verify it's set in the ISR. If set, * acknowledge it. */ v = apic_read(APIC_ISR + ((vector & ~0x1f) >> 1)); if (v & (1 << (vector & 0x1f))) { pr_info( "Spurious interrupt (vector 0x%02x) on CPU#%d. Acked\n" , vector, smp_processor_id()); ack_APIC_irq(); } else { pr_info( "Spurious interrupt (vector 0x%02x) on CPU#%d. Not pending!\n" , vector, smp_processor_id()); } out: trace_spurious_apic_exit(vector); exiting_irq(); } |