From 69fffdd906c02b6ea65f5346c31719ea0f8c3bbc Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 6 May 2025 15:45:48 +0200 Subject: feat(kernel): Working on the last parts of HeFS V1, which will act as the base layer of the filesystem. Signed-off-by: Amlal --- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 348 +++++++++++++++++++---------- 1 file changed, 226 insertions(+), 122 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index b3e1d4d0..97afd614 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -37,7 +37,7 @@ namespace Detail { /***********************************************************************************/ /// @brief Get the index node of a file or directory. /// @param root The root node of the filesystem. - /// @param mnt The drive to read from. + /// @param mnt The mnt to read from. /// @param dir_name The name of the directory. /// @param file_name The name of the file. /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic @@ -52,7 +52,7 @@ namespace Detail { /***********************************************************************************/ /// @brief Allocate a new index node-> /// @param root The root node of the filesystem. - /// @param mnt The drive to read/write from. + /// @param mnt The mnt to read/write from. /// @param dir_name The name of the parent directory. /// @return Status, see err_global_get(). /***********************************************************************************/ @@ -63,14 +63,14 @@ namespace Detail { /***********************************************************************************/ /// @brief Balance RB-Tree of the filesystem. /// @param root The root node of the filesystem. - /// @param mnt The drive to read/write from. + /// @param mnt The mnt to read/write from. /// @return Status, see err_global_get(). /***********************************************************************************/ STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* root, DriveTrait* mnt); /// @brief Alllocate IND from boot node. /// @param root The root node of the filesystem. - /// @param mnt The drive to read from. + /// @param mnt The mnt to read from. /// @param dir_name The name of the directory. /// @param dir_name The parent of the directory. /// @param flags Directory flags. @@ -165,7 +165,7 @@ namespace Detail { if (try_new) start += sizeof(HEFS_INDEX_NODE_DIRECTORY); if (start == 0) start = ind_start; - (Void)(kout << "LBA_" << number(start) << kendl); + (Void)(kout << "LBA_" << hex_number(start) << kendl); } /***********************************************************************************/ @@ -254,7 +254,7 @@ namespace Detail { /// @brief Alllocate IND from boot node. /// @param root The root node of the filesystem. - /// @param mnt The drive to read from. + /// @param mnt The mnt to read from. /// @param dir_name The name of the directory. /// @param dir_name The parent of the directory. /// @param flags Directory flags. @@ -449,7 +449,7 @@ namespace Detail { /// @brief Get the index node of a file or directory. /// @param root The root node of the filesystem. - /// @param mnt The drive to read from. + /// @param mnt The mnt to read from. /// @param dir_name The name of the directory. /// @param file_name The name of the file. /// @param kind The kind of the file (regular, directory, block, character, FIFO, socket, symbolic @@ -460,16 +460,6 @@ namespace Detail { const Utf8Char* file_name, UInt8 kind, SizeT* cnt) { if (mnt) { - HEFS_INDEX_NODE* node_arr = new HEFS_INDEX_NODE[*cnt]; - - if (!node_arr) { - return nullptr; - } - - HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE)); - HEFS_INDEX_NODE_DIRECTORY* dir = - (HEFS_INDEX_NODE_DIRECTORY*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE_DIRECTORY)); - auto start = root->fStartIND; if (start > root->fEndIND) return nullptr; @@ -477,6 +467,15 @@ namespace Detail { auto start_cnt = 0UL; + HEFS_INDEX_NODE* node_arr = new HEFS_INDEX_NODE[*cnt + 1]; + + if (!node_arr) { + return nullptr; + } + + HEFS_INDEX_NODE_DIRECTORY* dir = + (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + while (YES) { mnt->fPacket.fPacketLba = start; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); @@ -484,46 +483,41 @@ namespace Detail { mnt->fInput(mnt->fPacket); - if (!mnt->fPacket.fPacketGood) { - err_global_get() = kErrorFileNotFound; + if (hefsi_hash_64(dir_name) == dir->fHashPath && dir->fKind == kHeFSFileKindDirectory) { + for (SizeT inode_index = 0UL; inode_index < kHeFSSliceCount; ++inode_index) { + if (dir->fINSlices[inode_index] != 0) { + HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) RTL_ALLOCA(sizeof(HEFS_INDEX_NODE)); - delete[] node_arr; - return nullptr; - } + mnt->fPacket.fPacketLba = dir->fINSlices[inode_index]; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); + mnt->fPacket.fPacketContent = node; - if (dir->fKind == kHeFSFileKindDirectory) { - if (hefsi_hash_64(dir_name) == dir->fHashPath || - KStringBuilder::Equals(dir_name, kHeFSSearchAllStr)) { - if (ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)) != - dir->fChecksum) - ke_panic(RUNTIME_CHECK_FILESYSTEM, "CRC32 checksum failed on HeFS IND!"); - - for (SizeT inode_index = 0UL; inode_index < kHeFSSliceCount; ++inode_index) { - if (dir->fINSlices[inode_index] != 0) { - if (ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE)) != node->fChecksum) - ke_panic(RUNTIME_CHECK_FILESYSTEM, "CRC32 failure on HeFS IND!"); - - if (hefsi_hash_64(file_name) == node->fHashPath && node->fKind == kind) { - node_arr[start_cnt] = *node; - ++start_cnt; - - if (start_cnt > *cnt) { - err_global_get() = kErrorSuccess; - return node_arr; - } + mnt->fInput(mnt->fPacket); + + if (hefsi_hash_64(file_name) == node->fHashPath && node->fKind == kind) { + node_arr[start_cnt] = *node; + ++start_cnt; + + if (start_cnt > *cnt) { + err_global_get() = kErrorSuccess; + + delete dir; + + return node_arr; } } } - } else if (dir->fHashPath == 0) { - break; } } hefsi_traverse_tree(dir, mnt, root->fStartIND, start, YES); - if (start > root->fEndIND || start == 0) break; + if (start > root->fEndIND) break; } - err_global_get() = kErrorSuccess; + node_arr[start_cnt + 1].fDeleted = 1UL; + err_global_get() = kErrorSuccess; + delete dir; + return node_arr; } @@ -567,15 +561,10 @@ namespace Detail { if (dir->fINSlices[inode_index] == 0 && !delete_or_create) { dir->fINSlices[inode_index] = root->fStartIN; - root->fStartIN += sizeof(HEFS_INDEX_NODE); - - mnt->fPacket.fPacketLba = mnt->fLbaStart; - mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); - mnt->fPacket.fPacketContent = root; - mnt->fOutput(mnt->fPacket); ++dir->fEntryCount; + dir->fChecksum = ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)); mnt->fPacket.fPacketLba = start; @@ -586,12 +575,36 @@ namespace Detail { auto lba = dir->fINSlices[inode_index]; + node->fChecksum = ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE)); + + node->fOffsetSlices = root->fStartBlock; + + auto offset = 0; + + SizeT cnt = 0ULL; + + while (cnt < kHeFSSliceCount) { + HEFS_INODE_SLICE& slice = node->fSlices[cnt]; + slice.fBase = offset; + slice.fLength = kHeFSBlockLen; + offset += kHeFSBlockLen; + + ++cnt; + } + mnt->fPacket.fPacketLba = lba; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); mnt->fPacket.fPacketContent = node; mnt->fOutput(mnt->fPacket); + root->fStartIN += sizeof(HEFS_INDEX_NODE); + root->fStartBlock += (kHeFSSliceCount * kHeFSBlockLen); + + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; + mm_delete_heap(dir); return YES; @@ -617,6 +630,7 @@ namespace Detail { } root->fStartIN -= sizeof(HEFS_INDEX_NODE); + root->fStartBlock -= (kHeFSSliceCount * kHeFSBlockLen); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); @@ -664,7 +678,7 @@ namespace Detail { /// @brief Balance RB-Tree of the filesystem. /// @param root The root node of the filesystem. - /// @param mnt The drive to read/write from. + /// @param mnt The mnt to read/write from. /// @return Status, see err_global_get(). STATIC ATTRIBUTE(unused) _Output BOOL hefsi_balance_ind(HEFS_BOOT_NODE* root, DriveTrait* mnt) { if (mnt) { @@ -739,16 +753,16 @@ namespace Detail { /// @note This is certainly take longer to format a disk with it, but worth-it in the long run. namespace Kernel::HeFS { -/// @brief Make a EPM+HeFS drive out of the disk. -/// @param drive The drive to write on. +/// @brief Make a EPM+HeFS mnt out of the disk. +/// @param mnt The mnt to write on. /// @return If it was sucessful, see err_local_get(). -_Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const Int32 flags, +_Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input const Int32 flags, _Input const Utf8Char* vol_name) { // Verify Disk. - drive->fVerify(drive->fPacket); + mnt->fVerify(mnt->fPacket); // if disk isn't good, then error out. - if (false == drive->fPacket.fPacketGood) { + if (false == mnt->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; return false; } @@ -761,13 +775,13 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); - drive->fPacket.fPacketLba = drive->fLbaStart; - drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); - drive->fPacket.fPacketContent = root; + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; - drive->fInput(drive->fPacket); + mnt->fInput(mnt->fPacket); - if (!drive->fPacket.fPacketGood) { + if (!mnt->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; return NO; @@ -792,13 +806,13 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", drive->fPacket.fPacketMime, + rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, rt_string_len("fs/hefs-packet")); urt_copy_memory((VoidPtr) vol_name, root->fVolName, urt_string_len(vol_name) + 1); rt_copy_memory((VoidPtr) kHeFSMagic, root->fMagic, kHeFSMagicLen - 1); - if (drive->fLbaStart > drive->fLbaEnd) { + if (mnt->fLbaStart > mnt->fLbaEnd) { err_global_get() = kErrorDiskIsCorrupted; return NO; @@ -807,16 +821,16 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fBadSectors = 0; root->fSectorCount = drv_std_get_sector_count(); - root->fSectorSize = drive->fSectorSz; + root->fSectorSize = mnt->fSectorSz; MUST_PASS(root->fSectorSize); - const SizeT max_lba = drive->fLbaEnd / root->fSectorSize; + const SizeT max_lba = mnt->fLbaEnd / root->fSectorSize; const SizeT dir_max = max_lba / 20; // 20% for directory metadata const SizeT inode_max = max_lba / 20; // 10% for inodes - root->fStartIND = drive->fLbaStart + kHeFSINDStartOffset; + root->fStartIND = mnt->fLbaStart + kHeFSINDStartOffset; root->fEndIND = root->fStartIND + dir_max; root->fStartIN = root->fEndIND + sizeof(HEFS_INDEX_NODE_DIRECTORY); @@ -827,20 +841,21 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fINDCount = 0; // let's lie here. - root->fDiskSize = drive->fLbaEnd; + root->fDiskSize = mnt->fLbaEnd; root->fDiskStatus = kHeFSStatusUnlocked; root->fDiskFlags = flags; - if (drive->fKind & kMassStorageDrive) { - } else if (drive->fKind & kHeFSOpticalDrive) { + if (mnt->fKind & kMassStorageDrive) { + root->fDiskKind = kHeFSMassStorageDevice; + } else if (mnt->fKind & kHeFSOpticalDrive) { root->fDiskKind = kHeFSOpticalDrive; } else { root->fDiskKind = kHeFSUnknown; } - root->fReserved = 0; - root->fReserved1 = 0; + root->fStartBlock = root->fEndIN + sizeof(HEFS_INDEX_NODE); + root->fEndBlock = mnt->fLbaEnd; root->fVersion = kHeFSVersion; @@ -848,20 +863,23 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input root->fChecksum = ke_calculate_crc32((Char*) root, sizeof(HEFS_BOOT_NODE)); - drive->fPacket.fPacketLba = drive->fLbaStart; - drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); - drive->fPacket.fPacketContent = root; + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; - drive->fOutput(drive->fPacket); + mnt->fOutput(mnt->fPacket); - (Void)(kout << "Protocol: " << drive->fProtocol() << kendl); + (Void)(kout << "Protocol: " << mnt->fProtocol() << kendl); (Void)(kout8 << u8"Volume Name: " << root->fVolName << kendl8); (Void)(kout << "Start IND: " << hex_number(root->fStartIND) << kendl); + (Void)(kout << "End IND: " << hex_number(root->fEndIND) << kendl); + (Void)(kout << "Start IN: " << hex_number(root->fStartIN) << kendl); + (Void)(kout << "End IN: " << hex_number(root->fEndIN) << kendl); (Void)(kout << "Number of IND: " << hex_number(root->fINDCount) << kendl); (Void)(kout << "Sector Size: " << hex_number(root->fSectorSize) << kendl); - (Void)(kout << "Drive Kind:" << Detail::hefs_drive_kind_to_string(root->fDiskKind) << kendl); + (Void)(kout << "Drive Kind: " << Detail::hefs_drive_kind_to_string(root->fDiskKind) << kendl); - if (!drive->fPacket.fPacketGood) { + if (!mnt->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; return NO; @@ -871,7 +889,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input u8"/network", u8"/devices", u8"/media"}; for (SizeT i = 0; i < kHeFSPreallocateCount; ++i) { - this->CreateINodeDirectory(drive, kHeFSEncodingFlagsUTF8, kFileMap[i]); + this->CreateINodeDirectory(mnt, kHeFSEncodingFlagsUTF8, kFileMap[i]); } err_global_get() = kErrorSuccess; @@ -880,13 +898,14 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input } /// @brief Create a new directory on the disk. -/// @param drive The drive to write on. +/// @param mnt The mnt to write on. /// @param flags The flags to use. /// @param dir The directory to create the file in. /// @return If it was sucessful, see err_local_get(). -_Output Bool HeFileSystemParser::INodeDirectoryCtl_(_Input DriveTrait* drive, - _Input const Int32 flags, const Utf8Char* dir, - const BOOL delete_or_create) { +_Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, + _Input const Int32 flags, + const Utf8Char* dir, + const BOOL delete_or_create) { if (urt_string_len(dir) > kHeFSFileNameLen) { err_global_get() = kErrorDisk; return NO; @@ -894,14 +913,19 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtl_(_Input DriveTrait* drive, HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_heap(sizeof(HEFS_BOOT_NODE), Yes, No); - rt_copy_memory((VoidPtr) "fs/hefs-packet", drive->fPacket.fPacketMime, + rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, rt_string_len("fs/hefs-packet")); - drive->fPacket.fPacketLba = drive->fLbaStart; - drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); - drive->fPacket.fPacketContent = root; + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; + + mnt->fInput(mnt->fPacket); - drive->fInput(drive->fPacket); + if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { + err_global_get() = kErrorDisk; + return YES; + } if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { err_global_get() = kErrorDiskIsCorrupted; @@ -919,9 +943,9 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtl_(_Input DriveTrait* drive, return NO; } - if (Detail::hefsi_update_ind_status(root, drive, dir, flags, delete_or_create)) { + if (Detail::hefsi_update_ind_status(root, mnt, dir, flags, delete_or_create)) { // todo: make it smarter for high-throughput. - Detail::hefsi_balance_ind(root, drive); + Detail::hefsi_balance_ind(root, mnt); mm_delete_heap((VoidPtr) root); return YES; @@ -931,37 +955,114 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtl_(_Input DriveTrait* drive, return NO; } -_Output Bool HeFileSystemParser::RemoveINodeDirectory(_Input DriveTrait* drive, +_Output Bool HeFileSystemParser::RemoveINodeDirectory(_Input DriveTrait* mnt, _Input const Int32 flags, const Utf8Char* dir) { - return this->INodeDirectoryCtl_(drive, flags, dir, YES); + return this->INodeDirectoryCtlManip(mnt, flags, dir, YES); } -_Output Bool HeFileSystemParser::CreateINodeDirectory(_Input DriveTrait* drive, +_Output Bool HeFileSystemParser::CreateINodeDirectory(_Input DriveTrait* mnt, _Input const Int32 flags, const Utf8Char* dir) { - return this->INodeDirectoryCtl_(drive, flags, dir, NO); + return this->INodeDirectoryCtlManip(mnt, flags, dir, NO); +} + +_Output Bool HeFileSystemParser::DeleteINode(_Input DriveTrait* mnt, _Input const Int32 flags, + const Utf8Char* dir, const Utf8Char* name, + const UInt8 kind) { + return this->INodeCtlManip(mnt, flags, dir, name, YES, kind); } -_Output Bool HeFileSystemParser::DeleteINode(_Input DriveTrait* drive, _Input const Int32 flags, - const Utf8Char* dir, const Utf8Char* name) { - return this->INodeCtl_(drive, flags, dir, name, YES); +_Output Bool HeFileSystemParser::CreateINode(_Input DriveTrait* mnt, _Input const Int32 flags, + const Utf8Char* dir, const Utf8Char* name, + const UInt8 kind) { + return this->INodeCtlManip(mnt, flags, dir, name, NO, kind); } -_Output Bool HeFileSystemParser::CreateINode(_Input DriveTrait* drive, _Input const Int32 flags, - const Utf8Char* dir, const Utf8Char* name) { - return this->INodeCtl_(drive, flags, dir, name, NO); +_Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr block, SizeT block_sz, + const Utf8Char* dir, const UInt8 kind, + const Utf8Char* name, const BOOL in) { + if (urt_string_len(dir) > kHeFSFileNameLen) { + err_global_get() = kErrorDisk; + return NO; + } + + if (urt_string_len(name) > kHeFSFileNameLen) { + err_global_get() = kErrorDisk; + return NO; + } + + HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); + + if (!root) { + err_global_get() = kErrorInvalidData; + return NO; + } + + rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, + rt_string_len("fs/hefs-packet")); + + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; + + mnt->fInput(mnt->fPacket); + + if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { + err_global_get() = kErrorDisk; + return YES; + } + + if (root->fStartBlock > root->fEndBlock) return NO; + + SizeT cnt = block_sz / sizeof(HEFS_INDEX_NODE); + auto nodes = Detail::hefsi_fetch_in(root, mnt, dir, name, kind, &cnt); + + if (!nodes) return NO; + + for (SizeT i = 0UL; i < cnt; ++i) { + auto& start = nodes[i]; + SizeT cnt_slice = 0; + SizeT sz_out = 0; + + while (cnt_slice < kHeFSSliceCount) { + struct HEFS_INODE_SLICE& slice = start.fSlices[cnt_slice]; + + mnt->fPacket.fPacketLba = slice.fBase + start.fOffsetSlices; + mnt->fPacket.fPacketSize = kHeFSBlockLen; + mnt->fPacket.fPacketContent = block; + + in ? mnt->fInput(mnt->fPacket) : mnt->fOutput(mnt->fPacket); + + sz_out += kHeFSBlockLen; + + if (!in) { + delete[] nodes; + return YES; + } else { + if (sz_out >= block_sz) { + delete[] nodes; + return YES; + } + } + + ++cnt_slice; + } + } + + delete[] nodes; + return NO; } /// @brief Create a new file on the disk. -/// @param drive The drive to write on. +/// @param mnt The mnt to write on. /// @param flags The flags to use. /// @param dir The directory to create the file in. /// @param name The name of the file. /// @return If it was sucessful, see err_local_get(). -_Output Bool HeFileSystemParser::INodeCtl_(_Input DriveTrait* drive, _Input const Int32 flags, - const Utf8Char* dir, const Utf8Char* name, - const BOOL delete_or_create) { +_Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input const Int32 flags, + const Utf8Char* dir, const Utf8Char* name, + const BOOL delete_or_create, const UInt8 kind) { if (urt_string_len(name) > kHeFSFileNameLen) { err_global_get() = kErrorDisk; return NO; @@ -990,14 +1091,19 @@ _Output Bool HeFileSystemParser::INodeCtl_(_Input DriveTrait* drive, _Input cons return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", drive->fPacket.fPacketMime, + rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, rt_string_len("fs/hefs-packet")); - drive->fPacket.fPacketLba = drive->fLbaStart; - drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); - drive->fPacket.fPacketContent = root; + mnt->fPacket.fPacketLba = mnt->fLbaStart; + mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + mnt->fPacket.fPacketContent = root; - drive->fInput(drive->fPacket); + mnt->fInput(mnt->fPacket); + + if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { + err_global_get() = kErrorDisk; + return YES; + } if (KStringBuilder::Equals(dir, kHeFSSearchAllStr)) { kout << "Error: Invalid file name.\r"; @@ -1025,18 +1131,17 @@ _Output Bool HeFileSystemParser::INodeCtl_(_Input DriveTrait* drive, _Input cons node->fDeleted = delete_or_create ? 1UL : 0UL; node->fModified = 0; node->fSize = 0; - node->fKind = kHeFSFileKindRegular; + node->fKind = kind; node->fFlags = flags; - node->fChecksum = 0; node->fChecksum = ke_calculate_crc32((Char*) node, sizeof(HEFS_INDEX_NODE)); node->fGID = 0; node->fUID = 0; node->fHashPath = Detail::hefsi_hash_64(name); - if (Detail::hefsi_update_in_status(root, drive, dir, node, delete_or_create)) { + if (Detail::hefsi_update_in_status(root, mnt, dir, node, delete_or_create)) { mm_delete_heap((VoidPtr) node); - Detail::hefsi_balance_ind(root, drive); + Detail::hefsi_balance_ind(root, mnt); err_global_get() = kErrorSuccess; return YES; @@ -1065,13 +1170,12 @@ Boolean fs_init_hefs(Void) { parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVoluneName); MUST_PASS(parser.CreateINode(&kMountPoint, kHeFSEncodingFlagsBinary | kHeFSFlagsReadOnly, - u8"/boot", u8".filetest")); - MUST_PASS(parser.DeleteINode(&kMountPoint, kHeFSEncodingFlagsBinary | kHeFSFlagsReadOnly, - u8"/boot", u8".filetest")); - MUST_PASS(parser.CreateINode(&kMountPoint, kHeFSEncodingFlagsBinary | kHeFSFlagsReadOnly, - u8"/network", u8".filetest")); - MUST_PASS(parser.DeleteINode(&kMountPoint, kHeFSEncodingFlagsBinary | kHeFSFlagsReadOnly, - u8"/network", u8".filetest")); + u8"/boot", u8"ジェット警察.txt", kHeFSFileKindRegular)); + + Utf8Char contents_1[kHeFSBlockLen] = u8"ロケットにはジエットエンジン\r"; + + MUST_PASS(parser.INodeManip(&kMountPoint, contents_1, kHeFSBlockLen, u8"/boot", + kHeFSFileKindRegular, u8"ジェット警察.txt", NO)); return YES; } -- cgit v1.2.3 From bd65fcfb90c5c4d58a875a41057001bccc6c3530 Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 6 May 2025 19:43:46 +0200 Subject: feat(kernel/HeFS): move sz_out out of the loop, to avoid it being reset. Signed-off-by: Amlal --- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 97afd614..39ed6916 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -1020,10 +1020,11 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc if (!nodes) return NO; + SizeT sz_out = 0; + for (SizeT i = 0UL; i < cnt; ++i) { auto& start = nodes[i]; SizeT cnt_slice = 0; - SizeT sz_out = 0; while (cnt_slice < kHeFSSliceCount) { struct HEFS_INODE_SLICE& slice = start.fSlices[cnt_slice]; -- cgit v1.2.3 From ed6c7d2e771da75c02a7f96644baab407bcf85e5 Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 6 May 2025 20:28:11 +0200 Subject: feat(HeFS): Filesystem fixes and optimizations. Signed-off-by: Amlal --- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 39ed6916..53e05c08 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -156,7 +156,7 @@ namespace Detail { continue; } - start += kHeFSINDStartOffset; + start += sizeof(HEFS_INDEX_NODE_DIRECTORY); break; } } @@ -561,8 +561,6 @@ namespace Detail { if (dir->fINSlices[inode_index] == 0 && !delete_or_create) { dir->fINSlices[inode_index] = root->fStartIN; - mnt->fOutput(mnt->fPacket); - ++dir->fEntryCount; dir->fChecksum = ke_calculate_crc32((Char*) dir, sizeof(HEFS_INDEX_NODE_DIRECTORY)); @@ -1021,7 +1019,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc if (!nodes) return NO; SizeT sz_out = 0; - + for (SizeT i = 0UL; i < cnt; ++i) { auto& start = nodes[i]; SizeT cnt_slice = 0; -- cgit v1.2.3 From 4a80c0e7eaa36817f52e0f3cd6d8c8e07bf860dc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 6 May 2025 21:07:48 +0200 Subject: dev(kernel): Fix typo of `kHeFSDefaultVoluneName` to `kHeFSDefaultVolumeName` in HeFS. --- dev/kernel/FSKit/HeFS.h | 2 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 2 +- docs/tex/hefs.tex | 2 +- tooling/hefs.h | 2 +- tooling/mkfs.hefs.cc | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index ce9b9226..f7e1d648 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -27,7 +27,7 @@ #define kHeFSMinimumDiskSize (gib_cast(1)) -#define kHeFSDefaultVoluneName u8"HeFS Volume" +#define kHeFSDefaultVolumeName u8"HeFS Volume" #define kHeFSINDStartOffset (sizeof(HEFS_INDEX_NODE_DIRECTORY) + sizeof(HEFS_BOOT_NODE)) diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 53e05c08..d3331710 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -1166,7 +1166,7 @@ Boolean fs_init_hefs(Void) { HeFileSystemParser parser; - parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVoluneName); + parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName); MUST_PASS(parser.CreateINode(&kMountPoint, kHeFSEncodingFlagsBinary | kHeFSFlagsReadOnly, u8"/boot", u8"ジェット警察.txt", kHeFSFileKindRegular)); diff --git a/docs/tex/hefs.tex b/docs/tex/hefs.tex index afafc472..dd857795 100644 --- a/docs/tex/hefs.tex +++ b/docs/tex/hefs.tex @@ -25,7 +25,7 @@ The High-throughput Extended File System (HeFS) is a custom filesystem tailored \texttt{kHeFSFileNameLen} & 256 characters \\ \texttt{kHeFSPartNameLen} & 128 characters \\ \texttt{kHeFSMinimumDiskSize} & 16 MiB \\ -\texttt{kHeFSDefaultVoluneName} & "HeFS Volume" \\ +\texttt{kHeFSDefaultVolumeName} & "HeFS Volume" \\ \texttt{kHeFSINDStartOffset} & Offset after boot + dir nodes \\ \texttt{kHeFSSearchAllStr} & "\*" (wildcard string) \\ \hline diff --git a/tooling/hefs.h b/tooling/hefs.h index ded6cbef..f281e7a3 100644 --- a/tooling/hefs.h +++ b/tooling/hefs.h @@ -16,7 +16,7 @@ #define kHeFSFileNameLen (256U) #define kHeFSPartNameLen (128U) -#define kHeFSDefaultVoluneName u8"HeFS Volume" +#define kHeFSDefaultVolumeName u8"HeFS Volume" namespace mkfs::hefs { diff --git a/tooling/mkfs.hefs.cc b/tooling/mkfs.hefs.cc index bc1f3d3c..5a706646 100644 --- a/tooling/mkfs.hefs.cc +++ b/tooling/mkfs.hefs.cc @@ -11,7 +11,7 @@ static size_t kDiskSize = 1024 * 1024 * 1024 * 4UL; static uint16_t kVersion = kHeFSVersion; -static std::u8string kLabel = kHeFSDefaultVoluneName; +static std::u8string kLabel = kHeFSDefaultVolumeName; static size_t kSectorSize = 512; int main(int argc, char** argv) { @@ -43,7 +43,7 @@ int main(int argc, char** argv) { kSectorSize = std::strtol(mkfs::get_option(args, "-s").data(), nullptr, 10); kLabel = mkfs::get_option(args_wide, u8"-L"); - if (kLabel.empty()) kLabel = kHeFSDefaultVoluneName; + if (kLabel.empty()) kLabel = kHeFSDefaultVolumeName; kDiskSize = std::strtol(mkfs::get_option(args, "-S").data(), nullptr, 10) * 1024 * 1024 * 1024; -- cgit v1.2.3 From f7492b792e5ef083a856787fde2f581f369fa200 Mon Sep 17 00:00:00 2001 From: Amlal Date: Wed, 7 May 2025 10:19:31 +0200 Subject: feat(modules/MBCI): Finalize MBCI base module. Signed-off-by: Amlal --- dev/kernel/src/DriveMgr.cc | 2 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 2 +- dev/modules/MBCI/MBCI.h | 27 ++++++++++++--------------- 3 files changed, 14 insertions(+), 17 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index 96ff2766..449640f9 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -4,8 +4,8 @@ ------------------------------------------- */ -#include #include +#include #include #include #include diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index d3331710..465cfc32 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -1018,7 +1018,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc if (!nodes) return NO; - SizeT sz_out = 0; + SizeT sz_out = 0; for (SizeT i = 0UL; i < cnt; ++i) { auto& start = nodes[i]; diff --git a/dev/modules/MBCI/MBCI.h b/dev/modules/MBCI/MBCI.h index 1038f17c..f2bd7f71 100644 --- a/dev/modules/MBCI/MBCI.h +++ b/dev/modules/MBCI/MBCI.h @@ -96,27 +96,24 @@ enum MBCIHostState { /// @brief An AuthKey is a context used to tokenize data for an MBCI packet. typedef UInt32 MBCIAuthKeyType; +/// @internal +inline BOOL busi_test_mmio(_Input volatile struct IMBCIHost* host, const UInt32 test) { + host->MMIOTest = test; + while (host->MMIOTest == test); + + return host->MMIOTest == 0; +} + /// @brief Read Auth key for MBCI host. /// @param host the mbci host to get the key on. /// @return the 24-bit key. inline MBCIAuthKeyType mbci_read_auth_key(_Input volatile struct IMBCIHost* host) { - constexpr auto const kChallengeMBCI = 0xdeadbeef; - - host->MMIOTest = kChallengeMBCI; - - if (host->MMIOTest == kChallengeMBCI) { - return (host->Esb[kMBCIESBSz - 1] << 16) | (host->Esb[kMBCIESBSz - 2] << 8) | - (host->Esb[kMBCIESBSz - 3] & 0xFF); - } - - return kChallengeMBCI; -} + auto const kChallengeMBCI = 0x1; // MBCI Challenge test -inline BOOL mbci_test_mmio(_Input volatile struct IMBCIHost* host) { - constexpr auto const kChallengeMBCI = 0xdeadbeef; + if (!busi_test_mmio(host, kChallengeMBCI)) return ~0; - host->MMIOTest = kChallengeMBCI; - return host->MMIOTest == kChallengeMBCI; + return (host->Esb[kMBCIESBSz - 1] << 16) | (host->Esb[kMBCIESBSz - 2] << 8) | + (host->Esb[kMBCIESBSz - 3] & 0xFF); } } // namespace Kernel -- cgit v1.2.3 From 8acaf9b721973fdd852abc01fc44ba1152b8f72a Mon Sep 17 00:00:00 2001 From: Amlal Date: Wed, 7 May 2025 11:14:25 +0200 Subject: feat(kernel): HeFS fixes, AHCI improvements, and MBCI tweaks. why? - Some parts were causing issues on the filesystem. - The slot probe code was naive. - Made the current MBCI implementation clearer. Signed-off-by: Amlal --- dev/kernel/HALKit/AMD64/HalDebugOutput.cc | 64 +++++++++++++++++++------ dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 18 +++++-- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 15 ++++-- dev/modules/MBCI/MBCI.h | 6 +-- docs/tex/mbci.tex | 2 +- 5 files changed, 79 insertions(+), 26 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc index 34b99ffe..a9759fc0 100644 --- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc @@ -57,6 +57,54 @@ namespace Detail { TerminalDevice::~TerminalDevice() = default; +EXTERN_C void ke_utf_io_write(IDeviceObject* obj, const Utf8Char* bytes) { + NE_UNUSED(bytes); + NE_UNUSED(obj); + +#ifdef __DEBUG__ + Detail::hal_serial_init(); + + if (!bytes || Detail::kState != kStateReady) return; + + if (*bytes == 0) return; + + Detail::kState = kStateTransmit; + + SizeT index = 0; + SizeT len = 0; + + index = 0; + len = urt_string_len(bytes); + + static BOOL not_important = YES; + + while (index < len) { + if (bytes[index] == '\r') HAL::rt_out8(Detail::kPort, '\r'); + + HAL::rt_out8(Detail::kPort, bytes[index] == '\r' ? '\n' : bytes[index]); + + char tmp_str[2]; + tmp_str[0] = bytes[index]; + tmp_str[1] = 0; + + if (bytes[index] == '*') { + if (not_important) + not_important = NO; + else + not_important = YES; + + ++index; + + continue; + } + + ++index; + } + + Detail::kState = kStateReady; +#endif // __DEBUG__ +} + EXTERN_C void ke_io_write(IDeviceObject* obj, const Char* bytes) { NE_UNUSED(bytes); NE_UNUSED(obj); @@ -74,7 +122,7 @@ EXTERN_C void ke_io_write(IDeviceObject* obj, const Char* bytes) { SizeT len = 0; index = 0; - len = rt_string_len(bytes, 256U); + len = rt_string_len(bytes); static SizeT x = kFontSizeX, y = kFontSizeY; @@ -172,20 +220,8 @@ TerminalDevice TerminalDevice::The() noexcept { Utf8TerminalDevice::~Utf8TerminalDevice() = default; -STATIC Void ke_io_write_utf(IDeviceObject*, const Utf8Char* str) { - auto len = urt_string_len(str); - - for (auto size = 0ul; size < len; ++size) { - Char buf[2]; - buf[0] = str[size]; - buf[1] = 0; - - Kernel::ke_io_write(nullptr, buf); - } -} - Utf8TerminalDevice Utf8TerminalDevice::The() noexcept { - Utf8TerminalDevice out(Kernel::ke_io_write_utf, + Utf8TerminalDevice out(Kernel::ke_utf_io_write, [](IDeviceObject*, const Utf8Char*) -> Void {}); return out; } diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index cf1841bd..4b0270ab 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -154,10 +154,18 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz UIntPtr slot = drv_find_cmd_slot_ahci(&kSATAHba->Ports[kSATAIndex]); - if (slot == ~0UL) { - kout << "No free command slot!\r"; - err_global_get() = kErrorDisk; - return; + UInt16 timeout = 0; + + while (slot == ~0UL) { + kout << "No free command slot found, AHCI disk is busy!\r"; + + if (timeout > 0x1000) { + err_global_get() = kErrorDisk; + return; + } + + slot = drv_find_cmd_slot_ahci(&kSATAHba->Ports[kSATAIndex]); + ++timeout; } volatile HbaCmdHeader* command_header = @@ -173,7 +181,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz rt_set_memory((VoidPtr) command_table, 0, sizeof(HbaCmdTbl)); - VoidPtr ptr = rtl_dma_alloc(size_buffer, 4096); + VoidPtr ptr = rtl_dma_alloc(size_buffer, kib_cast(4)); rtl_dma_flush(ptr, size_buffer); diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 465cfc32..1cd7e61a 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -514,10 +514,14 @@ namespace Detail { if (start > root->fEndIND) break; } - node_arr[start_cnt + 1].fDeleted = 1UL; err_global_get() = kErrorSuccess; delete dir; + if (start_cnt == 0) { + delete[] node_arr; + node_arr = nullptr; + } + return node_arr; } @@ -577,7 +581,7 @@ namespace Detail { node->fOffsetSlices = root->fStartBlock; - auto offset = 0; + auto offset = kHeFSBlockLen; SizeT cnt = 0ULL; @@ -1031,6 +1035,10 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc mnt->fPacket.fPacketSize = kHeFSBlockLen; mnt->fPacket.fPacketContent = block; + if (mnt->fPacket.fPacketLba > root->fEndBlock) { + goto inode_manip_fail; + } + in ? mnt->fInput(mnt->fPacket) : mnt->fOutput(mnt->fPacket); sz_out += kHeFSBlockLen; @@ -1049,6 +1057,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc } } +inode_manip_fail: delete[] nodes; return NO; } @@ -1174,7 +1183,7 @@ Boolean fs_init_hefs(Void) { Utf8Char contents_1[kHeFSBlockLen] = u8"ロケットにはジエットエンジン\r"; MUST_PASS(parser.INodeManip(&kMountPoint, contents_1, kHeFSBlockLen, u8"/boot", - kHeFSFileKindRegular, u8"ジェット警察.txt", NO)); + kHeFSFileKindRegular, u8"ジェット警察.txt", YES)); return YES; } diff --git a/dev/modules/MBCI/MBCI.h b/dev/modules/MBCI/MBCI.h index 37c18f79..37f802ec 100644 --- a/dev/modules/MBCI/MBCI.h +++ b/dev/modules/MBCI/MBCI.h @@ -39,7 +39,7 @@ enum { }; /// @brief MBCI Host header. -struct PACKED IMBCIHost final { +volatile struct PACKED IMBCIHost final { UInt32 Magic; UInt32 HostId; UInt16 VendorId; @@ -97,7 +97,7 @@ enum MBCIHostState { typedef UInt32 MBCIAuthKeyType; /// @internal -inline BOOL busi_test_mmio(_Input volatile struct IMBCIHost* host, const UInt32 test) { +inline BOOL busi_test_mmio(_Input struct IMBCIHost* host, _Input const UInt32 test) { host->MMIOTest = test; UInt16 timeout = 0UL; @@ -114,7 +114,7 @@ inline BOOL busi_test_mmio(_Input volatile struct IMBCIHost* host, const UInt32 /// @brief Read Auth key for MBCI host. /// @param host the mbci host to get the key on. /// @return the 24-bit key. -inline MBCIAuthKeyType mbci_read_auth_key(_Input volatile struct IMBCIHost* host) { +inline MBCIAuthKeyType mbci_read_auth_key(_Input struct IMBCIHost* host) { auto const kChallengeMBCI = 0x1; // MBCI Challenge test if (!busi_test_mmio(host, kChallengeMBCI)) return ~0; diff --git a/docs/tex/mbci.tex b/docs/tex/mbci.tex index a23bc87b..99676803 100644 --- a/docs/tex/mbci.tex +++ b/docs/tex/mbci.tex @@ -33,7 +33,7 @@ The MBCI bus interface includes the following signal lines: \subsection*{IMBCIHost Structure} \begin{lstlisting}[language=C++,basicstyle=\ttfamily\footnotesize] -struct IMBCIHost { +volatile struct IMBCIHost { UInt32 Magic; UInt32 HostId; UInt16 VendorId; -- cgit v1.2.3 From a8782019a20f5487494e436f79b876b57f7229e1 Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 8 May 2025 08:48:57 +0200 Subject: feat(tooling): update HeFS headers, and better HeFS tooling. Signed-off-by: Amlal --- dev/kernel/FSKit/HeFS.h | 8 +-- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 20 ++----- dev/modules/MBCI/MBCI.h | 5 +- tooling/hefs.h | 4 +- tooling/mkfs.hefs.cc | 92 ++++++++++++++++++------------ 5 files changed, 68 insertions(+), 61 deletions(-) (limited to 'dev/kernel/src/FS/HeFS+FileSystemParser.cc') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index f7e1d648..f5f42b47 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -125,10 +125,10 @@ struct PACKED HEFS_BOOT_NODE final { Kernel::UInt16 fDiskFlags; /// @brief Flags of the disk. (read-only, read-write, etc). Kernel::UInt16 fVID; /// @brief Virtual Identification Number within an EPM disk. (0xFFFF if not used). - Kernel::UInt64 fStartIN; /// @brief Reserved for future use. - Kernel::UInt64 fEndIN; /// @brief Reserved for future use. - Kernel::UInt64 fStartBlock; /// @brief Reserved for future use. - Kernel::UInt64 fEndBlock; /// @brief Reserved for future use. + Kernel::UInt64 fStartIN; /// @brief Start INodes range + Kernel::UInt64 fEndIN; /// @brief End INodes range + Kernel::UInt64 fStartBlock; /// @brief Start Blocks range + Kernel::UInt64 fEndBlock; /// @brief End Blocks range Kernel::Char fPad[272]; }; diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 1cd7e61a..a324da2a 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -459,7 +459,7 @@ namespace Detail { const Utf8Char* dir_name, const Utf8Char* file_name, UInt8 kind, SizeT* cnt) { - if (mnt) { + if (mnt && cnt) { auto start = root->fStartIND; if (start > root->fEndIND) return nullptr; @@ -514,7 +514,7 @@ namespace Detail { if (start > root->fEndIND) break; } - err_global_get() = kErrorSuccess; + err_global_get() = kErrorSuccess; delete dir; if (start_cnt == 0) { @@ -535,7 +535,7 @@ namespace Detail { STATIC ATTRIBUTE(unused) _Output BOOL hefsi_update_in_status(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf8Char* dir_name, HEFS_INDEX_NODE* node, BOOL delete_or_create) { - if (!root) return NO; + if (!root || !mnt) return NO; auto start = root->fStartIND; @@ -555,8 +555,6 @@ namespace Detail { mnt->fInput(mnt->fPacket); - kout8 << dir_name << u8"\r"; - (Void)(kout << hex_number(hefsi_hash_64(dir_name)) << kendl); (Void)(kout << hex_number(dir->fHashPath) << kendl); @@ -621,12 +619,6 @@ namespace Detail { mnt->fInput(mnt->fPacket); - kout8 << u8"HashPath: "; - (Void)(kout << hex_number(tmp_node.fHashPath) << kendl); - - kout8 << u8"HashPath: "; - (Void)(kout << hex_number(hash_file) << kendl); - if (tmp_node.fHashPath != hash_file) { continue; } @@ -690,7 +682,7 @@ namespace Detail { auto start = root->fStartIND; while (YES) { - if (start == 0 || start > root->fEndIND) break; + if (start == 0UL || start > root->fEndIND) break; mnt->fPacket.fPacketLba = start; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); @@ -714,10 +706,10 @@ namespace Detail { mnt->fOutput(mnt->fPacket); } - if (dir->fColor == kHeFSBlack && dir->fChild != 0) { + if (dir->fColor == kHeFSBlack && dir->fChild != 0UL) { dir->fColor = kHeFSRed; hefsi_rotate_tree(start, mnt); - } else if (dir->fColor == kHeFSBlack && dir->fChild == 0) { + } else if (dir->fColor == kHeFSBlack && dir->fChild == 0UL) { dir->fColor = kHeFSBlack; mnt->fPacket.fPacketLba = start; diff --git a/dev/modules/MBCI/MBCI.h b/dev/modules/MBCI/MBCI.h index 37f802ec..99ecf802 100644 --- a/dev/modules/MBCI/MBCI.h +++ b/dev/modules/MBCI/MBCI.h @@ -100,12 +100,11 @@ typedef UInt32 MBCIAuthKeyType; inline BOOL busi_test_mmio(_Input struct IMBCIHost* host, _Input const UInt32 test) { host->MMIOTest = test; UInt16 timeout = 0UL; - + while (host->MMIOTest == test) { ++timeout; - if (timeout > 0x1000) - return NO; + if (timeout > 0x1000) return NO; } return host->MMIOTest == 0; diff --git a/tooling/hefs.h b/tooling/hefs.h index f281e7a3..68e0f906 100644 --- a/tooling/hefs.h +++ b/tooling/hefs.h @@ -102,8 +102,8 @@ struct __attribute__((packed)) BootNode { std::uint16_t vid{}; std::uint64_t startIN{}; std::uint64_t endIN{}; - std::uint64_t reserved3{}; - std::uint64_t reserved4{}; + std::uint64_t startBlock{}; + std::uint64_t endBlock{}; char pad[272]{}; }; } // namespace mkfs::hefs diff --git a/tooling/mkfs.hefs.cc b/tooling/mkfs.hefs.cc index 5a706646..2ddc7484 100644 --- a/tooling/mkfs.hefs.cc +++ b/tooling/mkfs.hefs.cc @@ -16,9 +16,10 @@ static size_t kSectorSize = 512; int main(int argc, char** argv) { if (argc < 2) { - mkfs::console_out() << "hefs: Usage: mkfs.hefs -L