From f21d4e794ca8c6c98aa52f0be8cc8f3fbe9b1d30 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sat, 7 Oct 2023 15:46:30 +0300 Subject: [PATCH] Kernel: Rework whole ATA driver structure Make ATA driver more compatible when we are adding SATA support --- base-sysroot.tar.gz | Bin 8147 -> 8220 bytes kernel/CMakeLists.txt | 6 +- kernel/include/kernel/Device/Device.h | 2 + kernel/include/kernel/Device/NullDevice.h | 4 + kernel/include/kernel/Device/ZeroDevice.h | 2 + kernel/include/kernel/FS/DevFS/FileSystem.h | 8 +- kernel/include/kernel/Input/PS2Controller.h | 9 +- kernel/include/kernel/PCI.h | 3 + .../include/kernel/Storage/{ => ATA}/ATABus.h | 30 +++-- .../kernel/Storage/ATA/ATAController.h | 27 ++++ .../kernel/Storage/{ => ATA}/ATADefinitions.h | 3 + .../kernel/Storage/{ => ATA}/ATADevice.h | 22 ++-- kernel/include/kernel/Storage/ATAController.h | 38 ------ .../kernel/Storage/StorageController.h | 10 +- kernel/include/kernel/Storage/StorageDevice.h | 18 ++- kernel/include/kernel/Terminal/TTY.h | 2 - kernel/kernel/FS/DevFS/FileSystem.cpp | 23 +++- kernel/kernel/Input/PS2Controller.cpp | 9 +- kernel/kernel/PCI.cpp | 5 +- kernel/kernel/Storage/{ => ATA}/ATABus.cpp | 108 ++++++++-------- kernel/kernel/Storage/ATA/ATAController.cpp | 76 ++++++++++++ kernel/kernel/Storage/ATA/ATADevice.cpp | 117 ++++++++++++++++++ kernel/kernel/Storage/ATAController.cpp | 102 --------------- kernel/kernel/Storage/ATADevice.cpp | 86 ------------- kernel/kernel/Storage/StorageDevice.cpp | 20 ++- kernel/kernel/Terminal/Serial.cpp | 2 +- kernel/kernel/Terminal/TTY.cpp | 4 +- kernel/kernel/Terminal/VirtualTTY.cpp | 10 +- kernel/kernel/kernel.cpp | 1 + 29 files changed, 400 insertions(+), 347 deletions(-) rename kernel/include/kernel/Storage/{ => ATA}/ATABus.h (57%) create mode 100644 kernel/include/kernel/Storage/ATA/ATAController.h rename kernel/include/kernel/Storage/{ => ATA}/ATADefinitions.h (91%) rename kernel/include/kernel/Storage/{ => ATA}/ATADevice.h (62%) delete mode 100644 kernel/include/kernel/Storage/ATAController.h rename kernel/kernel/Storage/{ => ATA}/ATABus.cpp (71%) create mode 100644 kernel/kernel/Storage/ATA/ATAController.cpp create mode 100644 kernel/kernel/Storage/ATA/ATADevice.cpp delete mode 100644 kernel/kernel/Storage/ATAController.cpp delete mode 100644 kernel/kernel/Storage/ATADevice.cpp diff --git a/base-sysroot.tar.gz b/base-sysroot.tar.gz index 590909752fad60b9c3cc582ab757ad80a63acc30..310827bc1185cdb2f1d4c34ea49b64d5a46d5c60 100644 GIT binary patch literal 8220 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 literal 8147 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 diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index c23387ad..c8bf72ad 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -52,9 +52,9 @@ set(KERNEL_SOURCES kernel/Semaphore.cpp kernel/SpinLock.cpp kernel/SSP.cpp - kernel/Storage/ATABus.cpp - kernel/Storage/ATAController.cpp - kernel/Storage/ATADevice.cpp + kernel/Storage/ATA/ATABus.cpp + kernel/Storage/ATA/ATAController.cpp + kernel/Storage/ATA/ATADevice.cpp kernel/Storage/DiskCache.cpp kernel/Storage/StorageDevice.cpp kernel/Syscall.cpp diff --git a/kernel/include/kernel/Device/Device.h b/kernel/include/kernel/Device/Device.h index df445eec..58f105b7 100644 --- a/kernel/include/kernel/Device/Device.h +++ b/kernel/include/kernel/Device/Device.h @@ -17,6 +17,8 @@ namespace Kernel virtual dev_t rdev() const override = 0; + virtual BAN::StringView name() const = 0; + protected: Device(mode_t, uid_t, gid_t); }; diff --git a/kernel/include/kernel/Device/NullDevice.h b/kernel/include/kernel/Device/NullDevice.h index 7da299a4..a5e09932 100644 --- a/kernel/include/kernel/Device/NullDevice.h +++ b/kernel/include/kernel/Device/NullDevice.h @@ -1,3 +1,5 @@ +#pragma once + #include namespace Kernel @@ -10,6 +12,8 @@ namespace Kernel virtual dev_t rdev() const override { return m_rdev; } + virtual BAN::StringView name() const override { return "null"sv; } + protected: NullDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) diff --git a/kernel/include/kernel/Device/ZeroDevice.h b/kernel/include/kernel/Device/ZeroDevice.h index 106bdcb8..86fb781f 100644 --- a/kernel/include/kernel/Device/ZeroDevice.h +++ b/kernel/include/kernel/Device/ZeroDevice.h @@ -10,6 +10,8 @@ namespace Kernel virtual dev_t rdev() const override { return m_rdev; } + virtual BAN::StringView name() const override { return "zero"sv; } + protected: ZeroDevice(mode_t mode, uid_t uid, gid_t gid, dev_t rdev) : CharacterDevice(mode, uid, gid) diff --git a/kernel/include/kernel/FS/DevFS/FileSystem.h b/kernel/include/kernel/FS/DevFS/FileSystem.h index 4006bc98..e8a56c51 100644 --- a/kernel/include/kernel/FS/DevFS/FileSystem.h +++ b/kernel/include/kernel/FS/DevFS/FileSystem.h @@ -15,10 +15,12 @@ namespace Kernel void initialize_device_updater(); - void add_device(BAN::StringView path, BAN::RefPtr); + void add_device(BAN::RefPtr); + void add_inode(BAN::StringView path, BAN::RefPtr); void for_each_device(const BAN::Function& callback); - dev_t get_next_dev(); + dev_t get_next_dev() const; + int get_next_input_device() const; void initiate_sync(bool should_block); @@ -28,7 +30,7 @@ namespace Kernel { } private: - SpinLock m_device_lock; + mutable SpinLock m_device_lock; Semaphore m_sync_done; Semaphore m_sync_semaphore; diff --git a/kernel/include/kernel/Input/PS2Controller.h b/kernel/include/kernel/Input/PS2Controller.h index 6c739082..0c75cf9a 100644 --- a/kernel/include/kernel/Input/PS2Controller.h +++ b/kernel/include/kernel/Input/PS2Controller.h @@ -9,12 +9,13 @@ namespace Kernel::Input class PS2Device : public CharacterDevice, public Interruptable { public: + PS2Device(); virtual ~PS2Device() {} - public: - PS2Device() - : CharacterDevice(Mode::IRUSR | Mode::IRGRP, 0, 0) - { } + virtual BAN::StringView name() const override { return m_name; } + + private: + const BAN::String m_name; }; class PS2Controller diff --git a/kernel/include/kernel/PCI.h b/kernel/include/kernel/PCI.h index 63d9ca67..1eb10311 100644 --- a/kernel/include/kernel/PCI.h +++ b/kernel/include/kernel/PCI.h @@ -3,6 +3,9 @@ #include #include #include +#include + +#include namespace Kernel::PCI { diff --git a/kernel/include/kernel/Storage/ATABus.h b/kernel/include/kernel/Storage/ATA/ATABus.h similarity index 57% rename from kernel/include/kernel/Storage/ATABus.h rename to kernel/include/kernel/Storage/ATA/ATABus.h index f971fe73..06894e5f 100644 --- a/kernel/include/kernel/Storage/ATABus.h +++ b/kernel/include/kernel/Storage/ATA/ATABus.h @@ -1,48 +1,46 @@ #pragma once -#include +#include +#include #include #include -#include namespace Kernel { class ATADevice; - class ATABus : public Interruptable + class ATABus : public BAN::RefCounted, public Interruptable { public: enum class DeviceType { - None, ATA, ATAPI, }; public: - static ATABus* create(ATAController&, uint16_t base, uint16_t ctrl, uint8_t irq); + static BAN::ErrorOr> create(uint16_t base, uint16_t ctrl, uint8_t irq); BAN::ErrorOr read(ATADevice&, uint64_t, uint8_t, uint8_t*); BAN::ErrorOr write(ATADevice&, uint64_t, uint8_t, const uint8_t*); - ATAController& controller() { return m_controller; } - virtual void handle_irq() override; + void initialize_devfs(); + private: - ATABus(ATAController& controller, uint16_t base, uint16_t ctrl) - : m_controller(controller) - , m_base(base) + ATABus(uint16_t base, uint16_t ctrl) + : m_base(base) , m_ctrl(ctrl) {} - void initialize(uint8_t irq); + BAN::ErrorOr initialize(); - void select_device(const ATADevice&); - DeviceType identify(const ATADevice&, uint16_t*); + void select_device(bool secondary); + BAN::ErrorOr identify(bool secondary, BAN::Span buffer); void block_until_irq(); - uint8_t device_index(const ATADevice&) const; + //uint8_t device_index(const ATADevice&) const; uint8_t io_read(uint16_t); void io_write(uint16_t, uint8_t); @@ -52,14 +50,14 @@ namespace Kernel BAN::Error error(); private: - ATAController& m_controller; const uint16_t m_base; const uint16_t m_ctrl; SpinLock m_lock; bool m_has_got_irq { false }; - BAN::RefPtr m_devices[2] {}; + // Non-owning pointers + BAN::Vector m_devices; friend class ATAController; }; diff --git a/kernel/include/kernel/Storage/ATA/ATAController.h b/kernel/include/kernel/Storage/ATA/ATAController.h new file mode 100644 index 00000000..df6576c2 --- /dev/null +++ b/kernel/include/kernel/Storage/ATA/ATAController.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace Kernel +{ + + class ATAController : public StorageController + { + public: + static BAN::ErrorOr> create(PCI::Device&); + virtual BAN::ErrorOr initialize() override; + + private: + ATAController(PCI::Device& pci_device) + : m_pci_device(pci_device) + { } + + private: + PCI::Device& m_pci_device; + }; + +} \ No newline at end of file diff --git a/kernel/include/kernel/Storage/ATADefinitions.h b/kernel/include/kernel/Storage/ATA/ATADefinitions.h similarity index 91% rename from kernel/include/kernel/Storage/ATADefinitions.h rename to kernel/include/kernel/Storage/ATA/ATADefinitions.h index 7559062b..37686d34 100644 --- a/kernel/include/kernel/Storage/ATADefinitions.h +++ b/kernel/include/kernel/Storage/ATA/ATADefinitions.h @@ -1,5 +1,8 @@ #pragma once +#define ATA_PROGIF_PRIMARY_NATIVE (1 << 0) +#define ATA_PROGIF_SECONDARY_NATIVE (1 << 2) + #define ATA_PORT_DATA 0x00 #define ATA_PORT_ERROR 0x00 #define ATA_PORT_SECTOR_COUNT 0x02 diff --git a/kernel/include/kernel/Storage/ATADevice.h b/kernel/include/kernel/Storage/ATA/ATADevice.h similarity index 62% rename from kernel/include/kernel/Storage/ATADevice.h rename to kernel/include/kernel/Storage/ATA/ATADevice.h index e9a3a23a..8851f2e1 100644 --- a/kernel/include/kernel/Storage/ATADevice.h +++ b/kernel/include/kernel/Storage/ATA/ATADevice.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include namespace Kernel @@ -9,23 +9,31 @@ namespace Kernel class ATADevice final : public StorageDevice { public: - ATADevice(ATABus&); - BAN::ErrorOr initialize(ATABus::DeviceType, const uint16_t*); + static BAN::ErrorOr> create(BAN::RefPtr, ATABus::DeviceType, bool is_secondary, BAN::Span identify_data); virtual uint32_t sector_size() const override { return m_sector_words * 2; } virtual uint64_t total_size() const override { return m_lba_count * sector_size(); } + bool is_secondary() const { return m_is_secondary; } + uint32_t words_per_sector() const { return m_sector_words; } + uint64_t sector_count() const { return m_lba_count; } + BAN::StringView model() const { return m_model; } + BAN::StringView name() const; protected: virtual BAN::ErrorOr read_sectors_impl(uint64_t, uint8_t, uint8_t*) override; virtual BAN::ErrorOr write_sectors_impl(uint64_t, uint8_t, const uint8_t*) override; private: - ATABus& m_bus; - uint8_t m_index; + ATADevice(BAN::RefPtr, ATABus::DeviceType, bool is_secodary); + BAN::ErrorOr initialize(BAN::Span identify_data); - ATABus::DeviceType m_type; + private: + BAN::RefPtr m_bus; + const ATABus::DeviceType m_type; + const bool m_is_secondary; + uint16_t m_signature; uint16_t m_capabilities; uint32_t m_command_set; @@ -33,8 +41,6 @@ namespace Kernel uint64_t m_lba_count; char m_model[41]; - friend class ATABus; - public: virtual Mode mode() const override { return { Mode::IFBLK | Mode::IRUSR | Mode::IRGRP }; } virtual uid_t uid() const override { return 0; } diff --git a/kernel/include/kernel/Storage/ATAController.h b/kernel/include/kernel/Storage/ATAController.h deleted file mode 100644 index c8de79e9..00000000 --- a/kernel/include/kernel/Storage/ATAController.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include -#include - -namespace Kernel -{ - - class ATABus; - - class ATAController final : public StorageController - { - public: - static BAN::ErrorOr> create(const PCI::Device&); - - virtual BAN::Vector> devices() override; - - private: - ATAController(); - BAN::ErrorOr initialize(const PCI::Device& device); - - private: - ATABus* m_buses[2] { nullptr, nullptr }; - friend class ATABus; - - public: - virtual Mode mode() const override { return { Mode::IFCHR }; } - virtual uid_t uid() const override { return 0; } - virtual gid_t gid() const override { return 0; } - virtual dev_t rdev() const override { return m_rdev; } - - virtual BAN::ErrorOr read(size_t, void*, size_t) { return BAN::Error::from_errno(ENOTSUP); } - - private: - const dev_t m_rdev; - }; - -} \ No newline at end of file diff --git a/kernel/include/kernel/Storage/StorageController.h b/kernel/include/kernel/Storage/StorageController.h index 2e568966..c6199920 100644 --- a/kernel/include/kernel/Storage/StorageController.h +++ b/kernel/include/kernel/Storage/StorageController.h @@ -1,17 +1,13 @@ #pragma once -#include - namespace Kernel { - class StorageController : public CharacterDevice + class StorageController { public: - StorageController() - : CharacterDevice(0660, 0, 0) - { } - virtual BAN::Vector> devices() = 0; + virtual ~StorageController() {} + virtual BAN::ErrorOr initialize() = 0; }; } \ No newline at end of file diff --git a/kernel/include/kernel/Storage/StorageDevice.h b/kernel/include/kernel/Storage/StorageDevice.h index 487c0013..c4cf1131 100644 --- a/kernel/include/kernel/Storage/StorageDevice.h +++ b/kernel/include/kernel/Storage/StorageDevice.h @@ -20,7 +20,7 @@ namespace Kernel class Partition final : public BlockDevice { public: - Partition(StorageDevice&, const GUID&, const GUID&, uint64_t, uint64_t, uint64_t, const char*, uint32_t); + static BAN::ErrorOr> create(StorageDevice&, const GUID& type, const GUID& guid, uint64_t start, uint64_t end, uint64_t attr, const char* label, uint32_t index); const GUID& partition_type() const { return m_type; } const GUID& partition_guid() const { return m_guid; } @@ -32,6 +32,11 @@ namespace Kernel BAN::ErrorOr read_sectors(uint64_t lba, uint8_t sector_count, uint8_t* buffer); BAN::ErrorOr write_sectors(uint64_t lba, uint8_t sector_count, const uint8_t* buffer); + + virtual BAN::StringView name() const override { return m_name; } + + private: + Partition(StorageDevice&, const GUID&, const GUID&, uint64_t, uint64_t, uint64_t, const char*, uint32_t); private: StorageDevice& m_device; @@ -41,6 +46,7 @@ namespace Kernel const uint64_t m_lba_end; const uint64_t m_attributes; char m_label[36 * 4 + 1]; + const BAN::String m_name; public: virtual bool is_partition() const override { return true; } @@ -73,8 +79,8 @@ namespace Kernel virtual uint32_t sector_size() const = 0; virtual uint64_t total_size() const = 0; - BAN::Vector& partitions() { return m_partitions; } - const BAN::Vector& partitions() const { return m_partitions; } + BAN::Vector>& partitions() { return m_partitions; } + const BAN::Vector>& partitions() const { return m_partitions; } BAN::ErrorOr sync_disk_cache(); virtual bool is_storage_device() const override { return true; } @@ -85,9 +91,9 @@ namespace Kernel void add_disk_cache(); private: - SpinLock m_lock; - BAN::Optional m_disk_cache; - BAN::Vector m_partitions; + SpinLock m_lock; + BAN::Optional m_disk_cache; + BAN::Vector> m_partitions; friend class DiskCache; }; diff --git a/kernel/include/kernel/Terminal/TTY.h b/kernel/include/kernel/Terminal/TTY.h index f6761a8e..5b876a25 100644 --- a/kernel/include/kernel/Terminal/TTY.h +++ b/kernel/include/kernel/Terminal/TTY.h @@ -50,8 +50,6 @@ namespace Kernel virtual BAN::ErrorOr read_impl(off_t, void*, size_t) override; virtual BAN::ErrorOr write_impl(off_t, const void*, size_t) override; - virtual BAN::StringView name() const = 0; - private: void do_backspace(); diff --git a/kernel/kernel/FS/DevFS/FileSystem.cpp b/kernel/kernel/FS/DevFS/FileSystem.cpp index b41b09b2..2aaa6ead 100644 --- a/kernel/kernel/FS/DevFS/FileSystem.cpp +++ b/kernel/kernel/FS/DevFS/FileSystem.cpp @@ -22,8 +22,8 @@ namespace Kernel auto root_inode = MUST(RamDirectoryInode::create(*s_instance, 0, 0755, 0, 0)); MUST(s_instance->set_root_inode(root_inode)); - s_instance->add_device("null", MUST(NullDevice::create(0666, 0, 0))); - s_instance->add_device("zero", MUST(ZeroDevice::create(0666, 0, 0))); + s_instance->add_device(MUST(NullDevice::create(0666, 0, 0))); + s_instance->add_device(MUST(ZeroDevice::create(0666, 0, 0))); } DevFileSystem& DevFileSystem::get() @@ -117,10 +117,16 @@ namespace Kernel m_sync_done.block(); } - void DevFileSystem::add_device(BAN::StringView path, BAN::RefPtr device) + void DevFileSystem::add_device(BAN::RefPtr device) + { + ASSERT(!device->name().contains('/')); + MUST(reinterpret_cast(root_inode().ptr())->add_inode(device->name(), device)); + } + + void DevFileSystem::add_inode(BAN::StringView path, BAN::RefPtr inode) { ASSERT(!path.contains('/')); - MUST(reinterpret_cast(root_inode().ptr())->add_inode(path, device)); + MUST(reinterpret_cast(root_inode().ptr())->add_inode(path, inode)); } void DevFileSystem::for_each_device(const BAN::Function& callback) @@ -136,11 +142,18 @@ namespace Kernel ); } - dev_t DevFileSystem::get_next_dev() + dev_t DevFileSystem::get_next_dev() const { LockGuard _(m_device_lock); static dev_t next_dev = 1; return next_dev++; } + int DevFileSystem::get_next_input_device() const + { + LockGuard _(m_device_lock); + static dev_t next_dev = 0; + return next_dev++; + } + } \ No newline at end of file diff --git a/kernel/kernel/Input/PS2Controller.cpp b/kernel/kernel/Input/PS2Controller.cpp index ea6887db..8c6c9d05 100644 --- a/kernel/kernel/Input/PS2Controller.cpp +++ b/kernel/kernel/Input/PS2Controller.cpp @@ -68,6 +68,11 @@ namespace Kernel::Input static PS2Controller* s_instance = nullptr; + PS2Device::PS2Device() + : CharacterDevice(0440, 0, 0) + , m_name(BAN::String::formatted("input{}", DevFileSystem::get().get_next_input_device())) + { } + BAN::ErrorOr PS2Controller::initialize() { ASSERT(s_instance == nullptr); @@ -175,14 +180,14 @@ namespace Kernel::Input m_devices[0]->set_irq(PS2::IRQ::DEVICE0); m_devices[0]->enable_interrupt(); config |= PS2::Config::INTERRUPT_FIRST_PORT; - DevFileSystem::get().add_device("input0", m_devices[0]); + DevFileSystem::get().add_device(m_devices[0]); } if (m_devices[1]) { m_devices[1]->set_irq(PS2::IRQ::DEVICE1); m_devices[1]->enable_interrupt(); config |= PS2::Config::INTERRUPT_SECOND_PORT; - DevFileSystem::get().add_device("input1", m_devices[1]); + DevFileSystem::get().add_device(m_devices[1]); } controller_send_command(PS2::Command::WRITE_CONFIG, config); diff --git a/kernel/kernel/PCI.cpp b/kernel/kernel/PCI.cpp index 9a5ea1f1..254526c1 100644 --- a/kernel/kernel/PCI.cpp +++ b/kernel/kernel/PCI.cpp @@ -3,7 +3,8 @@ #include #include #include -#include +#include +#include #define INVALID_VENDOR 0xFFFF #define MULTI_FUNCTION 0x80 @@ -143,6 +144,8 @@ namespace Kernel::PCI switch (pci_device.subclass()) { case 0x01: + case 0x05: + case 0x06: if (auto res = ATAController::create(pci_device); res.is_error()) dprintln("ATA: {}", res.error()); break; diff --git a/kernel/kernel/Storage/ATABus.cpp b/kernel/kernel/Storage/ATA/ATABus.cpp similarity index 71% rename from kernel/kernel/Storage/ATABus.cpp rename to kernel/kernel/Storage/ATA/ATABus.cpp index dde2bdeb..abe125ed 100644 --- a/kernel/kernel/Storage/ATABus.cpp +++ b/kernel/kernel/Storage/ATA/ATABus.cpp @@ -1,27 +1,31 @@ -#include +#include #include #include #include #include -#include -#include -#include +#include +#include +#include #include namespace Kernel { - ATABus* ATABus::create(ATAController& controller, uint16_t base, uint16_t ctrl, uint8_t irq) + BAN::ErrorOr> ATABus::create(uint16_t base, uint16_t ctrl, uint8_t irq) { - ATABus* bus = new ATABus(controller, base, ctrl); - ASSERT(bus); - bus->initialize(irq); + auto* bus_ptr = new ATABus(base, ctrl); + if (bus_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + auto bus = BAN::RefPtr::adopt(bus_ptr); + bus->set_irq(irq); + TRY(bus->initialize()); + if (bus->m_devices.empty()) + return BAN::Error::from_errno(ENODEV); return bus; } - void ATABus::initialize(uint8_t irq) + BAN::ErrorOr ATABus::initialize() { - set_irq(irq); enable_interrupt(); BAN::Vector identify_buffer; @@ -29,49 +33,57 @@ namespace Kernel for (uint8_t i = 0; i < 2; i++) { - { - auto* temp_ptr = new ATADevice(*this); - ASSERT(temp_ptr); - m_devices[i] = BAN::RefPtr::adopt(temp_ptr); - } - ATADevice& device = *m_devices[i]; + bool is_secondary = (i == 1); - BAN::ScopeGuard guard([this, i] { m_devices[i] = nullptr; }); - - auto type = identify(device, identify_buffer.data()); - if (type == DeviceType::None) + DeviceType device_type; + if (auto res = identify(is_secondary, identify_buffer.span()); res.is_error()) continue; + else + device_type = res.value(); - auto res = device.initialize(type, identify_buffer.data()); - if (res.is_error()) + auto device_or_error = ATADevice::create(this, device_type, is_secondary, identify_buffer.span()); + + if (device_or_error.is_error()) { - dprintln("{}", res.error()); + dprintln("{}", device_or_error.error()); continue; } - guard.disable(); + auto device = device_or_error.release_value(); + device->ref(); + TRY(m_devices.push_back(device.ptr())); } // Enable disk interrupts - for (int i = 0; i < 2; i++) + for (auto& device : m_devices) { - if (!m_devices[i]) - continue; - select_device(*m_devices[i]); + select_device(device->is_secondary()); io_write(ATA_PORT_CONTROL, 0); } + + return {}; + } + + void ATABus::initialize_devfs() + { + for (auto& device : m_devices) + { + DevFileSystem::get().add_device(device); + if (auto res = device->initialize_partitions(); res.is_error()) + dprintln("{}", res.error()); + device->unref(); + } } - void ATABus::select_device(const ATADevice& device) + void ATABus::select_device(bool secondary) { - uint8_t device_index = this->device_index(device); - io_write(ATA_PORT_DRIVE_SELECT, 0xA0 | (device_index << 4)); + io_write(ATA_PORT_DRIVE_SELECT, 0xA0 | ((uint8_t)secondary << 4)); SystemTimer::get().sleep(1); } - ATABus::DeviceType ATABus::identify(const ATADevice& device, uint16_t* buffer) + BAN::ErrorOr ATABus::identify(bool secondary, BAN::Span buffer) { - select_device(device); + select_device(secondary); // Disable interrupts io_write(ATA_PORT_CONTROL, ATA_CONTROL_nIEN); @@ -81,7 +93,7 @@ namespace Kernel // No device on port if (io_read(ATA_PORT_STATUS) == 0) - return DeviceType::None; + return BAN::Error::from_errno(EINVAL); DeviceType type = DeviceType::ATA; @@ -97,7 +109,7 @@ namespace Kernel else { dprintln("Unsupported device type"); - return DeviceType::None; + return BAN::Error::from_errno(EINVAL); } io_write(ATA_PORT_COMMAND, ATA_COMMAND_IDENTIFY_PACKET); @@ -106,11 +118,12 @@ namespace Kernel if (auto res = wait(true); res.is_error()) { dprintln("Fatal error: {}", res.error()); - return DeviceType::None; + return BAN::Error::from_errno(EINVAL); } } - read_buffer(ATA_PORT_DATA, buffer, 256); + ASSERT(buffer.size() >= 256); + read_buffer(ATA_PORT_DATA, buffer.data(), 256); return type; } @@ -212,18 +225,9 @@ namespace Kernel return BAN::Error::from_error_code(ErrorCode::None); } - uint8_t ATABus::device_index(const ATADevice& device) const - { - if (m_devices[0] && m_devices[0].ptr() == &device) - return 0; - if (m_devices[1] && m_devices[1].ptr() == &device) - return 1; - ASSERT_NOT_REACHED(); - } - BAN::ErrorOr ATABus::read(ATADevice& device, uint64_t lba, uint8_t sector_count, uint8_t* buffer) { - if (lba + sector_count > device.m_lba_count) + if (lba + sector_count > device.sector_count()) return BAN::Error::from_error_code(ErrorCode::Storage_Boundaries); LockGuard _(m_lock); @@ -231,7 +235,7 @@ namespace Kernel if (lba < (1 << 28)) { // LBA28 - io_write(ATA_PORT_DRIVE_SELECT, 0xE0 | (device_index(device) << 4) | ((lba >> 24) & 0x0F)); + io_write(ATA_PORT_DRIVE_SELECT, 0xE0 | ((uint8_t)device.is_secondary() << 4) | ((lba >> 24) & 0x0F)); io_write(ATA_PORT_SECTOR_COUNT, sector_count); io_write(ATA_PORT_LBA0, (uint8_t)(lba >> 0)); io_write(ATA_PORT_LBA1, (uint8_t)(lba >> 8)); @@ -241,7 +245,7 @@ namespace Kernel for (uint32_t sector = 0; sector < sector_count; sector++) { block_until_irq(); - read_buffer(ATA_PORT_DATA, (uint16_t*)buffer + sector * device.m_sector_words, device.m_sector_words); + read_buffer(ATA_PORT_DATA, (uint16_t*)buffer + sector * device.words_per_sector(), device.words_per_sector()); } } else @@ -255,7 +259,7 @@ namespace Kernel BAN::ErrorOr ATABus::write(ATADevice& device, uint64_t lba, uint8_t sector_count, const uint8_t* buffer) { - if (lba + sector_count > device.m_lba_count) + if (lba + sector_count > device.sector_count()) return BAN::Error::from_error_code(ErrorCode::Storage_Boundaries); LockGuard _(m_lock); @@ -263,7 +267,7 @@ namespace Kernel if (lba < (1 << 28)) { // LBA28 - io_write(ATA_PORT_DRIVE_SELECT, 0xE0 | (device_index(device) << 4) | ((lba >> 24) & 0x0F)); + io_write(ATA_PORT_DRIVE_SELECT, 0xE0 | ((uint8_t)device.is_secondary() << 4) | ((lba >> 24) & 0x0F)); io_write(ATA_PORT_SECTOR_COUNT, sector_count); io_write(ATA_PORT_LBA0, (uint8_t)(lba >> 0)); io_write(ATA_PORT_LBA1, (uint8_t)(lba >> 8)); @@ -274,7 +278,7 @@ namespace Kernel for (uint32_t sector = 0; sector < sector_count; sector++) { - write_buffer(ATA_PORT_DATA, (uint16_t*)buffer + sector * device.m_sector_words, device.m_sector_words); + write_buffer(ATA_PORT_DATA, (uint16_t*)buffer + sector * device.words_per_sector(), device.words_per_sector()); block_until_irq(); } } diff --git a/kernel/kernel/Storage/ATA/ATAController.cpp b/kernel/kernel/Storage/ATA/ATAController.cpp new file mode 100644 index 00000000..312ff933 --- /dev/null +++ b/kernel/kernel/Storage/ATA/ATAController.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + +namespace Kernel +{ + + BAN::ErrorOr> ATAController::create(PCI::Device& pci_device) + { + StorageController* controller_ptr = nullptr; + + switch (pci_device.subclass()) + { + case 0x01: + controller_ptr = new ATAController(pci_device); + break; + case 0x05: + dwarnln("unsupported DMA ATA Controller"); + return BAN::Error::from_errno(ENOTSUP); + case 0x06: + dwarnln("unsupported SATA Controller"); + return BAN::Error::from_errno(ENOTSUP); + default: + ASSERT_NOT_REACHED(); + } + + if (controller_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + + auto controller = BAN::UniqPtr::adopt(controller_ptr); + TRY(controller->initialize()); + return controller; + } + + BAN::ErrorOr ATAController::initialize() + { + BAN::Vector> buses; + + uint8_t prog_if = m_pci_device.read_byte(0x09); + + if (!(prog_if & ATA_PROGIF_PRIMARY_NATIVE)) + { + auto bus_or_error = ATABus::create(0x1F0, 0x3F6, 14); + if (bus_or_error.is_error()) + dprintln("IDE ATABus: {}", bus_or_error.error()); + else + TRY(buses.push_back(bus_or_error.release_value())); + } + else + { + dprintln("unsupported IDE ATABus in native mode"); + } + + // BUS 2 + if (!(prog_if & ATA_PROGIF_SECONDARY_NATIVE)) + { + auto bus_or_error = ATABus::create(0x170, 0x376, 15); + if (bus_or_error.is_error()) + dprintln("IDE ATABus: {}", bus_or_error.error()); + else + TRY(buses.push_back(bus_or_error.release_value())); + } + else + { + dprintln("unsupported IDE ATABus in native mode"); + } + + for (auto& bus : buses) + bus->initialize_devfs(); + + return {}; + } + +} \ No newline at end of file diff --git a/kernel/kernel/Storage/ATA/ATADevice.cpp b/kernel/kernel/Storage/ATA/ATADevice.cpp new file mode 100644 index 00000000..e5dfb248 --- /dev/null +++ b/kernel/kernel/Storage/ATA/ATADevice.cpp @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include + +#include + +namespace Kernel +{ + + static dev_t get_ata_dev_major() + { + static dev_t major = DevFileSystem::get().get_next_dev(); + return major; + } + + static dev_t get_ata_dev_minor() + { + static dev_t minor = 0; + return minor++; + } + + BAN::ErrorOr> ATADevice::create(BAN::RefPtr bus, ATABus::DeviceType type, bool is_secondary, BAN::Span identify_data) + { + auto* device_ptr = new ATADevice(bus, type, is_secondary); + if (device_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + auto device = BAN::RefPtr::adopt(device_ptr); + TRY(device->initialize(identify_data)); + return device; + } + + ATADevice::ATADevice(BAN::RefPtr bus, ATABus::DeviceType type, bool is_secondary) + : m_bus(bus) + , m_type(type) + , m_is_secondary(is_secondary) + , m_rdev(makedev(get_ata_dev_major(), get_ata_dev_minor())) + { } + + BAN::ErrorOr ATADevice::initialize(BAN::Span identify_data) + { + ASSERT(identify_data.size() >= 256); + + m_signature = identify_data[ATA_IDENTIFY_SIGNATURE]; + m_capabilities = identify_data[ATA_IDENTIFY_CAPABILITIES]; + + m_command_set = 0; + m_command_set |= (uint32_t)(identify_data[ATA_IDENTIFY_COMMAND_SET + 0] << 0); + m_command_set |= (uint32_t)(identify_data[ATA_IDENTIFY_COMMAND_SET + 1] << 16); + + if (!(m_capabilities & ATA_CAPABILITIES_LBA)) + return BAN::Error::from_error_code(ErrorCode::ATA_NoLBA); + + if ((identify_data[ATA_IDENTIFY_SECTOR_INFO] & (1 << 15)) == 0 && + (identify_data[ATA_IDENTIFY_SECTOR_INFO] & (1 << 14)) != 0 && + (identify_data[ATA_IDENTIFY_SECTOR_INFO] & (1 << 12)) != 0) + { + m_sector_words = *(uint32_t*)(identify_data.data() + ATA_IDENTIFY_SECTOR_WORDS); + } + else + { + m_sector_words = 256; + } + + m_lba_count = 0; + if (m_command_set & ATA_COMMANDSET_LBA48_SUPPORTED) + m_lba_count = *(uint64_t*)(identify_data.data() + ATA_IDENTIFY_LBA_COUNT_EXT); + if (m_lba_count < (1 << 28)) + m_lba_count = *(uint32_t*)(identify_data.data() + ATA_IDENTIFY_LBA_COUNT); + + for (int i = 0; i < 20; i++) + { + uint16_t word = identify_data[ATA_IDENTIFY_MODEL + i]; + m_model[2 * i + 0] = word >> 8; + m_model[2 * i + 1] = word & 0xFF; + } + m_model[40] = 0; + + dprintln("ATA disk {} MB", total_size() / 1024 / 1024); + + add_disk_cache(); + + return {}; + } + + BAN::ErrorOr ATADevice::read_sectors_impl(uint64_t lba, uint8_t sector_count, uint8_t* buffer) + { + TRY(m_bus->read(*this, lba, sector_count, buffer)); + return {}; + } + + BAN::ErrorOr ATADevice::write_sectors_impl(uint64_t lba, uint8_t sector_count, const uint8_t* buffer) + { + TRY(m_bus->write(*this, lba, sector_count, buffer)); + return {}; + } + + BAN::ErrorOr ATADevice::read_impl(off_t offset, void* buffer, size_t bytes) + { + ASSERT(offset >= 0); + if (offset % sector_size() || bytes % sector_size()) + return BAN::Error::from_errno(EINVAL); + if ((size_t)offset == total_size()) + return 0; + TRY(read_sectors(offset / sector_size(), bytes / sector_size(), (uint8_t*)buffer)); + return bytes; + } + + BAN::StringView ATADevice::name() const + { + static char device_name[] = "sda"; + device_name[2] += minor(m_rdev); + return device_name; + } + +} \ No newline at end of file diff --git a/kernel/kernel/Storage/ATAController.cpp b/kernel/kernel/Storage/ATAController.cpp deleted file mode 100644 index a4a481f3..00000000 --- a/kernel/kernel/Storage/ATAController.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -namespace Kernel -{ - - BAN::ErrorOr> ATAController::create(const PCI::Device& device) - { - ATAController* controller = new ATAController(); - if (controller == nullptr) - return BAN::Error::from_errno(ENOMEM); - BAN::ScopeGuard guard([controller] { controller->unref(); }); - TRY(controller->initialize(device)); - guard.disable(); - - auto ref_ptr = BAN::RefPtr::adopt(controller); - - DevFileSystem::get().add_device("hd"sv, ref_ptr); - - auto devices = controller->devices(); - for (size_t i = 0; i < devices.size(); i++) - { - char device_name[4] { 'h', 'd', (char)('a' + i), '\0' }; - DevFileSystem::get().add_device(device_name, devices[i]); - - if (auto res = devices[i]->initialize_partitions(); res.is_error()) - dprintln("{}", res.error()); - else - { - auto& partitions = devices[i]->partitions(); - for (size_t j = 0; j < partitions.size(); j++) - { - char partition_name[5] { 'h', 'd', (char)('a' + i), (char)('1' + j), '\0' }; - DevFileSystem::get().add_device(partition_name, partitions[j]); - } - } - } - - return ref_ptr; - } - - ATAController::ATAController() - : m_rdev(makedev(DevFileSystem::get().get_next_dev(), 0)) - { } - - BAN::ErrorOr ATAController::initialize(const PCI::Device& pci_device) - { - struct Bus - { - uint16_t base; - uint16_t ctrl; - }; - - Bus buses[2]; - buses[0].base = 0x1F0; - buses[0].ctrl = 0x3F6; - - buses[1].base = 0x170; - buses[1].ctrl = 0x376; - - uint8_t prog_if = pci_device.read_byte(0x09); - if (prog_if & 0x01) - { - buses[0].base = pci_device.read_dword(0x10) & 0xFFFFFFFC; - buses[0].ctrl = pci_device.read_dword(0x14) & 0xFFFFFFFC; - return BAN::Error::from_error_code(ErrorCode::ATA_UnsupportedDevice); - } - if (prog_if & 0x04) - { - buses[1].base = pci_device.read_dword(0x18) & 0xFFFFFFFC; - buses[1].ctrl = pci_device.read_dword(0x1C) & 0xFFFFFFFC; - return BAN::Error::from_error_code(ErrorCode::ATA_UnsupportedDevice); - } - - m_buses[0] = ATABus::create(*this, buses[0].base, buses[0].ctrl, 14); - m_buses[1] = ATABus::create(*this, buses[1].base, buses[1].ctrl, 15); - - return {}; - } - - BAN::Vector> ATAController::devices() - { - BAN::Vector> devices; - if (m_buses[0]->m_devices[0]) - MUST(devices.push_back(m_buses[0]->m_devices[0])); - if (m_buses[0]->m_devices[1]) - MUST(devices.push_back(m_buses[0]->m_devices[1])); - if (m_buses[1]->m_devices[0]) - MUST(devices.push_back(m_buses[1]->m_devices[0])); - if (m_buses[1]->m_devices[1]) - MUST(devices.push_back(m_buses[1]->m_devices[1])); - return devices; - } - -} \ No newline at end of file diff --git a/kernel/kernel/Storage/ATADevice.cpp b/kernel/kernel/Storage/ATADevice.cpp deleted file mode 100644 index 744cb3d9..00000000 --- a/kernel/kernel/Storage/ATADevice.cpp +++ /dev/null @@ -1,86 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -namespace Kernel -{ - - ATADevice::ATADevice(ATABus& bus) - : m_bus(bus) - , m_rdev(makedev(DevFileSystem::get().get_next_dev(), 0)) - { } - - BAN::ErrorOr ATADevice::initialize(ATABus::DeviceType type, const uint16_t* identify_buffer) - { - m_type = type; - - m_signature = identify_buffer[ATA_IDENTIFY_SIGNATURE]; - m_capabilities = identify_buffer[ATA_IDENTIFY_CAPABILITIES]; - - m_command_set = 0; - m_command_set |= (uint32_t)(identify_buffer[ATA_IDENTIFY_COMMAND_SET + 0] << 0); - m_command_set |= (uint32_t)(identify_buffer[ATA_IDENTIFY_COMMAND_SET + 1] << 16); - - if (!(m_capabilities & ATA_CAPABILITIES_LBA)) - return BAN::Error::from_error_code(ErrorCode::ATA_NoLBA); - - if ((identify_buffer[ATA_IDENTIFY_SECTOR_INFO] & (1 << 15)) == 0 && - (identify_buffer[ATA_IDENTIFY_SECTOR_INFO] & (1 << 14)) != 0 && - (identify_buffer[ATA_IDENTIFY_SECTOR_INFO] & (1 << 12)) != 0) - { - m_sector_words = *(uint32_t*)(identify_buffer + ATA_IDENTIFY_SECTOR_WORDS); - } - else - { - m_sector_words = 256; - } - - m_lba_count = 0; - if (m_command_set & ATA_COMMANDSET_LBA48_SUPPORTED) - m_lba_count = *(uint64_t*)(identify_buffer + ATA_IDENTIFY_LBA_COUNT_EXT); - if (m_lba_count < (1 << 28)) - m_lba_count = *(uint32_t*)(identify_buffer + ATA_IDENTIFY_LBA_COUNT); - - for (int i = 0; i < 20; i++) - { - uint16_t word = identify_buffer[ATA_IDENTIFY_MODEL + i]; - m_model[2 * i + 0] = word >> 8; - m_model[2 * i + 1] = word & 0xFF; - } - m_model[40] = 0; - - dprintln("ATA disk {} MB", total_size() / 1024 / 1024); - - add_disk_cache(); - - return {}; - } - - BAN::ErrorOr ATADevice::read_sectors_impl(uint64_t lba, uint8_t sector_count, uint8_t* buffer) - { - TRY(m_bus.read(*this, lba, sector_count, buffer)); - return {}; - } - - BAN::ErrorOr ATADevice::write_sectors_impl(uint64_t lba, uint8_t sector_count, const uint8_t* buffer) - { - TRY(m_bus.write(*this, lba, sector_count, buffer)); - return {}; - } - - BAN::ErrorOr ATADevice::read_impl(off_t offset, void* buffer, size_t bytes) - { - ASSERT(offset >= 0); - if (offset % sector_size() || bytes % sector_size()) - return BAN::Error::from_errno(EINVAL); - if ((size_t)offset == total_size()) - return 0; - TRY(read_sectors(offset / sector_size(), bytes / sector_size(), (uint8_t*)buffer)); - return bytes; - } - -} \ No newline at end of file diff --git a/kernel/kernel/Storage/StorageDevice.cpp b/kernel/kernel/Storage/StorageDevice.cpp index a545b7be..7c517d73 100644 --- a/kernel/kernel/Storage/StorageDevice.cpp +++ b/kernel/kernel/Storage/StorageDevice.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -184,7 +185,7 @@ namespace Kernel char utf8_name[36 * 4 + 1]; BAN::UTF8::from_codepoints(entry.partition_name, 36, utf8_name); - Partition* partition = new Partition( + auto partition = TRY(Partition::create( *this, entry.partition_type_guid, entry.unique_partition_guid, @@ -193,14 +194,24 @@ namespace Kernel entry.attributes, utf8_name, i + 1 - ); - ASSERT(partition != nullptr); - MUST(m_partitions.push_back(partition)); + )); + TRY(m_partitions.push_back(BAN::move(partition))); } + for (auto partition : m_partitions) + DevFileSystem::get().add_device(partition); + return {}; } + BAN::ErrorOr> Partition::create(StorageDevice& device, const GUID& type, const GUID& guid, uint64_t start, uint64_t end, uint64_t attr, const char* label, uint32_t index) + { + auto partition_ptr = new Partition(device, type, guid, start, end, attr, label, index); + if (partition_ptr == nullptr) + return BAN::Error::from_errno(ENOMEM); + return BAN::RefPtr::adopt(partition_ptr); + } + Partition::Partition(StorageDevice& device, const GUID& type, const GUID& guid, uint64_t start, uint64_t end, uint64_t attr, const char* label, uint32_t index) : BlockDevice(0660, 0, 0) , m_device(device) @@ -209,6 +220,7 @@ namespace Kernel , m_lba_start(start) , m_lba_end(end) , m_attributes(attr) + , m_name(BAN::String::formatted("{}{}", device.name(), index)) , m_rdev(makedev(major(device.rdev()), index)) { memcpy(m_label, label, sizeof(m_label)); diff --git a/kernel/kernel/Terminal/Serial.cpp b/kernel/kernel/Terminal/Serial.cpp index 5fd79384..042bf4c9 100644 --- a/kernel/kernel/Terminal/Serial.cpp +++ b/kernel/kernel/Terminal/Serial.cpp @@ -202,7 +202,7 @@ namespace Kernel } auto ref_ptr = BAN::RefPtr::adopt(tty); - DevFileSystem::get().add_device(ref_ptr->name(), ref_ptr); + DevFileSystem::get().add_device(ref_ptr); if (serial.port() == COM1_PORT) s_com1 = ref_ptr; if (serial.port() == COM2_PORT) diff --git a/kernel/kernel/Terminal/TTY.cpp b/kernel/kernel/Terminal/TTY.cpp index 2453bd6e..c25f7c38 100644 --- a/kernel/kernel/Terminal/TTY.cpp +++ b/kernel/kernel/Terminal/TTY.cpp @@ -28,11 +28,11 @@ namespace Kernel { s_tty = this; - auto inode_or_error = DevFileSystem::get().root_inode()->find_inode("tty"); + auto inode_or_error = DevFileSystem::get().root_inode()->find_inode("tty"sv); if (inode_or_error.is_error()) { if (inode_or_error.error().get_error_code() == ENOENT) - DevFileSystem::get().add_device("tty"sv, MUST(RamSymlinkInode::create(DevFileSystem::get(), s_tty->name(), 0666, 0, 0))); + DevFileSystem::get().add_inode("tty"sv, MUST(RamSymlinkInode::create(DevFileSystem::get(), s_tty->name(), 0666, 0, 0))); else dwarnln("{}", inode_or_error.error()); return; diff --git a/kernel/kernel/Terminal/VirtualTTY.cpp b/kernel/kernel/Terminal/VirtualTTY.cpp index a5fe142b..dc190f99 100644 --- a/kernel/kernel/Terminal/VirtualTTY.cpp +++ b/kernel/kernel/Terminal/VirtualTTY.cpp @@ -33,12 +33,12 @@ namespace Kernel BAN::ErrorOr> VirtualTTY::create(TerminalDriver* driver) { - auto* tty = new VirtualTTY(driver); - ASSERT(tty); + auto* tty_ptr = new VirtualTTY(driver); + ASSERT(tty_ptr); - auto ref_ptr = BAN::RefPtr::adopt(tty); - DevFileSystem::get().add_device(ref_ptr->name(), ref_ptr); - return ref_ptr; + auto tty = BAN::RefPtr::adopt(tty_ptr); + DevFileSystem::get().add_device(tty); + return tty; } VirtualTTY::VirtualTTY(TerminalDriver* driver) diff --git a/kernel/kernel/kernel.cpp b/kernel/kernel/kernel.cpp index b9a259ce..f0430fe4 100644 --- a/kernel/kernel/kernel.cpp +++ b/kernel/kernel/kernel.cpp @@ -177,6 +177,7 @@ static void init2(void*) dprintln("PCI initialized"); VirtualFileSystem::initialize(cmdline.root); + dprintln("VFS initialized"); if (auto res = PS2Controller::initialize(); res.is_error()) dprintln("{}", res.error());