1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:27:44 +00:00

Kernel: Don't register USB devices if USBManagement is not initialized

This commit is contained in:
Andrew Kaster 2023-10-16 15:54:57 -06:00 committed by Andrew Kaster
parent 639051d34e
commit 91816c15f8
4 changed files with 16 additions and 9 deletions

View file

@ -20,7 +20,7 @@ USB_DEVICE_DRIVER(MouseDriver);
void MouseDriver::init() void MouseDriver::init()
{ {
auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MouseDriver())); auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MouseDriver()));
USBManagement::the().register_driver(driver); USBManagement::register_driver(driver);
} }
ErrorOr<void> MouseDriver::checkout_interface(USB::Device& device, USBInterface const& interface) ErrorOr<void> MouseDriver::checkout_interface(USB::Device& device, USBInterface const& interface)

View file

@ -24,7 +24,7 @@ USB_DEVICE_DRIVER(MassStorageDriver);
void MassStorageDriver::init() void MassStorageDriver::init()
{ {
auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MassStorageDriver())); auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MassStorageDriver()));
USBManagement::the().register_driver(driver); USBManagement::register_driver(driver);
} }
ErrorOr<void> MassStorageDriver::checkout_interface(USB::Device& device, USBInterface const& interface) ErrorOr<void> MassStorageDriver::checkout_interface(USB::Device& device, USBInterface const& interface)

View file

@ -81,22 +81,29 @@ UNMAP_AFTER_INIT void USBManagement::initialize()
void USBManagement::register_driver(NonnullLockRefPtr<Driver> driver) void USBManagement::register_driver(NonnullLockRefPtr<Driver> driver)
{ {
if (!initialized())
return;
dbgln_if(USB_DEBUG, "Registering driver {}", driver->name()); dbgln_if(USB_DEBUG, "Registering driver {}", driver->name());
m_available_drivers.append(driver); the().m_available_drivers.append(driver);
} }
LockRefPtr<Driver> USBManagement::get_driver_by_name(StringView name) LockRefPtr<Driver> USBManagement::get_driver_by_name(StringView name)
{ {
auto it = m_available_drivers.find_if([name](auto driver) { return driver->name() == name; }); if (!initialized())
return nullptr;
auto it = the().m_available_drivers.find_if([name](auto driver) { return driver->name() == name; });
return it.is_end() ? nullptr : LockRefPtr { *it }; return it.is_end() ? nullptr : LockRefPtr { *it };
} }
void USBManagement::unregister_driver(NonnullLockRefPtr<Driver> driver) void USBManagement::unregister_driver(NonnullLockRefPtr<Driver> driver)
{ {
if (!initialized())
return;
auto& the_instance = the();
dbgln_if(USB_DEBUG, "Unregistering driver {}", driver->name()); dbgln_if(USB_DEBUG, "Unregistering driver {}", driver->name());
auto const& found_driver = m_available_drivers.find(driver); auto const& found_driver = the_instance.m_available_drivers.find(driver);
if (!found_driver.is_end()) if (!found_driver.is_end())
m_available_drivers.remove(found_driver.index()); the_instance.m_available_drivers.remove(found_driver.index());
} }
USBManagement& USBManagement::the() USBManagement& USBManagement::the()

View file

@ -21,9 +21,9 @@ public:
static void initialize(); static void initialize();
static USBManagement& the(); static USBManagement& the();
void register_driver(NonnullLockRefPtr<Driver> driver); static void register_driver(NonnullLockRefPtr<Driver> driver);
LockRefPtr<Driver> get_driver_by_name(StringView name); static LockRefPtr<Driver> get_driver_by_name(StringView name);
void unregister_driver(NonnullLockRefPtr<Driver> driver); static void unregister_driver(NonnullLockRefPtr<Driver> driver);
Vector<NonnullLockRefPtr<Driver>>& available_drivers() { return m_available_drivers; } Vector<NonnullLockRefPtr<Driver>>& available_drivers() { return m_available_drivers; }