Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 24854
b: refs/heads/master
c: 1a75a3f
h: refs/heads/master
v: v3
  • Loading branch information
Vivek Goyal authored and Linus Torvalds committed Mar 31, 2006
1 parent 4d2509b commit e2bdb9f
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3ccfb81e871b45e4af6ebb3282f3cfa0f98f1b80
refs/heads/master: 1a75a3f0680d9c4bc4761512658b6fd664032e18
20 changes: 20 additions & 0 deletions trunk/arch/i386/kernel/apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,7 @@ void __init init_bsp_APIC(void)
void __devinit setup_local_APIC(void)
{
unsigned long oldvalue, value, ver, maxlvt;
int i, j;

/* Pound the ESR really hard over the head with a big hammer - mbligh */
if (esr_disable) {
Expand Down Expand Up @@ -451,6 +452,25 @@ void __devinit setup_local_APIC(void)
value &= ~APIC_TPRI_MASK;
apic_write_around(APIC_TASKPRI, value);

/*
* After a crash, we no longer service the interrupts and a pending
* interrupt from previous kernel might still have ISR bit set.
*
* Most probably by now CPU has serviced that pending interrupt and
* it might not have done the ack_APIC_irq() because it thought,
* interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it
* does not clear the ISR bit and cpu thinks it has already serivced
* the interrupt. Hence a vector might get locked. It was noticed
* for timer irq (vector 0x31). Issue an extra EOI to clear ISR.
*/
for (i = APIC_ISR_NR - 1; i >= 0; i--) {
value = apic_read(APIC_ISR + i*0x10);
for (j = 31; j >= 0; j--) {
if (value & (1<<j))
ack_APIC_irq();
}
}

/*
* Now that we are all set up, enable the APIC
*/
Expand Down
1 change: 1 addition & 0 deletions trunk/include/asm-i386/apicdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#define APIC_SPIV_FOCUS_DISABLED (1<<9)
#define APIC_SPIV_APIC_ENABLED (1<<8)
#define APIC_ISR 0x100
#define APIC_ISR_NR 0x8 /* Number of 32 bit ISR registers. */
#define APIC_TMR 0x180
#define APIC_IRR 0x200
#define APIC_ESR 0x280
Expand Down

0 comments on commit e2bdb9f

Please sign in to comment.