From 33ba5e743c9c993a0f6b02d2a85aa9796240f7e1 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 17 Jun 2025 23:51:39 +0200 Subject: kernel: fix: Fix duplicates on `IPAddr.cc` and `AsciiUtils.cc`. fix: Fix dead code in `Bool USER_PROCESS::SpawnDylib()` Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/AsciiUtils.cc | 16 ++++------------ dev/kernel/src/Network/IPAddr.cc | 10 +++++++--- dev/kernel/src/UserProcessScheduler.cc | 3 +-- 3 files changed, 12 insertions(+), 17 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/AsciiUtils.cc b/dev/kernel/src/AsciiUtils.cc index bfc56aec..e0162f70 100644 --- a/dev/kernel/src/AsciiUtils.cc +++ b/dev/kernel/src/AsciiUtils.cc @@ -156,26 +156,18 @@ Char* rt_string_has_char(Char* str, Char ch) { return (*str == ch) ? str : nullptr; } -Int32 rt_strcmp(const Char* a, const Char* b) { - Size i = 0; - while (a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) { - ++i; - } - return static_cast(static_cast(a[i]) - static_cast(b[i])); -} - // @uses the deprecated version callers should ensure 'len' is valid. -extern "C" void* memset(void* dst, int c, long long unsigned int len) { +EXTERN_C void* memset(void* dst, int c, long long unsigned int len) { return Kernel::rt_set_memory(dst, c, static_cast(len)); } -extern "C" void* memcpy(void* dst, const void* src, long long unsigned int len) { +EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { Kernel::rt_copy_memory(const_cast(src), dst, static_cast(len)); return dst; } -extern "C" Kernel::Int32 strcmp(const char* a, const char* b) { - return Kernel::rt_strcmp(a, b); +EXTERN_C Kernel::Int32 strcmp(const char* a, const char* b) { + return Kernel::rt_string_cmp(a, b, rt_string_len(a)); } } // namespace Kernel diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc index b341af8f..0a030dc8 100644 --- a/dev/kernel/src/Network/IPAddr.cc +++ b/dev/kernel/src/Network/IPAddr.cc @@ -89,18 +89,22 @@ bool IPFactory::IpCheckVersion4(const Char* ip) { if (!ip) return NO; Int32 cnter = 0; + Int32 dot_cnter = 0; for (SizeT base = 0; base < rt_string_len(ip); ++base) { if (ip[base] == '.') { cnter = 0; + ++dot_cnter; } else { - if (!rt_is_alnum(ip[base])) return false; - if (cnter == 3) return false; + if (!rt_is_alnum(ip[base])) return NO; + if (cnter == 3) return NO; ++cnter; } } - return true; + if (dot_cnter != 3) return NO; + + return YES; } } // namespace Kernel diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index eff53745..d6c91428 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -314,7 +314,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { } /***********************************************************************************/ -/// @brief Add dylib to process. +/// @brief Add dylib to the process object. /***********************************************************************************/ Bool USER_PROCESS::SpawnDylib() { @@ -340,7 +340,6 @@ Bool USER_PROCESS::SpawnDylib() { (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl); this->Crash(); - return NO; return NO; } -- cgit v1.2.3 From f2b53fc242000c0f65aa09db3250ecf97dce6035 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 10:16:05 +0200 Subject: feat: Fix `ProcessLevelRing` enum value `kRingCount` Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/CoreProcessScheduler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index c06ef92c..f64cbf22 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -180,7 +180,7 @@ enum class ProcessLevelRing : Int32 { kRingStdUser = 1, kRingSuperUser = 2, kRingGuestUser = 5, - kRingCount = 5, + kRingCount = 3, }; /***********************************************************************************/ -- cgit v1.2.3 From 6c817b699af42ff454b601e592ff1d3e4894d2e5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 10:19:56 +0200 Subject: meta: Ran `format.sh` Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 6 +++--- dev/kernel/src/Network/IPAddr.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index 61a82314..e6f70f0e 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -11,16 +11,16 @@ #include EXTERN_C Kernel::Void int_handle_breakpoint(Kernel::UIntPtr rip); - EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); +EXTERN_C BOOL mp_handle_gic_interrupt_el0(Void); -EXTERN_C BOOL kEndOfInterrupt; +EXTERN_C BOOL kEndOfInterrupt; EXTERN_C UInt8 kEndOfInterruptVector; STATIC BOOL kIsRunning = NO; /// @note This is managed by the system software. STATIC void hal_int_send_eoi(UInt8 vector) { - kEndOfInterrupt = YES; + kEndOfInterrupt = YES; kEndOfInterruptVector = vector; } diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc index 0a030dc8..ec7d8a35 100644 --- a/dev/kernel/src/Network/IPAddr.cc +++ b/dev/kernel/src/Network/IPAddr.cc @@ -88,7 +88,7 @@ ErrorOr IPFactory::ToKString(Ref& ipv4) { bool IPFactory::IpCheckVersion4(const Char* ip) { if (!ip) return NO; - Int32 cnter = 0; + Int32 cnter = 0; Int32 dot_cnter = 0; for (SizeT base = 0; base < rt_string_len(ip); ++base) { -- cgit v1.2.3 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/KernelKit/PEF.h | 14 ++++++++------ dev/kernel/src/PEFCodeMgr.cc | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h index c28c8f8c..a357e827 100644 --- a/dev/kernel/KernelKit/PEF.h +++ b/dev/kernel/KernelKit/PEF.h @@ -18,12 +18,12 @@ #include #include -#define kPefMagic "Joy!" -#define kPefMagicFat "yoJ!" +#define kPefMagic "Open" +#define kPefMagicFat "nepO" #define kPefMagicLen (5) -#define kPefVersion (4) +#define kPefVersion (0x0500) #define kPefNameLen (256U) /* not mandatory, only for non fork based filesystems. */ @@ -59,10 +59,10 @@ enum { }; enum { + kPefSubArchGeneric, kPefSubArchAMD = 200, kPefSubArchIntel, kPefSubArchARM, - kPefSubArchGeneric, kPefSubArchIBM, }; @@ -98,15 +98,17 @@ typedef struct PEFCommandHeader final { UInt32 Flags; /* container flags */ UInt16 Kind; /* container kind */ UIntPtr Offset; /* content offset */ - UIntPtr VMAddress; /* VM offset */ - SizeT Size; /* content Size */ + UIntPtr VMAddress; /* Virtual Address */ + SizeT VMSize; /* Virtual Size */ } PACKED PEFCommandHeader; enum { + kPefInvalid = 0x0, kPefCode = 0xC, kPefData = 0xD, kPefZero = 0xE, kPefLinkerID = 0x1, + kPefCount = 4, }; } // namespace Kernel 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 eedfeb5f7dd251e3fed8a6fe1d391fddf701d942 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 13:20:10 +0200 Subject: feat: add `note` regarding ARM support for BootZ's BootThread. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/BootThread.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'dev') diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index c477d659..c4a55ae1 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -105,6 +105,8 @@ BootThread::BootThread(VoidPtr blob) : fStartAddress(nullptr), fBlob(blob) { writer.Write("BootZ: Executable entry address: ") .Write((UIntPtr) fStartAddress) .Write("\r"); + + /// @note .text region shall be marked as executable on ARM. } else if (StrCmp(sectionForBootZ, sect->Name) == 0) { struct HANDOVER_INFORMATION_STUB { UInt64 HandoverMagic; -- cgit v1.2.3 From a5cae885d3f714897ae175cc8643fbbd5573dc22 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 17:53:06 +0200 Subject: feat: Implemented `HalPagingMgr` for AArch64. Signed-off-by: Amlal El Mahrouss --- compile_flags.txt | 1 + dev/boot/src/BootThread.cc | 4 +++ dev/kernel/HALKit/ARM64/HalPagingMgr.cc | 46 +++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/compile_flags.txt b/compile_flags.txt index 2005c689..12740fa6 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -19,6 +19,7 @@ -I./ -std=c++20 -D__NE_AMD64__ +-D__NE_ARM64__ -D__NEOSKRNL__ -D__NE_ED__ -xc++ diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index c4a55ae1..377e6e3a 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -107,6 +107,10 @@ BootThread::BootThread(VoidPtr blob) : fStartAddress(nullptr), fBlob(blob) { .Write("\r"); /// @note .text region shall be marked as executable on ARM. + +#ifdef __NE_ARM64__ + +#endif } else if (StrCmp(sectionForBootZ, sect->Name) == 0) { struct HANDOVER_INFORMATION_STUB { UInt64 HandoverMagic; diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc index faad6778..953cee3b 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc @@ -13,15 +13,57 @@ namespace Kernel::HAL { typedef UInt32 PageTableIndex; +EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address) { + if (!virtual_address) return 0; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return 0; + + volatile UInt64* l2_table = reinterpret_cast(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return 0; + + volatile UInt64* l3_table = reinterpret_cast(l2_table[l2_idx] & ~0xFFFUL); + + if (!l3_table[l3_idx]) return 0; + + return (l3_table[l3_idx] & ~0xFFFUL); +} + /// @brief Maps or allocates a page from virtual_address. /// @param virtual_address a valid virtual address. /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { - if (!virtual_address || !flags) return kErrorInvalidData; + if (!virtual_address || !flags || !physical_address) return kErrorInvalidData; + + UInt64 ttbr0_val = 0; + + asm volatile("mrs %0, ttbr0_el1" : "=r"(ttbr0_val)); + volatile UInt64* l1_table = reinterpret_cast(ttbr0_val); + + UInt64 l1_idx = (reinterpret_cast(virtual_address) >> 39) & 0x1FF; + UInt64 l2_idx = (reinterpret_cast(virtual_address) >> 30) & 0x1FF; + UInt64 l3_idx = (reinterpret_cast(virtual_address) >> 21) & 0x1FF; + + if (!l1_table[l1_idx]) return kErrorInvalidData; + + volatile UInt64* l2_table = reinterpret_cast(l1_table[l1_idx] & ~0xFFFUL); + + if (!l2_table[l2_idx]) return kErrorInvalidData; + + volatile UInt64* l3_table = reinterpret_cast(l2_table[l2_idx] & ~0xFFFUL); - NE_UNUSED(physical_address); + l3_table[l3_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; return kErrorSuccess; } -- cgit v1.2.3 From c50ae11abc23c0ea5d79fd7044273685c73990d1 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 18 Jun 2025 17:56:12 +0200 Subject: feat: level based virtual memory mapping for NeKernel's paging system. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalPagingMgr.cc | 5 ++++- dev/kernel/HALKit/AMD64/Processor.h | 3 ++- dev/kernel/HALKit/ARM64/HalPagingMgr.cc | 20 ++++++++++++++++++-- dev/kernel/HALKit/ARM64/Processor.h | 3 ++- 4 files changed, 26 insertions(+), 5 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgr.cc b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc index 048cb7c2..ced4f268 100644 --- a/dev/kernel/HALKit/AMD64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/AMD64/HalPagingMgr.cc @@ -117,9 +117,12 @@ EXTERN_C Int32 mm_memory_fence(VoidPtr virtual_address) { /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. /***********************************************************************************/ -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level) { if (physical_address == 0) return kErrorInvalidData; + NE_UNUSED(level); /// @todo support PML4, and PDPT levels. + const UInt64 kVMAddr = (UInt64) virtual_address; constexpr UInt64 kMask9 = 0x1FF; constexpr UInt64 kPageMask = 0xFFF; diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 80dc7a1d..b6465941 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -245,7 +245,8 @@ class LAPICDmaWrapper final { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manip. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level = 2); EXTERN_C UInt8 rt_in8(UInt16 port); EXTERN_C UInt16 rt_in16(UInt16 port); diff --git a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc index 953cee3b..b7b0c10e 100644 --- a/dev/kernel/HALKit/ARM64/HalPagingMgr.cc +++ b/dev/kernel/HALKit/ARM64/HalPagingMgr.cc @@ -43,7 +43,8 @@ EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address) { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manipulation process. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level) { if (!virtual_address || !flags || !physical_address) return kErrorInvalidData; UInt64 ttbr0_val = 0; @@ -65,6 +66,21 @@ EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UI l3_table[l3_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; - return kErrorSuccess; + switch (level) { + case 2: { + l3_table[l3_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + case 1: { + l1_table[l1_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + case 0: { + l1_table[l1_idx] = (reinterpret_cast(physical_address) & ~0xFFFUL) | flags; + return kErrorSuccess; + } + } + + return kErrorInvalidData; } } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index 068b798d..68fe736c 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -36,7 +36,8 @@ enum { /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. /// @return Status code of page manip. -EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); +EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags, + UInt32 level = 2); EXTERN_C UIntPtr mm_get_page_addr(VoidPtr virtual_address); -- cgit v1.2.3 From f153886c81c7d11b8e249fa769265646216d5584 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 22 Jun 2025 12:07:42 +0200 Subject: feat: kernel: HAL: reworked `kerncall` system. how: - By taking additional arguments according to DDKKit. - Adding a `HAL_KERNEL_DISPATCH_ENTRY` and `rt_kerncall_proc` Signed-off-by: Amlal El Mahrouss --- dev/kernel/ArchKit/ArchKit.h | 13 ++++++++++++- dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc | 4 ++-- dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc | 6 ++---- 3 files changed, 16 insertions(+), 7 deletions(-) (limited to 'dev') diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index a9dca240..04af0918 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,9 +77,20 @@ 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; + rt_kerncall_proc fProc; + + operator bool() { return fHooked; } +}; + inline Kernel::Array kSysCalls; -inline Kernel::Array kKernCalls; +inline Kernel::Array kKernCalls; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc index be6d0af5..c2988767 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandler.cc @@ -149,7 +149,7 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @param stack the stack pushed from assembly routine. /// @return nothing. EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::UIntPtr rdx_kerncall_arg) { + Kernel::SizeT cnt, Kernel::UIntPtr arg, Kernel::SizeT sz) { hal_idt_send_eoi(51); if (!Kernel::kRootUser) return; @@ -159,7 +159,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { if (kKernCalls[i].fHooked && rcx_hash == kKernCalls[rcx_hash].fHash) { if (kKernCalls[i].fProc) { - (kKernCalls[i].fProc)((Kernel::VoidPtr) rdx_kerncall_arg); + (kKernCalls[i].fProc)(cnt, (Kernel::VoidPtr) arg, sz); } } } diff --git a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc index e6f70f0e..4c02e8cc 100644 --- a/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc +++ b/dev/kernel/HALKit/ARM64/HalCoreInterruptHandler.cc @@ -144,9 +144,7 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_hash, /// @param stack the stack pushed from assembly routine. /// @return nothing. EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, - Kernel::UIntPtr rdx_kerncall_arg) { - hal_int_send_eoi(51); - + Kernel::SizeT cnt, Kernel::UIntPtr arg, Kernel::SizeT sz) { if (!Kernel::kRootUser) return; if (Kernel::kCurrentUser != Kernel::kRootUser) return; if (!Kernel::kCurrentUser->IsSuperUser()) return; @@ -154,7 +152,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_hash, for (SizeT i = 0UL; i < kMaxDispatchCallCount; ++i) { if (kKernCalls[i].fHooked && rcx_hash == kKernCalls[rcx_hash].fHash) { if (kKernCalls[i].fProc) { - (kKernCalls[i].fProc)((Kernel::VoidPtr) rdx_kerncall_arg); + (kKernCalls[i].fProc)(cnt, (Kernel::VoidPtr) arg, sz); } } } -- cgit v1.2.3 From b1658f93dc1157e7883d381b0316a60e760fe557 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 22 Jun 2025 12:14:01 +0200 Subject: fix: HAL: syscall interrupt must be ring-3 only. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc | 2 +- dev/kernel/HALKit/AMD64/Processor.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index f9749946..dc680ce8 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -32,7 +32,7 @@ Void IDTLoader::Load(Register64& idt) { 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 = kInterruptGate; + 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); diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index b6465941..99f857b1 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -47,6 +47,7 @@ #define IsLevelTriggered(FLG) (FLG & 8) #define kInterruptGate (0x8E) +#define kUserInterruptGate (0xEE) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) #define kIDTSelector (0x08) -- cgit v1.2.3 From 4d18ce78a0ba66787a91db8103bfd2bb733e0910 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:54:12 +0300 Subject: rt_copy_memory to rt_copy_memory_safe --- dev/kernel/NeKit/Utils.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/NeKit/Utils.h b/dev/kernel/NeKit/Utils.h index 43526fc8..11566008 100644 --- a/dev/kernel/NeKit/Utils.h +++ b/dev/kernel/NeKit/Utils.h @@ -1,4 +1,3 @@ - /* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. @@ -29,6 +28,10 @@ Int rt_to_lower(Int c); voidPtr rt_string_in_string(const Char* in, const Char* needle); char* rt_string_has_char(Char* str, Char chr); +// Safe memory functions +Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); +voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); + /// UNICODE API Int urt_string_cmp(const Char* src, const Char* cmp, Size len); -- cgit v1.2.3 From 3b8c7d1324fd501aaf99cfd4ffcc8c7595c6c9cd Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:55:51 +0300 Subject: rt_copy_memory to rt_copy_memory_safe --- dev/kernel/src/AsciiUtils.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/AsciiUtils.cc b/dev/kernel/src/AsciiUtils.cc index e0162f70..5718ec4d 100644 --- a/dev/kernel/src/AsciiUtils.cc +++ b/dev/kernel/src/AsciiUtils.cc @@ -8,8 +8,8 @@ namespace Kernel { -STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); -STATIC voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); +Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size); +voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size); Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) { for (Size i = 0; i < size; ++i) { @@ -45,7 +45,7 @@ const Char* rt_alloc_string(const Char* src) { return buffer; } -STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size) { +Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size dst_size) { if (!src || !dst || len > dst_size) { if (dst && dst_size) { rt_set_memory_safe(dst, 0, dst_size, dst_size); @@ -58,7 +58,7 @@ STATIC Int rt_copy_memory_safe(const voidPtr src, voidPtr dst, Size len, Size ds return static_cast(len); } -STATIC voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size) { +voidPtr rt_set_memory_safe(voidPtr dst, UInt32 value, Size len, Size dst_size) { if (!dst || len > dst_size) return nullptr; auto p = reinterpret_cast(dst); UInt8 v = static_cast(value & 0xFF); -- cgit v1.2.3 From 3399b3b72308acc22f9fa80140131eefbf76a8b9 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 15:57:25 +0300 Subject: rt_copy_memory_safe: HeFS+FileSystemParser.cc --- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 39f8c0a1..b2e894d0 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -798,11 +798,11 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", 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((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1); + rt_copy_memory_safe((VoidPtr) kHeFSMagic, boot->fMagic, kHeFSMagicLen - 1, sizeof(boot->fMagic)); if (mnt->fLbaStart > mnt->fLbaEnd) { err_global_get() = kErrorDiskIsCorrupted; @@ -906,8 +906,8 @@ _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((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", 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); @@ -992,8 +992,8 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", 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); @@ -1078,8 +1078,8 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } - rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, - rt_string_len("fs/hefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/hefs-packet", 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); -- 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') 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 446dd03d503a4d2a8efdf39cef9466c61941b6ea Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:00:11 +0300 Subject: UserProcessScheduler.cc rt_copy_memory calls were replaced with rt_copy_memory_safe. #include and #include --- dev/kernel/src/UserProcessScheduler.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index d6c91428..ae000c74 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,6 +21,8 @@ #include #include #include +#include +#include ///! BUGS: 0 @@ -378,7 +380,7 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im return -kErrorProcessFault; } - rt_copy_memory(reinterpret_cast(const_cast(name)), process.Name, len); + 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 367ad9d23ccd56b0394d213c78ed2da5fe2fe592 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:01:15 +0300 Subject: UserMgr.cc rt_copy_memory calls were replaced with rt_copy_memory_safe, and #include --- dev/kernel/src/UserMgr.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 8eade85e..78a306f7 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -15,6 +15,9 @@ #include #include #include +#include +#include +#include #define kStdUserType (0xEE) #define kSuperUserType (0xEF) @@ -56,14 +59,14 @@ namespace Detail { //////////////////////////////////////////////////////////// User::User(const Int32& sel, const Char* user_name) : mUserRing((UserRingKind) sel) { MUST_PASS(sel >= 0); - rt_copy_memory((VoidPtr) user_name, this->mUserName, rt_string_len(user_name)); + 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((VoidPtr) user_name, this->mUserName, rt_string_len(user_name)); + rt_copy_memory_safe((VoidPtr) user_name, this->mUserName, rt_string_len(user_name), kMaxUserNameLen); } //////////////////////////////////////////////////////////// -- cgit v1.2.3 From f544a3e7abd9af82688b791b00d754d20dce7589 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:02:21 +0300 Subject: IndexableProperty.cc The argument order was corrected. #include was added, and rt_copy_memory_safe is added --- dev/kernel/src/IndexableProperty.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/IndexableProperty.cc b/dev/kernel/src/IndexableProperty.cc index 1d2a1ce8..7f983d8b 100644 --- a/dev/kernel/src/IndexableProperty.cc +++ b/dev/kernel/src/IndexableProperty.cc @@ -7,6 +7,8 @@ #include #include #include +#include +#include #include /// @brief File indexer API for fast path access. @@ -32,7 +34,7 @@ namespace Indexer { Void fs_index_file(const Char* filename, SizeT filenameLen, IndexableProperty& indexer) { if (!indexer.HasFlag(kIndexerClaimed)) { indexer.AddFlag(kIndexerClaimed); - rt_copy_memory((VoidPtr) indexer.Leak().Path, (VoidPtr) filename, filenameLen); + rt_copy_memory_safe(reinterpret_cast(const_cast(filename)), (VoidPtr) indexer.Leak().Path, filenameLen, kIndexerCatalogNameLength); (Void)(kout << "FSKit: Indexed new file: " << filename << kendl); } -- cgit v1.2.3 From 3ee0101b6ff38e47893962134902aaf8974ac0b7 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:03:49 +0300 Subject: NeFS+FileSystemParser.cc rt_copy_memory calls were replaced with rt_copy_memory_safe. --- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 50 +++++++++++++++--------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 18595e9f..0bee64a8 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -167,8 +167,8 @@ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUC drive.fPacket.fPacketSize = sizeof(NEFS_FORK_STRUCT); drive.fPacket.fPacketContent = reinterpret_cast(&local_buf); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", 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) { @@ -190,7 +190,7 @@ _Output NEFS_FORK_STRUCT* NeFileSystemParser::FindFork(_Input NEFS_CATALOG_STRUC if (KStringBuilder::Equals(local_buf.ForkName, name) && KStringBuilder::Equals(local_buf.CatalogName, catalog->Name)) { auto result = new NEFS_FORK_STRUCT(); - rt_copy_memory(&local_buf, result, sizeof(NEFS_FORK_STRUCT)); + rt_copy_memory_safe(&local_buf, result, sizeof(NEFS_FORK_STRUCT), sizeof(NEFS_FORK_STRUCT)); return result; } @@ -249,7 +249,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char } Char* parent_name = (Char*) mm_alloc_ptr(nameLen + 1, Yes, No); - rt_copy_memory(const_cast(name), parent_name, nameLen + 1); + rt_copy_memory_safe(const_cast(name), parent_name, nameLen + 1, nameLen + 1); if (nameLen < 2) { mm_free_ptr(parent_name); @@ -312,13 +312,13 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char --i; if (kind == kNeFSCatalogKindDir) --i; while (name[i] != '/') --i; - rt_copy_memory((VoidPtr) (name + i), (VoidPtr) child_catalog->Name, rt_string_len(name) - i); + 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((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", 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 +380,13 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char delete catalog; NEFS_CATALOG_STRUCT* found_catalog = new NEFS_CATALOG_STRUCT(); - rt_copy_memory(&temporary_catalog, found_catalog, 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(&temporary_catalog, child_catalog, 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; } @@ -411,8 +411,8 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I // verify disk. drive->fVerify(drive->fPacket); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive->fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", 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 +430,9 @@ 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((VoidPtr) kNeFSIdent, (VoidPtr) part_block->Ident, kNeFSIdentLen); - rt_copy_memory((VoidPtr) kNeFSUntitledHD, (VoidPtr) part_block->PartitionName, - rt_string_len(kNeFSUntitledHD)); + 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)); SizeT sectorCount = drv_std_get_sector_count(); SizeT sectorSize = drive->fSectorSz; @@ -513,9 +513,9 @@ bool NeFileSystemParser::WriteCatalog(_Input const Char* catalog_name, Bool is_r auto buf = new UInt8[size_of_data]; rt_set_memory(buf, 0, size_of_data); - rt_copy_memory(data, buf, size_of_data); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + 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)); NEFS_FORK_STRUCT* fork_data_input = new NEFS_FORK_STRUCT(); NEFS_FORK_STRUCT prev_fork{}; @@ -577,8 +577,8 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* NEFS_ROOT_PARTITION_BLOCK part{}; auto& drive = kMountpoint.A(); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", 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 +607,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* return nullptr; } NEFS_CATALOG_STRUCT* catalog_ptr = new NEFS_CATALOG_STRUCT(); - rt_copy_memory(&tmp, catalog_ptr, 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 +619,7 @@ _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(const_cast(catalog_name), parent_name, nameLen + 1); + rt_copy_memory_safe(const_cast(catalog_name), parent_name, nameLen + 1, kNeFSCatalogNameLen); SizeT indexReverseCopy = nameLen - 1; if (parent_name[indexReverseCopy] == NeFileSystemHelper::Separator()) { @@ -727,8 +727,8 @@ _Output Boolean NeFileSystemParser::RemoveCatalog(_Input const Char* catalog_nam catalog->Flags &= (~kNeFSFlagCreated); catalog->Flags |= kNeFSFlagDeleted; - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", 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); @@ -795,8 +795,8 @@ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* cata } auto* fs_buf = new NEFS_FORK_STRUCT(); - rt_copy_memory((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, - rt_string_len("fs/nefs-packet")); + rt_copy_memory_safe((VoidPtr) "fs/nefs-packet", drive.fPacket.fPacketMime, + rt_string_len("fs/nefs-packet"), sizeof(drive.fPacket.fPacketMime)); NEFS_FORK_STRUCT* fs_fork_data = nullptr; while (dataForkLba >= kNeFSCatalogStartAddress) { -- cgit v1.2.3 From 521adeb2466c64ab0d31b97b74cc349a4fcbfb9d Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:04:59 +0300 Subject: IPCMsg.cc rt_copy_memory_safe --- dev/kernel/src/Network/IPCMsg.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc index cff19cfa..6f54e449 100644 --- a/dev/kernel/src/Network/IPCMsg.cc +++ b/dev/kernel/src/Network/IPCMsg.cc @@ -103,7 +103,7 @@ Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept { if (src->IpcMsgSz > target->IpcMsgSz) return No; if (target->IpcMsgSz > src->IpcMsgSz) return No; - rt_copy_memory(src->IpcData, target->IpcData, src->IpcMsgSz); + rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize); return Yes; } -- cgit v1.2.3 From bb711f2805cc7b2dc8afef98f37aafc277d5d5b2 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 22 Jun 2025 15:33:57 +0200 Subject: fix: TLS is located in KernelKit, not NeKit. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserMgr.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc index 78a306f7..601df1fa 100644 --- a/dev/kernel/src/UserMgr.cc +++ b/dev/kernel/src/UserMgr.cc @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #define kStdUserType (0xEE) -- 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') 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 a7b5a74605a4d7673d958cd01386de45e5c92ec4 Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 16:48:24 +0300 Subject: UserProcessScheduler.cc: ArchKit --- dev/kernel/src/UserProcessScheduler.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index ae000c74..7b7e4497 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -22,7 +22,6 @@ #include #include #include -#include ///! BUGS: 0 -- 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') 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') 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 4807aac83e758099bfae759701b3d5cab5fc3b8b Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 22:19:52 +0300 Subject: Patch: Buffer Overflows and OOB Reads in Core Memory APIs memset and memcpy now take an additional dst_size parameter, If len > dst_size or dst/src is null, the function returns nullptr early, avoiding unsafe writes. --- dev/boot/src/BootSupport.cc | 48 ++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 20 deletions(-) (limited to 'dev') diff --git a/dev/boot/src/BootSupport.cc b/dev/boot/src/BootSupport.cc index ce824e0f..7cf7af95 100644 --- a/dev/boot/src/BootSupport.cc +++ b/dev/boot/src/BootSupport.cc @@ -18,11 +18,16 @@ /// @param dst destination pointer. /// @param byte value to fill in. /// @param len length of of src. -EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len) { +EXTERN_C VoidPtr memset(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; for (size_t i = 0UL; i < len; ++i) { - ((int*) dst)[i] = byte; + p[i] = val; } - return dst; } @@ -30,36 +35,39 @@ EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len) { /// @param dst destination pointer. /// @param src source pointer. /// @param len length of of src. -EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len) { +EXTERN_C VoidPtr memcpy(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; for (size_t i = 0UL; i < len; ++i) { - ((int*) dst)[i] = ((int*) src)[i]; + d[i] = s[i]; } - return dst; } /// @brief strlen definition in C++. -EXTERN_C size_t strlen(const char* whatToCheck) { - SizeT len = 0; - - while (whatToCheck[len] != 0) { +EXTERN_C size_t strlen(const char* whatToCheck, size_t max_len) { + size_t len = 0; + while (len < max_len && whatToCheck[len] != '\0') { ++len; } - return len; } /// @brief strcmp definition in C++. -EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight) { - SizeT len = 0; - - while (whatToCheck[len] == whatToCheckRight[len]) { - if (whatToCheck[len] == 0) return 0; - - ++len; +EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight, size_t max_len) { + size_t i = 0; + while (i < max_len && whatToCheck[i] == whatToCheckRight[i]) { + if (whatToCheck[i] == '\0') return 0; + ++i; } - - return len; + if (i == max_len) { + return 0; + } + return (unsigned char)whatToCheck[i] - (unsigned char)whatToCheckRight[i]; } /// @brief something specific to the Microsoft's ABI, When the stack grows too big. -- cgit v1.2.3 From dd12786ef1db10ef27bfa213bfd96c0bb9842ede Mon Sep 17 00:00:00 2001 From: 0xf00sec <159052166+0xf00sec@users.noreply.github.com> Date: Sun, 22 Jun 2025 22:27:27 +0300 Subject: AsciiUtils.cc --- dev/kernel/src/AsciiUtils.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/AsciiUtils.cc b/dev/kernel/src/AsciiUtils.cc index 5718ec4d..d5bc6bce 100644 --- a/dev/kernel/src/AsciiUtils.cc +++ b/dev/kernel/src/AsciiUtils.cc @@ -156,13 +156,12 @@ Char* rt_string_has_char(Char* str, Char ch) { return (*str == ch) ? str : nullptr; } -// @uses the deprecated version callers should ensure 'len' is valid. EXTERN_C void* memset(void* dst, int c, long long unsigned int len) { - return Kernel::rt_set_memory(dst, c, static_cast(len)); + return Kernel::rt_set_memory_safe(dst, c, static_cast(len), static_cast(len)); } EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { - Kernel::rt_copy_memory(const_cast(src), dst, static_cast(len)); + Kernel::rt_copy_memory_safe(const_cast(src), dst, static_cast(len), static_cast(len)); return dst; } -- cgit v1.2.3 From 41703b62f9e7e83fa856fbf53101edc889502c45 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 22 Jun 2025 21:41:15 +0200 Subject: feat: use FNV in libSystem's syscall routing. fix: Add legacy string.h functions back, for GCC. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/BootSupport.cc | 58 ++++++++++++++++++++++-- dev/libSystem/SystemKit/Syscall.h | 22 +++++++-- dev/libSystem/src/SystemAPI.cc | 94 --------------------------------------- dev/libSystem/src/SystemCalls.cc | 94 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 102 deletions(-) delete mode 100644 dev/libSystem/src/SystemAPI.cc create mode 100644 dev/libSystem/src/SystemCalls.cc (limited to 'dev') diff --git a/dev/boot/src/BootSupport.cc b/dev/boot/src/BootSupport.cc index 7cf7af95..96c6594e 100644 --- a/dev/boot/src/BootSupport.cc +++ b/dev/boot/src/BootSupport.cc @@ -18,7 +18,7 @@ /// @param dst destination pointer. /// @param byte value to fill in. /// @param len length of of src. -EXTERN_C VoidPtr memset(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; @@ -35,7 +35,7 @@ EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len, long lo /// @param dst destination pointer. /// @param src source pointer. /// @param len length of of src. -EXTERN_C VoidPtr memcpy(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; @@ -49,7 +49,7 @@ EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len, } /// @brief strlen definition in C++. -EXTERN_C size_t strlen(const char* whatToCheck, size_t max_len) { +EXTERN_C size_t strnlen(const char* whatToCheck, size_t max_len) { size_t len = 0; while (len < max_len && whatToCheck[len] != '\0') { ++len; @@ -58,7 +58,7 @@ EXTERN_C size_t strlen(const char* whatToCheck, size_t max_len) { } /// @brief strcmp definition in C++. -EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight, size_t max_len) { +EXTERN_C int strncmp(const char* whatToCheck, const char* whatToCheckRight, size_t max_len) { size_t i = 0; while (i < max_len && whatToCheck[i] == whatToCheckRight[i]) { if (whatToCheck[i] == '\0') return 0; @@ -73,4 +73,54 @@ EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight, size_ /// @brief something specific to the Microsoft's ABI, When the stack grows too big. EXTERN_C void ___chkstk_ms(void) {} +/// @note GCC expects them to be here. + +/// @brief memset definition in C++. +/// @param dst destination pointer. +/// @param byte value to fill in. +/// @param len length of of src. +EXTERN_C VoidPtr memset(void* dst, int byte, long long unsigned int len) { + for (size_t i = 0UL; i < len; ++i) { + ((int*) dst)[i] = byte; + } + + return dst; +} + +/// @brief memcpy definition in C++. +/// @param dst destination pointer. +/// @param src source pointer. +/// @param len length of of src. +EXTERN_C VoidPtr memcpy(void* dst, const void* src, long long unsigned int len) { + for (size_t i = 0UL; i < len; ++i) { + ((int*) dst)[i] = ((int*) src)[i]; + } + + return dst; +} + +/// @brief strlen definition in C++. +EXTERN_C size_t strlen(const char* whatToCheck) { + SizeT len = 0; + + while (whatToCheck[len] != 0) { + ++len; + } + + return len; +} + +/// @brief strcmp definition in C++. +EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight) { + SizeT len = 0; + + while (whatToCheck[len] == whatToCheckRight[len]) { + if (whatToCheck[len] == 0) return 0; + + ++len; + } + + return len; +} + #endif diff --git a/dev/libSystem/SystemKit/Syscall.h b/dev/libSystem/SystemKit/Syscall.h index 436665ae..5a840df1 100644 --- a/dev/libSystem/SystemKit/Syscall.h +++ b/dev/libSystem/SystemKit/Syscall.h @@ -9,11 +9,25 @@ #include #include -#ifndef SYSCALL_HASH -#define SYSCALL_HASH(str) (UInt64) str -#endif // !SYSCALL_HASH - IMPORT_C VoidPtr libsys_syscall_arg_1(SizeT id); IMPORT_C VoidPtr libsys_syscall_arg_2(SizeT id, VoidPtr arg1); IMPORT_C VoidPtr libsys_syscall_arg_3(SizeT id, VoidPtr arg1, VoidPtr arg3); IMPORT_C VoidPtr libsys_syscall_arg_4(SizeT id, VoidPtr arg1, VoidPtr arg3, VoidPtr arg4); + +inline UInt64 libsys_hash_64(const Char* path) { + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; + const UInt64 FNV_PRIME = 0x100000001b3ULL; + + UInt64 hash = FNV_OFFSET_BASIS; + + while (*path) { + hash ^= (Char) (*path++); + hash *= FNV_PRIME; + } + + return hash; +} + +#ifndef SYSCALL_HASH +#define SYSCALL_HASH(str) libsys_hash_64(str) +#endif // !SYSCALL_HASH \ No newline at end of file diff --git a/dev/libSystem/src/SystemAPI.cc b/dev/libSystem/src/SystemAPI.cc deleted file mode 100644 index d0682830..00000000 --- a/dev/libSystem/src/SystemAPI.cc +++ /dev/null @@ -1,94 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include - -/// @file SystemAPI.cc -/// @brief System wide API for NeKernel. - -IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len) { - if (!len || !dest || !src) { - return nullptr; - } - - for (SizeT i = 0; i < len; i++) { - ((Char*) dest)[i] = ((Char*) src)[i]; - } - - return dest; -} - -IMPORT_C SInt64 MmStrLen(const Char* in) { - if (!in) return 0; - - SizeT len{0}; - - do { - ++len; - } while (in[len] != '\0'); - - return len; -} - -IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value) { - if (!len || !dest) { - return nullptr; - } - - for (SizeT i = 0; i < len; i++) { - ((Char*) dest)[i] = value; - } - - return dest; -} - -IMPORT_C Ref IoOpenFile(_Input const Char* path, _Input const Char* drv_letter) { - return (Ref) libsys_syscall_arg_3(SYSCALL_HASH('IoOpenFile'), - reinterpret_cast(const_cast(path)), - reinterpret_cast(const_cast(drv_letter))); -} - -IMPORT_C Void IoCloseFile(_Input Ref desc) { - libsys_syscall_arg_2(2, desc); -} - -IMPORT_C UInt64 IoSeekFile(_Input Ref desc, _Input UInt64 off) { - auto ret = (volatile UInt64*) libsys_syscall_arg_3( - SYSCALL_HASH('IoSeekFile'), reinterpret_cast(desc), reinterpret_cast(&off)); - - MUST_PASS((*ret) != ~0UL); - return *ret; -} - -IMPORT_C UInt64 IoTellFile(_Input Ref desc) { - auto ret = (volatile UInt64*) libsys_syscall_arg_2(SYSCALL_HASH('IoTellFile'), - reinterpret_cast(desc)); - return *ret; -} - -IMPORT_C SInt32 PrintOut(_Input IORef desc, const char* fmt, ...) { - va_list args; - - va_start(args, fmt); - - auto ret = (volatile UInt64*) libsys_syscall_arg_4( - SYSCALL_HASH('PrintOut'), reinterpret_cast(desc), - reinterpret_cast(const_cast(fmt)), args); - - va_end(args); - - return *ret; -} - -IMPORT_C Void _rtl_assert(Bool expr, const Char* origin) { - if (!expr) { - PrintOut(nullptr, "Assertion failed: %s\r", origin); - PrintOut(nullptr, "Origin: %s\r", origin); - - libsys_syscall_arg_1(SYSCALL_HASH('_rtl_debug_break')); - } -} diff --git a/dev/libSystem/src/SystemCalls.cc b/dev/libSystem/src/SystemCalls.cc new file mode 100644 index 00000000..6344cdac --- /dev/null +++ b/dev/libSystem/src/SystemCalls.cc @@ -0,0 +1,94 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include + +/// @file SystemAPI.cc +/// @brief System wide API for NeKernel. + +IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len) { + if (!len || !dest || !src) { + return nullptr; + } + + for (SizeT i = 0; i < len; i++) { + ((Char*) dest)[i] = ((Char*) src)[i]; + } + + return dest; +} + +IMPORT_C SInt64 MmStrLen(const Char* in) { + if (!in) return 0; + + SizeT len{0}; + + do { + ++len; + } while (in[len] != '\0'); + + return len; +} + +IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value) { + if (!len || !dest) { + return nullptr; + } + + for (SizeT i = 0; i < len; i++) { + ((Char*) dest)[i] = value; + } + + return dest; +} + +IMPORT_C Ref IoOpenFile(_Input const Char* path, _Input const Char* drv_letter) { + return (Ref) libsys_syscall_arg_3(SYSCALL_HASH("IoOpenFile"), + reinterpret_cast(const_cast(path)), + reinterpret_cast(const_cast(drv_letter))); +} + +IMPORT_C Void IoCloseFile(_Input Ref desc) { + libsys_syscall_arg_2(2, desc); +} + +IMPORT_C UInt64 IoSeekFile(_Input Ref desc, _Input UInt64 off) { + auto ret = (volatile UInt64*) libsys_syscall_arg_3( + SYSCALL_HASH("IoSeekFile"), reinterpret_cast(desc), reinterpret_cast(&off)); + + MUST_PASS((*ret) != ~0UL); + return *ret; +} + +IMPORT_C UInt64 IoTellFile(_Input Ref desc) { + auto ret = (volatile UInt64*) libsys_syscall_arg_2(SYSCALL_HASH("IoTellFile"), + reinterpret_cast(desc)); + return *ret; +} + +IMPORT_C SInt32 PrintOut(_Input IORef desc, const char* fmt, ...) { + va_list args; + + va_start(args, fmt); + + auto ret = (volatile UInt64*) libsys_syscall_arg_4( + SYSCALL_HASH("PrintOut"), reinterpret_cast(desc), + reinterpret_cast(const_cast(fmt)), args); + + va_end(args); + + return *ret; +} + +IMPORT_C Void _rtl_assert(Bool expr, const Char* origin) { + if (!expr) { + PrintOut(nullptr, "Assertion failed: %s\r", origin); + PrintOut(nullptr, "Origin: %s\r", origin); + + libsys_syscall_arg_1(SYSCALL_HASH("_rtl_debug_break")); + } +} -- 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') 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 d432898acdc4cebae81bff06f2c954f7165ebeb5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 25 Jun 2025 10:03:49 +0200 Subject: fix: PEF format fixes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/PEF.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h index a357e827..ed6fc423 100644 --- a/dev/kernel/KernelKit/PEF.h +++ b/dev/kernel/KernelKit/PEF.h @@ -54,7 +54,7 @@ enum { kPefArch32x0, /* 32x0. ISA */ kPefArchPowerPC, kPefArchARM64, - kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1, + kPefArchCount = (kPefArchARM64 - kPefArchIntel86S) + 1, kPefArchInvalid = 0xFF, }; -- cgit v1.2.3 From 77e25e47918f97b4fb0ce48f5adb854ccfa5ae76 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 26 Jun 2025 03:40:33 +0200 Subject: fix: UPS: Don't exit when process crashes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index ef2c0686..add81f49 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -22,6 +22,7 @@ #include #include #include +#include "KernelKit/CoreProcessScheduler.h" ///! BUGS: 0 @@ -40,8 +41,9 @@ USER_PROCESS::~USER_PROCESS() = default; Void USER_PROCESS::Crash() { if (this->Status != ProcessStatusKind::kRunning) return; + this->Status = ProcessStatusKind::kKilled; + (Void)(kout << this->Name << ": crashed, error id: " << number(-kErrorProcessFault) << kendl); - this->Exit(-kErrorProcessFault); } /***********************************************************************************/ -- cgit v1.2.3 From 0fd5c96a48732950299784b0728d3bf5eee0234c Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 27 Jun 2025 09:02:15 +0200 Subject: fix: remove redundant header include. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index add81f49..94099c0a 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -22,7 +22,6 @@ #include #include #include -#include "KernelKit/CoreProcessScheduler.h" ///! BUGS: 0 -- 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') 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 b3c3b0f62331a695fb7c90c386c15396b6607575 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 30 Jun 2025 10:36:15 +0200 Subject: feat: Introducing `FileTree` allocation and WiP DebugSrv integration. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/DebugOutput.h | 12 ++---------- dev/kernel/KernelKit/UserProcessScheduler.h | 2 +- dev/kernel/src/UserProcessScheduler.cc | 11 +++++++++++ 3 files changed, 14 insertions(+), 11 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index de3bc997..87649406 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -12,7 +12,7 @@ #include #include -#define kDebugUnboundPort 0x0FEED +#define kDebugPort (51820U) #define kDebugMag0 'K' #define kDebugMag1 'D' @@ -27,7 +27,7 @@ namespace Kernel { class TerminalDevice; class DTraceDevice; -class DebugDevice; +class NeDebugDevice; class Utf8TerminalDevice; inline TerminalDevice end_line(); @@ -184,14 +184,6 @@ inline constexpr SizeT kDebugTypeLen = 256U; typedef Char rt_debug_type[kDebugTypeLen]; -/// @brief KDBG's packet header. -class KernelDebugHeader final { - public: - Int16 fPort; - Int16 fPortKind; - rt_debug_type fPortBlob; -}; - inline TerminalDevice& operator<<(TerminalDevice& src, const Long& num) { src = number(num); return src; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 5bc5b8d2..ebe8d1cd 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -62,7 +62,7 @@ class USER_PROCESS final { }; USER_PROCESS_SIGNAL Signal; - PROCESS_FILE_TREE* FileTree{nullptr}; + PROCESS_FILE_TREE* FileTree{nullptr}; PROCESS_HEAP_TREE* HeapTree{nullptr}; UserProcessTeam* ParentTeam; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 94099c0a..621c848b 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -124,6 +124,17 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); #endif + if (!this->FileTree) { + this->FileTree = new PROCESS_FILE_TREE(); + + if (!this->FileTree) { + this->Crash(); + return ErrorOr(-kErrorHeapOutOfMemory); + } + + /// @todo File Tree allocation and dispose methods (amlal) + } + if (!this->HeapTree) { this->HeapTree = new PROCESS_HEAP_TREE(); -- cgit v1.2.3 From 38bf99758a949f52a4cff7849a6bfaeba2eec1c3 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 30 Jun 2025 23:38:27 +0200 Subject: feat: FileTree `free` support. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 621c848b..51f3f962 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -244,7 +244,8 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept { /** @brief Free heap tree. */ /***********************************************************************************/ -STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE* memory_ptr_list) { +template +STATIC Void sched_free_ptr_tree(T* memory_ptr_list) { // Deleting memory lists. Make sure to free all of them. while (memory_ptr_list) { if (memory_ptr_list->Entry) { @@ -284,6 +285,9 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { sched_free_ptr_tree(this->HeapTree); this->HeapTree = nullptr; + sched_free_ptr_tree(this->FileTree); + this->FileTree = nullptr; + #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ hal_write_cr3(pd); #endif -- cgit v1.2.3 From ec80bc9633f3ef2acfa84adcfb0385d0ee55c6dd Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 30 Jun 2025 23:39:04 +0200 Subject: feat: Generic `sched_try_go_upper_ptr_tree` support. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 51f3f962..89210b44 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -85,7 +85,8 @@ Void USER_PROCESS::Wake(Bool should_wakeup) { /** @param tree The tree to calibrate */ /***********************************************************************************/ -STATIC PROCESS_HEAP_TREE* sched_try_go_upper_ptr_tree(PROCESS_HEAP_TREE* tree) { +template +STATIC PROCESS_HEAP_TREE* sched_try_go_upper_ptr_tree(T* tree) { if (!tree) { return nullptr; } -- cgit v1.2.3 From 72a77c5fff17756af7dedce01791ad349f414577 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 30 Jun 2025 23:40:12 +0200 Subject: fix!: feat: Generic `sched_try_go_upper_ptr_tree` support. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 89210b44..a0ff733c 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -86,7 +86,7 @@ Void USER_PROCESS::Wake(Bool should_wakeup) { /***********************************************************************************/ template -STATIC PROCESS_HEAP_TREE* sched_try_go_upper_ptr_tree(T* tree) { +STATIC T* sched_try_go_upper_ptr_tree(T* tree) { if (!tree) { return nullptr; } -- cgit v1.2.3 From 13e1137757626d274e7754d54e7db828da1e7fa8 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 30 Jun 2025 23:56:12 +0200 Subject: refactor: UPS: use correct name for *_ptr_tree functions. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/UserProcessScheduler.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'dev') diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index a0ff733c..ba6e1857 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -246,23 +246,23 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept { /***********************************************************************************/ template -STATIC Void sched_free_ptr_tree(T* memory_ptr_list) { +STATIC Void sched_free_ptr_tree(T* tree) { // Deleting memory lists. Make sure to free all of them. - while (memory_ptr_list) { - if (memory_ptr_list->Entry) { - MUST_PASS(mm_free_ptr(memory_ptr_list->Entry)); + while (tree) { + if (tree->Entry) { + MUST_PASS(mm_free_ptr(tree->Entry)); } - auto next = memory_ptr_list->Next; + auto next = tree->Next; if (next->Child) sched_free_ptr_tree(next->Child); - memory_ptr_list->Child = nullptr; + tree->Child = nullptr; - mm_free_ptr(memory_ptr_list); + mm_free_ptr(tree); - memory_ptr_list = nullptr; - memory_ptr_list = next; + tree = nullptr; + tree = next; } } -- 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') 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 65350ab87ab7d577cd6d85bc6e9727beef5ee737 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 5 Jul 2025 10:19:51 +0200 Subject: feat: Document `SpawnDylib` Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/UserProcessScheduler.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'dev') diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index ebe8d1cd..8a730233 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -93,6 +93,9 @@ class USER_PROCESS final { /***********************************************************************************/ Void Crash(); + /***********************************************************************************/ + ///! @brief Spawns a dynamic library handle if dylib. + /***********************************************************************************/ Bool SpawnDylib(); /***********************************************************************************/ -- cgit v1.2.3 From f4370b44bacfa3035496aa6f5aca24469326ebff Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 5 Jul 2025 10:32:16 +0200 Subject: feat: add magic check in `fsck.hefs` Signed-off-by: Amlal El Mahrouss --- dev/kernel/FirmwareKit/EPM.h | 12 +++++++----- dev/kernel/KernelKit/CodeMgr.h | 4 ++++ dev/kernel/KernelKit/CoreProcessScheduler.h | 4 ++++ dev/kernel/KernelKit/FileMgr.h | 3 ++- dev/libMsg/MsgKit/Network.h | 2 +- tooling/fsck.hefs.cc | 8 ++++++-- 6 files changed, 24 insertions(+), 9 deletions(-) (limited to 'dev') diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h index 05291929..dcab3607 100644 --- a/dev/kernel/FirmwareKit/EPM.h +++ b/dev/kernel/FirmwareKit/EPM.h @@ -97,11 +97,13 @@ struct PACKED EPM_PART_BLOCK { ///! @brief Use in boot block version field. enum { - kEPMInvalid = 0x00, - kEPMGeneric = 0xcf, /// @brief Generic OS - kEPMLinux = 0x8f, /// @brief Linux on EPM - kEPMBSD = 0x9f, /// @brief Berkeley Soft. Distribution - kEPMNeKernel = 0x1f, /// @brief NeKernel. + kEPMInvalid = 0x00, + kEPMGeneric = 0xcf, /// @brief Generic OS + kEPMLinux = 0x8f, /// @brief Linux on EPM. + kEPMBSD = 0x9f, /// @brief BSD on EPM. + kEPMNeKernel = 0x1f, /// @brief NeKernel. + kEPMVMKernel = 0x2f, /// @brief VMKernel. + /// @note ... the rest is reserved for future OSes. kEPMInvalidOS = 0xff, }; diff --git a/dev/kernel/KernelKit/CodeMgr.h b/dev/kernel/KernelKit/CodeMgr.h index 072ba4d5..c733bc47 100644 --- a/dev/kernel/KernelKit/CodeMgr.h +++ b/dev/kernel/KernelKit/CodeMgr.h @@ -18,6 +18,10 @@ #include #include +/// @file CodeMgr.h +/// @brief Code Manager header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { /// @brief Main process entrypoint. typedef void (*rtl_main_kind)(void); diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index f64cbf22..e5606987 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -9,6 +9,10 @@ #include #include +/// @file CoreProcessScheduler.h +/// @brief Core Process Scheduler header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) #define kSchedProcessLimitPerTeam (32U) diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 13eeabdf..adcb1d6e 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -4,6 +4,7 @@ File: FileMgr.h Purpose: Kernel file manager. + Author: Amlal El Mahrouss (amlal@nekernel.org) ------------------------------------------- */ @@ -65,10 +66,10 @@ enum { kFileReadAll = 101, kFileReadChunk = 102, kFileWriteChunk = 103, - kFileIOCnt = (kFileWriteChunk - kFileWriteAll) + 1, // File flags (HFS+, NeFS specific) kFileFlagRsrc = 104, kFileFlagData = 105, + kFileIOCnt = (kFileFlagData - kFileWriteAll) + 1, }; typedef VoidPtr NodePtr; diff --git a/dev/libMsg/MsgKit/Network.h b/dev/libMsg/MsgKit/Network.h index c7b562a2..7dd56877 100644 --- a/dev/libMsg/MsgKit/Network.h +++ b/dev/libMsg/MsgKit/Network.h @@ -6,4 +6,4 @@ #pragma once -#include \ No newline at end of file +#include \ No newline at end of file diff --git a/tooling/fsck.hefs.cc b/tooling/fsck.hefs.cc index ce386152..0fa697be 100644 --- a/tooling/fsck.hefs.cc +++ b/tooling/fsck.hefs.cc @@ -18,7 +18,7 @@ int main(int argc, char** argv) { auto args = mkfs::detail::build_args(argc, argv); - auto opt_disk = mkfs::get_option(args, "-i"); + auto opt_disk = mkfs::get_option(args, "-i"); if (opt_disk.empty()) { mkfs::console_out() << "fsck: hefs: error: HeFS is empty! Exiting..." @@ -26,7 +26,6 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - std::ifstream output_device(opt_disk, std::ios::binary); if (!output_device.good()) { @@ -37,6 +36,11 @@ 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) { + 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"; return EXIT_SUCCESS; -- cgit v1.2.3 From 739d4dd79a459aa0aecf4195c6e940e09fce9bce Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Jul 2025 18:18:46 +0200 Subject: fix: CoreProcessScheduler.h: Correct `kTreeKindCount` enum value to three. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/CoreProcessScheduler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index e5606987..e9dea5b3 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -42,7 +42,7 @@ enum { kInvalidTreeKind = 0U, kRedTreeKind = 100U, kBlackTreeKind = 101U, - kTreeKindCount = 2U, + kTreeKindCount = 3U, }; template -- cgit v1.2.3 From 6e0a8d09c3cfa1ddc15c12ad966a660d21731709 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 6 Jul 2025 18:27:34 +0200 Subject: feat: set `fFile` to nullptr when freeing it. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/FileMgr.h | 1 + 1 file changed, 1 insertion(+) (limited to 'dev') diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index adcb1d6e..18593f5c 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -395,6 +395,7 @@ inline FileStream::FileStream(const Encoding* path, const Encod template inline FileStream::~FileStream() { mm_free_ptr(fFile); + fFile = nullptr; } } // namespace Kernel -- cgit v1.2.3 From a09ca66b2e7d8a05b0da4218b82d1897bce721ba Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 7 Jul 2025 01:10:22 +0200 Subject: fix: FileMgr: use `sz` when `Reading` blob inside file. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/FileMgr.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 18593f5c..641dd448 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -285,12 +285,10 @@ class FileStream final { this->fFileRestrict != kFileMgrRestrictReadBinary) return nullptr; - NE_UNUSED(sz); - auto man = FSClass::GetMounted(); if (man) { - VoidPtr ret = man->Read(name, fFile, kFileReadAll, 0); + VoidPtr ret = man->Read(name, fFile, kFileReadAll, sz); return ret; } -- cgit v1.2.3 From f6a7873714c73b8f3d3190669f8a3181d6679b9d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 7 Jul 2025 08:11:41 +0200 Subject: refactor: FileMgr: remove useless macros. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/FileMgr.h | 5 ----- 1 file changed, 5 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 641dd448..40db0e14 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -49,11 +49,6 @@ #define rtl_node_cast(PTR) reinterpret_cast(PTR) -/** - @note Refer to first enum. -*/ -#define kFileOpsCount (4U) - #define kFileMimeGeneric "ne-application-kind/all" /** @brief invalid position. (n-pos) */ -- 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') 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 b8ecc3fc6fced20f61095caf3eb6ec7eac4d818d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 8 Jul 2025 16:35:47 +0200 Subject: refactor: Refactor NeKernel's TLS API. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/ThreadLocalStorage.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.h b/dev/kernel/KernelKit/ThreadLocalStorage.h index 1b8e4821..7474289e 100644 --- a/dev/kernel/KernelKit/ThreadLocalStorage.h +++ b/dev/kernel/KernelKit/ThreadLocalStorage.h @@ -12,22 +12,22 @@ ///! @brief Thread Local Storage for neoskrnl. -#define kCookieMag0Idx 0 -#define kCookieMag1Idx 1 -#define kCookieMag2Idx 2 +#define kCookieMag0Idx (0U) +#define kCookieMag1Idx (1U) +#define kCookieMag2Idx (2U) #define kCookieMag0 'Z' #define kCookieMag1 'K' #define kCookieMag2 'A' -#define kTLSCookieLen (3U) +#define kCookieMagLen (3U) struct THREAD_INFORMATION_BLOCK; /// @brief Thread Information Block. /// Located in GS on AMD64, other architectures have their own stuff. (64x0, 32x0, ARM64) struct PACKED THREAD_INFORMATION_BLOCK final { - Kernel::Char Cookie[kTLSCookieLen]{0}; //! Thread Magic Number. + Kernel::Char Cookie[kCookieMagLen]{0}; //! Thread Magic Number. Kernel::VoidPtr UserData{nullptr}; //! Thread Information Record (User defined canary structure) }; -- cgit v1.2.3 From a8130b763b7b7b184671f86be4462e7b1c6f7e90 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 8 Jul 2025 16:58:59 +0200 Subject: refactor: comments cleanup, breaking change! updated TLS magic from ZKA to NKO. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/FileMgr.h | 2 +- dev/kernel/KernelKit/ThreadLocalStorage.h | 6 +++--- dev/kernel/amd64-ci.make | 2 +- dev/kernel/amd64-desktop.make | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 40db0e14..e00e036f 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -22,7 +22,7 @@ #ifndef INC_FILEMGR_H #define INC_FILEMGR_H -//! Include filesystems that neoskrnl supports. +//! Include filesystems that NeKernel supports. #include #include #include diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.h b/dev/kernel/KernelKit/ThreadLocalStorage.h index 7474289e..47ff526c 100644 --- a/dev/kernel/KernelKit/ThreadLocalStorage.h +++ b/dev/kernel/KernelKit/ThreadLocalStorage.h @@ -10,15 +10,15 @@ #include #include -///! @brief Thread Local Storage for neoskrnl. +///! @brief Thread Local Storage for NeKernel. #define kCookieMag0Idx (0U) #define kCookieMag1Idx (1U) #define kCookieMag2Idx (2U) -#define kCookieMag0 'Z' +#define kCookieMag0 'N' #define kCookieMag1 'K' -#define kCookieMag2 'A' +#define kCookieMag2 'O' #define kCookieMagLen (3U) diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index c728b29c..81b72b93 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -1,6 +1,6 @@ ################################################## # (c) Amlal El Mahrouss, all rights reserved. -# This is the neoskrnl's makefile. +# This is the NeKernel's makefile. ################################################## CXX = x86_64-w64-mingw32-g++ diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 21488782..2874d31c 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -1,6 +1,6 @@ ################################################## # (c) Amlal El Mahrouss, all rights reserved. -# This is the neoskrnl's makefile. +# This is the NeKernel's makefile. ################################################## CXX = x86_64-w64-mingw32-g++ -- cgit v1.2.3 From 002de3d50a300e49c0c2b9f21c6b7efce218ca15 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 9 Jul 2025 08:14:41 +0200 Subject: refactor! `CoreProcessScheduler` now uses `kFile` instead of `kFD` Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/CoreProcessScheduler.h | 6 +++--- dev/kernel/KernelKit/DriveMgr.h | 4 ++++ dev/kernel/KernelKit/FileMgr.h | 5 +++++ dev/kernel/KernelKit/PEFCodeMgr.h | 4 ++++ 4 files changed, 16 insertions(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index e9dea5b3..01219214 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -18,7 +18,7 @@ #define kSchedProcessLimitPerTeam (32U) #define kSchedTeamCount (256U) -#define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */ +#define kSchedMaxMemoryLimit (gib_cast(128)) /* max physical memory limit */ #define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ #define kSchedNameLen (128U) @@ -48,7 +48,7 @@ enum { template struct PROCESS_HEAP_TREE { static constexpr auto kPtr = true; - static constexpr auto kFD = false; + static constexpr auto kFile = false; T Entry{nullptr}; SizeT EntrySize{0UL}; @@ -74,7 +74,7 @@ struct PROCESS_HEAP_TREE { template struct PROCESS_FILE_TREE { static constexpr auto kPtr = false; - static constexpr auto kFD = true; + static constexpr auto kFile = true; T Entry{nullptr}; SizeT EntrySize{0UL}; diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index 4a530deb..69df1cec 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -7,6 +7,10 @@ #ifndef INC_DRIVE_MANAGER_H #define INC_DRIVE_MANAGER_H +/// @file DriveMgr.h +/// @brief Drive Manager. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #include #include #include diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index e00e036f..d1334277 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -22,6 +22,11 @@ #ifndef INC_FILEMGR_H #define INC_FILEMGR_H + +/// @file FileMgr.h +/// @brief File Manager. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + //! Include filesystems that NeKernel supports. #include #include diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h index 18041f8f..899a1869 100644 --- a/dev/kernel/KernelKit/PEFCodeMgr.h +++ b/dev/kernel/KernelKit/PEFCodeMgr.h @@ -7,6 +7,10 @@ #ifndef _INC_CODE_MANAGER_PEF_H_ #define _INC_CODE_MANAGER_PEF_H_ +/// @file PEFCodeMgr.h +/// @brief PEF Code Manager header file. +/// @author Amlal El Mahrouss (amlal@nekernel.org) + #include #include #include -- cgit v1.2.3 From 44b09ad2f4b701414379e3a4567e5c7dd1d77413 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 9 Jul 2025 11:47:51 +0200 Subject: feat: KID, UPS improvements, and future refactors regarding the FileTree system inside the UPS. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/KernelTaskScheduler.h | 18 ++++++++++++++++++ dev/kernel/KernelKit/UserProcessScheduler.inl | 2 +- dev/kernel/src/UserProcessScheduler.cc | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/KernelTaskScheduler.h b/dev/kernel/KernelKit/KernelTaskScheduler.h index 57b83ccb..222041e8 100644 --- a/dev/kernel/KernelKit/KernelTaskScheduler.h +++ b/dev/kernel/KernelKit/KernelTaskScheduler.h @@ -15,6 +15,12 @@ #include namespace Kernel { +class KernelTaskHelper; + +typedef PID KID; + +/// @brief Equivalent of USER_PROCESS, but for kernel tasks. +/// @author Amlal class KERNEL_TASK final { public: Char Name[kSchedNameLen] = {"KERNEL_TASK"}; @@ -23,5 +29,17 @@ class KERNEL_TASK final { UInt8* StackReserve{nullptr}; SizeT StackSize{kSchedMaxStackSz}; PROCESS_IMAGE Image{}; + /// @brief a KID is a Kernel Identification Descriptor, it is used to find a task running within the kernel. + KID Kid{0}; +}; + +/// @brief Equivalent of UserProcessHelper, but for kernel tasks. +/// @author Amlal +class KernelTaskHelper final { + public: + STATIC Bool Switch(HAL::StackFramePtr frame_ptr, PID new_kid); + STATIC Bool CanBeScheduled(const KERNEL_TASK& process); + STATIC ErrorOr TheCurrentKID(); + STATIC SizeT StartScheduling(); }; } // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl index df35e037..0605a5e0 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.inl +++ b/dev/kernel/KernelKit/UserProcessScheduler.inl @@ -17,7 +17,7 @@ namespace Kernel { /***********************************************************************************/ -/** @brief Free pointer from usage. */ +/** @brief Free pointer/file from usage. */ /***********************************************************************************/ template diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index ba6e1857..7e14fa62 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -107,7 +107,7 @@ STATIC T* sched_try_go_upper_ptr_tree(T* tree) { } /***********************************************************************************/ -/** @brief Allocate pointer to heap tree. */ +/** @brief Allocate pointer to heap/file tree. */ /***********************************************************************************/ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { -- cgit v1.2.3 From 34ff4ddd4ddeb4a8262dc86cdddc3677e5bfbc72 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 02:11:33 +0200 Subject: feat: Fix FNV's pointer check. why: - It doesn't have any pointer check. - We could save cycles by also checking for `*path == 0` Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 2 ++ dev/libSystem/SystemKit/Syscall.h | 2 ++ 2 files changed, 4 insertions(+) (limited to 'dev') diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 8092f53b..344369d5 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -89,6 +89,8 @@ namespace Detail { /// @param path the directory path. /// @return The hashed path. STATIC UInt64 hefsi_hash_64(const Utf8Char* path) { + if (!path || *path == 0) return 0; + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; const UInt64 FNV_PRIME = 0x100000001b3ULL; diff --git a/dev/libSystem/SystemKit/Syscall.h b/dev/libSystem/SystemKit/Syscall.h index 5a840df1..a1505b46 100644 --- a/dev/libSystem/SystemKit/Syscall.h +++ b/dev/libSystem/SystemKit/Syscall.h @@ -15,6 +15,8 @@ IMPORT_C VoidPtr libsys_syscall_arg_3(SizeT id, VoidPtr arg1, VoidPtr arg3); IMPORT_C VoidPtr libsys_syscall_arg_4(SizeT id, VoidPtr arg1, VoidPtr arg3, VoidPtr arg4); inline UInt64 libsys_hash_64(const Char* path) { + if (!path || *path == 0) return 0; + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; const UInt64 FNV_PRIME = 0x100000001b3ULL; -- cgit v1.2.3 From 8a72d5231f308e1f0c41f267149c32928dab4b96 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 09:55:46 +0200 Subject: feat: Add ownership for future audit purposes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/BinaryMutex.cc | 5 +++++ dev/kernel/src/DriveMgr.cc | 3 ++- dev/kernel/src/FileMgr.cc | 1 + dev/kernel/src/IPEFDylibObject.cc | 1 + dev/kernel/src/SoftwareTimer.cc | 1 + dev/kernel/src/ThreadLocalStorage.cc | 1 + dev/kernel/src/Timer.cc | 1 + 7 files changed, 12 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/src/BinaryMutex.cc b/dev/kernel/src/BinaryMutex.cc index bbf7a477..8c8cdc0f 100644 --- a/dev/kernel/src/BinaryMutex.cc +++ b/dev/kernel/src/BinaryMutex.cc @@ -11,6 +11,7 @@ namespace Kernel { /***********************************************************************************/ /// @brief Unlocks the binary mutex. /***********************************************************************************/ + Bool BinaryMutex::Unlock() noexcept { if (fLockingProcess.Status == ProcessStatusKind::kRunning) { fLockingProcess = USER_PROCESS(); @@ -25,6 +26,7 @@ Bool BinaryMutex::Unlock() noexcept { /***********************************************************************************/ /// @brief Locks process in the binary mutex. /***********************************************************************************/ + Bool BinaryMutex::Lock(USER_PROCESS& process) { if (!process || this->IsLocked()) return No; @@ -36,6 +38,7 @@ Bool BinaryMutex::Lock(USER_PROCESS& process) { /***********************************************************************************/ /// @brief Checks if process is locked. /***********************************************************************************/ + Bool BinaryMutex::IsLocked() const { return this->fLockingProcess.Status == ProcessStatusKind::kRunning; } @@ -43,6 +46,7 @@ Bool BinaryMutex::IsLocked() const { /***********************************************************************************/ /// @brief Try lock or wait. /***********************************************************************************/ + Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { if (timer == nullptr) return No; @@ -57,6 +61,7 @@ Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { /// @brief Wait for process **sec** until we check if it's free. /// @param sec seconds. /***********************************************************************************/ + BOOL BinaryMutex::WaitForProcess(const Int16& sec) noexcept { HardwareTimer hw_timer(rtl_milliseconds(sec)); hw_timer.Wait(); diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index b7c181c8..9f107e97 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -15,7 +15,8 @@ /***********************************************************************************/ /// @file DriveMgr.cc -/// @brief Drive Manager of kernel. +/// @brief Drive Manager of NeKernel. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ namespace Kernel { diff --git a/dev/kernel/src/FileMgr.cc b/dev/kernel/src/FileMgr.cc index e000965f..faed9ae1 100644 --- a/dev/kernel/src/FileMgr.cc +++ b/dev/kernel/src/FileMgr.cc @@ -10,6 +10,7 @@ /***********************************************************************************/ /// @file FileMgr.cc //! @brief File System Manager API. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ namespace Kernel { diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index d1d4eeca..a24fba72 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -35,6 +35,7 @@ using namespace Kernel; /***********************************************************************************/ /// @file IPEFDylibObject.cc /// @brief PEF's Dylib runtime. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ /***********************************************************************************/ diff --git a/dev/kernel/src/SoftwareTimer.cc b/dev/kernel/src/SoftwareTimer.cc index 535bec9e..52087931 100644 --- a/dev/kernel/src/SoftwareTimer.cc +++ b/dev/kernel/src/SoftwareTimer.cc @@ -7,6 +7,7 @@ #include /// @brief SoftwareTimer class, meant to be generic. +///! @author Amlal El Mahrouss (amlal@nekernel.org) using namespace Kernel; diff --git a/dev/kernel/src/ThreadLocalStorage.cc b/dev/kernel/src/ThreadLocalStorage.cc index 03a71f1a..f54eeaab 100644 --- a/dev/kernel/src/ThreadLocalStorage.cc +++ b/dev/kernel/src/ThreadLocalStorage.cc @@ -16,6 +16,7 @@ /// @bugs: 0 /// @file ThreadLocalStorage.cc /// @brief NeKernel Thread Local Storage. +///! @author Amlal El Mahrouss (amlal@nekernel.org) /***********************************************************************************/ using namespace Kernel; diff --git a/dev/kernel/src/Timer.cc b/dev/kernel/src/Timer.cc index 826be99a..6539f1a9 100644 --- a/dev/kernel/src/Timer.cc +++ b/dev/kernel/src/Timer.cc @@ -9,6 +9,7 @@ ///! BUGS: 0 ///! @file Timer.cc ///! @brief Software Timer implementation +///! @author Amlal El Mahrouss (amlal@nekernel.org) using namespace Kernel; -- cgit v1.2.3 From 6eb928f5ac24c1602eb4207a7662a2fff818dfe6 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 09:56:41 +0200 Subject: feat: Add ownership for future audit purposes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/BitMapMgr.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'dev') diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc index df678d41..22737dbe 100644 --- a/dev/kernel/src/BitMapMgr.cc +++ b/dev/kernel/src/BitMapMgr.cc @@ -19,6 +19,8 @@ #define kBitMapSizeIdx (1U) #define kBitMapUsedIdx (2U) +///! @author Amlal El Mahrouss (amlal@nekernel.org) + namespace Kernel { namespace HAL { namespace Detail { -- cgit v1.2.3 From 5e0d656c5762e8123dde32d959255bd71d9e2184 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 10:27:27 +0200 Subject: refactor: use `rt_debug_cmd` instead of `rt_debug_type` Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/DebugOutput.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index 87649406..992d1ca7 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -180,9 +180,9 @@ inline TerminalDevice get_console_in(Char* buf) { return self; } -inline constexpr SizeT kDebugTypeLen = 256U; +inline constexpr SizeT kDebugCmdLen = 256U; -typedef Char rt_debug_type[kDebugTypeLen]; +typedef Char rt_debug_cmd[kDebugCmdLen]; inline TerminalDevice& operator<<(TerminalDevice& src, const Long& num) { src = number(num); -- cgit v1.2.3 From ce891b401974242f193b2dc4e4581a8cb17e6c95 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 13:59:44 +0200 Subject: fix: `kKernelVM` shall be validated in case it is null. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 2ddf980f..03b0d39f 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -43,6 +43,8 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { kKernelVM = kHandoverHeader->f_PageStart; + MUST_PASS(kKernelVM); + hal_write_cr3(kKernelVM); /************************************** */ -- cgit v1.2.3 From b64da4658e72fa2a1da6dcc8686642ed1e247aa3 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 10 Jul 2025 14:08:00 +0200 Subject: fix: Validate `kKernelVM` correctly, instead of using the debug `MUST_PASS` macro. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 03b0d39f..39f7de1d 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -42,8 +42,11 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { handover_hdr->f_HardwareTables.f_ImageHandle); kKernelVM = kHandoverHeader->f_PageStart; - - MUST_PASS(kKernelVM); + + if (!kKernelVM) { + MUST_PASS(kKernelVM); + return kEfiFail; + } hal_write_cr3(kKernelVM); -- cgit v1.2.3 From 8174a8c538c1cd4771f23b1b2ee59f897b7b23d5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 17 Jul 2025 07:44:37 +0100 Subject: feat: Update tooling from btb to nebuild. Moved platform specific ABI into their own HAL. Signed-off-by: Amlal El Mahrouss --- README.md | 2 +- dev/kernel/HALKit/AMD64/CxxAbi.cc | 78 ++++++++++++++++++++++++++++++ dev/kernel/HALKit/ARM64/APM/APM+IO.cc | 2 +- dev/kernel/HALKit/ARM64/CxxAbi.cc | 88 +++++++++++++++++++++++++++++++++ dev/kernel/src/CxxAbi-AMD64.cc | 82 ------------------------------- dev/kernel/src/CxxAbi-ARM64.cc | 91 ----------------------------------- modules_ahci_x64.sh | 4 +- modules_pio_x64.sh | 4 +- setup_x64_project.sh | 4 +- tooling/fsck.hefs.cc | 2 +- 10 files changed, 175 insertions(+), 182 deletions(-) create mode 100644 dev/kernel/HALKit/AMD64/CxxAbi.cc create mode 100644 dev/kernel/HALKit/ARM64/CxxAbi.cc delete mode 100644 dev/kernel/src/CxxAbi-AMD64.cc delete mode 100644 dev/kernel/src/CxxAbi-ARM64.cc (limited to 'dev') diff --git a/README.md b/README.md index 8304bbb8..dc9acf93 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ - [MinGW](https://www.mingw-w64.org/) (cross-compiling) - [Clang](https://clang.llvm.org/) - [NASM](https://nasm.us/) -- [NeBuild](https://github.com/nekernel-org/btb) (build system) +- [NeBuild](https://github.com/nekernel-org/nebuild) (build system) ### **Build & Run** diff --git a/dev/kernel/HALKit/AMD64/CxxAbi.cc b/dev/kernel/HALKit/AMD64/CxxAbi.cc new file mode 100644 index 00000000..cd135abc --- /dev/null +++ b/dev/kernel/HALKit/AMD64/CxxAbi.cc @@ -0,0 +1,78 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include +#include +#include + +atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; + +uarch_t __atexit_func_count; + +/// @brief dynamic shared object Handle. +Kernel::UIntPtr __dso_handle; + +EXTERN_C Kernel::Void __cxa_pure_virtual(void* self) { + (Kernel::Void)(Kernel::kout << "object: " + << Kernel::number(reinterpret_cast(self))); + (Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r"); +} + +EXTERN_C void ___chkstk_ms(PtrDiff frame_size) { + char* sp; + asm volatile("mov %%rsp, %0" : "=r"(sp)); + + for (PtrDiff offset = kPageSize; offset < frame_size; offset += kPageSize) { + sp[-offset] = 0; + } +} + +EXTERN_C int atexit(void (*f)()) { + if (__atexit_func_count >= kAtExitMacDestructors) return 1; + + __atexit_funcs[__atexit_func_count].destructor_func = f; + + __atexit_func_count++; + + return 0; +} + +EXTERN_C void __cxa_finalize(void* f) { + uarch_t i = __atexit_func_count; + if (!f) { + while (i--) { + if (__atexit_funcs[i].destructor_func) { + (*__atexit_funcs[i].destructor_func)(); + }; + } + + return; + } + + while (i--) { + if (__atexit_funcs[i].destructor_func) { + (*__atexit_funcs[i].destructor_func)(); + __atexit_funcs[i].destructor_func = 0; + }; + } +} + +namespace cxxabiv1 { +EXTERN_C int __cxa_guard_acquire(__guard* g) { + (void) g; + return 0; +} + +EXTERN_C int __cxa_guard_release(__guard* g) { + *(char*) g = 1; + return 0; +} + +EXTERN_C void __cxa_guard_abort(__guard* g) { + (void) g; +} +} // namespace cxxabiv1 diff --git a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc index e58fb782..17a60515 100644 --- a/dev/kernel/HALKit/ARM64/APM/APM+IO.cc +++ b/dev/kernel/HALKit/ARM64/APM/APM+IO.cc @@ -9,7 +9,7 @@ using namespace Kernel; -/// @brief Send APM command to it's IO space. +/// @brief Send APM command to its IO space. /// @param base_dma the IO base port. /// @param cmd the command. /// @return status code. diff --git a/dev/kernel/HALKit/ARM64/CxxAbi.cc b/dev/kernel/HALKit/ARM64/CxxAbi.cc new file mode 100644 index 00000000..09898b08 --- /dev/null +++ b/dev/kernel/HALKit/ARM64/CxxAbi.cc @@ -0,0 +1,88 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include +#include + +atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; + +uarch_t __atexit_func_count; + +/// @brief dynamic shared object Handle. +Kernel::UIntPtr __dso_handle; + +EXTERN_C void __chkstk(void) {} + +EXTERN_C int atexit(void (*f)(), void* arg, void* dso) { + if (__atexit_func_count >= kAtExitMacDestructors) return 1; + + __atexit_funcs[__atexit_func_count].destructor_func = f; + __atexit_funcs[__atexit_func_count].obj_ptr = arg; + __atexit_funcs[__atexit_func_count].dso_handle = dso; + + __atexit_func_count++; + + return 0; +} + +EXTERN_C void __cxa_finalize(void* f) { + uarch_t i = __atexit_func_count; + if (!f) { + while (i--) { + if (__atexit_funcs[i].destructor_func) { + (*__atexit_funcs[i].destructor_func)(); + __atexit_funcs[i].destructor_func = 0; + }; + } + + return; + } + + while (i--) { + if (__atexit_funcs[i].destructor_func) { + (*__atexit_funcs[i].destructor_func)(); + __atexit_funcs[i].destructor_func = 0; + }; + } +} + +namespace cxxabiv1 { +EXTERN_C int __cxa_guard_acquire(__guard* g) { + (void) g; + return 0; +} + +EXTERN_C int __cxa_guard_release(__guard* g) { + *(char*) g = 1; + return 0; +} + +EXTERN_C void __cxa_guard_abort(__guard* g) { + (void) g; +} +} // namespace cxxabiv1 + +EXTERN_C Kernel::Void _purecall(void* self) { + (Kernel::Void)(Kernel::kout << "object: " + << Kernel::number(reinterpret_cast(self))); + (Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r"); +} + +EXTERN_C Kernel::Void _Init_thread_footer(Kernel::Int* thread_obj) { + NE_UNUSED(thread_obj); +} + +EXTERN_C Kernel::Void _Init_thread_epoch(Kernel::Void) { + NE_UNUSED(0); +} + +EXTERN_C Kernel::Void _Init_thread_header(Kernel::Int* thread_obj) { + NE_UNUSED(0); +} + +EXTERN_C Kernel::Int _tls_index = 0UL; + diff --git a/dev/kernel/src/CxxAbi-AMD64.cc b/dev/kernel/src/CxxAbi-AMD64.cc deleted file mode 100644 index 30c8306e..00000000 --- a/dev/kernel/src/CxxAbi-AMD64.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#ifdef __NE_AMD64__ - -#include -#include -#include -#include - -atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; - -uarch_t __atexit_func_count; - -/// @brief dynamic shared object Handle. -Kernel::UIntPtr __dso_handle; - -EXTERN_C Kernel::Void __cxa_pure_virtual(void* self) { - (Kernel::Void)(Kernel::kout << "object: " - << Kernel::number(reinterpret_cast(self))); - (Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r"); -} - -EXTERN_C void ___chkstk_ms(PtrDiff frame_size) { - char* sp; - asm volatile("mov %%rsp, %0" : "=r"(sp)); - - for (PtrDiff offset = kPageSize; offset < frame_size; offset += kPageSize) { - sp[-offset] = 0; - } -} - -EXTERN_C int atexit(void (*f)()) { - if (__atexit_func_count >= kAtExitMacDestructors) return 1; - - __atexit_funcs[__atexit_func_count].destructor_func = f; - - __atexit_func_count++; - - return 0; -} - -EXTERN_C void __cxa_finalize(void* f) { - uarch_t i = __atexit_func_count; - if (!f) { - while (i--) { - if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(); - }; - } - - return; - } - - while (i--) { - if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(); - __atexit_funcs[i].destructor_func = 0; - }; - } -} - -namespace cxxabiv1 { -EXTERN_C int __cxa_guard_acquire(__guard* g) { - (void) g; - return 0; -} - -EXTERN_C int __cxa_guard_release(__guard* g) { - *(char*) g = 1; - return 0; -} - -EXTERN_C void __cxa_guard_abort(__guard* g) { - (void) g; -} -} // namespace cxxabiv1 - -#endif // ifdef __NE_AMD64__ diff --git a/dev/kernel/src/CxxAbi-ARM64.cc b/dev/kernel/src/CxxAbi-ARM64.cc deleted file mode 100644 index e91eb958..00000000 --- a/dev/kernel/src/CxxAbi-ARM64.cc +++ /dev/null @@ -1,91 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#ifdef __NE_ARM64__ - -#include -#include -#include - -atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; - -uarch_t __atexit_func_count; - -/// @brief dynamic shared object Handle. -Kernel::UIntPtr __dso_handle; - -EXTERN_C void __chkstk(void) {} - -EXTERN_C int atexit(void (*f)(), void* arg, void* dso) { - if (__atexit_func_count >= kAtExitMacDestructors) return 1; - - __atexit_funcs[__atexit_func_count].destructor_func = f; - __atexit_funcs[__atexit_func_count].obj_ptr = arg; - __atexit_funcs[__atexit_func_count].dso_handle = dso; - - __atexit_func_count++; - - return 0; -} - -EXTERN_C void __cxa_finalize(void* f) { - uarch_t i = __atexit_func_count; - if (!f) { - while (i--) { - if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(); - __atexit_funcs[i].destructor_func = 0; - }; - } - - return; - } - - while (i--) { - if (__atexit_funcs[i].destructor_func) { - (*__atexit_funcs[i].destructor_func)(); - __atexit_funcs[i].destructor_func = 0; - }; - } -} - -namespace cxxabiv1 { -EXTERN_C int __cxa_guard_acquire(__guard* g) { - (void) g; - return 0; -} - -EXTERN_C int __cxa_guard_release(__guard* g) { - *(char*) g = 1; - return 0; -} - -EXTERN_C void __cxa_guard_abort(__guard* g) { - (void) g; -} -} // namespace cxxabiv1 - -EXTERN_C Kernel::Void _purecall(void* self) { - (Kernel::Void)(Kernel::kout << "object: " - << Kernel::number(reinterpret_cast(self))); - (Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r"); -} - -EXTERN_C Kernel::Void _Init_thread_footer(Kernel::Int* thread_obj) { - NE_UNUSED(thread_obj); -} - -EXTERN_C Kernel::Void _Init_thread_epoch(Kernel::Void) { - NE_UNUSED(0); -} - -EXTERN_C Kernel::Void _Init_thread_header(Kernel::Int* thread_obj) { - NE_UNUSED(0); -} - -EXTERN_C Kernel::Int _tls_index = 0UL; - -#endif // ifdef __NE_ARM64__ diff --git a/modules_ahci_x64.sh b/modules_ahci_x64.sh index eadce549..89d5f60b 100755 --- a/modules_ahci_x64.sh +++ b/modules_ahci_x64.sh @@ -5,7 +5,7 @@ # 04/05/25: Improve and fix script. cd dev/boot/modules/SysChk -btb amd64-ahci-epm.json +nebuild amd64-ahci-epm.json cd ../ cd BootNet -btb amd64.json \ No newline at end of file +nebuild amd64.json \ No newline at end of file diff --git a/modules_pio_x64.sh b/modules_pio_x64.sh index b091704e..bc1153ba 100755 --- a/modules_pio_x64.sh +++ b/modules_pio_x64.sh @@ -5,7 +5,7 @@ # 04/05/25: Improve and fix script. cd dev/boot/modules/SysChk -btb amd64-pio-epm.json +nebuild amd64-pio-epm.json cd ../ cd BootNet -btb amd64.json \ No newline at end of file +nebuild amd64.json \ No newline at end of file diff --git a/setup_x64_project.sh b/setup_x64_project.sh index fd5edf7c..da74a332 100755 --- a/setup_x64_project.sh +++ b/setup_x64_project.sh @@ -8,9 +8,9 @@ cd dev/libSystem cd src make libsys_asm_io_x64 cd .. -btb libSystem.json +nebuild libSystem.json cd ../ddk -btb ddk.json +nebuild ddk.json cd ../boot make -f amd64-desktop.make efi make -f amd64-desktop.make epm-img diff --git a/tooling/fsck.hefs.cc b/tooling/fsck.hefs.cc index 950a709b..e59cacc0 100644 --- a/tooling/fsck.hefs.cc +++ b/tooling/fsck.hefs.cc @@ -43,7 +43,7 @@ int main(int argc, char** argv) { return EXIT_FAILURE; } - if (boot_node.badSectors >= kMkFsMaxBadSectors) { + if (boot_node.badSectors > kMkFsMaxBadSectors) { mkfs::console_out() << "hefs: error: HeFS disk has too much bad sectors: " << opt_disk << "\n"; return EXIT_FAILURE; } -- cgit v1.2.3 From 61236d6fba58fb0edc62ddf39a5ebbff049e2648 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 18 Jul 2025 14:59:05 +0100 Subject: fix: GfkKit&MKFSLib: inline function inside headers to avoid symbol duplicates (libmkfs) and include DeviceMgr in FB inside GfxKit, remove FB module too from the includes; as it is not necessary and confusing inside GfxKit. Signed-off-by: Amlal El Mahrouss --- dev/kernel/GfxKit/FB.h | 3 +-- tooling/libmkfs/mkfs.h | 9 +++++---- tooling/manual.py | 9 --------- tooling/mk_htman.py | 9 +++++++++ 4 files changed, 15 insertions(+), 15 deletions(-) delete mode 100644 tooling/manual.py create mode 100755 tooling/mk_htman.py (limited to 'dev') diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h index 14f0393c..d7523064 100644 --- a/dev/kernel/GfxKit/FB.h +++ b/dev/kernel/GfxKit/FB.h @@ -6,8 +6,7 @@ #pragma once -#include -#include +#include namespace Kernel { class FBDeviceInterface; diff --git a/tooling/libmkfs/mkfs.h b/tooling/libmkfs/mkfs.h index d87060da..1765e1d4 100644 --- a/tooling/libmkfs/mkfs.h +++ b/tooling/libmkfs/mkfs.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include #include @@ -19,11 +20,11 @@ namespace mkfs { namespace detail { /// @internal /// @brief GB‐to‐byte conversion (use multiplication, not XOR). - static constexpr size_t gib_cast(uint32_t gb) { + inline constexpr size_t gib_cast(uint32_t gb) { return static_cast(gb) * 1024ULL * 1024ULL * 1024ULL; } - static bool parse_decimal(const std::string& opt, unsigned long long& out) { + inline bool parse_decimal(const std::string& opt, unsigned long long& out) { if (opt.empty()) return false; char* endptr = nullptr; unsigned long long val = std::strtoull(opt.c_str(), &endptr, 10); @@ -32,7 +33,7 @@ namespace detail { return true; } - static bool parse_signed(const std::string& opt, long& out, int base = 10) { + inline bool parse_signed(const std::string& opt, long& out, int base = 10) { if (opt.empty()) return false; char* endptr = nullptr; long val = std::strtol(opt.c_str(), &endptr, base); @@ -41,7 +42,7 @@ namespace detail { return true; } - static std::string build_args(int argc, char** argv) { + inline std::string build_args(int argc, char** argv) { std::string combined; for (int i = 1; i < argc; ++i) { combined += argv[i]; diff --git a/tooling/manual.py b/tooling/manual.py deleted file mode 100644 index 8298559b..00000000 --- a/tooling/manual.py +++ /dev/null @@ -1,9 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- - -import sys, os - -if __name__ == "__main__": - if len(sys.argv) != 2: - print("Usage: manual.py ") - sys.exit(os.EX_CONFIG) diff --git a/tooling/mk_htman.py b/tooling/mk_htman.py new file mode 100755 index 00000000..8298559b --- /dev/null +++ b/tooling/mk_htman.py @@ -0,0 +1,9 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- + +import sys, os + +if __name__ == "__main__": + if len(sys.argv) != 2: + print("Usage: manual.py ") + sys.exit(os.EX_CONFIG) -- cgit v1.2.3 From 3d1932fb68aa20b87429b55355bb051f817070ce Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 19 Jul 2025 11:48:34 +0100 Subject: feat: CoreProcessScheduler has now a 'kSpecial' type for trees. (Because of SwapKit, or devices) reworked LibMSG lisp function pointer type. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/CoreProcessScheduler.h | 6 ++++-- dev/libMsg/MsgKit/Server.h | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index 01219214..e8ac158e 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -47,8 +47,9 @@ enum { template struct PROCESS_HEAP_TREE { - static constexpr auto kPtr = true; + static constexpr auto kHeap = true; static constexpr auto kFile = false; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; @@ -73,8 +74,9 @@ struct PROCESS_HEAP_TREE { template struct PROCESS_FILE_TREE { - static constexpr auto kPtr = false; + static constexpr auto kHeap = false; static constexpr auto kFile = true; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; diff --git a/dev/libMsg/MsgKit/Server.h b/dev/libMsg/MsgKit/Server.h index 33d10407..aee0dbdd 100644 --- a/dev/libMsg/MsgKit/Server.h +++ b/dev/libMsg/MsgKit/Server.h @@ -29,8 +29,10 @@ struct LIBMSG_EXPR final { LIBMSG_EXPR* l_child{nullptr}; }; -typedef Void (*libmsg_func_t)(LIBMSG_EXPR* arg); +/// @brief Function type for LibMSG lisp. +typedef Void (*libmsg_func_t)(LIBMSG_EXPR* self, VoidPtr arg, SizeT arg_size); 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); + +IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head); -- cgit v1.2.3 From 1e12163836e649da0d67fc8f17bc9a415554efe4 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 19 Jul 2025 16:11:51 +0100 Subject: feat: wip: new tree kind 'kSpecial' and refactor user scheduler code temporary regarding FileTree allocation. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 24 ++++++++++---------- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 23 ++++++++++--------- dev/kernel/KernelKit/CoreProcessScheduler.h | 17 ++++++++------ dev/kernel/KernelKit/UserProcessScheduler.h | 4 ++-- dev/kernel/src/UserProcessScheduler.cc | 26 +++++++++++----------- 5 files changed, 49 insertions(+), 45 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 8b4c0d1a..79f25920 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -45,15 +45,15 @@ struct HAL_APIC_MADT; struct HAL_HARDWARE_THREAD; struct HAL_HARDWARE_THREAD final { - HAL::StackFramePtr mFramePtr; - ProcessID mThreadID{0}; + StackFramePtr mFramePtr; + ProcessID mThreadID{0}; }; -EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); +EXTERN_C Void sched_jump_to_task(StackFramePtr stack_frame); -STATIC HAL_APIC_MADT* kMADTBlock = nullptr; -STATIC Bool kSMPAware = false; -STATIC Int64 kSMPCount = 0; +STATIC HAL_APIC_MADT* kSMPBlock = nullptr; +STATIC Bool kSMPAware = false; +STATIC Int64 kSMPCount = 0; EXTERN_C UIntPtr kApicBaseAddress; @@ -160,11 +160,11 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { return; } - kRawMADT = pwr.Leak().Leak(); - kMADTBlock = reinterpret_cast(kRawMADT); - kSMPAware = NO; + kRawMADT = pwr.Leak().Leak(); + kSMPBlock = reinterpret_cast(kRawMADT); + kSMPAware = NO; - if (kMADTBlock) { + if (kSMPBlock) { kSMPInterrupt = 0; kSMPCount = 0; @@ -191,8 +191,8 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { controller.Write(LAPIC_REG_TIMER_LVT, 0x20 | (1 << 17)); controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000); - volatile UInt8* entry_ptr = reinterpret_cast(kMADTBlock->List); - volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length; + volatile UInt8* entry_ptr = reinterpret_cast(kSMPBlock->List); + volatile UInt8* end_ptr = ((UInt8*) kSMPBlock) + kSMPBlock->Length; while (entry_ptr < end_ptr) { UInt8 type = *entry_ptr; diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index cd41480a..3363e809 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -136,7 +136,7 @@ template STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz, SizeT size_buffer) noexcept { if (sector_sz == 0) { - kout << "Invalid sector size.\r"; + kout << "ahci: Invalid sector size.\r"; err_global_get() = kErrorDisk; return; } @@ -144,7 +144,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz lba /= sector_sz; if (!buffer || size_buffer == 0) { - kout << "Invalid buffer for AHCI I/O.\r"; + kout << "ahci: Invalid buffer for AHCI I/O.\r"; err_global_get() = kErrorDisk; return; } @@ -157,7 +157,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz while (slot == ~0UL) { if (timeout > kTimeout) { - kout << "No free command slot found, AHCI disk is busy!\r"; + kout << "ahci: No free command slot found, AHCI disk is busy!\r"; err_global_get() = kErrorDisk; return; @@ -217,7 +217,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz command_table->Prdt[prdt_index - 1].Ie = YES; if (bytes_remaining > 0) { - kout << "Warning: AHCI PRDT overflow, cannot map full buffer.\r"; + kout << "ahci: AHCI PRDT overflow, cannot map full buffer.\r"; err_global_get() = kErrorDisk; rtl_dma_free(size_buffer); @@ -262,7 +262,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz while (YES) { if (timeout > kTimeout) { - kout << "Disk hangup!\r"; + kout << "ahci: disk-hangup, corrupted-disk.\r"; err_global_get() = kErrorDiskIsCorrupted; rtl_dma_free(size_buffer); @@ -277,7 +277,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz rtl_dma_flush(ptr, size_buffer); if (kSATAHba->Is & kSATAErrTaskFile) { - kout << "AHCI Task File Error during I/O.\r"; + kout << "ahci: Task File Error during I/O.\r"; rtl_dma_free(size_buffer); err_global_get() = kErrorDiskIsCorrupted; @@ -293,9 +293,8 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz if ((kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)) == 0) { goto ahci_io_end; } else { - kout << "Warning: Disk still busy after command completion!\r"; - while (kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)) - ; + kout << "ahci: Disk still busy after command completion!\r"; + while (kSATAHba->Ports[kSATAIndex].Tfd & (kSATASRBsy | kSATASRDrq)); } ahci_io_end: @@ -308,13 +307,15 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz @brief Gets the number of sectors inside the drive. @return Sector size in bytes. */ -STATIC ATTRIBUTE(unused) SizeT drv_get_sector_count_ahci() { +STATIC ATTRIBUTE(unused) +SizeT drv_get_sector_count_ahci() { return kSATASectorCount; } /// @brief Get the drive size. /// @return Disk size in bytes. -STATIC ATTRIBUTE(unused) SizeT drv_get_size_ahci() { +STATIC ATTRIBUTE(unused) +SizeT drv_get_size_ahci() { return drv_std_get_sector_count() * kAHCISectorSize; } diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index e8ac158e..170244eb 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -19,7 +19,7 @@ #define kSchedTeamCount (256U) #define kSchedMaxMemoryLimit (gib_cast(128)) /* max physical memory limit */ -#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ +#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ #define kSchedNameLen (128U) @@ -35,6 +35,9 @@ class UserProcessTeam; template struct PROCESS_HEAP_TREE; +template +struct PROCESS_SPECIAL_TREE; + template struct PROCESS_FILE_TREE; @@ -47,9 +50,9 @@ enum { template struct PROCESS_HEAP_TREE { - static constexpr auto kHeap = true; - static constexpr auto kFile = false; - static constexpr auto kSpecial = false; + static constexpr auto kHeap = true; + static constexpr auto kFile = false; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; @@ -74,9 +77,9 @@ struct PROCESS_HEAP_TREE { template struct PROCESS_FILE_TREE { - static constexpr auto kHeap = false; - static constexpr auto kFile = true; - static constexpr auto kSpecial = false; + static constexpr auto kHeap = false; + static constexpr auto kFile = true; + static constexpr auto kSpecial = false; T Entry{nullptr}; SizeT EntrySize{0UL}; diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 8a730233..3dae178a 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -96,7 +96,7 @@ class USER_PROCESS final { /***********************************************************************************/ ///! @brief Spawns a dynamic library handle if dylib. /***********************************************************************************/ - Bool SpawnDylib(); + Bool InitDylib(); /***********************************************************************************/ ///! @brief Exits the app. @@ -192,7 +192,7 @@ class UserProcessScheduler final : public ISchedulable { NE_MOVE_DELETE(UserProcessScheduler) public: - operator bool(); + operator bool(); bool operator!(); public: diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 7e14fa62..45957c7b 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -122,20 +122,9 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { hal_write_cr3(vm_register); #else - auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); + auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); #endif - if (!this->FileTree) { - this->FileTree = new PROCESS_FILE_TREE(); - - if (!this->FileTree) { - this->Crash(); - return ErrorOr(-kErrorHeapOutOfMemory); - } - - /// @todo File Tree allocation and dispose methods (amlal) - } - if (!this->HeapTree) { this->HeapTree = new PROCESS_HEAP_TREE(); @@ -335,7 +324,7 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { /// @brief Add dylib to the process object. /***********************************************************************************/ -Bool USER_PROCESS::SpawnDylib() { +Bool USER_PROCESS::InitDylib() { // React according to the process's kind. switch (this->Kind) { case USER_PROCESS::kExecutableDylibKind: { @@ -437,6 +426,17 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im process.PTime = 0; process.RTime = 0; + if (!process.FileTree) { + process.FileTree = new PROCESS_FILE_TREE(); + + if (!process.FileTree) { + process.Crash(); + return ErrorOr(-kErrorHeapOutOfMemory); + } + + /// @todo File Tree allocation and dispose methods (amlal) + } + (Void)(kout << "PID: " << number(process.ProcessId) << kendl); (Void)(kout << "Name: " << process.Name << kendl); -- cgit v1.2.3 From 4e61e22c3da59b259741e57298725330791aed3e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 21 Jul 2025 08:51:41 +0100 Subject: feat: NeKernel Semaphore API. includes: - New semaphore API for the kernel, we also make use of the HardwareTimer class here. - Defined header only for now. - New HAL HW Timer API in AMD64. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalTimer.cc | 18 ++++----- dev/kernel/KernelKit/KPC.h | 1 + dev/kernel/KernelKit/Semaphore.h | 79 ++++++++++++++++++++++++++++++++++++- tooling/mk_htman.py | 2 +- 4 files changed, 89 insertions(+), 11 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalTimer.cc b/dev/kernel/HALKit/AMD64/HalTimer.cc index 13573880..ae3271f6 100644 --- a/dev/kernel/HALKit/AMD64/HalTimer.cc +++ b/dev/kernel/HALKit/AMD64/HalTimer.cc @@ -61,11 +61,8 @@ HardwareTimer::HardwareTimer(UInt64 ms) : fWaitFor(ms) { // if not enabled yet. if (!(*((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) & (1 << 0))) { *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) = - *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) | - (1 << 0); // enable timer - *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) = - *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) | - (1 << 3); // one shot conf + *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) | (1 << 0) | + (1 << 3); // enable timer } } @@ -80,18 +77,21 @@ HardwareTimer::~HardwareTimer() { BOOL HardwareTimer::Wait() noexcept { if (fWaitFor < 1) return NO; + if (fWaitFor > 1'000'000) return NO; // max 1000s = 16 minutes - UInt64 hpet_cap = *((volatile UInt64*) (fDigitalTimer + kHPETCounterRegValue)); + UInt64 hpet_cap = *((volatile UInt64*) (fDigitalTimer)); UInt64 femtoseconds_per_tick = (hpet_cap >> 32); if (femtoseconds_per_tick == 0) return NO; volatile UInt64* timer = (volatile UInt64*) (fDigitalTimer + kHPETCounterRegValue); - UInt64 now = *timer; - UInt64 prev = now + (fWaitFor / femtoseconds_per_tick); + UInt64 now = *timer; + + UInt64 fs_wait = fWaitFor * 1'000'000'000'000ULL; + UInt64 stop_at = now + (fs_wait / femtoseconds_per_tick); - while (*timer < (prev)) asm volatile("pause"); + while (*timer < (stop_at)) asm volatile("pause"); return YES; } diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index a3b13de6..26d1b113 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -65,6 +65,7 @@ inline constexpr KPCError kErrorFileLocked = 64; inline constexpr KPCError kErrorDiskIsTooTiny = 65; inline constexpr KPCError kErrorDmaExhausted = 66; inline constexpr KPCError kErrorOutOfBitMapMemory = 67; +inline constexpr KPCError kErrorNetworkTimeout = 68; /// Generic errors. inline constexpr KPCError kErrorUnimplemented = -1; diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index a1b5ecad..7fa05008 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -6,10 +6,87 @@ #pragma once +/// @author Amlal El Mahrouss +/// @file Semaphore.h +/// @brief Semaphore structure and functions for synchronization in the kernel. + #include #include #include +#define kSemaphoreOwnerIndex (0) +#define kSemaphoreCountIndex (1) + +#define kSemaphoreCount (2) + namespace Kernel { -typedef Int64 Semaphore; +/// @brief Semaphore structure used for synchronization. +typedef UInt64 Semaphore[kSemaphoreCount]; + +/// @brief Checks if the semaphore is valid. +inline BOOL rtl_sem_is_valid(const Semaphore& sem) { + return sem[kSemaphoreOwnerIndex] != 0 || sem[kSemaphoreCountIndex] > 0; +} + +/// @brief Releases the semaphore, resetting its owner and count. +/// @param sem +/// @return +inline BOOL rtl_sem_release(Semaphore& sem) { + sem[kSemaphoreOwnerIndex] = 0; + sem[kSemaphoreCountIndex] = 0; + + return TRUE; +} + +/// @brief Initializes the semaphore with an owner and a count of zero. +/// @param sem +/// @param owner +/// @return +inline BOOL rtl_sem_init(Semaphore& sem, Int64 owner) { + if (!owner || sem[kSemaphoreOwnerIndex] > 0) { + return FALSE; + } + + sem[kSemaphoreOwnerIndex] = owner; + sem[kSemaphoreCountIndex] = 0; + + return TRUE; +} + +/// @brief Waits for the semaphore to be available, blocking until it is. +/// @param sem +/// @param timeout +/// @return +inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { + if (!rtl_sem_is_valid(sem)) { + return FALSE; + } + + if (timeout <= 0) { + err_global_get() = kErrorNetworkTimeout; + + return FALSE; + } + + if (sem[kSemaphoreCountIndex] > 0) { + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } + + HardwareTimer timer(timeout); + timer.Wait(); + + if (sem[kSemaphoreCountIndex] > 0) { + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } + + err_global_get() = kErrorNetworkTimeout; + + return FALSE; // Failed to acquire semaphore +} // namespace Kernel } // namespace Kernel \ No newline at end of file diff --git a/tooling/mk_htman.py b/tooling/mk_htman.py index 8298559b..5488d478 100755 --- a/tooling/mk_htman.py +++ b/tooling/mk_htman.py @@ -5,5 +5,5 @@ import sys, os if __name__ == "__main__": if len(sys.argv) != 2: - print("Usage: manual.py ") + print("INFO: manual.py ") sys.exit(os.EX_CONFIG) -- cgit v1.2.3 From 514a5540e4fdb94fe504792191b66444f03956fa Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 21 Jul 2025 09:07:46 +0100 Subject: feat: HAL/HPET: document source code. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalTimer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalTimer.cc b/dev/kernel/HALKit/AMD64/HalTimer.cc index ae3271f6..22876a96 100644 --- a/dev/kernel/HALKit/AMD64/HalTimer.cc +++ b/dev/kernel/HALKit/AMD64/HalTimer.cc @@ -62,7 +62,7 @@ HardwareTimer::HardwareTimer(UInt64 ms) : fWaitFor(ms) { if (!(*((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) & (1 << 0))) { *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) = *((volatile UInt64*) ((UInt8*) fDigitalTimer + kHPETConfigRegValue)) | (1 << 0) | - (1 << 3); // enable timer + (1 << 3); // enable timer & one shot conf } } -- cgit v1.2.3 From c7e9d01d331d966a92efdc7ad6fb76ac96d0943e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 21 Jul 2025 21:19:33 +0100 Subject: fix: KPC: Fix duplicate of kErrorNetworkTimeout. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/KPC.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index 26d1b113..836be458 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -65,7 +65,7 @@ inline constexpr KPCError kErrorFileLocked = 64; inline constexpr KPCError kErrorDiskIsTooTiny = 65; inline constexpr KPCError kErrorDmaExhausted = 66; inline constexpr KPCError kErrorOutOfBitMapMemory = 67; -inline constexpr KPCError kErrorNetworkTimeout = 68; +inline constexpr KPCError kErrorTimeout = 68; /// Generic errors. inline constexpr KPCError kErrorUnimplemented = -1; -- cgit v1.2.3 From 3b7964eb2f165e77334a92ca907d769bede17aef Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 21 Jul 2025 21:25:14 +0100 Subject: fix: kernel{aarch64}: it now builds without issue because of a fix in the bitmap manager. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/ARM64/Paging.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h index 5001871b..7a022141 100644 --- a/dev/kernel/HALKit/ARM64/Paging.h +++ b/dev/kernel/HALKit/ARM64/Paging.h @@ -93,7 +93,7 @@ struct PDE_4KB final { PTE_4KB ALIGN(kPageAlign) fEntries[kPageMax]; }; -auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page) -> VoidPtr; +auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr; auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL -- cgit v1.2.3 From 5516544f97026460ede96f894c806dd8925885ae Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:05:37 +0100 Subject: feat: dev/kernel: Finish kernel semaphore API. note: - The API is very new, except breaking changces. - It may be buggy in some areas, except some changes soon. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 7fa05008..a00273e8 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -19,13 +19,21 @@ #define kSemaphoreCount (2) +#define kSemaphoreIncremenntOwner(sem) \ + (sem[kSemaphoreOwnerIndex]++) + + +#define kSemaphoreDecrementOwner(sem) \ + (sem[kSemaphoreOwnerIndex]--) + + namespace Kernel { /// @brief Semaphore structure used for synchronization. typedef UInt64 Semaphore[kSemaphoreCount]; /// @brief Checks if the semaphore is valid. -inline BOOL rtl_sem_is_valid(const Semaphore& sem) { - return sem[kSemaphoreOwnerIndex] != 0 || sem[kSemaphoreCountIndex] > 0; +inline BOOL rtl_sem_is_valid(const Semaphore& sem, UInt64 owner = 0) { + return sem[kSemaphoreOwnerIndex] != owner || sem[kSemaphoreCountIndex] > 0; } /// @brief Releases the semaphore, resetting its owner and count. @@ -42,9 +50,10 @@ inline BOOL rtl_sem_release(Semaphore& sem) { /// @param sem /// @param owner /// @return -inline BOOL rtl_sem_init(Semaphore& sem, Int64 owner) { - if (!owner || sem[kSemaphoreOwnerIndex] > 0) { - return FALSE; +inline BOOL rtl_sem_acquire(Semaphore& sem, UInt64 owner) { + if (!owner) { + err_global_get() = kErrorInvalidData; + return FALSE; // Invalid owner } sem[kSemaphoreOwnerIndex] = owner; @@ -57,8 +66,8 @@ inline BOOL rtl_sem_init(Semaphore& sem, Int64 owner) { /// @param sem /// @param timeout /// @return -inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { - if (!rtl_sem_is_valid(sem)) { +inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* condition = nullptr) { + if (!rtl_sem_is_valid(sem, owner)) { return FALSE; } @@ -68,7 +77,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { return FALSE; } - if (sem[kSemaphoreCountIndex] > 0) { + if (!condition || *condition) { err_global_get() = kErrorSuccess; sem[kSemaphoreCountIndex]--; @@ -76,13 +85,15 @@ inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { } HardwareTimer timer(timeout); - timer.Wait(); - - if (sem[kSemaphoreCountIndex] > 0) { - err_global_get() = kErrorSuccess; - sem[kSemaphoreCountIndex]--; + BOOL ret = timer.Wait(); - return TRUE; + if (ret) { + if (!condition || *condition) { + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } } err_global_get() = kErrorNetworkTimeout; -- cgit v1.2.3 From ec995b2501d337eca9aedfeb5eebbc0a4bc930ba Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:14:01 +0100 Subject: fix: sem: remove useless 'namespace Kernel' comment on function. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index a00273e8..f98110b0 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -99,5 +99,5 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con err_global_get() = kErrorNetworkTimeout; return FALSE; // Failed to acquire semaphore -} // namespace Kernel +} } // namespace Kernel \ No newline at end of file -- cgit v1.2.3 From c81208be24a34bd36fc9e01fdbdc146440d7c9e7 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:21:30 +0100 Subject: fix: sem: fix Semaphore API of kernel, validation and typo fixes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index f98110b0..ee29eeae 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -19,7 +19,7 @@ #define kSemaphoreCount (2) -#define kSemaphoreIncremenntOwner(sem) \ +#define kSemaphoreIncrementOwner(sem) \ (sem[kSemaphoreOwnerIndex]++) @@ -33,7 +33,7 @@ typedef UInt64 Semaphore[kSemaphoreCount]; /// @brief Checks if the semaphore is valid. inline BOOL rtl_sem_is_valid(const Semaphore& sem, UInt64 owner = 0) { - return sem[kSemaphoreOwnerIndex] != owner || sem[kSemaphoreCountIndex] > 0; + return sem[kSemaphoreOwnerIndex] == owner && sem[kSemaphoreCountIndex] > 0; } /// @brief Releases the semaphore, resetting its owner and count. -- cgit v1.2.3 From 4ece9e7d55734ca14c87f7fb6b708aa086b4d3c0 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:22:38 +0100 Subject: fix: sem: fix condition in 'rtl_sem_is_valid' as it was to strict. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index ee29eeae..0d2b84da 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -33,7 +33,7 @@ typedef UInt64 Semaphore[kSemaphoreCount]; /// @brief Checks if the semaphore is valid. inline BOOL rtl_sem_is_valid(const Semaphore& sem, UInt64 owner = 0) { - return sem[kSemaphoreOwnerIndex] == owner && sem[kSemaphoreCountIndex] > 0; + return sem[kSemaphoreOwnerIndex] == owner && sem[kSemaphoreCountIndex] >= 0; } /// @brief Releases the semaphore, resetting its owner and count. -- cgit v1.2.3 From c968cdc88ce9458ba5b2859f9d983dc404c6c0ee Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:24:29 +0100 Subject: fix: sem: Add 'Semaphore.cc' Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/Semaphore.cc | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 dev/kernel/src/Semaphore.cc (limited to 'dev') diff --git a/dev/kernel/src/Semaphore.cc b/dev/kernel/src/Semaphore.cc new file mode 100644 index 00000000..acbbb57f --- /dev/null +++ b/dev/kernel/src/Semaphore.cc @@ -0,0 +1,7 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include \ No newline at end of file -- cgit v1.2.3 From 3978ac0540a7e430a4a2a157d2e53653b5c37bd0 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:25:39 +0100 Subject: feat: rtl_sem_wait: check semaphore for underflows. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 0d2b84da..686ce1c9 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -19,13 +19,9 @@ #define kSemaphoreCount (2) -#define kSemaphoreIncrementOwner(sem) \ - (sem[kSemaphoreOwnerIndex]++) - - -#define kSemaphoreDecrementOwner(sem) \ - (sem[kSemaphoreOwnerIndex]--) +#define kSemaphoreIncrementOwner(sem) (sem[kSemaphoreOwnerIndex]++) +#define kSemaphoreDecrementOwner(sem) (sem[kSemaphoreOwnerIndex]--) namespace Kernel { /// @brief Semaphore structure used for synchronization. @@ -71,6 +67,11 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con return FALSE; } + if (sem[kSemaphoreCountIndex] <= 0) { + err_global_get() = kErrorNetworkTimeout; + return FALSE; + } + if (timeout <= 0) { err_global_get() = kErrorNetworkTimeout; -- cgit v1.2.3 From 8cda61ab7fe436075a7d93306819a609de80c4a0 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:28:51 +0100 Subject: fix: sem: fix decrement logic of the semaphore api's 'rtl_sem_wait' Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 686ce1c9..618a3268 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -67,11 +67,6 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con return FALSE; } - if (sem[kSemaphoreCountIndex] <= 0) { - err_global_get() = kErrorNetworkTimeout; - return FALSE; - } - if (timeout <= 0) { err_global_get() = kErrorNetworkTimeout; @@ -79,6 +74,11 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con } if (!condition || *condition) { + if (sem[kSemaphoreCountIndex] == 0) { + err_global_get() = kErrorNetworkTimeout; + return FALSE; + } + err_global_get() = kErrorSuccess; sem[kSemaphoreCountIndex]--; @@ -90,6 +90,11 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (ret) { if (!condition || *condition) { + if (sem[kSemaphoreCountIndex] == 0) { + err_global_get() = kErrorNetworkTimeout; + return FALSE; + } + err_global_get() = kErrorSuccess; sem[kSemaphoreCountIndex]--; -- cgit v1.2.3 From b17e50f399180aa1fed136a0917625bb0d9ebf81 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:29:52 +0100 Subject: fix: sem: use 'kErrorTimeout' instead of 'kErrorNetworkTimeout' Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 618a3268..8bb8c1fe 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -102,7 +102,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con } } - err_global_get() = kErrorNetworkTimeout; + err_global_get() = kErrorTimeout; return FALSE; // Failed to acquire semaphore } -- cgit v1.2.3 From cab7131a9eab7f06ba39260be477a1b4532705d8 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:30:44 +0100 Subject: feat: sem: fix usage of 'kErrorNetworkTimeout' to 'kErrorTimeout' Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 8bb8c1fe..7957ce31 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -68,14 +68,14 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con } if (timeout <= 0) { - err_global_get() = kErrorNetworkTimeout; + err_global_get() = kErrorTimeout; return FALSE; } if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorNetworkTimeout; + err_global_get() = kErrorTimeout; return FALSE; } @@ -91,7 +91,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (ret) { if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorNetworkTimeout; + err_global_get() = kErrorTimeout; return FALSE; } -- cgit v1.2.3 From ca7b843f1c15dd479d287f93221cd23e74d94385 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:32:09 +0100 Subject: feat: new 'kErrorAccessDenied' type for semaphore api. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/KPC.h | 3 ++- dev/kernel/KernelKit/Semaphore.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index 836be458..b55d98fc 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -65,7 +65,8 @@ inline constexpr KPCError kErrorFileLocked = 64; inline constexpr KPCError kErrorDiskIsTooTiny = 65; inline constexpr KPCError kErrorDmaExhausted = 66; inline constexpr KPCError kErrorOutOfBitMapMemory = 67; -inline constexpr KPCError kErrorTimeout = 68; +inline constexpr KPCError kErrorTimeout = 68; +inline constexpr KPCError kErrorAccessDenied = 69; /// Generic errors. inline constexpr KPCError kErrorUnimplemented = -1; diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 7957ce31..6905c8cc 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -75,7 +75,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorTimeout; + err_global_get() = kErrorAccessDenied; return FALSE; } @@ -91,7 +91,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (ret) { if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorTimeout; + err_global_get() = kErrorAccessDenied; return FALSE; } -- cgit v1.2.3 From 6d16db11d91c5fdf302af54e8e797dcbed8c9c71 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 23 Jul 2025 08:33:49 +0100 Subject: feat: new 'kErrorUnavailable' type and semaphore API breaking changes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/KPC.h | 1 + dev/kernel/KernelKit/Semaphore.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index b55d98fc..794197e2 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -67,6 +67,7 @@ inline constexpr KPCError kErrorDmaExhausted = 66; inline constexpr KPCError kErrorOutOfBitMapMemory = 67; inline constexpr KPCError kErrorTimeout = 68; inline constexpr KPCError kErrorAccessDenied = 69; +inline constexpr KPCError kErrorUnavailable = 70; /// Generic errors. inline constexpr KPCError kErrorUnimplemented = -1; diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 6905c8cc..df410208 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -75,7 +75,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorAccessDenied; + err_global_get() = kErrorUnavailable; return FALSE; } @@ -91,7 +91,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* con if (ret) { if (!condition || *condition) { if (sem[kSemaphoreCountIndex] == 0) { - err_global_get() = kErrorAccessDenied; + err_global_get() = kErrorUnavailable; return FALSE; } -- cgit v1.2.3 From 5dcf3ce391288e9d4f5f25120cf722f962e30881 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 24 Jul 2025 09:57:46 +0100 Subject: refactor: FB.h, Semaphore.h: minor style changes. Signed-off-by: Amlal El Mahrouss --- dev/kernel/GfxKit/FB.h | 4 ++-- dev/kernel/KernelKit/Semaphore.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'dev') diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h index d7523064..28f3a20c 100644 --- a/dev/kernel/GfxKit/FB.h +++ b/dev/kernel/GfxKit/FB.h @@ -46,7 +46,7 @@ class FBDeviceInterface NE_DEVICE { const Char* Name() const override; public: - FBDeviceInterface& operator<<(FBDevicePacket* Data) override; - FBDeviceInterface& operator>>(FBDevicePacket* Data) override; + FBDeviceInterface& operator<<(FBDevicePacket* dat) override; + FBDeviceInterface& operator>>(FBDevicePacket* dat) override; }; } // namespace Kernel diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index df410208..1bc61ed1 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -20,7 +20,6 @@ #define kSemaphoreCount (2) #define kSemaphoreIncrementOwner(sem) (sem[kSemaphoreOwnerIndex]++) - #define kSemaphoreDecrementOwner(sem) (sem[kSemaphoreOwnerIndex]--) namespace Kernel { -- cgit v1.2.3 From 40498554aa642ac0dbf4ce021df5bbceda5b61e4 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 24 Jul 2025 10:35:32 +0100 Subject: feat: __CF_64BIT__ macro for CoreFoundation.fwrk. refactor! Semaphore API breaking changes in the new 'SemaphoreArr' type. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/Semaphore.h | 16 ++++++++-------- .../frameworks/CoreFoundation.fwrk/CoreFoundation.json | 3 ++- .../frameworks/CoreFoundation.fwrk/headers/Foundation.h | 2 +- public/frameworks/CoreFoundation.fwrk/headers/String.h | 5 +++++ 4 files changed, 16 insertions(+), 10 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 1bc61ed1..930b245d 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -14,27 +14,27 @@ #include #include -#define kSemaphoreOwnerIndex (0) -#define kSemaphoreCountIndex (1) +#define kSemaphoreOwnerIndex (0U) +#define kSemaphoreCountIndex (1U) -#define kSemaphoreCount (2) +#define kSemaphoreCount (2U) #define kSemaphoreIncrementOwner(sem) (sem[kSemaphoreOwnerIndex]++) #define kSemaphoreDecrementOwner(sem) (sem[kSemaphoreOwnerIndex]--) namespace Kernel { /// @brief Semaphore structure used for synchronization. -typedef UInt64 Semaphore[kSemaphoreCount]; +typedef UInt64 SemaphoreArr[kSemaphoreCount]; /// @brief Checks if the semaphore is valid. -inline BOOL rtl_sem_is_valid(const Semaphore& sem, UInt64 owner = 0) { +inline BOOL rtl_sem_is_valid(const SemaphoreArr& sem, UInt64 owner = 0) { return sem[kSemaphoreOwnerIndex] == owner && sem[kSemaphoreCountIndex] >= 0; } /// @brief Releases the semaphore, resetting its owner and count. /// @param sem /// @return -inline BOOL rtl_sem_release(Semaphore& sem) { +inline BOOL rtl_sem_release(SemaphoreArr& sem) { sem[kSemaphoreOwnerIndex] = 0; sem[kSemaphoreCountIndex] = 0; @@ -45,7 +45,7 @@ inline BOOL rtl_sem_release(Semaphore& sem) { /// @param sem /// @param owner /// @return -inline BOOL rtl_sem_acquire(Semaphore& sem, UInt64 owner) { +inline BOOL rtl_sem_acquire(SemaphoreArr& sem, UInt64 owner) { if (!owner) { err_global_get() = kErrorInvalidData; return FALSE; // Invalid owner @@ -61,7 +61,7 @@ inline BOOL rtl_sem_acquire(Semaphore& sem, UInt64 owner) { /// @param sem /// @param timeout /// @return -inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* condition = nullptr) { +inline BOOL rtl_sem_wait(SemaphoreArr& sem, UInt64 owner, UInt64 timeout, BOOL* condition = nullptr) { if (!rtl_sem_is_valid(sem, owner)) { return FALSE; } diff --git a/public/frameworks/CoreFoundation.fwrk/CoreFoundation.json b/public/frameworks/CoreFoundation.fwrk/CoreFoundation.json index 076b35ae..39e6b480 100644 --- a/public/frameworks/CoreFoundation.fwrk/CoreFoundation.json +++ b/public/frameworks/CoreFoundation.fwrk/CoreFoundation.json @@ -15,7 +15,8 @@ "kCFVersion=0x0100", "kCFVersionHighest=0x0100", "kCFVersionLowest=0x0100", - "__NE_AMD64__" + "__NE_AMD64__", + "__CF_64BIT__" ] } \ No newline at end of file diff --git a/public/frameworks/CoreFoundation.fwrk/headers/Foundation.h b/public/frameworks/CoreFoundation.fwrk/headers/Foundation.h index 500ad544..8396a3e8 100644 --- a/public/frameworks/CoreFoundation.fwrk/headers/Foundation.h +++ b/public/frameworks/CoreFoundation.fwrk/headers/Foundation.h @@ -25,7 +25,7 @@ struct CFPoint; struct CFRect; struct CFColor; -#ifndef __LP64__ +#ifndef __CF_64BIT__ typedef SInt32 CFInteger; typedef float CFReal; #else diff --git a/public/frameworks/CoreFoundation.fwrk/headers/String.h b/public/frameworks/CoreFoundation.fwrk/headers/String.h index c28c05cd..ea32038d 100644 --- a/public/frameworks/CoreFoundation.fwrk/headers/String.h +++ b/public/frameworks/CoreFoundation.fwrk/headers/String.h @@ -14,5 +14,10 @@ class CFString; class CFString final CF_OBJECT { public: + CFString() = default; + ~CFString() = default; + + CFString(const CFString&) = delete; + CFString& operator=(const CFString&) = delete; }; } // namespace CF \ No newline at end of file -- cgit v1.2.3 From d546e35937521c868150a0807f30a2e2b1f69bb8 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 29 Jul 2025 15:17:36 +0100 Subject: feat: libSystem: implement 'Jail.h' header. Signed-off-by: Amlal El Mahrouss --- dev/libSystem/SystemKit/Jail.h | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/libSystem/SystemKit/Jail.h b/dev/libSystem/SystemKit/Jail.h index 998173f9..4098089d 100644 --- a/dev/libSystem/SystemKit/Jail.h +++ b/dev/libSystem/SystemKit/Jail.h @@ -9,7 +9,7 @@ #include /// @file Jail.h -/// @brief NeKernel Jail System +/// @brief NeKernel Jail System, part of OpenEnclave. struct JAIL_INFO; struct JAIL; @@ -19,4 +19,17 @@ struct JAIL_INFO { SInt32 fParentID; SInt32 fJailHash; SInt64 fACL; -}; \ No newline at end of file +}; + +/// @brief Jail information (we grab a JAIL from JailGetCurrent()) +struct JAIL { + struct JAIL_INFO* fServer; + struct JAIL_INFO* fClient; + SInt32 fJailHash; + SInt32 fParentID; + SInt64 fACL; +}; + +/// @brief Get the current jail +/// @return Pointer to the current jail structure, or NULL if not in a jail +IMPORT_C struct JAIL* JailGetCurrent(Void); -- cgit v1.2.3 From bd4466fbe026ac25f84d88d0306b9745b9bbbe8b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 31 Jul 2025 00:55:34 +0100 Subject: feat: IPC: use C-lock pattern to retain IPC transfers. Signed-off-by: Amlal El Mahrouss --- dev/kernel/NetworkKit/IPC.h | 8 +++++++- dev/kernel/src/Network/IPCMsg.cc | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/NetworkKit/IPC.h b/dev/kernel/NetworkKit/IPC.h index 0dd8a1f1..d14356c0 100644 --- a/dev/kernel/NetworkKit/IPC.h +++ b/dev/kernel/NetworkKit/IPC.h @@ -57,6 +57,12 @@ enum { constexpr inline auto kIPCMsgSize = 6094U; +enum { + kIPCLockInvalid, + kIPCLockFree = 1, + kIPCLockUsed = 2, +}; + /// @brief IPC connection header, message cannot be greater than 6K. typedef struct IPC_MSG final { UInt32 IpcHeaderMagic; // cRemoteHeaderMagic @@ -68,7 +74,7 @@ typedef struct IPC_MSG final { UInt32 IpcMsg; UInt32 IpcMsgSz; UInt8 IpcData[kIPCMsgSize]; - + UInt32 IpcLock; /// @brief Passes the message to target, could be anything, HTTP packet, JSON or whatever. static Bool Pass(IPC_MSG* self, IPC_MSG* target) noexcept; } PACKED IPC_MSG; diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc index 6f54e449..9abefcef 100644 --- a/dev/kernel/src/Network/IPCMsg.cc +++ b/dev/kernel/src/Network/IPCMsg.cc @@ -87,6 +87,8 @@ Bool ipc_construct_packet(_Output IPC_MSG** pckt_in) { (*pckt_in)->IpcFrom.UserProcessID = 0; (*pckt_in)->IpcFrom.UserProcessTeam = 0; + (*pckt_in)->IpcLock = kIPCLockFree; + return Yes; } @@ -103,8 +105,20 @@ Bool IPC_MSG::Pass(IPC_MSG* src, IPC_MSG* target) noexcept { if (src->IpcMsgSz > target->IpcMsgSz) return No; if (target->IpcMsgSz > src->IpcMsgSz) return No; + UInt32 timeout = 0U; + + while ((target->IpcLock % kIPCLockUsed) != 0) { + if (timeout > 100000U) { + return No; + } + } + + ++target->IpcLock; + rt_copy_memory_safe(src->IpcData, target->IpcData, src->IpcMsgSz, kIPCMsgSize); + --target->IpcLock; + return Yes; } -- cgit v1.2.3 From 30f6aa05db0e99970fab65c8c8f10cea9830e3cc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 31 Jul 2025 08:52:46 +0100 Subject: feat: Replace CoreBoot module with NeBoot module. Signed-off-by: Amlal El Mahrouss --- dev/boot/modules/BootNet/BootNet.h | 2 +- dev/boot/src/HEL/ARM64/BootCB.S | 4 ++-- dev/kernel/FirmwareKit/CoreBoot/BootNet.h | 32 ---------------------------- dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h | 34 ------------------------------ dev/kernel/FirmwareKit/CoreBoot/NS.h | 10 --------- dev/kernel/FirmwareKit/NeBoot/BootNet.h | 32 ++++++++++++++++++++++++++++ dev/kernel/FirmwareKit/NeBoot/NS.h | 10 +++++++++ dev/kernel/FirmwareKit/NeBoot/NeBoot.h | 34 ++++++++++++++++++++++++++++++ dev/kernel/MoveAll.ARM64.sh | 7 ------ dev/kernel/MoveAll.X64.sh | 7 ------ dev/kernel/amd64-ci.make | 2 +- dev/kernel/amd64-desktop.make | 2 +- dev/kernel/arm64-desktop.make | 2 +- dev/kernel/move-all-aarch64.sh | 7 ++++++ dev/kernel/move-all-x64.sh | 7 ++++++ 15 files changed, 96 insertions(+), 96 deletions(-) delete mode 100644 dev/kernel/FirmwareKit/CoreBoot/BootNet.h delete mode 100644 dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h delete mode 100644 dev/kernel/FirmwareKit/CoreBoot/NS.h create mode 100644 dev/kernel/FirmwareKit/NeBoot/BootNet.h create mode 100644 dev/kernel/FirmwareKit/NeBoot/NS.h create mode 100644 dev/kernel/FirmwareKit/NeBoot/NeBoot.h delete mode 100755 dev/kernel/MoveAll.ARM64.sh delete mode 100755 dev/kernel/MoveAll.X64.sh create mode 100755 dev/kernel/move-all-aarch64.sh create mode 100755 dev/kernel/move-all-x64.sh (limited to 'dev') diff --git a/dev/boot/modules/BootNet/BootNet.h b/dev/boot/modules/BootNet/BootNet.h index 0b319387..3e876d09 100644 --- a/dev/boot/modules/BootNet/BootNet.h +++ b/dev/boot/modules/BootNet/BootNet.h @@ -9,4 +9,4 @@ #pragma once -#include +#include diff --git a/dev/boot/src/HEL/ARM64/BootCB.S b/dev/boot/src/HEL/ARM64/BootCB.S index 3b0e1737..d52c1dcf 100644 --- a/dev/boot/src/HEL/ARM64/BootCB.S +++ b/dev/boot/src/HEL/ARM64/BootCB.S @@ -4,7 +4,7 @@ ------------------------------------------- */ -#ifdef __NE_COREBOOT__ +#ifdef __NE_NEBOOT__ .section .boot_hdr .align 4 @@ -37,4 +37,4 @@ bootloader_start: bl bootloader_main ret -#endif // __NE_COREBOOT__ \ No newline at end of file +#endif // __NE_NEBOOT__ \ No newline at end of file diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h deleted file mode 100644 index 3ed11363..00000000 --- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h +++ /dev/null @@ -1,32 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -#define kBootNetINetMagic "ONET" -#define kBootNetINetMagicLength (4) -#define kBootNetVersion (0x001) -#define kBootNetNameLen (256U) - -/// @brief Netboot Internet Header -/// Consists of 4 magic characters, and a set of fields describing the current patch that's being -/// sent (if m_preflight = 0) -/// @note Can be used to patch ROMs too (if ImpliesProgram = 1) -typedef struct BOOTNET_INTERNET_HEADER { - Kernel::Char NB1; /// magic char 1 'O' - Kernel::Char NB2; /// magic char 2 'N' - Kernel::Char NB3; /// magic char 3 'E' - Kernel::Char NB4; /// magic char 4 'T' - Kernel::UInt16 Version; - Kernel::Char Name[kBootNetNameLen]; /// example: Modjo - Kernel::Int32 Length; /// the patch length. - Kernel::Char Target[kBootNetNameLen]; /// the target file. - Kernel::Boolean ImpliesProgram : 1; /// does it imply reprogramming? - Kernel::Boolean Preflight : 1; /// is it a preflight packet. - Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** -} BOOTNET_INTERNET_HEADER; diff --git a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h deleted file mode 100644 index 9e756a70..00000000 --- a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h +++ /dev/null @@ -1,34 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Firmware::Detail::CoreBoot { -using namespace Kernel; - -struct COREBOOT_LINEAR_EXEC; - -/// @brief Linear Executable Header -/// @author Amlal El Mahrouss -struct ATTRIBUTE(aligned(4)) COREBOOT_LINEAR_EXEC { - const Char fMagic[2]; // magic number - const Char fName[10]; // operating system name - const UInt32 fRevision; // firmware revision - const UInt32 fStartAddress; // start address (master/slave(s) thread) - -#ifdef NE_IS_EXTENDED_COREBOOT - UIntPtr fMasterStructure; // master structure for MP/PM and device tree and such. (ARM) - UIntPtr fMasterStructureVersion; // master structure version. -#endif - -#ifdef NE_IS_MBCI_COREBOOT - UIntPtr fMBCIStructure; // MBCI structure for MBCI (ARM) - UIntPtr fMBCIStructureVersion; // MBCI structure version. -#endif -}; -} // namespace Firmware::Detail::CoreBoot diff --git a/dev/kernel/FirmwareKit/CoreBoot/NS.h b/dev/kernel/FirmwareKit/CoreBoot/NS.h deleted file mode 100644 index 06197fcd..00000000 --- a/dev/kernel/FirmwareKit/CoreBoot/NS.h +++ /dev/null @@ -1,10 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include \ No newline at end of file diff --git a/dev/kernel/FirmwareKit/NeBoot/BootNet.h b/dev/kernel/FirmwareKit/NeBoot/BootNet.h new file mode 100644 index 00000000..3ed11363 --- /dev/null +++ b/dev/kernel/FirmwareKit/NeBoot/BootNet.h @@ -0,0 +1,32 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +#define kBootNetINetMagic "ONET" +#define kBootNetINetMagicLength (4) +#define kBootNetVersion (0x001) +#define kBootNetNameLen (256U) + +/// @brief Netboot Internet Header +/// Consists of 4 magic characters, and a set of fields describing the current patch that's being +/// sent (if m_preflight = 0) +/// @note Can be used to patch ROMs too (if ImpliesProgram = 1) +typedef struct BOOTNET_INTERNET_HEADER { + Kernel::Char NB1; /// magic char 1 'O' + Kernel::Char NB2; /// magic char 2 'N' + Kernel::Char NB3; /// magic char 3 'E' + Kernel::Char NB4; /// magic char 4 'T' + Kernel::UInt16 Version; + Kernel::Char Name[kBootNetNameLen]; /// example: Modjo + Kernel::Int32 Length; /// the patch length. + Kernel::Char Target[kBootNetNameLen]; /// the target file. + Kernel::Boolean ImpliesProgram : 1; /// does it imply reprogramming? + Kernel::Boolean Preflight : 1; /// is it a preflight packet. + Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** +} BOOTNET_INTERNET_HEADER; diff --git a/dev/kernel/FirmwareKit/NeBoot/NS.h b/dev/kernel/FirmwareKit/NeBoot/NS.h new file mode 100644 index 00000000..a4d6a251 --- /dev/null +++ b/dev/kernel/FirmwareKit/NeBoot/NS.h @@ -0,0 +1,10 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include \ No newline at end of file diff --git a/dev/kernel/FirmwareKit/NeBoot/NeBoot.h b/dev/kernel/FirmwareKit/NeBoot/NeBoot.h new file mode 100644 index 00000000..621b3b64 --- /dev/null +++ b/dev/kernel/FirmwareKit/NeBoot/NeBoot.h @@ -0,0 +1,34 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Firmware::Detail::NeBoot { +using namespace Kernel; + +struct NEBOOT_LINEAR_EXEC; + +/// @brief Linear Executable Header +/// @author Amlal El Mahrouss +struct ATTRIBUTE(aligned(4)) NEBOOT_LINEAR_EXEC { + const Char fMagic[2]; // magic number + const Char fName[10]; // operating system name + const UInt32 fRevision; // firmware revision + const UInt32 fStartAddress; // start address (master/slave(s) thread) + +#ifdef NE_IS_EXTENDED_COREBOOT + UIntPtr fMasterStructure; // master structure for MP/PM and device tree and such. (ARM) + UIntPtr fMasterStructureVersion; // master structure version. +#endif + +#ifdef NE_IS_MBCI_COREBOOT + UIntPtr fMBCIStructure; // MBCI structure for MBCI (ARM) + UIntPtr fMBCIStructureVersion; // MBCI structure version. +#endif +}; +} // namespace Firmware::Detail::NeBoot diff --git a/dev/kernel/MoveAll.ARM64.sh b/dev/kernel/MoveAll.ARM64.sh deleted file mode 100755 index 35e0909e..00000000 --- a/dev/kernel/MoveAll.ARM64.sh +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/sh - -for file in *.o; do - mv -- "$file" "${file%.o}.obj" -done - -mv *.obj obj/ diff --git a/dev/kernel/MoveAll.X64.sh b/dev/kernel/MoveAll.X64.sh deleted file mode 100755 index 1c135d06..00000000 --- a/dev/kernel/MoveAll.X64.sh +++ /dev/null @@ -1,7 +0,0 @@ -#! /bin/sh - -for file in *.o; do - mv -- "$file" "${file%.o}.obj" -done - -mv *.obj HALKit/AMD64/*.obj obj/ diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index 81b72b93..f21efca4 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -42,7 +42,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.X64.sh +MOVEALL=./move-all-x64.sh WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 2874d31c..36b0f18e 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -44,7 +44,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.X64.sh +MOVEALL=./move-all-x64.sh WINDRES=x86_64-w64-mingw32-windres .PHONY: nekernel-amd64-epm diff --git a/dev/kernel/arm64-desktop.make b/dev/kernel/arm64-desktop.make index 423391af..e83e1db8 100644 --- a/dev/kernel/arm64-desktop.make +++ b/dev/kernel/arm64-desktop.make @@ -30,7 +30,7 @@ error: @echo "=== ERROR ===" @echo "=> Use a specific target." -MOVEALL=./MoveAll.ARM64.sh +MOVEALL=./move-all-aarch64.sh .PHONY: nekernel-arm64-epm nekernel-arm64-epm: clean diff --git a/dev/kernel/move-all-aarch64.sh b/dev/kernel/move-all-aarch64.sh new file mode 100755 index 00000000..35e0909e --- /dev/null +++ b/dev/kernel/move-all-aarch64.sh @@ -0,0 +1,7 @@ +#! /bin/sh + +for file in *.o; do + mv -- "$file" "${file%.o}.obj" +done + +mv *.obj obj/ diff --git a/dev/kernel/move-all-x64.sh b/dev/kernel/move-all-x64.sh new file mode 100755 index 00000000..1c135d06 --- /dev/null +++ b/dev/kernel/move-all-x64.sh @@ -0,0 +1,7 @@ +#! /bin/sh + +for file in *.o; do + mv -- "$file" "${file%.o}.obj" +done + +mv *.obj HALKit/AMD64/*.obj obj/ -- cgit v1.2.3 From 43ace5813967229e03ac46cc00ea8ebf1a607740 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 31 Jul 2025 10:46:03 +0100 Subject: fix: SMP: Fix `mp_register_task` thrdid could have been index out of bounds. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 79f25920..0dbd6815 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -115,6 +115,8 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) { EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) { if (!stack_frame) return NO; + if (thrdid > kSMPCount) return NO; + if (!kSMPAware) { sched_jump_to_task(kHWThread[thrdid].mFramePtr); @@ -122,9 +124,7 @@ EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) } HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO); - kHWThread[thrdid].mFramePtr = stack_frame; - if (thrdid > kSMPCount) return NO; return YES; } -- cgit v1.2.3 From f05aa7d8e5a9668b27e43c8bd2718482caa0b59e Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 31 Jul 2025 15:10:21 +0100 Subject: feat: mgmt.oe: openenclave management tool. (wip) Signed-off-by: Amlal El Mahrouss --- dev/libSystem/SystemKit/Jail.h | 1 + public/tools/mgmt.oe/.keep | 0 public/tools/mgmt.oe/mgmt.oe.json | 19 +++++++++++++++++++ public/tools/mgmt.oe/src/.keep | 0 public/tools/mgmt.oe/src/CommandLine.cc | 29 +++++++++++++++++++++++++++++ public/tools/mgmt.oe/vendor/.keep | 0 6 files changed, 49 insertions(+) create mode 100644 public/tools/mgmt.oe/.keep create mode 100644 public/tools/mgmt.oe/mgmt.oe.json create mode 100644 public/tools/mgmt.oe/src/.keep create mode 100644 public/tools/mgmt.oe/src/CommandLine.cc create mode 100644 public/tools/mgmt.oe/vendor/.keep (limited to 'dev') diff --git a/dev/libSystem/SystemKit/Jail.h b/dev/libSystem/SystemKit/Jail.h index 4098089d..c23942c5 100644 --- a/dev/libSystem/SystemKit/Jail.h +++ b/dev/libSystem/SystemKit/Jail.h @@ -9,6 +9,7 @@ #include /// @file Jail.h +/// @author Amlal El Mahrouss /// @brief NeKernel Jail System, part of OpenEnclave. struct JAIL_INFO; diff --git a/public/tools/mgmt.oe/.keep b/public/tools/mgmt.oe/.keep new file mode 100644 index 00000000..e69de29b diff --git a/public/tools/mgmt.oe/mgmt.oe.json b/public/tools/mgmt.oe/mgmt.oe.json new file mode 100644 index 00000000..b4e9d586 --- /dev/null +++ b/public/tools/mgmt.oe/mgmt.oe.json @@ -0,0 +1,19 @@ +{ + "compiler_path": "clang++", + "compiler_std": "c++20", + "headers_path": [ + "./", + "../../../dev/kernel", + "../../../public/frameworks/", + "../../../dev/", + "./" + ], + "sources_path": [], + "output_name": "./dist/mgmt.oe", + "cpp_macros": [ + "kSampleFWVersion=0x0100", + "kSampleFWVersionHighest=0x0100", + "kSampleFWVersionLowest=0x0100", + "__NE_SDK__" + ] +} \ No newline at end of file diff --git a/public/tools/mgmt.oe/src/.keep b/public/tools/mgmt.oe/src/.keep new file mode 100644 index 00000000..e69de29b diff --git a/public/tools/mgmt.oe/src/CommandLine.cc b/public/tools/mgmt.oe/src/CommandLine.cc new file mode 100644 index 00000000..3e8de78b --- /dev/null +++ b/public/tools/mgmt.oe/src/CommandLine.cc @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include + +/// @author Amlal El Mahrouss +/// @brief OpenEnclave management tool + +static JAIL* kJailSrv = nullptr; + +SInt32 _NeMain(SInt32 argc, Char* argv[]) { + LIBSYS_UNUSED(argc); + LIBSYS_UNUSED(argv); + + kJailSrv = JailGetCurrent(); + + MUST_PASS(kJailSrv); + + PrintOut(nullptr, "%s", "mgmt.oe - OpenEnclave Management Tool."); + + /// @note JailGetCurrent returns client as nullptr if we're not that client (we'll not be able to access the jail then) + if (kJailSrv->fClient == nullptr) return EXIT_FAILURE; + + return EXIT_FAILURE; +} \ No newline at end of file diff --git a/public/tools/mgmt.oe/vendor/.keep b/public/tools/mgmt.oe/vendor/.keep new file mode 100644 index 00000000..e69de29b -- cgit v1.2.3 From 11ad9b56ccc1ed50c9293ee4771cf135f6b03c99 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 1 Aug 2025 09:16:50 +0100 Subject: fix: KernelKit: fix BinaryMutex object, it used to took USER_PROCESS as reference with a explicit default constructor. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/BinaryMutex.h | 8 ++++---- dev/kernel/src/BinaryMutex.cc | 13 ++++++------- 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/BinaryMutex.h b/dev/kernel/KernelKit/BinaryMutex.h index 45d4bd8d..4a192bdd 100644 --- a/dev/kernel/KernelKit/BinaryMutex.h +++ b/dev/kernel/KernelKit/BinaryMutex.h @@ -24,16 +24,16 @@ class BinaryMutex final { bool Unlock() noexcept; public: - BOOL WaitForProcess(const Int16& sec) noexcept; + BOOL WaitForProcess(const UInt32& sec) noexcept; public: - bool Lock(USER_PROCESS& process); - bool LockOrWait(USER_PROCESS& process, TimerInterface* timer); + bool Lock(USER_PROCESS* process); + bool LockOrWait(USER_PROCESS* process, TimerInterface* timer); public: NE_COPY_DEFAULT(BinaryMutex) private: - USER_PROCESS& fLockingProcess; + USER_PROCESS* fLockingProcess; }; } // namespace Kernel diff --git a/dev/kernel/src/BinaryMutex.cc b/dev/kernel/src/BinaryMutex.cc index 8c8cdc0f..f669d7fa 100644 --- a/dev/kernel/src/BinaryMutex.cc +++ b/dev/kernel/src/BinaryMutex.cc @@ -13,9 +13,8 @@ namespace Kernel { /***********************************************************************************/ Bool BinaryMutex::Unlock() noexcept { - if (fLockingProcess.Status == ProcessStatusKind::kRunning) { - fLockingProcess = USER_PROCESS(); - fLockingProcess.Status = ProcessStatusKind::kFrozen; + if (fLockingProcess->Status == ProcessStatusKind::kRunning) { + fLockingProcess = nullptr; return Yes; } @@ -27,7 +26,7 @@ Bool BinaryMutex::Unlock() noexcept { /// @brief Locks process in the binary mutex. /***********************************************************************************/ -Bool BinaryMutex::Lock(USER_PROCESS& process) { +Bool BinaryMutex::Lock(USER_PROCESS* process) { if (!process || this->IsLocked()) return No; this->fLockingProcess = process; @@ -40,14 +39,14 @@ Bool BinaryMutex::Lock(USER_PROCESS& process) { /***********************************************************************************/ Bool BinaryMutex::IsLocked() const { - return this->fLockingProcess.Status == ProcessStatusKind::kRunning; + return this->fLockingProcess->Status == ProcessStatusKind::kRunning; } /***********************************************************************************/ /// @brief Try lock or wait. /***********************************************************************************/ -Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { +Bool BinaryMutex::LockOrWait(USER_PROCESS* process, TimerInterface* timer) { if (timer == nullptr) return No; this->Lock(process); @@ -62,7 +61,7 @@ Bool BinaryMutex::LockOrWait(USER_PROCESS& process, TimerInterface* timer) { /// @param sec seconds. /***********************************************************************************/ -BOOL BinaryMutex::WaitForProcess(const Int16& sec) noexcept { +BOOL BinaryMutex::WaitForProcess(const UInt32& sec) noexcept { HardwareTimer hw_timer(rtl_milliseconds(sec)); hw_timer.Wait(); -- cgit v1.2.3 From 23774eda327ec2dffbda34d907a3b70b7772c7b5 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 1 Aug 2025 10:33:29 +0100 Subject: fix: BinaryMutex: Assign `fLockingProcess` to nullptr. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/BinaryMutex.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dev') diff --git a/dev/kernel/KernelKit/BinaryMutex.h b/dev/kernel/KernelKit/BinaryMutex.h index 4a192bdd..f2c15af0 100644 --- a/dev/kernel/KernelKit/BinaryMutex.h +++ b/dev/kernel/KernelKit/BinaryMutex.h @@ -34,6 +34,6 @@ class BinaryMutex final { NE_COPY_DEFAULT(BinaryMutex) private: - USER_PROCESS* fLockingProcess; + USER_PROCESS* fLockingProcess{nullptr}; }; } // namespace Kernel -- cgit v1.2.3 From 34758487e7630244dcec71ebf3995675ac2d1c27 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 3 Aug 2025 13:27:49 +0100 Subject: feat: LaTeX: update technical papers. feat: CPS: Assign image to nullptr in PROCESS_IMAGE container. Signed-off-by: Amlal El Mahrouss --- dev/kernel/KernelKit/CoreProcessScheduler.h | 11 ++++++----- docs/tex/NOTICE.md | 5 +++++ docs/tex/binary_mutex.tex | 2 +- docs/tex/coreprocessscheduler.tex | 13 +++---------- 4 files changed, 15 insertions(+), 16 deletions(-) create mode 100644 docs/tex/NOTICE.md (limited to 'dev') diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index 170244eb..b92d7393 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -90,6 +90,7 @@ struct PROCESS_FILE_TREE { struct PROCESS_FILE_TREE* Parent { nullptr }; + struct PROCESS_FILE_TREE* Child { nullptr }; @@ -97,6 +98,7 @@ struct PROCESS_FILE_TREE { struct PROCESS_FILE_TREE* Prev { nullptr }; + struct PROCESS_FILE_TREE* Next { nullptr }; @@ -115,8 +117,6 @@ enum class ProcessSubsystem : Int32 { kProcessSubsystemCount = 4, }; -typedef UInt64 PTime; - /***********************************************************************************/ //! @brief Local Process identifier. /***********************************************************************************/ @@ -179,7 +179,8 @@ inline bool operator>=(AffinityKind lhs, AffinityKind rhs) { return lhs_int >= rhs_int; } -using ProcessTime = UInt64; +using PTime = UInt64; +using ProcessTime = PTime; using PID = Int64; /***********************************************************************************/ @@ -209,8 +210,8 @@ struct PROCESS_IMAGE final { friend class UserProcessScheduler; - ImagePtr fCode; - ImagePtr fBlob; + ImagePtr fCode{}; + ImagePtr fBlob{}; public: Bool HasCode() const { return this->fCode != nullptr; } diff --git a/docs/tex/NOTICE.md b/docs/tex/NOTICE.md new file mode 100644 index 00000000..5d6eb03f --- /dev/null +++ b/docs/tex/NOTICE.md @@ -0,0 +1,5 @@ +# Notice for LaTeX documents. + +## Recommended Tool + +`pdflatex` is recommended for this matter, although you are free to use other tools. diff --git a/docs/tex/binary_mutex.tex b/docs/tex/binary_mutex.tex index 4e61eb65..cc5a7d3c 100644 --- a/docs/tex/binary_mutex.tex +++ b/docs/tex/binary_mutex.tex @@ -1,7 +1,7 @@ \documentclass{article} \usepackage{graphicx} % Required for inserting images -\title{BinaryMutex} +\title{BinaryMutex: Technical Documentation} \author{Amlal El Mahrouss} \date{\today} diff --git a/docs/tex/coreprocessscheduler.tex b/docs/tex/coreprocessscheduler.tex index 60f2b8cd..dd3594b1 100644 --- a/docs/tex/coreprocessscheduler.tex +++ b/docs/tex/coreprocessscheduler.tex @@ -2,7 +2,7 @@ \usepackage{graphicx} % Required for inserting images \usepackage{hyperref} -\title{CoreProcessScheduler} +\title{CoreProcessScheduler: Technical Documentation} \author{Amlal El Mahrouss} \date{\today} @@ -70,7 +70,7 @@ class UserProcessTeam final { {The process image container is a design pattern made to contain process data and metadata, its purpose comes from the lack of mainstream operating systems of such ability to hold metadata.} -\newline{} +\newline {This approach helps separate concerns and give modularity to the system, as the image and process structure are not mixed together.} @@ -123,17 +123,10 @@ struct PROCESS_IMAGE final { \section{References} -{Here are the reference material on this paper:} +{Here are the reference mentioned on this paper:} {NeKernel}: \href{https://github.com/nekernel-org/nekernel}{NeKernel} {CoreProcessScheduler}: \href{https://github.com/nekernel-org/nekernel/blob/dev/dev/kernel/KernelKit/CoreProcessScheduler.h}{CoreProcessScheduler} -\section{Hyperlinks} - -{NeKernel.org}: \href{https://nekernel.org}{NeKernel.org} -\newline -\newline -{SNU Systems}: \href{https://snu.systems}{SNU.Systems} - \end{document} -- cgit v1.2.3 From 6a0559351257bbf328b37e4b14d24f772878d45d Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 4 Aug 2025 08:34:08 +0100 Subject: feat: wrap `Device` object under the Kernel namespace. why: - To avoid linker and mangling issues. Signed-off-by: Amlal El Mahrouss --- dev/boot/BootKit/Device.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'dev') diff --git a/dev/boot/BootKit/Device.h b/dev/boot/BootKit/Device.h index 6ae8cd6b..9a80e3c9 100644 --- a/dev/boot/BootKit/Device.h +++ b/dev/boot/BootKit/Device.h @@ -9,8 +9,7 @@ #include #include -using namespace Kernel; - +namespace Kernel { /// @brief Device type. class Device { public: @@ -33,3 +32,4 @@ class Device { typedef Device BootDevice; typedef Device NetworkDevice; typedef Device DiskDevice; +} // namespace Kernel \ No newline at end of file -- 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') 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') 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') 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') 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') 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') 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') 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') 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') 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') 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') 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') 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') 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 408be791647c015c99963cc1b6d710f58d729dec Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sat, 9 Aug 2025 08:56:53 +0100 Subject: refactor! rename `tooling` to `tools` feat: BenchKit improvements and libMsg authorship refactors. --- .gitignore | 4 +- CODEOWNERS | 2 +- README.md | 6 +- compile_flags.txt | 2 +- debug_ahci_x64.sh | 2 +- debug_ata_x64.sh | 2 +- dev/libMsg/MsgKit/Server.h | 4 +- dev/misc/BenchKit/Chrono.h | 5 + dev/misc/BenchKit/X64Chrono.h | 16 +- release_ahci_x64.sh | 2 +- release_ata_x64.sh | 2 +- tooling/dist/.keep | 0 tooling/fsck.hefs.cc | 76 ------- tooling/fsck.hefs.json | 16 -- tooling/libmkfs/hefs.h | 116 ----------- tooling/libmkfs/mkfs.h | 83 -------- tooling/mk_app.py | 80 -------- tooling/mk_fwrk.py | 92 --------- tooling/mk_htman.py | 41 ---- tooling/mk_img.py | 41 ---- tooling/mkfs.hefs.cc | 197 ------------------ tooling/mkfs.hefs.json | 16 -- tooling/rang.h | 467 ------------------------------------------ tools/dist/.keep | 0 tools/fsck.hefs.cc | 76 +++++++ tools/fsck.hefs.json | 16 ++ tools/libmkfs/hefs.h | 116 +++++++++++ tools/libmkfs/mkfs.h | 83 ++++++++ tools/mk_app.py | 80 ++++++++ tools/mk_fwrk.py | 92 +++++++++ tools/mk_htman.py | 41 ++++ tools/mk_img.py | 41 ++++ tools/mkfs.hefs.cc | 197 ++++++++++++++++++ tools/mkfs.hefs.json | 16 ++ tools/rang.h | 467 ++++++++++++++++++++++++++++++++++++++++++ 35 files changed, 1253 insertions(+), 1244 deletions(-) delete mode 100644 tooling/dist/.keep delete mode 100644 tooling/fsck.hefs.cc delete mode 100644 tooling/fsck.hefs.json delete mode 100644 tooling/libmkfs/hefs.h delete mode 100644 tooling/libmkfs/mkfs.h delete mode 100755 tooling/mk_app.py delete mode 100755 tooling/mk_fwrk.py delete mode 100755 tooling/mk_htman.py delete mode 100755 tooling/mk_img.py delete mode 100644 tooling/mkfs.hefs.cc delete mode 100644 tooling/mkfs.hefs.json delete mode 100644 tooling/rang.h create mode 100644 tools/dist/.keep create mode 100644 tools/fsck.hefs.cc create mode 100644 tools/fsck.hefs.json create mode 100644 tools/libmkfs/hefs.h create mode 100644 tools/libmkfs/mkfs.h create mode 100644 tools/mk_app.py create mode 100644 tools/mk_fwrk.py create mode 100644 tools/mk_htman.py create mode 100644 tools/mk_img.py create mode 100644 tools/mkfs.hefs.cc create mode 100644 tools/mkfs.hefs.json create mode 100644 tools/rang.h (limited to 'dev') diff --git a/.gitignore b/.gitignore index 9722f662..781e9544 100644 --- a/.gitignore +++ b/.gitignore @@ -25,8 +25,8 @@ ne_bootz neoskrnl/neoskrnl.xcodeproj/project.xcworkspace/xcshareddata/ -tooling/dist/mkfs.* -tooling/dist/fsck.* +tools/dist/mkfs.* +tools/dist/fsck.* html/ latex/ diff --git a/CODEOWNERS b/CODEOWNERS index 8eae8622..bf706bfd 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -4,4 +4,4 @@ /dev/ddk/ @amlel-el-mahrouss /dev/libMsg/ @0xf00sec /dev/libSystem/ @0xf00sec -# some other parts (tooling, frameworks) need ownership too. \ No newline at end of file +# some other parts (tools, frameworks) need ownership too. \ No newline at end of file diff --git a/README.md b/README.md index dc9acf93..0557f531 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ## Overview -**NeKernel** is a modern, multi-platform microkernel designed for security, modularity, and performance. It features a custom VFS, advanced memory management, a flexible DDK (Driver Development Kit), and robust userland tooling. NeKernel is built for research, education, and next-generation OS development. +**NeKernel** is a modern, multi-platform microkernel designed for security, modularity, and performance. It features a custom VFS, advanced memory management, a flexible DDK (Driver Development Kit), and robust userland tools. NeKernel is built for research, education, and next-generation OS development. --- @@ -36,9 +36,9 @@ - **System Call Interface**: low-level syscall ABI, with a stable high-level SDK for user applications. System calls are routed through a syscall manager and abstracted by `libSystem`. -- **Security and Robustness**: kernel and tooling (bounds checks, safe memory copy/set, error codes). Kernel panics and error reporting for critical failures. No dynamic code loading in kernel space. +- **Security and Robustness**: kernel and tools (bounds checks, safe memory copy/set, error codes). Kernel panics and error reporting for critical failures. No dynamic code loading in kernel space. -- **Documentation and Specs**: Full LaTeX specifications for HeFS and NeFS, with on-disk structure diagrams and API documentation. Markdown docs for tooling and usage. +- **Documentation and Specs**: Full LaTeX specifications for HeFS and NeFS, with on-disk structure diagrams and API documentation. Markdown docs for tools and usage. - **Cross-Platform Boot Support**: Bootloader and platform code for AMD64 and ARM64, with handover and hardware abstraction layers. diff --git a/compile_flags.txt b/compile_flags.txt index fbfd1d06..828dc123 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -15,7 +15,7 @@ -Ipublic/tools/open -Ipublic/frameworks -Idev/boot/BootKit --Itooling/ +-Itools/ -I./ -std=c++20 -D__NE_AMD64__ diff --git a/debug_ahci_x64.sh b/debug_ahci_x64.sh index 66121bb7..97ff57ee 100755 --- a/debug_ahci_x64.sh +++ b/debug_ahci_x64.sh @@ -11,6 +11,6 @@ cd ../boot make -f amd64-desktop.make all make -f amd64-desktop.make disk cd ../../ -./tooling/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root +./tools/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root cd dev/boot make -f amd64-desktop.make run-efi-amd64-ahci \ No newline at end of file diff --git a/debug_ata_x64.sh b/debug_ata_x64.sh index 6f40887b..b021c3ed 100755 --- a/debug_ata_x64.sh +++ b/debug_ata_x64.sh @@ -11,6 +11,6 @@ cd ../boot make -f amd64-desktop.make all make -f amd64-desktop.make disk cd ../../ -./tooling/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root +./tools/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root cd dev/boot make -f amd64-desktop.make run-efi-amd64-ata-pio diff --git a/dev/libMsg/MsgKit/Server.h b/dev/libMsg/MsgKit/Server.h index aee0dbdd..4fa73ccc 100644 --- a/dev/libMsg/MsgKit/Server.h +++ b/dev/libMsg/MsgKit/Server.h @@ -12,6 +12,9 @@ #include #endif +/// @author Amlal El Mahrouss +/// @brief libMsg LISP system. + struct LIBMSG_EXPR; /// @brief an expression chain of LibMSG. @@ -34,5 +37,4 @@ typedef Void (*libmsg_func_t)(LIBMSG_EXPR* self, VoidPtr arg, SizeT arg_size); IMPORT_C Void libmsg_init_library(libmsg_func_t* funcs, SizeT cnt); IMPORT_C UInt32 libmsg_close_library(Void); - IMPORT_C UInt32 libmsg_eval_expr(struct LIBMSG_EXPR* head); diff --git a/dev/misc/BenchKit/Chrono.h b/dev/misc/BenchKit/Chrono.h index 394f16fd..c6801de5 100644 --- a/dev/misc/BenchKit/Chrono.h +++ b/dev/misc/BenchKit/Chrono.h @@ -10,6 +10,11 @@ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. #include #include +/// @author Amlal El Mahrouss +/// @brief BenchKit Chrono contract. + +#define BENCHKIT_INTERFACE : public ::Kernel::ChronoInterface + namespace Kernel { class ChronoInterface; diff --git a/dev/misc/BenchKit/X64Chrono.h b/dev/misc/BenchKit/X64Chrono.h index 706ce883..358c74d4 100644 --- a/dev/misc/BenchKit/X64Chrono.h +++ b/dev/misc/BenchKit/X64Chrono.h @@ -14,11 +14,13 @@ namespace Kernel { class X64Chrono; struct X64ChronoTraits; +/// @brief BenchKit chrono logic for x64. struct X64ChronoTraits { private: STATIC UInt64 TickImpl_(void) { UInt64 a = 0, d = 0; - __asm__ volatile("rdtsc" : "=a"(a), "=d"(d)); + + asm volatile("rdtsc" : "=a"(a), "=d"(d)); return (d << 32) | a; } @@ -26,7 +28,7 @@ struct X64ChronoTraits { }; /// @brief X86_64 hardware chrono implementation using the `rdtsc` instruction. -class X64Chrono : public ChronoInterface { +class X64Chrono BENCHKIT_INTERFACE { public: X64Chrono() = default; ~X64Chrono() override = default; @@ -34,11 +36,11 @@ class X64Chrono : public ChronoInterface { NE_COPY_DEFAULT(X64Chrono); public: - void Start() override { fStart = X64ChronoTraits::TickImpl_(); } + Void Start() override { fStart = X64ChronoTraits::TickImpl_(); } - void Stop() override { fStop = X64ChronoTraits::TickImpl_(); } + Void Stop() override { fStop = X64ChronoTraits::TickImpl_(); } - void Reset() override { + Void Reset() override { fStart = 0; fStop = 0; } @@ -46,8 +48,8 @@ class X64Chrono : public ChronoInterface { UInt64 GetElapsedTime() const override { return fStop - fStart; } private: - UInt64 fStart = 0; - UInt64 fStop = 0; + UInt64 fStart{}; + UInt64 fStop{}; }; } // namespace Kernel diff --git a/release_ahci_x64.sh b/release_ahci_x64.sh index d585e74e..f081c774 100755 --- a/release_ahci_x64.sh +++ b/release_ahci_x64.sh @@ -8,6 +8,6 @@ cd ../boot make -f amd64-desktop.make all make -f amd64-desktop.make disk cd ../../ -./tooling/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root +./tools/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root cd dev/boot make -f amd64-desktop.make run-efi-amd64-ahci \ No newline at end of file diff --git a/release_ata_x64.sh b/release_ata_x64.sh index c0a0e01e..d69e3d3f 100755 --- a/release_ata_x64.sh +++ b/release_ata_x64.sh @@ -8,6 +8,6 @@ cd ../boot make -f amd64-desktop.make all make -f amd64-desktop.make disk cd ../../ -./tooling/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root +./tools/mk_img.py ./dev/boot/src/nekernel-esp.img ./dev/boot/src/root cd dev/boot make -f amd64-desktop.make run-efi-amd64-ata-pio \ No newline at end of file diff --git a/tooling/dist/.keep b/tooling/dist/.keep deleted file mode 100644 index e69de29b..00000000 diff --git a/tooling/fsck.hefs.cc b/tooling/fsck.hefs.cc deleted file mode 100644 index 9d0b3e03..00000000 --- a/tooling/fsck.hefs.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include -#include -#include - -static uint16_t kNumericalBase = 10; - -int main(int argc, char** argv) { - if (argc < 2) { - mkfs::console_out() << "fsck: hefs: usage: fsck.hefs -i=" - << "\n"; - return EXIT_FAILURE; - } - - auto args = mkfs::detail::build_args(argc, argv); - - auto opt_disk = mkfs::get_option(args, "-i"); - - auto origin = mkfs::get_option(args, "-o"); - - if (opt_disk.empty()) { - mkfs::console_out() << "fsck: hefs: error: HeFS is empty! Exiting..." - << "\n"; - return EXIT_FAILURE; - } - - auto out_origin = 0L; - - if (!mkfs::detail::parse_signed(origin, out_origin, kNumericalBase)) { - mkfs::console_out() << "hefs: error: Invalid -o argument.\n"; - return EXIT_FAILURE; - } - - std::ifstream output_device(opt_disk, std::ios::binary); - - if (!output_device.good()) { - mkfs::console_out() << "hefs: error: Unable to open output device: " << opt_disk << "\n"; - return EXIT_FAILURE; - } - - output_device.seekg(out_origin); - - if (!output_device.good()) { - mkfs::console_out() << "hefs: error: Failed seek to origin.\n"; - return EXIT_FAILURE; - } - - mkfs::hefs::BootNode boot_node; - - std::memset(&boot_node, 0, sizeof(boot_node)); - - output_device.read(reinterpret_cast(&boot_node), sizeof(boot_node)); - - 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; - } - - 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...\n"; - - output_device.close(); - - return EXIT_SUCCESS; -} \ No newline at end of file diff --git a/tooling/fsck.hefs.json b/tooling/fsck.hefs.json deleted file mode 100644 index d6ff4b0f..00000000 --- a/tooling/fsck.hefs.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compiler_path": "g++", - "compiler_std": "c++20", - "headers_path": [ - "../" - ], - "sources_path": [ - "fsck.hefs.cc" - ], - "output_name": "./dist/fsck.hefs", - "cpp_macros": [ - "kFSCKHEFSVersion=0x0100", - "kFSCKHEFSVersionHighest=0x0100", - "kFSCKHEFSVersionLowest=0x0100" - ] -} \ No newline at end of file diff --git a/tooling/libmkfs/hefs.h b/tooling/libmkfs/hefs.h deleted file mode 100644 index 52bb3086..00000000 --- a/tooling/libmkfs/hefs.h +++ /dev/null @@ -1,116 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include - -#define kHeFSVersion (0x0101) -#define kHeFSMagic " HeFS" -#define kHeFSMagicLen (8) - -#define kHeFSFileNameLen (256U) -#define kHeFSPartNameLen (128U) - -#define kHeFSDefaultVolumeName u8"HeFS Volume" - -namespace mkfs::hefs { - -// Drive kinds -enum { - kHeFSHardDrive = 0xC0, // Hard Drive - kHeFSSolidStateDrive = 0xC1, // Solid State Drive - kHeFSOpticalDrive = 0x0C, // Blu-Ray/DVD - kHeFSMassStorageDevice = 0xCC, // USB - kHeFSScsiDrive = 0xC4, // SCSI Hard Drive - kHeFSFlashDrive = 0xC6, - kHeFSUnknown = 0xFF, // Unknown device. - kHeFSDriveCount = 8, -}; - -// Disk status -enum { - kHeFSStatusUnlocked = 0x18, - kHeFSStatusLocked, - kHeFSStatusError, - kHeFSStatusInvalid, - kHeFSStatusCount, -}; - -// Encodings -enum { - kHeFSEncodingFlagsUTF8 = 0x50, - kHeFSEncodingFlagsUTF16, - kHeFSEncodingFlagsUTF32, - kHeFSEncodingFlagsUTF16BE, - kHeFSEncodingFlagsUTF16LE, - kHeFSEncodingFlagsUTF32BE, - kHeFSEncodingFlagsUTF32LE, - kHeFSEncodingFlagsUTF8BE, - kHeFSEncodingFlagsUTF8LE, - kHeFSEncodingFlagsBinary, - kHeFSEncodingFlagsCount = 11, - kHeFSFlagsNone = 0, - kHeFSFlagsReadOnly = 0x100, - kHeFSFlagsHidden, - kHeFSFlagsSystem, - kHeFSFlagsArchive, - kHeFSFlagsDevice, - kHeFSFlagsCount = 7 -}; - -// Time type -using ATime = std::uint64_t; - -// File kinds -inline constexpr uint16_t kHeFSFileKindRegular = 0x00; -inline constexpr uint16_t kHeFSFileKindDirectory = 0x01; -inline constexpr uint16_t kHeFSFileKindBlock = 0x02; -inline constexpr uint16_t kHeFSFileKindCharacter = 0x03; -inline constexpr uint16_t kHeFSFileKindFIFO = 0x04; -inline constexpr uint16_t kHeFSFileKindSocket = 0x05; -inline constexpr uint16_t kHeFSFileKindSymbolicLink = 0x06; -inline constexpr uint16_t kHeFSFileKindUnknown = 0x07; -inline constexpr uint16_t kHeFSFileKindCount = 0x08; - -// Red-black tree colors -enum { - kHeFSInvalidColor = 0, - kHeFSRed = 100, - kHeFSBlack, - kHeFSColorCount, -}; - -// Time constants -inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000; -inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF - 1; - -// Boot Node -struct __attribute__((packed)) BootNode { - char magic[kHeFSMagicLen]{}; - char8_t volumeName[kHeFSPartNameLen]{}; - std::uint32_t version{}; - std::uint64_t badSectors{}; - std::uint64_t sectorCount{}; - std::uint64_t sectorSize{}; - std::uint32_t checksum{}; - std::uint8_t diskKind{}; - std::uint8_t encoding{}; - std::uint64_t startIND{}; - std::uint64_t endIND{}; - std::uint64_t indCount{}; - std::uint64_t diskSize{}; - std::uint16_t diskStatus{}; - std::uint16_t diskFlags{}; - std::uint16_t vid{}; - std::uint64_t startIN{}; - std::uint64_t endIN{}; - std::uint64_t startBlock{}; - std::uint64_t endBlock{}; - char pad[272]{}; -}; -} // namespace mkfs::hefs diff --git a/tooling/libmkfs/mkfs.h b/tooling/libmkfs/mkfs.h deleted file mode 100644 index 31f7a26a..00000000 --- a/tooling/libmkfs/mkfs.h +++ /dev/null @@ -1,83 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include -#include - -#define kMkFsSectorSz (512U) -#define kMkFsMaxBadSectors (128U) - -/// @internal -namespace mkfs { - -namespace detail { - /// @internal - /// @brief GB‐to‐byte conversion (use multiplication, not XOR). - inline constexpr size_t gib_cast(uint32_t gb) { - return static_cast(gb) * 1024ULL * 1024ULL * 1024ULL; - } - - inline bool parse_decimal(const std::string& opt, unsigned long long& out) { - if (opt.empty()) return false; - char* endptr = nullptr; - unsigned long long val = std::strtoull(opt.c_str(), &endptr, 10); - if (endptr == opt.c_str() || *endptr != '\0') return false; - out = val; - return true; - } - - inline bool parse_signed(const std::string& opt, long& out, int base = 10) { - out = 0L; - - if (opt.empty()) return true; - - char* endptr = nullptr; - long val = std::strtol(opt.c_str(), &endptr, base); - auto err = errno; - - if (err == ERANGE || err == EINVAL) return false; - if (endptr == opt.c_str() || *endptr != '\0') return false; - - out = val; - return true; - } - - inline std::string build_args(int argc, char** argv) { - std::string combined; - for (int i = 1; i < argc; ++i) { - combined += argv[i]; - combined += ' '; - } - return combined; - } -} // namespace detail - -/// @brief Helper function to get the option value from command line arguments. -template -inline std::basic_string get_option(const std::basic_string& args, - const std::basic_string& option) { - size_t pos = args.find(option + CharType('=')); - - if (pos != std::string::npos) { - size_t start = pos + option.length() + 1; - size_t end = args.find(' ', start); - return args.substr(start, end - start); - } - - return std::basic_string{}; -} - -inline auto console_out() -> std::ostream& { - std::ostream& conout = std::cout; - conout << rang::fg::red << "mkfs: " << rang::style::reset; - - return conout; -} -} // namespace mkfs \ No newline at end of file diff --git a/tooling/mk_app.py b/tooling/mk_app.py deleted file mode 100755 index 7f7cef17..00000000 --- a/tooling/mk_app.py +++ /dev/null @@ -1,80 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import json -import sys - -def create_directory_structure(base_path, project_name): - # Define the directory structure - structure = { - project_name: { - "dist": { - ".keep": None - }, - "src": { - ".keep": None, - "CommandLine.cc": None, - }, - "vendor": { - ".keep": None - }, - ".keep": None, - f"{project_name}.json": {} - } - } - - def create_structure(path, structure): - for name, content in structure.items(): - current_path = os.path.join(path, name) - # Create directories or files based on the content type - if isinstance(content, dict) and current_path.endswith(".json") == False: - os.makedirs(current_path, exist_ok=True) - create_structure(current_path, content) - elif content is None: - # Create an empty file - with open(current_path, 'w') as f: - pass - - # Create the base directory - os.makedirs(base_path, exist_ok=True) - create_structure(base_path, structure) - - # Create the JSON file - proj_json_path = os.path.join(base_path, project_name, f"{project_name}.json") - - manifest = { - "compiler_path": "clang++", - "compiler_std": "c++20", - "headers_path": ["./", "../../../dev/kernel", "../../../public/frameworks/", "../../../dev/", "./"], - "sources_path": [ - - ], - "output_name": f"./dist/{project_name}", - "cpp_macros": [ - "kSampleFWVersion=0x0100", - "kSampleFWVersionHighest=0x0100", - "kSampleFWVersionLowest=0x0100", - "__NE_SDK__" - ] - } - - with open(proj_json_path, 'w') as json_file: - json.dump(manifest, json_file, indent=4) - - proj_cpp_path = os.path.join(base_path, project_name, f"src/CommandLine.cc") - - cpp_file = "#include \n\nSInt32 _NeMain(SInt32 argc, Char* argv[]) {\n\treturn EXIT_FAILURE;\n}" - - with open(proj_cpp_path, 'w') as cpp_file_io: - cpp_file_io.write(cpp_file) - -if __name__ == "__main__": - if len(sys.argv) != 2: - print("HELP: mk_app.py ") - sys.exit(os.EX_CONFIG) - - base_path = os.getcwd() # Use the current working directory as the base path - create_directory_structure(base_path, sys.argv[1]) - - print("INFO: Application created successfully.") diff --git a/tooling/mk_fwrk.py b/tooling/mk_fwrk.py deleted file mode 100755 index b2ef99ff..00000000 --- a/tooling/mk_fwrk.py +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import json -import sys - -""" - Create directory structure for the framework. -""" -def create_directory_structure(base_path_fwrk, project_file_name, project_name): - # Define the directory structure - structure = { - project_name: { - "headers": { - ".keep": None - }, - "dist": { - ".keep": None - }, - "src": { - ".keep": None, - "DylibMain.cc": None, - }, - "xml": { - ".keep": None - }, - ".keep": None, - f"{project_file_name}.json": {} - } - } - - def create_structure(path, structure_in): - for name, content in structure_in.items(): - current_path = os.path.join(path, name) - # Create directories or files based on the content type - if isinstance(content, dict) and current_path.endswith(".json") == False: - os.makedirs(current_path, exist_ok=True) - create_structure(current_path, content) - elif content is None: - # Create an empty file - with open(current_path, 'w') as f: - pass - - # Create the base directory - os.makedirs(base_path_fwrk, exist_ok=True) - create_structure(base_path_fwrk, structure) - - # Create the JSON file - proj_json_path = os.path.join(base_path_fwrk, project_name, f"{project_file_name}.json") - - manifest = { - "compiler_path": "clang++", - "compiler_std": "c++20", - "headers_path": ["./", "../../../dev/kernel", "../../../public/frameworks/", "../../../dev/", "./"], - "sources_path": [ - - ], - "output_name": f"./dist/lib{project_name}.dylib", - "cpp_macros": [ - "kSampleFWVersion=0x0100", - "kSampleFWVersionHighest=0x0100", - "kSampleFWVersionLowest=0x0100", - "__NE_SDK__" - ] - } - - with open(proj_json_path, 'w') as json_file: - json.dump(manifest, json_file, indent=4) - - proj_cpp_path = os.path.join(base_path_fwrk, project_name, f"src/DylibMain.cc") - - cpp_file = "#include \n\nSInt32 _DylibAttach(SInt32 argc, Char* argv[]) {\n\treturn EXIT_FAILURE;\n}" - - with open(proj_cpp_path, 'w') as cpp_file_io: - cpp_file_io.write(cpp_file) - - xml_blob = f"\n" - proj_xml_path = os.path.join(base_path_fwrk, project_name, f"xml/app.xml") - - with open(proj_xml_path, 'w') as cpp_file_io: - cpp_file_io.write(xml_blob) - -if __name__ == "__main__": - if len(sys.argv) != 2: - print("HELP: mk_fwrk.py ") - sys.exit(os.EX_CONFIG) - - base_path = os.getcwd() # Use the current working directory as the base path - create_directory_structure(base_path, sys.argv[1], sys.argv[1] + '.fwrk') - - print("INFO: Framework created successfully.") diff --git a/tooling/mk_htman.py b/tooling/mk_htman.py deleted file mode 100755 index e865f7c5..00000000 --- a/tooling/mk_htman.py +++ /dev/null @@ -1,41 +0,0 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- - -import sys, os - -if __name__ == "__main__": - if len(sys.argv) != 2: - print("INFO: mk_htman.py ") - sys.exit(os.EX_CONFIG) - - manual_path = sys.argv[1] - if not os.path.exists(manual_path): - print(f"ERROR: Manual path '{manual_path}' does not exist.") - sys.exit(os.EX_NOINPUT) - - if os.path.isdir(manual_path): - print(f"ERROR: Manual path '{manual_path}' is a directory.") - sys.exit(os.EX_NOTDIR) - - if not manual_path.endswith('.man'): - print(f"ERROR: Manual path '{manual_path}' must end with '.man'") - sys.exit(os.EX_DATAERR) - - try: - with open(manual_path, 'r') as file: - content = file.read() - if not content.strip(): - print(f"ERROR: Manual file '{manual_path}' is empty.") - sys.exit(os.EX_DATAERR) - html_content = f"NeKernel Manual: {manual_path}
{content}
" - - html_path = manual_path.replace('.man', '.html') - - with open(html_path, 'w') as html_file: - html_file.write(html_content) - except IOError as e: - print(f"ERROR: Could not read manual file '{manual_path}': {e}") - sys.exit(os.EX_IOERR) - - print(f"INFO: Wrote manual '{manual_path}' to HTML.") - sys.exit(os.EX_OK) diff --git a/tooling/mk_img.py b/tooling/mk_img.py deleted file mode 100755 index f0fa0609..00000000 --- a/tooling/mk_img.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import sys -import subprocess -import glob as file_glob - -def copy_to_fat(image_path, source_dir): - if not os.path.isfile(image_path): - print(f"Error: FAT32 image {image_path} does not exist.") - sys.exit(1) - - if not os.path.isdir(source_dir): - print(f"Error: {source_dir} is not a valid directory.") - sys.exit(1) - - try: - files_to_copy = file_glob.glob(os.path.join(source_dir, "*")) - - if not files_to_copy: - print(f"Warning: No files found in {source_dir}, nothing to copy.") - sys.exit(1) - - command = ["mcopy", "-spm", "-i", image_path] + files_to_copy + ["::"] - subprocess.run(command, check=True) - except Exception as e: - print(f"Error: failed: {e}") - sys.exit(1) - -if __name__ == "__main__": - if len(sys.argv) != 3: - print("HELP: mk_img.py ") - sys.exit(1) - - image_path = sys.argv[1] - source_dir = sys.argv[2] - - copy_to_fat(image_path, source_dir) - - print("INFO: Image created successfully.") diff --git a/tooling/mkfs.hefs.cc b/tooling/mkfs.hefs.cc deleted file mode 100644 index b90b0fc5..00000000 --- a/tooling/mkfs.hefs.cc +++ /dev/null @@ -1,197 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include -#include -#include -#include -#include -#include - -static size_t kDiskSize = mkfs::detail::gib_cast(4UL); -static uint16_t kVersion = kHeFSVersion; -static std::u8string kLabel; -static size_t kSectorSize = 512; -static uint16_t kNumericalBase = 10; - -int main(int argc, char** argv) { - if (argc < 2) { - mkfs::console_out() - << "hefs: usage: mkfs.hefs -L=