diff --git a/src/platform/acpi/root.zig b/src/platform/acpi/root.zig index 14e7956..6f2f538 100644 --- a/src/platform/acpi/root.zig +++ b/src/platform/acpi/root.zig @@ -337,21 +337,21 @@ pub fn init(boot_info: *pl.BootInfo) linksection(b.init) void { enumerate_tables(); - const fadt = find_table(fadt_signature); - - if (fadt) |f| { - const fadt_struct: *Fadt = @ptrCast(f); - timer.init(fadt_struct); - } - + // Try getting the HPET first so we don't initialize + // the legacy timer if we have a better option. const hpet_t = find_table(hpet_signature); if (hpet_t) |h| { const hpet_struct: *HpetTable = @ptrCast(h); hpet.init(hpet_struct); } - const madt_t = find_table(madt_signature); + const fadt = find_table(fadt_signature); + if (fadt) |f| { + const fadt_struct: *Fadt = @ptrCast(f); + timer.init(fadt_struct); + } + const madt_t = find_table(madt_signature); if (madt_t) |m| { madt.madt_ptr = @ptrCast(m); } diff --git a/src/platform/acpi/timer.zig b/src/platform/acpi/timer.zig index 1ea0bbd..089ceee 100644 --- a/src/platform/acpi/timer.zig +++ b/src/platform/acpi/timer.zig @@ -37,6 +37,10 @@ pub fn init(fadt: *acpi.Fadt) linksection(b.init) void { timer_gas = fadt.x_pm_tmr_blk; } + if (timer_gas.access_size == 0) { + timer_gas.access_size = 3; + } + // Indicates whether the timer is 32-bit if (fadt.flags & (1 << 8) != 0) { pm_timer.mask = std.math.maxInt(u32);