From 59bb4017bff80dcbb0a05c6339720b0556c1967e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 21 Mar 2025 15:13:19 +0100 Subject: kernel(storage): Add two functions, sk_io_read_ahci and sk_io_write_ahci. To avoid using lambdas inside the device initialization expression. This leads to the following: - Better readability. - Much more predictible code. - And a check on *disk* which could've been invalid memory area (NULL address here) Signed-off-by: Amlal El Mahrouss --- dev/Kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 52 +++++++++++++++++++------ 1 file changed, 41 insertions(+), 11 deletions(-) (limited to 'dev/Kernel') diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index ae0ae239..23ac2aeb 100644 --- a/dev/Kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -321,22 +321,52 @@ namespace NeOS return pi; } + namespace Detail + { + /// @brief Read AHCI device. + /// @param self device + /// @param mnt mounted disk. + STATIC Void sk_io_read_ahci(IDeviceObject* self, MountpointInterface* mnt) + { + AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; + + if (!dev) + return; + + auto disk = mnt->GetAddressOf(dev->GetIndex()); + + if (!disk) + return; + + drv_std_input_output(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); + } + + /// @brief Write AHCI device. + /// @param self device + /// @param mnt mounted disk. + STATIC Void sk_io_write_ahci(IDeviceObject* self, MountpointInterface* mnt) + { + AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; + + if (!dev) + return; + + auto disk = mnt->GetAddressOf(dev->GetIndex()); + + if (!disk) + return; + + drv_std_input_output(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); + } + } + ErrorOr sk_acquire_ahci_device(Int32 drv_index) { if (!drv_std_detected_ahci()) return ErrorOr(kErrorDisk); - AHCIDeviceInterface device([](IDeviceObject* self, MountpointInterface* mnt) -> void { - AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; - - auto disk = mnt->GetAddressOf(dev->GetIndex()); - drv_std_input_output(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); }, - [](IDeviceObject* self, MountpointInterface* mnt) -> void { - AHCIDeviceInterface* dev = (AHCIDeviceInterface*)self; - - auto disk = mnt->GetAddressOf(dev->GetIndex()); - drv_std_input_output(disk->fPacket.fPacketLba, (UInt8*)disk->fPacket.fPacketContent, kAHCISectorSize, disk->fPacket.fPacketSize); - }, + AHCIDeviceInterface device(Detail::sk_io_read_ahci, + Detail::sk_io_write_ahci, nullptr); device.SetPortsImplemented(kSATAPortsImplemented); -- cgit v1.2.3