From f166cb09ecf554eeae20c16e19ef640303a28397 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 14 Nov 2025 19:54:58 +0200 Subject: [PATCH] Kernel: Fail xHCI initialization if page size != 4096 Also zero out scratchapd buffers as the spec says --- kernel/kernel/USB/XHCI/Controller.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/kernel/kernel/USB/XHCI/Controller.cpp b/kernel/kernel/USB/XHCI/Controller.cpp index 2efc9cc5..a2f82813 100644 --- a/kernel/kernel/USB/XHCI/Controller.cpp +++ b/kernel/kernel/USB/XHCI/Controller.cpp @@ -113,6 +113,18 @@ namespace Kernel auto& operational = operational_regs(); + if (auto page_size_bits = operational.pagesize & 0xFFFF; page_size_bits != 1) + { + dwarnln("XHCI does not support 4096 byte pages"); + dwarnln(" supported page sizes:"); + for (size_t i = 0; i < 16; i++) + if (page_size_bits & (1 << i)) + dwarnln(" {} bytes", 1 << (12 + i)); + if (__builtin_popcount(page_size_bits) != 1) + dwarnln(" ... XHCI spec only allows a single supported page size???"); + return BAN::Error::from_errno(ENOTSUP); + } + // allocate and program dcbaa m_dcbaa_region = TRY(DMARegion::create(capabilities.hcsparams1.max_slots * 8)); memset(reinterpret_cast(m_dcbaa_region->vaddr()), 0, m_dcbaa_region->size()); @@ -289,6 +301,9 @@ namespace Kernel const paddr_t paddr = Heap::get().take_free_page(); if (paddr == 0) return BAN::Error::from_errno(ENOMEM); + PageTable::with_fast_page(paddr, [] { + memset(PageTable::fast_page_as_ptr(), 0, PAGE_SIZE); + }); m_scratchpad_buffers[i] = paddr; scratchpad_buffer_array[i] = paddr; }