diff --git a/Kernel/Bus/USB/UHCIController.cpp b/Kernel/Bus/USB/UHCIController.cpp index 8ca2b7863d..7c0ea8fb56 100644 --- a/Kernel/Bus/USB/UHCIController.cpp +++ b/Kernel/Bus/USB/UHCIController.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2021, Andreas Kling * Copyright (c) 2020, Jesse Buhagiar * * SPDX-License-Identifier: BSD-2-Clause @@ -12,9 +12,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -69,29 +69,29 @@ static constexpr u16 UHCI_PORTSC_SUSPEND = 0x1000; static constexpr u8 UHCI_NUMBER_OF_ISOCHRONOUS_TDS = 128; static constexpr u16 UHCI_NUMBER_OF_FRAMES = 1024; -class ProcFSUSBBusDirectory; -static ProcFSUSBBusDirectory* s_procfs_usb_bus_directory; +class SysFSUSBBusDirectory; +static SysFSUSBBusDirectory* s_procfs_usb_bus_directory; -class ProcFSUSBDeviceInformation : public ProcFSGlobalInformation { - friend class ProcFSUSBBusDirectory; +class SysFSUSBDeviceInformation : public SysFSComponent { + friend class SysFSUSBBusDirectory; public: - virtual ~ProcFSUSBDeviceInformation() override {}; + virtual ~SysFSUSBDeviceInformation() override {}; - static NonnullRefPtr create(USB::Device&); + static NonnullRefPtr create(USB::Device&); RefPtr device() const { return m_device; } protected: - explicit ProcFSUSBDeviceInformation(USB::Device& device) - : ProcFSGlobalInformation(String::formatted("{}", device.address())) + explicit SysFSUSBDeviceInformation(USB::Device& device) + : SysFSComponent(String::number(device.address())) , m_device(device) { } - virtual bool output(KBufferBuilder& builder) override - { - VERIFY(m_device); // Something has gone very wrong if this isn't true + virtual KResultOr read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, FileDescription*) const override + { + KBufferBuilder builder; JsonArraySerializer array { builder }; auto obj = array.add_object(); @@ -109,14 +109,24 @@ protected: obj.add("num_configurations", m_device->device_descriptor().num_configurations); obj.finish(); array.finish(); - return true; + + auto data = builder.build(); + if (!data) + return ENOMEM; + + ssize_t nread = min(static_cast(data->size() - offset), static_cast(count)); + if (!buffer.write(data->data() + offset, nread)) + return EFAULT; + + return nread; } - IntrusiveListNode> m_list_node; - RefPtr m_device; + IntrusiveListNode> m_list_node; + + NonnullRefPtr m_device; }; -class ProcFSUSBBusDirectory final : public ProcFSExposedDirectory { - friend class ProcFSComponentsRegistrar; +class SysFSUSBBusDirectory final : public SysFSDirectory { + friend class SysFSComponentsRegistrar; public: static void initialize(); @@ -124,25 +134,24 @@ public: void unplug(USB::Device&); virtual KResult traverse_as_directory(unsigned, Function) const override; - virtual RefPtr lookup(StringView name) override; + virtual RefPtr lookup(StringView name) override; private: - ProcFSUSBBusDirectory(const ProcFSBusDirectory&); + explicit SysFSUSBBusDirectory(SysFSBusDirectory&); - RefPtr device_node_for(USB::Device& device); + RefPtr device_node_for(USB::Device& device); - IntrusiveList, &ProcFSUSBDeviceInformation::m_list_node> m_device_nodes; + IntrusiveList, &SysFSUSBDeviceInformation::m_list_node> m_device_nodes; mutable SpinLock m_lock; }; -KResult ProcFSUSBBusDirectory::traverse_as_directory(unsigned fsid, Function callback) const +KResult SysFSUSBBusDirectory::traverse_as_directory(unsigned fsid, Function callback) const { ScopedSpinLock lock(m_lock); - auto parent_directory = m_parent_directory.strong_ref(); // Note: if the parent directory is null, it means something bad happened as this should not happen for the USB directory. - VERIFY(parent_directory); + VERIFY(m_parent_directory); callback({ ".", { fsid, component_index() }, 0 }); - callback({ "..", { fsid, parent_directory->component_index() }, 0 }); + callback({ "..", { fsid, m_parent_directory->component_index() }, 0 }); for (auto& device_node : m_device_nodes) { InodeIdentifier identifier = { fsid, device_node.component_index() }; @@ -150,7 +159,7 @@ KResult ProcFSUSBBusDirectory::traverse_as_directory(unsigned fsid, Function ProcFSUSBBusDirectory::lookup(StringView name) +RefPtr SysFSUSBBusDirectory::lookup(StringView name) { ScopedSpinLock lock(m_lock); for (auto& device_node : m_device_nodes) { @@ -161,7 +170,7 @@ RefPtr ProcFSUSBBusDirectory::lookup(StringView name) return {}; } -RefPtr ProcFSUSBBusDirectory::device_node_for(USB::Device& device) +RefPtr SysFSUSBBusDirectory::device_node_for(USB::Device& device) { RefPtr checked_device = device; for (auto& device_node : m_device_nodes) { @@ -171,14 +180,15 @@ RefPtr ProcFSUSBBusDirectory::device_node_for(USB::D return {}; } -void ProcFSUSBBusDirectory::plug(USB::Device& new_device) +void SysFSUSBBusDirectory::plug(USB::Device& new_device) { ScopedSpinLock lock(m_lock); auto device_node = device_node_for(new_device); VERIFY(!device_node); - m_device_nodes.append(ProcFSUSBDeviceInformation::create(new_device)); + m_device_nodes.append(SysFSUSBDeviceInformation::create(new_device)); } -void ProcFSUSBBusDirectory::unplug(USB::Device& deleted_device) + +void SysFSUSBBusDirectory::unplug(USB::Device& deleted_device) { ScopedSpinLock lock(m_lock); auto device_node = device_node_for(deleted_device); @@ -186,21 +196,21 @@ void ProcFSUSBBusDirectory::unplug(USB::Device& deleted_device) device_node->m_list_node.remove(); } -UNMAP_AFTER_INIT ProcFSUSBBusDirectory::ProcFSUSBBusDirectory(const ProcFSBusDirectory& buses_directory) - : ProcFSExposedDirectory("usb"sv, buses_directory) +UNMAP_AFTER_INIT SysFSUSBBusDirectory::SysFSUSBBusDirectory(SysFSBusDirectory& buses_directory) + : SysFSDirectory("usb"sv, buses_directory) { } -UNMAP_AFTER_INIT void ProcFSUSBBusDirectory::initialize() +UNMAP_AFTER_INIT void SysFSUSBBusDirectory::initialize() { - auto directory = adopt_ref(*new ProcFSUSBBusDirectory(ProcFSComponentRegistry::the().buses_directory())); - ProcFSComponentRegistry::the().register_new_bus_directory(directory); + auto directory = adopt_ref(*new SysFSUSBBusDirectory(SysFSComponentRegistry::the().buses_directory())); + SysFSComponentRegistry::the().register_new_bus_directory(directory); s_procfs_usb_bus_directory = directory; } -NonnullRefPtr ProcFSUSBDeviceInformation::create(USB::Device& device) +NonnullRefPtr SysFSUSBDeviceInformation::create(USB::Device& device) { - return adopt_ref(*new ProcFSUSBDeviceInformation(device)); + return adopt_ref(*new SysFSUSBDeviceInformation(device)); } UHCIController& UHCIController::the() @@ -215,7 +225,7 @@ UNMAP_AFTER_INIT void UHCIController::detect() // FIXME: We create the /proc/bus/usb representation here, but it should really be handled // in a more broad singleton than this once we refactor things in USB subsystem. - ProcFSUSBBusDirectory::initialize(); + SysFSUSBBusDirectory::initialize(); PCI::enumerate([&](const PCI::Address& address, PCI::ID id) { if (address.is_null()) diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index bcaa254354..dbc8e7db0d 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -36,17 +36,6 @@ UNMAP_AFTER_INIT ProcFSComponentRegistry::ProcFSComponentRegistry() { } -const ProcFSBusDirectory& ProcFSComponentRegistry::buses_directory() const -{ - return *m_root_directory->m_buses_directory; -} - -void ProcFSComponentRegistry::register_new_bus_directory(ProcFSExposedDirectory& new_bus_directory) -{ - VERIFY(!m_root_directory->m_buses_directory.is_null()); - m_root_directory->m_buses_directory->m_components.append(new_bus_directory); -} - void ProcFSComponentRegistry::register_new_process(Process& new_process) { Locker locker(m_lock); diff --git a/Kernel/FileSystem/SysFS.cpp b/Kernel/FileSystem/SysFS.cpp index 47ffe5401b..bfa7c745db 100644 --- a/Kernel/FileSystem/SysFS.cpp +++ b/Kernel/FileSystem/SysFS.cpp @@ -56,6 +56,9 @@ KResult SysFSRootDirectory::traverse_as_directory(unsigned fsid, Function SysFS::create() @@ -174,6 +177,7 @@ SysFSDirectoryInode::SysFSDirectoryInode(SysFS const& fs, SysFSComponent const& SysFSDirectoryInode::~SysFSDirectoryInode() { } + InodeMetadata SysFSDirectoryInode::metadata() const { Locker locker(m_inode_lock); @@ -201,4 +205,26 @@ RefPtr SysFSDirectoryInode::lookup(StringView name) return component->to_inode(m_parent_fs); } +SysFSBusDirectory& SysFSComponentRegistry::buses_directory() +{ + return *m_root_directory->m_buses_directory; +} + +void SysFSComponentRegistry::register_new_bus_directory(SysFSDirectory& new_bus_directory) +{ + VERIFY(!m_root_directory->m_buses_directory.is_null()); + m_root_directory->m_buses_directory->m_components.append(new_bus_directory); +} + +UNMAP_AFTER_INIT NonnullRefPtr SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory) +{ + auto directory = adopt_ref(*new (nothrow) SysFSBusDirectory(parent_directory)); + return directory; +} + +UNMAP_AFTER_INIT SysFSBusDirectory::SysFSBusDirectory(SysFSRootDirectory const& parent_directory) + : SysFSDirectory("bus"sv, parent_directory) +{ +} + } diff --git a/Kernel/FileSystem/SysFS.h b/Kernel/FileSystem/SysFS.h index de0ff4d932..b31d5cc749 100644 --- a/Kernel/FileSystem/SysFS.h +++ b/Kernel/FileSystem/SysFS.h @@ -21,6 +21,17 @@ public: private: SysFSRootDirectory(); + RefPtr m_buses_directory; +}; + +class SysFSBusDirectory : public SysFSDirectory { + friend class SysFSComponentRegistry; + +public: + static NonnullRefPtr must_create(SysFSRootDirectory const&); + +private: + explicit SysFSBusDirectory(SysFSRootDirectory const&); }; class SysFSComponentRegistry { @@ -35,6 +46,9 @@ public: SysFSDirectory& root_directory() { return m_root_directory; } Mutex& get_lock() { return m_lock; } + void register_new_bus_directory(SysFSDirectory&); + SysFSBusDirectory& buses_directory(); + private: Mutex m_lock; NonnullRefPtr m_root_directory; diff --git a/Kernel/Forward.h b/Kernel/Forward.h index db666f4297..a7600a18b6 100644 --- a/Kernel/Forward.h +++ b/Kernel/Forward.h @@ -40,7 +40,6 @@ class PerformanceEventBuffer; class PhysicalPage; class PhysicalRegion; class ProcFS; -class ProcFSBusDirectory; class ProcFSDirectoryInode; class ProcFSExposedComponent; class ProcFSExposedDirectory; @@ -61,6 +60,8 @@ class SharedInodeVMObject; class Socket; class Space; class SysFS; +class SysFSDirectory; +class SysFSBusDirectory; class SysFSDirectoryInode; class SysFSInode; class TCPSocket; diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index e30c3dcad9..cd14d3a5db 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -813,12 +813,6 @@ UNMAP_AFTER_INIT ProcFSProfile::ProcFSProfile() { } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSBusDirectory::must_create(const ProcFSRootDirectory& parent_directory) -{ - auto directory = adopt_ref(*new (nothrow) ProcFSBusDirectory(parent_directory)); - return directory; -} - UNMAP_AFTER_INIT NonnullRefPtr ProcFSSystemDirectory::must_create(const ProcFSRootDirectory& parent_directory) { auto directory = adopt_ref(*new (nothrow) ProcFSSystemDirectory(parent_directory)); @@ -828,10 +822,6 @@ UNMAP_AFTER_INIT NonnullRefPtr ProcFSSystemDirectory::mus return directory; } -UNMAP_AFTER_INIT ProcFSBusDirectory::ProcFSBusDirectory(const ProcFSRootDirectory& parent_directory) - : ProcFSExposedDirectory("bus"sv, parent_directory) -{ -} UNMAP_AFTER_INIT ProcFSSystemDirectory::ProcFSSystemDirectory(const ProcFSRootDirectory& parent_directory) : ProcFSExposedDirectory("sys"sv, parent_directory) { @@ -856,9 +846,6 @@ UNMAP_AFTER_INIT NonnullRefPtr ProcFSRootDirectory::must_cr directory->m_components.append(ProcFSProfile::must_create()); directory->m_components.append(ProcFSNetworkDirectory::must_create(*directory)); - auto buses_directory = ProcFSBusDirectory::must_create(*directory); - directory->m_components.append(buses_directory); - directory->m_buses_directory = buses_directory; directory->m_components.append(ProcFSSystemDirectory::must_create(*directory)); return directory; } diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index 4e0136228a..d3336bb71a 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -30,9 +30,6 @@ public: InodeIndex allocate_inode_index() const; ProcFSComponentRegistry(); - void register_new_bus_directory(ProcFSExposedDirectory&); - - const ProcFSBusDirectory& buses_directory() const; void register_new_process(Process&); void unregister_process(Process&); @@ -157,16 +154,6 @@ private: RefPtr m_associated_process; }; -class ProcFSBusDirectory : public ProcFSExposedDirectory { - friend class ProcFSComponentRegistry; - -public: - static NonnullRefPtr must_create(const ProcFSRootDirectory& parent_directory); - -private: - ProcFSBusDirectory(const ProcFSRootDirectory& parent_directory); -}; - class ProcFSRootDirectory final : public ProcFSExposedDirectory { friend class ProcFSComponentRegistry; @@ -181,7 +168,6 @@ private: virtual KResult traverse_as_directory(unsigned, Function) const override; ProcFSRootDirectory(); - RefPtr m_buses_directory; IntrusiveList, &ProcFSProcessDirectory::m_list_node> m_process_directories; }; diff --git a/Userland/Utilities/lsusb.cpp b/Userland/Utilities/lsusb.cpp index da7d7f3ad1..1ef85ab1d6 100644 --- a/Userland/Utilities/lsusb.cpp +++ b/Userland/Utilities/lsusb.cpp @@ -23,7 +23,7 @@ int main(int argc, char** argv) return 1; } - if (unveil("/proc/bus/usb", "r") < 0) { + if (unveil("/sys/bus/usb", "r") < 0) { perror("unveil"); return 1; } @@ -42,7 +42,7 @@ int main(int argc, char** argv) args.set_general_help("List USB devices."); args.parse(argc, argv); - Core::DirIterator usb_devices("/proc/bus/usb", Core::DirIterator::SkipDots); + Core::DirIterator usb_devices("/sys/bus/usb", Core::DirIterator::SkipDots); RefPtr usb_db = USBDB::Database::open(); if (!usb_db) {