diff options
| author | Amlal <amlal@nekernel.org> | 2025-04-28 16:47:44 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-04-28 16:47:44 +0200 |
| commit | deb83a5a79f9c19842537ceab1a42fc17572ad67 (patch) | |
| tree | b8938449aedef304a66860a5aad0896ff842b0b7 /dev | |
| parent | 3ba94a1b9e1e17c4495df3d26f371486879a7184 (diff) | |
dev, kernel: HeFS improvements and tweaks.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/FSKit/HeFS.h | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 46 | ||||
| -rw-r--r-- | dev/kernel/StorageKit/DmaPool.h | 1 | ||||
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 92 |
4 files changed, 78 insertions, 63 deletions
diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 515034fc..a6fab1c5 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -28,6 +28,8 @@ #define kHeFSDefaultVoluneName u8"HeFS Volume"
+#define kHeFSINDStartLBA (sizeof(HEFS_BOOT_NODE))
+
#define kHeFSSearchAllStr u8"*"
struct HEFS_BOOT_NODE;
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 050826e3..c3c49533 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -22,25 +22,26 @@ #include <KernelKit/LockDelegate.h> #include <KernelKit/PCI/Iterator.h> #include <KernelKit/ProcessScheduler.h> +#include <KernelKit/Timer.h> #include <NewKit/Utils.h> #include <StorageKit/AHCI.h> #include <StorageKit/DmaPool.h> #include <modules/AHCI/AHCI.h> #include <modules/ATA/ATA.h> -#define kHBAErrTaskFile (1 << 30) -#define kHBAPxCmdST (0x0001) -#define kHBAPxCmdFre (0x0010) -#define kHBAPxCmdFR (0x4000) -#define kHBAPxCmdCR (0x8000) +#define kSATAErrTaskFile (1 << 30) +#define kSATAPxCmdST (0x0001) +#define kSATAPxCmdFre (0x0010) +#define kSATAPxCmdFR (0x4000) +#define kSATAPxCmdCR (0x8000) #define kSATALBAMode (1 << 6) #define kSATASRBsy (0x80) #define kSATASRDrq (0x08) -#define kHBABohcBiosOwned (1 << 0) -#define kHBABohcOSOwned (1 << 1) +#define kSATABohcBiosOwned (1 << 0) +#define kSATABohcOSOwned (1 << 1) #define kSATAPortCnt (0x20) @@ -53,6 +54,7 @@ using namespace Kernel; +STATIC HardwareTimer kSATATimer(rtl_milliseconds(5)); STATIC PCI::Device kSATADev; STATIC HbaMemRef kSATAHba; STATIC Lba kSATASectorCount = 0UL; @@ -126,6 +128,8 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz SizeT size_buffer) noexcept { NE_UNUSED(sector_sz); + lba /= sector_sz; + if (!buffer || size_buffer == 0) { kout << "Invalid buffer for AHCI I/O.\r"; err_global_get() = kErrorDisk; @@ -153,10 +157,14 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz VoidPtr ptr = rtl_dma_alloc(size_buffer, 4096); + rtl_dma_flush(ptr, size_buffer); + if (Write) { rt_copy_memory(buffer, ptr, size_buffer); } + rtl_dma_flush(ptr, size_buffer); + // Build the PRDT SizeT bytes_remaining = size_buffer; SizeT prdt_index = 0; @@ -227,7 +235,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz rtl_dma_flush(ptr, size_buffer); - if (kSATAHba->Is & kHBAErrTaskFile) { + if (kSATAHba->Is & kSATAErrTaskFile) { kout << "AHCI Task File Error during I/O.\r"; rtl_dma_free(size_buffer); @@ -264,26 +272,26 @@ SizeT drv_get_size_ahci() { STATIC BOOL ahci_enable_and_probe() { if (kSATAHba->Cap == 0x0) return NO; - kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdFre; - kSATAHba->Ports[kSATAIndex].Cmd &= ~kHBAPxCmdST; + kSATAHba->Ports[kSATAIndex].Cmd &= ~kSATAPxCmdFre; + kSATAHba->Ports[kSATAIndex].Cmd &= ~kSATAPxCmdST; while (YES) { - if (kSATAHba->Ports[kSATAIndex].Cmd & kHBAPxCmdCR) continue; + if (kSATAHba->Ports[kSATAIndex].Cmd & kSATAPxCmdCR) continue; - if (kSATAHba->Ports[kSATAIndex].Cmd & kHBAPxCmdFR) continue; + if (kSATAHba->Ports[kSATAIndex].Cmd & kSATAPxCmdFR) continue; break; } // Now we are ready. - kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre; - kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdST; + kSATAHba->Ports[kSATAIndex].Cmd |= kSATAPxCmdFre; + kSATAHba->Ports[kSATAIndex].Cmd |= kSATAPxCmdST; - if (kSATAHba->Bohc & kHBABohcBiosOwned) { - kSATAHba->Bohc |= kHBABohcOSOwned; + if (kSATAHba->Bohc & kSATABohcBiosOwned) { + kSATAHba->Bohc |= kSATABohcOSOwned; - while (kSATAHba->Bohc & kHBABohcBiosOwned) { + while (kSATAHba->Bohc & kSATABohcBiosOwned) { ; } } @@ -426,7 +434,7 @@ Bool drv_std_detected_ahci() { /// //////////////////////////////////////////////////// Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci<YES, YES, NO>(lba / sector_sz, reinterpret_cast<UInt8*>(buffer), + drv_std_input_output_ahci<YES, YES, NO>(lba, reinterpret_cast<UInt8*>(buffer), sector_sz, size_buffer); } @@ -434,7 +442,7 @@ Void drv_std_write(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) /// //////////////////////////////////////////////////// Void drv_std_read(UInt64 lba, Char* buffer, SizeT sector_sz, SizeT size_buffer) { - drv_std_input_output_ahci<NO, YES, NO>(lba / sector_sz, reinterpret_cast<UInt8*>(buffer), + drv_std_input_output_ahci<NO, YES, NO>(lba, reinterpret_cast<UInt8*>(buffer), sector_sz, size_buffer); } diff --git a/dev/kernel/StorageKit/DmaPool.h b/dev/kernel/StorageKit/DmaPool.h index 09851a0c..a5d8c880 100644 --- a/dev/kernel/StorageKit/DmaPool.h +++ b/dev/kernel/StorageKit/DmaPool.h @@ -23,7 +23,6 @@ #pragma once #include <KernelKit/DebugOutput.h> -#include "NewKit/Defines.h" #ifdef __NE_AMD64__ #define NE_DMA_POOL_START (0x1000000) diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index f4776686..4f05214a 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -91,7 +91,7 @@ namespace Detail { } else if (dir->fPrev != 0) { start = dir->fPrev; } else { - start = 0; + start += sizeof(HEFS_INDEX_NODE_DIRECTORY); } } @@ -303,15 +303,16 @@ namespace Detail { return NO; } - if (tmpdir->fDeleted) { + if (!tmpdir->fCreated && tmpdir->fDeleted) { + mnt->fPacket.fPacketLba = start; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); + mnt->fPacket.fPacketContent = dir; + dir->fChild = tmpdir->fChild; dir->fParent = tmpdir->fParent; dir->fNext = tmpdir->fNext; dir->fPrev = tmpdir->fPrev; - - mnt->fPacket.fPacketLba = start; - mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); - mnt->fPacket.fPacketContent = dir; + dir->fColor = tmpdir->fColor; mnt->fOutput(mnt->fPacket); @@ -320,13 +321,13 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(tmpdir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; } - return YES; + delete tmpdir; } - err_global_get() = kErrorFileNotFound; + err_global_get() = kErrorDiskIsFull; return NO; } @@ -376,7 +377,7 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; } delete dir; @@ -488,7 +489,7 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; } delete dir; @@ -549,7 +550,7 @@ namespace Detail { mnt->fInput(mnt->fPacket); - if (prev_node.fDeleted > 0 && !prev_node.fAccessed) { + if (prev_node.fDeleted > 0 && !prev_node.fCreated) { mnt->fPacket.fPacketLba = lba; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); mnt->fPacket.fPacketContent = node; @@ -571,7 +572,7 @@ namespace Detail { hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; } delete dir; @@ -690,7 +691,7 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; continue; } else { @@ -700,7 +701,7 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; continue; } @@ -728,7 +729,7 @@ namespace Detail { auto old_start = start; hefsi_traverse_tree(dir, root, start); - if (start == 0 || start == old_start) break; + if (start > root->fEndIND || start == old_start) break; } delete dir; @@ -820,9 +821,18 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fSectorSize = drive->fSectorSz; - Lba start = drive->fLbaStart; + Lba start = drive->fLbaStart + kHeFSINDStartLBA; + + if (start > drive->fLbaEnd) { + delete root; + root = nullptr; + + err_global_get() = kErrorDiskIsCorrupted; - root->fStartIND = start + sizeof(HEFS_BOOT_NODE); + return NO; + } + + root->fStartIND = start; root->fEndIND = drive->fLbaEnd; root->fINDCount = 0; @@ -846,13 +856,11 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fVersion = kHeFSVersion; - root->fChecksum = 0; - root->fVID = kHeFSInvalidVID; root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE)); - drive->fPacket.fPacketLba = start; + drive->fPacket.fPacketLba = drive->fLbaStart; drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); drive->fPacket.fPacketContent = root; @@ -881,6 +889,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input dir->fFlags = flags; dir->fKind = kHeFSFileKindDirectory; + dir->fCreated = 0; dir->fDeleted = kHeFSTimeMax; /// TODO: Add current time. dir->fEntryCount = 0; @@ -932,26 +941,19 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input /// @return If it was sucessful, see err_local_get(). _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Input const Int32 flags, const Utf8Char* dir) { - NE_UNUSED(drive); - NE_UNUSED(flags); - NE_UNUSED(dir); - - HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE(); - HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); + HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE(); kout << "CreateDirectory...\r"; - if (!root || !node) { + if (!root) { kout << "Error: Failed to allocate memory for boot node.\r"; - if (node) delete node; if (root) delete root; return NO; } rt_set_memory(root, 0, sizeof(HEFS_BOOT_NODE)); - rt_set_memory(node, 0, sizeof(HEFS_INDEX_NODE)); rt_copy_memory((VoidPtr) "fs/hefs-packet", drive->fPacket.fPacketMime, rt_string_len("fs/hefs-packet")); @@ -962,8 +964,6 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu drive->fInput(drive->fPacket); - Detail::hefsi_balance_filesystem(root, drive); - HEFS_INDEX_NODE_DIRECTORY* dirent = new HEFS_INDEX_NODE_DIRECTORY(); rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); @@ -980,14 +980,18 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu dirent->fFlags = flags; dirent->fChecksum = 0; + dirent->fChecksum = ke_calculate_crc32((Char*) dirent, sizeof(HEFS_INDEX_NODE_DIRECTORY)); + dirent->fEntryCount = 0; if (Detail::hefs_allocate_index_directory_node(root, drive, dirent)) { delete dirent; dirent = nullptr; - delete node; delete root; + root = nullptr; + + Detail::hefsi_balance_filesystem(root, drive); return YES; } @@ -995,8 +999,8 @@ _Output Bool HeFileSystemParser::CreateDirectory(_Input DriveTrait* drive, _Inpu delete dirent; dirent = nullptr; - delete node; delete root; + root = nullptr; return NO; } @@ -1040,8 +1044,6 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con drive->fInput(drive->fPacket); - Detail::hefsi_balance_filesystem(root, drive); - auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir); if (!dirent) { @@ -1066,16 +1068,16 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con } node->fAccessed = 0; - node->fCreated = 0; + node->fCreated = kHeFSTimeMax; node->fDeleted = 0; node->fModified = 0; node->fSize = 0; node->fKind = kHeFSFileKindRegular; node->fFlags = flags; node->fChecksum = 0; - - node->fGID = 0; - node->fUID = 0; + node->fChecksum = ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE)); + node->fGID = 0; + node->fUID = 0; urt_copy_memory((VoidPtr) name, node->fName, urt_string_len(name)); @@ -1083,6 +1085,8 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con delete node; delete root; + Detail::hefsi_balance_filesystem(root, drive); + return YES; } @@ -1092,19 +1096,21 @@ _Output Bool HeFileSystemParser::CreateFile(_Input DriveTrait* drive, _Input con return NO; } +STATIC DriveTrait kMountPoint; + /// @brief Initialize the HeFS filesystem. /// @return To check its status, see err_local_get(). Boolean fs_init_hefs(Void) noexcept { kout << "Creating HeFS disk...\r"; - auto drv = io_construct_main_drive(); + kMountPoint = io_construct_main_drive(); - if (drv.fPacket.fPacketReadOnly == YES) + if (kMountPoint.fPacket.fPacketReadOnly == YES) ke_panic(RUNTIME_CHECK_FILESYSTEM, "Main disk cannot be mounted."); HeFileSystemParser parser; - parser.Format(&drv, kHeFSEncodingUTF8, kHeFSDefaultVoluneName); + parser.Format(&kMountPoint, kHeFSEncodingUTF8, kHeFSDefaultVoluneName); return YES; } |
