From 112b6915a8b889e8d8d8a167c2af01275fefa594 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 5 Apr 2025 18:53:14 +0200 Subject: AHCI+Generic.cc: a little but important tweak regarding AHCI generic driver. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 37 ++++++++++--------------- 1 file changed, 15 insertions(+), 22 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 8d053d8b..8bb7170d 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -356,45 +356,30 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) pi = ports_implemented; - const UInt16 kMaxPortsImplemented = kSATAPortCnt; + const UInt16 kSATAMaxPortsImplemented = ports_implemented; const UInt32 kSATASignature = kSATASig; const UInt32 kSATAPISignature = kSATAPISig; const UInt8 kSATAPresent = 0x03; const UInt8 kSATAIPMActive = 0x01; - kSATAHba = mem_ahci; + if (kSATAMaxPortsImplemented < 1) + continue; while (ports_implemented) { UInt8 ipm = (mem_ahci->Ports[ahci_index].Ssts >> 8) & 0x0F; - UInt8 det = mem_ahci->Ports[ahci_index].Ssts & 0x0F; + UInt8 det = (mem_ahci->Ports[ahci_index].Ssts & 0x0F); if (det != kSATAPresent || ipm != kSATAIPMActive) continue; - if (mem_ahci->Ports[ahci_index].Sig == kSATASignature) + if ((mem_ahci->Ports[ahci_index].Sig == kSATASignature) || + (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig)) { kSATAIndex = ahci_index; kSATAHba = mem_ahci; - if (ahci_enable_and_probe()) - { - err_global_get() = kErrorSuccess; - - return YES; - } - } - else if (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig) - { - kSATAIndex = ahci_index; - kSATAHba = mem_ahci; - - if (ahci_enable_and_probe()) - { - err_global_get() = kErrorSuccess; - - return YES; - } + goto success_hba_fetch; } ports_implemented >>= 1; @@ -406,6 +391,14 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) err_global_get() = kErrorDisk; return NO; + +success_hba_fetch: + if (ahci_enable_and_probe()) + { + err_global_get() = kErrorSuccess; + + return YES; + } } /// @brief Checks if an AHCI device is detected. -- cgit v1.2.3 From 460999b964114f98b219ec3488bd32ad9236332b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Apr 2025 08:03:27 +0200 Subject: adding an align function designed for AHCI's needs and drivemgr's AHCI detection system. Signed-off-by: Amlal El Mahrouss --- dev/boot/amd64-ci.make | 2 +- dev/boot/src/HEL/AMD64/BootEFI.cc | 2 +- dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 1 - dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 46 ++++++++++++++++--------- dev/kernel/src/DriveMgr.cc | 5 ++- 5 files changed, 33 insertions(+), 23 deletions(-) (limited to 'dev/kernel') diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make index 3c7c6527..bdb4545f 100644 --- a/dev/boot/amd64-ci.make +++ b/dev/boot/amd64-ci.make @@ -49,7 +49,7 @@ DEBUG_MACRO = -D__DEBUG__ endif ifeq ($(shell uname), Darwin) -EMU_FLAGS=-M q35 -smp 4 -m 8G \ +EMU_FLAGS=-M q35 -smp 4 -m 8G \ -bios $(BIOS) -cdrom $(BOOT) -boot d endif diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index ef9af9ca..2cc71367 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -220,7 +220,7 @@ EFI_EXTERN_C EFI_API Int32 ModuleMain(EfiHandlePtr image_handle, // Update handover file specific table and phyiscal start field. //-------------------------------------------------------------// - handover_hdr->f_BitMapStart = (VoidPtr)struct_ptr[lookup_index].VirtualStart; /* Start of bitmap. */ + handover_hdr->f_BitMapStart = (VoidPtr)(struct_ptr[lookup_index].VirtualStart); /* Start of bitmap. */ handover_hdr->f_BitMapSize = struct_ptr[lookup_index].NumberOfPages * kib_cast(4); /* Size of bitmap in bytes. */ handover_hdr->f_FirmwareCustomTables[0] = (VoidPtr)BS; diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index 77f1d9a1..cc34b99f 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -98,7 +98,6 @@ __NE_INT_3: out 0x20, al push rcx - mov rcx, rsp call idt_handle_generic pop rcx diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 8bb7170d..3336e20e 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -67,6 +67,22 @@ STATIC Int32 drv_find_cmd_slot_ahci(HbaPort* port) noexcept; STATIC Void drv_compute_disk_ahci() noexcept; +namespace AHCI::Detail +{ + template + RetType* ahci_align_address(RetType* address, Int32 alignement) + { + if (!address) + return nullptr; + + UIntPtr addr = (UIntPtr)address; + + UIntPtr aligned_addr = (addr + alignement - 1) & ~alignement - 1; + + return (RetType*)aligned_addr; + } +} // namespace AHCI::Detail + STATIC Void drv_compute_disk_ahci() noexcept { kSATASectorCount = 0UL; @@ -75,7 +91,7 @@ STATIC Void drv_compute_disk_ahci() noexcept const UInt16 kSzIdent = 256; /// Push it to the stack - UInt16* identify_data ATTRIBUTE(aligned(4096)) = new UInt16[kSzIdent]; + UInt16* identify_data ATTRIBUTE(aligned(kib_cast(1))) = AHCI::Detail::ahci_align_address(new UInt16[kSzIdent], kib_cast(1)); /// Send AHCI command for identification. drv_std_input_output_ahci(0, (UInt8*)identify_data, kAHCISectorSize, kSzIdent); @@ -166,7 +182,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz for (UInt16 i = 0; i < prdt_count; ++i) { - UInt32 chunk = (bytes_remaining > kMaxPRDSize) ? kMaxPRDSize : bytes_remaining; + UInt32 chunk = bytes_remaining / prdt_count; if (chunk == 0) break; @@ -277,8 +293,8 @@ STATIC BOOL ahci_enable_and_probe() // Relocate Command List Base. - auto const addr = mm_new_heap(kib_cast(64), YES, NO, 0); - auto kAHCIBaseAddress = (UIntPtr)addr; + VoidPtr const kAHCIBasePtr = AHCI::Detail::ahci_align_address(mm_new_heap(kib_cast(64), YES, NO, 0), kib_cast(1)); + UIntPtr const kAHCIBaseAddress = reinterpret_cast(kAHCIBasePtr); port->Clb = kAHCIBaseAddress + (kSATAIndex << 10); port->Clbu = 0; @@ -288,7 +304,7 @@ STATIC BOOL ahci_enable_and_probe() // Relocate Frame Info Structure now. - port->Fb = kAHCIBaseAddress + (kSATAPortCnt << 10) + (kSATAIndex << 10); + port->Fb = (UInt32)(UIntPtr)(UIntPtr*)AHCI::Detail::ahci_align_address((UInt32*)(kAHCIBaseAddress + (kSATAPortCnt << 10) + (kSATAIndex << 10)), kib_cast(1)); port->Fbu = 0; // clean it. @@ -299,18 +315,12 @@ STATIC BOOL ahci_enable_and_probe() for (Int32 i = 0; i < kSATAPortCnt; i++) { cmd_hdr[i].Prdtl = 8; - cmd_hdr[i].Ctba = kAHCIBaseAddress + (40 << 10) + (kSATAPortCnt << 10) + (kSATAIndex << 10); + cmd_hdr[i].Ctba = (UInt32)(UIntPtr)(UIntPtr*)AHCI::Detail::ahci_align_address((UInt32*)(kAHCIBaseAddress + (40 << 10) + (kSATAPortCnt << 10) + (kSATAIndex << 10)), kib_cast(1)); cmd_hdr[i].Ctbau = 0; rt_set_memory(reinterpret_cast(cmd_hdr[i].Ctba), 0, 256); } - for (UIntPtr offset = 0; offset < kib_cast(64); offset += kib_cast(1)) - { - VoidPtr addr = reinterpret_cast(kAHCIBaseAddress + offset); - HAL::mm_map_page(addr, addr, HAL::kMMFlagsWr); - } - // Now we are ready. kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre; @@ -357,10 +367,10 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) pi = ports_implemented; const UInt16 kSATAMaxPortsImplemented = ports_implemented; - const UInt32 kSATASignature = kSATASig; - const UInt32 kSATAPISignature = kSATAPISig; - const UInt8 kSATAPresent = 0x03; - const UInt8 kSATAIPMActive = 0x01; + const UInt32 kSATASignature = kSATASig; + const UInt32 kSATAPISignature = kSATAPISig; + const UInt8 kSATAPresent = 0x03; + const UInt8 kSATAIPMActive = 0x01; if (kSATAMaxPortsImplemented < 1) continue; @@ -399,6 +409,8 @@ success_hba_fetch: return YES; } + + return NO; } /// @brief Checks if an AHCI device is detected. @@ -411,7 +423,7 @@ Bool drv_std_detected_ahci() // ================================================================================================ // -// This applies only if we compile with AHCI as a default disk driver. +/// @note This applies only if we compile with AHCI as a default disk driver. // // ================================================================================================ diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index c83e63c8..a3087979 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -89,12 +89,11 @@ namespace Kernel #elif defined(__AHCI__) kAHCIPortsImplemented = 0; - if (!drv_std_init(kAHCIPortsImplemented)) + if (drv_std_init(kAHCIPortsImplemented)) { - return; + pckt.fPacketGood = YES; } - pckt.fPacketGood = YES; #endif // if defined(__ATA_PIO__) || defined (__ATA_DMA__) } -- cgit v1.2.3 From 2998c211a523673dcf50ad3f6973996f89fc7e5b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Apr 2025 08:14:54 +0200 Subject: kernel/storage: use correct if branching to avoid future compiler errors. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/DriveMgr.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index a3087979..36e0a7e4 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -105,23 +105,20 @@ namespace Kernel { return "ATA-PIO"; } -#endif -#ifdef __ATA_DMA__ +#elif defined(__ATA_DMA__) const Char* io_drv_kind(Void) { return "ATA-DMA"; } -#endif -#ifdef __AHCI__ +#elif defined( __AHCI__) const Char* io_drv_kind(Void) { return "AHCI"; } -#endif -#ifdef __NE_MINIMAL_OS__ +#else const Char* io_drv_kind(Void) { - return "Not Loaded"; + return "null"; } #endif -- cgit v1.2.3 From 78a02453f8da25a0f29bf486ee4f41f12a7f7495 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Apr 2025 16:25:31 +0200 Subject: fs/nefs: Optimize ::Format method for EPM inside NeFileSystemParser. TL;DR: - Avoiding unecessary delays, when copying filesystem name to part block (EPM) Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/FS/NeFS.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/src/FS/NeFS.cc b/dev/kernel/src/FS/NeFS.cc index 90c5995a..85e2cd6e 100644 --- a/dev/kernel/src/FS/NeFS.cc +++ b/dev/kernel/src/FS/NeFS.cc @@ -505,12 +505,11 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const L constexpr auto kFsName = "NeFS"; constexpr auto kBlockName = "NeKernel:"; - rt_copy_memory(reinterpret_cast(const_cast(kFsName)), epm_boot->Fs, rt_string_len(kFsName)); - epm_boot->FsVersion = kNeFSVersionInteger; epm_boot->LbaStart = start; epm_boot->SectorSz = kNeFSSectorSz; + rt_copy_memory(reinterpret_cast(const_cast(kFsName)), epm_boot->Fs, rt_string_len(kFsName)); rt_copy_memory(reinterpret_cast(const_cast(kBlockName)), epm_boot->Name, rt_string_len(kBlockName)); rt_copy_memory(reinterpret_cast(const_cast(kEPMMagic)), epm_boot->Magic, rt_string_len(kEPMMagic)); -- cgit v1.2.3 From a4974ed81a6f695a4ecdea87401d6ca83432d671 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Apr 2025 18:55:40 +0200 Subject: fs/NeFS.cc: `buf` must be zeroed out. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/FS/NeFS.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev/kernel') diff --git a/dev/kernel/src/FS/NeFS.cc b/dev/kernel/src/FS/NeFS.cc index 85e2cd6e..7bc02b39 100644 --- a/dev/kernel/src/FS/NeFS.cc +++ b/dev/kernel/src/FS/NeFS.cc @@ -515,7 +515,7 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const L Lba outEpmLba = kEPMBootBlockLba; - Char buf[kNeFSSectorSz]; + Char buf[kNeFSSectorSz] = {0}; Lba prevStart = 0; SizeT cnt = 0; -- cgit v1.2.3 From 61abe38f4be380ce02c95a713c9e86cce1697283 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 7 Apr 2025 07:23:07 +0200 Subject: kernel/ufs: Remove invalid macros. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc | 3 --- 1 file changed, 3 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc b/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc index 2aeb0932..1529e158 100644 --- a/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc +++ b/dev/kernel/HALKit/ARM64/Storage/UFS+Generic.cc @@ -6,6 +6,3 @@ /// @file UFS.cc /// @brief UFS Flash Memory support. - -#define UFS_PCI_VENDOR_ID (0x01001) /* AKER */ -#define UFS_PCI_DEVICE_ID (0xAEAEA) /* AKER */ \ No newline at end of file -- cgit v1.2.3 From 135568a8182e29a19531ff5de0f77120fbcf8d9b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 8 Apr 2025 09:42:15 +0200 Subject: pci, Device.h: minor tweaks. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/PCI/Device.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/KernelKit/PCI/Device.h b/dev/kernel/KernelKit/PCI/Device.h index 2c92ba4f..8f55b7c7 100644 --- a/dev/kernel/KernelKit/PCI/Device.h +++ b/dev/kernel/KernelKit/PCI/Device.h @@ -24,10 +24,9 @@ namespace Kernel::PCI Device() = default; public: - explicit Device(UShort bus, UShort device, UShort function, UInt32 bar); + Device(UShort bus, UShort device, UShort function, UInt32 bar); Device& operator=(const Device&) = default; - Device(const Device&) = default; ~Device(); -- cgit v1.2.3 From 1f6dd86d548ec8194c79bd9e2a8b27991061cd9e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 8 Apr 2025 09:59:08 +0200 Subject: pci, Device.h: use sizeof UInt32 instead of relying on a number. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/PCI/Device.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev/kernel') diff --git a/dev/kernel/KernelKit/PCI/Device.h b/dev/kernel/KernelKit/PCI/Device.h index 8f55b7c7..9b750e43 100644 --- a/dev/kernel/KernelKit/PCI/Device.h +++ b/dev/kernel/KernelKit/PCI/Device.h @@ -42,14 +42,14 @@ namespace Kernel::PCI template UInt Read(UInt bar) { - static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported"); + static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported"); return Read(bar, sizeof(T)); } template void Write(UInt bar, UIntPtr data) { - static_assert(sizeof(T) <= 4, "64-bit PCI addressing is unsupported"); + static_assert(sizeof(T) <= sizeof(UInt32), "64-bit PCI addressing is unsupported"); Write(bar, data, sizeof(T)); } -- cgit v1.2.3