Commit 2b398bd9 authored by Youquan Song's avatar Youquan Song Committed by Ingo Molnar

x86, apic: Print verbose error interrupt reason on apic=debug

End users worry about the error interrupt printout we generate
currently:

	pr_debug("APIC error on CPU%d: %02x(%02x)\n",
	smp_processor_id(), v , v1);

... and would like to know the reason why error interrupts are generated.

This patch prints out more detailed debug information.

Another practical problem is that dynamic debug is not initialized yet
when the APIC initializes, so the pr_debug() will not output the error
interrupt debug information on bootup. In this patch, we use
apic_printk(APIC_DEBUG, ...), so the apic=debug boot option will print
verbose error interupts during bootup.
Signed-off-by: default avatarYouquan Song <youquan.song@intel.com>
Cc: Joe Perches <joe@perches.com>
Cc: hpa@linux.intel.com
Cc: suresh.b.siddha@intel.com
Cc: yong.y.wang@linux.intel.com
Cc: jbaron@redhat.com
Cc: trenn@suse.de
Cc: kent.liu@intel.com
Cc: chaohong.guo@intel.com
Link: http://lkml.kernel.org/r/1302762968-24380-2-git-send-email-youquan.song@intel.comSigned-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent f0e615c3
...@@ -1812,30 +1812,41 @@ void smp_spurious_interrupt(struct pt_regs *regs) ...@@ -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);
/* apic_printk(APIC_DEBUG, KERN_DEBUG "APIC error on CPU%d: %02x(%02x)",
* Here is what the APIC error bits mean: smp_processor_id(), v0 , v1);
* 0: Send CS error
* 1: Receive CS error v1 = v1 & 0xff;
* 2: Send accept error while (v1) {
* 3: Receive accept error if (v1 & 0x1)
* 4: Reserved apic_printk(APIC_DEBUG, KERN_CONT " : %s", error_interrupt_reason[i]);
* 5: Send illegal vector i++;
* 6: Received illegal vector v1 >>= 1;
* 7: Illegal register address };
*/
pr_debug("APIC error on CPU%d: %02x(%02x)\n", apic_printk(APIC_DEBUG, KERN_CONT "\n");
smp_processor_id(), v , v1);
irq_exit(); irq_exit();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment