- Implemented the interrupt handling for smp machines.

- Enabled interrupts (irqs) on all processors.

svn path=/trunk/; revision=12691
This commit is contained in:
Hartmut Birr 2005-01-01 11:31:43 +00:00
parent 1dc7aa3d70
commit 576224deec
2 changed files with 20 additions and 21 deletions

View file

@ -375,6 +375,8 @@ HalEnableSystemInterrupt (ULONG Vector,
return FALSE; return FALSE;
} }
/* FIXME: We must check if the requested and the assigned interrupt mode is the same */
irq = VECTOR2IRQ (Vector); irq = VECTOR2IRQ (Vector);
IOAPICUnmaskIrq (irq); IOAPICUnmaskIrq (irq);

View file

@ -1,4 +1,4 @@
/* $Id: processor_mp.c,v 1.2 2004/12/25 11:21:48 navaraf Exp $ /* $Id$
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -186,10 +186,15 @@ VOID IOAPICMaskIrq(ULONG Irq)
IOAPIC_ROUTE_ENTRY Entry; IOAPIC_ROUTE_ENTRY Entry;
ULONG Apic = IrqApicMap[Irq]; ULONG Apic = IrqApicMap[Irq];
*(((PULONG)&Entry)+0) = IOAPICRead(Apic, IOAPIC_REDTBL+2*Irq);
*((PULONG)&Entry) = IOAPICRead(Apic, IOAPIC_REDTBL+2*Irq); *(((PULONG)&Entry)+1) = IOAPICRead(Apic, IOAPIC_REDTBL+2*Irq+1);
Entry.mask = 1; Entry.dest.logical.logical_dest &= ~(1 << KeGetCurrentProcessorNumber());
IOAPICWrite(Apic, IOAPIC_REDTBL+2*Irq, *((PULONG)&Entry)); if (Entry.dest.logical.logical_dest == 0)
{
Entry.mask = 1;
}
IOAPICWrite(Apic, IOAPIC_REDTBL+2*Irq+1, *(((PULONG)&Entry)+1));
IOAPICWrite(Apic, IOAPIC_REDTBL+2*Irq, *(((PULONG)&Entry)+0));
} }
@ -199,9 +204,12 @@ VOID IOAPICUnmaskIrq(ULONG Irq)
IOAPIC_ROUTE_ENTRY Entry; IOAPIC_ROUTE_ENTRY Entry;
ULONG Apic = IrqApicMap[Irq]; ULONG Apic = IrqApicMap[Irq];
*((PULONG)&Entry) = IOAPICRead(Apic, IOAPIC_REDTBL+2*IrqPinMap[Irq]); *(((PULONG)&Entry)+0) = IOAPICRead(Apic, IOAPIC_REDTBL+2*Irq);
*(((PULONG)&Entry)+1) = IOAPICRead(Apic, IOAPIC_REDTBL+2*Irq+1);
Entry.dest.logical.logical_dest |= 1 << KeGetCurrentProcessorNumber();
Entry.mask = 0; Entry.mask = 0;
IOAPICWrite(Apic, IOAPIC_REDTBL+2*IrqPinMap[Irq], *((PULONG)&Entry)); IOAPICWrite(Apic, IOAPIC_REDTBL+2*Irq+1, *(((PULONG)&Entry)+1));
IOAPICWrite(Apic, IOAPIC_REDTBL+2*Irq, *(((PULONG)&Entry)+0));
} }
static VOID static VOID
@ -619,15 +627,8 @@ VOID IOAPICSetupIrqs(VOID)
entry.delivery_mode = (APIC_DM_LOWEST >> 8); entry.delivery_mode = (APIC_DM_LOWEST >> 8);
entry.dest_mode = 1; /* logical delivery */ entry.dest_mode = 1; /* logical delivery */
entry.mask = 1; /* disable IRQ */ entry.mask = 1; /* disable IRQ */
#if 0 entry.dest.logical.logical_dest = 0;
/*
* FIXME:
* Some drivers are not able to deal with more than one cpu.
*/
entry.dest.logical.logical_dest = OnlineCPUs;
#else
entry.dest.logical.logical_dest = 1 << 0;
#endif
idx = IOAPICGetIrqEntry(apic,pin,INT_VECTORED); idx = IOAPICGetIrqEntry(apic,pin,INT_VECTORED);
if (idx == -1) if (idx == -1)
{ {
@ -650,11 +651,7 @@ VOID IOAPICSetupIrqs(VOID)
{ {
entry.trigger = 1; entry.trigger = 1;
entry.mask = 1; // disable entry.mask = 1; // disable
#if 0 entry.dest.logical.logical_dest = 0;
entry.dest.logical.logical_dest = OnlineCPUs;
#else
entry.dest.logical.logical_dest = 1 << 0;
#endif
} }
irq = Pin2Irq(idx, apic, pin); irq = Pin2Irq(idx, apic, pin);