From 42301b6977bf11f8d5b55c6ca8c08b97a2b4cc3c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 10:26:27 +0200 Subject: PEF format update `5.0` and codebase refactors. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index ed72473f..f572fe99 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -152,10 +152,10 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } } - Char* container_blob_value = new Char[container_header->Size]; + Char* container_blob_value = new Char[container_header->VMSize]; rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, - container_header->Size); + container_header->VMSize); mm_free_ptr(blob); kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; -- cgit v1.2.3 From 8d25bf16c667eecd3b9f01263008ad7c68594cca Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:58:23 +0300 Subject: rt_copy_memory_safe: PEFCodeMgr.cc --- dev/kernel/src/PEFCodeMgr.cc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index f572fe99..e646b578 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -1,3 +1,5 @@ +#define __NE_AMD64__ + /* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. @@ -12,6 +14,10 @@ #include #include #include +#include +#include + +using namespace Kernel::HAL; /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" @@ -154,15 +160,15 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { Char* container_blob_value = new Char[container_header->VMSize]; - rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, - container_header->VMSize); + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, + container_header->VMSize, container_header->VMSize); mm_free_ptr(blob); kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; - auto ret = HAL::mm_map_page((VoidPtr) container_header->VMAddress, - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + auto ret = mm_map_page((VoidPtr) container_header->VMAddress, + (VoidPtr) mm_get_page_addr(container_blob_value), + kMMFlagsPresent | kMMFlagsUser); if (ret != kErrorSuccess) { mm_free_ptr(container_blob_value); -- cgit v1.2.3 From 1fc6c2a7258deee05ee09ec4020be12dc6fc7240 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:45:21 +0300 Subject: PEFCodeMgr.cc: ArchKit --- dev/kernel/src/PEFCodeMgr.cc | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index e646b578..db86e02f 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -1,11 +1,3 @@ -#define __NE_AMD64__ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - #include #include #include @@ -15,9 +7,7 @@ #include #include #include -#include - -using namespace Kernel::HAL; +#include /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" -- cgit v1.2.3 From 69525ee410735e08b9abe6e00381624c5c8e202f Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:55:18 +0300 Subject: ;) --- dev/kernel/src/PEFCodeMgr.cc | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index db86e02f..b83cb441 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -1,3 +1,12 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + Copyright (C) 2025, Amlal El Mahrouss & NeKernel contributors, all rights reserved. + +------------------------------------------- */ + + #include #include #include -- cgit v1.2.3 From 59653f763a7e12b5b54b470a86e81c93729c909d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 22 Jun 2025 15:57:49 +0200 Subject: fix: PEFLdr: Fix compilation error on `mmap` Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index b83cb441..98b7c7b7 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -165,9 +165,9 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; - auto ret = mm_map_page((VoidPtr) container_header->VMAddress, - (VoidPtr) mm_get_page_addr(container_blob_value), - kMMFlagsPresent | kMMFlagsUser); + auto ret = HAL::mm_map_page((VoidPtr) container_header->VMAddress, + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { mm_free_ptr(container_blob_value); -- cgit v1.2.3 From 0d44c75062a313f7d1b8813816843bc8ab51b135 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 23 Jun 2025 22:59:26 +0200 Subject: fix: Fix AP init code, and format codebase. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/BootSupport.cc | 16 +++++----- dev/kernel/ArchKit/ArchKit.h | 5 ++-- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 12 ++++---- dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 4 +-- dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc | 9 +++--- dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 4 +-- dev/kernel/src/AsciiUtils.cc | 3 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 8 ++--- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 34 +++++++++++++--------- dev/kernel/src/IndexableProperty.cc | 5 ++-- dev/kernel/src/PEFCodeMgr.cc | 8 ++--- dev/kernel/src/UserMgr.cc | 10 ++++--- dev/kernel/src/UserProcessScheduler.cc | 5 ++-- 13 files changed, 69 insertions(+), 54 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/boot/src/BootSupport.cc b/dev/boot/src/BootSupport.cc index 96c6594e..4bf3e68a 100644 --- a/dev/boot/src/BootSupport.cc +++ b/dev/boot/src/BootSupport.cc @@ -18,13 +18,14 @@ /// @param dst destination pointer. /// @param byte value to fill in. /// @param len length of of src. -EXTERN_C VoidPtr memnset(void* dst, int byte, long long unsigned int len, long long unsigned int dst_size) { +EXTERN_C VoidPtr memnset(void* dst, int byte, long long unsigned int len, + long long unsigned int dst_size) { if (!dst || len > dst_size) { // For now, we return nullptr or an error status. return nullptr; } - unsigned char* p = (unsigned char*)dst; - unsigned char val = (unsigned char)byte; + unsigned char* p = (unsigned char*) dst; + unsigned char val = (unsigned char) byte; for (size_t i = 0UL; i < len; ++i) { p[i] = val; } @@ -35,13 +36,14 @@ EXTERN_C VoidPtr memnset(void* dst, int byte, long long unsigned int len, long l /// @param dst destination pointer. /// @param src source pointer. /// @param len length of of src. -EXTERN_C VoidPtr memncpy(void* dst, const void* src, long long unsigned int len, long long unsigned int dst_size) { +EXTERN_C VoidPtr memncpy(void* dst, const void* src, long long unsigned int len, + long long unsigned int dst_size) { if (!dst || !src || len > dst_size) { // Similar to memset, this is a critical failure. return nullptr; } - unsigned char* d = (unsigned char*)dst; - const unsigned char* s = (const unsigned char*)src; + unsigned char* d = (unsigned char*) dst; + const unsigned char* s = (const unsigned char*) src; for (size_t i = 0UL; i < len; ++i) { d[i] = s[i]; } @@ -67,7 +69,7 @@ EXTERN_C int strncmp(const char* whatToCheck, const char* whatToCheckRight, size if (i == max_len) { return 0; } - return (unsigned char)whatToCheck[i] - (unsigned char)whatToCheckRight[i]; + return (unsigned char) whatToCheck[i] - (unsigned char) whatToCheckRight[i]; } /// @brief something specific to the Microsoft's ABI, When the stack grows too big. diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 04af0918..37793370 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,12 +77,11 @@ struct HAL_DISPATCH_ENTRY final { operator bool() { return fHooked; } }; - typedef Kernel::Void (*rt_kerncall_proc)(Kernel::SizeT, Kernel::VoidPtr, Kernel::SizeT); struct HAL_KERNEL_DISPATCH_ENTRY final { - Kernel::UInt64 fHash; - Kernel::Bool fHooked; + Kernel::UInt64 fHash; + Kernel::Bool fHooked; rt_kerncall_proc fProc; operator bool() { return fHooked; } diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index aeaeff52..8b4c0d1a 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -113,17 +113,19 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) { /***********************************************************************************/ EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) { - if (thrdid > kSMPCount) return NO; if (!stack_frame) return NO; - kHWThread[thrdid].mFramePtr = stack_frame; - - HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - if (!kSMPAware) { sched_jump_to_task(kHWThread[thrdid].mFramePtr); + + return YES; } + HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); + + kHWThread[thrdid].mFramePtr = stack_frame; + if (thrdid > kSMPCount) return NO; + return YES; } diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index c2988767..b837497e 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -148,8 +148,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @brief Enter Kernel call from assembly (libDDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::SizeT cnt, Kernel::UIntPtr arg, Kernel::SizeT sz) { +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, Kernel::SizeT cnt, + Kernel::UIntPtr arg, Kernel::SizeT sz) { hal_idt_send_eoi(51); if (!Kernel::kRootUser) return; diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index dc680ce8..56d46a15 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -30,10 +30,11 @@ Void IDTLoader::Load(Register64& idt) { volatile UIntPtr** ptr_ivt = (volatile UIntPtr**) idt.Base; for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { - Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; - Detail::kInterruptVectorTable[idt_indx].Ist = 0; - Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kKernelInterruptId ? kUserInterruptGate : kInterruptGate; - Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr) ptr_ivt[idt_indx] & 0xFFFF); + Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; + Detail::kInterruptVectorTable[idt_indx].Ist = 0; + Detail::kInterruptVectorTable[idt_indx].TypeAttributes = + kKernelInterruptId ? kUserInterruptGate : kInterruptGate; + Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr) ptr_ivt[idt_indx] & 0xFFFF); Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr) ptr_ivt[idt_indx] >> 16) & 0xFFFF); Detail::kInterruptVectorTable[idt_indx].OffsetHigh = diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index 4c02e8cc..0c26f4cb 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -143,8 +143,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @brief Enter Kernel call from assembly (libDDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::SizeT cnt, Kernel::UIntPtr arg, Kernel::SizeT sz) { +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, Kernel::SizeT cnt, + Kernel::UIntPtr arg, Kernel::SizeT sz) { if (!Kernel::kRootUser) return; if (Kernel::kCurrentUser != Kernel::kRootUser) return; if (!Kernel::kCurrentUser->IsSuperUser()) return; diff --git a/dev/kernel/src/AsciiUtils.cc b/dev/kernel/src/AsciiUtils.cc index d5bc6bce..24e4e220 100644 --- a/dev/kernel/src/AsciiUtils.cc +++ b/dev/kernel/src/AsciiUtils.cc @@ -161,7 +161,8 @@ EXTERN_C void* memset(void* dst, int c, long long unsigned int len) { } EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { - Kernel::rt_copy_memory_safe(const_cast(src), dst, static_cast(len), static_cast(len)); + Kernel::rt_copy_memory_safe(const_cast(src), dst, static_cast(len), + static_cast(len)); return dst; } diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index b2e894d0..8092f53b 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -799,7 +799,7 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c } rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); urt_copy_memory((VoidPtr) vol_name, boot->fVolName, urt_string_len(vol_name) + 1); rt_copy_memory_safe((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1, sizeof(boot->fMagic)); @@ -907,7 +907,7 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_alloc_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); @@ -993,7 +993,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc } rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); @@ -1079,7 +1079,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co } rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); + rt_string_len("fs/hefs-packet"), sizeof(mnt->fPacket.fPacketMime)); mnt->fPacket.fPacketLba = mnt->fLbaStart; mnt->fPacket.fPacketSize = sizeof(HEFS_BOOT_NODE); diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 0bee64a8..14e0b974 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -168,7 +168,7 @@ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUC drive.fPacket.fPacketContent = reinterpret_cast(&local_buf); rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); if (auto res = fs_ifs_read(&kMountpoint, drive, this->mDriveIndex); res) { switch (res) { @@ -312,13 +312,14 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char --i; if (kind == kNeFSCatalogKindDir) --i; while (name[i] != '/') --i; - rt_copy_memory_safe((VoidPtr) (name + i), (VoidPtr) child_catalog->Name, rt_string_len(name) - i, kNeFSCatalogNameLen); + rt_copy_memory_safe((VoidPtr) (name + i), (VoidPtr) child_catalog->Name, rt_string_len(name) - i, + kNeFSCatalogNameLen); NEFS_CATALOG_STRUCT temporary_catalog{}; Lba start_free = out_lba; rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); Char buf_part_block[sizeof(NEFS_ROOT_PARTITION_BLOCK)] = {0}; drive.fPacket.fPacketContent = reinterpret_cast(buf_part_block); @@ -380,13 +381,15 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char delete catalog; NEFS_CATALOG_STRUCT* found_catalog = new NEFS_CATALOG_STRUCT(); - rt_copy_memory_safe(&temporary_catalog, found_catalog, sizeof(NEFS_CATALOG_STRUCT), sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&temporary_catalog, found_catalog, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); delete child_catalog; return found_catalog; } else if ((temporary_catalog.Flags & kNeFSFlagCreated) && KStringBuilder::Equals(temporary_catalog.Name, name)) { - rt_copy_memory_safe(&temporary_catalog, child_catalog, sizeof(NEFS_CATALOG_STRUCT), sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&temporary_catalog, child_catalog, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); delete catalog; return child_catalog; } @@ -412,7 +415,7 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I // verify disk. drive->fVerify(drive->fPacket); rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive->fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive->fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive->fPacket.fPacketMime)); if (!drive->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; return false; @@ -430,9 +433,10 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I if (rt_string_cmp(kNeFSIdent, part_block->Ident, kNeFSIdentLen) == 0) return true; const auto kNeFSUntitledHD = part_name; - rt_copy_memory_safe((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen, sizeof(part_block->Ident)); + rt_copy_memory_safe((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen, + sizeof(part_block->Ident)); rt_copy_memory_safe((VoidPtr) kNeFSUntitledHD, (VoidPtr) part_block->PartitionName, - rt_string_len(kNeFSUntitledHD), sizeof(part_block->PartitionName)); + rt_string_len(kNeFSUntitledHD), sizeof(part_block->PartitionName)); SizeT sectorCount = drv_std_get_sector_count(); SizeT sectorSize = drive->fSectorSz; @@ -515,7 +519,7 @@ bool NeFileSystemParser::WriteCatalog(_Input const Char* catalog_name, Bool is_r rt_set_memory(buf, 0, size_of_data); rt_copy_memory_safe(data, buf, size_of_data, size_of_data); rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); NEFS_FORK_STRUCT* fork_data_input = new NEFS_FORK_STRUCT(); NEFS_FORK_STRUCT prev_fork{}; @@ -578,7 +582,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* auto& drive = kMountpoint.A(); rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); drive.fPacket.fPacketContent = reinterpret_cast(&part); drive.fPacket.fPacketSize = sizeof(NEFS_ROOT_PARTITION_BLOCK); drive.fPacket.fPacketLba = kNeFSRootCatalogStartAddress; @@ -607,7 +611,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* return nullptr; } NEFS_CATALOG_STRUCT* catalog_ptr = new NEFS_CATALOG_STRUCT(); - rt_copy_memory_safe(&tmp, catalog_ptr, sizeof(NEFS_CATALOG_STRUCT), sizeof(NEFS_CATALOG_STRUCT)); + rt_copy_memory_safe(&tmp, catalog_ptr, sizeof(NEFS_CATALOG_STRUCT), + sizeof(NEFS_CATALOG_STRUCT)); out_lba = cursor; return catalog_ptr; } @@ -619,7 +624,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* if (!KStringBuilder::Equals(catalog_name, NeFileSystemHelper::Root()) && local_search) { Char parent_name[kNeFSCatalogNameLen] = {0}; SizeT nameLen = rt_string_len(catalog_name); - rt_copy_memory_safe(const_cast(catalog_name), parent_name, nameLen + 1, kNeFSCatalogNameLen); + rt_copy_memory_safe(const_cast(catalog_name), parent_name, nameLen + 1, + kNeFSCatalogNameLen); SizeT indexReverseCopy = nameLen - 1; if (parent_name[indexReverseCopy] == NeFileSystemHelper::Separator()) { @@ -728,7 +734,7 @@ _Output Boolean NeFileSystemParser::RemoveCatalog(_Input const Char* catalog_nam catalog->Flags |= kNeFSFlagDeleted; rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); drive.fPacket.fPacketLba = out_lba; drive.fPacket.fPacketSize = sizeof(NEFS_CATALOG_STRUCT); drive.fPacket.fPacketContent = reinterpret_cast(catalog); @@ -796,7 +802,7 @@ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* cata auto* fs_buf = new NEFS_FORK_STRUCT(); rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); NEFS_FORK_STRUCT* fs_fork_data = nullptr; while (dataForkLba >= kNeFSCatalogStartAddress) { diff --git a/dev/kernel/src/IndexableProperty.cc b/dev/kernel/src/IndexableProperty.cc index 7f983d8b..c11e328d 100644 --- a/dev/kernel/src/IndexableProperty.cc +++ b/dev/kernel/src/IndexableProperty.cc @@ -6,9 +6,9 @@ #include #include -#include #include #include +#include #include /// @brief File indexer API for fast path access. @@ -34,7 +34,8 @@ namespace Indexer { Void fs_index_file(const Char* filename, SizeT filenameLen, IndexableProperty& indexer) { if (!indexer.HasFlag(kIndexerClaimed)) { indexer.AddFlag(kIndexerClaimed); - rt_copy_memory_safe(reinterpret_cast(const_cast(filename)), (VoidPtr) indexer.Leak().Path, filenameLen, kIndexerCatalogNameLength); + rt_copy_memory_safe(reinterpret_cast(const_cast(filename)), + (VoidPtr) indexer.Leak().Path, filenameLen, kIndexerCatalogNameLength); (Void)(kout << "FSKit: Indexed new file: " << filename << kendl); } diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 98b7c7b7..006c4234 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -6,7 +6,7 @@ ------------------------------------------- */ - +#include #include #include #include @@ -16,7 +16,6 @@ #include #include #include -#include /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" @@ -159,8 +158,9 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { Char* container_blob_value = new Char[container_header->VMSize]; - rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, - container_header->VMSize, container_header->VMSize); + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), + container_blob_value, container_header->VMSize, + container_header->VMSize); mm_free_ptr(blob); kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 601df1fa..2b0b06ba 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -13,10 +13,10 @@ #include #include #include +#include #include -#include #include -#include +#include #include #define kStdUserType (0xEE) @@ -59,14 +59,16 @@ namespace Detail { //////////////////////////////////////////////////////////// User::User(const Int32& sel, const Char* user_name) : mUserRing((UserRingKind) sel) { MUST_PASS(sel >= 0); - rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), kMaxUserNameLen); + rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), + kMaxUserNameLen); } //////////////////////////////////////////////////////////// /// @brief User ring constructor. //////////////////////////////////////////////////////////// User::User(const UserRingKind& ring_kind, const Char* user_name) : mUserRing(ring_kind) { - rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), kMaxUserNameLen); + rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), + kMaxUserNameLen); } //////////////////////////////////////////////////////////// diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 7b7e4497..ef2c0686 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -20,8 +20,8 @@ #include #include #include -#include #include +#include ///! BUGS: 0 @@ -379,7 +379,8 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im return -kErrorProcessFault; } - rt_copy_memory_safe(reinterpret_cast(const_cast(name)), process.Name, len, kSchedNameLen); + rt_copy_memory_safe(reinterpret_cast(const_cast(name)), process.Name, len, + kSchedNameLen); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ process.VMRegister = kKernelVM; -- cgit v1.2.3 From f3062a7d633d123c2de863398d174a0dd6516d85 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 27 Jun 2025 20:31:10 +0200 Subject: fix: Fix a bad `stacksym` check. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 006c4234..dfd3601b 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -246,7 +246,7 @@ namespace Utils { if (id != kSchedInvalidPID) { auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData); - if (!symname) { + if (!stacksym) { stacksym = ErrorOr{(VoidPtr) new UIntPtr(kSchedMaxStackSz)}; } -- cgit v1.2.3 From 95ae0f42a5f22bd913a713db987729520c42a123 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 4 Jul 2025 18:58:57 +0200 Subject: feat: see below. feat: Rework `OpenMSG` into `LibMSG` feat: Rename `generic_kits` to `misc` Signed-off-by: Amlal El Mahrouss --- CODEOWNERS | 2 +- compile_flags.txt | 2 +- dev/generic_kits/.keep | 0 dev/generic_kits/BenchKit/Chrono.h | 31 ------------------ dev/generic_kits/BenchKit/X64Chrono.h | 54 -------------------------------- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 2 +- dev/kernel/src/PEFCodeMgr.cc | 12 +++---- dev/libMsg/.keep | 0 dev/libMsg/MsgKit/Network.h | 9 ++++++ dev/libMsg/MsgKit/Server.h | 36 +++++++++++++++++++++ dev/libMsg/obj/.keep | 0 dev/libMsg/script/window_client.json | 7 +++++ dev/libMsg/src/.keep | 0 dev/misc/.keep | 0 dev/misc/BenchKit/Chrono.h | 31 ++++++++++++++++++ dev/misc/BenchKit/X64Chrono.h | 54 ++++++++++++++++++++++++++++++++ dev/open_msg/.keep | 0 dev/open_msg/MsgKit/Server.h | 22 ------------- dev/open_msg/obj/.keep | 0 dev/open_msg/script/window_client.json | 7 ----- dev/open_msg/src/.keep | 0 21 files changed, 146 insertions(+), 123 deletions(-) delete mode 100644 dev/generic_kits/.keep delete mode 100644 dev/generic_kits/BenchKit/Chrono.h delete mode 100644 dev/generic_kits/BenchKit/X64Chrono.h create mode 100644 dev/libMsg/.keep create mode 100644 dev/libMsg/MsgKit/Network.h create mode 100644 dev/libMsg/MsgKit/Server.h create mode 100644 dev/libMsg/obj/.keep create mode 100644 dev/libMsg/script/window_client.json create mode 100644 dev/libMsg/src/.keep create mode 100644 dev/misc/.keep create mode 100644 dev/misc/BenchKit/Chrono.h create mode 100644 dev/misc/BenchKit/X64Chrono.h delete mode 100644 dev/open_msg/.keep delete mode 100644 dev/open_msg/MsgKit/Server.h delete mode 100644 dev/open_msg/obj/.keep delete mode 100644 dev/open_msg/script/window_client.json delete mode 100644 dev/open_msg/src/.keep (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/CODEOWNERS b/CODEOWNERS index 1e498733..d68cd22f 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -2,6 +2,6 @@ /dev/kernel/ @amlel-el-mahrouss /dev/boot/ @amlel-el-mahrouss /dev/ddk/ @amlel-el-mahrouss -/dev/open_msg/ @amlel-el-mahrouss +/dev/libMsg/ @amlel-el-mahrouss /dev/libSystem/ @amlel-el-mahrouss # some other parts (tooling, frameworks) need ownership too. \ No newline at end of file diff --git a/compile_flags.txt b/compile_flags.txt index 12740fa6..fbfd1d06 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -3,7 +3,7 @@ -Idev/user -Idev/boot -Idev/system_sdk --Idev/generic_kits +-Idev/misc -Idev/ddk -Ipublic/tools -Ipublic/tools/mk.app diff --git a/dev/generic_kits/.keep b/dev/generic_kits/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/generic_kits/BenchKit/Chrono.h b/dev/generic_kits/BenchKit/Chrono.h deleted file mode 100644 index 394f16fd..00000000 --- a/dev/generic_kits/BenchKit/Chrono.h +++ /dev/null @@ -1,31 +0,0 @@ -/* ------------------------------------------- - -Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#ifndef BENCHKIT_CHRONO_H -#define BENCHKIT_CHRONO_H - -#include -#include - -namespace Kernel { -class ChronoInterface; - -/// @brief a Chronometer interface used for benchmarking. -class ChronoInterface { - public: - ChronoInterface() = default; - virtual ~ChronoInterface() = default; - - NE_COPY_DEFAULT(ChronoInterface); - - virtual void Start() = 0; - virtual void Stop() = 0; - virtual void Reset() = 0; - virtual UInt64 GetElapsedTime() const = 0; -}; -} // namespace Kernel - -#endif // BENCHKIT_CHRONO_H diff --git a/dev/generic_kits/BenchKit/X64Chrono.h b/dev/generic_kits/BenchKit/X64Chrono.h deleted file mode 100644 index 229146cb..00000000 --- a/dev/generic_kits/BenchKit/X64Chrono.h +++ /dev/null @@ -1,54 +0,0 @@ -/* ------------------------------------------- - -Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -#if defined(__NE_AMD64__) - -namespace Kernel { -class X64Chrono; -struct X64ChronoTraits; - -struct X64ChronoTraits { - private: - STATIC UInt64 TickImpl_(void) { - UInt64 a = 0, d = 0; - __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); - return (d << 32) | a; - } - - friend X64Chrono; -}; - -/// @brief X86_64 hardware chrono implementation using the `rdtsc` instruction. -class X64Chrono : public ChronoInterface { - public: - X64Chrono() = default; - ~X64Chrono() override = default; - - NE_COPY_DEFAULT(X64Chrono); - - public: - void Start() override { fStart = X64ChronoTraits::TickImpl_(); } - - void Stop() override { fStop = X64ChronoTraits::TickImpl_(); } - - void Reset() override { - fStart = 0; - fStop = 0; - } - - UInt64 GetElapsedTime() const override { return fStop - fStart; } - - private: - UInt64 fStart = 0; - UInt64 fStop = 0; -}; -} // namespace Kernel - -#endif // defined(__NE_AMD64__) \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 446a1e85..2ddf980f 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index dfd3601b..f5f0eeb5 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -203,17 +203,17 @@ const Char* PEFLoader::Path() { const Char* PEFLoader::AsString() { #ifdef __32x0__ - return "32x0 PEF."; + return "32x0 PEF"; #elif defined(__64x0__) - return "64x0 PEF."; + return "64x0 PEF"; #elif defined(__x86_64__) - return "x86_64 PEF."; + return "x86_64 PEF"; #elif defined(__aarch64__) - return "AARCH64 PEF."; + return "AARCH64 PEF"; #elif defined(__powerpc64__) - return "POWER64 PEF."; + return "POWER64 PEF"; #else - return "???? PEF."; + return "???? PEF"; #endif // __32x0__ || __64x0__ || __x86_64__ || __powerpc64__ } diff --git a/dev/libMsg/.keep b/dev/libMsg/.keep new file mode 100644 index 00000000..e69de29b diff --git a/dev/libMsg/MsgKit/Network.h b/dev/libMsg/MsgKit/Network.h new file mode 100644 index 00000000..c7b562a2 --- /dev/null +++ b/dev/libMsg/MsgKit/Network.h @@ -0,0 +1,9 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include \ No newline at end of file diff --git a/dev/libMsg/MsgKit/Server.h b/dev/libMsg/MsgKit/Server.h new file mode 100644 index 00000000..33d10407 --- /dev/null +++ b/dev/libMsg/MsgKit/Server.h @@ -0,0 +1,36 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#ifdef __cplusplus +#include +#else +#include +#endif + +struct LIBMSG_EXPR; + +/// @brief an expression chain of LibMSG. +struct LIBMSG_EXPR final { +#ifdef __cplusplus + CF::CFString* l_key{nullptr}; + CF::CFString* l_value{nullptr}; +#else + VoidPtr l_key{nullptr}; + VoidPtr l_value{nullptr}; +#endif + + LIBMSG_EXPR* l_head{nullptr}; + LIBMSG_EXPR* l_tail{nullptr}; + LIBMSG_EXPR* l_child{nullptr}; +}; + +typedef Void (*libmsg_func_t)(LIBMSG_EXPR* arg); + +IMPORT_C Void libmsg_init_library(libmsg_func_t* funcs, SizeT cnt); +IMPORT_C UInt32 libmsg_eval_library(struct LIBMSG_EXPR* head); +IMPORT_C UInt32 libmsg_close_library(Void); diff --git a/dev/libMsg/obj/.keep b/dev/libMsg/obj/.keep new file mode 100644 index 00000000..e69de29b diff --git a/dev/libMsg/script/window_client.json b/dev/libMsg/script/window_client.json new file mode 100644 index 00000000..4c8a21ba --- /dev/null +++ b/dev/libMsg/script/window_client.json @@ -0,0 +1,7 @@ +{ + "id": 1, + "pos": { "x": 100, "y": 100 }, + "size": { "w": 300, "h": 200 }, + "title": "Window Client", + "on-click": "_OnClickCSymbol" +} \ No newline at end of file diff --git a/dev/libMsg/src/.keep b/dev/libMsg/src/.keep new file mode 100644 index 00000000..e69de29b diff --git a/dev/misc/.keep b/dev/misc/.keep new file mode 100644 index 00000000..e69de29b diff --git a/dev/misc/BenchKit/Chrono.h b/dev/misc/BenchKit/Chrono.h new file mode 100644 index 00000000..394f16fd --- /dev/null +++ b/dev/misc/BenchKit/Chrono.h @@ -0,0 +1,31 @@ +/* ------------------------------------------- + +Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#ifndef BENCHKIT_CHRONO_H +#define BENCHKIT_CHRONO_H + +#include +#include + +namespace Kernel { +class ChronoInterface; + +/// @brief a Chronometer interface used for benchmarking. +class ChronoInterface { + public: + ChronoInterface() = default; + virtual ~ChronoInterface() = default; + + NE_COPY_DEFAULT(ChronoInterface); + + virtual void Start() = 0; + virtual void Stop() = 0; + virtual void Reset() = 0; + virtual UInt64 GetElapsedTime() const = 0; +}; +} // namespace Kernel + +#endif // BENCHKIT_CHRONO_H diff --git a/dev/misc/BenchKit/X64Chrono.h b/dev/misc/BenchKit/X64Chrono.h new file mode 100644 index 00000000..706ce883 --- /dev/null +++ b/dev/misc/BenchKit/X64Chrono.h @@ -0,0 +1,54 @@ +/* ------------------------------------------- + +Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +#if defined(__NE_AMD64__) + +namespace Kernel { +class X64Chrono; +struct X64ChronoTraits; + +struct X64ChronoTraits { + private: + STATIC UInt64 TickImpl_(void) { + UInt64 a = 0, d = 0; + __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); + return (d << 32) | a; + } + + friend X64Chrono; +}; + +/// @brief X86_64 hardware chrono implementation using the `rdtsc` instruction. +class X64Chrono : public ChronoInterface { + public: + X64Chrono() = default; + ~X64Chrono() override = default; + + NE_COPY_DEFAULT(X64Chrono); + + public: + void Start() override { fStart = X64ChronoTraits::TickImpl_(); } + + void Stop() override { fStop = X64ChronoTraits::TickImpl_(); } + + void Reset() override { + fStart = 0; + fStop = 0; + } + + UInt64 GetElapsedTime() const override { return fStop - fStart; } + + private: + UInt64 fStart = 0; + UInt64 fStop = 0; +}; +} // namespace Kernel + +#endif // defined(__NE_AMD64__) \ No newline at end of file diff --git a/dev/open_msg/.keep b/dev/open_msg/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/open_msg/MsgKit/Server.h b/dev/open_msg/MsgKit/Server.h deleted file mode 100644 index 54183472..00000000 --- a/dev/open_msg/MsgKit/Server.h +++ /dev/null @@ -1,22 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include - -struct OPENMSG_EXPR; - -struct OPENMSG_EXPR { - Kernel::KString* l_head; - Kernel::MutableArray l_args; -}; - -typedef Kernel::Void (*openmsg_func_t)(OPENMSG_EXPR* arg); - -EXTERN_C Kernel::Void openmsg_init_library(openmsg_func_t* funcs, Kernel::SizeT cnt); -EXTERN_C Kernel::UInt32 openmsg_close_library(Kernel::Void); diff --git a/dev/open_msg/obj/.keep b/dev/open_msg/obj/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/dev/open_msg/script/window_client.json b/dev/open_msg/script/window_client.json deleted file mode 100644 index 4c8a21ba..00000000 --- a/dev/open_msg/script/window_client.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "id": 1, - "pos": { "x": 100, "y": 100 }, - "size": { "w": 300, "h": 200 }, - "title": "Window Client", - "on-click": "_OnClickCSymbol" -} \ No newline at end of file diff --git a/dev/open_msg/src/.keep b/dev/open_msg/src/.keep deleted file mode 100644 index e69de29b..00000000 -- cgit v1.2.3 From 3616886fed21351949865ba0f57011624a172e74 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 8 Jul 2025 09:35:45 +0200 Subject: feat: Reinforce code inside PEFCodeMgr and mkfs.hefs, extend fsck.hefs and libmkfs. fix: Fix UserMgr FNV hashing. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 9 +++++++-- dev/kernel/src/UserMgr.cc | 6 +++--- dev/kernel/src/UserProcessTeam.cc | 1 + dev/kernel/src/UtfUtils.cc | 2 ++ tooling/fsck.hefs.cc | 10 ++++++++-- tooling/libmkfs/mkfs.h | 3 +++ tooling/mkfs.hefs.cc | 8 ++++++-- 7 files changed, 30 insertions(+), 9 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index f5f0eeb5..db24336e 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -17,6 +17,10 @@ #include #include +/// @author Amlal El Mahrouss (amlal@nekernel.org) +/// @brief PEF backend for the Code Manager. +/// @file PEFCodeMgr.cc + /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" #define kPefHeapSizeSymbol "__PEFSizeOfReserveHeap" @@ -61,9 +65,10 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) fFile.New(const_cast(path), kRestrictRB); fPath = KStringBuilder::Construct(path).Leak(); - auto kPefHeader = "PEF_CONTAINER"; + constexpr auto kPefHeader = "PEF_CONTAINER"; - fCachedBlob = fFile->Read(kPefHeader, mib_cast(16)); + /// @note zero here means that the FileMgr will read every container header inside the file. + fCachedBlob = fFile->Read(kPefHeader, 0UL); PEFContainer* container = reinterpret_cast(fCachedBlob); diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 2b0b06ba..8e4ba540 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -33,8 +33,8 @@ namespace Detail { /// \return the hashed password //////////////////////////////////////////////////////////// STATIC UInt64 user_fnv_generator(const Char* password, User* user) { - if (!password || !user) return 1; - if (*password == 0) return 1; + if (!password || !user) return 0; + if (*password == 0) return 0; kout << "user_fnv_generator: Hashing user password...\r"; @@ -50,7 +50,7 @@ namespace Detail { kout << "user_fnv_generator: Hashed user password.\r"; - return 0; + return hash; } } // namespace Detail diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index dd21ac49..73ba7285 100644 --- a/dev/kernel/src/UserProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc @@ -7,6 +7,7 @@ /***********************************************************************************/ /// @file UserProcessTeam.cc /// @brief Process teams implementation. +/// @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ #include diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc index ae17aed7..a5c03b85 100644 --- a/dev/kernel/src/UtfUtils.cc +++ b/dev/kernel/src/UtfUtils.cc @@ -6,6 +6,8 @@ #include +/// @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { Size urt_string_len(const Utf8Char* str) { SizeT len{0}; diff --git a/tooling/fsck.hefs.cc b/tooling/fsck.hefs.cc index 0fa697be..950a709b 100644 --- a/tooling/fsck.hefs.cc +++ b/tooling/fsck.hefs.cc @@ -34,14 +34,20 @@ int main(int argc, char** argv) { } mkfs::hefs::BootNode boot_node; + std::memset(&boot_node, 0, sizeof(boot_node)); - if (strncmp(boot_node.magic, kHeFSMagic, kHeFSMagicLen) != 0) { + if (strncmp(boot_node.magic, kHeFSMagic, kHeFSMagicLen) != 0 || boot_node.sectorCount < 1 || + boot_node.sectorSize < kMkFsSectorSz) { mkfs::console_out() << "hefs: error: Device is not an HeFS disk: " << opt_disk << "\n"; return EXIT_FAILURE; } - mkfs::console_out() << "hefs: HeFS partition is is healthy, exiting...\r"; + if (boot_node.badSectors >= kMkFsMaxBadSectors) { + mkfs::console_out() << "hefs: error: HeFS disk has too much bad sectors: " << opt_disk << "\n"; + return EXIT_FAILURE; + } + mkfs::console_out() << "hefs: HeFS partition is is healthy, exiting...\r"; return EXIT_SUCCESS; } \ No newline at end of file diff --git a/tooling/libmkfs/mkfs.h b/tooling/libmkfs/mkfs.h index d954624c..d87060da 100644 --- a/tooling/libmkfs/mkfs.h +++ b/tooling/libmkfs/mkfs.h @@ -10,6 +10,9 @@ #include #include +#define kMkFsSectorSz (512U) +#define kMkFsMaxBadSectors (128U) + /// @internal namespace mkfs { diff --git a/tooling/mkfs.hefs.cc b/tooling/mkfs.hefs.cc index c1cf9bca..3c2727fd 100644 --- a/tooling/mkfs.hefs.cc +++ b/tooling/mkfs.hefs.cc @@ -150,12 +150,16 @@ int main(int argc, char** argv) { boot_node.magic[magic_copy] = 0; constexpr size_t vol_slots = kHeFSPartNameLen; + std::memset(boot_node.volumeName, 0, sizeof(boot_node.volumeName)); + size_t label_units = std::min(kLabel.size(), vol_slots - 1); + for (size_t i = 0; i < label_units; ++i) { - boot_node.volumeName[i] = static_cast(kLabel[i]); + boot_node.volumeName[i] = static_cast(kLabel[i]); } - boot_node.volumeName[label_units] = 0; + + boot_node.volumeName[label_units] = 0U; output_device.seekp(static_cast(start_ind)); if (!output_device.good()) { -- cgit v1.2.3 From a1f5343ec80f8882f23f1a3f6277a5ff18fe1b2b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:13:27 +0100 Subject: fix: PEFCodeMgr: loop over `VMAddress` correctly inside PEF Code Manager. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index db24336e..bfd9ff6e 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -67,7 +67,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) constexpr auto kPefHeader = "PEF_CONTAINER"; - /// @note zero here means that the FileMgr will read every container header inside the file. + /// @note zero here means that the FileMgr will read every container header inside the file. fCachedBlob = fFile->Read(kPefHeader, 0UL); PEFContainer* container = reinterpret_cast(fCachedBlob); @@ -166,17 +166,20 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, container_header->VMSize, container_header->VMSize); + mm_free_ptr(blob); - kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - auto ret = HAL::mm_map_page((VoidPtr) container_header->VMAddress, - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + for (SizeT i_vm{}; i_vm < container_header->VMSize; ++i_vm) { + auto ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + i_vm), + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); - if (ret != kErrorSuccess) { - mm_free_ptr(container_blob_value); - return ErrorOr{kErrorInvalidData}; + if (ret != kErrorSuccess) { + delete[] container_blob_value; + return ErrorOr{kErrorInvalidData}; + } } return ErrorOr{container_blob_value}; -- cgit v1.2.3 From 406d6c77c5dec5a71bd188db96607802e24f13d6 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:17:03 +0100 Subject: feat: Improve iteration loop for PEFCodeMgr's VMAddress mapping. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index bfd9ff6e..af7ea03f 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -171,10 +171,11 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; + auto ret = false; for (SizeT i_vm{}; i_vm < container_header->VMSize; ++i_vm) { - auto ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + i_vm), - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + i_vm), + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { delete[] container_blob_value; -- cgit v1.2.3 From 5c8b167320df4cd3cd91d36705ff9bad4d0e73c4 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:20:59 +0100 Subject: feat: use `kPefMagicFat` instead of `kPefMagic` to check for a FAT binary. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index af7ea03f..22ef7ba3 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -77,10 +77,11 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { return; - } else if (container->Magic[4] == kPefMagic[0] && container->Magic[3] == kPefMagic[1] && - container->Magic[2] == kPefMagic[2] && container->Magic[1] == kPefMagic[3] && - container->Magic[0] == kPefMagic[4] && container->Abi == kPefAbi) { - /// This is a fat binary. + } else if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagicFat[0] && + container->Magic[1] == kPefMagicFat[1] && container->Magic[2] == kPefMagicFat[2] && + container->Magic[3] == kPefMagicFat[3] && container->Magic[4] == kPefMagicFat[4] && + container->Abi == kPefAbi) { + /// This is a fat binary, treat it as such. this->fFatBinary = true; return; } @@ -89,7 +90,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) if (fCachedBlob) mm_free_ptr(fCachedBlob); - kout << "PEFLoader: Warning: Executable format error!\r"; + kout << "PEFLoader: warning: Executable format error!\r"; fCachedBlob = nullptr; } -- cgit v1.2.3 From f8d0d1d8f2745e9fad759638c74d0047fda36fee Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:24:23 +0100 Subject: fix: PEFCodeMgr: container_header didn't increment, fixed that. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 22ef7ba3..da69202e 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -153,28 +153,28 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { error_or_symbol.Leak().Leak() += name; for (SizeT index = 0; index < container->Count; ++index) { - if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header->Kind == kind) { - if (container_header->Cpu != Detail::ldr_get_platform()) { + if (KStringBuilder::Equals(container_header[index].Name, error_or_symbol.Leak().Leak().CData())) { + if (container_header[index].Kind == kind) { + if (container_header[index].Cpu != Detail::ldr_get_platform()) { if (!this->fFatBinary) { mm_free_ptr(blob); return ErrorOr{kErrorInvalidData}; } } - Char* container_blob_value = new Char[container_header->VMSize]; + Char* container_blob_value = new Char[container_header[index].VMSize]; rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), - container_blob_value, container_header->VMSize, - container_header->VMSize); + container_blob_value, container_header[index].VMSize, + container_header[index].VMSize); mm_free_ptr(blob); - kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; auto ret = false; - for (SizeT i_vm{}; i_vm < container_header->VMSize; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + i_vm), + for (SizeT i_vm{}; i_vm < container_header[index].VMSize; ++i_vm) { + ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + i_vm), (VoidPtr) HAL::mm_get_page_addr(container_blob_value), HAL::kMMFlagsPresent | HAL::kMMFlagsUser); -- cgit v1.2.3 From c02e7972bd2a308d9c9ac3aec78d0530d5498b0a Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:27:22 +0100 Subject: feat: `mm_map_page` should iterate over `pages_count`, not `VMSize` directly. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index da69202e..357c279b 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -16,6 +16,7 @@ #include #include #include +#include "HALKit/AMD64/Paging.h" /// @author Amlal El Mahrouss (amlal@nekernel.org) /// @brief PEF backend for the Code Manager. @@ -173,7 +174,10 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; auto ret = false; - for (SizeT i_vm{}; i_vm < container_header[index].VMSize; ++i_vm) { + + auto pages_count = (container_header[index].VMSize + kPageSize - 1) / kPageSize; + + for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + i_vm), (VoidPtr) HAL::mm_get_page_addr(container_blob_value), HAL::kMMFlagsPresent | HAL::kMMFlagsUser); -- cgit v1.2.3 From 7f766a5a7f5cf1fed9ad0792e545eff724952ae9 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:32:01 +0100 Subject: feat&fix: critical patches to the PEFCodeMgr. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 357c279b..71e4e232 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -78,7 +78,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { return; - } else if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagicFat[0] && + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && container->Magic[4] == kPefMagicFat[4] && container->Abi == kPefAbi) { @@ -173,12 +173,12 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; - auto ret = false; + auto ret = 0; auto pages_count = (container_header[index].VMSize + kPageSize - 1) / kPageSize; for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + i_vm), + ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + (i_vm * kPageSize)), (VoidPtr) HAL::mm_get_page_addr(container_blob_value), HAL::kMMFlagsPresent | HAL::kMMFlagsUser); -- cgit v1.2.3 From d728ff289123fff3443a897cca3fc6424634f536 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:35:52 +0100 Subject: fix! PEFCodeMgr: critical fixes applied to PEF loader. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/PEFCodeMgr.h | 4 +-- dev/kernel/src/PEFCodeMgr.cc | 61 +++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 36 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h index 899a1869..d61aa863 100644 --- a/dev/kernel/KernelKit/PEFCodeMgr.h +++ b/dev/kernel/KernelKit/PEFCodeMgr.h @@ -63,8 +63,8 @@ class PEFLoader : public LoaderInterface { Ref fPath; VoidPtr fCachedBlob; - bool fFatBinary; - bool fBad; + BOOL fFatBinary{}; + BOOL fBad{}; }; namespace Utils { diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 71e4e232..d61a3cab 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -78,10 +78,9 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && container->Abi == kPefAbi) { return; - } else if (container->Magic[0] == kPefMagicFat[0] && - container->Magic[1] == kPefMagicFat[1] && container->Magic[2] == kPefMagicFat[2] && - container->Magic[3] == kPefMagicFat[3] && container->Magic[4] == kPefMagicFat[4] && - container->Abi == kPefAbi) { + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && + container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && + container->Magic[4] == kPefMagicFat[4] && container->Abi == kPefAbi) { /// This is a fat binary, treat it as such. this->fFatBinary = true; return; @@ -111,9 +110,7 @@ PEFLoader::~PEFLoader() { /// @param kind kind of symbol we want. /***********************************************************************************/ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { - if (!fCachedBlob || fBad || !name) return ErrorOr{kErrorInvalidData}; - - PEFContainer* container = reinterpret_cast(fCachedBlob); + if (fBad || !name) return ErrorOr{kErrorInvalidData}; auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); @@ -152,44 +149,40 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } error_or_symbol.Leak().Leak() += name; - - for (SizeT index = 0; index < container->Count; ++index) { - if (KStringBuilder::Equals(container_header[index].Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header[index].Kind == kind) { - if (container_header[index].Cpu != Detail::ldr_get_platform()) { - if (!this->fFatBinary) { - mm_free_ptr(blob); - return ErrorOr{kErrorInvalidData}; - } + if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { + if (container_header->Kind == kind) { + if (container_header->Cpu != Detail::ldr_get_platform()) { + if (!this->fFatBinary) { + mm_free_ptr(blob); + return ErrorOr{kErrorInvalidData}; } + } - Char* container_blob_value = new Char[container_header[index].VMSize]; + Char* container_blob_value = new Char[container_header->VMSize]; - rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), - container_blob_value, container_header[index].VMSize, - container_header[index].VMSize); + rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, + container_header->VMSize, container_header->VMSize); - mm_free_ptr(blob); + mm_free_ptr(blob); - kout << "PEFLoader: info: Loaded stub: " << container_header[index].Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - auto ret = 0; + auto ret = 0; - auto pages_count = (container_header[index].VMSize + kPageSize - 1) / kPageSize; + auto pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; - for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header[index].VMAddress + (i_vm * kPageSize)), - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { + ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) HAL::mm_get_page_addr(container_blob_value), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); - if (ret != kErrorSuccess) { - delete[] container_blob_value; - return ErrorOr{kErrorInvalidData}; - } + if (ret != kErrorSuccess) { + delete[] container_blob_value; + return ErrorOr{kErrorInvalidData}; } - - return ErrorOr{container_blob_value}; } + + return ErrorOr{container_blob_value}; } } -- cgit v1.2.3 From 2a28b34b046904667fb5ccc50b367320095c08f5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 14:39:51 +0100 Subject: meta: PEFCodeMgr: fix code styling issues. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index d61a3cab..84afdabd 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -16,7 +16,6 @@ #include #include #include -#include "HALKit/AMD64/Paging.h" /// @author Amlal El Mahrouss (amlal@nekernel.org) /// @brief PEF backend for the Code Manager. @@ -136,8 +135,8 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } default: return ErrorOr{kErrorInvalidData}; - ; // prevent that from the kernel's mode perspective, let that happen if it - // were a user process. + // prevent that from the kernel's mode perspective, let that happen if it + // were a user process. } Char* unconst_symbol = const_cast(name); -- cgit v1.2.3 From be0ec3d2db29c03d3da6d9d1080b399e0f43d16c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 17:07:26 +0100 Subject: feat: PEFCodeMgr: make use of explicit types instead of `auto` why: - for better code clarity. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 8 ++++---- dev/kernel/src/PageMgr.cc | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 84afdabd..a6a28839 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -148,6 +148,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } error_or_symbol.Leak().Leak() += name; + if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { if (container_header->Kind == kind) { if (container_header->Cpu != Detail::ldr_get_platform()) { @@ -166,9 +167,8 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - auto ret = 0; - - auto pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; + Int32 ret = 0; + SizeT pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), @@ -243,7 +243,7 @@ namespace Utils { symname = ErrorOr{(VoidPtr) rt_alloc_string("USER_PROCESS")}; } - auto id = + ProcessID id = UserProcessScheduler::The().Spawn(reinterpret_cast(symname.Leak().Leak()), errOrStart.Leak().Leak(), exec.GetBlob().Leak().Leak()); diff --git a/dev/kernel/src/PageMgr.cc b/dev/kernel/src/PageMgr.cc index e78f4908..2aa2a79c 100644 --- a/dev/kernel/src/PageMgr.cc +++ b/dev/kernel/src/PageMgr.cc @@ -47,7 +47,7 @@ Bool PTEWrapper::Reclaim() { } /// @brief Request a PTE. -/// @param Rw r/w? +/// @param Rw Is it read write? or is it read only? /// @param User user mode? /// @param ExecDisable disable execution on page? /// @return -- cgit v1.2.3 From 014444356c42e46dbf4e2e9de802e6219ac508f5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 18:48:58 +0100 Subject: fix: PEFCodeMgr: codebase fixes. The PEF Code Manager had critical bugs in memory safety and virtual memory mapping. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index a6a28839..8887e6ce 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -109,14 +109,22 @@ PEFLoader::~PEFLoader() { /// @param kind kind of symbol we want. /***********************************************************************************/ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { - if (fBad || !name) return ErrorOr{kErrorInvalidData}; + if (!fCachedBlob || fBad || !name) return ErrorOr{kErrorInvalidData}; auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); + PEFContainer* container = reinterpret_cast(fCachedBlob); + + if (!container) return ErrorOr{kErrorInvalidData}; + if (container->Cpu != Detail::ldr_get_platform()) return ErrorOr{kErrorInvalidData}; + PEFCommandHeader* container_header = reinterpret_cast(blob); - constexpr auto kMangleCharacter = '$'; - const Char* kContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; + if (!container_header || container_header->VMSize < 1 || container_header->VMAddress == 0) + return ErrorOr{kErrorInvalidData}; + + const auto kMangleCharacter = '$'; + const Char* kContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; ErrorOr error_or_symbol; @@ -154,6 +162,8 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { if (container_header->Cpu != Detail::ldr_get_platform()) { if (!this->fFatBinary) { mm_free_ptr(blob); + blob = nullptr; + return ErrorOr{kErrorInvalidData}; } } @@ -167,13 +177,14 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; - Int32 ret = 0; + Int32 ret = 0; SizeT pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { - ret = HAL::mm_map_page((VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), - (VoidPtr) HAL::mm_get_page_addr(container_blob_value), - HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + ret = HAL::mm_map_page( + (VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) (HAL::mm_get_page_addr(container_blob_value) + (i_vm * kPageSize)), + HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { delete[] container_blob_value; -- cgit v1.2.3 From 9e5243927dfc15bcd62da32eb3fbe114e1cedfdb Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 18:55:05 +0100 Subject: feat: check if the command header has the same CPU type as the container. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/PEFCodeMgr.cc | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 8887e6ce..98830fdd 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -123,6 +123,10 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { if (!container_header || container_header->VMSize < 1 || container_header->VMAddress == 0) return ErrorOr{kErrorInvalidData}; + if (container_header->Cpu != container->Cpu) { + return ErrorOr{kErrorInvalidData}; + } + const auto kMangleCharacter = '$'; const Char* kContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; -- cgit v1.2.3 From 1bde51e7123ebe7660edecabd3d9dca355d1751f Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 5 Aug 2025 05:29:06 +0100 Subject: feat: PEFCodeMgr: Improved FAT binary support, made code more readable. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/LockDelegate.h | 8 ++--- dev/kernel/src/PEFCodeMgr.cc | 59 ++++++++++++++++++++++--------------- 2 files changed, 39 insertions(+), 28 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/KernelKit/LockDelegate.h b/dev/kernel/KernelKit/LockDelegate.h index b5977c92..a8c36de7 100644 --- a/dev/kernel/KernelKit/LockDelegate.h +++ b/dev/kernel/KernelKit/LockDelegate.h @@ -11,10 +11,10 @@ namespace Kernel { enum { - kLockInvalid = 0, - kLockDone = 200, - kLockTimedOut, - kLockCount = 3, + kLockInvalid = 0, + kLockDone = 200, + kLockTimedOut = 300, + kLockCount = 3, }; /// @brief Lock condition pointer. diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 98830fdd..5611bafe 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -72,24 +72,25 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) PEFContainer* container = reinterpret_cast(fCachedBlob); - if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagic[0] && - container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && - container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4] && - container->Abi == kPefAbi) { - return; - } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && - container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && - container->Magic[4] == kPefMagicFat[4] && container->Abi == kPefAbi) { - /// This is a fat binary, treat it as such. - this->fFatBinary = true; - return; + if (container->Abi == kPefAbi) { + if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagic[0] && + container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && + container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4]) { + return; + } else if (container->Magic[0] == kPefMagicFat[0] && container->Magic[1] == kPefMagicFat[1] && + container->Magic[2] == kPefMagicFat[2] && container->Magic[3] == kPefMagicFat[3] && + container->Magic[4] == kPefMagicFat[4]) { + /// This is a fat binary, treat it as such. + this->fFatBinary = true; + return; + } } fBad = true; if (fCachedBlob) mm_free_ptr(fCachedBlob); - kout << "PEFLoader: warning: Executable format error!\r"; + kout << "PEFLoader: warning: exec format error!\r"; fCachedBlob = nullptr; } @@ -113,17 +114,19 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { auto blob = fFile->Read(name, sizeof(PEFCommandHeader)); + if (!blob) return ErrorOr{kErrorInvalidData}; + PEFContainer* container = reinterpret_cast(fCachedBlob); if (!container) return ErrorOr{kErrorInvalidData}; - if (container->Cpu != Detail::ldr_get_platform()) return ErrorOr{kErrorInvalidData}; - PEFCommandHeader* container_header = reinterpret_cast(blob); + PEFCommandHeader* command_header = reinterpret_cast(blob); - if (!container_header || container_header->VMSize < 1 || container_header->VMAddress == 0) + if (command_header->VMSize < 1 || command_header->VMAddress == 0) return ErrorOr{kErrorInvalidData}; - if (container_header->Cpu != container->Cpu) { + /// fat binary check. + if (command_header->Cpu != container->Cpu && !this->fFatBinary) { return ErrorOr{kErrorInvalidData}; } @@ -161,9 +164,9 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { error_or_symbol.Leak().Leak() += name; - if (KStringBuilder::Equals(container_header->Name, error_or_symbol.Leak().Leak().CData())) { - if (container_header->Kind == kind) { - if (container_header->Cpu != Detail::ldr_get_platform()) { + if (KStringBuilder::Equals(command_header->Name, error_or_symbol.Leak().Leak().CData())) { + if (command_header->Kind == kind) { + if (command_header->Cpu != Detail::ldr_get_platform()) { if (!this->fFatBinary) { mm_free_ptr(blob); blob = nullptr; @@ -172,26 +175,34 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } } - Char* container_blob_value = new Char[container_header->VMSize]; + Char* container_blob_value = new Char[command_header->VMSize]; rt_copy_memory_safe((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, - container_header->VMSize, container_header->VMSize); + command_header->VMSize, command_header->VMSize); mm_free_ptr(blob); - kout << "PEFLoader: info: Loaded stub: " << container_header->Name << "!\r"; + kout << "PEFLoader: info: Loaded stub: " << command_header->Name << "!\r"; Int32 ret = 0; - SizeT pages_count = (container_header->VMSize + kPageSize - 1) / kPageSize; + SizeT pages_count = (command_header->VMSize + kPageSize - 1) / kPageSize; for (SizeT i_vm{}; i_vm < pages_count; ++i_vm) { ret = HAL::mm_map_page( - (VoidPtr) (container_header->VMAddress + (i_vm * kPageSize)), + (VoidPtr) (command_header->VMAddress + (i_vm * kPageSize)), (VoidPtr) (HAL::mm_get_page_addr(container_blob_value) + (i_vm * kPageSize)), HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { + /// We set the VMAddress to nullptr, if the mapping fail here. + for (SizeT i_vm_unmap{}; i_vm_unmap < i_vm; ++i_vm_unmap) { + ret = HAL::mm_map_page((VoidPtr) (command_header->VMAddress + (i_vm * kPageSize)), + nullptr, HAL::kMMFlagsPresent | HAL::kMMFlagsUser); + } + delete[] container_blob_value; + container_blob_value = nullptr; + return ErrorOr{kErrorInvalidData}; } } -- cgit v1.2.3 From 9ac7b512ace3f8a3f5613dbf940484a9fa3c82c2 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 7 Aug 2025 23:30:55 +0100 Subject: feat: PEFCodeMgr.cc: `ldr_get_platform` shall be static. --- dev/kernel/src/PEFCodeMgr.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 5611bafe..3cbc4faa 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -1,4 +1,3 @@ - /* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. @@ -31,7 +30,7 @@ namespace Detail { /***********************************************************************************/ /// @brief Get the PEF platform signature according to the compiled architecture. /***********************************************************************************/ - UInt32 ldr_get_platform(void) noexcept { + static UInt32 ldr_get_platform(void) noexcept { #if defined(__NE_32X0__) return kPefArch32x0; #elif defined(__NE_64X0__) -- cgit v1.2.3 From 621310537c26e8ac0fb3c0d2e38aaa12e3945eec Mon Sep 17 00:00:00 2001 From: Amlal Date: Tue, 12 Aug 2025 19:35:27 +0200 Subject: feat! abi! Breaking ABI changes in the PEF format! Signed-off-by: Amlal --- dev/kernel/KernelKit/PEF.h | 1 + dev/kernel/src/PEFCodeMgr.cc | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) (limited to 'dev/kernel/src/PEFCodeMgr.cc') diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h index ed6fc423..f306c52e 100644 --- a/dev/kernel/KernelKit/PEF.h +++ b/dev/kernel/KernelKit/PEF.h @@ -98,6 +98,7 @@ typedef struct PEFCommandHeader final { UInt32 Flags; /* container flags */ UInt16 Kind; /* container kind */ UIntPtr Offset; /* content offset */ + SizeT OffsetSize; /* offset size (physical size inside the file) */ UIntPtr VMAddress; /* Virtual Address */ SizeT VMSize; /* Virtual Size */ } PACKED PEFCommandHeader; diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 3cbc4faa..c0caeb5b 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -71,7 +71,9 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) PEFContainer* container = reinterpret_cast(fCachedBlob); - if (container->Abi == kPefAbi) { + if (container->Abi == kPefAbi && + container->Count >= + 3) { /* if same ABI, AND: .text, .bss, .data (or at least similar) exists */ if (container->Cpu == Detail::ldr_get_platform() && container->Magic[0] == kPefMagic[0] && container->Magic[1] == kPefMagic[1] && container->Magic[2] == kPefMagic[2] && container->Magic[3] == kPefMagic[3] && container->Magic[4] == kPefMagic[4]) { -- cgit v1.2.3