summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/x86/x86/local_apic.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/x86/x86/local_apic.c b/sys/x86/x86/local_apic.c
index aecad4cbd463..053d9814c14c 100644
--- a/sys/x86/x86/local_apic.c
+++ b/sys/x86/x86/local_apic.c
@@ -428,6 +428,7 @@ lapic_is_x2apic(void)
(APICBASE_X2APIC | APICBASE_ENABLED));
}
+static void lapic_early_mask_vecs(void);
static void lapic_enable(void);
static void lapic_resume(struct pic *pic, bool suspend_cancelled);
static void lapic_timer_oneshot(struct lapic *);
@@ -553,6 +554,7 @@ lapic_init(vm_paddr_t addr)
/* Perform basic initialization of the BSP's local APIC. */
lapic_enable();
+ lapic_early_mask_vecs();
/* Set BSP's per-CPU local APIC ID. */
PCPU_SET(apic_id, lapic_id());
@@ -791,6 +793,32 @@ lapic_xapic_mode(void)
intr_restore(saveintr);
}
+static void
+lapic_early_mask_vec(const struct lvt *l)
+{
+ uint32_t v;
+
+ if (l->lvt_masked != 0) {
+ v = lapic_read32(l->lvt_reg);
+ v |= APIC_LVT_M;
+ lapic_write32(l->lvt_reg, v);
+ }
+}
+
+/* Done on BSP only */
+static void
+lapic_early_mask_vecs(void)
+{
+ int elvt_count, i;
+
+ for (i = 0; i < APIC_LVT_MAX; i++)
+ lapic_early_mask_vec(&lvts[i]);
+
+ elvt_count = amd_read_elvt_count();
+ for (i = 0; i < elvt_count; i++)
+ lapic_early_mask_vec(&elvts[i]);
+}
+
void
lapic_setup(int boot)
{