This allows us to init the lapic without
necessarily turning on the IOAPIC interrupts.
---
i386/i386/apic.c | 15 +++++++++++++--
i386/i386/apic.h | 2 ++
i386/i386/mp_desc.c | 6 +++---
i386/i386at/ioapic.c | 1 +
4 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/i386/i386/apic.c b/i386/i386/apic.c
index 700fafd3..feb49c85 100644
--- a/i386/i386/apic.c
+++ b/i386/i386/apic.c
@@ -308,6 +308,18 @@ void apic_send_ipi(unsigned dest_shorthand, unsigned
deliv_mode, unsigned dest_m
void
lapic_enable(void)
+{
+ lapic->spurious_vector.r |= LAPIC_ENABLE;
+}
+
+void
+lapic_disable(void)
+{
+ lapic->spurious_vector.r &= ~LAPIC_ENABLE;
+}
+
+void
+lapic_setup(void)
{
unsigned long flags;
int apic_id;
@@ -338,8 +350,7 @@ lapic_enable(void)
/* Enable LAPIC to send or recieve IPI/SIPIs */
dummy = lapic->spurious_vector.r;
lapic->spurious_vector.r = IOAPIC_SPURIOUS_BASE
- | LAPIC_ENABLE_DIRECTED_EOI
- | LAPIC_ENABLE;
+ | LAPIC_ENABLE_DIRECTED_EOI;
lapic->error_status.r = 0;
diff --git a/i386/i386/apic.h b/i386/i386/apic.h
index e1d49895..29387d9d 100644
--- a/i386/i386/apic.h
+++ b/i386/i386/apic.h
@@ -244,6 +244,8 @@ int apic_get_total_gsis(void);
void picdisable(void);
void lapic_eoi(void);
void ioapic_irq_eoi(int pin);
+void lapic_setup(void);
+void lapic_disable(void);
void lapic_enable(void);
void lapic_enable_timer(void);
void calibrate_lapic_timer(void);
diff --git a/i386/i386/mp_desc.c b/i386/i386/mp_desc.c
index 467f2728..860bbd9e 100644
--- a/i386/i386/mp_desc.c
+++ b/i386/i386/mp_desc.c
@@ -269,6 +269,7 @@ cpu_setup(int cpu)
machine_slot[cpu].cpu_type = machine_slot[0].cpu_type;
init_fpu();
+ lapic_setup();
lapic_enable();
cpu_launch_first_thread(THREAD_NULL);
}
@@ -312,12 +313,10 @@ start_other_cpus(void)
memcpy((void*)phystokv(AP_BOOT_ADDR), (void*) &apboot,
(uint32_t)&apbootend - (uint32_t)&apboot);
-#ifndef APIC
- lapic_enable(); /* Enable lapic only once */
-#endif
unsigned cpu;
splhigh();
+ lapic_disable();
bspdone = 0;
for (cpu = 1; cpu < ncpus; cpu++) {
@@ -335,5 +334,6 @@ start_other_cpus(void)
__sync_synchronize();
}
printf("BSP: Completed SMP init\n");
+ lapic_enable();
}
#endif /* NCPUS > 1 */
diff --git a/i386/i386at/ioapic.c b/i386/i386at/ioapic.c
index 270362c3..2553a2c9 100644
--- a/i386/i386at/ioapic.c
+++ b/i386/i386at/ioapic.c
@@ -458,5 +458,6 @@ ioapic_configure(void)
}
/* Start the IO APIC receiving interrupts */
+ lapic_setup();
lapic_enable();
}
--
2.43.0