From 2b4cab284c1231822a361a3141805a0951c743d3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 25 Jun 2021 15:49:33 +0200 Subject: [PATCH] Kernel/AHCI: Dont assume ports start at 0 This fixes a bug that occurs when the controller's ports are not (internally) numbered sequentially. This is done by checking the bits set in PI. This bug was found on bare-metal, on a laptop with 1 Port that was reported as port 4. --- Kernel/Storage/AHCIController.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Kernel/Storage/AHCIController.cpp b/Kernel/Storage/AHCIController.cpp index 4a2044f556..ab86447ae3 100644 --- a/Kernel/Storage/AHCIController.cpp +++ b/Kernel/Storage/AHCIController.cpp @@ -181,12 +181,18 @@ RefPtr AHCIController::device_by_port(u32 port_index) const RefPtr AHCIController::device(u32 index) const { NonnullRefPtrVector connected_devices; - for (size_t index = 0; index < capabilities().ports_count; index++) { - auto checked_device = device_by_port(index); + u32 pi = hba().control_regs.pi; + u32 bit = __builtin_ffsl(pi); + while (bit) { + dbgln_if(AHCI_DEBUG, "Checking implemented port {}, pi {:b}", bit - 1, pi); + pi &= ~(1u << (bit - 1)); + auto checked_device = device_by_port(bit - 1); + bit = __builtin_ffsl(pi); if (checked_device.is_null()) continue; connected_devices.append(checked_device.release_nonnull()); } + dbgln_if(AHCI_DEBUG, "Connected device count: {}, Index: {}", connected_devices.size(), index); if (index >= connected_devices.size()) return nullptr; return connected_devices[index];