x86: Fixes bug in pml callbacks
[akaros.git] / kern / arch / x86 / apic.h
index 9bd89fb..c7473a3 100644 (file)
@@ -86,9 +86,9 @@
 #define LAPIC_IRR                                      (LAPIC_BASE + 0x200)
 
 // PIT (Programmable Interval Timer)
-#define        TIMER_REG_CNTR0 0       /* timer 0 counter port */
-#define        TIMER_REG_CNTR1 1       /* timer 1 counter port */
-#define        TIMER_REG_CNTR2 2       /* timer 2 counter port */
+#define        TIMER_REG_CNTR0 0       /* timer counter 0 port */
+#define        TIMER_REG_CNTR1 1       /* timer counter 1 port */
+#define        TIMER_REG_CNTR2 2       /* timer counter 2 port */
 #define        TIMER_REG_MODE  3       /* timer mode port */
 #define        TIMER_SEL0      0x00    /* select counter 0 */
 #define        TIMER_SEL1      0x40    /* select counter 1 */
@@ -123,12 +123,28 @@ typedef struct system_timing {
 
 extern system_timing_t system_timing;
 
+/* Tracks whether it is safe to execute core_id() or not.  If we're using the
+ * LAPIC, we need to have the LAPIC mapped into VM.  vm_init() sets this to
+ * TRUE.
+ *
+ * If we're using rdtscp, if the instruction is supported, we can call core_id()
+ * without rebooting.  cpuinfo should have panic'd if we're running on a machine
+ * that doesn't support rdtscp, before vm_init().
+ *
+ * If we're using something else (like segmentation), then that will need to get
+ * set up before vm_init(), at least for core 0.
+ *
+ * Note that core_id() will return 0 (or possibly another wrong answer) on cores
+ * other than core 0 when it is called before smp_boot completes. */
+extern bool core_id_ready;
+
 void pic_remap(void);
 void pic_mask_irq(uint8_t irq);
 void pic_unmask_irq(uint8_t irq);
 uint16_t pic_get_mask(void);
 uint16_t pic_get_irr(void);
 uint16_t pic_get_isr(void);
+void pic_send_eoi(uint32_t irq);
 bool lapic_get_isr_bit(uint8_t vector);
 bool lapic_get_irr_bit(uint8_t vector);
 void lapic_print_isr(void);
@@ -144,7 +160,6 @@ void udelay_pit(uint64_t usec);
 uint64_t gettimer(void);
 uint64_t getfreq(void);
 
-static inline void pic_send_eoi(uint32_t irq);
 static inline void lapic_send_eoi(void);
 static inline uint32_t lapic_get_version(void);
 static inline uint32_t lapic_get_error(void);
@@ -170,14 +185,6 @@ static inline void __send_nmi(uint8_t hw_coreid);
 #define unmask_lapic_lvt(entry) \
        write_mmreg32(entry, read_mmreg32(entry) & ~LAPIC_LVT_MASK)
 
-static inline void pic_send_eoi(uint32_t irq)
-{
-       // all irqs beyond the first seven need to be chained to the slave
-       if (irq > 7)
-               outb(PIC2_CMD, PIC_EOI);
-       outb(PIC1_CMD, PIC_EOI);
-}
-
 static inline void lapic_send_eoi(void)
 {
        write_mmreg32(LAPIC_EOI, 0);