diff --git a/kernel/src/Drivers/Init.cpp b/kernel/src/Drivers/Init.cpp index 5151e15..b03cfbb 100644 --- a/kernel/src/Drivers/Init.cpp +++ b/kernel/src/Drivers/Init.cpp @@ -149,13 +149,15 @@ namespace Drivers { ProbeNvme, }, // Order 7: Intel HDA — Normal phase, match vendor=0x8086 + class=0x04 (Multimedia) - // SubClass 0x01 = "Multimedia audio controller" (most Intel HDA) - // SubClass 0x03 = "Audio device" (HDA-compatible) + // SubClass 0x03 = "Audio device" = HD Audio controller. + // SubClass 0x01 = "Multimedia audio controller" = legacy AC'97 + // (e.g. VirtualBox 8086:2415), which is NOT HDA and has an I/O + // BAR, not an MMIO BAR — do NOT match it here. { "IntelHDA", 0x8086, // VendorId (Intel) 0x04, // ClassCode (Multimedia) - 0xFF, // SubClass (any — covers both 0x01 and 0x03) + 0x03, // SubClass (0x03 = HD Audio; excludes AC'97 0x01) 0xFF, // ProgIf (any) nullptr, 0, diff --git a/kernel/src/Pci/Pci.cpp b/kernel/src/Pci/Pci.cpp index 625b80d..6cb116e 100644 --- a/kernel/src/Pci/Pci.cpp +++ b/kernel/src/Pci/Pci.cpp @@ -404,6 +404,14 @@ namespace Pci { uint64_t ReadBar0(uint8_t bus, uint8_t device, uint8_t function) { uint32_t bar0Low = LegacyRead32(bus, device, function, (uint8_t)PCI_REG_BAR0); + + // Bit 0 == 1 means this is an I/O-space BAR, not memory. The low bits of + // an I/O BAR are a port number, not a physical address, and must never be + // fed to MapMMIO (it would panic on the non-page-aligned value). Callers + // treat 0 as "no usable MMIO BAR". (e.g. VirtualBox AC'97 8086:2415.) + if (bar0Low & 0x1) + return 0; + uint64_t addr = bar0Low & 0xFFFFFFF0u; // Check for 64-bit BAR (type field bits 2:1 == 0b10)