From b849e4f907b38a1bb2f4f7f10153f733d606cd61 Mon Sep 17 00:00:00 2001 From: Liav A Date: Fri, 21 Jan 2022 18:09:21 +0200 Subject: [PATCH] Kernel/PCI: Don't create /proc/pci if PCI is disabled Reading from /proc/pci assumes we have PCI enabled and also enumerated. However, if PCI is disabled for some reason, we can't allow the user to read from it as there's no valuable data we can supply. --- Kernel/Bus/PCI/Access.cpp | 3 +++ Kernel/GlobalProcessExposed.cpp | 7 ++++++- Kernel/ProcessExposed.h | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Kernel/Bus/PCI/Access.cpp b/Kernel/Bus/PCI/Access.cpp index f33191106f..67c3cea1f2 100644 --- a/Kernel/Bus/PCI/Access.cpp +++ b/Kernel/Bus/PCI/Access.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include namespace Kernel::PCI { @@ -95,6 +96,7 @@ UNMAP_AFTER_INIT bool Access::find_and_register_pci_host_bridges_from_acpi_mcfg_ UNMAP_AFTER_INIT bool Access::initialize_for_multiple_pci_domains(PhysicalAddress mcfg_table) { VERIFY(!Access::is_initialized()); + ProcFSComponentRegistry::the().root_directory().add_pci_node({}); auto* access = new Access(); if (!access->find_and_register_pci_host_bridges_from_acpi_mcfg_table(mcfg_table)) return false; @@ -106,6 +108,7 @@ UNMAP_AFTER_INIT bool Access::initialize_for_multiple_pci_domains(PhysicalAddres UNMAP_AFTER_INIT bool Access::initialize_for_one_pci_domain() { VERIFY(!Access::is_initialized()); + ProcFSComponentRegistry::the().root_directory().add_pci_node({}); auto* access = new Access(); auto host_bridge = HostBridge::must_create_with_io_access(); access->add_host_controller(move(host_bridge)); diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index 1353389577..a84331ebf1 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -949,6 +950,11 @@ UNMAP_AFTER_INIT ProcFSSystemDirectory::ProcFSSystemDirectory(const ProcFSRootDi { } +UNMAP_AFTER_INIT void ProcFSRootDirectory::add_pci_node(Badge) +{ + m_components.append(ProcFSPCI::must_create()); +} + UNMAP_AFTER_INIT NonnullRefPtr ProcFSRootDirectory::must_create() { auto directory = adopt_ref(*new (nothrow) ProcFSRootDirectory); @@ -961,7 +967,6 @@ UNMAP_AFTER_INIT NonnullRefPtr ProcFSRootDirectory::must_cr directory->m_components.append(ProcFSDmesg::must_create()); directory->m_components.append(ProcFSInterrupts::must_create()); directory->m_components.append(ProcFSKeymap::must_create()); - directory->m_components.append(ProcFSPCI::must_create()); directory->m_components.append(ProcFSDevices::must_create()); directory->m_components.append(ProcFSUptime::must_create()); directory->m_components.append(ProcFSCommandLine::must_create()); diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index f42e8ac735..bd19d862c6 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -138,12 +138,18 @@ protected: mutable Mutex m_lock { "ProcFSLink" }; }; +namespace PCI { +class Access; +} + class ProcFSRootDirectory final : public ProcFSExposedDirectory { friend class ProcFSComponentRegistry; public: virtual ErrorOr> lookup(StringView name) override; static NonnullRefPtr must_create(); + + void add_pci_node(Badge); virtual ~ProcFSRootDirectory(); private: