From d0452a35103d14fa0e2b74e2104cb06561e492d3 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Mon, 10 Feb 2025 22:58:57 +0200 Subject: [PATCH] Kernel: Fix xHCI controller destruction Port updater task was not actually able to exit without a kernel panic. This patch makes controller wait until port updater exits itself :D --- kernel/include/kernel/USB/XHCI/Controller.h | 3 ++- kernel/kernel/USB/XHCI/Controller.cpp | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/kernel/include/kernel/USB/XHCI/Controller.h b/kernel/include/kernel/USB/XHCI/Controller.h index 76861432..1ee724a1 100644 --- a/kernel/include/kernel/USB/XHCI/Controller.h +++ b/kernel/include/kernel/USB/XHCI/Controller.h @@ -73,10 +73,11 @@ namespace Kernel Mutex m_mutex; - Process* m_port_updater { nullptr }; + BAN::Atomic m_port_updater { nullptr }; ThreadBlocker m_port_thread_blocker; BAN::Atomic m_port_changed { false }; + bool m_running { true }; bool m_ports_initialized { false }; PCI::Device& m_pci_device; diff --git a/kernel/kernel/USB/XHCI/Controller.cpp b/kernel/kernel/USB/XHCI/Controller.cpp index cea3c61e..e9ceb40e 100644 --- a/kernel/kernel/USB/XHCI/Controller.cpp +++ b/kernel/kernel/USB/XHCI/Controller.cpp @@ -16,8 +16,9 @@ namespace Kernel XHCIController::~XHCIController() { - if (m_port_updater) - m_port_updater->exit(0, SIGKILL); + m_running = false; + while (m_port_updater) + Processor::yield(); for (auto paddr : m_scratchpad_buffers) if (paddr) @@ -308,7 +309,7 @@ namespace Kernel uint64_t last_port_update = SystemTimer::get().ms_since_boot(); - while (true) + while (m_running) { { bool expected { true }; @@ -389,6 +390,8 @@ namespace Kernel } } } + + m_port_updater = nullptr; } BAN::ErrorOr XHCIController::initialize_device(uint32_t route_string, uint8_t depth, USB::SpeedClass speed_class, XHCIDevice* parent_hub, uint8_t parent_port_id)