diff --git a/src/hulk/apic.d b/src/hulk/apic.d new file mode 100644 index 0000000..213e89e --- /dev/null +++ b/src/hulk/apic.d @@ -0,0 +1,22 @@ +/** + * APIC (Advanced Programmable Interrupt Controller) functionality. + */ +module hulk.apic; + +import hulk.klog; +import hulk.hurl; +import hulk.acpi; + +struct apic +{ + public enum uint * local_apic_registers = cast(uint *)0xFEE0_0000u; + + public static void initialize() + { + Hurl.map(cast(ulong)local_apic_registers, + cast(ulong)local_apic_registers, + MAP_WRITABLE | MAP_WRITE_THROUGH | MAP_DISABLE_CACHE | MAP_NO_EXECUTE); + klog.writefln("LAPIC ID: 0x%08x", local_apic_registers[0x20/4]); + klog.writefln("LAPIC version: 0x%08x", local_apic_registers[0x30/4]); + } +} diff --git a/src/hulk/hulk.d b/src/hulk/hulk.d index 673f0fa..fcd0dbb 100644 --- a/src/hulk/hulk.d +++ b/src/hulk/hulk.d @@ -19,6 +19,7 @@ import hos.cpu; import ldc.llvmasm; import hulk.pic; import hulk.acpi; +import hulk.apic; extern extern(C) __gshared ubyte _hulk_total_size; @@ -52,6 +53,7 @@ void hulk_start() pci.initialize(); pic.initialize(); acpi.initialize(hulk_header.bootinfo.acpi_xsdt_phys); + apic.initialize(); sti(); for (;;)