From f45734c61d2c5dba8de71b9d76d58695ead080c8 Mon Sep 17 00:00:00 2001 From: apio Date: Mon, 7 Aug 2023 19:22:57 +0200 Subject: [PATCH] kernel/ATA: Stop storing ATA::Drive in a separate shared pointer --- kernel/src/arch/x86_64/disk/ATA.cpp | 19 ++++++------------- kernel/src/arch/x86_64/disk/ATA.h | 10 +++++----- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/kernel/src/arch/x86_64/disk/ATA.cpp b/kernel/src/arch/x86_64/disk/ATA.cpp index 7dc03484..e324b00c 100644 --- a/kernel/src/arch/x86_64/disk/ATA.cpp +++ b/kernel/src/arch/x86_64/disk/ATA.cpp @@ -161,7 +161,7 @@ namespace ATA { if (!(read_bm(BusmasterRegister::Status) & BMS_IRQPending)) return; - if (m_current_drive < 2 && m_drives[m_current_drive]) m_drives[m_current_drive]->irq_handler(); + if (m_current_drive < 2 && m_drives[m_current_drive].has_value()) m_drives[m_current_drive]->irq_handler(); m_irq_called = true; @@ -307,14 +307,7 @@ namespace ATA kinfoln("ata: Channel %d has a drive on slot %d!", m_channel_index, drive); - auto rc = adopt_shared_if_nonnull(new (std::nothrow) Drive(this, drive, {})); - if (rc.has_error()) - { - kinfoln("ata: Failed to create drive object: %s", rc.error_string()); - return false; - } - - m_drives[drive] = rc.release_value(); + m_drives[drive] = Drive { this, drive, {} }; if (!m_drives[drive]->initialize()) { @@ -327,7 +320,7 @@ namespace ATA for (u8 drive = 0; drive < 2; drive++) { - if (m_drives[drive]) + if (m_drives[drive].has_value()) { if (!m_drives[drive]->post_initialize()) { @@ -335,7 +328,7 @@ namespace ATA return false; } - auto rc = ATADevice::create(m_drives[drive]); + auto rc = ATADevice::create(m_drives[drive].value_ptr()); if (rc.has_error()) { @@ -723,7 +716,7 @@ namespace ATA static u32 next_minor = 0; -Result ATA::Drive::create_drive_name(SharedPtr drive) +Result ATA::Drive::create_drive_name(ATA::Drive* drive) { static u32 cd_index = 0; static u32 sd_index = 0; @@ -731,7 +724,7 @@ Result ATA::Drive::create_drive_name(SharedPtr drive) return String::format("%s%d"_sv, drive->m_is_atapi ? "cd" : "sd", drive->m_is_atapi ? cd_index++ : sd_index++); } -Result> ATADevice::create(SharedPtr drive) +Result> ATADevice::create(ATA::Drive* drive) { auto device = TRY(adopt_shared_if_nonnull(new (std::nothrow) ATADevice())); device->m_drive = drive; diff --git a/kernel/src/arch/x86_64/disk/ATA.h b/kernel/src/arch/x86_64/disk/ATA.h index 2cc4bc0b..5d9adc45 100644 --- a/kernel/src/arch/x86_64/disk/ATA.h +++ b/kernel/src/arch/x86_64/disk/ATA.h @@ -131,7 +131,7 @@ namespace ATA static constexpr u16 END_OF_PRDT = (1 << 15); - class Drive : public Shareable + class Drive { public: Drive(Channel* channel, u8 drive_index, Badge); @@ -164,7 +164,7 @@ namespace ATA Result read_lba(u64 lba, void* out, usize nblocks); - static Result create_drive_name(SharedPtr drive); + static Result create_drive_name(ATA::Drive* drive); private: bool identify_ata(); @@ -271,7 +271,7 @@ namespace ATA u8 m_current_drive = (u8)-1; - SharedPtr m_drives[2]; + Option m_drives[2]; }; class Controller : public Shareable @@ -301,7 +301,7 @@ class ATADevice : public Device { public: // Initializer for DeviceRegistry. - static Result> create(SharedPtr drive); + static Result> create(ATA::Drive* drive); Result read(u8*, usize, usize) const override; @@ -339,6 +339,6 @@ class ATADevice : public Device private: ATADevice() = default; - SharedPtr m_drive; + ATA::Drive* m_drive; String m_device_path; };