diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-24 09:14:06 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-04-24 09:14:06 +0200 |
| commit | f8a49e346e45daaf1463b658b386040f8843fa61 (patch) | |
| tree | eb955d118fc833e42b1e7a870cc6d9a89595325e /dev | |
| parent | 020f98d79493ddd04f46a840e80b8949a1bf919a (diff) | |
dev, kernel, boot: HeFS, Scheduler, BootZ: see below.
Refactored HeFS node handling and API for extensibility, added directory metadata, improved wildcard querying, and updated documentation accordingly.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/boot/amd64-desktop.make | 2 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 6 | ||||
| -rw-r--r-- | dev/kernel/FSKit/HeFS.h | 11 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 180 |
5 files changed, 173 insertions, 28 deletions
diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 00b37b94..652ba31e 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -97,7 +97,7 @@ all: compile-amd64 .PHONY: disk disk: dd if=/dev/zero of=$(BOOT) bs=7M count=100 - mformat -i $(BOOT) -F -v "NEKERNEL-ESP" + mformat -i $(BOOT) -F -v "ESP" ifneq ($(DEBUG_SUPPORT), ) diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 0fc21860..6411383d 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -190,7 +190,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, if (reader_syschk.Blob()) { syschk_thread = new Boot::BootThread(reader_syschk.Blob()); - syschk_thread->SetName("BootZ\\System Check"); + syschk_thread->SetName("BootZ/SysChk"); syschk_thread->Start(handover_hdr, NO); } @@ -258,7 +258,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); - kernel_thread.SetName("BootZ\\NeKernel"); + kernel_thread.SetName("BootZ/NeKernel"); handover_hdr->f_KernelImage = reader_kernel.Blob(); handover_hdr->f_KernelSz = reader_kernel.Size(); @@ -273,7 +273,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, return kEfiFail; auto netboot_thread = Boot::BootThread(reader_netboot.Blob()); - netboot_thread.SetName("BootZ\\BootNet"); + netboot_thread.SetName("BootZ/BootNet"); return netboot_thread.Start(handover_hdr, NO); } diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 8af6c568..0ad47739 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -26,7 +26,9 @@ #define kHeFSMinimumDiskSize (gib_cast(4))
-#define kHeFSDefaultVoluneName "HeFS Volume"
+#define kHeFSDefaultVoluneName u"HeFS Volume"
+
+#define kHeFSSearchAllStr u"*"
struct HEFS_BOOT_NODE;
struct HEFS_INDEX_NODE;
@@ -162,7 +164,7 @@ struct PACKED ALIGN(8) HEFS_INDEX_NODE_DIRECTORY final Kernel::UInt32 fFlags; /// @brief File flags.
Kernel::UInt16 fKind; /// @brief File kind. (Regular, Directory, Block, Character, FIFO, Socket, Symbolic Link, Unknown).
- Kernel::UInt32 fSize; /// @brief Size of the directory.
+ Kernel::UInt32 fEntryCount; /// @brief Entry Count of this directory inode.
Kernel::UInt32 fChecksum, fIndexNodeChecksum; /// @brief Checksum of the file, index node checksum.
Kernel::ATime fCreated, fAccessed, fModified, fDeleted; /// @brief File timestamps.
@@ -343,11 +345,6 @@ namespace Kernel::Detail return "Unknown";
}
}
-
- inline SizeT hefs_get_block_size(SizeT block_size) noexcept
- {
- return block_size * kHeFSBlockCount;
- }
} // namespace Kernel::Detail
namespace Kernel
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 3686a48f..d59e9e86 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -98,6 +98,8 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept idt_loader.Load(idt_reg); + /// after the scheduler runs, we must look over teams, every 200ms in order to schedule every process according to their affinity fairly. + auto constexpr kSchedTeamSwitchMS = 200U; /// @brief Team switch time in milliseconds. Kernel::HardwareTimer timer(rtl_ms(kSchedTeamSwitchMS)); diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 87decf6a..cfa8baae 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -4,6 +4,7 @@ ------------------------------------------- */ +#include "NewKit/Defines.h" #ifdef __FSKIT_INCLUDES_HEFS__ #include <modules/AHCI/AHCI.h> @@ -38,7 +39,15 @@ namespace Kernel /// @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 link, unknown). - STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept; + STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind, SizeT* cnt) noexcept; + + /// @brief Get the index node size. + /// @param root The root node of the filesystem. + /// @param mnt The drive 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 link, unknown). + STATIC ATTRIBUTE(unused) _Output SizeT hefs_fetch_index_node_size(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept; /// @brief Allocate a new index node. /// @param root The root node of the filesystem. @@ -186,16 +195,125 @@ namespace Kernel mnt->fOutput(mnt->fPacket); } + /// @brief Get the index node size. + /// @param root The root node of the filesystem. + /// @param mnt The drive 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 link, unknown). + STATIC ATTRIBUTE(unused) _Output SizeT hefs_fetch_index_node_size(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept + { + if (root && mnt) + { + HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); + HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY(); + + SizeT sz = 0UL; + + auto start = root->fStartIND; + auto end = root->fEndIND; + + auto hop_watch = 0; + + while (YES) + { + if (start > end) + { + kout << "Error: Invalid start/end values.\r"; + break; + } + + if (hop_watch > 100) + { + kout << "Error: Hop watch exceeded, filesystem is stalling.\r"; + break; + } + + if (start == 0) + { + ++hop_watch; + start = root->fStartIND; + } + + mnt->fPacket.fPacketLba = start; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); + mnt->fPacket.fPacketContent = dir; + + mnt->fInput(mnt->fPacket); + + if (!mnt->fPacket.fPacketGood) + { + delete node; + delete dir; + + dir = nullptr; + node = nullptr; + + err_global_get() = kErrorFileNotFound; + + return 0; + } + + if (dir->fKind == kHeFSFileKindDirectory) + { + if (KStringBuilder::Equals(dir_name, dir->fName) || + KStringBuilder::Equals(dir_name, kHeFSSearchAllStr)) + { + for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) + { + if (dir->fIndexNodeStart[inode_index]) + { + mnt->fPacket.fPacketLba = dir->fIndexNodeStart[inode_index]; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); + mnt->fPacket.fPacketContent = node; + mnt->fInput(mnt->fPacket); + } + else if (dir->fIndexNodeEnd[inode_index]) + { + mnt->fPacket.fPacketLba = dir->fIndexNodeEnd[inode_index]; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); + mnt->fPacket.fPacketContent = node; + mnt->fInput(mnt->fPacket); + } + + if (KStringBuilder::Equals(file_name, node->fName) && node->fKind == kind) + { + if (node->fKind == kHeFSFileKindDirectory) + { + sz += hefs_fetch_index_node_size(root, mnt, dir_name, file_name, kind); + } + else + { + sz = node->fSize; + } + + return sz; + } + } + } + } + } + + err_global_get() = kErrorSuccess; + return sz; + } + + err_global_get() = kErrorFileNotFound; + return 0; + } + /// @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 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 link, unknown). - STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind) noexcept + STATIC ATTRIBUTE(unused) _Output HEFS_INDEX_NODE* hefs_fetch_index_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name, const Utf16Char* file_name, UInt8 kind, SizeT* cnt) noexcept { if (root && mnt) { + HEFS_INDEX_NODE* node_arr = new HEFS_INDEX_NODE[*cnt]; + HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY(); @@ -208,6 +326,8 @@ namespace Kernel auto start = root->fStartIND; auto end = root->fEndIND; + auto start_cnt = 0UL; + auto hop_watch = 0; while (YES) @@ -251,7 +371,8 @@ namespace Kernel if (dir->fKind == kHeFSFileKindDirectory) { - if (KStringBuilder::Equals(dir_name, dir->fName)) + if (KStringBuilder::Equals(dir_name, dir->fName) || + KStringBuilder::Equals(dir_name, kHeFSSearchAllStr)) { for (SizeT inode_index = 0UL; inode_index < kHeFSBlockCount; inode_index += 2) { @@ -271,7 +392,14 @@ namespace Kernel delete dir; dir = nullptr; - return node; + node_arr[start_cnt] = *node; + ++start_cnt; + + if (start_cnt > *cnt) + { + delete node; + return node_arr; + } } } else @@ -280,9 +408,11 @@ namespace Kernel delete dir; delete node; + delete[] node_arr; - dir = nullptr; - node = nullptr; + dir = nullptr; + node = nullptr; + node_arr = nullptr; return nullptr; } @@ -296,9 +426,11 @@ namespace Kernel delete dir; delete node; + delete[] node_arr; - dir = nullptr; - node = nullptr; + dir = nullptr; + node = nullptr; + node_arr = nullptr; } kout << "Error: Failed to find index node.\r"; @@ -350,18 +482,32 @@ namespace Kernel if (dir->fIndexNodeStart[inode_index] != 0 || dir->fIndexNodeEnd[inode_index] != 0) { - mnt->fPacket.fPacketLba = (!dir->fIndexNodeStart[inode_index]) ? dir->fIndexNodeEnd[inode_index] : dir->fIndexNodeStart[inode_index]; + HEFS_INDEX_NODE prev_node; + + auto lba = (!dir->fIndexNodeStart[inode_index]) ? dir->fIndexNodeEnd[inode_index] : dir->fIndexNodeStart[inode_index]; + + mnt->fPacket.fPacketLba = lba; mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); - mnt->fPacket.fPacketContent = node; + mnt->fPacket.fPacketContent = &prev_node; - mnt->fOutput(mnt->fPacket); + mnt->fInput(mnt->fPacket); - if (mnt->fPacket.fPacketGood) + if (prev_node.fDeleted > 0 && + !prev_node.fAccessed) { - delete dir; - dir = nullptr; + mnt->fPacket.fPacketLba = lba; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE); + mnt->fPacket.fPacketContent = node; + + mnt->fOutput(mnt->fPacket); - return YES; + if (mnt->fPacket.fPacketGood) + { + delete dir; + dir = nullptr; + + return YES; + } } } } @@ -548,7 +694,7 @@ namespace Kernel NE_UNUSED(end_lba); NE_UNUSED(flags); NE_UNUSED(part_name); - + return NO; } @@ -561,7 +707,7 @@ namespace Kernel NE_UNUSED(end_lba); NE_UNUSED(flags); NE_UNUSED(part_name); - + return NO; } } // namespace Kernel |
