Skip to content

LAPIC

include/acpi/lapic.h View source View on GitHub
uint32_t lapic_reg_to_x2apic_msr(uint32_t reg)
source
void lapic_write(uint32_t reg, uint32_t val)
source
uint32_t lapic_read(uint32_t reg)
source
void lapic_init(void)
source
void x2apic_init(void)
source
uint64_t lapic_get_id(void)
source
uint32_t x2apic_get_id(void)
source
uint32_t lapic_this_id(void)
source
uint8_t lapic_dest_8bit(uint32_t apic_id)
source

IOAPIC entries and MSI addresses have 8 destination bits, larger ones need x2apic

struct irq_chip * lapic_get_chip(void)
source
void lapic_icr_write(uint32_t dest, uint32_t lo)
source
bool lapic_icr_try_write(uint32_t dest, uint32_t lo)
source

Same as above, just the try version

uint32_t lapic_icr_nmi_save(void)
source

NMIs happening between IPI sends can retarget the IPI

void lapic_icr_nmi_restore(uint32_t high)
source
extern uint32_t cc_mem_io *lapic
source
extern bool x2apic_enabled
source
#define IA32_APIC_BASE 0x1B
source
#define IA32_APIC_BASE_MSR 0x1B
source
#define IA32_APIC_BASE_MASK 0xFFFFF000UL
source
#define IA32_APIC_BASE_ENABLE BIT(11)
source
#define APIC_X2APIC_ENABLE BIT(10)
source
#define LAPIC_REG_ID 0x020
source
#define LAPIC_REG_EOI 0x0B0
source
#define LAPIC_REG_SVR 0x0F0
source
#define LAPIC_REG_LVT_TIMER 0x320
source
#define LAPIC_REG_TIMER_INIT 0x380
source
#define LAPIC_REG_TIMER_CUR 0x390
source
#define LAPIC_REG_TIMER_DIV 0x3E0
source
#define LAPIC_LVT_MASK BIT(16)
source
#define LAPIC_ENABLE 0x100
source
#define LAPIC_SPURIOUS_REGISTER 0xF0
source
#define TIMER_MODE_PERIODIC BIT(17)
source
#define TIMER_MODE_ONESHOT (0 << 17)
source
#define LAPIC_ICR_LOW 0x300
source
#define LAPIC_ICR_HIGH 0x310
source
#define LAPIC_DELIVERY_FIXED (0x0 << 8)
source
#define LAPIC_DELIVERY_LOWEST (0x1 << 8)
source
#define LAPIC_DELIVERY_SMI (0x2 << 8)
source
#define LAPIC_DELIVERY_NMI (0x4 << 8)
source
#define LAPIC_DELIVERY_INIT (0x5 << 8)
source
#define LAPIC_DELIVERY_STARTUP (0x6 << 8)
source
#define LAPIC_LEVEL_ASSERT BIT(14)
source
#define LAPIC_TRIGGER_EDGE (0 << 15)
source
#define LAPIC_TRIGGER_LEVEL BIT(15)
source
#define LAPIC_IPI_IN_FLIGHT BIT(12)
source
#define LAPIC_DEST_PHYSICAL (0 << 11)
source
#define LAPIC_DEST_LOGICAL BIT(11)
source
#define LAPIC_DEST_SHORTHAND_NONE (0x0 << 18)
source
#define LAPIC_DEST_SHORTHAND_SELF (0x1 << 18)
source
#define LAPIC_DEST_SHORTHAND_ALL (0x2 << 18)
source
#define LAPIC_DEST_SHORTHAND_OTHERS (0x3 << 18)
source
#define LAPIC_DEST_SHIFT 24
source
#define X2APIC_CLUSTER_SHIFT 4
source

LDR is read-only and derived from the ID. Cluster (ID[19:4]) in bits 31:16, one-hot ID[3:0] in bits 15:0

#define X2APIC_CLUSTER_SIZE BIT(X2APIC_CLUSTER_SHIFT)
source
#define X2APIC_CLUSTER_ID_MASK 0xFFFF
source
#define X2APIC_LDR_CLUSTER_SHIFT 16
source
#define IA32_X2APIC_BASE 0x800
source
#define IA32_X2APIC_ID (IA32_X2APIC_BASE + 0x02)
source
#define IA32_X2APIC_EOI (IA32_X2APIC_BASE + 0x0B)
source
#define IA32_X2APIC_SVR (IA32_X2APIC_BASE + 0x0F)
source
#define IA32_X2APIC_ICR (IA32_X2APIC_BASE + 0x30)
source
#define IA32_X2APIC_LVT_TIMER (IA32_X2APIC_BASE + 0x32)
source
#define IA32_X2APIC_TIMER_INIT (IA32_X2APIC_BASE + 0x38)
source
#define IA32_X2APIC_TIMER_CUR (IA32_X2APIC_BASE + 0x39)
source
#define IA32_X2APIC_TIMER_DIV (IA32_X2APIC_BASE + 0x3E)
source