1 #include <arch/x86/interrupts.h>
2 #include <hal/acpi/acpi.h>
3 #include <hal/ioapic.h>
4 #include <lunaix/common.h>
5 #include <lunaix/mm/mmio.h>
7 #define IOAPIC_REG_SEL *((volatile u32_t*)(_ioapic_base + IOAPIC_IOREGSEL))
8 #define IOAPIC_REG_WIN *((volatile u32_t*)(_ioapic_base + IOAPIC_IOWIN))
10 static volatile uintptr_t _ioapic_base;
17 acpi_context* acpi_ctx = acpi_get_context();
19 _ioapic_base = ioremap(acpi_ctx->madt.ioapic->ioapic_addr & ~0xfff, 4096);
23 ioapic_write(uint8_t sel, u32_t val)
30 ioapic_read(uint8_t sel)
33 return IOAPIC_REG_WIN;
37 ioapic_redirect(uint8_t irq, uint8_t vector, uint8_t dest, u32_t flags)
39 uint8_t reg_sel = IOAPIC_IOREDTBL_BASE + irq * 2;
42 ioapic_write(reg_sel, (vector | flags) & 0x1FFFF);
45 ioapic_write(reg_sel + 1, (dest << 24));