diff options
| author | Amlal <amlal@nekernel.org> | 2025-04-26 10:37:56 +0200 |
|---|---|---|
| committer | Amlal <amlal@nekernel.org> | 2025-04-26 10:37:56 +0200 |
| commit | 0af5f147b67140ebb7b561fdde273c5123c61df8 (patch) | |
| tree | fd624e3652b0b74d6752a01b98934e4dfe2307d8 /dev/kernel/src | |
| parent | cef5a181e5f9ddd6c580f5d910c238799b5611c2 (diff) | |
dev, kernel: saving work in progress code regarding scheduler and filesystem.
Signed-off-by: Amlal <amlal@nekernel.org>
Diffstat (limited to 'dev/kernel/src')
| -rw-r--r-- | dev/kernel/src/FS/HeFS.cc | 280 | ||||
| -rw-r--r-- | dev/kernel/src/IPEFDylibObject.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessScheduler.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessTeam.cc (renamed from dev/kernel/src/ProcessTeam.cc) | 0 |
4 files changed, 281 insertions, 5 deletions
diff --git a/dev/kernel/src/FS/HeFS.cc b/dev/kernel/src/FS/HeFS.cc index 9037a1e2..71d1d1d4 100644 --- a/dev/kernel/src/FS/HeFS.cc +++ b/dev/kernel/src/FS/HeFS.cc @@ -4,7 +4,6 @@ ------------------------------------------- */ -#include "NewKit/Defines.h" #ifdef __FSKIT_INCLUDES_HEFS__ #include <FSKit/HeFS.h> @@ -289,6 +288,109 @@ namespace Detail { return 0; } + STATIC _Output BOOL hefs_allocate_index_directory_node(HEFS_BOOT_NODE* root, DriveTrait* mnt, + HEFS_INDEX_NODE_DIRECTORY* dir) noexcept { + if (root && mnt) { + HEFS_INDEX_NODE_DIRECTORY* parent = new HEFS_INDEX_NODE_DIRECTORY(); + + if (!parent) { + kout << "Error: Failed to allocate memory for index node.\r"; + return NO; + } + + auto start = root->fStartIND; + + while (YES) { + mnt->fPacket.fPacketLba = start; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); + mnt->fPacket.fPacketContent = parent; + + mnt->fInput(mnt->fPacket); + + if (!mnt->fPacket.fPacketGood) { + delete parent; + return NO; + } + + if (parent->fDeleted) { + mnt->fPacket.fPacketLba = start; + mnt->fPacket.fPacketSize = sizeof(HEFS_INDEX_NODE_DIRECTORY); + mnt->fPacket.fPacketContent = dir; + + mnt->fOutput(mnt->fPacket); + + return YES; + } + + hefsi_traverse_tree(parent, start); + } + + return YES; + } + + err_global_get() = kErrorFileNotFound; + return NO; + } + + STATIC _Output HEFS_INDEX_NODE_DIRECTORY* hefs_fetch_index_node_directory( + HEFS_BOOT_NODE* root, DriveTrait* mnt, const Utf16Char* dir_name) { + if (root && mnt) { + HEFS_INDEX_NODE_DIRECTORY* dir = new HEFS_INDEX_NODE_DIRECTORY(); + + 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 dir; + + dir = nullptr; + + err_global_get() = kErrorFileNotFound; + + return nullptr; + } + + if (dir->fKind == kHeFSFileKindDirectory) { + if (KStringBuilder::Equals(dir_name, dir->fName)) { + return dir; + } + } + + hefsi_traverse_tree(dir, start); + } + + err_global_get() = kErrorSuccess; + return dir; + } + + err_global_get() = kErrorFileNotFound; + return nullptr; + } + /// @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. @@ -709,7 +811,178 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input drive->fOutput(drive->fPacket); - return YES; + delete root; + root = nullptr; + + if (drive->fPacket.fPacketGood) return YES; + + err_global_get() = kErrorDiskIsCorrupted; + + return NO; +} + +/// @brief Create a new directory on the disk. +/// @param drive The drive 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::CreateDirectory(_Input DriveTrait* drive, _Input const Int32 flags, + const Utf16Char* 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(); + + if (!root || !node) { + 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")); + + drive->fPacket.fPacketLba = drive->fLbaStart; + drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + drive->fPacket.fPacketContent = root; + + drive->fInput(drive->fPacket); + + auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir); + + if (dirent) { + kout << "Error: Directory already exists.\r"; + + delete dirent; + dirent = nullptr; + + delete node; + delete root; + + return NO; + } + + dirent = new HEFS_INDEX_NODE_DIRECTORY(); + + rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); + + wrt_copy_memory((VoidPtr) dir, dirent->fName, wrt_string_len(dir)); + + dirent->fAccessed = 0; + dirent->fCreated = 0; + dirent->fDeleted = 0; + dirent->fModified = 0; + dirent->fEntryCount = 0; + dirent->fKind = kHeFSFileKindDirectory; + dirent->fFlags = flags; + dirent->fChecksum = 0; + + if (Detail::hefs_allocate_index_directory_node(root, drive, dirent)) { + delete dirent; + dirent = nullptr; + + delete node; + delete root; + + return YES; + } + + delete dirent; + dirent = nullptr; + + delete node; + delete root; + + return NO; +} + +/// @brief Create a new file on the disk. +/// @param drive The drive 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::CreateFile(_Input DriveTrait* drive, _Input const Int32 flags, + const Utf16Char* dir, const Utf16Char* name) { + NE_UNUSED(drive); + NE_UNUSED(flags); + NE_UNUSED(dir); + NE_UNUSED(name); + + HEFS_BOOT_NODE* root = new HEFS_BOOT_NODE(); + HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); + + if (!root || !node) { + 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")); + + drive->fPacket.fPacketLba = drive->fLbaStart; + drive->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); + drive->fPacket.fPacketContent = root; + + drive->fInput(drive->fPacket); + + auto dirent = Detail::hefs_fetch_index_node_directory(root, drive, dir); + + if (!dirent) { + kout << "Error: Directory not found.\r"; + + delete node; + delete root; + + return NO; + } + + delete dirent; + dirent = nullptr; + + if (KStringBuilder::Equals(name, kHeFSSearchAllStr)) { + kout << "Error: Invalid file name.\r"; + + delete node; + delete root; + + return NO; + } + + node->fAccessed = 0; + node->fCreated = 0; + node->fDeleted = 0; + node->fModified = 0; + node->fSize = 0; + node->fKind = kHeFSFileKindRegular; + node->fFlags = flags; + node->fChecksum = 0; + + wrt_copy_memory((VoidPtr) name, node->fName, wrt_string_len(name)); + + if (Detail::hefs_allocate_index_node(root, drive, dir, node)) { + delete node; + delete root; + + return YES; + } + + return NO; } Boolean fs_init_hefs(Void) noexcept { @@ -723,6 +996,9 @@ Boolean fs_init_hefs(Void) noexcept { HeFileSystemParser parser; parser.Format(&drv, kHeFSEncodingUTF16, kHeFSDefaultVoluneName); + parser.CreateDirectory(&drv, kHeFSEncodingUTF16, u"/"); + parser.CreateFile(&drv, kHeFSEncodingUTF16, u"/", u"boot.log"); + return YES; } } // namespace Kernel::HeFS diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index f064dbac..f9cd758c 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -60,7 +60,7 @@ EXTERN_C IDylibRef rtl_init_dylib_pef(USER_PROCESS& process) { return nullptr; } - dll_obj->Get()->ImageObject = process.Image.fBlob; + dll_obj->Get()->ImageObject = process.Image.LeakBlob().Leak().Leak(); if (!dll_obj->Get()->ImageObject) { delete dll_obj->Get(); diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index ae7bbfb8..bc2cc8e2 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -498,7 +498,7 @@ SizeT UserProcessScheduler::Run() noexcept { process.PTime = static_cast<Int32>(process.Affinity); // tell helper to find a core to schedule on. - BOOL ret = UserProcessHelper::Switch(process.Image.fCode, + BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(), &process.StackReserve[process.StackSize - 1], process.StackFrame, process.ProcessId); @@ -570,7 +570,7 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { if (process.Status == ProcessStatusKind::kInvalid) return No; - if (!process.Image.fCode) return No; + if (!process.Image.HasCode()) return No; if (!process.Name[0]) return No; diff --git a/dev/kernel/src/ProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index 7acbcf8d..7acbcf8d 100644 --- a/dev/kernel/src/ProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc |
