|
@@ -1812,30 +1812,41 @@ void smp_spurious_interrupt(struct pt_regs *regs)
|
|
*/
|
|
*/
|
|
void smp_error_interrupt(struct pt_regs *regs)
|
|
void smp_error_interrupt(struct pt_regs *regs)
|
|
{
|
|
{
|
|
- u32 v, v1;
|
|
|
|
|
|
+ u32 v0, v1;
|
|
|
|
+ u32 i = 0;
|
|
|
|
+ static const char * const error_interrupt_reason[] = {
|
|
|
|
+ "Send CS error", /* APIC Error Bit 0 */
|
|
|
|
+ "Receive CS error", /* APIC Error Bit 1 */
|
|
|
|
+ "Send accept error", /* APIC Error Bit 2 */
|
|
|
|
+ "Receive accept error", /* APIC Error Bit 3 */
|
|
|
|
+ "Redirectable IPI", /* APIC Error Bit 4 */
|
|
|
|
+ "Send illegal vector", /* APIC Error Bit 5 */
|
|
|
|
+ "Received illegal vector", /* APIC Error Bit 6 */
|
|
|
|
+ "Illegal register address", /* APIC Error Bit 7 */
|
|
|
|
+ };
|
|
|
|
|
|
exit_idle();
|
|
exit_idle();
|
|
irq_enter();
|
|
irq_enter();
|
|
/* First tickle the hardware, only then report what went on. -- REW */
|
|
/* First tickle the hardware, only then report what went on. -- REW */
|
|
- v = apic_read(APIC_ESR);
|
|
|
|
|
|
+ v0 = apic_read(APIC_ESR);
|
|
apic_write(APIC_ESR, 0);
|
|
apic_write(APIC_ESR, 0);
|
|
v1 = apic_read(APIC_ESR);
|
|
v1 = apic_read(APIC_ESR);
|
|
ack_APIC_irq();
|
|
ack_APIC_irq();
|
|
atomic_inc(&irq_err_count);
|
|
atomic_inc(&irq_err_count);
|
|
|
|
|
|
- /*
|
|
|
|
- * Here is what the APIC error bits mean:
|
|
|
|
- * 0: Send CS error
|
|
|
|
- * 1: Receive CS error
|
|
|
|
- * 2: Send accept error
|
|
|
|
- * 3: Receive accept error
|
|
|
|
- * 4: Reserved
|
|
|
|
- * 5: Send illegal vector
|
|
|
|
- * 6: Received illegal vector
|
|
|
|
- * 7: Illegal register address
|
|
|
|
- */
|
|
|
|
- pr_debug("APIC error on CPU%d: %02x(%02x)\n",
|
|
|
|
- smp_processor_id(), v , v1);
|
|
|
|
|
|
+ apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)",
|
|
|
|
+ smp_processor_id(), v0 , v1);
|
|
|
|
+
|
|
|
|
+ v1 = v1 & 0xff;
|
|
|
|
+ while (v1) {
|
|
|
|
+ if (v1 & 0x1)
|
|
|
|
+ apic_printk(APIC_DEBUG, KERN_CONT " : %s", error_interrupt_reason[i]);
|
|
|
|
+ i++;
|
|
|
|
+ v1 >>= 1;
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ apic_printk(APIC_DEBUG, KERN_CONT "\n");
|
|
|
|
+
|
|
irq_exit();
|
|
irq_exit();
|
|
}
|
|
}
|
|
|
|
|