From f8aaa274535b6541f376090958eedbbba3ba00ba Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Wed, 14 May 2025 18:35:05 +0200 Subject: feat(kernel): Filesystem fixes, and others. what? - Add simple generic RTL8139 NIC driver, to be used within a NK device. - Update IVT accordingly. - Comment ARM's AP GIC init function, to tell what it's actually doing. - Cleanup Kernel Main, removed the useless pre_init_scheduler function. - Prepare new FileMgr with HeFileSystemMgr. - Fallback to NeFS when trying to format a fileysstem. Signed-off-by: Amlal El Mahrouss --- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 0b818bbb..49673b59 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -444,6 +444,8 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I NEFS_ROOT_PARTITION_BLOCK* part_block = (NEFS_ROOT_PARTITION_BLOCK*) fs_buf; + 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); @@ -463,6 +465,7 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I part_block->FreeSectors = sectorCount / sizeof(NEFS_CATALOG_STRUCT) - 1; part_block->SectorCount = sectorCount; part_block->DiskSize = diskSize; + part_block->SectorSize = drive->fSectorSz; part_block->FreeCatalog = sectorCount / sizeof(NEFS_CATALOG_STRUCT) - 1; drive->fPacket.fPacketContent = fs_buf; @@ -479,26 +482,6 @@ bool NeFileSystemParser::Format(_Input _Output DriveTrait* drive, _Input const I (Void)(kout << "Free sectors: " << hex_number(part_block->FreeSectors) << kendl); (Void)(kout << "Sector size: " << hex_number(part_block->SectorSize) << kendl); - NEFS_CATALOG_STRUCT root{}; - - rt_set_memory(&root, 0, sizeof(NEFS_CATALOG_STRUCT)); - - root.PrevSibling = part_block->StartCatalog; - root.NextSibling = 0UL; - - root.Kind = kNeFSCatalogKindDir; - root.Flags |= kNeFSFlagCreated; - root.CatalogFlags |= kNeFSStatusUnlocked; - - root.Name[0] = '/'; - root.Name[1] = 0; - - drive->fPacket.fPacketLba = part_block->StartCatalog; - drive->fPacket.fPacketSize = sizeof(NEFS_CATALOG_STRUCT); - drive->fPacket.fPacketContent = &root; - - drive->fOutput(drive->fPacket); - return true; } -- cgit v1.2.3 From 6a30f42d5dcd0f944262147b2806db6c14fe7ffc Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 15 May 2025 13:56:17 +0200 Subject: feat(kernel): Finalizing the first version of the user scheduler. other: - Removed DmaPool into its own Kit. - ApplicationProcessor unit has been cleaned up. - Rename functions of MemoryMgr. - Use KIB instead of MIBs of stack. - Cleanup parts of the scheduler, and hw scheduler. - Use UD handler for INT 6. Signed-off-by: Amlal El Mahrouss --- dev/boot/amd64-desktop.make | 4 +- dev/boot/modules/SysChk/amd64-ahci-epm.json | 1 + dev/boot/src/HEL/AMD64/BootAPI.S | 10 ++ dev/ddk/src/ddk_alloc.c | 4 +- dev/kernel/DmaKit/DmaPool.h | 91 ++++++++++ dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 39 ++-- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 37 +--- dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc | 53 ------ dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 18 +- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 23 ++- .../HALKit/AMD64/Network/Generic+Basic+RTL8139.cc | 4 +- dev/kernel/HALKit/AMD64/Paging.h | 23 ++- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 2 +- dev/kernel/KernelKit/CodeMgr.h | 2 +- dev/kernel/KernelKit/CoreProcessScheduler.h | 2 +- dev/kernel/KernelKit/FileMgr.h | 4 +- dev/kernel/KernelKit/HardwareThreadScheduler.h | 10 +- dev/kernel/KernelKit/MemoryMgr.h | 14 +- dev/kernel/KernelKit/UserProcessScheduler.h | 7 +- dev/kernel/KernelKit/UserProcessScheduler.inl | 4 +- dev/kernel/NewKit/Array.h | 5 +- dev/kernel/NewKit/Ref.h | 2 +- dev/kernel/StorageKit/DmaPool.h | 92 ---------- dev/kernel/src/BitMapMgr.cc | 2 +- dev/kernel/src/CxxAbi-AMD64.cc | 6 +- dev/kernel/src/DriveMgr.cc | 10 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 42 ++--- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 4 +- dev/kernel/src/HardwareThreadScheduler.cc | 12 +- dev/kernel/src/KPC.cc | 2 +- dev/kernel/src/MemoryMgr.cc | 59 +++--- dev/kernel/src/New+Delete.cc | 12 +- dev/kernel/src/PEFCodeMgr.cc | 16 +- dev/kernel/src/UserProcessScheduler.cc | 198 ++++++++------------- 34 files changed, 359 insertions(+), 455 deletions(-) create mode 100644 dev/kernel/DmaKit/DmaPool.h delete mode 100644 dev/kernel/StorageKit/DmaPool.h (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index b5e49cb0..7687e3c6 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -49,7 +49,7 @@ DEBUG_MACRO = -D__DEBUG__ endif ifeq ($(shell uname), Darwin) -EMU_FLAGS=-M q35 -smp 4 -m 8G \ +EMU_FLAGS=-M q35 -smp 4 -m 8G \ -bios $(BIOS) -cdrom $(BOOT) -boot d endif @@ -117,7 +117,7 @@ compile-amd64: .PHONY: run-efi-amd64-ahci run-efi-amd64-ahci: - $(EMU) $(EMU_FLAGS) -d int -hda $(IMG) -s -S -trace ahci_* -boot menu=on + $(EMU) $(EMU_FLAGS) -serial stdio -hda $(IMG) -s -S -boot menu=on .PHONY: run-efi-amd64-ata-pio run-efi-amd64-ata-pio: diff --git a/dev/boot/modules/SysChk/amd64-ahci-epm.json b/dev/boot/modules/SysChk/amd64-ahci-epm.json index 91c95941..8ce9bfd8 100644 --- a/dev/boot/modules/SysChk/amd64-ahci-epm.json +++ b/dev/boot/modules/SysChk/amd64-ahci-epm.json @@ -14,6 +14,7 @@ "../../../kernel/HALKit/AMD64/PCI/*.cc", "../../../kernel/HALKit/AMD64/Storage/*.cc", "../../../kernel/src/Storage/*.cc", + "../../../kernel/src/Network/*.cc", "../../../kernel/HALKit/AMD64/*.cc", "../../../kernel/HALKit/AMD64/*.s", "../../../kernel/src/*.cc" diff --git a/dev/boot/src/HEL/AMD64/BootAPI.S b/dev/boot/src/HEL/AMD64/BootAPI.S index 43775fc2..2c0005ac 100644 --- a/dev/boot/src/HEL/AMD64/BootAPI.S +++ b/dev/boot/src/HEL/AMD64/BootAPI.S @@ -5,6 +5,16 @@ .intel_syntax noprefix +.global hal_load_idt + +hal_load_idt: + ret + +.global sched_jump_to_task + +sched_jump_to_task: + ret + /** @brief this function setups a stack and then jumps to a function */ diff --git a/dev/ddk/src/ddk_alloc.c b/dev/ddk/src/ddk_alloc.c index 6daafb7e..1354bce4 100644 --- a/dev/ddk/src/ddk_alloc.c +++ b/dev/ddk/src/ddk_alloc.c @@ -16,7 +16,7 @@ DDK_EXTERN void* kalloc(size_t sz) { if (!sz) ++sz; - void* ptr = ke_call("mm_new_heap", 1, &sz, sizeof(size_t)); + void* ptr = ke_call("mm_new_ptr", 1, &sz, sizeof(size_t)); return ptr; } @@ -28,5 +28,5 @@ DDK_EXTERN void* kalloc(size_t sz) { DDK_EXTERN void kfree(void* ptr) { if (!ptr) return; - ke_call("mm_delete_heap", 1, ptr, 0); + ke_call("mm_delete_ptr", 1, ptr, 0); } diff --git a/dev/kernel/DmaKit/DmaPool.h b/dev/kernel/DmaKit/DmaPool.h new file mode 100644 index 00000000..5acff623 --- /dev/null +++ b/dev/kernel/DmaKit/DmaPool.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2025 Amlal El Mahrouss. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#pragma once + +#include +#include + +#ifdef __NE_AMD64__ +#define kNeDMAPoolStart (0x1000000) +#define kNeDMAPoolSize (0x1000000) + +namespace Kernel { +/// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it. +inline UInt8* kDmaPoolPtr = (UInt8*) kNeDMAPoolStart; +inline const UInt8* kDmaPoolEnd = (UInt8*) (kNeDMAPoolStart + kNeDMAPoolSize); + +/***********************************************************************************/ +/// @brief allocate from the rtl_dma_alloc system. +/// @param size the size of the chunk to allocate. +/// @param align alignement of pointer. +/***********************************************************************************/ +inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { + if (!size) { + return nullptr; + } + + UIntPtr addr = (UIntPtr) kDmaPoolPtr; + + /// here we just align the address according to a `align` variable, i'd rather be a power of two + /// really. + addr = (addr + (align - 1)) & ~(align - 1); + + if ((addr + size) >= reinterpret_cast(kDmaPoolEnd)) { + kout << "DMA Pool is exhausted!\r"; + + err_global_get() = kErrorDmaExhausted; + + return nullptr; + } + + kDmaPoolPtr = (UInt8*) (addr + size); + return (VoidPtr) addr; +} + +/***********************************************************************************/ +/// @brief Free DMA pointer. +/***********************************************************************************/ +inline Void rtl_dma_free(SizeT size) { + if (!size) return; + + kDmaPoolPtr = (UInt8*) (kDmaPoolPtr - size); +} + +/***********************************************************************************/ +/// @brief Flush DMA pointer. +/***********************************************************************************/ +inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) { + if (ptr > kDmaPoolEnd) { + return; + } + + if (!ptr || ptr < (UInt8*) kNeDMAPoolStart) { + return; + } + + for (SizeT buf_idx = 0UL; buf_idx < size_buffer; ++buf_idx) { + HAL::mm_memory_fence((VoidPtr) ((UInt8*) ptr + buf_idx)); + } +} +} // namespace Kernel +#endif \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index dd9a36ed..84c52768 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -152,10 +152,13 @@ EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID pid) kHWThread[process_index].mCoreID = kAPICLocales[0]; - hal_send_sipi(kApicBaseAddress, kHWThread[process_index].mCoreID, - (UInt8) (((UIntPtr) stack_frame->BP) >> 12)); + if (mp_is_smp()) { + /// TODO: - return YES; + return YES; + } + + return NO; } /***********************************************************************************/ @@ -195,44 +198,36 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kSMPAware = NO; if (kMADTBlock) { - SizeT index = 1; + SizeT index = 0; kSMPInterrupt = 0; kSMPCount = 0; - kout << "SMP: Starting APs...\r"; - kApicBaseAddress = kMADTBlock->Address; + constexpr const auto kSMPCountMax = kMaxAPInsideSched; + while (Yes) { /// @note Anything bigger than x2APIC type doesn't exist. - if (kMADTBlock->List[index].Type > 9 || kSMPCount > kSchedProcessLimitPerTeam) break; + if (kSMPCount > kSMPCountMax) break; - switch (kMADTBlock->List[index].Type) { - case 0x00: { - if (kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID < 1) break; + if (kMADTBlock->List[index].Type > 9) { + ++index; + continue; + } - kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID; - (Void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl); + kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID; + (Void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl); - ++kSMPCount; - break; - } - default: - break; - } + ++kSMPCount; ++index; } - (Void)(kout << "SMP: Number of APs: " << number(kSMPCount) << kendl); - // Kernel is now SMP aware. // That means that the scheduler is now available (on MP Kernels) kSMPAware = true; - - /// TODO: Notify Boot AP that it must start. } } } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 3a380a42..1e513e3f 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -16,10 +16,6 @@ STATIC BOOL kIsScheduling = NO; EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) { - MUST_PASS(NO); - } - kIsScheduling = NO; Kernel::kout << "Kernel: General Protection Fault.\r"; @@ -40,10 +36,6 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) { - MUST_PASS(NO); - } - kIsScheduling = NO; Kernel::kout << "Kernel: Page Fault.\r"; @@ -58,27 +50,14 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { process.Leak().Crash(); } -namespace Kernel::Detail { -constexpr static Int32 kTimeoutCount = 100000UL; -} - /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { NE_UNUSED(rsp); - static Kernel::Int64 try_count_before_brute = Kernel::Detail::kTimeoutCount; - - while (kIsScheduling) { - --try_count_before_brute; - - if (try_count_before_brute < 1) break; - } - - try_count_before_brute = Kernel::Detail::kTimeoutCount; - kIsScheduling = YES; + Kernel::kout << "Kernel: Scheduler interrupt.\r"; + kIsScheduling = YES; Kernel::UserProcessHelper::StartScheduling(); - kIsScheduling = NO; } @@ -87,10 +66,6 @@ EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) { - MUST_PASS(NO); - } - kIsScheduling = NO; Kernel::kout << "Kernel: Math error (division by zero?).\r"; @@ -111,10 +86,6 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) { - MUST_PASS(NO); - } - kIsScheduling = NO; Kernel::kout << "Kernel: Generic Process Fault.\r"; @@ -163,10 +134,6 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { auto process = Kernel::UserProcessScheduler::The().CurrentProcess(); - if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning) { - MUST_PASS(NO); - } - kIsScheduling = NO; Kernel::kout << "Kernel: Undefined Opcode.\r"; diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index 2fb6ad4c..b8eb8fe9 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -8,56 +8,10 @@ #include #include -#define kPITDefaultTicks (1000U) - namespace Kernel::HAL { namespace Detail { STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64 kInterruptVectorTable[kKernelIdtSize] = {}; - - STATIC ATTRIBUTE(unused) void hal_set_irq_mask(UInt8 irql) [[maybe_unused]] { - UInt16 port; - UInt8 value; - - if (irql < 8) { - port = kPICData; - } else { - port = kPIC2Data; - irql -= 8; - } - - value = rt_in8(port) | (1 << irql); - rt_out8(port, value); - } - - STATIC void hal_clear_irq_mask(UInt8 irql) [[maybe_unused]] { - UInt16 port; - UInt8 value; - - if (irql < 8) { - port = kPICData; - } else { - port = kPIC2Data; - irql -= 8; - } - - value = rt_in8(port) & ~(1 << irql); - rt_out8(port, value); - } - - STATIC Void hal_enable_pit(UInt16 ticks) noexcept { - if (ticks == 0) ticks = kPITDefaultTicks; - - // Configure PIT to receieve scheduler interrupts. - - UInt16 kPITCommDivisor = kPITFrequency / ticks; // 100 Hz. - - HAL::rt_out8(kPITControlPort, 0x36); // Command to PIT - HAL::rt_out8(kPITChannel0Port, kPITCommDivisor & 0xFF); // Send low byte - HAL::rt_out8(kPITChannel0Port, (kPITCommDivisor >> 8) & 0xFF); // Send high byte - - hal_clear_irq_mask(32); - } } // namespace Detail /// @brief Loads the provided Global Descriptor Table. @@ -72,8 +26,6 @@ Void GDTLoader::Load(Register64& gdt) { Void IDTLoader::Load(Register64& idt) { rt_cli(); - const Int16 kPITTickForScheduler = kPITDefaultTicks; - volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**) idt.Base; for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { @@ -92,12 +44,7 @@ Void IDTLoader::Load(Register64& idt) { idt.Base = (UIntPtr) &Detail::kInterruptVectorTable[0]; idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * (kKernelIdtSize); - Detail::hal_enable_pit(kPITTickForScheduler); - -#ifndef __NE_MODULAR_KERNEL_COMPONENTS__ hal_load_idt(idt); -#endif // __NE_MODULAR_KERNEL_COMPONENTS__ - rt_sti(); } diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index a6c6bbb5..0634b0ea 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -138,7 +138,7 @@ __NE_INT_6: out 0x20, al push rcx - call idt_handle_generic + call idt_handle_ud pop rcx std @@ -235,17 +235,14 @@ IntNormal 31 __NE_INT_32: cld - - mov al, 0x20 - out 0xA0, al - out 0x20, al push rax mov rcx, rsp call idt_handle_scheduler pop rax - std + mov al, 0x20 + out 0x20, al o64 iret @@ -416,3 +413,12 @@ kInterruptVectorTable: dq __NE_INT_%+i %assign i i+1 %endrep + +section .text + +global sched_jump_to_task + +;; Jump to the task from its stack frame. +sched_jump_to_task: + mov rsp, rcx + ret \ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 2d213a9b..b0ac076d 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -27,6 +27,8 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { return kEfiFail; } + Kernel::HAL::rt_sti(); + kHandoverHeader = handover_hdr; FB::fb_clear_video(); @@ -54,7 +56,7 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { STATIC CONST auto kGDTEntriesCount = 6; - /* GDT, mostly descriptors for user and kernel segments. */ + /* The GDT, mostly descriptors for user and kernel segments. */ STATIC Kernel::HAL::Detail::NE_GDT_ENTRY ALIGN(0x08) kGDTArray[kGDTEntriesCount] = { {.fLimitLow = 0, .fBaseLow = 0, @@ -101,6 +103,13 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { return kEfiFail; } +EXTERN_C Kernel::Void rtl_ne_task(Kernel::Void) { + kout << "Hello, world!\r"; + dbg_break_point(); +} + +EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp); + EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { #ifdef __FSKIT_INCLUDES_HEFS__ if (!Kernel::HeFS::fs_init_hefs()) { @@ -108,18 +117,24 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { Kernel::NeFS::fs_init_nefs(); } #elif defined(__FSKIT_INCLUDES_NEFS__) - Kernel::NeFS::fs_init_nefs(); + if (!Kernel::NeFS::fs_init_nefs()) { + kout << "NeFS cannot be formated on the disk. Aborting\r"; + dbg_break_point(); + } #endif + Kernel::rtl_create_user_process(rtl_ne_task, "NeTask"); + Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); Kernel::HAL::Register64 idt_reg; - idt_reg.Base = (Kernel::UIntPtr) kInterruptVectorTable; + idt_reg.Base = reinterpret_cast(kInterruptVectorTable); Kernel::HAL::IDTLoader idt_loader; idt_loader.Load(idt_reg); - dbg_break_point(); + while (YES) + ; } #endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__ diff --git a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc index 06c18d8b..57f64712 100644 --- a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc +++ b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc @@ -4,8 +4,8 @@ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. ------------------------------------------- */ +#include #include -#include #include using namespace Kernel; @@ -14,7 +14,7 @@ using namespace Kernel::HAL; STATIC UInt16 kIOBase = 0xFFFF; STATIC UInt32 kRXOffset = 0UL; -STATIC constexpr const UInt32 kRxBufferSize = 8192 + 16 + 1500; +STATIC constexpr CONST UInt32 kRxBufferSize = 8192 + 16 + 1500; STATIC BOOL kTXEnabled = NO; diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index cfba232c..061bae45 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -63,6 +63,25 @@ auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL namespace Kernel { -typedef VoidPtr PTE; -typedef VoidPtr PDE; +struct PTE { + UInt64 Present : 1; + UInt64 Wr : 1; + UInt64 User : 1; + UInt64 Pwt : 1; // Page-level Write-Through + UInt64 Pcd : 1; // Page-level Cache Disable + UInt64 Accessed : 1; + UInt64 Dirty : 1; + UInt64 Pat : 1; // Page Attribute Table (or PS for PDE) + UInt64 Global : 1; + UInt64 Ignored1 : 3; // Available to software + UInt64 PhysicalAddress : 40; // Physical page frame address (bits 12–51) + UInt64 Ignored2 : 7; // More software bits / reserved + UInt64 ProtectionKey : 4; // Optional (if PKU enabled) + UInt64 Reserved : 1; // Usually reserved + UInt64 Nx : 1; // No Execute +}; + +struct PDE { + ATTRIBUTE(aligned(kib_cast(4))) PTE fPTE[512]; +}; } // namespace Kernel diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 21483560..57e77e77 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -15,6 +15,7 @@ * */ +#include #include #include #include @@ -25,7 +26,6 @@ #include #include #include -#include #include #include diff --git a/dev/kernel/KernelKit/CodeMgr.h b/dev/kernel/KernelKit/CodeMgr.h index ff70707b..f4d46b4b 100644 --- a/dev/kernel/KernelKit/CodeMgr.h +++ b/dev/kernel/KernelKit/CodeMgr.h @@ -20,7 +20,7 @@ namespace Kernel { /// @brief Main process entrypoint. -typedef void (*rtl_main_kind)(SizeT argc, Char** argv, Char** envp, SizeT envp_len); +typedef void (*rtl_main_kind)(void); /// @brief C++ Constructor entrypoint. typedef void (*rtl_ctor_kind)(void); diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index 3f55c099..f9d11459 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -15,7 +15,7 @@ #define kSchedTeamCount (256U) #define kSchedMaxMemoryLimit gib_cast(128) /* max physical memory limit */ -#define kSchedMaxStackSz mib_cast(8) /* maximum stack size */ +#define kSchedMaxStackSz (kib_cast(8)) /* maximum stack size */ #define kSchedNameLen (128U) diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 6751b0a8..32c30b70 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -385,13 +385,13 @@ inline FileStream::FileStream(const Encoding* path, const Encod } } - kout << "new file: " << path << ".\r"; + kout << "FileMgr: New file at: " << path << ".\r"; } /// @brief destructor of the file stream. template inline FileStream::~FileStream() { - mm_delete_heap(fFile); + mm_delete_ptr(fFile); } } // namespace Kernel diff --git a/dev/kernel/KernelKit/HardwareThreadScheduler.h b/dev/kernel/KernelKit/HardwareThreadScheduler.h index d47b2994..dd8271eb 100644 --- a/dev/kernel/KernelKit/HardwareThreadScheduler.h +++ b/dev/kernel/KernelKit/HardwareThreadScheduler.h @@ -14,7 +14,7 @@ /// @note Last Rev Sun 28 Jul CET 2024 /// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM -#define kMaxAPInsideSched (8U) +#define kMaxAPInsideSched (4U) namespace Kernel { class HardwareThread; @@ -58,14 +58,14 @@ class HardwareThread final { void Busy(const BOOL busy = false) noexcept; public: - BOOL Switch(VoidPtr image, Ptr8 stack_ptr, HAL::StackFramePtr frame, const ThreadID& pid); + BOOL Switch(HAL::StackFramePtr frame, const ThreadID& pid); BOOL IsWakeup() noexcept; public: HAL::StackFramePtr StackFrame() noexcept; - const ThreadKind& Kind() noexcept; - bool IsBusy() noexcept; - const ThreadID& ID() noexcept; + ThreadKind& Kind() noexcept; + BOOL IsBusy() noexcept; + ThreadID& ID() noexcept; private: HAL::StackFramePtr fStack{nullptr}; diff --git a/dev/kernel/KernelKit/MemoryMgr.h b/dev/kernel/KernelKit/MemoryMgr.h index 2274e24e..d84dc9a4 100644 --- a/dev/kernel/KernelKit/MemoryMgr.h +++ b/dev/kernel/KernelKit/MemoryMgr.h @@ -19,29 +19,29 @@ namespace Kernel { /// @brief Declare pointer as free. /// @param heap_ptr the pointer. /// @return a status code regarding the deallocation. -Int32 mm_delete_heap(VoidPtr heap_ptr); +Int32 mm_delete_ptr(VoidPtr heap_ptr); /// @brief Declare a new size for heap_ptr. /// @param heap_ptr the pointer. /// @return unsupported always returns nullptr. -VoidPtr mm_realloc_heap(VoidPtr heap_ptr, SizeT new_sz); +VoidPtr mm_realloc_ptr(VoidPtr heap_ptr, SizeT new_sz); /// @brief Check if pointer is a valid Kernel pointer. /// @param heap_ptr the pointer /// @return if it exists it returns true. -Boolean mm_is_valid_heap(VoidPtr heap_ptr); +Boolean mm_is_valid_ptr(VoidPtr heap_ptr); /// @brief Allocate chunk of memory. /// @param sz Size of pointer /// @param wr Read Write bit. /// @param user User enable bit. /// @return The newly allocated pointer, or nullptr. -VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0); +VoidPtr mm_new_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0); /// @brief Protect the heap with a CRC value. /// @param heap_ptr pointer. /// @return if it valid: point has crc now., otherwise fail. -Boolean mm_protect_heap(VoidPtr heap_ptr); +Boolean mm_protect_ptr(VoidPtr heap_ptr); /// @brief Makes a Kernel page. /// @param heap_ptr the page pointer. @@ -51,11 +51,11 @@ Int32 mm_make_page(VoidPtr heap_ptr); /// @brief Overwrites and set the flags of a heap header. /// @param heap_ptr the pointer to update. /// @param flags the flags to set. -Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags); +Int32 mm_make_ptr_flags(VoidPtr heap_ptr, UInt64 flags); /// @brief Gets the flags of a heap header. /// @param heap_ptr the pointer to get. -UInt64 mm_get_flags(VoidPtr heap_ptr); +UInt64 mm_get_ptr_flags(VoidPtr heap_ptr); /// @brief Allocate C++ class. /// @param cls The class to allocate. diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index a638f0dc..717788e9 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -47,7 +47,7 @@ class USER_PROCESS final { HAL::StackFramePtr StackFrame{nullptr}; AffinityKind Affinity{AffinityKind::kStandard}; ProcessStatusKind Status{ProcessStatusKind::kKilled}; - UInt8* StackReserve{nullptr}; + UInt8 StackReserve[kSchedMaxStackSz]; PROCESS_IMAGE Image{}; SizeT StackSize{kSchedMaxStackSz}; IDylibObject* DylibDelegate{nullptr}; @@ -92,6 +92,8 @@ class USER_PROCESS final { /***********************************************************************************/ Void Crash(); + Bool SpawnDylib(); + /***********************************************************************************/ ///! @brief Exits the app. /***********************************************************************************/ @@ -219,8 +221,7 @@ class UserProcessScheduler final : public ISchedulable { class UserProcessHelper final { public: - STATIC Bool Switch(VoidPtr image_ptr, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr, - PID new_pid); + STATIC Bool Switch(HAL::StackFramePtr frame_ptr, PID new_pid); STATIC Bool CanBeScheduled(const USER_PROCESS& process); STATIC ErrorOr TheCurrentPID(); STATIC SizeT StartScheduling(); diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl index 7bf98d78..236262e1 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.inl +++ b/dev/kernel/KernelKit/UserProcessScheduler.inl @@ -36,13 +36,13 @@ Boolean USER_PROCESS::Delete(ErrorOr ptr) { hal_write_cr3(this->VMRegister); - auto ret = mm_delete_heap(entry->Entry); + auto ret = mm_delete_ptr(entry->Entry); hal_write_cr3(pd); return ret == kErrorSuccess; #else - Bool ret = mm_delete_heap(ptr.Leak().Leak()); + Bool ret = mm_delete_ptr(ptr.Leak().Leak()); return ret == kErrorSuccess; #endif diff --git a/dev/kernel/NewKit/Array.h b/dev/kernel/NewKit/Array.h index af73d002..767d8678 100644 --- a/dev/kernel/NewKit/Array.h +++ b/dev/kernel/NewKit/Array.h @@ -20,10 +20,7 @@ class Array final { Array& operator=(const Array&) = default; Array(const Array&) = default; - T& operator[](SizeT at) { - MUST_PASS(at < this->Count()); - return fArray[at]; - } + T& operator[](SizeT at) { return fArray[at]; } Boolean Empty() { return this->Count() > 0; } diff --git a/dev/kernel/NewKit/Ref.h b/dev/kernel/NewKit/Ref.h index 6737ce09..31ad16f8 100644 --- a/dev/kernel/NewKit/Ref.h +++ b/dev/kernel/NewKit/Ref.h @@ -19,7 +19,7 @@ class Ref final { Ref() = default; ~Ref() { - if (mm_is_valid_heap(fClass)) delete fClass; + if (mm_is_valid_ptr(fClass)) delete fClass; } public: diff --git a/dev/kernel/StorageKit/DmaPool.h b/dev/kernel/StorageKit/DmaPool.h deleted file mode 100644 index a5d8c880..00000000 --- a/dev/kernel/StorageKit/DmaPool.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2025 Amlal El Mahrouss. All rights reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -#pragma once - -#include - -#ifdef __NE_AMD64__ -#define NE_DMA_POOL_START (0x1000000) -#define NE_DMA_POOL_SIZE (0x1000000) - -namespace Kernel { -/// @brief DMA pool base pointer, here we're sure that AHCI or whatever tricky standard sees it. -inline UInt8* kDmaPoolPtr = (UInt8*) NE_DMA_POOL_START; -inline const UInt8* kDmaPoolEnd = (UInt8*) (NE_DMA_POOL_START + NE_DMA_POOL_SIZE); - -/***********************************************************************************/ -/// @brief allocate from the rtl_dma_alloc system. -/// @param size the size of the chunk to allocate. -/// @param align alignement of pointer. -/***********************************************************************************/ -inline VoidPtr rtl_dma_alloc(SizeT size, SizeT align) { - if (!size) { - return nullptr; - } - - UIntPtr addr = (UIntPtr) kDmaPoolPtr; - - /// here we just align the address according to a `align` variable, i'd rather be a power of two - /// really. - addr = (addr + (align - 1)) & ~(align - 1); - - if ((addr + size) >= reinterpret_cast(kDmaPoolEnd)) { - kout << "DMA Pool is exhausted!\r"; - - err_global_get() = kErrorDmaExhausted; - - return nullptr; - } - - kDmaPoolPtr = (UInt8*) (addr + size); - return (VoidPtr) addr; -} - -/***********************************************************************************/ -/// @brief Free DMA pointer. -/***********************************************************************************/ -inline Void rtl_dma_free(SizeT size) { - if (!size) return; - - kDmaPoolPtr = (UInt8*) (kDmaPoolPtr - size); -} - -/***********************************************************************************/ -/// @brief Flush DMA pointer. -/***********************************************************************************/ -inline Void rtl_dma_flush(VoidPtr ptr, SizeT size_buffer) { - if (ptr > (Void*) (NE_DMA_POOL_START + NE_DMA_POOL_SIZE)) { - return; - } - - if (!ptr) { - return; - } - - for (SizeT i = 0; i < size_buffer; ++i) { - asm volatile("clflush (%0)" : : "r"((UInt8*) ptr + i) : "memory"); - } - - asm volatile("mfence" ::: "memory"); -} -} // namespace Kernel -#endif \ No newline at end of file diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc index 7cbcf376..dfd29770 100644 --- a/dev/kernel/src/BitMapMgr.cc +++ b/dev/kernel/src/BitMapMgr.cc @@ -169,7 +169,7 @@ namespace HAL { VoidPtr ptr_new = nullptr; Detail::IBitMapProxy bitmp; - NE_UNUSED(is_page); + if (is_page) return nullptr; ptr_new = bitmp.FindBitMap(kKernelBitMpStart, size, wr, user, pad); return (UIntPtr*) ptr_new; diff --git a/dev/kernel/src/CxxAbi-AMD64.cc b/dev/kernel/src/CxxAbi-AMD64.cc index 452f23cd..c97b99f9 100644 --- a/dev/kernel/src/CxxAbi-AMD64.cc +++ b/dev/kernel/src/CxxAbi-AMD64.cc @@ -8,6 +8,7 @@ #include #include +#include #include atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; @@ -23,10 +24,7 @@ EXTERN_C Kernel::Void __cxa_pure_virtual(void* self) { (Kernel::Void)(Kernel::kout << ", has unimplemented virtual functions.\r"); } -EXTERN_C void ___chkstk_ms(void) { - (Kernel::Void)(Kernel::kout << "Stack smashing detected!\r"); - dbg_break_point(); -} +EXTERN_C void ___chkstk_ms(void) {} EXTERN_C int atexit(void (*f)()) { if (__atexit_func_count >= kAtExitMacDestructors) return 1; diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index 449640f9..8bb1c930 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -146,7 +146,7 @@ DriveTrait io_construct_blank_drive() noexcept { trait.fInit = io_drv_unimplemented; trait.fProtocol = io_drv_kind; - kout << "Construct: " << trait.fName << "\r"; + kout << "DriveMgr: Construct: " << trait.fName << "\r"; return trait; } @@ -170,7 +170,7 @@ namespace Detail { trait.fPacket.fPacketReadOnly = NO; trait.fKind = kMassStorageDrive | kEPMDrive; - kout << "Disk is EPM formatted.\r"; + kout << "DriveMgr: Disk is EPM formatted.\r"; trait.fSectorSz = block_struct.SectorSz; trait.fLbaEnd = block_struct.LbaEnd; @@ -191,13 +191,13 @@ namespace Detail { trait.fPacket.fPacketReadOnly = NO; trait.fKind = kMassStorageDrive | kGPTDrive; - kout << "Disk is GPT formatted.\r"; + kout << "DriveMgr: Disk is GPT formatted.\r"; trait.fSectorSz = gpt_struct.SizeOfEntries; trait.fLbaEnd = gpt_struct.LastGPTEntry; trait.fLbaStart = gpt_struct.FirstGPTEntry; } else { - kout << "Disk is unformatted.\r"; + kout << "DriveMgr: Disk is unformatted.\r"; trait.fPacket.fPacketReadOnly = YES; trait.fKind = kMassStorageDrive | kUnformattedDrive | kReadOnlyDrive; @@ -233,7 +233,7 @@ DriveTrait io_construct_main_drive() noexcept { trait.fInit = io_drv_init; trait.fProtocol = io_drv_kind; - kout << "Detecting partition scheme of: " << trait.fName << ".\r"; + kout << "DriveMgr: Detecting partition scheme of: " << trait.fName << ".\r"; Detail::io_detect_drive(trait); diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index d4aa1ee3..519707d7 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -262,7 +262,7 @@ namespace Detail { const BOOL delete_or_create) { if (mnt) { HEFS_INDEX_NODE_DIRECTORY* tmpdir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); auto start = root->fStartIND; auto prev_location = start; @@ -294,7 +294,7 @@ namespace Detail { if (expr) { HEFS_INDEX_NODE_DIRECTORY* dirent = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); @@ -412,8 +412,8 @@ namespace Detail { err_global_get() = kErrorSuccess; - mm_delete_heap(dirent); - mm_delete_heap(tmpdir); + mm_delete_ptr(dirent); + mm_delete_ptr(tmpdir); if (!delete_or_create) ++root->fINDCount; @@ -438,7 +438,7 @@ namespace Detail { } err_global_get() = kErrorDisk; - mm_delete_heap(tmpdir); + mm_delete_ptr(tmpdir); return NO; } @@ -467,7 +467,7 @@ namespace Detail { HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); HEFS_INDEX_NODE_DIRECTORY* dir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); while (YES) { if (err_global_get() == kErrorDiskIsCorrupted) { @@ -543,7 +543,7 @@ namespace Detail { if (mnt) { HEFS_INDEX_NODE_DIRECTORY* dir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_heap(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); auto hash_file = node->fHashPath; @@ -596,7 +596,7 @@ namespace Detail { mnt->fOutput(mnt->fPacket); - mm_delete_heap(dir); + mm_delete_ptr(dir); return YES; } else if (dir->fINSlices[inode_index] != 0 && delete_or_create) { @@ -646,7 +646,7 @@ namespace Detail { mnt->fOutput(mnt->fPacket); - mm_delete_heap(dir); + mm_delete_ptr(dir); return YES; } @@ -657,7 +657,7 @@ namespace Detail { if (start > root->fEndIND || start == 0) break; } - mm_delete_heap(dir); + mm_delete_ptr(dir); err_global_get() = kErrorFileNotFound; return NO; } @@ -902,7 +902,7 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, return NO; } - HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_heap(sizeof(HEFS_BOOT_NODE), Yes, No); + HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); rt_copy_memory((VoidPtr) "fs/hefs-packet", mnt->fPacket.fPacketMime, rt_string_len("fs/hefs-packet")); @@ -938,11 +938,11 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, // todo: make it smarter for high-throughput. Detail::hefsi_balance_ind(root, mnt); - mm_delete_heap((VoidPtr) root); + mm_delete_ptr((VoidPtr) root); return YES; } - mm_delete_heap((VoidPtr) root); + mm_delete_ptr((VoidPtr) root); return NO; } @@ -983,7 +983,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc return NO; } - HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_heap(sizeof(HEFS_BOOT_NODE), Yes, No); + HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) mm_new_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); if (!root) { err_global_get() = kErrorInvalidData; @@ -1001,7 +1001,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc if (!KStringBuilder::Equals(root->fMagic, kHeFSMagic) || root->fVersion != kHeFSVersion) { (Void)(kout << "Invalid Boot Node, HeFS partition is invalid." << kendl); - mm_delete_heap((VoidPtr) root); + mm_delete_ptr((VoidPtr) root); err_global_get() = kErrorDisk; return NO; } @@ -1021,7 +1021,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc mnt->fInput(mnt->fPacket); } else { if (start->fFlags & kHeFSFlagsReadOnly) { - mm_delete_heap((VoidPtr) root); + mm_delete_ptr((VoidPtr) root); delete start; kout << "Error: File is read-only\r"; @@ -1034,7 +1034,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc } } - mm_delete_heap((VoidPtr) root); + mm_delete_ptr((VoidPtr) root); delete start; return YES; } @@ -1058,7 +1058,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } - HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_new_heap(sizeof(HEFS_INDEX_NODE), Yes, No); + HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_new_ptr(sizeof(HEFS_INDEX_NODE), Yes, No); if (!node) { err_global_get() = kErrorInvalidData; @@ -1070,7 +1070,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co HEFS_BOOT_NODE* root = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); if (!root) { - mm_delete_heap((VoidPtr) node); + mm_delete_ptr((VoidPtr) node); err_global_get() = kErrorInvalidData; return NO; @@ -1124,7 +1124,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co node->fHashPath = Detail::hefsi_hash_64(name); if (Detail::hefsi_update_in_status(root, mnt, dir, node, delete_or_create)) { - mm_delete_heap((VoidPtr) node); + mm_delete_ptr((VoidPtr) node); Detail::hefsi_balance_ind(root, mnt); @@ -1132,7 +1132,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return YES; } - mm_delete_heap((VoidPtr) node); + mm_delete_ptr((VoidPtr) node); err_global_get() = kErrorDirectoryNotFound; return NO; diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 49673b59..dae69a21 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -240,7 +240,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char return nullptr; } - Char* parent_name = (Char*) mm_new_heap(sizeof(Char) * rt_string_len(name), Yes, No); + Char* parent_name = (Char*) mm_new_ptr(sizeof(Char) * rt_string_len(name), Yes, No); /// Locate parent catalog, to then allocate right after it. @@ -269,7 +269,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char NEFS_CATALOG_STRUCT* catalog = this->FindCatalog(parent_name, out_lba); - mm_delete_heap(parent_name); + mm_delete_ptr(parent_name); auto& drive = kMountpoint.A(); diff --git a/dev/kernel/src/HardwareThreadScheduler.cc b/dev/kernel/src/HardwareThreadScheduler.cc index c49c3081..1df5ad7a 100644 --- a/dev/kernel/src/HardwareThreadScheduler.cc +++ b/dev/kernel/src/HardwareThreadScheduler.cc @@ -41,14 +41,14 @@ HardwareThread::~HardwareThread() = default; /***********************************************************************************/ //! @brief returns the id of the thread. /***********************************************************************************/ -const ThreadID& HardwareThread::ID() noexcept { +ThreadID& HardwareThread::ID() noexcept { return fID; } /***********************************************************************************/ //! @brief returns the kind of thread we have. /***********************************************************************************/ -const ThreadKind& HardwareThread::Kind() noexcept { +ThreadKind& HardwareThread::Kind() noexcept { return fKind; } @@ -104,16 +104,10 @@ Void HardwareThread::Wake(const bool wakeup) noexcept { /// @retval true stack was changed, code is running. /// @retval false stack is invalid, previous code is running. /***********************************************************************************/ -Bool HardwareThread::Switch(VoidPtr image_ptr, Ptr8 stack_ptr, HAL::StackFramePtr frame, - const ThreadID& pid) { - if (this->IsBusy()) return NO; - +Bool HardwareThread::Switch(HAL::StackFramePtr frame, const ThreadID& pid) { this->fStack = frame; this->fPID = pid; - this->fStack->BP = reinterpret_cast(image_ptr); - this->fStack->SP = reinterpret_cast(stack_ptr); - Bool ret = mp_register_process(fStack, this->fPID); if (ret) this->Busy(YES); diff --git a/dev/kernel/src/KPC.cc b/dev/kernel/src/KPC.cc index 8937d19a..9a76c110 100644 --- a/dev/kernel/src/KPC.cc +++ b/dev/kernel/src/KPC.cc @@ -19,7 +19,7 @@ Boolean err_bug_check_raise(Void) noexcept { if (ptr == nullptr) goto bug_check_fail; - if (!mm_is_valid_heap(ptr)) goto bug_check_fail; + if (!mm_is_valid_ptr(ptr)) goto bug_check_fail; delete[] ptr; diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/MemoryMgr.cc index 9b7bea43..f8aa14cf 100644 --- a/dev/kernel/src/MemoryMgr.cc +++ b/dev/kernel/src/MemoryMgr.cc @@ -74,14 +74,14 @@ namespace Detail { /// @brief Check for heap address validity. /// @param heap_ptr The address_ptr to check. /// @return Bool if the pointer is valid or not. - _Output auto mm_check_heap_address(VoidPtr heap_ptr) -> Bool { + _Output auto mm_check_ptr_address(VoidPtr heap_ptr) -> Bool { if (!heap_ptr) return false; - IntPtr base_heap = ((IntPtr) heap_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK); + IntPtr base_ptr = ((IntPtr) heap_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK); /// Add that check in case we're having an integer underflow. /// - if (base_heap < 0) { + if (base_ptr < 0) { return false; } @@ -91,15 +91,17 @@ namespace Detail { typedef MM_INFORMATION_BLOCK* MM_INFORMATION_BLOCK_PTR; } // namespace Detail -/// @brief Declare a new size for ptr_heap. -/// @param ptr_heap the pointer. +STATIC PageMgr kPageMgr; + +/// @brief Declare a new size for ptr_ptr. +/// @param ptr_ptr the pointer. /// @return Newly allocated heap header. -_Output auto mm_realloc_heap(VoidPtr ptr_heap, SizeT new_sz) -> VoidPtr { - if (Detail::mm_check_heap_address(ptr_heap) == No) return nullptr; +_Output auto mm_realloc_ptr(VoidPtr ptr_ptr, SizeT new_sz) -> VoidPtr { + if (Detail::mm_check_ptr_address(ptr_ptr) == No) return nullptr; - if (!ptr_heap || new_sz < 1) return nullptr; + if (!ptr_ptr || new_sz < 1) return nullptr; - kout << "This function is not implemented by the kernel yet.\r"; + kout << "MemoryMgr: This function is not implemented by the kernel yet.\r"; ke_panic(RUNTIME_CHECK_INVALID); @@ -111,15 +113,14 @@ _Output auto mm_realloc_heap(VoidPtr ptr_heap, SizeT new_sz) -> VoidPtr { /// @param wr Read Write bit. /// @param user User enable bit. /// @return The newly allocated pointer. -_Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { +_Output VoidPtr mm_new_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { auto sz_fix = sz; if (sz_fix == 0) return nullptr; sz_fix += sizeof(Detail::MM_INFORMATION_BLOCK); - PageMgr page_mgr; - auto wrapper = page_mgr.Request(wr, user, No, sz_fix, pad_amount); + auto wrapper = kPageMgr.Request(wr, user, No, sz_fix, pad_amount); Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast(wrapper.VirtualAddress() + @@ -127,7 +128,7 @@ _Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { heap_info_ptr->fSize = sz_fix; heap_info_ptr->fMagic = kMemoryMgrMagic; - heap_info_ptr->fCRC32 = 0; // dont fill it for now. + heap_info_ptr->fCRC32 = 0U; // dont fill it for now. heap_info_ptr->fOffset = reinterpret_cast(heap_info_ptr) + sizeof(Detail::MM_INFORMATION_BLOCK); heap_info_ptr->fPage = No; @@ -140,8 +141,8 @@ _Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { auto result = reinterpret_cast(heap_info_ptr->fOffset); - (Void)(kout << "Registered heap address: " << hex_number(reinterpret_cast(heap_info_ptr)) - << kendl); + (Void)(kout << "MemoryMgr: Registered heap address: " + << hex_number(reinterpret_cast(heap_info_ptr)) << kendl); return result; } @@ -150,7 +151,7 @@ _Output VoidPtr mm_new_heap(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { /// @param heap_ptr the pointer to make a page heap. /// @return kErrorSuccess if successful, otherwise an error code. _Output Int32 mm_make_page(VoidPtr heap_ptr) { - if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent; + if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent; Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) heap_ptr - @@ -160,8 +161,8 @@ _Output Int32 mm_make_page(VoidPtr heap_ptr) { heap_info_ptr->fPage = true; - (Void)(kout << "Registered page address: " << hex_number(reinterpret_cast(heap_info_ptr)) - << kendl); + (Void)(kout << "MemoryMgr: Registered page from heap address: " + << hex_number(reinterpret_cast(heap_info_ptr)) << kendl); return kErrorSuccess; } @@ -169,8 +170,8 @@ _Output Int32 mm_make_page(VoidPtr heap_ptr) { /// @brief Overwrites and set the flags of a heap header. /// @param heap_ptr the pointer to update. /// @param flags the flags to set. -_Output Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags) { - if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent; +_Output Int32 mm_make_ptr_flags(VoidPtr heap_ptr, UInt64 flags) { + if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent; Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) heap_ptr - @@ -185,7 +186,7 @@ _Output Int32 mm_make_flags(VoidPtr heap_ptr, UInt64 flags) { /// @brief Gets the flags of a heap header. /// @param heap_ptr the pointer to get. -_Output UInt64 mm_get_flags(VoidPtr heap_ptr) { +_Output UInt64 mm_get_ptr_flags(VoidPtr heap_ptr) { Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) heap_ptr - sizeof(Detail::MM_INFORMATION_BLOCK)); @@ -198,8 +199,8 @@ _Output UInt64 mm_get_flags(VoidPtr heap_ptr) { /// @brief Declare pointer as free. /// @param heap_ptr the pointer. /// @return -_Output Int32 mm_delete_heap(VoidPtr heap_ptr) { - if (Detail::mm_check_heap_address(heap_ptr) == No) return kErrorHeapNotPresent; +_Output Int32 mm_delete_ptr(VoidPtr heap_ptr) { + if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent; Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) (heap_ptr) - @@ -219,16 +220,16 @@ _Output Int32 mm_delete_heap(VoidPtr heap_ptr) { heap_info_ptr->fMagic = 0; heap_info_ptr->fPad = 0; - (Void)(kout << "Freed heap address: " << hex_number(reinterpret_cast(heap_info_ptr)) - << kendl); + (Void)(kout << "MemoryMgr: Freed heap address: " + << hex_number(reinterpret_cast(heap_info_ptr)) << kendl); PTEWrapper page_wrapper( No, No, No, reinterpret_cast(heap_info_ptr) - sizeof(Detail::MM_INFORMATION_BLOCK)); + Ref pte_address{page_wrapper}; - PageMgr page_mgr; - page_mgr.Free(pte_address); + kPageMgr.Free(pte_address); return kErrorSuccess; } @@ -239,7 +240,7 @@ _Output Int32 mm_delete_heap(VoidPtr heap_ptr) { /// @brief Check if pointer is a valid Kernel pointer. /// @param heap_ptr the pointer /// @return if it exists. -_Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) { +_Output Boolean mm_is_valid_ptr(VoidPtr heap_ptr) { if (heap_ptr && HAL::mm_is_bitmap(heap_ptr)) { Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) (heap_ptr) - @@ -254,7 +255,7 @@ _Output Boolean mm_is_valid_heap(VoidPtr heap_ptr) { /// @brief Protect the heap with a CRC value. /// @param heap_ptr HIB pointer. /// @return if it valid: point has crc now., otherwise fail. -_Output Boolean mm_protect_heap(VoidPtr heap_ptr) { +_Output Boolean mm_protect_ptr(VoidPtr heap_ptr) { if (heap_ptr) { Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast((UIntPtr) heap_ptr - diff --git a/dev/kernel/src/New+Delete.cc b/dev/kernel/src/New+Delete.cc index 96e7ab64..a6bde691 100644 --- a/dev/kernel/src/New+Delete.cc +++ b/dev/kernel/src/New+Delete.cc @@ -10,25 +10,25 @@ void* operator new[](size_t sz) { if (sz == 0) ++sz; - return Kernel::mm_new_heap(sz, true, false); + return Kernel::mm_new_ptr(sz, true, false); } void* operator new(size_t sz) { if (sz == 0) ++sz; - return Kernel::mm_new_heap(sz, true, false); + return Kernel::mm_new_ptr(sz, true, false); } void operator delete[](void* ptr) { if (ptr == nullptr) return; - Kernel::mm_delete_heap(ptr); + Kernel::mm_delete_ptr(ptr); } void operator delete(void* ptr) { if (ptr == nullptr) return; - Kernel::mm_delete_heap(ptr); + Kernel::mm_delete_ptr(ptr); } void operator delete(void* ptr, size_t sz) { @@ -36,7 +36,7 @@ void operator delete(void* ptr, size_t sz) { NE_UNUSED(sz); - Kernel::mm_delete_heap(ptr); + Kernel::mm_delete_ptr(ptr); } void operator delete[](void* ptr, size_t sz) { @@ -44,5 +44,5 @@ void operator delete[](void* ptr, size_t sz) { NE_UNUSED(sz); - Kernel::mm_delete_heap(ptr); + Kernel::mm_delete_ptr(ptr); } diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 09a262d4..5ff54098 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) fBad = true; - if (fCachedBlob) mm_delete_heap(fCachedBlob); + if (fCachedBlob) mm_delete_ptr(fCachedBlob); kout << "PEFLoader: Warning: Executable format error!\r"; @@ -89,7 +89,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) /// @brief PEF destructor. /***********************************************************************************/ PEFLoader::~PEFLoader() { - if (fCachedBlob) mm_delete_heap(fCachedBlob); + if (fCachedBlob) mm_delete_ptr(fCachedBlob); fFile.Delete(); } @@ -147,7 +147,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { if (container_header->Kind == kind) { if (container_header->Cpu != Detail::ldr_get_platform()) { if (!this->fFatBinary) { - mm_delete_heap(blob); + mm_delete_ptr(blob); return ErrorOr{kErrorInvalidData}; } } @@ -156,7 +156,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, container_header->Size); - mm_delete_heap(blob); + mm_delete_ptr(blob); kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; @@ -165,7 +165,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { - mm_delete_heap(container_blob_value); + mm_delete_ptr(container_blob_value); return ErrorOr{kErrorInvalidData}; } @@ -174,7 +174,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } } - mm_delete_heap(blob); + mm_delete_ptr(blob); return ErrorOr{kErrorInvalidData}; } @@ -236,7 +236,7 @@ namespace Utils { UserProcessScheduler::The().Spawn(reinterpret_cast(symname.Leak().Leak()), errOrStart.Leak().Leak(), exec.GetBlob().Leak().Leak()); - mm_delete_heap(symname.Leak().Leak()); + mm_delete_ptr(symname.Leak().Leak()); if (id != kSchedInvalidPID) { auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData); @@ -253,7 +253,7 @@ namespace Utils { UserProcessScheduler::The().CurrentTeam().AsArray()[id].StackSize = *(UIntPtr*) stacksym.Leak().Leak(); - mm_delete_heap(stacksym.Leak().Leak()); + mm_delete_ptr(stacksym.Leak().Leak()); } return id; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index f868a810..e44cbed4 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -25,14 +25,14 @@ ///! BUGS: 0 namespace Kernel { +EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame); + /***********************************************************************************/ /// @brief Exit Code global variable. /***********************************************************************************/ STATIC UInt32 kLastExitCode = 0U; -STATIC BOOL kCurrentlySwitching = No; - /***********************************************************************************/ /// @brief Scheduler itself. /***********************************************************************************/ @@ -101,7 +101,7 @@ Void USER_PROCESS::Wake(Bool should_wakeup) { /** @param tree The tree to calibrate */ /***********************************************************************************/ -STATIC PROCESS_HEAP_TREE* sched_try_go_upper_heap_tree(PROCESS_HEAP_TREE* tree) { +STATIC PROCESS_HEAP_TREE* sched_try_go_upper_ptr_tree(PROCESS_HEAP_TREE* tree) { if (!tree) { return nullptr; } @@ -132,11 +132,11 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { auto vm_register = kKernelCR3; hal_write_cr3(this->VMRegister); - auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount); + auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount); hal_write_cr3(vm_register); #else - auto ptr = mm_new_heap(sz, Yes, Yes, pad_amount); + auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount); #endif if (!this->HeapTree) { @@ -173,7 +173,7 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { is_parent = NO; entry = entry->Next; } else { - entry = sched_try_go_upper_heap_tree(entry); + entry = sched_try_go_upper_ptr_tree(entry); if (entry && entry->Color == kBlackTreeKind) break; } } @@ -240,20 +240,20 @@ const AffinityKind& USER_PROCESS::GetAffinity() noexcept { /** @brief Free heap tree. */ /***********************************************************************************/ -STATIC Void sched_free_heap_tree(PROCESS_HEAP_TREE* memory_heap_list) { +STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE* memory_ptr_list) { // Deleting memory lists. Make sure to free all of them. - while (memory_heap_list) { - if (memory_heap_list->Entry) { - MUST_PASS(mm_delete_heap(memory_heap_list->Entry)); + while (memory_ptr_list) { + if (memory_ptr_list->Entry) { + MUST_PASS(mm_delete_ptr(memory_ptr_list->Entry)); } - auto next = memory_heap_list->Next; + auto next = memory_ptr_list->Next; - mm_delete_heap(memory_heap_list); + mm_delete_ptr(memory_ptr_list); - if (memory_heap_list->Child) sched_free_heap_tree(memory_heap_list->Child); + if (memory_ptr_list->Child) sched_free_ptr_tree(memory_ptr_list->Child); - memory_heap_list = next; + memory_ptr_list = next; } } @@ -270,14 +270,14 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { kLastExitCode = exit_code; - auto memory_heap_list = this->HeapTree; + auto memory_ptr_list = this->HeapTree; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ auto pd = kKernelCR3; hal_write_cr3(this->VMRegister); #endif - sched_free_heap_tree(memory_heap_list); + sched_free_ptr_tree(memory_ptr_list); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ hal_write_cr3(pd); @@ -289,24 +289,19 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { #endif //! Delete image if not done already. - if (this->Image.fCode && mm_is_valid_heap(this->Image.fCode)) mm_delete_heap(this->Image.fCode); + if (this->Image.fCode && mm_is_valid_ptr(this->Image.fCode)) mm_delete_ptr(this->Image.fCode); //! Delete blob too. - if (this->Image.fBlob && mm_is_valid_heap(this->Image.fBlob)) mm_delete_heap(this->Image.fBlob); + if (this->Image.fBlob && mm_is_valid_ptr(this->Image.fBlob)) mm_delete_ptr(this->Image.fBlob); //! Delete stack frame. - if (this->StackFrame && mm_is_valid_heap(this->StackFrame)) - mm_delete_heap((VoidPtr) this->StackFrame); - - //! Delete stack reserve. - if (this->StackReserve && mm_is_valid_heap(this->StackReserve)) - mm_delete_heap(reinterpret_cast(this->StackReserve)); + if (this->StackFrame && mm_is_valid_ptr(this->StackFrame)) + mm_delete_ptr((VoidPtr) this->StackFrame); //! Avoid use after free. - this->Image.fBlob = nullptr; - this->Image.fCode = nullptr; - this->StackFrame = nullptr; - this->StackReserve = nullptr; + this->Image.fBlob = nullptr; + this->Image.fCode = nullptr; + this->StackFrame = nullptr; if (this->Kind == kExecutableDylibKind) { Bool success = false; @@ -326,6 +321,34 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { --this->ParentTeam->mProcessCount; } +/***********************************************************************************/ +/// @brief Add dylib to process. +/***********************************************************************************/ + +Bool USER_PROCESS::SpawnDylib() { + // React according to process kind. + switch (this->Kind) { + case USER_PROCESS::kExecutableDylibKind: { + this->DylibDelegate = rtl_init_dylib_pef(*this); + + if (!this->DylibDelegate) { + this->Crash(); + return NO; + } + + return YES; + } + case USER_PROCESS::kExecutableKind: { + return NO; + } + default: { + (Void)(kout << "Unknown process kind: " << hex_number(this->Kind) << kendl); + this->Crash(); + return NO; + } + } +} + /***********************************************************************************/ /// @brief Add process to team. /// @param process the process *Ref* class. @@ -363,18 +386,9 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im rt_copy_memory(reinterpret_cast(const_cast(name)), process.Name, len); #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - process.VMRegister = new PDE(); - - if (!process.VMRegister) { - process.Crash(); - return -kErrorProcessFault; - } - - UInt32 flags = HAL::kMMFlagsPresent; - flags |= HAL::kMMFlagsWr; - flags |= HAL::kMMFlagsUser; - - HAL::mm_map_page((VoidPtr) process.VMRegister, process.VMRegister, flags); + process.VMRegister = kKernelCR3; +#else + process.VMRegister = 0UL; #endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ process.StackFrame = new HAL::StackFrame(); @@ -386,52 +400,17 @@ ProcessID UserProcessScheduler::Spawn(const Char* name, VoidPtr code, VoidPtr im rt_set_memory(process.StackFrame, 0, sizeof(HAL::StackFrame)); -#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - flags = HAL::kMMFlagsPresent; - flags |= HAL::kMMFlagsWr; - flags |= HAL::kMMFlagsUser; + process.StackFrame->BP = reinterpret_cast(code); - HAL::mm_map_page((VoidPtr) process.StackFrame, process.StackFrame, flags); -#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - - // React according to process kind. - switch (process.Kind) { - case USER_PROCESS::kExecutableDylibKind: { - process.DylibDelegate = rtl_init_dylib_pef(process); - MUST_PASS(process.DylibDelegate); - break; - } - case USER_PROCESS::kExecutableKind: { - break; - } - default: { - (Void)(kout << "Unknown process kind: " << hex_number(process.Kind) << kendl); - break; - } - } - - process.StackReserve = new UInt8[process.StackSize]; - - if (!process.StackReserve) { - process.Crash(); - return -kErrorProcessFault; - } + process.StackSize = kSchedMaxStackSz; rt_set_memory(process.StackReserve, 0, process.StackSize); -#ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - flags = HAL::kMMFlagsPresent; - flags |= HAL::kMMFlagsWr; - flags |= HAL::kMMFlagsUser; - - HAL::mm_map_page((VoidPtr) process.StackReserve, process.StackReserve, flags); -#endif // ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ - process.ParentTeam = &mTeam; process.ProcessId = pid; - process.Status = ProcessStatusKind::kStarting; - process.PTime = (UIntPtr) AffinityKind::kStandard; + process.Status = ProcessStatusKind::kRunning; + process.PTime = 0; process.RTime = 0; (Void)(kout << "PID: " << number(process.ProcessId) << kendl); @@ -498,10 +477,6 @@ SizeT UserProcessScheduler::Run() noexcept { return 0UL; } - if (kCurrentlySwitching) return 0UL; - - kCurrentlySwitching = Yes; - SizeT process_index = 0UL; //! we store this guy to tell the scheduler how many //! things we have scheduled. @@ -516,53 +491,38 @@ SizeT UserProcessScheduler::Run() noexcept { continue; } - // Set current process header. + kout << "The process: " << process.Name << " is being scheduled to run...\r"; + this->CurrentProcess() = process; process.PTime = static_cast(process.Affinity); + process.RTime = 0UL; - // tell helper to find a core to schedule on. - BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(), - &process.StackReserve[process.StackSize - 1], - process.StackFrame, process.ProcessId); - - if (!ret) { - kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; - process.Crash(); + // tell helper to find a core to schedule on, otherwise run on this core directly. + if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { + sched_jump_to_task(process.StackFrame); } - } else { - if (process.ProcessId == this->CurrentProcess().Leak().ProcessId) { + + if (process.ProcessId == this->CurrentProcess().Leak().ProcessId && + process.PTime > (Int32) AffinityKind::kStandard) { if (process.PTime < process.RTime) { - if (process.RTime < (Int32) AffinityKind::kRealTime) - process.PTime = (Int32) AffinityKind::kVeryLowUsage; - else if (process.RTime < (Int32) AffinityKind::kVeryHigh) + if (process.RTime < (Int32) AffinityKind::kVeryHigh) process.PTime = (Int32) AffinityKind::kLowUsage; else if (process.RTime < (Int32) AffinityKind::kHigh) process.PTime = (Int32) AffinityKind::kStandard; else if (process.RTime < (Int32) AffinityKind::kStandard) process.PTime = (Int32) AffinityKind::kHigh; - process.RTime = static_cast(process.Affinity); - - BOOL ret = UserProcessHelper::Switch(process.Image.Leak().Leak().Leak(), - &process.StackReserve[process.StackSize - 1], - process.StackFrame, process.ProcessId); - - if (!ret) { - kout << "The process: " << process.Name << ", is not valid! Crashing it...\r"; - process.Crash(); - } + process.RTime = 0UL; } else { ++process.RTime; } } - + } else { --process.PTime; } } - kCurrentlySwitching = No; - return process_index; } @@ -582,8 +542,6 @@ UserProcessTeam& UserProcessScheduler::CurrentTeam() { BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) { if (team.AsArray().Count() < 1) return No; - if (kCurrentlySwitching) return No; - kScheduler.mTeam = team; return Yes; @@ -617,8 +575,6 @@ Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { if (process.Status == ProcessStatusKind::kInvalid) return No; - if (!process.Image.HasCode()) return No; - if (!process.Name[0]) return No; // real time processes shouldn't wait that much. @@ -645,8 +601,7 @@ SizeT UserProcessHelper::StartScheduling() { */ /***********************************************************************************/ -Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr frame_ptr, - PID new_pid) { +Bool UserProcessHelper::Switch(HAL::StackFramePtr frame_ptr, PID new_pid) { for (SizeT index = 0UL; index < HardwareThreadScheduler::The().Capacity(); ++index) { if (HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPInvalid || HardwareThreadScheduler::The()[index].Leak()->Kind() == kAPBoot) @@ -658,13 +613,13 @@ Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr f AffinityKind::kRealTime) continue; - if (HardwareThreadScheduler::The()[index].Leak()->Switch(image, stack, frame_ptr, new_pid)) { + if (HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid)) { HardwareThreadScheduler::The()[index].Leak()->fPTime = UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; UserProcessHelper::TheCurrentPID().Leak().Leak() = UserProcessHelper::TheCurrentPID(); - return YES; + break; } continue; @@ -678,8 +633,7 @@ Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr f /// Prepare task switch. /// //////////////////////////////////////////////////////////// - Bool ret = - HardwareThreadScheduler::The()[index].Leak()->Switch(image, stack, frame_ptr, new_pid); + Bool ret = HardwareThreadScheduler::The()[index].Leak()->Switch(frame_ptr, new_pid); //////////////////////////////////////////////////////////// /// Rollback on fail. /// @@ -693,10 +647,10 @@ Bool UserProcessHelper::Switch(VoidPtr image, UInt8* stack, HAL::StackFramePtr f UserProcessScheduler::The().CurrentTeam().AsArray()[new_pid].PTime; HardwareThreadScheduler::The()[index].Leak()->Wake(YES); - return Yes; + return YES; } - return No; + return NO; } //////////////////////////////////////////////////////////// -- cgit v1.2.3 From c589f92ed0f6e462a976c64d533c1d8a21b2a3ba Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 16 May 2025 13:35:50 +0200 Subject: feat(kernel): User doesn't store the password directly anymore, it is hashed under a 64-bit FNV algorithm. why? - Better security, so that we're sure that no one else knows about the password. also: - Rename super to MGMT (Management), as it manages a NeKernel machine. - Added a copy of cxxdrv in the nekernel source tree. - Working on the custom manual parser for NeKernel. (PoC) Signed-off-by: Amlal El Mahrouss --- dev/kernel/CompilerKit/Version.h | 8 ++-- dev/kernel/KernelKit/User.h | 10 ++-- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 7 ++- dev/kernel/src/User.cc | 77 +++++++----------------------- public/manuals/nekernel/mgmt.util.man | 20 ++++++++ public/manuals/troff/cxxdrv.7 | 34 +++++++++++++ tooling/manual.py | 9 ++++ 7 files changed, 93 insertions(+), 72 deletions(-) create mode 100644 public/manuals/nekernel/mgmt.util.man create mode 100644 public/manuals/troff/cxxdrv.7 create mode 100644 tooling/manual.py (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/kernel/CompilerKit/Version.h b/dev/kernel/CompilerKit/Version.h index 93378863..4250531a 100644 --- a/dev/kernel/CompilerKit/Version.h +++ b/dev/kernel/CompilerKit/Version.h @@ -2,8 +2,8 @@ #pragma once -#define BOOTLOADER_VERSION "v0.0.1" -#define KERNEL_VERSION "v0.0.1" +#define BOOTLOADER_VERSION "v0.0.2-bootz" +#define KERNEL_VERSION "v0.0.2-krnl" -#define BOOTLOADER_VERSION_BCD 0x0001 -#define KERNEL_VERSION_BCD 0x0001 +#define BOOTLOADER_VERSION_BCD (0x0002) +#define KERNEL_VERSION_BCD (0x0002) diff --git a/dev/kernel/KernelKit/User.h b/dev/kernel/KernelKit/User.h index 250b1dfc..2a12e41e 100644 --- a/dev/kernel/KernelKit/User.h +++ b/dev/kernel/KernelKit/User.h @@ -22,11 +22,11 @@ ///! We got the Super, Standard (%s format) and Guest user, ///! all are used to make authorization operations on the OS. -#define kSuperUser "OS AUTHORITY/SUPER/%s" +#define kSuperUser "OS AUTHORITY/MGMT/%s" #define kGuestUser "OS AUTHORITY/GUEST/%s" #define kStdUser "OS AUTHORITY/STD/%s" -#define kUsersDir "/user/" +#define kUsersDir "/users/" #define kMaxUserNameLen (256U) #define kMaxUserTokenLen (256U) @@ -45,7 +45,7 @@ enum class UserRingKind { typedef Char* UserPublicKey; typedef Char UserPublicKeyType; -/// @brief User class. +/// @brief System User class. class User final { public: User() = delete; @@ -80,12 +80,12 @@ class User final { /// @brief Checks if a password matches the **password**. /// @param password the password to check. - Bool Matches(const UserPublicKey password) noexcept; + Bool Login(const UserPublicKey password) noexcept; private: UserRingKind mUserRing{UserRingKind::kRingStdUser}; Char mUserName[kMaxUserNameLen] = {0}; - Char mUserKey[kMaxUserTokenLen] = {0}; + UInt64 mUserFNV{0UL}; }; } // namespace Kernel diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index dae69a21..3622e711 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -878,7 +878,7 @@ namespace Kernel::NeFS { /// @brief Construct NeFS drives. /***********************************************************************************/ Boolean fs_init_nefs(Void) noexcept { - kout << "Creating main disk...\r"; + kout << "Creating HeFS disk...\r"; kMountpoint.A() = io_construct_main_drive(); @@ -886,9 +886,8 @@ Boolean fs_init_nefs(Void) noexcept { ke_panic(RUNTIME_CHECK_FILESYSTEM, "Main disk cannot be mounted."); NeFileSystemParser parser; - parser.Format(&kMountpoint.A(), 0, kNeFSVolumeName); - - return YES; + + return parser.Format(&kMountpoint.A(), 0, kNeFSVolumeName); } } // namespace Kernel::NeFS diff --git a/dev/kernel/src/User.cc b/dev/kernel/src/User.cc index 3e6aeeba..c1a5ca94 100644 --- a/dev/kernel/src/User.cc +++ b/dev/kernel/src/User.cc @@ -29,20 +29,23 @@ namespace Detail { /// \param password password to hash. /// \return the hashed password //////////////////////////////////////////////////////////// - Int32 user_standard_token_generator(Char* password, const Char* in_password, User* user, - SizeT length) { + STATIC UInt64 user_fnv_generator(const Char* password, User* user) { if (!password || !user) return 1; if (*password == 0) return 1; - kout << "user_standard_token_generator: Hashing user password...\r"; + kout << "user_fnv_generator: Hashing user password...\r"; - for (SizeT i_pass = 0UL; i_pass < length; ++i_pass) { - Char cur_chr = in_password[i_pass]; + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; + const UInt64 FNV_PRIME = 0x100000001b3ULL; - password[i_pass] = cur_chr | (user->IsStdUser() ? kStdUserType : kSuperUserType); + UInt64 hash = FNV_OFFSET_BASIS; + + while (*password) { + hash ^= (Utf8Char) (*password++); + hash *= FNV_PRIME; } - kout << "user_standard_token_generator: Hashed user password.\r"; + kout << "user_fnv_generator: Hashed user password.\r"; return 0; } @@ -68,70 +71,26 @@ User::User(const UserRingKind& ring_kind, const Char* user_name) : mUserRing(rin //////////////////////////////////////////////////////////// User::~User() = default; -Bool User::Save(const UserPublicKey password_to_fill) noexcept { - if (!password_to_fill || *password_to_fill == 0) return No; - - SizeT len = rt_string_len(password_to_fill); - - UserPublicKey password = new UserPublicKeyType[len]; - - MUST_PASS(password); - - rt_set_memory(password, 0, len); - - // fill data first, generate hash. - // return false on error. - - rt_copy_memory((VoidPtr) password_to_fill, password, len); - - if (!Detail::user_standard_token_generator(password, password_to_fill, this, len)) { - delete[] password; - password = nullptr; - - return No; - } - - // then store password. - - rt_copy_memory(password, this->mUserKey, rt_string_len(password_to_fill)); +Bool User::Save(const UserPublicKey password) noexcept { + if (!password || *password == 0) return No; - delete[] password; - password = nullptr; + this->mUserFNV = Detail::user_fnv_generator(password, this); kout << "User::Save: Saved password successfully...\r"; return Yes; } -Bool User::Matches(const UserPublicKey password_to_fill) noexcept { - if (!password_to_fill || *password_to_fill) return No; - - SizeT len = rt_string_len(password_to_fill); - - Char* password = new Char[len]; - MUST_PASS(password); - - // fill data first, generate hash. - // return false on error. - - rt_copy_memory((VoidPtr) password_to_fill, password, len); - - if (!Detail::user_standard_token_generator(password, password_to_fill, this, len)) { - delete[] password; - password = nullptr; - - return No; - } - - kout << "User::Matches: Validating hashed passwords...\r"; +Bool User::Login(const UserPublicKey password) noexcept { + if (!password || !*password) return No; // now check if the password matches. - if (rt_string_cmp(password, this->mUserKey, rt_string_len(this->mUserKey)) == 0) { - kout << "User::Matches: Password matches.\r"; + if (this->mUserFNV == Detail::user_fnv_generator(password, this)) { + kout << "User::Login: Password matches.\r"; return Yes; } - kout << "User::Matches: Password doesn't match.\r"; + kout << "User::Login: Password doesn't match.\r"; return No; } diff --git a/public/manuals/nekernel/mgmt.util.man b/public/manuals/nekernel/mgmt.util.man new file mode 100644 index 00000000..929da2d6 --- /dev/null +++ b/public/manuals/nekernel/mgmt.util.man @@ -0,0 +1,20 @@ +Title: mgmt - Management utility command. +Command: mgmt + +Body: + +The management command serves as the main scheduling and management utility of System One. + +Usages include but not limited to: + +- Run certain scripts at X time. +- Verify a device/filesystem integrity. +- Manage and automate other NeKernel machines. + +Example: + +mgmt -s -t 2:30PM -d Wed -m Apr -y 2026 -s pgp-update.script + +Release: + +System One NeKernel diff --git a/public/manuals/troff/cxxdrv.7 b/public/manuals/troff/cxxdrv.7 new file mode 100644 index 00000000..20e28fd4 --- /dev/null +++ b/public/manuals/troff/cxxdrv.7 @@ -0,0 +1,34 @@ +.TH LD64 1 "LibCompiler" "January 2025" "NeKernel Manual" +.SH NAME +.B cxxdrv +\- AE 64-bit C++ compiler for NeKernel + +.SH SYNOPSIS +.B cxxdrv %OPTIONS% %INPUT_FILES% + +.SH DESCRIPTION +.B cxxdrv +is the dedicated compiler used by NeKernel, it compiles to the AE object format. + +.SH OPTIONS +.TP +.B -output +Specify the output file. + +.SH USAGE EXAMPLES +.TP +.B Generate object file from the main.cpp unit. +.B cxxdrv main.cpp + +.SH EXIT STATUS +.TP +0 Successful compilation. +.TP +1 Error encountered during compilation of the C++ unit(s). + +.SH SEE ALSO +.BR cxxdrv (7), asm (7) + +.SH AUTHOR +Amlal El Mahrouss + diff --git a/tooling/manual.py b/tooling/manual.py new file mode 100644 index 00000000..8298559b --- /dev/null +++ b/tooling/manual.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 65a97e32ef586e073988186f1f4932c0193b3409 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 16 May 2025 16:51:06 +0200 Subject: feat(kernel): Better UPS and interrupt system too. Signed-off-by: Amlal El Mahrouss --- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 32 ++------ .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 54 +++++++++---- dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 89 +++++++++------------- dev/kernel/HALKit/AMD64/HalKernelMain.cc | 2 +- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 2 +- dev/kernel/src/UserProcessScheduler.cc | 22 +++--- dev/kernel/src/UserProcessTeam.cc | 9 ++- 7 files changed, 98 insertions(+), 112 deletions(-) (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index f7aa2a70..89fe00b5 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -80,23 +80,6 @@ struct LAPIC final { /////////////////////////////////////////////////////////////////////////////////////// -/***********************************************************************************/ -/// @brief Send IPI command to APIC. -/// @param apic_id programmable interrupt controller id. -/// @param vector vector interrupt. -/// @param target target APIC adress. -/// @return -/***********************************************************************************/ - -Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) { - Kernel::ke_dma_write(target, APIC_ICR_HIGH, apic_id << 24); - Kernel::ke_dma_write(target, APIC_ICR_LOW, 0x00000500 | 0x00004000 | 0x00000000); - - while (Kernel::ke_dma_read(target, APIC_ICR_LOW) & 0x1000) { - ; - } -} - /***********************************************************************************/ /// @brief Send end IPI for CPU. /// @param apic_id @@ -104,7 +87,7 @@ Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) { /// @param target /// @return /***********************************************************************************/ -Void hal_send_sipi(UInt32 target, UInt32 apic_id, UInt8 vector) { +Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) { Kernel::ke_dma_write(target, APIC_ICR_HIGH, apic_id << 24); Kernel::ke_dma_write(target, APIC_ICR_LOW, 0x00000600 | 0x00004000 | 0x00000000 | vector); @@ -202,13 +185,10 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { controller.Write(LAPIC_REG_TIMER_LVT, 32 | (1 << 17)); controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000); - const UIntPtr trampoline_phys = 0x7c00; + UInt8* trampoline_phys = (UInt8*) 0x7c00; - HAL::mm_map_page((VoidPtr)trampoline_phys, (VoidPtr)trampoline_phys, HAL::kMMFlagsWr | HAL::kMMFlagsPresent); - - const SizeT len = AP_BLOB_SIZE; /// AP blob size. - - rt_copy_memory(hal_ap_blob_start, reinterpret_cast(trampoline_phys), len); + *trampoline_phys = 0xcd; + *(trampoline_phys + 1) = 0x00; volatile UInt8* entry_ptr = reinterpret_cast(kMADTBlock->List); volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length; @@ -229,9 +209,7 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kout << "LAPIC type, also is on...\r"; - hal_send_start_ipi(kApicBaseAddress, entry_struct->ProcessorID); - hal_send_sipi(kApicBaseAddress, entry_struct->ProcessorID, trampoline_phys >> 12); - + hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c); } else { kout << "LAPIC type, also is not on...\r"; } diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index d5a40390..f52a7167 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -13,12 +13,31 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); EXTERN_C Kernel::UIntPtr kApicBaseAddress; +STATIC BOOL kIsRunning = NO; + +/// @brief Notify APIC and PIC that we're done with the interrupt. +/// @note +STATIC void hal_idt_send_eoi(UInt8 vector) { + ((volatile UInt32*) kApicBaseAddress)[0xB0 / 4] = 0; + + if (vector >= 0x20 && vector <= 0x2F) { + if (vector >= 0x28) { + Kernel::HAL::rt_out8(0xA0, 0x20); + } + Kernel::HAL::rt_out8(0x20, 0x20); + } + + kIsRunning = NO; +} + /// @brief Handle GPF fault. /// @param rsp EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { + hal_idt_send_eoi(13); + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); - Kernel::kout << "Kernel: General Protection Fault.\r"; + Kernel::kout << "Kernel: General Access Fault.\r"; process.Leak().Signal.SignalArg = rsp; process.Leak().Signal.SignalID = SIGKILL; @@ -26,8 +45,6 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kKilled; - process.Leak().Crash(); dbg_break_point(); @@ -36,6 +53,8 @@ EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { /// @brief Handle page fault. /// @param rsp EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { + hal_idt_send_eoi(14); + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: Page Fault.\r"; @@ -45,8 +64,6 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { process.Leak().Signal.SignalID = SIGKILL; process.Leak().Signal.Status = process.Leak().Status; - process.Leak().Status = Kernel::ProcessStatusKind::kKilled; - process.Leak().Crash(); dbg_break_point(); @@ -54,17 +71,24 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { - ((volatile UInt32*) kApicBaseAddress)[0xB0] = 0; + hal_idt_send_eoi(32); - Kernel::HAL::rt_out8(0x20, 0x20); + while (kIsRunning) + ; + + kIsRunning = YES; NE_UNUSED(rsp); Kernel::UserProcessHelper::StartScheduling(); + + kIsRunning = NO; } /// @brief Handle math fault. /// @param rsp EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { + hal_idt_send_eoi(8); + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: Math error (division by zero?).\r"; @@ -75,8 +99,6 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kKilled; - process.Leak().Crash(); dbg_break_point(); @@ -85,6 +107,8 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { /// @brief Handle any generic fault. /// @param rsp EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { + hal_idt_send_eoi(30); + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); (Void)(Kernel::kout << "Kernel: Process RSP: " << Kernel::hex_number(rsp) << Kernel::kendl); @@ -96,14 +120,14 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kKilled; - process.Leak().Crash(); dbg_break_point(); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { + hal_idt_send_eoi(3); + auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); (Void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl); @@ -125,6 +149,8 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { /// @brief Handle #UD fault. /// @param rsp EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { + hal_idt_send_eoi(6); + NE_UNUSED(rsp); auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); @@ -137,8 +163,6 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { Kernel::kout << "Kernel: SIGKILL status.\r"; - process.Leak().Status = Kernel::ProcessStatusKind::kKilled; - process.Leak().Crash(); dbg_break_point(); @@ -149,6 +173,8 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { /// @return nothing. EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, Kernel::UIntPtr rdx_syscall_struct) { + hal_idt_send_eoi(50); + if (rcx_syscall_index < kSysCalls.Count()) { Kernel::kout << "syscall: Enter Syscall.\r"; @@ -171,6 +197,8 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, /// @return nothing. EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index, Kernel::UIntPtr rdx_kerncall_struct) { + hal_idt_send_eoi(51); + if (rcx_kerncall_index < kKernCalls.Count()) { Kernel::kout << "kerncall: Enter Kernel Call List.\r"; diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index fdd62e57..667d3c5b 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -20,6 +20,8 @@ __NE_INT_%1: std + add rsp, 8 + o64 iret %endmacro @@ -30,6 +32,8 @@ __NE_INT_%1: std + add rsp, 8 + o64 iret %endmacro @@ -45,29 +49,24 @@ extern ke_io_write extern idt_handle_ud extern idt_handle_generic extern idt_handle_breakpoint +extern idt_handle_math section .text __NE_INT_0: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_generic pop rcx std + add rsp, 8 + o64 iret __NE_INT_1: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_generic pop rcx @@ -78,100 +77,87 @@ __NE_INT_1: __NE_INT_2: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_generic pop rcx std + add rsp, 8 + o64 iret ;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched. __NE_INT_3: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_breakpoint pop rcx std + add rsp, 8 + o64 iret __NE_INT_4: cld - mov al, 0x20 - out 0x20, al - - push rcx call idt_handle_generic pop rcx std + add rsp, 8 + o64 iret __NE_INT_5: cld - - mov al, 0x20 - out 0x20, al - std + add rsp, 8 + o64 iret ;; Invalid opcode interrupt __NE_INT_6: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_ud pop rcx std + add rsp, 8 + o64 iret __NE_INT_7: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_generic pop rcx std + add rsp, 8 + o64 iret ;; Invalid opcode interrupt __NE_INT_8: cld - mov al, 0x20 - out 0x20, al - push rcx - call idt_handle_generic + call idt_handle_math pop rcx std + add rsp, 8 + o64 iret IntNormal 9 @@ -183,29 +169,26 @@ IntExp 12 __NE_INT_13: cld - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_gpf pop rcx std + add rsp, 8 + o64 iret __NE_INT_14: cld - - mov al, 0x20 - out 0x20, al - push rcx call idt_handle_pf pop rcx std + add rsp, 8 + o64 iret IntNormal 15 @@ -232,11 +215,17 @@ IntNormal 31 [extern kApicBaseAddress] __NE_INT_32: + cld + push rax mov rcx, rsp call idt_handle_scheduler pop rax + std + + add rsp, 8 + o64 iret IntNormal 33 @@ -253,10 +242,6 @@ IntNormal 39 __NE_INT_40: cld - mov al, 0x20 - out 0xA0, al - out 0x20, al - push rax mov rcx, rsp call rtl_rtl8139_interrupt_handler @@ -264,6 +249,8 @@ __NE_INT_40: std + add rsp, 8 + o64 iret IntNormal 41 @@ -283,10 +270,6 @@ IntNormal 49 __NE_INT_50: cld - mov al, 0x20 - out 0xA0, al - out 0x20, al - push rax mov rax, hal_system_call_enter @@ -303,10 +286,6 @@ __NE_INT_50: __NE_INT_51: cld - mov al, 0x20 - out 0xA0, al - out 0x20, al - push rax mov rax, hal_kernel_call_enter diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 158eaa85..00dafc7b 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -111,7 +111,7 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { Kernel::rtl_create_user_process(rtl_ne_task, "SecSrv"); Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); - + Kernel::HAL::Register64 idt_reg; idt_reg.Base = reinterpret_cast(kInterruptVectorTable); diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 3622e711..84317ad4 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -886,7 +886,7 @@ Boolean fs_init_nefs(Void) noexcept { ke_panic(RUNTIME_CHECK_FILESYSTEM, "Main disk cannot be mounted."); NeFileSystemParser parser; - + return parser.Format(&kMountpoint.A(), 0, kNeFSVolumeName); } } // namespace Kernel::NeFS diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index fe1a95ae..4f6e859e 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -268,6 +268,8 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { kLastExitCode = exit_code; + --this->ParentTeam->mProcessCount; + auto memory_ptr_list = this->HeapTree; #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ @@ -483,6 +485,8 @@ SizeT UserProcessScheduler::Run() noexcept { for (; process_index < mTeam.AsArray().Capacity(); ++process_index) { auto& process = mTeam.AsArray()[process_index]; + if (this->CurrentProcess() == process) continue; + //! Check if the process needs to be run. if (UserProcessHelper::CanBeScheduled(process)) { if (process.StackSize > kSchedMaxStackSz) { @@ -493,8 +497,6 @@ SizeT UserProcessScheduler::Run() noexcept { kout << ((*process.Name) ? process.Name : "USER_PROCESS") << " will be scheduled...\r"; - this->CurrentProcess() = process; - process.PTime = static_cast(process.Affinity); if (process.PTime < process.RTime) { @@ -509,9 +511,13 @@ SizeT UserProcessScheduler::Run() noexcept { process.RTime = 0UL; } + this->CurrentProcess() = process; + if (!UserProcessHelper::Switch(process.StackFrame, process.ProcessId)) { - continue; + break; } + + break; } else { ++process.RTime; --process.PTime; @@ -537,7 +543,7 @@ UserProcessTeam& UserProcessScheduler::CurrentTeam() { BOOL UserProcessScheduler::SwitchTeam(UserProcessTeam& team) { if (team.AsArray().Count() < 1) return No; - UserProcessScheduler::The().mTeam = team; + this->mTeam = team; return Yes; } @@ -562,13 +568,7 @@ ErrorOr UserProcessHelper::TheCurrentPID() { /// @retval true can be schedulded. /// @retval false cannot be schedulded. Bool UserProcessHelper::CanBeScheduled(const USER_PROCESS& process) { - if (process.Status == ProcessStatusKind::kKilled || - process.Status == ProcessStatusKind::kFinished || - process.Status == ProcessStatusKind::kStarting || - process.Status == ProcessStatusKind::kFrozen) - return No; - - if (process.Status == ProcessStatusKind::kInvalid) return No; + if (process.Status != ProcessStatusKind::kRunning) return No; if (!process.Name[0]) return No; diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index 987fbf0b..8ef9a013 100644 --- a/dev/kernel/src/UserProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc @@ -14,10 +14,11 @@ namespace Kernel { UserProcessTeam::UserProcessTeam() { for (SizeT i = 0U; i < this->mProcessList.Count(); ++i) { - this->mProcessList[i] = USER_PROCESS(); - this->mProcessList[i].PTime = 0; - this->mProcessList[i].RTime = 0; - this->mProcessList[i].Status = ProcessStatusKind::kKilled; + this->mProcessList[i] = USER_PROCESS(); + this->mProcessList[i].PTime = 0; + this->mProcessList[i].RTime = 0; + this->mProcessList[i].Status = ProcessStatusKind::kKilled; + this->mProcessList[i].ParentTeam = this; } this->mProcessCount = 0UL; -- cgit v1.2.3 From fc67c4af554189c941c811486a0b2b21aa3f54ea Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 23 May 2025 04:07:12 +0200 Subject: feat!(kernel): Rename NewKit to NeKit. Signed-off-by: Amlal El Mahrouss --- dev/boot/BootKit/BootKit.h | 2 +- dev/boot/modules/SysChk/SysChk.cc | 4 +- dev/boot/src/HEL/AMD64/BootEFI.cc | 4 +- dev/boot/src/HEL/ARM64/BootEFI.cc | 4 +- dev/generic_kits/BenchKit/Chrono.h | 2 +- dev/kernel/ArchKit/ArchKit.h | 6 +- dev/kernel/CFKit/GUIDWizard.h | 14 +- dev/kernel/CFKit/GUIDWrapper.h | 6 +- dev/kernel/CFKit/Property.h | 8 +- dev/kernel/CompilerKit/Detail.h | 2 +- dev/kernel/FSKit/Defines.h | 2 +- dev/kernel/FSKit/Ext2.h | 4 +- dev/kernel/FSKit/HeFS.h | 6 +- dev/kernel/FSKit/NeFS.h | 4 +- dev/kernel/FirmwareKit/CoreBoot/BootNet.h | 2 +- dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h | 2 +- dev/kernel/FirmwareKit/EFI/EFI.h | 2 +- dev/kernel/FirmwareKit/EFI/NS.h | 2 +- dev/kernel/FirmwareKit/EPM.h | 2 +- dev/kernel/FirmwareKit/GPT.h | 2 +- dev/kernel/FirmwareKit/Handover.h | 2 +- dev/kernel/GfxKit/FB.h | 17 +- dev/kernel/HALKit/AMD64/CPUID.h | 2 +- dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc | 2 +- dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 2 +- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 2 +- dev/kernel/HALKit/AMD64/HalDebugOutput.cc | 4 +- dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc | 4 +- dev/kernel/HALKit/AMD64/HalKernelPanic.cc | 6 +- dev/kernel/HALKit/AMD64/Hypervisor.h | 2 +- dev/kernel/HALKit/AMD64/Paging.h | 2 +- dev/kernel/HALKit/AMD64/Processor.h | 6 +- dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 2 +- dev/kernel/HALKit/ARM64/ApplicationProcessor.h | 2 +- dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc | 2 +- dev/kernel/HALKit/ARM64/HalDebugOutput.cc | 4 +- dev/kernel/HALKit/ARM64/HalKernelMain.cc | 2 +- dev/kernel/HALKit/ARM64/HalKernelPanic.cc | 6 +- dev/kernel/HALKit/ARM64/Paging.h | 2 +- dev/kernel/HALKit/ARM64/Processor.h | 6 +- dev/kernel/HALKit/POWER/AP.h | 2 +- dev/kernel/HALKit/POWER/Processor.h | 4 +- dev/kernel/HALKit/RISCV/AP.h | 2 +- dev/kernel/KernelKit/BinaryMutex.h | 2 +- dev/kernel/KernelKit/CoreProcessScheduler.h | 4 +- dev/kernel/KernelKit/DebugOutput.h | 6 +- dev/kernel/KernelKit/Defines.h | 9 +- dev/kernel/KernelKit/DeviceMgr.h | 4 +- dev/kernel/KernelKit/DriveMgr.h | 6 +- dev/kernel/KernelKit/FileMgr.h | 6 +- dev/kernel/KernelKit/HardwareThreadScheduler.h | 2 +- dev/kernel/KernelKit/IDylibObject.h | 2 +- dev/kernel/KernelKit/IPEFDylibObject.h | 2 +- dev/kernel/KernelKit/KPC.h | 2 +- dev/kernel/KernelKit/LoaderInterface.h | 4 +- dev/kernel/KernelKit/LockDelegate.h | 4 +- dev/kernel/KernelKit/MSDOS.h | 2 +- dev/kernel/KernelKit/MemoryMgr.h | 2 +- dev/kernel/KernelKit/PCI/DMA.h | 6 +- dev/kernel/KernelKit/PCI/Database.h | 2 +- dev/kernel/KernelKit/PCI/Device.h | 2 +- dev/kernel/KernelKit/PCI/Express.h | 2 +- dev/kernel/KernelKit/PCI/IO.h | 6 +- dev/kernel/KernelKit/PCI/Iterator.h | 6 +- dev/kernel/KernelKit/PCI/PCI.h | 2 +- dev/kernel/KernelKit/PE.h | 2 +- dev/kernel/KernelKit/PECodeMgr.h | 4 +- dev/kernel/KernelKit/PEF.h | 2 +- dev/kernel/KernelKit/PEFCodeMgr.h | 4 +- dev/kernel/KernelKit/Semaphore.h | 2 +- dev/kernel/KernelKit/ThreadLocalStorage.h | 4 +- dev/kernel/KernelKit/User.h | 4 +- dev/kernel/KernelKit/UserProcessScheduler.h | 2 +- dev/kernel/KernelKit/XCOFF.h | 2 +- dev/kernel/NeKit/Array.h | 46 +++++ dev/kernel/NeKit/ArrayList.h | 44 +++++ dev/kernel/NeKit/Atom.h | 33 ++++ dev/kernel/NeKit/Crc32.h | 22 +++ dev/kernel/NeKit/CxxAbi.h | 26 +++ dev/kernel/NeKit/Defines.h | 176 ++++++++++++++++++ dev/kernel/NeKit/ErrorOr.h | 56 ++++++ dev/kernel/NeKit/Function.h | 51 ++++++ dev/kernel/NeKit/Json.h | 129 +++++++++++++ dev/kernel/NeKit/KString.h | 82 +++++++++ dev/kernel/NeKit/KernelPanic.h | 69 +++++++ dev/kernel/NeKit/Macros.h | 148 +++++++++++++++ dev/kernel/NeKit/MutableArray.h | 203 +++++++++++++++++++++ dev/kernel/NeKit/NeKit.h | 20 ++ dev/kernel/NeKit/New.h | 20 ++ dev/kernel/NeKit/OwnPtr.h | 68 +++++++ dev/kernel/NeKit/PageMgr.h | 76 ++++++++ dev/kernel/NeKit/Pair.h | 13 ++ dev/kernel/NeKit/Pmm.h | 39 ++++ dev/kernel/NeKit/Ref.h | 79 ++++++++ dev/kernel/NeKit/Stream.h | 45 +++++ dev/kernel/NeKit/Utils.h | 34 ++++ dev/kernel/NeKit/Variant.h | 61 +++++++ dev/kernel/NetworkKit/IP.h | 6 +- dev/kernel/NetworkKit/IPC.h | 4 +- dev/kernel/NetworkKit/LTE.h | 4 +- dev/kernel/NetworkKit/MAC.h | 6 +- dev/kernel/NewKit/Array.h | 46 ----- dev/kernel/NewKit/ArrayList.h | 44 ----- dev/kernel/NewKit/Atom.h | 33 ---- dev/kernel/NewKit/Crc32.h | 22 --- dev/kernel/NewKit/CxxAbi.h | 26 --- dev/kernel/NewKit/Defines.h | 176 ------------------ dev/kernel/NewKit/ErrorOr.h | 56 ------ dev/kernel/NewKit/Function.h | 40 ---- dev/kernel/NewKit/Json.h | 129 ------------- dev/kernel/NewKit/KString.h | 82 --------- dev/kernel/NewKit/KernelPanic.h | 69 ------- dev/kernel/NewKit/Macros.h | 148 --------------- dev/kernel/NewKit/MutableArray.h | 203 --------------------- dev/kernel/NewKit/New.h | 20 -- dev/kernel/NewKit/NewKit.h | 20 -- dev/kernel/NewKit/OwnPtr.h | 68 ------- dev/kernel/NewKit/PageMgr.h | 76 -------- dev/kernel/NewKit/Pair.h | 13 -- dev/kernel/NewKit/Pmm.h | 39 ---- dev/kernel/NewKit/Ref.h | 79 -------- dev/kernel/NewKit/Stream.h | 45 ----- dev/kernel/NewKit/Utils.h | 34 ---- dev/kernel/NewKit/Variant.h | 61 ------- dev/kernel/SignalKit/Signals.h | 2 +- dev/kernel/StorageKit/AHCI.h | 2 +- dev/kernel/StorageKit/ATA.h | 4 +- dev/kernel/StorageKit/PRDT.h | 2 +- dev/kernel/SwapKit/DiskSwap.h | 2 +- dev/kernel/src/ACPIFactoryInterface.cc | 2 +- dev/kernel/src/Array.cc | 2 +- dev/kernel/src/ArrayList.cc | 2 +- dev/kernel/src/Atom.cc | 2 +- dev/kernel/src/BitMapMgr.cc | 2 +- dev/kernel/src/CodeMgr.cc | 2 +- dev/kernel/src/Crc32.cc | 2 +- dev/kernel/src/CxxAbi-AMD64.cc | 2 +- dev/kernel/src/CxxAbi-ARM64.cc | 2 +- dev/kernel/src/Defines.cc | 2 +- dev/kernel/src/DriveMgr.cc | 2 +- dev/kernel/src/ErrorOr.cc | 2 +- dev/kernel/src/FS/Ext2+FileSystemParser.cc | 8 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 8 +- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 8 +- dev/kernel/src/FileMgr.cc | 2 +- dev/kernel/src/GUIDWizard.cc | 2 +- dev/kernel/src/IPEFDylibObject.cc | 2 +- dev/kernel/src/IndexableProperty.cc | 4 +- dev/kernel/src/Json.cc | 2 +- dev/kernel/src/KPC.cc | 2 +- dev/kernel/src/KString.cc | 4 +- dev/kernel/src/MemoryMgr.cc | 6 +- dev/kernel/src/MutableArray.cc | 2 +- dev/kernel/src/Network/IPAddr.cc | 2 +- dev/kernel/src/Network/NetworkDevice.cc | 2 +- dev/kernel/src/New+Delete.cc | 2 +- dev/kernel/src/OwnPtr.cc | 2 +- dev/kernel/src/PEFCodeMgr.cc | 8 +- dev/kernel/src/PRDT.cc | 2 +- dev/kernel/src/PageMgr.cc | 2 +- dev/kernel/src/Pmm.cc | 2 +- dev/kernel/src/Ref.cc | 2 +- dev/kernel/src/Stream.cc | 2 +- dev/kernel/src/ThreadLocalStorage.cc | 2 +- dev/kernel/src/User.cc | 2 +- dev/kernel/src/UserProcessScheduler.cc | 4 +- dev/kernel/src/UtfUtils.cc | 2 +- dev/kernel/src/Utils.cc | 2 +- dev/kernel/src/Variant.cc | 2 +- dev/modules/ACPI/ACPI.h | 2 +- dev/modules/ACPI/ACPIFactoryInterface.h | 6 +- dev/modules/AHCI/AHCI.h | 2 +- dev/modules/APM/APM.h | 2 +- dev/modules/ATA/ATA.h | 2 +- dev/modules/CoreGfx/CoreAccess.h | 2 +- dev/modules/CoreGfx/CoreGfx.h | 2 +- dev/modules/CoreGfx/TextGfx.h | 2 +- dev/modules/HPET/Defines.h | 2 +- dev/modules/LTE/LTE.h | 4 +- dev/modules/MBCI/MBCI.h | 2 +- dev/modules/NVME/NVME.h | 2 +- dev/modules/Power/PowerFactory.h | 6 +- dev/modules/SCSI/SCSI.h | 2 +- dev/modules/XHCI/XHCI.h | 2 +- .../KernelTest.fwrk/headers/KernelTest.h | 4 +- 185 files changed, 1776 insertions(+), 1757 deletions(-) create mode 100644 dev/kernel/NeKit/Array.h create mode 100644 dev/kernel/NeKit/ArrayList.h create mode 100644 dev/kernel/NeKit/Atom.h create mode 100644 dev/kernel/NeKit/Crc32.h create mode 100644 dev/kernel/NeKit/CxxAbi.h create mode 100644 dev/kernel/NeKit/Defines.h create mode 100644 dev/kernel/NeKit/ErrorOr.h create mode 100644 dev/kernel/NeKit/Function.h create mode 100644 dev/kernel/NeKit/Json.h create mode 100644 dev/kernel/NeKit/KString.h create mode 100644 dev/kernel/NeKit/KernelPanic.h create mode 100644 dev/kernel/NeKit/Macros.h create mode 100644 dev/kernel/NeKit/MutableArray.h create mode 100644 dev/kernel/NeKit/NeKit.h create mode 100644 dev/kernel/NeKit/New.h create mode 100644 dev/kernel/NeKit/OwnPtr.h create mode 100644 dev/kernel/NeKit/PageMgr.h create mode 100644 dev/kernel/NeKit/Pair.h create mode 100644 dev/kernel/NeKit/Pmm.h create mode 100644 dev/kernel/NeKit/Ref.h create mode 100644 dev/kernel/NeKit/Stream.h create mode 100644 dev/kernel/NeKit/Utils.h create mode 100644 dev/kernel/NeKit/Variant.h delete mode 100644 dev/kernel/NewKit/Array.h delete mode 100644 dev/kernel/NewKit/ArrayList.h delete mode 100644 dev/kernel/NewKit/Atom.h delete mode 100644 dev/kernel/NewKit/Crc32.h delete mode 100644 dev/kernel/NewKit/CxxAbi.h delete mode 100644 dev/kernel/NewKit/Defines.h delete mode 100644 dev/kernel/NewKit/ErrorOr.h delete mode 100644 dev/kernel/NewKit/Function.h delete mode 100644 dev/kernel/NewKit/Json.h delete mode 100644 dev/kernel/NewKit/KString.h delete mode 100644 dev/kernel/NewKit/KernelPanic.h delete mode 100644 dev/kernel/NewKit/Macros.h delete mode 100644 dev/kernel/NewKit/MutableArray.h delete mode 100644 dev/kernel/NewKit/New.h delete mode 100644 dev/kernel/NewKit/NewKit.h delete mode 100644 dev/kernel/NewKit/OwnPtr.h delete mode 100644 dev/kernel/NewKit/PageMgr.h delete mode 100644 dev/kernel/NewKit/Pair.h delete mode 100644 dev/kernel/NewKit/Pmm.h delete mode 100644 dev/kernel/NewKit/Ref.h delete mode 100644 dev/kernel/NewKit/Stream.h delete mode 100644 dev/kernel/NewKit/Utils.h delete mode 100644 dev/kernel/NewKit/Variant.h (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h index 85de8d86..68e4b484 100644 --- a/dev/boot/BootKit/BootKit.h +++ b/dev/boot/BootKit/BootKit.h @@ -24,7 +24,7 @@ /// Include other APIs. /***********************************************************************************/ -#include +#include #include #include diff --git a/dev/boot/modules/SysChk/SysChk.cc b/dev/boot/modules/SysChk/SysChk.cc index 1601148e..ea3b1d6f 100644 --- a/dev/boot/modules/SysChk/SysChk.cc +++ b/dev/boot/modules/SysChk/SysChk.cc @@ -16,8 +16,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 33dfd3ca..1d46b731 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -12,8 +12,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/dev/boot/src/HEL/ARM64/BootEFI.cc b/dev/boot/src/HEL/ARM64/BootEFI.cc index 1e5b62f3..be2d8acd 100644 --- a/dev/boot/src/HEL/ARM64/BootEFI.cc +++ b/dev/boot/src/HEL/ARM64/BootEFI.cc @@ -12,8 +12,8 @@ #include #include #include -#include -#include +#include +#include #include #include diff --git a/dev/generic_kits/BenchKit/Chrono.h b/dev/generic_kits/BenchKit/Chrono.h index 98f3d980..b4010460 100644 --- a/dev/generic_kits/BenchKit/Chrono.h +++ b/dev/generic_kits/BenchKit/Chrono.h @@ -7,7 +7,7 @@ Copyright (C) 2025, Amlal El Mahrouss, all rights reserved. #ifndef BENCHKIT_CHRONO_H #define BENCHKIT_CHRONO_H -#include +#include namespace Kernel { class ChronoInterface; diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index d511658f..3254bae7 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include #include diff --git a/dev/kernel/CFKit/GUIDWizard.h b/dev/kernel/CFKit/GUIDWizard.h index ae62b8fc..c7cb18ac 100644 --- a/dev/kernel/CFKit/GUIDWizard.h +++ b/dev/kernel/CFKit/GUIDWizard.h @@ -7,13 +7,13 @@ #pragma once #include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include namespace CF::XRN::Version1 { using namespace Kernel; diff --git a/dev/kernel/CFKit/GUIDWrapper.h b/dev/kernel/CFKit/GUIDWrapper.h index cc01bfad..a3920357 100644 --- a/dev/kernel/CFKit/GUIDWrapper.h +++ b/dev/kernel/CFKit/GUIDWrapper.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include /* GUID for C++ classes. */ diff --git a/dev/kernel/CFKit/Property.h b/dev/kernel/CFKit/Property.h index 4dde15f9..9d35dc60 100644 --- a/dev/kernel/CFKit/Property.h +++ b/dev/kernel/CFKit/Property.h @@ -8,10 +8,10 @@ #define CFKIT_PROPS_H #include -#include -#include -#include -#include +#include +#include +#include +#include #define kMaxPropLen (256U) diff --git a/dev/kernel/CompilerKit/Detail.h b/dev/kernel/CompilerKit/Detail.h index 863ca145..a86f4dd3 100644 --- a/dev/kernel/CompilerKit/Detail.h +++ b/dev/kernel/CompilerKit/Detail.h @@ -7,7 +7,7 @@ #pragma once #ifdef __NEOSKRNL__ -#include +#include #endif // ifdef __NEOSKRNL__ #define NE_COPY_DELETE(KLASS) \ diff --git a/dev/kernel/FSKit/Defines.h b/dev/kernel/FSKit/Defines.h index c4c4e497..9e22a638 100644 --- a/dev/kernel/FSKit/Defines.h +++ b/dev/kernel/FSKit/Defines.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define FSKIT_VERSION "1.0.0" #define FSKIT_VERSION_BCD 0x0100 diff --git a/dev/kernel/FSKit/Ext2.h b/dev/kernel/FSKit/Ext2.h index 17645139..35129dcd 100644 --- a/dev/kernel/FSKit/Ext2.h +++ b/dev/kernel/FSKit/Ext2.h @@ -8,8 +8,8 @@ #include #include -#include -#include +#include +#include #include /// @file Ext2.h diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 5f0dcddf..17a174e3 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -9,9 +9,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include /// @file HeFS.h diff --git a/dev/kernel/FSKit/NeFS.h b/dev/kernel/FSKit/NeFS.h index 588cbe69..f265c4a6 100644 --- a/dev/kernel/FSKit/NeFS.h +++ b/dev/kernel/FSKit/NeFS.h @@ -18,8 +18,8 @@ default. #include #include -#include -#include +#include +#include #include /** diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h index 6639d9e3..b05f382e 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h +++ b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define kBootNetINetMagic "NETB" #define kBootNetINetMagicLength (4) diff --git a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h index 2b274f21..9e756a70 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h +++ b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h @@ -6,7 +6,7 @@ #pragma once -#include +#include namespace Firmware::Detail::CoreBoot { using namespace Kernel; diff --git a/dev/kernel/FirmwareKit/EFI/EFI.h b/dev/kernel/FirmwareKit/EFI/EFI.h index e2fa3843..3512191a 100644 --- a/dev/kernel/FirmwareKit/EFI/EFI.h +++ b/dev/kernel/FirmwareKit/EFI/EFI.h @@ -11,7 +11,7 @@ @brief Implementation of the main EFI protocols. */ -#include +#include using namespace Kernel; diff --git a/dev/kernel/FirmwareKit/EFI/NS.h b/dev/kernel/FirmwareKit/EFI/NS.h index f5a28e10..910b2c36 100644 --- a/dev/kernel/FirmwareKit/EFI/NS.h +++ b/dev/kernel/FirmwareKit/EFI/NS.h @@ -6,7 +6,7 @@ #pragma once -#include +#include namespace Firmware::Detail::EFI { using namespace Kernel; diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h index 27d635f3..05291929 100644 --- a/dev/kernel/FirmwareKit/EPM.h +++ b/dev/kernel/FirmwareKit/EPM.h @@ -11,7 +11,7 @@ #ifndef FIRMWAREKIT_EPM_H #define FIRMWAREKIT_EPM_H -#include +#include #define kEPMNameLength (32) #define kEPMFilesystemLength (16) diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index 7e5a910b..370f2517 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #define kSectorAlignGPT_PartTbl (420U) #define kSectorAlignGPT_PartEntry (72U) diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index cda27e52..7689f38c 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -18,7 +18,7 @@ #pragma once #include -#include +#include #define kHandoverMagic (0xBADCC) #define kHandoverVersion (0x0117) diff --git a/dev/kernel/GfxKit/FB.h b/dev/kernel/GfxKit/FB.h index 33895ce6..e30f1800 100644 --- a/dev/kernel/GfxKit/FB.h +++ b/dev/kernel/GfxKit/FB.h @@ -13,16 +13,21 @@ namespace Kernel { class FBDeviceInterface; struct FBDevicePacket; +typedef UInt32 FBCoord2x2; +typedef UInt32 FBDim2x2; +typedef UInt32 FBColorProfile; +typedef UInt32 FBFlags; + /// @brief Framebuffer device interface packet. /// @details This structure is used to send and receive data from the framebuffer device. /// @note The structure is packed to ensure that the data is aligned correctly for the device. struct PACKED FBDevicePacket final { - UInt32 fX; - UInt32 fY; - UInt32 fWidth; - UInt32 fHeight; - UInt32 fColor; - UInt32 fFlags; + FBCoord2x2 fX; + FBCoord2x2 fY; + FBDim2x2 fWidth; + FBDim2x2 fHeight; + FBColorProfile fColor; + FBFlags fFlags; }; /// @brief Framebuffer device interface. diff --git a/dev/kernel/HALKit/AMD64/CPUID.h b/dev/kernel/HALKit/AMD64/CPUID.h index 8250dfad..cc3bd25e 100644 --- a/dev/kernel/HALKit/AMD64/CPUID.h +++ b/dev/kernel/HALKit/AMD64/CPUID.h @@ -13,7 +13,7 @@ #pragma once -#include +#include EXTERN_C { #include diff --git a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc index f4dd1347..e2b89765 100644 --- a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc +++ b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include namespace Kernel { diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index ada2ee3f..17d4690f 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index 633adccb..9da31800 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -6,7 +6,7 @@ #include #include -#include +#include #include EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc index 5d14f214..b0463eb5 100644 --- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc @@ -6,8 +6,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index 95d7a8ca..f9749946 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -27,7 +27,7 @@ Void IDTLoader::Load(Register64& idt) { #ifndef __NE_MODULAR_KERNEL_COMPONENTS__ rt_cli(); - volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**) idt.Base; + volatile UIntPtr** ptr_ivt = (volatile UIntPtr**) idt.Base; for (SizeT idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; @@ -47,7 +47,7 @@ Void IDTLoader::Load(Register64& idt) { hal_load_idt(idt); rt_sti(); -#endif // __NE_MODULAR_KERNEL_COMPONENTS__ +#endif // __NE_MODULAR_KERNEL_COMPONENTS__ return; } diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc index 76b92574..374c7302 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc @@ -9,9 +9,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/dev/kernel/HALKit/AMD64/Hypervisor.h b/dev/kernel/HALKit/AMD64/Hypervisor.h index df88b02b..5702c8e2 100644 --- a/dev/kernel/HALKit/AMD64/Hypervisor.h +++ b/dev/kernel/HALKit/AMD64/Hypervisor.h @@ -6,7 +6,7 @@ #pragma once -#include +#include namespace Kernel { MAKE_STRING_ENUM(HYPERVISOR) diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index b73b8604..079acde4 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -14,7 +14,7 @@ ------------------------------------------------------- */ -#include +#include #ifndef kPageMax #define kPageMax (0x200) diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 3bf0ad3e..5a70b465 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -17,9 +17,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 246c2e02..b530a730 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h index 06a8e2a8..3d472bf0 100644 --- a/dev/kernel/HALKit/ARM64/ApplicationProcessor.h +++ b/dev/kernel/HALKit/ARM64/ApplicationProcessor.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include /************************************************** */ /* INITIALIZE THE GIC ON THE CURRENT CORE. */ diff --git a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc index 31f5a4f2..660110b2 100644 --- a/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc +++ b/dev/kernel/HALKit/ARM64/HalACPIFactoryInterface.cc @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include diff --git a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc index 7ec90c6e..3c518e2f 100644 --- a/dev/kernel/HALKit/ARM64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/ARM64/HalDebugOutput.cc @@ -6,8 +6,8 @@ #include #include -#include -#include +#include +#include namespace Kernel { EXTERN_C void ke_io_write(IDeviceObject* self, const Char* bytes) { diff --git a/dev/kernel/HALKit/ARM64/HalKernelMain.cc b/dev/kernel/HALKit/ARM64/HalKernelMain.cc index c92b12cd..6f3f3d12 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelMain.cc @@ -15,8 +15,8 @@ #include #include #include +#include #include -#include #include #include diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc index c3d3175c..5feb6c75 100644 --- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc +++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc @@ -9,9 +9,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/dev/kernel/HALKit/ARM64/Paging.h b/dev/kernel/HALKit/ARM64/Paging.h index 88eedcd8..5001871b 100644 --- a/dev/kernel/HALKit/ARM64/Paging.h +++ b/dev/kernel/HALKit/ARM64/Paging.h @@ -14,7 +14,7 @@ #ifdef __NE_ARM64__ -#include +#include #ifndef kPageMax #define kPageMax (0x200) diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index ba1ed11e..38669b2f 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -9,9 +9,9 @@ #ifdef __NE_ARM64__ #include -#include -#include -#include +#include +#include +#include #define kCPUBackendName "aarch64" diff --git a/dev/kernel/HALKit/POWER/AP.h b/dev/kernel/HALKit/POWER/AP.h index f938d6a1..92007da3 100644 --- a/dev/kernel/HALKit/POWER/AP.h +++ b/dev/kernel/HALKit/POWER/AP.h @@ -13,7 +13,7 @@ #pragma once -#include +#include namespace Kernel { struct HAL_HARDWARE_THREAD; diff --git a/dev/kernel/HALKit/POWER/Processor.h b/dev/kernel/HALKit/POWER/Processor.h index d50c4ff2..8b75bcc8 100644 --- a/dev/kernel/HALKit/POWER/Processor.h +++ b/dev/kernel/HALKit/POWER/Processor.h @@ -8,8 +8,8 @@ #pragma once -#include -#include +#include +#include #define rtl_nop_op() asm volatile("mr 0, 0") #define kHalPPCAlignment __attribute__((aligned(4))) diff --git a/dev/kernel/HALKit/RISCV/AP.h b/dev/kernel/HALKit/RISCV/AP.h index 0e94fd97..79b0d038 100644 --- a/dev/kernel/HALKit/RISCV/AP.h +++ b/dev/kernel/HALKit/RISCV/AP.h @@ -13,7 +13,7 @@ #pragma once -#include +#include namespace Kernel { typedef Int64 hal_ap_kind; diff --git a/dev/kernel/KernelKit/BinaryMutex.h b/dev/kernel/KernelKit/BinaryMutex.h index a1cd5b7c..45d4bd8d 100644 --- a/dev/kernel/KernelKit/BinaryMutex.h +++ b/dev/kernel/KernelKit/BinaryMutex.h @@ -8,7 +8,7 @@ #include #include -#include +#include namespace Kernel { class USER_PROCESS; diff --git a/dev/kernel/KernelKit/CoreProcessScheduler.h b/dev/kernel/KernelKit/CoreProcessScheduler.h index 6ac55424..5ba29d3a 100644 --- a/dev/kernel/KernelKit/CoreProcessScheduler.h +++ b/dev/kernel/KernelKit/CoreProcessScheduler.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include #define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) diff --git a/dev/kernel/KernelKit/DebugOutput.h b/dev/kernel/KernelKit/DebugOutput.h index cf9378a9..9598f590 100644 --- a/dev/kernel/KernelKit/DebugOutput.h +++ b/dev/kernel/KernelKit/DebugOutput.h @@ -8,9 +8,9 @@ #include #include -#include -#include -#include +#include +#include +#include #define kDebugUnboundPort 0x0FEED diff --git a/dev/kernel/KernelKit/Defines.h b/dev/kernel/KernelKit/Defines.h index 2c170940..975520b6 100644 --- a/dev/kernel/KernelKit/Defines.h +++ b/dev/kernel/KernelKit/Defines.h @@ -6,11 +6,14 @@ #pragma once -#include +#include -#define KERNELKIT_VERSION "0.0.1" +#define KERNELKIT_VERSION "0.0.1-kernelkit" #define KERNELKIT_VERSION_BCD 0x0001 +namespace Kernel { class UserProcessScheduler; class IDylibObject; -class Process; +class USER_PROCESS; +class KERNEL_TASK; +} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/KernelKit/DeviceMgr.h b/dev/kernel/KernelKit/DeviceMgr.h index 210cef2a..8d749ec9 100644 --- a/dev/kernel/KernelKit/DeviceMgr.h +++ b/dev/kernel/KernelKit/DeviceMgr.h @@ -19,8 +19,8 @@ /* @file KernelKit/DeviceMgr.h */ /* @brief Device abstraction and I/O buffer. */ -#include -#include +#include +#include #define kDeviceMgrRootDirPath "/devices/" diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index 7972ac74..684e2e5c 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -12,9 +12,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #define kDriveMaxCount (4U) #define kDriveSectorSz (512U) diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 32c30b70..86354d7f 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -30,9 +30,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include /// @brief Filesystem manager, abstraction over mounted filesystem. diff --git a/dev/kernel/KernelKit/HardwareThreadScheduler.h b/dev/kernel/KernelKit/HardwareThreadScheduler.h index 11347c7e..a10d3a9e 100644 --- a/dev/kernel/KernelKit/HardwareThreadScheduler.h +++ b/dev/kernel/KernelKit/HardwareThreadScheduler.h @@ -9,7 +9,7 @@ #include #include -#include +#include /// @note Last Rev Sun 28 Jul CET 2024 /// @note Last Rev Thu, Aug 1, 2024 9:07:38 AM diff --git a/dev/kernel/KernelKit/IDylibObject.h b/dev/kernel/KernelKit/IDylibObject.h index 7a7cd913..da6c3a7a 100644 --- a/dev/kernel/KernelKit/IDylibObject.h +++ b/dev/kernel/KernelKit/IDylibObject.h @@ -10,7 +10,7 @@ #pragma once #include -#include +#include #define NE_DYLIB_OBJECT : public IDylibObject diff --git a/dev/kernel/KernelKit/IPEFDylibObject.h b/dev/kernel/KernelKit/IPEFDylibObject.h index 42ed1830..f4461a69 100644 --- a/dev/kernel/KernelKit/IPEFDylibObject.h +++ b/dev/kernel/KernelKit/IPEFDylibObject.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace Kernel { /** diff --git a/dev/kernel/KernelKit/KPC.h b/dev/kernel/KernelKit/KPC.h index 4c48b53a..944c8efc 100644 --- a/dev/kernel/KernelKit/KPC.h +++ b/dev/kernel/KernelKit/KPC.h @@ -6,7 +6,7 @@ #pragma once -#include +#include /// @file KPC.h /// @brief Kernel Procedure Code. diff --git a/dev/kernel/KernelKit/LoaderInterface.h b/dev/kernel/KernelKit/LoaderInterface.h index 2b38ddbf..1f9b1e56 100644 --- a/dev/kernel/KernelKit/LoaderInterface.h +++ b/dev/kernel/KernelKit/LoaderInterface.h @@ -7,8 +7,8 @@ #pragma once #include -#include -#include +#include +#include #include namespace Kernel { diff --git a/dev/kernel/KernelKit/LockDelegate.h b/dev/kernel/KernelKit/LockDelegate.h index 18ab0cf5..a8162897 100644 --- a/dev/kernel/KernelKit/LockDelegate.h +++ b/dev/kernel/KernelKit/LockDelegate.h @@ -6,8 +6,8 @@ #pragma once -#include -#include +#include +#include namespace Kernel { enum { diff --git a/dev/kernel/KernelKit/MSDOS.h b/dev/kernel/KernelKit/MSDOS.h index a0751a6f..b4ffeff2 100644 --- a/dev/kernel/KernelKit/MSDOS.h +++ b/dev/kernel/KernelKit/MSDOS.h @@ -15,7 +15,7 @@ #define __MSDOS_EXEC__ #include -#include +#include // Last Rev // Sat Feb 24 CET 2024 diff --git a/dev/kernel/KernelKit/MemoryMgr.h b/dev/kernel/KernelKit/MemoryMgr.h index bf389955..7ca7da90 100644 --- a/dev/kernel/KernelKit/MemoryMgr.h +++ b/dev/kernel/KernelKit/MemoryMgr.h @@ -12,7 +12,7 @@ /// @brief: Memory allocation support for the NeKernel. #include -#include +#include #include namespace Kernel { diff --git a/dev/kernel/KernelKit/PCI/DMA.h b/dev/kernel/KernelKit/PCI/DMA.h index cad27a7a..7e7d3f0c 100644 --- a/dev/kernel/KernelKit/PCI/DMA.h +++ b/dev/kernel/KernelKit/PCI/DMA.h @@ -8,9 +8,9 @@ #include #include -#include -#include -#include +#include +#include +#include namespace Kernel { enum class DmaKind { diff --git a/dev/kernel/KernelKit/PCI/Database.h b/dev/kernel/KernelKit/PCI/Database.h index 6da653dd..093338da 100644 --- a/dev/kernel/KernelKit/PCI/Database.h +++ b/dev/kernel/KernelKit/PCI/Database.h @@ -6,7 +6,7 @@ #pragma once #include -#include +#include namespace Kernel { namespace Types { diff --git a/dev/kernel/KernelKit/PCI/Device.h b/dev/kernel/KernelKit/PCI/Device.h index d9bb4e70..f41e0575 100644 --- a/dev/kernel/KernelKit/PCI/Device.h +++ b/dev/kernel/KernelKit/PCI/Device.h @@ -5,7 +5,7 @@ ------------------------------------------- */ #pragma once -#include +#include namespace Kernel::PCI { enum class PciConfigKind : UShort { diff --git a/dev/kernel/KernelKit/PCI/Express.h b/dev/kernel/KernelKit/PCI/Express.h index 4d94830c..c9d65da7 100644 --- a/dev/kernel/KernelKit/PCI/Express.h +++ b/dev/kernel/KernelKit/PCI/Express.h @@ -7,6 +7,6 @@ #pragma once #include -#include +#include #define PCI_EXPRESS_BUS_COUNT (4096) diff --git a/dev/kernel/KernelKit/PCI/IO.h b/dev/kernel/KernelKit/PCI/IO.h index bd5751ec..a7abc163 100644 --- a/dev/kernel/KernelKit/PCI/IO.h +++ b/dev/kernel/KernelKit/PCI/IO.h @@ -7,9 +7,9 @@ #pragma once #include -#include -#include -#include +#include +#include +#include namespace Kernel { template diff --git a/dev/kernel/KernelKit/PCI/Iterator.h b/dev/kernel/KernelKit/PCI/Iterator.h index 10924bc8..d4c89404 100644 --- a/dev/kernel/KernelKit/PCI/Iterator.h +++ b/dev/kernel/KernelKit/PCI/Iterator.h @@ -9,9 +9,9 @@ #include #include -#include -#include -#include +#include +#include +#include #define NE_BUS_COUNT (256) #define NE_DEVICE_COUNT (33) diff --git a/dev/kernel/KernelKit/PCI/PCI.h b/dev/kernel/KernelKit/PCI/PCI.h index 7b30d455..d8805a0c 100644 --- a/dev/kernel/KernelKit/PCI/PCI.h +++ b/dev/kernel/KernelKit/PCI/PCI.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define kPCIConfigAddressPort (0xCF8) #define kPCIConfigDataPort (0xCFC) diff --git a/dev/kernel/KernelKit/PE.h b/dev/kernel/KernelKit/PE.h index b961e901..df5047a3 100644 --- a/dev/kernel/KernelKit/PE.h +++ b/dev/kernel/KernelKit/PE.h @@ -14,7 +14,7 @@ #ifndef __KERNELKIT_INC_PE_H__ #define __KERNELKIT_INC_PE_H__ -#include +#include #define kPeSignature (0x00004550) diff --git a/dev/kernel/KernelKit/PECodeMgr.h b/dev/kernel/KernelKit/PECodeMgr.h index 05a2674c..15c2b7ee 100644 --- a/dev/kernel/KernelKit/PECodeMgr.h +++ b/dev/kernel/KernelKit/PECodeMgr.h @@ -22,8 +22,8 @@ #include #include #include -#include -#include +#include +#include #ifndef INC_PROCESS_SCHEDULER_H #include diff --git a/dev/kernel/KernelKit/PEF.h b/dev/kernel/KernelKit/PEF.h index 9381e491..c28c8f8c 100644 --- a/dev/kernel/KernelKit/PEF.h +++ b/dev/kernel/KernelKit/PEF.h @@ -16,7 +16,7 @@ #include #include -#include +#include #define kPefMagic "Joy!" #define kPefMagicFat "yoJ!" diff --git a/dev/kernel/KernelKit/PEFCodeMgr.h b/dev/kernel/KernelKit/PEFCodeMgr.h index a637892f..18041f8f 100644 --- a/dev/kernel/KernelKit/PEFCodeMgr.h +++ b/dev/kernel/KernelKit/PEFCodeMgr.h @@ -9,8 +9,8 @@ #include #include -#include -#include +#include +#include #ifndef INC_PROCESS_SCHEDULER_H #include diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 9a66b9fe..a1b5ecad 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -8,7 +8,7 @@ #include #include -#include +#include namespace Kernel { typedef Int64 Semaphore; diff --git a/dev/kernel/KernelKit/ThreadLocalStorage.h b/dev/kernel/KernelKit/ThreadLocalStorage.h index bf34f39a..6c764221 100644 --- a/dev/kernel/KernelKit/ThreadLocalStorage.h +++ b/dev/kernel/KernelKit/ThreadLocalStorage.h @@ -7,8 +7,8 @@ #ifndef KERNELKIT_TLS_H #define KERNELKIT_TLS_H -#include -#include +#include +#include ///! @brief Thread Local Storage for neoskrnl. diff --git a/dev/kernel/KernelKit/User.h b/dev/kernel/KernelKit/User.h index 2a12e41e..b7e7ac1d 100644 --- a/dev/kernel/KernelKit/User.h +++ b/dev/kernel/KernelKit/User.h @@ -17,8 +17,8 @@ #include #include -#include -#include +#include +#include ///! We got the Super, Standard (%s format) and Guest user, ///! all are used to make authorization operations on the OS. diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index a15e8e38..1815a558 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -15,7 +15,7 @@ #include #include #include -#include +#include //////////////////////////////////////////////////// // Last revision date is: Fri Mar 28 2025 // diff --git a/dev/kernel/KernelKit/XCOFF.h b/dev/kernel/KernelKit/XCOFF.h index 7b15782b..9cfe8ded 100644 --- a/dev/kernel/KernelKit/XCOFF.h +++ b/dev/kernel/KernelKit/XCOFF.h @@ -14,7 +14,7 @@ #ifndef INC_XOCFF_H #define INC_XOCFF_H -#include +#include #define kXCOFF64Magic (0x01F7) #define kXCOFF64ForkNameLen (256U) diff --git a/dev/kernel/NeKit/Array.h b/dev/kernel/NeKit/Array.h new file mode 100644 index 00000000..12c062cb --- /dev/null +++ b/dev/kernel/NeKit/Array.h @@ -0,0 +1,46 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include + +namespace Kernel { +template +class Array final { + public: + explicit Array() = default; + ~Array() = default; + + Array& operator=(const Array&) = default; + Array(const Array&) = default; + + T& operator[](SizeT at) { return fArray[at]; } + + Boolean Empty() { return this->Count() > 0; } + + SizeT Capacity() { return N; } + + SizeT Count() { + const static SizeT kArrCnt = N; + return kArrCnt; // avoid constexpr error. + } + + const T* CData() { return fArray; } + + operator bool() { return !Empty(); } + + private: + T fArray[N]; +}; + +template +auto make_list(ValueType val) { + return Array{val}; +} +} // namespace Kernel diff --git a/dev/kernel/NeKit/ArrayList.h b/dev/kernel/NeKit/ArrayList.h new file mode 100644 index 00000000..1f5226f4 --- /dev/null +++ b/dev/kernel/NeKit/ArrayList.h @@ -0,0 +1,44 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel { +template +class ArrayList final { + public: + explicit ArrayList(T* list, SizeT length) : fList(reinterpret_cast(list)) {} + + ~ArrayList() = default; + + ArrayList& operator=(const ArrayList&) = default; + ArrayList(const ArrayList&) = default; + + T* Data() { return fList; } + + const T* CData() { return fList; } + + T& operator[](SizeT index) const { + MUST_PASS(index < this->Count()); + return fList[index]; + } + + operator bool() { return fList; } + + SizeT Count() const { return fLen; } + + private: + T* fList{nullptr}; + SizeT fLen{0}; +}; + +template +ArrayList make_list(ValueType val) { + return ArrayList{val}; +} +} // namespace Kernel diff --git a/dev/kernel/NeKit/Atom.h b/dev/kernel/NeKit/Atom.h new file mode 100644 index 00000000..fce5e93d --- /dev/null +++ b/dev/kernel/NeKit/Atom.h @@ -0,0 +1,33 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ +#pragma once + +#include + +namespace Kernel { +template +class Atom final { + public: + explicit Atom() = default; + ~Atom() = default; + + public: + Atom& operator=(const Atom&) = delete; + Atom(const Atom&) = delete; + + public: + T operator[](Size bit) { return (fArrayOfAtoms & (1 << bit)); } + + void operator|(Size bit) { fArrayOfAtoms |= (1 << bit); } + + friend Boolean operator==(Atom& atomic, const T& idx) { return atomic[idx] == idx; } + + friend Boolean operator!=(Atom& atomic, const T& idx) { return atomic[idx] == idx; } + + private: + T fArrayOfAtoms; +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/Crc32.h b/dev/kernel/NeKit/Crc32.h new file mode 100644 index 00000000..8988f828 --- /dev/null +++ b/dev/kernel/NeKit/Crc32.h @@ -0,0 +1,22 @@ +/* + * ======================================================== + * + * NeKernel + * Date Added: 13/02/2023 + * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + * + * ======================================================== + */ + +#ifndef CRC32_H +#define CRC32_H + +#include + +#define kCrcCnt (256) + +namespace Kernel { +UInt32 ke_calculate_crc32(const Char* crc, Int32 len) noexcept; +} // namespace Kernel + +#endif // !CRC32_H diff --git a/dev/kernel/NeKit/CxxAbi.h b/dev/kernel/NeKit/CxxAbi.h new file mode 100644 index 00000000..164a257d --- /dev/null +++ b/dev/kernel/NeKit/CxxAbi.h @@ -0,0 +1,26 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ +#pragma once + +#include + +#ifndef __TOOLCHAINKIT__ + +#define kAtExitMacDestructors (128) + +struct atexit_func_entry_t { + void (*destructor_func)(); + void* obj_ptr; + void* dso_handle; +}; + +typedef unsigned uarch_t; + +namespace cxxabiv1 { +typedef void* __guard; +} + +#endif // __GNUC__ diff --git a/dev/kernel/NeKit/Defines.h b/dev/kernel/NeKit/Defines.h new file mode 100644 index 00000000..0f9a7c4a --- /dev/null +++ b/dev/kernel/NeKit/Defines.h @@ -0,0 +1,176 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +#define NEWKIT_VERSION_STR "0.0.1" +#define NEWKIT_VERSION_BCD 0x0001 + +#ifndef __cplusplus +#error Kernel compiles with a C++ compiler. +#endif + +#if __cplusplus <= 201703L +#define char8_t char +#endif + +#ifdef __has_feature +#if !__has_feature(cxx_nullptr) +#if !__has_nullptr +#error !!! You must at least have nullptr featured on your C++ compiler. !!! +#endif +#endif +#endif + +/// @brief The **Kernel** namespace. +namespace Kernel { +using voidPtr = void*; +using VoidPtr = void*; +using nullPtr = decltype(nullptr); +using NullPtr = decltype(nullptr); + +using Int = int; +using Int32 = int; +using UShort = unsigned short; +using UInt16 = unsigned short; +using Short = short; +using Int16 = short; +using UInt = unsigned int; +using UInt32 = unsigned int; +using Long = __INT64_TYPE__; +using Int64 = __INT64_TYPE__; +using ULong = __UINT64_TYPE__; +using UInt64 = __UINT64_TYPE__; +using Boolean = bool; +using Bool = bool; +using Char = char; +using UChar = unsigned char; +using UInt8 = unsigned char; + +using SSize = Int64; +using SSizeT = Int64; +using Size = __SIZE_TYPE__; +using SizeT = __SIZE_TYPE__; +using IntPtr = __INTPTR_TYPE__; +using UIntPtr = __UINTPTR_TYPE__; +using IntFast = __INT_FAST32_TYPE__; +using IntFast64 = __INT_FAST64_TYPE__; +using PtrDiff = __PTRDIFF_TYPE__; + +using SInt16 = Int16; +using SInt32 = Int32; +using SInt64 = Int64; + +typedef UIntPtr* Ptr64; +typedef UInt32* Ptr32; +typedef UInt8* Ptr8; + +using Utf8Char = char8_t; +using Utf16Char = char16_t; +using WideChar = wchar_t; +using Utf32Char = char32_t; + +using LongDouble = long double; +using Double = double; +using Float = float; + +typedef UInt32 PhysicalAddressKind; +typedef UIntPtr VirtualAddressKind; + +using Void = void; + +using Lba = UInt64; + +using Char16 = char16_t; + +enum class Endian : UInt8 { kEndianInvalid, kEndianBig, kEndianLittle, kEndianMixed, kEndianCount }; + +/// @brief Forward object. +/// @tparam Args the object type. +/// @param arg the object. +/// @return object's rvalue +template +inline Args&& forward(Args& arg) { + return static_cast(arg); +} + +/// @brief Move object. +/// @tparam Args the object type. +/// @param arg the object. +/// @return object's rvalue +template +inline Args&& move(Args&& arg) { + return static_cast(arg); +} + +/// @brief Encoding interface, used as a proxy to convert T to Char* +/// Used to cast A to B or B to A. +class ICodec { + public: + explicit ICodec() = default; + virtual ~ICodec() = default; + + ICodec& operator=(const ICodec&) = default; + ICodec(const ICodec&) = default; + + public: + /// @brief Convert type to bytes. + /// @tparam T the type. + /// @param type (a1) the data. + /// @return a1 as Char* + template + const Char* AsBytes(T type) noexcept { + NE_UNUSED(type); + return nullptr; + } + + /// @brief Construct from type to class. + /// @tparam T the type to convert. + /// @param type (a1) the data. + /// @return a1 as Char* + template + OutputClass* Construct(Char* type) noexcept { + FactoryClass class_fac; + return class_fac.template From(type); + } + + /// @brief Convert T class to Y class. + /// @tparam T the class type of type. + /// @tparam Y the result class. + /// @param type the class to cast. + /// @return the class as Y. + template + Y As(T type) noexcept { + if (type.template IsSerializable()) { + return reinterpret_cast(type); + } + + return type.template As(); + } +}; + +/// \brief Scheduler interface, represents a scheduler object. +/// @note This is used to schedule tasks, such as threads, drivers, user threads, etc. +class ISchedulable { + public: + explicit ISchedulable() = default; + virtual ~ISchedulable() = default; + + ISchedulable& operator=(const ISchedulable&) = default; + ISchedulable(const ISchedulable&) = default; + + /// @brief Is this object only accepting user tasks? + virtual Bool IsUser() { return NO; } + + /// @brief Is this object only accepting kernel tasks? + virtual Bool IsKernel() { return NO; } + + /// @brief Is this object offloading to another CPU? + virtual Bool HasMP() { return NO; } +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/ErrorOr.h b/dev/kernel/NeKit/ErrorOr.h new file mode 100644 index 00000000..d7751b7e --- /dev/null +++ b/dev/kernel/NeKit/ErrorOr.h @@ -0,0 +1,56 @@ +/* + * ======================================================== + * + * NeKernel + * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + * + * ======================================================== + */ + +#pragma once + +#include +#include + +namespace Kernel { +using ErrorT = UInt; + +template +class ErrorOr final { + public: + ErrorOr() = default; + ~ErrorOr() = default; + + public: + explicit ErrorOr(Int32 err) : mId(err) {} + + explicit ErrorOr(nullPtr Null) {} + + explicit ErrorOr(T* Class) : mRef(Class) {} + + explicit ErrorOr(T Class) : mRef(Class) {} + + ErrorOr& operator=(const ErrorOr&) = default; + ErrorOr(const ErrorOr&) = default; + + ErrorOr& operator=(const Ref& refErr) { + mRef = refErr; + return *this; + } + + Ref& Leak() { return mRef; } + + Int32 Error() { return mId; } + + operator bool() { return mRef; } + + BOOL HasError() { return this->mId > 0; } + + private: + Ref mRef; + UInt32 mId{0}; +}; + +using ErrorOrAny = ErrorOr; + +} // namespace Kernel diff --git a/dev/kernel/NeKit/Function.h b/dev/kernel/NeKit/Function.h new file mode 100644 index 00000000..e5d56cee --- /dev/null +++ b/dev/kernel/NeKit/Function.h @@ -0,0 +1,51 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + + +#ifndef _INC_FUNCTION_H_ +#define _INC_FUNCTION_H_ + +#include +#include + +namespace Kernel { +template +class Function final { + public: + Function() = default; + + public: + explicit Function(T (*Fn)(Args... args)) : fFn(Fn) {} + + ~Function() = default; + + Function& operator=(const Function&) = default; + Function(const Function&) = default; + + template + T operator()(Args&&... args) { + return fFn(args...); + } + + template + T Call(Args&&... args) { + return fFn(args...); + } + + operator bool() { return fFn; } + + bool operator!() { return !fFn; } + + private: + T(*fFn) + (Args... args); +}; + +template +using FunctionOr = ErrorOr>; +} // namespace Kernel + +#endif // !_INC_FUNCTION_H__ diff --git a/dev/kernel/NeKit/Json.h b/dev/kernel/NeKit/Json.h new file mode 100644 index 00000000..2b2c9c04 --- /dev/null +++ b/dev/kernel/NeKit/Json.h @@ -0,0 +1,129 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +// last-rev: 02/04/25 + +#include +#include +#include +#include +#include + +#define kJSONMaxLen (8196) +#define kJSONLen (256) +#define kJSONNullArr "[]" +#define kJSONNullObj "{}" + +namespace Kernel { +/// @brief JavaScript object class +class Json final { + public: + explicit Json() { + auto len = kJSONMaxLen; + KString key = KString(len); + key += kJSONNullObj; + + this->AsKey() = key; + this->AsValue() = key; + } + + explicit Json(SizeT lhsLen, SizeT rhsLen) : fKey(lhsLen), fValue(rhsLen) {} + + ~Json() = default; + + NE_COPY_DEFAULT(Json) + + Bool& IsUndefined() { return fUndefined; } + + private: + Bool fUndefined; // is this instance undefined? + KString fKey; + KString fValue; + + public: + /// @brief returns the key of the json + /// @return the key as string view. + KString& AsKey() { return fKey; } + + /// @brief returns the value of the json. + /// @return the key as string view. + KString& AsValue() { return fValue; } + + static Json kNull; +}; + +/// @brief Json stream reader helper. +struct JsonStreamReader final { + STATIC Json In(const Char* full_array) { + auto start_val = '{'; + auto end_val = '}'; + Boolean probe_value = false; + + if (full_array[0] != start_val) { + if (full_array[0] != '[') return Json::kNull; + + start_val = '['; + end_val = ']'; + + probe_value = true; + } + + SizeT len = rt_string_len(full_array); + + SizeT key_len = 0; + SizeT value_len = 0; + + Json type(kJSONMaxLen, kJSONMaxLen); + + for (SizeT i = 1; i < len; ++i) { + if (full_array[i] == '\r' || full_array[i] == '\n') continue; + + if (probe_value) { + if (full_array[i] == end_val || full_array[i] == ',') { + probe_value = false; + + ++value_len; + } else { + if (full_array[i] == '\'') { + type.AsValue().Data()[value_len] = 0; + break; + } + + type.AsValue().Data()[value_len] = full_array[i]; + + ++value_len; + } + } else { + if (start_val == '[') continue; + + if (full_array[i] == ':') { + type.AsKey().Data()[key_len] = 0; + ++key_len; + + ++i; + + while (full_array[i] == ' ' || full_array[i] == '\t') ++i; + + probe_value = true; + } else { + type.AsKey().Data()[key_len] = full_array[i]; + + ++key_len; + } + } + } + + type.AsValue().Data()[value_len] = 0; + + return type; + } +}; + +using JsonStream = Stream; +} // namespace Kernel diff --git a/dev/kernel/NeKit/KString.h b/dev/kernel/NeKit/KString.h new file mode 100644 index 00000000..16b09a78 --- /dev/null +++ b/dev/kernel/NeKit/KString.h @@ -0,0 +1,82 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include +#include + +#define kMinimumStringSize (8196U) + +namespace Kernel { +/// @brief Kernel string class, not dynamic. +class KString final { + public: + explicit KString() { + fDataSz = kMinimumStringSize; + + fData = new Char[fDataSz]; + MUST_PASS(fData); + + rt_set_memory(fData, 0, fDataSz); + } + + explicit KString(SizeT Sz) : fDataSz(Sz) { + MUST_PASS(Sz > 1); + + fData = new Char[Sz]; + MUST_PASS(fData); + + rt_set_memory(fData, 0, Sz); + } + + ~KString() { + if (fData) { + delete[] fData; + fData = nullptr; + } + } + + NE_COPY_DEFAULT(KString) + + Char* Data(); + const Char* CData() const; + Size Length() const; + + bool operator==(const Char* rhs) const; + bool operator!=(const Char* rhs) const; + + bool operator==(const KString& rhs) const; + bool operator!=(const KString& rhs) const; + + KString& operator+=(const Char* rhs); + KString& operator+=(const KString& rhs); + + operator bool() { return fData; } + + bool operator!() { return fData; } + + private: + Char* fData{nullptr}; + Size fDataSz{0}; + Size fCur{0}; + + friend class KStringBuilder; +}; + +class KStringBuilder final { + public: + static ErrorOr Construct(const Char* data); + static const Char* FromBool(const Char* fmt, bool n); + static const Char* Format(const Char* fmt, const Char* from); + static bool Equals(const Char* lhs, const Char* rhs); + static bool Equals(const Utf8Char* lhs, const Utf8Char* rhs); + static bool Equals(const WideChar* lhs, const WideChar* rhs); +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/KernelPanic.h b/dev/kernel/NeKit/KernelPanic.h new file mode 100644 index 00000000..753b18de --- /dev/null +++ b/dev/kernel/NeKit/KernelPanic.h @@ -0,0 +1,69 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel { +void ke_runtime_check(bool expr, const Char* file, const Char* line); +} + +#define MUST_PASS_COMPILER(EXPR, MSG) static_assert(EXPR, MSG) + +#ifdef TRY +#undef TRY +#endif + +#define TRY(X) \ + { \ + auto fn = X; \ + if ((fn()) == NO) { \ + MUST_PASS(NO); \ + } \ + } + +#ifdef __MUST_PASS +#undef __MUST_PASS +#endif + +#define __MUST_PASS(EXPR, FILE, LINE) Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) + +#ifdef __DEBUG__ +#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) +#define assert(EXPR) MUST_PASS(EXPR) +#else +#define MUST_PASS(EXPR) (Kernel::Void)(EXPR) +#define assert(EXPR) (Kernel::Void)(EXPR) +#endif + +enum RUNTIME_CHECK { + RUNTIME_CHECK_FAILED = 1111, + RUNTIME_CHECK_POINTER, + RUNTIME_CHECK_EXPRESSION, + RUNTIME_CHECK_FILE, + RUNTIME_CHECK_IPC, + RUNTIME_CHECK_TLS, + RUNTIME_CHECK_HANDSHAKE, + RUNTIME_CHECK_ACPI, + RUNTIME_CHECK_INVALID_PRIVILEGE, + RUNTIME_CHECK_PROCESS, + RUNTIME_CHECK_BAD_BEHAVIOR, + RUNTIME_CHECK_BOOTSTRAP, + RUNTIME_CHECK_UNEXCPECTED, + RUNTIME_CHECK_FILESYSTEM, + RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, + RUNTIME_CHECK_PAGE, + RUNTIME_CHECK_INVALID, + RUNTIME_CHECK_COUNT, +}; + +typedef enum RUNTIME_CHECK RTL_RUNTIME_CHECK; + +namespace Kernel { +void ke_panic(const Int32& id, const Char* message = nullptr); +} // namespace Kernel diff --git a/dev/kernel/NeKit/Macros.h b/dev/kernel/NeKit/Macros.h new file mode 100644 index 00000000..5147863a --- /dev/null +++ b/dev/kernel/NeKit/Macros.h @@ -0,0 +1,148 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +/***********************************************************************************/ +/// @file NeKit/Macros.h +/// @brief Core Types and Macros. +/***********************************************************************************/ + +#ifndef KIB +#define KIB(X) (Kernel::UInt64)((X) / 1024) +#endif + +#ifndef kib_cast +#define kib_cast(X) (Kernel::UInt64)((X) *1024) +#endif + +#ifndef MIB +#define MIB(X) (Kernel::UInt64)((Kernel::UInt64) KIB(X) / 1024) +#endif + +#ifndef mib_cast +#define mib_cast(X) (Kernel::UInt64)((Kernel::UInt64) kib_cast(X) * 1024) +#endif + +#ifndef GIB +#define GIB(X) (Kernel::UInt64)((Kernel::UInt64) MIB(X) / 1024) +#endif + +#ifndef gib_cast +#define gib_cast(X) (Kernel::UInt64)((Kernel::UInt64) mib_cast(X) * 1024) +#endif + +#ifndef TIB +#define TIB(X) (Kernel::UInt64)((Kernel::UInt64) GIB(X) / 1024) +#endif + +#ifndef tib_cast +#define tib_cast(X) ((Kernel::UInt64) gib_cast(X) * 1024) +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(a) \ + (((sizeof(a) / sizeof(*(a))) / (static_cast(!(sizeof(a) % sizeof(*(a))))))) +#endif + +#define DEPRECATED ATTRIBUTE(deprecated) + +#ifndef ALIGN +#define ALIGN(X) __attribute__((aligned(X))) +#endif // #ifndef ALIGN + +#ifndef ATTRIBUTE +#define ATTRIBUTE(...) __attribute__((__VA_ARGS__)) +#endif // #ifndef ATTRIBUTE + +#ifndef __NE_VER__ +#define __NE_VER__ (2024) +#endif // !__NE_VER__ + +#ifndef EXTERN +#define EXTERN extern +#endif + +#ifndef EXTERN_C +#define EXTERN_C extern "C" +#endif + +#ifndef MAKE_ENUM +#define MAKE_ENUM(NAME) enum NAME { +#endif + +#ifndef END_ENUM +#define END_ENUM() \ + } \ + ; +#endif + +#ifndef MAKE_STRING_ENUM +#define MAKE_STRING_ENUM(NAME) namespace NAME { +#endif + +#ifndef ENUM_STRING +#define ENUM_STRING(NAME, VAL) inline constexpr const char* e##NAME = VAL +#endif + +#ifndef END_STRING_ENUM +#define END_STRING_ENUM() } +#endif + +#ifndef RTL_ALLOCA +#define RTL_ALLOCA(sz) __builtin_alloca(sz) +#endif // #ifndef RTL_ALLOCA + +#ifndef CANT_REACH +#define CANT_REACH() __builtin_unreachable() +#endif + +#define kInvalidAddress 0xFBFBFBFBFBFBFBFB +#define kBadAddress 0x0000000000000000 +#define kMaxAddr 0xFFFFFFFFFFFFFFFF +#define kPathLen 0x100 + +#define PACKED ATTRIBUTE(packed) +#define NO_EXEC ATTRIBUTE(noexec) + +#define EXTERN extern +#define STATIC static + +#define CONST const + +#define STRINGIFY(X) #X +#define NE_UNUSED(X) ((Kernel::Void) X) + +#ifndef RGB +#define RGB(R, G, B) ((Kernel::UInt32)((0xFF << 24) | ((R) << 16) | ((G) << 8) | (B))) +#endif // !RGB + +#ifdef __NE_AMD64__ +#define dbg_break_point() asm volatile("int $3") +#else +#define dbg_break_point() ((Kernel::Void) 0) +#endif + +#define RTL_ENDIAN(address, value) \ + (((reinterpret_cast(address)[0]) == (value)) ? (Kernel::Endian::kEndianBig) \ + : (Kernel::Endian::kEndianLittle)) + +#define Yes true +#define No false + +#define YES true +#define NO false + +#define TRUE true +#define FALSE false + +#define BOOL Kernel::Boolean + +#ifdef RTL_INIT_OBJECT +#undef RTL_INIT_OBJECT +#endif // ifdef RTL_INIT_OBJECT + +#define RTL_INIT_OBJECT(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__) diff --git a/dev/kernel/NeKit/MutableArray.h b/dev/kernel/NeKit/MutableArray.h new file mode 100644 index 00000000..8dee6e03 --- /dev/null +++ b/dev/kernel/NeKit/MutableArray.h @@ -0,0 +1,203 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ +#pragma once + +#include +#include +#include + +#define TRY_FIND_NODE(NAME, NODE) \ + auto* NAME = NODE; \ + while (NAME) { \ + if (NAME->fIndex == Index) return NAME->fVal; \ + NAME = NAME->fNext; \ + } + +#define TRY_FIND_NODE2(NAME, NODE) \ + auto* NAME = NODE; \ + while (NAME) { \ + if (NAME->fIndex == Index) return Ref{NAME->fVal}; \ + NAME = NAME->fNext; \ + } + +#define TRY_REMOVE_NODE(NODE) \ + if (NODE && NODE->fIndex == Index) { \ + NODE->fUsed = false; \ + NODE->fIndex = 0; \ + \ + return true; \ + } + +// FIXME: this is a shitty algorithm, which is consumer hungry. +// Remove and occurences of that, and remove that class. +namespace Kernel { +template +class MutableArray; + +template +class NullableMutableArray; + +template +class MutableLinkedList { + public: + T fVal; + SizeT fIndex{0}; + Boolean fUsed{false}; + + MutableLinkedList* fPrev{nullptr}; + MutableLinkedList* fNext{nullptr}; +}; + +template +class NullableMutableArray { + public: + // explicit this. + explicit NullableMutableArray() : fFirstNode(new MutableLinkedList()) {} + + /* + * We free all the nodes allocated by the array + * and store the next one inside "NextIt" + */ + + virtual ~NullableMutableArray() { + auto* It = fFirstNode; + MutableLinkedList* NextIt = nullptr; + + while (It) { + NextIt = It->fNext; + delete It; + + It = NextIt; + } + } + + NullableMutableArray& operator=(const NullableMutableArray&) = default; + NullableMutableArray(const NullableMutableArray&) = default; + + operator bool() { return Count() > 1; } + + public: + T operator[](SizeT Index) const { + TRY_FIND_NODE(first, fFirstNode); + TRY_FIND_NODE(last, fLastNode); + + return _PlaceHolderValue; + } + + SizeT Count() const { return fNodeCount; } + + public: + Boolean Remove(SizeT Index) { + TRY_REMOVE_NODE(fFirstNode); + TRY_REMOVE_NODE(fLastNode); + + return false; + } + + Boolean Add(const T val) { + auto* iterationNode = fFirstNode; + MUST_PASS(iterationNode); + + while (iterationNode) { + if (!iterationNode->fUsed) { + iterationNode->fVal = val; + iterationNode->fIndex = 0; + + iterationNode->fUsed = true; + + ++fNodeCount; + + return true; + } + + iterationNode = iterationNode->fNext; + } + + return false; + } + + private: + /* Avoid useless lookups */ + MutableLinkedList* fLastNode{nullptr}; + MutableLinkedList* fFirstNode{nullptr}; + + /* Number of nodes inside of this dynamic array. */ + Kernel::SizeT fNodeCount{0}; + + private: + // don't remove that + friend MutableArray; +}; + +template +class MutableArray : public NullableMutableArray { + public: + // explicit this. + explicit MutableArray() = default; + virtual ~MutableArray() = default; + + NE_COPY_DEFAULT(MutableArray) + + public: + Boolean Add(const T val) { + auto* iterationNode = fFirstNode; + + if (!iterationNode) { + fFirstNode = new MutableLinkedList(); + iterationNode = fFirstNode; + } + + MUST_PASS(iterationNode); + + while (iterationNode) { + if (!iterationNode->fUsed) { + iterationNode->fVal = val; + iterationNode->fIndex = 0; + + iterationNode->fUsed = true; + + ++fNodeCount; + + return true; + } + + iterationNode = iterationNode->fNext; + } + + return false; + } + + public: + Ref operator[](SizeT Index) const { + TRY_FIND_NODE2(first, fFirstNode); + TRY_FIND_NODE2(last, fLastNode); + + return {}; + } + + SizeT Count() const { return fNodeCount; } + + bool Contains(T& value) noexcept { + MutableLinkedList* first = fFirstNode; + + while (first) { + if (first->fVal == value && first->fUsed) return true; + + first = first->fNext; + } + + return false; + } + + private: + /* Avoid useless lookups */ + MutableLinkedList* fLastNode{nullptr}; + MutableLinkedList* fFirstNode{nullptr}; + + /* Number of nodes inside of this dynamic array. */ + Kernel::SizeT fNodeCount{0}; +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/NeKit.h b/dev/kernel/NeKit/NeKit.h new file mode 100644 index 00000000..909e1311 --- /dev/null +++ b/dev/kernel/NeKit/NeKit.h @@ -0,0 +1,20 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include diff --git a/dev/kernel/NeKit/New.h b/dev/kernel/NeKit/New.h new file mode 100644 index 00000000..de242141 --- /dev/null +++ b/dev/kernel/NeKit/New.h @@ -0,0 +1,20 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +/// @note compatible with tk too. +typedef __SIZE_TYPE__ size_t; + +void* operator new(size_t ptr); +void* operator new[](size_t ptr); + +void operator delete(void* ptr); +void operator delete(void* ptr, unsigned long); +void operator delete[](void* ptr); diff --git a/dev/kernel/NeKit/OwnPtr.h b/dev/kernel/NeKit/OwnPtr.h new file mode 100644 index 00000000..674f9ff3 --- /dev/null +++ b/dev/kernel/NeKit/OwnPtr.h @@ -0,0 +1,68 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include + +namespace Kernel { +template +class OwnPtr; + +template +class NonNullRefPtr; + +template +class OwnPtr final { + public: + OwnPtr() {} + ~OwnPtr() { this->Delete(); } + + OwnPtr& operator=(const OwnPtr&) = default; + OwnPtr(const OwnPtr&) = default; + + public: + template + bool New(Args&&... arg) { + if (fCls) { + return false; + } + + fCls = new T(arg...); + return fCls; + } + + void Delete() { + if (fCls) delete fCls; + + fCls = nullptr; + } + + T* operator->() const { return fCls; } + + T* Raw() { return fCls; } + + Ref AsRef() { return Ref(fCls); } + + operator bool() { return fCls; } + bool operator!() { return !fCls; } + + private: + T* fCls; +}; + +template +inline OwnPtr mm_make_own_ptr(Args... args) { + OwnPtr ret; + ret.template New(forward(args)...); + MUST_PASS(ret); + + return ret; +} +} // namespace Kernel diff --git a/dev/kernel/NeKit/PageMgr.h b/dev/kernel/NeKit/PageMgr.h new file mode 100644 index 00000000..ae74a6b6 --- /dev/null +++ b/dev/kernel/NeKit/PageMgr.h @@ -0,0 +1,76 @@ +// a way to create and find our pages. +// I'm thinking about a separate way of getting a paged area. + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include + +namespace Kernel { +class PageMgr; + +class PTEWrapper final { + public: + explicit PTEWrapper(Boolean Rw = false, Boolean User = false, Boolean ExecDisable = false, + UIntPtr Address = 0); + + ~PTEWrapper(); + + PTEWrapper& operator=(const PTEWrapper&) = default; + PTEWrapper(const PTEWrapper&) = default; + + public: + UIntPtr VirtualAddress(); + + Void NoExecute(const bool enable = false); + Bool NoExecute(); + + operator bool() { return fVirtAddr; } + + bool Reclaim(); + bool Shareable(); + bool Present(); + bool Access(); + + private: + Boolean fRw; + Boolean fUser; + Boolean fExecDisable; + UIntPtr fVirtAddr; + Boolean fCache; + Boolean fShareable; + Boolean fWt; + Boolean fPresent; + Boolean fAccessed; + + private: + friend class PageMgr; + friend class Pmm; +}; + +struct PageMgr final { + public: + PageMgr() = default; + ~PageMgr() = default; + + PageMgr& operator=(const PageMgr&) = default; + PageMgr(const PageMgr&) = default; + + public: + PTEWrapper Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz, SizeT Pad); + bool Free(Ref& wrapper); + + private: + void FlushTLB(); + + private: + friend PTEWrapper; + friend class Pmm; +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/Pair.h b/dev/kernel/NeKit/Pair.h new file mode 100644 index 00000000..aeeeb8a2 --- /dev/null +++ b/dev/kernel/NeKit/Pair.h @@ -0,0 +1,13 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel { +class Pair; +} // namespace Kernel diff --git a/dev/kernel/NeKit/Pmm.h b/dev/kernel/NeKit/Pmm.h new file mode 100644 index 00000000..f84bd9f2 --- /dev/null +++ b/dev/kernel/NeKit/Pmm.h @@ -0,0 +1,39 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include + +namespace Kernel { +class Pmm; +class PTEWrapper; + +class Pmm final { + public: + explicit Pmm(); + ~Pmm(); + + Pmm& operator=(const Pmm&) = delete; + Pmm(const Pmm&) = default; + + Ref RequestPage(Boolean user = false, Boolean readWrite = false); + Boolean FreePage(Ref refPage); + + Boolean ToggleRw(Ref refPage, Boolean enable = true); + Boolean TogglePresent(Ref refPage, Boolean enable = true); + Boolean ToggleUser(Ref refPage, Boolean enable = true); + Boolean ToggleShare(Ref refPage, Boolean enable = true); + + /// @brief Get the page manager of this. + Ref& Leak() { return fPageMgr; } + + private: + Ref fPageMgr; +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/Ref.h b/dev/kernel/NeKit/Ref.h new file mode 100644 index 00000000..489c51de --- /dev/null +++ b/dev/kernel/NeKit/Ref.h @@ -0,0 +1,79 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#ifndef _NEWKIT_REF_H_ +#define _NEWKIT_REF_H_ + +#include +#include +#include + +namespace Kernel { +template +class Ref final { + public: + Ref() = default; + + ~Ref() { + if (mm_is_valid_ptr(fClass)) delete fClass; + } + + public: + Ref(T* cls) : fClass(cls) {} + + Ref(T cls) : fClass(nullptr) { fClass = new T(cls); } + + Ref& operator=(T ref) { + if (!fClass) return *this; + + fClass = &ref; + return *this; + } + + public: + T operator->() const { + MUST_PASS(*fClass); + return *fClass; + } + + T& Leak() noexcept { return *fClass; } + + T& TryLeak() const noexcept { + MUST_PASS(*fClass); + return *fClass; + } + + T operator*() { return *fClass; } + + operator bool() noexcept { return fClass; } + + private: + T* fClass{nullptr}; +}; + +template +class NonNullRef final { + public: + NonNullRef() = delete; + NonNullRef(nullPtr) = delete; + + NonNullRef(T* ref) : fRef(ref) { MUST_PASS(ref); } + + Ref& operator->() { + MUST_PASS(fRef); + return fRef; + } + + NonNullRef& operator=(const NonNullRef& ref) = delete; + NonNullRef(const NonNullRef& ref) = default; + + private: + Ref fRef{nullptr}; +}; +} // namespace Kernel + +#endif // ifndef _NEWKIT_REF_H_ diff --git a/dev/kernel/NeKit/Stream.h b/dev/kernel/NeKit/Stream.h new file mode 100644 index 00000000..26fc46fc --- /dev/null +++ b/dev/kernel/NeKit/Stream.h @@ -0,0 +1,45 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include + +namespace Kernel { +template +class Stream final { + public: + explicit Stream(Ref ref) : fStream(ref) {} + + ~Stream() = default; + + Stream& operator=(const Stream&) = default; + Stream(const Stream&) = default; + + template + friend Stream& operator>>(Stream& Ks, Ref& Buf) { + Ks.fKind = Ks.fStream->In(Buf); + return *Ks; + } + + template + friend Stream& operator<<(Stream& Ks, Ref& Buf) { + Ks.fKind = Buf; + Ks.fStream->Out(Buf.Leak()); + return *Ks; + } + + Ref& AsStreamTrait() { return fStream; } + + Ref& AsType() { return fKind; } + + private: + Ref fStream; + Ref fKind; +}; +} // namespace Kernel diff --git a/dev/kernel/NeKit/Utils.h b/dev/kernel/NeKit/Utils.h new file mode 100644 index 00000000..cdfcfe56 --- /dev/null +++ b/dev/kernel/NeKit/Utils.h @@ -0,0 +1,34 @@ + +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel { +Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len); +Int rt_move_memory(const voidPtr src, voidPtr dst, Size len); +voidPtr rt_set_memory(voidPtr dst, UInt32 val, Size len); +void rt_zero_memory(voidPtr pointer, Size len); +Int rt_string_cmp(const Char* src, const Char* cmp, Size len); +const Char* rt_alloc_string(const Char* text); +Size rt_string_len(const Char* str); +Size rt_string_len(const Char* str, SizeT _len); +Boolean rt_to_string(Char* str_out, UInt64 base, Int32 limit); +Boolean rt_is_newln(Char chr); +Boolean rt_is_space(Char chr); +Int32 rt_is_alnum(Int32 character); +Int rt_to_uppercase(Int c); +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); + +Int urt_string_cmp(const Char* src, const Char* cmp, Size len); +Void urt_set_memory(const voidPtr src, UInt32 dst, Size len); +Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len); +Size urt_string_len(const Utf8Char* str); +} // namespace Kernel diff --git a/dev/kernel/NeKit/Variant.h b/dev/kernel/NeKit/Variant.h new file mode 100644 index 00000000..51548272 --- /dev/null +++ b/dev/kernel/NeKit/Variant.h @@ -0,0 +1,61 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include + +namespace Kernel { +class Variant final { + public: + enum class VariantKind { + kString, + kBlob, + kNull, + kJson, + kXML, + kSwap, + kInvalid, + }; + + public: + explicit Variant() = delete; + + public: + NE_COPY_DEFAULT(Variant) + + ~Variant() = default; + + public: + explicit Variant(KString* stringView) : fPtr((VoidPtr) stringView), fKind(VariantKind::kString) {} + + explicit Variant(Json* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {} + + explicit Variant(nullPtr ptr) : fPtr(ptr), fKind(VariantKind::kNull) {} + + explicit Variant(SWAP_DISK_HEADER* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} + + explicit Variant(VoidPtr ptr) : fPtr(ptr), fKind(VariantKind::kBlob) {} + + public: + const Char* ToString(); + VoidPtr Leak(); + + template + T* As() { + return reinterpret_cast(fPtr); + } + + VariantKind& Kind(); + + private: + voidPtr fPtr{nullptr}; + VariantKind fKind{VariantKind::kNull}; +}; +} // namespace Kernel diff --git a/dev/kernel/NetworkKit/IP.h b/dev/kernel/NetworkKit/IP.h index bf3b24ff..0b872352 100644 --- a/dev/kernel/NetworkKit/IP.h +++ b/dev/kernel/NetworkKit/IP.h @@ -7,9 +7,9 @@ #pragma once #include -#include -#include -#include +#include +#include +#include namespace Kernel { class RawIPAddress6; diff --git a/dev/kernel/NetworkKit/IPC.h b/dev/kernel/NetworkKit/IPC.h index 43b58d35..0dd8a1f1 100644 --- a/dev/kernel/NetworkKit/IPC.h +++ b/dev/kernel/NetworkKit/IPC.h @@ -10,8 +10,8 @@ #ifndef INC_IPC_H #define INC_IPC_H -#include -#include +#include +#include #include /// @file IPC.h diff --git a/dev/kernel/NetworkKit/LTE.h b/dev/kernel/NetworkKit/LTE.h index 71254cbf..030f9955 100644 --- a/dev/kernel/NetworkKit/LTE.h +++ b/dev/kernel/NetworkKit/LTE.h @@ -10,7 +10,7 @@ #ifndef _INC_NETWORK_LTE_H_ #define _INC_NETWORK_LTE_H_ -#include -#include +#include +#include #endif // ifndef _INC_NETWORK_LTE_H_ diff --git a/dev/kernel/NetworkKit/MAC.h b/dev/kernel/NetworkKit/MAC.h index 8520037e..805f7259 100644 --- a/dev/kernel/NetworkKit/MAC.h +++ b/dev/kernel/NetworkKit/MAC.h @@ -6,9 +6,9 @@ #pragma once -#include -#include -#include +#include +#include +#include #define kMACAddrLen (32) diff --git a/dev/kernel/NewKit/Array.h b/dev/kernel/NewKit/Array.h deleted file mode 100644 index 2b6d31f3..00000000 --- a/dev/kernel/NewKit/Array.h +++ /dev/null @@ -1,46 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include - -namespace Kernel { -template -class Array final { - public: - explicit Array() = default; - ~Array() = default; - - Array& operator=(const Array&) = default; - Array(const Array&) = default; - - T& operator[](SizeT at) { return fArray[at]; } - - Boolean Empty() { return this->Count() > 0; } - - SizeT Capacity() { return N; } - - SizeT Count() { - const static SizeT kArrCnt = N; - return kArrCnt; // avoid constexpr error. - } - - const T* CData() { return fArray; } - - operator bool() { return !Empty(); } - - private: - T fArray[N]; -}; - -template -auto make_list(ValueType val) { - return Array{val}; -} -} // namespace Kernel diff --git a/dev/kernel/NewKit/ArrayList.h b/dev/kernel/NewKit/ArrayList.h deleted file mode 100644 index d07e534c..00000000 --- a/dev/kernel/NewKit/ArrayList.h +++ /dev/null @@ -1,44 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Kernel { -template -class ArrayList final { - public: - explicit ArrayList(T* list, SizeT length) : fList(reinterpret_cast(list)) {} - - ~ArrayList() = default; - - ArrayList& operator=(const ArrayList&) = default; - ArrayList(const ArrayList&) = default; - - T* Data() { return fList; } - - const T* CData() { return fList; } - - T& operator[](SizeT index) const { - MUST_PASS(index < this->Count()); - return fList[index]; - } - - operator bool() { return fList; } - - SizeT Count() const { return fLen; } - - private: - T* fList{nullptr}; - SizeT fLen{0}; -}; - -template -ArrayList make_list(ValueType val) { - return ArrayList{val}; -} -} // namespace Kernel diff --git a/dev/kernel/NewKit/Atom.h b/dev/kernel/NewKit/Atom.h deleted file mode 100644 index 4b23c933..00000000 --- a/dev/kernel/NewKit/Atom.h +++ /dev/null @@ -1,33 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ -#pragma once - -#include - -namespace Kernel { -template -class Atom final { - public: - explicit Atom() = default; - ~Atom() = default; - - public: - Atom& operator=(const Atom&) = delete; - Atom(const Atom&) = delete; - - public: - T operator[](Size bit) { return (fArrayOfAtoms & (1 << bit)); } - - void operator|(Size bit) { fArrayOfAtoms |= (1 << bit); } - - friend Boolean operator==(Atom& atomic, const T& idx) { return atomic[idx] == idx; } - - friend Boolean operator!=(Atom& atomic, const T& idx) { return atomic[idx] == idx; } - - private: - T fArrayOfAtoms; -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/Crc32.h b/dev/kernel/NewKit/Crc32.h deleted file mode 100644 index b6f33714..00000000 --- a/dev/kernel/NewKit/Crc32.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * ======================================================== - * - * NeKernel - * Date Added: 13/02/2023 - * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - * - * ======================================================== - */ - -#ifndef CRC32_H -#define CRC32_H - -#include - -#define kCrcCnt (256) - -namespace Kernel { -UInt32 ke_calculate_crc32(const Char* crc, Int32 len) noexcept; -} // namespace Kernel - -#endif // !CRC32_H diff --git a/dev/kernel/NewKit/CxxAbi.h b/dev/kernel/NewKit/CxxAbi.h deleted file mode 100644 index 8fb93bf8..00000000 --- a/dev/kernel/NewKit/CxxAbi.h +++ /dev/null @@ -1,26 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ -#pragma once - -#include - -#ifndef __TOOLCHAINKIT__ - -#define kAtExitMacDestructors (128) - -struct atexit_func_entry_t { - void (*destructor_func)(); - void* obj_ptr; - void* dso_handle; -}; - -typedef unsigned uarch_t; - -namespace cxxabiv1 { -typedef void* __guard; -} - -#endif // __GNUC__ diff --git a/dev/kernel/NewKit/Defines.h b/dev/kernel/NewKit/Defines.h deleted file mode 100644 index 0d2f830f..00000000 --- a/dev/kernel/NewKit/Defines.h +++ /dev/null @@ -1,176 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -#define NEWKIT_VERSION_STR "0.0.1" -#define NEWKIT_VERSION_BCD 0x0001 - -#ifndef __cplusplus -#error Kernel compiles with a C++ compiler. -#endif - -#if __cplusplus <= 201703L -#define char8_t char -#endif - -#ifdef __has_feature -#if !__has_feature(cxx_nullptr) -#if !__has_nullptr -#error !!! You must at least have nullptr featured on your C++ compiler. !!! -#endif -#endif -#endif - -/// @brief The **Kernel** namespace. -namespace Kernel { -using voidPtr = void*; -using VoidPtr = void*; -using nullPtr = decltype(nullptr); -using NullPtr = decltype(nullptr); - -using Int = int; -using Int32 = int; -using UShort = unsigned short; -using UInt16 = unsigned short; -using Short = short; -using Int16 = short; -using UInt = unsigned int; -using UInt32 = unsigned int; -using Long = __INT64_TYPE__; -using Int64 = __INT64_TYPE__; -using ULong = __UINT64_TYPE__; -using UInt64 = __UINT64_TYPE__; -using Boolean = bool; -using Bool = bool; -using Char = char; -using UChar = unsigned char; -using UInt8 = unsigned char; - -using SSize = Int64; -using SSizeT = Int64; -using Size = __SIZE_TYPE__; -using SizeT = __SIZE_TYPE__; -using IntPtr = __INTPTR_TYPE__; -using UIntPtr = __UINTPTR_TYPE__; -using IntFast = __INT_FAST32_TYPE__; -using IntFast64 = __INT_FAST64_TYPE__; -using PtrDiff = __PTRDIFF_TYPE__; - -using SInt16 = Int16; -using SInt32 = Int32; -using SInt64 = Int64; - -typedef UIntPtr* Ptr64; -typedef UInt32* Ptr32; -typedef UInt8* Ptr8; - -using Utf8Char = char8_t; -using Utf16Char = char16_t; -using WideChar = wchar_t; -using Utf32Char = char32_t; - -using LongDouble = long double; -using Double = double; -using Float = float; - -typedef UInt32 PhysicalAddressKind; -typedef UIntPtr VirtualAddressKind; - -using Void = void; - -using Lba = UInt64; - -using Char16 = char16_t; - -enum class Endian : UInt8 { kEndianInvalid, kEndianBig, kEndianLittle, kEndianMixed, kEndianCount }; - -/// @brief Forward object. -/// @tparam Args the object type. -/// @param arg the object. -/// @return object's rvalue -template -inline Args&& forward(Args& arg) { - return static_cast(arg); -} - -/// @brief Move object. -/// @tparam Args the object type. -/// @param arg the object. -/// @return object's rvalue -template -inline Args&& move(Args&& arg) { - return static_cast(arg); -} - -/// @brief Encoding interface, used as a proxy to convert T to Char* -/// Used to cast A to B or B to A. -class ICodec { - public: - explicit ICodec() = default; - virtual ~ICodec() = default; - - ICodec& operator=(const ICodec&) = default; - ICodec(const ICodec&) = default; - - public: - /// @brief Convert type to bytes. - /// @tparam T the type. - /// @param type (a1) the data. - /// @return a1 as Char* - template - const Char* AsBytes(T type) noexcept { - NE_UNUSED(type); - return nullptr; - } - - /// @brief Construct from type to class. - /// @tparam T the type to convert. - /// @param type (a1) the data. - /// @return a1 as Char* - template - OutputClass* Construct(Char* type) noexcept { - FactoryClass class_fac; - return class_fac.template From(type); - } - - /// @brief Convert T class to Y class. - /// @tparam T the class type of type. - /// @tparam Y the result class. - /// @param type the class to cast. - /// @return the class as Y. - template - Y As(T type) noexcept { - if (type.template IsSerializable()) { - return reinterpret_cast(type); - } - - return type.template As(); - } -}; - -/// \brief Scheduler interface, represents a scheduler object. -/// @note This is used to schedule tasks, such as threads, drivers, user threads, etc. -class ISchedulable { - public: - explicit ISchedulable() = default; - virtual ~ISchedulable() = default; - - ISchedulable& operator=(const ISchedulable&) = default; - ISchedulable(const ISchedulable&) = default; - - /// @brief Is this object only accepting user tasks? - virtual Bool IsUser() { return NO; } - - /// @brief Is this object only accepting kernel tasks? - virtual Bool IsKernel() { return NO; } - - /// @brief Is this object offloading to another CPU? - virtual Bool HasMP() { return NO; } -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/ErrorOr.h b/dev/kernel/NewKit/ErrorOr.h deleted file mode 100644 index f2de3432..00000000 --- a/dev/kernel/NewKit/ErrorOr.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * ======================================================== - * - * NeKernel - * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - * - * ======================================================== - */ - -#pragma once - -#include -#include - -namespace Kernel { -using ErrorT = UInt; - -template -class ErrorOr final { - public: - ErrorOr() = default; - ~ErrorOr() = default; - - public: - explicit ErrorOr(Int32 err) : mId(err) {} - - explicit ErrorOr(nullPtr Null) {} - - explicit ErrorOr(T* Class) : mRef(Class) {} - - explicit ErrorOr(T Class) : mRef(Class) {} - - ErrorOr& operator=(const ErrorOr&) = default; - ErrorOr(const ErrorOr&) = default; - - ErrorOr& operator=(const Ref& refErr) { - mRef = refErr; - return *this; - } - - Ref& Leak() { return mRef; } - - Int32 Error() { return mId; } - - operator bool() { return mRef; } - - BOOL HasError() { return this->mId > 0; } - - private: - Ref mRef; - UInt32 mId{0}; -}; - -using ErrorOrAny = ErrorOr; - -} // namespace Kernel diff --git a/dev/kernel/NewKit/Function.h b/dev/kernel/NewKit/Function.h deleted file mode 100644 index e0af5842..00000000 --- a/dev/kernel/NewKit/Function.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _INC_FUNCTION_H__ -#define _INC_FUNCTION_H__ - -#include - -namespace Kernel { -template -class Function final { - public: - Function() = default; - - public: - explicit Function(T (*Fn)(Args... args)) : fFn(Fn) {} - - ~Function() = default; - - Function& operator=(const Function&) = default; - Function(const Function&) = default; - - template - T operator()(Args... args) { - return fFn(args...); - } - - template - T Call(Args... args) { - return fFn(args...); - } - - operator bool() { return fFn; } - - bool operator!() { return !fFn; } - - private: - T(*fFn) - (Args... args); -}; -} // namespace Kernel - -#endif // !_INC_FUNCTION_H__ diff --git a/dev/kernel/NewKit/Json.h b/dev/kernel/NewKit/Json.h deleted file mode 100644 index 6af71b72..00000000 --- a/dev/kernel/NewKit/Json.h +++ /dev/null @@ -1,129 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -// last-rev: 02/04/25 - -#include -#include -#include -#include -#include - -#define kJSONMaxLen (8196) -#define kJSONLen (256) -#define kJSONNullArr "[]" -#define kJSONNullObj "{}" - -namespace Kernel { -/// @brief JavaScript object class -class Json final { - public: - explicit Json() { - auto len = kJSONMaxLen; - KString key = KString(len); - key += kJSONNullObj; - - this->AsKey() = key; - this->AsValue() = key; - } - - explicit Json(SizeT lhsLen, SizeT rhsLen) : fKey(lhsLen), fValue(rhsLen) {} - - ~Json() = default; - - NE_COPY_DEFAULT(Json) - - Bool& IsUndefined() { return fUndefined; } - - private: - Bool fUndefined; // is this instance undefined? - KString fKey; - KString fValue; - - public: - /// @brief returns the key of the json - /// @return the key as string view. - KString& AsKey() { return fKey; } - - /// @brief returns the value of the json. - /// @return the key as string view. - KString& AsValue() { return fValue; } - - static Json kNull; -}; - -/// @brief Json stream reader helper. -struct JsonStreamReader final { - STATIC Json In(const Char* full_array) { - auto start_val = '{'; - auto end_val = '}'; - Boolean probe_value = false; - - if (full_array[0] != start_val) { - if (full_array[0] != '[') return Json::kNull; - - start_val = '['; - end_val = ']'; - - probe_value = true; - } - - SizeT len = rt_string_len(full_array); - - SizeT key_len = 0; - SizeT value_len = 0; - - Json type(kJSONMaxLen, kJSONMaxLen); - - for (SizeT i = 1; i < len; ++i) { - if (full_array[i] == '\r' || full_array[i] == '\n') continue; - - if (probe_value) { - if (full_array[i] == end_val || full_array[i] == ',') { - probe_value = false; - - ++value_len; - } else { - if (full_array[i] == '\'') { - type.AsValue().Data()[value_len] = 0; - break; - } - - type.AsValue().Data()[value_len] = full_array[i]; - - ++value_len; - } - } else { - if (start_val == '[') continue; - - if (full_array[i] == ':') { - type.AsKey().Data()[key_len] = 0; - ++key_len; - - ++i; - - while (full_array[i] == ' ' || full_array[i] == '\t') ++i; - - probe_value = true; - } else { - type.AsKey().Data()[key_len] = full_array[i]; - - ++key_len; - } - } - } - - type.AsValue().Data()[value_len] = 0; - - return type; - } -}; - -using JsonStream = Stream; -} // namespace Kernel diff --git a/dev/kernel/NewKit/KString.h b/dev/kernel/NewKit/KString.h deleted file mode 100644 index 08f783c0..00000000 --- a/dev/kernel/NewKit/KString.h +++ /dev/null @@ -1,82 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include -#include -#include - -#define kMinimumStringSize (8196U) - -namespace Kernel { -/// @brief Kernel string class, not dynamic. -class KString final { - public: - explicit KString() { - fDataSz = kMinimumStringSize; - - fData = new Char[fDataSz]; - MUST_PASS(fData); - - rt_set_memory(fData, 0, fDataSz); - } - - explicit KString(SizeT Sz) : fDataSz(Sz) { - MUST_PASS(Sz > 1); - - fData = new Char[Sz]; - MUST_PASS(fData); - - rt_set_memory(fData, 0, Sz); - } - - ~KString() { - if (fData) { - delete[] fData; - fData = nullptr; - } - } - - NE_COPY_DEFAULT(KString) - - Char* Data(); - const Char* CData() const; - Size Length() const; - - bool operator==(const Char* rhs) const; - bool operator!=(const Char* rhs) const; - - bool operator==(const KString& rhs) const; - bool operator!=(const KString& rhs) const; - - KString& operator+=(const Char* rhs); - KString& operator+=(const KString& rhs); - - operator bool() { return fData; } - - bool operator!() { return fData; } - - private: - Char* fData{nullptr}; - Size fDataSz{0}; - Size fCur{0}; - - friend class KStringBuilder; -}; - -class KStringBuilder final { - public: - static ErrorOr Construct(const Char* data); - static const Char* FromBool(const Char* fmt, bool n); - static const Char* Format(const Char* fmt, const Char* from); - static bool Equals(const Char* lhs, const Char* rhs); - static bool Equals(const Utf8Char* lhs, const Utf8Char* rhs); - static bool Equals(const WideChar* lhs, const WideChar* rhs); -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/KernelPanic.h b/dev/kernel/NewKit/KernelPanic.h deleted file mode 100644 index 6d7f4d23..00000000 --- a/dev/kernel/NewKit/KernelPanic.h +++ /dev/null @@ -1,69 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Kernel { -void ke_runtime_check(bool expr, const Char* file, const Char* line); -} - -#define MUST_PASS_COMPILER(EXPR, MSG) static_assert(EXPR, MSG) - -#ifdef TRY -#undef TRY -#endif - -#define TRY(X) \ - { \ - auto fn = X; \ - if ((fn()) == NO) { \ - MUST_PASS(NO); \ - } \ - } - -#ifdef __MUST_PASS -#undef __MUST_PASS -#endif - -#define __MUST_PASS(EXPR, FILE, LINE) Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) - -#ifdef __DEBUG__ -#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) -#define assert(EXPR) MUST_PASS(EXPR) -#else -#define MUST_PASS(EXPR) (Kernel::Void)(EXPR) -#define assert(EXPR) (Kernel::Void)(EXPR) -#endif - -enum RUNTIME_CHECK { - RUNTIME_CHECK_FAILED = 1111, - RUNTIME_CHECK_POINTER, - RUNTIME_CHECK_EXPRESSION, - RUNTIME_CHECK_FILE, - RUNTIME_CHECK_IPC, - RUNTIME_CHECK_TLS, - RUNTIME_CHECK_HANDSHAKE, - RUNTIME_CHECK_ACPI, - RUNTIME_CHECK_INVALID_PRIVILEGE, - RUNTIME_CHECK_PROCESS, - RUNTIME_CHECK_BAD_BEHAVIOR, - RUNTIME_CHECK_BOOTSTRAP, - RUNTIME_CHECK_UNEXCPECTED, - RUNTIME_CHECK_FILESYSTEM, - RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, - RUNTIME_CHECK_PAGE, - RUNTIME_CHECK_INVALID, - RUNTIME_CHECK_COUNT, -}; - -typedef enum RUNTIME_CHECK RTL_RUNTIME_CHECK; - -namespace Kernel { -void ke_panic(const Int32& id, const Char* message = nullptr); -} // namespace Kernel diff --git a/dev/kernel/NewKit/Macros.h b/dev/kernel/NewKit/Macros.h deleted file mode 100644 index ef4742d3..00000000 --- a/dev/kernel/NewKit/Macros.h +++ /dev/null @@ -1,148 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -/***********************************************************************************/ -/// @file NewKit/Macros.h -/// @brief Core Types and Macros. -/***********************************************************************************/ - -#ifndef KIB -#define KIB(X) (Kernel::UInt64)((X) / 1024) -#endif - -#ifndef kib_cast -#define kib_cast(X) (Kernel::UInt64)((X) *1024) -#endif - -#ifndef MIB -#define MIB(X) (Kernel::UInt64)((Kernel::UInt64) KIB(X) / 1024) -#endif - -#ifndef mib_cast -#define mib_cast(X) (Kernel::UInt64)((Kernel::UInt64) kib_cast(X) * 1024) -#endif - -#ifndef GIB -#define GIB(X) (Kernel::UInt64)((Kernel::UInt64) MIB(X) / 1024) -#endif - -#ifndef gib_cast -#define gib_cast(X) (Kernel::UInt64)((Kernel::UInt64) mib_cast(X) * 1024) -#endif - -#ifndef TIB -#define TIB(X) (Kernel::UInt64)((Kernel::UInt64) GIB(X) / 1024) -#endif - -#ifndef tib_cast -#define tib_cast(X) ((Kernel::UInt64) gib_cast(X) * 1024) -#endif - -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(a) \ - (((sizeof(a) / sizeof(*(a))) / (static_cast(!(sizeof(a) % sizeof(*(a))))))) -#endif - -#define DEPRECATED ATTRIBUTE(deprecated) - -#ifndef ALIGN -#define ALIGN(X) __attribute__((aligned(X))) -#endif // #ifndef ALIGN - -#ifndef ATTRIBUTE -#define ATTRIBUTE(...) __attribute__((__VA_ARGS__)) -#endif // #ifndef ATTRIBUTE - -#ifndef __NE_VER__ -#define __NE_VER__ (2024) -#endif // !__NE_VER__ - -#ifndef EXTERN -#define EXTERN extern -#endif - -#ifndef EXTERN_C -#define EXTERN_C extern "C" -#endif - -#ifndef MAKE_ENUM -#define MAKE_ENUM(NAME) enum NAME { -#endif - -#ifndef END_ENUM -#define END_ENUM() \ - } \ - ; -#endif - -#ifndef MAKE_STRING_ENUM -#define MAKE_STRING_ENUM(NAME) namespace NAME { -#endif - -#ifndef ENUM_STRING -#define ENUM_STRING(NAME, VAL) inline constexpr const char* e##NAME = VAL -#endif - -#ifndef END_STRING_ENUM -#define END_STRING_ENUM() } -#endif - -#ifndef RTL_ALLOCA -#define RTL_ALLOCA(sz) __builtin_alloca(sz) -#endif // #ifndef RTL_ALLOCA - -#ifndef CANT_REACH -#define CANT_REACH() __builtin_unreachable() -#endif - -#define kInvalidAddress 0xFBFBFBFBFBFBFBFB -#define kBadAddress 0x0000000000000000 -#define kMaxAddr 0xFFFFFFFFFFFFFFFF -#define kPathLen 0x100 - -#define PACKED ATTRIBUTE(packed) -#define NO_EXEC ATTRIBUTE(noexec) - -#define EXTERN extern -#define STATIC static - -#define CONST const - -#define STRINGIFY(X) #X -#define NE_UNUSED(X) ((Kernel::Void) X) - -#ifndef RGB -#define RGB(R, G, B) ((Kernel::UInt32)((0xFF << 24) | ((R) << 16) | ((G) << 8) | (B))) -#endif // !RGB - -#ifdef __NE_AMD64__ -#define dbg_break_point() asm volatile("int $3") -#else -#define dbg_break_point() ((void) 0) -#endif - -#define RTL_ENDIAN(address, value) \ - (((reinterpret_cast(address)[0]) == (value)) ? (Kernel::Endian::kEndianBig) \ - : (Kernel::Endian::kEndianLittle)) - -#define Yes true -#define No false - -#define YES true -#define NO false - -#define TRUE true -#define FALSE false - -#define BOOL Kernel::Boolean - -#ifdef RTL_INIT_OBJECT -#undef RTL_INIT_OBJECT -#endif // ifdef RTL_INIT_OBJECT - -#define RTL_INIT_OBJECT(OBJ, TYPE, ...) TYPE OBJ = TYPE(__VA_ARGS__) diff --git a/dev/kernel/NewKit/MutableArray.h b/dev/kernel/NewKit/MutableArray.h deleted file mode 100644 index 08c8cbf5..00000000 --- a/dev/kernel/NewKit/MutableArray.h +++ /dev/null @@ -1,203 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ -#pragma once - -#include -#include -#include - -#define TRY_FIND_NODE(NAME, NODE) \ - auto* NAME = NODE; \ - while (NAME) { \ - if (NAME->fIndex == Index) return NAME->fVal; \ - NAME = NAME->fNext; \ - } - -#define TRY_FIND_NODE2(NAME, NODE) \ - auto* NAME = NODE; \ - while (NAME) { \ - if (NAME->fIndex == Index) return Ref{NAME->fVal}; \ - NAME = NAME->fNext; \ - } - -#define TRY_REMOVE_NODE(NODE) \ - if (NODE && NODE->fIndex == Index) { \ - NODE->fUsed = false; \ - NODE->fIndex = 0; \ - \ - return true; \ - } - -// FIXME: this is a shitty algorithm, which is consumer hungry. -// Remove and occurences of that, and remove that class. -namespace Kernel { -template -class MutableArray; - -template -class NullableMutableArray; - -template -class MutableLinkedList { - public: - T fVal; - SizeT fIndex{0}; - Boolean fUsed{false}; - - MutableLinkedList* fPrev{nullptr}; - MutableLinkedList* fNext{nullptr}; -}; - -template -class NullableMutableArray { - public: - // explicit this. - explicit NullableMutableArray() : fFirstNode(new MutableLinkedList()) {} - - /* - * We free all the nodes allocated by the array - * and store the next one inside "NextIt" - */ - - virtual ~NullableMutableArray() { - auto* It = fFirstNode; - MutableLinkedList* NextIt = nullptr; - - while (It) { - NextIt = It->fNext; - delete It; - - It = NextIt; - } - } - - NullableMutableArray& operator=(const NullableMutableArray&) = default; - NullableMutableArray(const NullableMutableArray&) = default; - - operator bool() { return Count() > 1; } - - public: - T operator[](SizeT Index) const { - TRY_FIND_NODE(first, fFirstNode); - TRY_FIND_NODE(last, fLastNode); - - return _PlaceHolderValue; - } - - SizeT Count() const { return fNodeCount; } - - public: - Boolean Remove(SizeT Index) { - TRY_REMOVE_NODE(fFirstNode); - TRY_REMOVE_NODE(fLastNode); - - return false; - } - - Boolean Add(const T val) { - auto* iterationNode = fFirstNode; - MUST_PASS(iterationNode); - - while (iterationNode) { - if (!iterationNode->fUsed) { - iterationNode->fVal = val; - iterationNode->fIndex = 0; - - iterationNode->fUsed = true; - - ++fNodeCount; - - return true; - } - - iterationNode = iterationNode->fNext; - } - - return false; - } - - private: - /* Avoid useless lookups */ - MutableLinkedList* fLastNode{nullptr}; - MutableLinkedList* fFirstNode{nullptr}; - - /* Number of nodes inside of this dynamic array. */ - Kernel::SizeT fNodeCount{0}; - - private: - // don't remove that - friend MutableArray; -}; - -template -class MutableArray : public NullableMutableArray { - public: - // explicit this. - explicit MutableArray() = default; - virtual ~MutableArray() = default; - - NE_COPY_DEFAULT(MutableArray) - - public: - Boolean Add(const T val) { - auto* iterationNode = fFirstNode; - - if (!iterationNode) { - fFirstNode = new MutableLinkedList(); - iterationNode = fFirstNode; - } - - MUST_PASS(iterationNode); - - while (iterationNode) { - if (!iterationNode->fUsed) { - iterationNode->fVal = val; - iterationNode->fIndex = 0; - - iterationNode->fUsed = true; - - ++fNodeCount; - - return true; - } - - iterationNode = iterationNode->fNext; - } - - return false; - } - - public: - Ref operator[](SizeT Index) const { - TRY_FIND_NODE2(first, fFirstNode); - TRY_FIND_NODE2(last, fLastNode); - - return {}; - } - - SizeT Count() const { return fNodeCount; } - - bool Contains(T& value) noexcept { - MutableLinkedList* first = fFirstNode; - - while (first) { - if (first->fVal == value && first->fUsed) return true; - - first = first->fNext; - } - - return false; - } - - private: - /* Avoid useless lookups */ - MutableLinkedList* fLastNode{nullptr}; - MutableLinkedList* fFirstNode{nullptr}; - - /* Number of nodes inside of this dynamic array. */ - Kernel::SizeT fNodeCount{0}; -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/New.h b/dev/kernel/NewKit/New.h deleted file mode 100644 index de242141..00000000 --- a/dev/kernel/NewKit/New.h +++ /dev/null @@ -1,20 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -/// @note compatible with tk too. -typedef __SIZE_TYPE__ size_t; - -void* operator new(size_t ptr); -void* operator new[](size_t ptr); - -void operator delete(void* ptr); -void operator delete(void* ptr, unsigned long); -void operator delete[](void* ptr); diff --git a/dev/kernel/NewKit/NewKit.h b/dev/kernel/NewKit/NewKit.h deleted file mode 100644 index 66ca2bb3..00000000 --- a/dev/kernel/NewKit/NewKit.h +++ /dev/null @@ -1,20 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include diff --git a/dev/kernel/NewKit/OwnPtr.h b/dev/kernel/NewKit/OwnPtr.h deleted file mode 100644 index 14b2fe39..00000000 --- a/dev/kernel/NewKit/OwnPtr.h +++ /dev/null @@ -1,68 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include - -namespace Kernel { -template -class OwnPtr; - -template -class NonNullRefPtr; - -template -class OwnPtr final { - public: - OwnPtr() {} - ~OwnPtr() { this->Delete(); } - - OwnPtr& operator=(const OwnPtr&) = default; - OwnPtr(const OwnPtr&) = default; - - public: - template - bool New(Args&&... arg) { - if (fCls) { - return false; - } - - fCls = new T(arg...); - return fCls; - } - - void Delete() { - if (fCls) delete fCls; - - fCls = nullptr; - } - - T* operator->() const { return fCls; } - - T* Raw() { return fCls; } - - Ref AsRef() { return Ref(fCls); } - - operator bool() { return fCls; } - bool operator!() { return !fCls; } - - private: - T* fCls; -}; - -template -inline OwnPtr mm_make_own_ptr(Args... args) { - OwnPtr ret; - ret.template New(forward(args)...); - MUST_PASS(ret); - - return ret; -} -} // namespace Kernel diff --git a/dev/kernel/NewKit/PageMgr.h b/dev/kernel/NewKit/PageMgr.h deleted file mode 100644 index 3aef2733..00000000 --- a/dev/kernel/NewKit/PageMgr.h +++ /dev/null @@ -1,76 +0,0 @@ -// a way to create and find our pages. -// I'm thinking about a separate way of getting a paged area. - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include - -namespace Kernel { -class PageMgr; - -class PTEWrapper final { - public: - explicit PTEWrapper(Boolean Rw = false, Boolean User = false, Boolean ExecDisable = false, - UIntPtr Address = 0); - - ~PTEWrapper(); - - PTEWrapper& operator=(const PTEWrapper&) = default; - PTEWrapper(const PTEWrapper&) = default; - - public: - UIntPtr VirtualAddress(); - - Void NoExecute(const bool enable = false); - Bool NoExecute(); - - operator bool() { return fVirtAddr; } - - bool Reclaim(); - bool Shareable(); - bool Present(); - bool Access(); - - private: - Boolean fRw; - Boolean fUser; - Boolean fExecDisable; - UIntPtr fVirtAddr; - Boolean fCache; - Boolean fShareable; - Boolean fWt; - Boolean fPresent; - Boolean fAccessed; - - private: - friend class PageMgr; - friend class Pmm; -}; - -struct PageMgr final { - public: - PageMgr() = default; - ~PageMgr() = default; - - PageMgr& operator=(const PageMgr&) = default; - PageMgr(const PageMgr&) = default; - - public: - PTEWrapper Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz, SizeT Pad); - bool Free(Ref& wrapper); - - private: - void FlushTLB(); - - private: - friend PTEWrapper; - friend class Pmm; -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/Pair.h b/dev/kernel/NewKit/Pair.h deleted file mode 100644 index 28512831..00000000 --- a/dev/kernel/NewKit/Pair.h +++ /dev/null @@ -1,13 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Kernel { -class Pair; -} // namespace Kernel diff --git a/dev/kernel/NewKit/Pmm.h b/dev/kernel/NewKit/Pmm.h deleted file mode 100644 index 41d988e1..00000000 --- a/dev/kernel/NewKit/Pmm.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include - -namespace Kernel { -class Pmm; -class PTEWrapper; - -class Pmm final { - public: - explicit Pmm(); - ~Pmm(); - - Pmm& operator=(const Pmm&) = delete; - Pmm(const Pmm&) = default; - - Ref RequestPage(Boolean user = false, Boolean readWrite = false); - Boolean FreePage(Ref refPage); - - Boolean ToggleRw(Ref refPage, Boolean enable = true); - Boolean TogglePresent(Ref refPage, Boolean enable = true); - Boolean ToggleUser(Ref refPage, Boolean enable = true); - Boolean ToggleShare(Ref refPage, Boolean enable = true); - - /// @brief Get the page manager of this. - Ref& Leak() { return fPageMgr; } - - private: - Ref fPageMgr; -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/Ref.h b/dev/kernel/NewKit/Ref.h deleted file mode 100644 index 31ad16f8..00000000 --- a/dev/kernel/NewKit/Ref.h +++ /dev/null @@ -1,79 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#ifndef _NEWKIT_REF_H_ -#define _NEWKIT_REF_H_ - -#include -#include -#include - -namespace Kernel { -template -class Ref final { - public: - Ref() = default; - - ~Ref() { - if (mm_is_valid_ptr(fClass)) delete fClass; - } - - public: - Ref(T* cls) : fClass(cls) {} - - Ref(T cls) : fClass(nullptr) { fClass = new T(cls); } - - Ref& operator=(T ref) { - if (!fClass) return *this; - - fClass = &ref; - return *this; - } - - public: - T operator->() const { - MUST_PASS(*fClass); - return *fClass; - } - - T& Leak() noexcept { return *fClass; } - - T& TryLeak() const noexcept { - MUST_PASS(*fClass); - return *fClass; - } - - T operator*() { return *fClass; } - - operator bool() noexcept { return fClass; } - - private: - T* fClass{nullptr}; -}; - -template -class NonNullRef final { - public: - NonNullRef() = delete; - NonNullRef(nullPtr) = delete; - - NonNullRef(T* ref) : fRef(ref) { MUST_PASS(ref); } - - Ref& operator->() { - MUST_PASS(fRef); - return fRef; - } - - NonNullRef& operator=(const NonNullRef& ref) = delete; - NonNullRef(const NonNullRef& ref) = default; - - private: - Ref fRef{nullptr}; -}; -} // namespace Kernel - -#endif // ifndef _NEWKIT_REF_H_ diff --git a/dev/kernel/NewKit/Stream.h b/dev/kernel/NewKit/Stream.h deleted file mode 100644 index 8b72046c..00000000 --- a/dev/kernel/NewKit/Stream.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include - -namespace Kernel { -template -class Stream final { - public: - explicit Stream(Ref ref) : fStream(ref) {} - - ~Stream() = default; - - Stream& operator=(const Stream&) = default; - Stream(const Stream&) = default; - - template - friend Stream& operator>>(Stream& Ks, Ref& Buf) { - Ks.fKind = Ks.fStream->In(Buf); - return *Ks; - } - - template - friend Stream& operator<<(Stream& Ks, Ref& Buf) { - Ks.fKind = Buf; - Ks.fStream->Out(Buf.Leak()); - return *Ks; - } - - Ref& AsStreamTrait() { return fStream; } - - Ref& AsType() { return fKind; } - - private: - Ref fStream; - Ref fKind; -}; -} // namespace Kernel diff --git a/dev/kernel/NewKit/Utils.h b/dev/kernel/NewKit/Utils.h deleted file mode 100644 index cd36654a..00000000 --- a/dev/kernel/NewKit/Utils.h +++ /dev/null @@ -1,34 +0,0 @@ - -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include - -namespace Kernel { -Int rt_copy_memory(const voidPtr src, voidPtr dst, Size len); -Int rt_move_memory(const voidPtr src, voidPtr dst, Size len); -voidPtr rt_set_memory(voidPtr dst, UInt32 val, Size len); -void rt_zero_memory(voidPtr pointer, Size len); -Int rt_string_cmp(const Char* src, const Char* cmp, Size len); -const Char* rt_alloc_string(const Char* text); -Size rt_string_len(const Char* str); -Size rt_string_len(const Char* str, SizeT _len); -Boolean rt_to_string(Char* str_out, UInt64 base, Int32 limit); -Boolean rt_is_newln(Char chr); -Boolean rt_is_space(Char chr); -Int32 rt_is_alnum(Int32 character); -Int rt_to_uppercase(Int c); -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); - -Int urt_string_cmp(const Char* src, const Char* cmp, Size len); -Void urt_set_memory(const voidPtr src, UInt32 dst, Size len); -Int urt_copy_memory(const voidPtr src, voidPtr dst, Size len); -Size urt_string_len(const Utf8Char* str); -} // namespace Kernel diff --git a/dev/kernel/NewKit/Variant.h b/dev/kernel/NewKit/Variant.h deleted file mode 100644 index 83602602..00000000 --- a/dev/kernel/NewKit/Variant.h +++ /dev/null @@ -1,61 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#pragma once - -#include -#include -#include -#include - -namespace Kernel { -class Variant final { - public: - enum class VariantKind { - kString, - kBlob, - kNull, - kJson, - kXML, - kSwap, - kInvalid, - }; - - public: - explicit Variant() = delete; - - public: - NE_COPY_DEFAULT(Variant) - - ~Variant() = default; - - public: - explicit Variant(KString* stringView) : fPtr((VoidPtr) stringView), fKind(VariantKind::kString) {} - - explicit Variant(Json* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {} - - explicit Variant(nullPtr ptr) : fPtr(ptr), fKind(VariantKind::kNull) {} - - explicit Variant(SWAP_DISK_HEADER* ptr) : fPtr(ptr), fKind(VariantKind::kSwap) {} - - explicit Variant(VoidPtr ptr) : fPtr(ptr), fKind(VariantKind::kBlob) {} - - public: - const Char* ToString(); - VoidPtr Leak(); - - template - T* As() { - return reinterpret_cast(fPtr); - } - - VariantKind& Kind(); - - private: - voidPtr fPtr{nullptr}; - VariantKind fKind{VariantKind::kNull}; -}; -} // namespace Kernel diff --git a/dev/kernel/SignalKit/Signals.h b/dev/kernel/SignalKit/Signals.h index ba0b80cb..142ed3ab 100644 --- a/dev/kernel/SignalKit/Signals.h +++ b/dev/kernel/SignalKit/Signals.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define SIGKILL 0 #define SIGPAUS 1 diff --git a/dev/kernel/StorageKit/AHCI.h b/dev/kernel/StorageKit/AHCI.h index d40feb36..e2220719 100644 --- a/dev/kernel/StorageKit/AHCI.h +++ b/dev/kernel/StorageKit/AHCI.h @@ -8,7 +8,7 @@ #include #include -#include +#include namespace Kernel { /// @brief AHCIDeviceInterface class diff --git a/dev/kernel/StorageKit/ATA.h b/dev/kernel/StorageKit/ATA.h index 5887c579..abf255a5 100644 --- a/dev/kernel/StorageKit/ATA.h +++ b/dev/kernel/StorageKit/ATA.h @@ -8,8 +8,8 @@ #include #include -#include -#include +#include +#include namespace Kernel { /// @brief ATA device interface class. diff --git a/dev/kernel/StorageKit/PRDT.h b/dev/kernel/StorageKit/PRDT.h index f67cad05..f277897f 100644 --- a/dev/kernel/StorageKit/PRDT.h +++ b/dev/kernel/StorageKit/PRDT.h @@ -8,7 +8,7 @@ #include #include -#include +#include #define kPrdtTransferSize (sizeof(Kernel::UShort)) diff --git a/dev/kernel/SwapKit/DiskSwap.h b/dev/kernel/SwapKit/DiskSwap.h index 1832923f..40b3adb0 100644 --- a/dev/kernel/SwapKit/DiskSwap.h +++ b/dev/kernel/SwapKit/DiskSwap.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #define kSwapBlockMaxSize (mib_cast(16)) diff --git a/dev/kernel/src/ACPIFactoryInterface.cc b/dev/kernel/src/ACPIFactoryInterface.cc index 47a81f38..def6f517 100644 --- a/dev/kernel/src/ACPIFactoryInterface.cc +++ b/dev/kernel/src/ACPIFactoryInterface.cc @@ -6,7 +6,7 @@ #include #include -#include +#include #include namespace Kernel { diff --git a/dev/kernel/src/Array.cc b/dev/kernel/src/Array.cc index 7cb1b156..36a8e744 100644 --- a/dev/kernel/src/Array.cc +++ b/dev/kernel/src/Array.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/ArrayList.cc b/dev/kernel/src/ArrayList.cc index 269dc47e..39291935 100644 --- a/dev/kernel/src/ArrayList.cc +++ b/dev/kernel/src/ArrayList.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/Atom.cc b/dev/kernel/src/Atom.cc index 8968a2c2..6e84d7d5 100644 --- a/dev/kernel/src/Atom.cc +++ b/dev/kernel/src/Atom.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include // @file Atom.cpp // @brief Atomic primitives diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc index dfd29770..994a2ba8 100644 --- a/dev/kernel/src/BitMapMgr.cc +++ b/dev/kernel/src/BitMapMgr.cc @@ -11,7 +11,7 @@ #endif #include -#include +#include #define kBitMapMagic (0x10210U) diff --git a/dev/kernel/src/CodeMgr.cc b/dev/kernel/src/CodeMgr.cc index c4ac011c..6146682a 100644 --- a/dev/kernel/src/CodeMgr.cc +++ b/dev/kernel/src/CodeMgr.cc @@ -6,7 +6,7 @@ #include #include -#include +#include namespace Kernel { /***********************************************************************************/ diff --git a/dev/kernel/src/Crc32.cc b/dev/kernel/src/Crc32.cc index 332faa33..fddcb095 100644 --- a/dev/kernel/src/Crc32.cc +++ b/dev/kernel/src/Crc32.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include // @file CRC32.cpp // @brief Check sequence implementation. diff --git a/dev/kernel/src/CxxAbi-AMD64.cc b/dev/kernel/src/CxxAbi-AMD64.cc index c97b99f9..5b0f7c3c 100644 --- a/dev/kernel/src/CxxAbi-AMD64.cc +++ b/dev/kernel/src/CxxAbi-AMD64.cc @@ -9,7 +9,7 @@ #include #include #include -#include +#include atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; diff --git a/dev/kernel/src/CxxAbi-ARM64.cc b/dev/kernel/src/CxxAbi-ARM64.cc index 1605692b..02f3dbcf 100644 --- a/dev/kernel/src/CxxAbi-ARM64.cc +++ b/dev/kernel/src/CxxAbi-ARM64.cc @@ -8,7 +8,7 @@ #include #include -#include +#include atexit_func_entry_t __atexit_funcs[kAtExitMacDestructors]; diff --git a/dev/kernel/src/Defines.cc b/dev/kernel/src/Defines.cc index 7f6e571d..a06b4dd2 100644 --- a/dev/kernel/src/Defines.cc +++ b/dev/kernel/src/Defines.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index 8bb1c930..b7c181c8 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/kernel/src/ErrorOr.cc b/dev/kernel/src/ErrorOr.cc index 69668b2f..a872164c 100644 --- a/dev/kernel/src/ErrorOr.cc +++ b/dev/kernel/src/ErrorOr.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include /***********************************************************************************/ /// @file ErrorOr.cc /// diff --git a/dev/kernel/src/FS/Ext2+FileSystemParser.cc b/dev/kernel/src/FS/Ext2+FileSystemParser.cc index b6d04f46..a3acac73 100644 --- a/dev/kernel/src/FS/Ext2+FileSystemParser.cc +++ b/dev/kernel/src/FS/Ext2+FileSystemParser.cc @@ -11,10 +11,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index c8de1507..0f6e7355 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -12,10 +12,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 84317ad4..bd6a1aee 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -13,10 +13,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include diff --git a/dev/kernel/src/FileMgr.cc b/dev/kernel/src/FileMgr.cc index 06d19e5b..e000965f 100644 --- a/dev/kernel/src/FileMgr.cc +++ b/dev/kernel/src/FileMgr.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include /***********************************************************************************/ /// @file FileMgr.cc diff --git a/dev/kernel/src/GUIDWizard.cc b/dev/kernel/src/GUIDWizard.cc index 48ee1ec6..46915ace 100644 --- a/dev/kernel/src/GUIDWizard.cc +++ b/dev/kernel/src/GUIDWizard.cc @@ -10,7 +10,7 @@ ------------------------------------------- */ #include -#include +#include // begin of ascii 'readable' characters. (A, C, C, 1, 2) #define kUUIDAsciiBegin 47 diff --git a/dev/kernel/src/IPEFDylibObject.cc b/dev/kernel/src/IPEFDylibObject.cc index f9cd758c..6af0718e 100644 --- a/dev/kernel/src/IPEFDylibObject.cc +++ b/dev/kernel/src/IPEFDylibObject.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include /* ------------------------------------------- diff --git a/dev/kernel/src/IndexableProperty.cc b/dev/kernel/src/IndexableProperty.cc index a89ea92d..1d2a1ce8 100644 --- a/dev/kernel/src/IndexableProperty.cc +++ b/dev/kernel/src/IndexableProperty.cc @@ -6,8 +6,8 @@ #include #include -#include -#include +#include +#include /// @brief File indexer API for fast path access. /// BUGS: 0 diff --git a/dev/kernel/src/Json.cc b/dev/kernel/src/Json.cc index 9264b2b8..68ab55fc 100644 --- a/dev/kernel/src/Json.cc +++ b/dev/kernel/src/Json.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include /// @brief Undefined object, is null in length. RTL_INIT_OBJECT(Kernel::Json::kNull, Kernel::Json); diff --git a/dev/kernel/src/KPC.cc b/dev/kernel/src/KPC.cc index 9a76c110..f44b356b 100644 --- a/dev/kernel/src/KPC.cc +++ b/dev/kernel/src/KPC.cc @@ -6,7 +6,7 @@ #include #include -#include +#include namespace Kernel { STATIC Bool kRaiseOnBugCheck = false; diff --git a/dev/kernel/src/KString.cc b/dev/kernel/src/KString.cc index 479eb2fc..9f332cdf 100644 --- a/dev/kernel/src/KString.cc +++ b/dev/kernel/src/KString.cc @@ -4,8 +4,8 @@ ------------------------------------------- */ -#include -#include +#include +#include /// @file KString.cc /// @brief Kernel String manipulation file. diff --git a/dev/kernel/src/MemoryMgr.cc b/dev/kernel/src/MemoryMgr.cc index efb9a35f..2faa24df 100644 --- a/dev/kernel/src/MemoryMgr.cc +++ b/dev/kernel/src/MemoryMgr.cc @@ -8,9 +8,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include /* ------------------------------------------- diff --git a/dev/kernel/src/MutableArray.cc b/dev/kernel/src/MutableArray.cc index 4b07f9ae..b7aaee1c 100644 --- a/dev/kernel/src/MutableArray.cc +++ b/dev/kernel/src/MutableArray.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/Network/IPAddr.cc b/dev/kernel/src/Network/IPAddr.cc index 4437df22..beb69470 100644 --- a/dev/kernel/src/Network/IPAddr.cc +++ b/dev/kernel/src/Network/IPAddr.cc @@ -4,8 +4,8 @@ ------------------------------------------- */ +#include #include -#include namespace Kernel { Char* RawIPAddress::Address() { diff --git a/dev/kernel/src/Network/NetworkDevice.cc b/dev/kernel/src/Network/NetworkDevice.cc index 6f77a244..51c43b48 100644 --- a/dev/kernel/src/Network/NetworkDevice.cc +++ b/dev/kernel/src/Network/NetworkDevice.cc @@ -4,8 +4,8 @@ ------------------------------------------- */ +#include #include -#include namespace Kernel { /// \brief Getter for fNetworkName. diff --git a/dev/kernel/src/New+Delete.cc b/dev/kernel/src/New+Delete.cc index a6bde691..0125b7f7 100644 --- a/dev/kernel/src/New+Delete.cc +++ b/dev/kernel/src/New+Delete.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include void* operator new[](size_t sz) { if (sz == 0) ++sz; diff --git a/dev/kernel/src/OwnPtr.cc b/dev/kernel/src/OwnPtr.cc index 8fd2b985..c716c2f4 100644 --- a/dev/kernel/src/OwnPtr.cc +++ b/dev/kernel/src/OwnPtr.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 25a25122..afc28ceb 100644 --- a/dev/kernel/src/PEFCodeMgr.cc +++ b/dev/kernel/src/PEFCodeMgr.cc @@ -8,10 +8,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include /// @brief PEF stack size symbol. #define kPefStackSizeSymbol "__PEFSizeOfReserveStack" diff --git a/dev/kernel/src/PRDT.cc b/dev/kernel/src/PRDT.cc index f7380d2d..0c84fd29 100644 --- a/dev/kernel/src/PRDT.cc +++ b/dev/kernel/src/PRDT.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #include namespace Kernel { diff --git a/dev/kernel/src/PageMgr.cc b/dev/kernel/src/PageMgr.cc index f60fa57a..e78f4908 100644 --- a/dev/kernel/src/PageMgr.cc +++ b/dev/kernel/src/PageMgr.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #ifdef __NE_AMD64__ #include diff --git a/dev/kernel/src/Pmm.cc b/dev/kernel/src/Pmm.cc index 35ea4195..b9fba20e 100644 --- a/dev/kernel/src/Pmm.cc +++ b/dev/kernel/src/Pmm.cc @@ -5,7 +5,7 @@ ------------------------------------------- */ #include -#include +#include #if defined(__NE_ARM64__) #include diff --git a/dev/kernel/src/Ref.cc b/dev/kernel/src/Ref.cc index c185952b..db584d9c 100644 --- a/dev/kernel/src/Ref.cc +++ b/dev/kernel/src/Ref.cc @@ -4,4 +4,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/Stream.cc b/dev/kernel/src/Stream.cc index 8fd4dab3..e05f6e6d 100644 --- a/dev/kernel/src/Stream.cc +++ b/dev/kernel/src/Stream.cc @@ -9,4 +9,4 @@ ------------------------------------------- */ -#include +#include diff --git a/dev/kernel/src/ThreadLocalStorage.cc b/dev/kernel/src/ThreadLocalStorage.cc index e248e67c..ec315ddf 100644 --- a/dev/kernel/src/ThreadLocalStorage.cc +++ b/dev/kernel/src/ThreadLocalStorage.cc @@ -10,7 +10,7 @@ #include #include #include -#include +#include /***********************************************************************************/ /// @bugs: 0 diff --git a/dev/kernel/src/User.cc b/dev/kernel/src/User.cc index c1a5ca94..e8f30547 100644 --- a/dev/kernel/src/User.cc +++ b/dev/kernel/src/User.cc @@ -14,7 +14,7 @@ #include #include #include -#include +#include #define kStdUserType (0xEE) #define kSuperUserType (0xEF) diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index a901e6d0..0a26938a 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -19,9 +19,9 @@ #include #include #include -#include +#include #include -#include "NewKit/Macros.h" +#include "NeKit/Macros.h" ///! BUGS: 0 diff --git a/dev/kernel/src/UtfUtils.cc b/dev/kernel/src/UtfUtils.cc index 1374ee86..ae17aed7 100644 --- a/dev/kernel/src/UtfUtils.cc +++ b/dev/kernel/src/UtfUtils.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include namespace Kernel { Size urt_string_len(const Utf8Char* str) { diff --git a/dev/kernel/src/Utils.cc b/dev/kernel/src/Utils.cc index 4f47849b..d7cc08af 100644 --- a/dev/kernel/src/Utils.cc +++ b/dev/kernel/src/Utils.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include namespace Kernel { Int32 rt_string_cmp(const Char* src, const Char* cmp, Size size) { diff --git a/dev/kernel/src/Variant.cc b/dev/kernel/src/Variant.cc index 5dd39926..51e5f5b8 100644 --- a/dev/kernel/src/Variant.cc +++ b/dev/kernel/src/Variant.cc @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include namespace Kernel { const Char* Variant::ToString() { diff --git a/dev/modules/ACPI/ACPI.h b/dev/modules/ACPI/ACPI.h index 40b393d5..cfa78ecc 100644 --- a/dev/modules/ACPI/ACPI.h +++ b/dev/modules/ACPI/ACPI.h @@ -11,7 +11,7 @@ https://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html */ -#include +#include #define SDT_OBJECT : public Kernel::SDT diff --git a/dev/modules/ACPI/ACPIFactoryInterface.h b/dev/modules/ACPI/ACPIFactoryInterface.h index 0a10ffc2..3ff53535 100644 --- a/dev/modules/ACPI/ACPIFactoryInterface.h +++ b/dev/modules/ACPI/ACPIFactoryInterface.h @@ -8,9 +8,9 @@ #define __MOD_ACPI_H__ #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/dev/modules/AHCI/AHCI.h b/dev/modules/AHCI/AHCI.h index c6d9ac07..dcdc5faa 100644 --- a/dev/modules/AHCI/AHCI.h +++ b/dev/modules/AHCI/AHCI.h @@ -13,7 +13,7 @@ #pragma once -#include +#include #include /// @file AHCI.h diff --git a/dev/modules/APM/APM.h b/dev/modules/APM/APM.h index 3dbd5e8f..b071a770 100644 --- a/dev/modules/APM/APM.h +++ b/dev/modules/APM/APM.h @@ -6,7 +6,7 @@ #pragma once -#include +#include namespace Kernel { typedef Int32 APMPowerCmd; diff --git a/dev/modules/ATA/ATA.h b/dev/modules/ATA/ATA.h index e7cf200f..34091a36 100644 --- a/dev/modules/ATA/ATA.h +++ b/dev/modules/ATA/ATA.h @@ -14,7 +14,7 @@ #pragma once #include -#include +#include ///! Status register #define ATA_SR_BSY 0x80 diff --git a/dev/modules/CoreGfx/CoreAccess.h b/dev/modules/CoreGfx/CoreAccess.h index 6417db07..f092b5a6 100644 --- a/dev/modules/CoreGfx/CoreAccess.h +++ b/dev/modules/CoreGfx/CoreAccess.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include diff --git a/dev/modules/CoreGfx/CoreGfx.h b/dev/modules/CoreGfx/CoreGfx.h index 2ab8d6e8..7d23c17e 100644 --- a/dev/modules/CoreGfx/CoreGfx.h +++ b/dev/modules/CoreGfx/CoreGfx.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #define fb_init() Kernel::UInt32 kCGCursor = 0 diff --git a/dev/modules/CoreGfx/TextGfx.h b/dev/modules/CoreGfx/TextGfx.h index e19b4743..1bcc1397 100644 --- a/dev/modules/CoreGfx/TextGfx.h +++ b/dev/modules/CoreGfx/TextGfx.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #define kFontSizeX 8 diff --git a/dev/modules/HPET/Defines.h b/dev/modules/HPET/Defines.h index 49f17f99..5317c11f 100644 --- a/dev/modules/HPET/Defines.h +++ b/dev/modules/HPET/Defines.h @@ -11,7 +11,7 @@ #pragma once -#include +#include #include namespace Kernel { diff --git a/dev/modules/LTE/LTE.h b/dev/modules/LTE/LTE.h index 45dec6bc..5eb09f8e 100644 --- a/dev/modules/LTE/LTE.h +++ b/dev/modules/LTE/LTE.h @@ -10,8 +10,8 @@ Purpose: LTE Standard Library. #ifndef _INC_NETWORK_LTE_H_ #define _INC_NETWORK_LTE_H_ -#include -#include +#include +#include /// @brief Long Term Evolution I/O routines. diff --git a/dev/modules/MBCI/MBCI.h b/dev/modules/MBCI/MBCI.h index 99ecf802..aa1eb959 100644 --- a/dev/modules/MBCI/MBCI.h +++ b/dev/modules/MBCI/MBCI.h @@ -7,7 +7,7 @@ #ifndef _INC_MODULE_MBCI_H_ #define _INC_MODULE_MBCI_H_ -#include +#include #include #include diff --git a/dev/modules/NVME/NVME.h b/dev/modules/NVME/NVME.h index 6572187b..c0894194 100644 --- a/dev/modules/NVME/NVME.h +++ b/dev/modules/NVME/NVME.h @@ -12,7 +12,7 @@ #ifndef __MODULE_NVME_H__ #define __MODULE_NVME_H__ -#include +#include /// @file NVME.h /// @brief Non Volatile Memory. diff --git a/dev/modules/Power/PowerFactory.h b/dev/modules/Power/PowerFactory.h index 4f224709..b7c13280 100644 --- a/dev/modules/Power/PowerFactory.h +++ b/dev/modules/Power/PowerFactory.h @@ -7,9 +7,9 @@ #pragma once #include -#include -#include -#include +#include +#include +#include #include #define NE_POWER_FACTORY : public PowerFactory diff --git a/dev/modules/SCSI/SCSI.h b/dev/modules/SCSI/SCSI.h index e0137f3c..d9ede8b4 100644 --- a/dev/modules/SCSI/SCSI.h +++ b/dev/modules/SCSI/SCSI.h @@ -6,7 +6,7 @@ #pragma once -#include +#include /// @file SCSI.h /// @brief Small Computer System Interface device. diff --git a/dev/modules/XHCI/XHCI.h b/dev/modules/XHCI/XHCI.h index 0d2851d7..8829d29b 100644 --- a/dev/modules/XHCI/XHCI.h +++ b/dev/modules/XHCI/XHCI.h @@ -14,7 +14,7 @@ #pragma once -#include +#include using namespace Kernel; diff --git a/public/frameworks/KernelTest.fwrk/headers/KernelTest.h b/public/frameworks/KernelTest.fwrk/headers/KernelTest.h index ccb1a903..04e90964 100644 --- a/public/frameworks/KernelTest.fwrk/headers/KernelTest.h +++ b/public/frameworks/KernelTest.fwrk/headers/KernelTest.h @@ -6,13 +6,13 @@ #pragma once -#include +#include /// @brief Kernel Test Framework. /// @file KernelTest.h #define KT_TEST_VERSION_BCD (0x0001) -#define KT_TEST_VERSION "0.0.1" +#define KT_TEST_VERSION "v0.0.1-kerneltest" #define KT_TEST_FAILURE (1) -- cgit v1.2.3 From 80f5f9dfdaaf68d9e63a7bc3ba1187ca447eadc9 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 23 May 2025 13:04:05 +0200 Subject: refactor(kernel): Refactor HeapMgr functions. what: - mm_new_ptr is now mm_alloc_ptr. - mm_delete_ptr is now mm_free_ptr. Signed-off-by: Amlal El Mahrouss --- dev/ddk/src/ddk_alloc.c | 4 +-- dev/kernel/KernelKit/FileMgr.h | 2 +- dev/kernel/KernelKit/HeapMgr.h | 4 +-- dev/kernel/KernelKit/UserProcessScheduler.inl | 4 +-- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 42 +++++++++++++-------------- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 4 +-- dev/kernel/src/HeapMgr.cc | 4 +-- dev/kernel/src/New+Delete.cc | 12 ++++---- dev/kernel/src/PEFCodeMgr.cc | 16 +++++----- dev/kernel/src/UserProcessScheduler.cc | 14 ++++----- 10 files changed, 53 insertions(+), 53 deletions(-) (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/ddk/src/ddk_alloc.c b/dev/ddk/src/ddk_alloc.c index 1354bce4..0b428b15 100644 --- a/dev/ddk/src/ddk_alloc.c +++ b/dev/ddk/src/ddk_alloc.c @@ -16,7 +16,7 @@ DDK_EXTERN void* kalloc(size_t sz) { if (!sz) ++sz; - void* ptr = ke_call("mm_new_ptr", 1, &sz, sizeof(size_t)); + void* ptr = ke_call("mm_alloc_ptr", 1, &sz, sizeof(size_t)); return ptr; } @@ -28,5 +28,5 @@ DDK_EXTERN void* kalloc(size_t sz) { DDK_EXTERN void kfree(void* ptr) { if (!ptr) return; - ke_call("mm_delete_ptr", 1, ptr, 0); + ke_call("mm_free_ptr", 1, ptr, 0); } diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index 21b8b96e..dcce787f 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -392,7 +392,7 @@ inline FileStream::FileStream(const Encoding* path, const Encod /// @brief destructor of the file stream. template inline FileStream::~FileStream() { - mm_delete_ptr(fFile); + mm_free_ptr(fFile); } } // namespace Kernel diff --git a/dev/kernel/KernelKit/HeapMgr.h b/dev/kernel/KernelKit/HeapMgr.h index 3271dd03..851f3095 100644 --- a/dev/kernel/KernelKit/HeapMgr.h +++ b/dev/kernel/KernelKit/HeapMgr.h @@ -19,7 +19,7 @@ namespace Kernel { /// @brief Declare pointer as free. /// @param heap_ptr the pointer. /// @return a status code regarding the deallocation. -Int32 mm_delete_ptr(VoidPtr heap_ptr); +Int32 mm_free_ptr(VoidPtr heap_ptr); /// @brief Check if pointer is a valid Kernel pointer. /// @param heap_ptr the pointer @@ -31,7 +31,7 @@ Boolean mm_is_valid_ptr(VoidPtr heap_ptr); /// @param wr Read Write bit. /// @param user User enable bit. /// @return The newly allocated pointer, or nullptr. -VoidPtr mm_new_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0); +VoidPtr mm_alloc_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount = 0); /// @brief Protect the heap with a CRC value. /// @param heap_ptr pointer. diff --git a/dev/kernel/KernelKit/UserProcessScheduler.inl b/dev/kernel/KernelKit/UserProcessScheduler.inl index 236262e1..156aa0b5 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.inl +++ b/dev/kernel/KernelKit/UserProcessScheduler.inl @@ -36,13 +36,13 @@ Boolean USER_PROCESS::Delete(ErrorOr ptr) { hal_write_cr3(this->VMRegister); - auto ret = mm_delete_ptr(entry->Entry); + auto ret = mm_free_ptr(entry->Entry); hal_write_cr3(pd); return ret == kErrorSuccess; #else - Bool ret = mm_delete_ptr(ptr.Leak().Leak()); + Bool ret = mm_free_ptr(ptr.Leak().Leak()); return ret == kErrorSuccess; #endif diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 0f6e7355..155c9b9f 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -262,7 +262,7 @@ namespace Detail { const BOOL delete_or_create) { if (mnt) { HEFS_INDEX_NODE_DIRECTORY* tmpdir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); auto start = boot->fStartIND; auto prev_location = start; @@ -294,7 +294,7 @@ namespace Detail { if (expr) { HEFS_INDEX_NODE_DIRECTORY* dirent = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); rt_set_memory(dirent, 0, sizeof(HEFS_INDEX_NODE_DIRECTORY)); @@ -412,8 +412,8 @@ namespace Detail { err_global_get() = kErrorSuccess; - mm_delete_ptr(dirent); - mm_delete_ptr(tmpdir); + mm_free_ptr(dirent); + mm_free_ptr(tmpdir); if (!delete_or_create) ++boot->fINDCount; @@ -438,7 +438,7 @@ namespace Detail { } err_global_get() = kErrorDisk; - mm_delete_ptr(tmpdir); + mm_free_ptr(tmpdir); return NO; } @@ -467,7 +467,7 @@ namespace Detail { HEFS_INDEX_NODE* node = new HEFS_INDEX_NODE(); HEFS_INDEX_NODE_DIRECTORY* dir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); while (YES) { if (err_global_get() == kErrorDiskIsCorrupted) { @@ -543,7 +543,7 @@ namespace Detail { if (mnt) { HEFS_INDEX_NODE_DIRECTORY* dir = - (HEFS_INDEX_NODE_DIRECTORY*) mm_new_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); + (HEFS_INDEX_NODE_DIRECTORY*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE_DIRECTORY), Yes, No); auto hash_file = node->fHashPath; @@ -596,7 +596,7 @@ namespace Detail { mnt->fOutput(mnt->fPacket); - mm_delete_ptr(dir); + mm_free_ptr(dir); return YES; } else if (dir->fINSlices[inode_index] != 0 && delete_or_create) { @@ -646,7 +646,7 @@ namespace Detail { mnt->fOutput(mnt->fPacket); - mm_delete_ptr(dir); + mm_free_ptr(dir); return YES; } @@ -657,7 +657,7 @@ namespace Detail { if (start > boot->fEndIND || start == 0) break; } - mm_delete_ptr(dir); + mm_free_ptr(dir); err_global_get() = kErrorFileNotFound; return NO; } @@ -902,7 +902,7 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, return NO; } - HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_new_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); + 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")); @@ -938,11 +938,11 @@ _Output Bool HeFileSystemParser::INodeDirectoryCtlManip(_Input DriveTrait* mnt, // todo: make it smarter for high-throughput. Detail::hefsi_balance_ind(boot, mnt); - mm_delete_ptr((VoidPtr) boot); + mm_free_ptr((VoidPtr) boot); return YES; } - mm_delete_ptr((VoidPtr) boot); + mm_free_ptr((VoidPtr) boot); return NO; } @@ -983,7 +983,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc return NO; } - HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_new_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); + HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) mm_alloc_ptr(sizeof(HEFS_BOOT_NODE), Yes, No); if (!boot) { err_global_get() = kErrorInvalidData; @@ -1001,7 +1001,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc if (!KStringBuilder::Equals(boot->fMagic, kHeFSMagic) || boot->fVersion != kHeFSVersion) { (Void)(kout << "Invalid Boot Node, HeFS partition is invalid." << kendl); - mm_delete_ptr((VoidPtr) boot); + mm_free_ptr((VoidPtr) boot); err_global_get() = kErrorDisk; return NO; } @@ -1021,7 +1021,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc mnt->fInput(mnt->fPacket); } else { if (start->fFlags & kHeFSFlagsReadOnly) { - mm_delete_ptr((VoidPtr) boot); + mm_free_ptr((VoidPtr) boot); delete start; kout << "Error: File is read-only\r"; @@ -1034,7 +1034,7 @@ _Output Bool HeFileSystemParser::INodeManip(_Input DriveTrait* mnt, VoidPtr bloc } } - mm_delete_ptr((VoidPtr) boot); + mm_free_ptr((VoidPtr) boot); delete start; return YES; } @@ -1058,7 +1058,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } - HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_new_ptr(sizeof(HEFS_INDEX_NODE), Yes, No); + HEFS_INDEX_NODE* node = (HEFS_INDEX_NODE*) mm_alloc_ptr(sizeof(HEFS_INDEX_NODE), Yes, No); if (!node) { err_global_get() = kErrorInvalidData; @@ -1070,7 +1070,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); if (!boot) { - mm_delete_ptr((VoidPtr) node); + mm_free_ptr((VoidPtr) node); err_global_get() = kErrorInvalidData; return NO; @@ -1124,7 +1124,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co node->fHashPath = Detail::hefsi_hash_64(name); if (Detail::hefsi_update_in_status(boot, mnt, dir, node, delete_or_create)) { - mm_delete_ptr((VoidPtr) node); + mm_free_ptr((VoidPtr) node); Detail::hefsi_balance_ind(boot, mnt); @@ -1132,7 +1132,7 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return YES; } - mm_delete_ptr((VoidPtr) node); + mm_free_ptr((VoidPtr) node); err_global_get() = kErrorDirectoryNotFound; return NO; diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index bd6a1aee..f1746a58 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -240,7 +240,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char return nullptr; } - Char* parent_name = (Char*) mm_new_ptr(sizeof(Char) * rt_string_len(name), Yes, No); + Char* parent_name = (Char*) mm_alloc_ptr(sizeof(Char) * rt_string_len(name), Yes, No); /// Locate parent catalog, to then allocate right after it. @@ -269,7 +269,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::CreateCatalog(_Input const Char NEFS_CATALOG_STRUCT* catalog = this->FindCatalog(parent_name, out_lba); - mm_delete_ptr(parent_name); + mm_free_ptr(parent_name); auto& drive = kMountpoint.A(); diff --git a/dev/kernel/src/HeapMgr.cc b/dev/kernel/src/HeapMgr.cc index 6cd8fb24..5280bcc3 100644 --- a/dev/kernel/src/HeapMgr.cc +++ b/dev/kernel/src/HeapMgr.cc @@ -98,7 +98,7 @@ STATIC PageMgr kPageMgr; /// @param wr Read Write bit. /// @param user User enable bit. /// @return The newly allocated pointer. -_Output VoidPtr mm_new_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { +_Output VoidPtr mm_alloc_ptr(SizeT sz, Bool wr, Bool user, SizeT pad_amount) { auto sz_fix = sz; if (sz_fix == 0) return nullptr; @@ -184,7 +184,7 @@ _Output UInt64 mm_get_ptr_flags(VoidPtr heap_ptr) { /// @brief Declare pointer as free. /// @param heap_ptr the pointer. /// @return -_Output Int32 mm_delete_ptr(VoidPtr heap_ptr) { +_Output Int32 mm_free_ptr(VoidPtr heap_ptr) { if (Detail::mm_check_ptr_address(heap_ptr) == No) return kErrorHeapNotPresent; Detail::MM_INFORMATION_BLOCK_PTR heap_info_ptr = diff --git a/dev/kernel/src/New+Delete.cc b/dev/kernel/src/New+Delete.cc index 29bbfbbf..da705f26 100644 --- a/dev/kernel/src/New+Delete.cc +++ b/dev/kernel/src/New+Delete.cc @@ -10,25 +10,25 @@ void* operator new[](size_t sz) { if (sz == 0) ++sz; - return Kernel::mm_new_ptr(sz, true, false); + return Kernel::mm_alloc_ptr(sz, true, false); } void* operator new(size_t sz) { if (sz == 0) ++sz; - return Kernel::mm_new_ptr(sz, true, false); + return Kernel::mm_alloc_ptr(sz, true, false); } void operator delete[](void* ptr) { if (ptr == nullptr) return; - Kernel::mm_delete_ptr(ptr); + Kernel::mm_free_ptr(ptr); } void operator delete(void* ptr) { if (ptr == nullptr) return; - Kernel::mm_delete_ptr(ptr); + Kernel::mm_free_ptr(ptr); } void operator delete(void* ptr, size_t sz) { @@ -36,7 +36,7 @@ void operator delete(void* ptr, size_t sz) { NE_UNUSED(sz); - Kernel::mm_delete_ptr(ptr); + Kernel::mm_free_ptr(ptr); } void operator delete[](void* ptr, size_t sz) { @@ -44,5 +44,5 @@ void operator delete[](void* ptr, size_t sz) { NE_UNUSED(sz); - Kernel::mm_delete_ptr(ptr); + Kernel::mm_free_ptr(ptr); } diff --git a/dev/kernel/src/PEFCodeMgr.cc b/dev/kernel/src/PEFCodeMgr.cc index 9ea9b5b1..e810651a 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) fBad = true; - if (fCachedBlob) mm_delete_ptr(fCachedBlob); + if (fCachedBlob) mm_free_ptr(fCachedBlob); kout << "PEFLoader: Warning: Executable format error!\r"; @@ -89,7 +89,7 @@ PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fFatBinary(false) /// @brief PEF destructor. /***********************************************************************************/ PEFLoader::~PEFLoader() { - if (fCachedBlob) mm_delete_ptr(fCachedBlob); + if (fCachedBlob) mm_free_ptr(fCachedBlob); fFile.Delete(); } @@ -147,7 +147,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { if (container_header->Kind == kind) { if (container_header->Cpu != Detail::ldr_get_platform()) { if (!this->fFatBinary) { - mm_delete_ptr(blob); + mm_free_ptr(blob); return ErrorOr{kErrorInvalidData}; } } @@ -156,7 +156,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { rt_copy_memory((VoidPtr) ((Char*) blob + sizeof(PEFCommandHeader)), container_blob_value, container_header->Size); - mm_delete_ptr(blob); + mm_free_ptr(blob); kout << "PEFLoader: Information: Loaded stub: " << container_header->Name << "!\r"; @@ -165,7 +165,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { HAL::kMMFlagsPresent | HAL::kMMFlagsUser); if (ret != kErrorSuccess) { - mm_delete_ptr(container_blob_value); + mm_free_ptr(container_blob_value); return ErrorOr{kErrorInvalidData}; } @@ -174,7 +174,7 @@ ErrorOr PEFLoader::FindSymbol(const Char* name, Int32 kind) { } } - mm_delete_ptr(blob); + mm_free_ptr(blob); return ErrorOr{kErrorInvalidData}; } @@ -236,7 +236,7 @@ namespace Utils { UserProcessScheduler::The().Spawn(reinterpret_cast(symname.Leak().Leak()), errOrStart.Leak().Leak(), exec.GetBlob().Leak().Leak()); - mm_delete_ptr(symname.Leak().Leak()); + mm_free_ptr(symname.Leak().Leak()); if (id != kSchedInvalidPID) { auto stacksym = exec.FindSymbol(kPefStackSizeSymbol, kPefData); @@ -253,7 +253,7 @@ namespace Utils { UserProcessScheduler::The().TheCurrentTeam().AsArray()[id].StackSize = *(UIntPtr*) stacksym.Leak().Leak(); - mm_delete_ptr(stacksym.Leak().Leak()); + mm_free_ptr(stacksym.Leak().Leak()); } return id; diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 3251e0dc..5996adca 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -129,11 +129,11 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { auto vm_register = kKernelVM; hal_write_cr3(this->VMRegister); - auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount); + auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); hal_write_cr3(vm_register); #else - auto ptr = mm_new_ptr(sz, Yes, Yes, pad_amount); + auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); #endif if (!this->HeapTree) { @@ -241,12 +241,12 @@ STATIC Void sched_free_ptr_tree(PROCESS_HEAP_TREE* memory_ptr_list) { // Deleting memory lists. Make sure to free all of them. while (memory_ptr_list) { if (memory_ptr_list->Entry) { - MUST_PASS(mm_delete_ptr(memory_ptr_list->Entry)); + MUST_PASS(mm_free_ptr(memory_ptr_list->Entry)); } auto next = memory_ptr_list->Next; - mm_delete_ptr(memory_ptr_list); + mm_free_ptr(memory_ptr_list); if (memory_ptr_list->Child) sched_free_ptr_tree(memory_ptr_list->Child); @@ -288,14 +288,14 @@ Void USER_PROCESS::Exit(const Int32& exit_code) { #endif //! Delete image if not done already. - if (this->Image.fCode && mm_is_valid_ptr(this->Image.fCode)) mm_delete_ptr(this->Image.fCode); + if (this->Image.fCode && mm_is_valid_ptr(this->Image.fCode)) mm_free_ptr(this->Image.fCode); //! Delete blob too. - if (this->Image.fBlob && mm_is_valid_ptr(this->Image.fBlob)) mm_delete_ptr(this->Image.fBlob); + if (this->Image.fBlob && mm_is_valid_ptr(this->Image.fBlob)) mm_free_ptr(this->Image.fBlob); //! Delete stack frame. if (this->StackFrame && mm_is_valid_ptr(this->StackFrame)) - mm_delete_ptr((VoidPtr) this->StackFrame); + mm_free_ptr((VoidPtr) this->StackFrame); //! Avoid use after free. this->Image.fBlob = nullptr; -- cgit v1.2.3 From 6551964ad66de7bc7ccb636c54351be2a260612b Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Fri, 23 May 2025 23:31:58 +0200 Subject: feat(kernel/libSystem): Lots of improvements, see below. what: - Reworked NetworkDevice. - Reworked RTL8139 driver. - Don't assert fCleanup on NetworkDevice destructor. - Add new Ref types in libSystem. Signed-off-by: Amlal El Mahrouss --- dev/kernel/FSKit/HeFS.h | 2 +- dev/kernel/FirmwareKit/Handover.h | 2 +- .../HALKit/AMD64/Network/Generic+Basic+RTL8139.cc | 26 ++++- dev/kernel/KernelKit/User.h | 92 --------------- dev/kernel/KernelKit/UserMgr.h | 92 +++++++++++++++ dev/kernel/KernelKit/UserProcessScheduler.h | 2 +- dev/kernel/NetworkKit/NetworkDevice.h | 5 +- dev/kernel/NetworkKit/NetworkDevice.inl | 6 +- dev/kernel/kernel_rsrc.rsrc | 4 +- dev/kernel/src/FS/Ext2+FileSystemParser.cc | 2 +- dev/kernel/src/FS/HeFS+FileSystemParser.cc | 2 +- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 2 +- dev/kernel/src/Network/NetworkDevice.cc | 6 +- dev/kernel/src/User.cc | 129 --------------------- dev/kernel/src/UserMgr.cc | 129 +++++++++++++++++++++ dev/kernel/src/UserProcessScheduler.cc | 1 - dev/user/SystemCalls.h | 4 + 17 files changed, 266 insertions(+), 240 deletions(-) delete mode 100644 dev/kernel/KernelKit/User.h create mode 100644 dev/kernel/KernelKit/UserMgr.h delete mode 100644 dev/kernel/src/User.cc create mode 100644 dev/kernel/src/UserMgr.cc (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/kernel/FSKit/HeFS.h b/dev/kernel/FSKit/HeFS.h index 17a174e3..08452a2b 100644 --- a/dev/kernel/FSKit/HeFS.h +++ b/dev/kernel/FSKit/HeFS.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index 266953d3..d74194ed 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -61,7 +61,7 @@ struct BootInfoHeader final { VoidPtr f_KernelImage; SizeT f_KernelSz; - + VoidPtr f_LibSystemImage; SizeT f_LibSystemSz; diff --git a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc index 57f64712..38c12fee 100644 --- a/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc +++ b/dev/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cc @@ -21,6 +21,10 @@ STATIC BOOL kTXEnabled = NO; STATIC UInt8* kRXUpperLayer = nullptr; STATIC UInt8* kRxBuffer = nullptr; +/***********************************************************************************/ +///@brief RTL8139 Init routine. +/***********************************************************************************/ + EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { if (kTXEnabled) return; @@ -42,7 +46,10 @@ EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { if (timeout > 0x1000) break; } - MUST_PASS(timeout <= 0x1000); + if (timeout <= 0x1000) { + ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "RTL8139: Reset failed"); + return; + } rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRxBuffer); @@ -50,12 +57,16 @@ EXTERN_C Void rtl_init_nic_rtl8139(UInt16 io_base) noexcept { rt_out32(io_base + 0x44, 0xf | (1 << 7)); - // Enable IRQ. rt_out16(io_base + 0x3C, 0x0005); kTXEnabled = YES; } +/***********************************************************************************/ +/// @brief RTL8139 I/O interrupt handler. +/// @note This function is called when the device interrupts to retrieve network data. +/***********************************************************************************/ + EXTERN_C void rtl_rtl8139_interrupt_handler() { if (kIOBase == 0xFFFF) return; @@ -78,4 +89,15 @@ EXTERN_C void rtl_rtl8139_interrupt_handler() { if (!(status & 0x04)) { err_global_get() = kErrorNoNetwork; } +} + +/***********************************************************************************/ +/// @brief RTL8139 get upper layer function +/// @return the upper layer. +/// @retval nullptr if no upper layer is set. +/// @retval pointer to the upper layer if set. +/***********************************************************************************/ + +EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() { + return kRXUpperLayer; } \ No newline at end of file diff --git a/dev/kernel/KernelKit/User.h b/dev/kernel/KernelKit/User.h deleted file mode 100644 index b7e7ac1d..00000000 --- a/dev/kernel/KernelKit/User.h +++ /dev/null @@ -1,92 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#ifndef INC_USER_H -#define INC_USER_H - -/* ------------------------------------------- - - Revision History: - - 04/03/25: Set users directory as /user/ instead of /usr/ - - ------------------------------------------- */ - -#include -#include -#include -#include - -///! We got the Super, Standard (%s format) and Guest user, -///! all are used to make authorization operations on the OS. -#define kSuperUser "OS AUTHORITY/MGMT/%s" -#define kGuestUser "OS AUTHORITY/GUEST/%s" -#define kStdUser "OS AUTHORITY/STD/%s" - -#define kUsersDir "/users/" - -#define kMaxUserNameLen (256U) -#define kMaxUserTokenLen (256U) - -namespace Kernel { -class User; - -enum class UserRingKind { - kRingInvalid = 0, - kRingStdUser = 1, - kRingSuperUser = 2, - kRingGuestUser = 5, - kRingCount = 3, -}; - -typedef Char* UserPublicKey; -typedef Char UserPublicKeyType; - -/// @brief System User class. -class User final { - public: - User() = delete; - - User(const Int32& sel, const Char* username); - User(const UserRingKind& kind, const Char* username); - - ~User(); - - public: - NE_COPY_DEFAULT(User) - - public: - bool operator==(const User& lhs); - bool operator!=(const User& lhs); - - public: - /// @brief Get software ring - const UserRingKind& Ring() noexcept; - - /// @brief Get user name - Char* Name() noexcept; - - /// @brief Is he a standard user? - Bool IsStdUser() noexcept; - - /// @brief Is she a super user? - Bool IsSuperUser() noexcept; - - /// @brief Saves a password from the public key. - Bool Save(const UserPublicKey password) noexcept; - - /// @brief Checks if a password matches the **password**. - /// @param password the password to check. - Bool Login(const UserPublicKey password) noexcept; - - private: - UserRingKind mUserRing{UserRingKind::kRingStdUser}; - Char mUserName[kMaxUserNameLen] = {0}; - UInt64 mUserFNV{0UL}; -}; -} // namespace Kernel - -#endif /* ifndef INC_USER_H */ diff --git a/dev/kernel/KernelKit/UserMgr.h b/dev/kernel/KernelKit/UserMgr.h new file mode 100644 index 00000000..b7e7ac1d --- /dev/null +++ b/dev/kernel/KernelKit/UserMgr.h @@ -0,0 +1,92 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#ifndef INC_USER_H +#define INC_USER_H + +/* ------------------------------------------- + + Revision History: + + 04/03/25: Set users directory as /user/ instead of /usr/ + + ------------------------------------------- */ + +#include +#include +#include +#include + +///! We got the Super, Standard (%s format) and Guest user, +///! all are used to make authorization operations on the OS. +#define kSuperUser "OS AUTHORITY/MGMT/%s" +#define kGuestUser "OS AUTHORITY/GUEST/%s" +#define kStdUser "OS AUTHORITY/STD/%s" + +#define kUsersDir "/users/" + +#define kMaxUserNameLen (256U) +#define kMaxUserTokenLen (256U) + +namespace Kernel { +class User; + +enum class UserRingKind { + kRingInvalid = 0, + kRingStdUser = 1, + kRingSuperUser = 2, + kRingGuestUser = 5, + kRingCount = 3, +}; + +typedef Char* UserPublicKey; +typedef Char UserPublicKeyType; + +/// @brief System User class. +class User final { + public: + User() = delete; + + User(const Int32& sel, const Char* username); + User(const UserRingKind& kind, const Char* username); + + ~User(); + + public: + NE_COPY_DEFAULT(User) + + public: + bool operator==(const User& lhs); + bool operator!=(const User& lhs); + + public: + /// @brief Get software ring + const UserRingKind& Ring() noexcept; + + /// @brief Get user name + Char* Name() noexcept; + + /// @brief Is he a standard user? + Bool IsStdUser() noexcept; + + /// @brief Is she a super user? + Bool IsSuperUser() noexcept; + + /// @brief Saves a password from the public key. + Bool Save(const UserPublicKey password) noexcept; + + /// @brief Checks if a password matches the **password**. + /// @param password the password to check. + Bool Login(const UserPublicKey password) noexcept; + + private: + UserRingKind mUserRing{UserRingKind::kRingStdUser}; + Char mUserName[kMaxUserNameLen] = {0}; + UInt64 mUserFNV{0UL}; +}; +} // namespace Kernel + +#endif /* ifndef INC_USER_H */ diff --git a/dev/kernel/KernelKit/UserProcessScheduler.h b/dev/kernel/KernelKit/UserProcessScheduler.h index 1815a558..14986ab6 100644 --- a/dev/kernel/KernelKit/UserProcessScheduler.h +++ b/dev/kernel/KernelKit/UserProcessScheduler.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include //////////////////////////////////////////////////// diff --git a/dev/kernel/NetworkKit/NetworkDevice.h b/dev/kernel/NetworkKit/NetworkDevice.h index 7ed67bab..48fed575 100644 --- a/dev/kernel/NetworkKit/NetworkDevice.h +++ b/dev/kernel/NetworkKit/NetworkDevice.h @@ -23,7 +23,7 @@ class NetworkDevice final : public IDeviceObject { public: NetworkDevice(void (*out)(IDeviceObject*, NetworkDeviceCommand), void (*in)(IDeviceObject*, NetworkDeviceCommand), - void (*onCleanup)(void) = nullptr); + void (*cleanup)(void) = nullptr); ~NetworkDevice() override; @@ -36,10 +36,9 @@ class NetworkDevice final : public IDeviceObject { Boolean Name(const Char* newStr); private: - static constexpr auto cNetworkNameLen = 512; + static constexpr auto kNetworkNameLen = 512; Void (*fCleanup)(void); - Char fNetworkName[cNetworkNameLen]; }; struct NetworkDeviceCommand final { diff --git a/dev/kernel/NetworkKit/NetworkDevice.inl b/dev/kernel/NetworkKit/NetworkDevice.inl index 812c0248..84ec9edc 100644 --- a/dev/kernel/NetworkKit/NetworkDevice.inl +++ b/dev/kernel/NetworkKit/NetworkDevice.inl @@ -8,6 +8,10 @@ Dtor and ctors. */ +#ifndef __INC_NETWORK_DEVICE_H__ +#include +#endif // __INC_NETWORK_DEVICE_H__ + namespace Kernel { inline NetworkDevice::NetworkDevice(void (*out)(IDeviceObject*, NetworkDeviceCommand), @@ -21,8 +25,6 @@ inline NetworkDevice::NetworkDevice(void (*out)(IDeviceObject #include #include -#include +#include #include #include #include diff --git a/dev/kernel/src/FS/HeFS+FileSystemParser.cc b/dev/kernel/src/FS/HeFS+FileSystemParser.cc index 155c9b9f..a18abaf8 100644 --- a/dev/kernel/src/FS/HeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/HeFS+FileSystemParser.cc @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index f1746a58..97b2ff36 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/dev/kernel/src/Network/NetworkDevice.cc b/dev/kernel/src/Network/NetworkDevice.cc index 51c43b48..02cb0e73 100644 --- a/dev/kernel/src/Network/NetworkDevice.cc +++ b/dev/kernel/src/Network/NetworkDevice.cc @@ -11,7 +11,7 @@ namespace Kernel { /// \brief Getter for fNetworkName. /// \return Network device name. const Char* NetworkDevice::Name() const { - return this->fNetworkName; + return "/devices/net{}"; } /// \brief Setter for fNetworkName. @@ -20,9 +20,9 @@ Boolean NetworkDevice::Name(const Char* name) { if (*name == 0) return NO; - if (rt_string_len(name) > cNetworkNameLen) return NO; + if (rt_string_len(name) > kNetworkNameLen) return NO; - rt_copy_memory((VoidPtr) name, (VoidPtr) this->fNetworkName, rt_string_len(name)); + rt_copy_memory((VoidPtr) name, (VoidPtr) this->Name(), rt_string_len(this->Name())); return YES; } diff --git a/dev/kernel/src/User.cc b/dev/kernel/src/User.cc deleted file mode 100644 index 1859be12..00000000 --- a/dev/kernel/src/User.cc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * ======================================================== - * - * NeKernel - * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - * - * File: User.cc - * Purpose: User class, used to provide authentication and security. - * - * ======================================================== - */ - -#include -#include -#include -#include -#include - -#define kStdUserType (0xEE) -#define kSuperUserType (0xEF) - -/// @file User.cc -/// @brief Multi-user support. - -namespace Kernel { -namespace Detail { - //////////////////////////////////////////////////////////// - /// \brief Constructs a password by hashing the password. - /// \param password password to hash. - /// \return the hashed password - //////////////////////////////////////////////////////////// - STATIC UInt64 user_fnv_generator(const Char* password, User* user) { - if (!password || !user) return 1; - if (*password == 0) return 1; - - kout << "user_fnv_generator: Hashing user password...\r"; - - const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; - const UInt64 FNV_PRIME = 0x100000001b3ULL; - - UInt64 hash = FNV_OFFSET_BASIS; - - while (*password) { - hash ^= (Utf8Char) (*password++); - hash *= FNV_PRIME; - } - - kout << "user_fnv_generator: Hashed user password.\r"; - - return 0; - } -} // namespace Detail - -//////////////////////////////////////////////////////////// -/// @brief User ring constructor. -//////////////////////////////////////////////////////////// -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)); -} - -//////////////////////////////////////////////////////////// -/// @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)); -} - -//////////////////////////////////////////////////////////// -/// @brief User destructor class. -//////////////////////////////////////////////////////////// -User::~User() = default; - -Bool User::Save(const UserPublicKey password) noexcept { - if (!password || *password == 0) return No; - - this->mUserFNV = Detail::user_fnv_generator(password, this); - - kout << "User::Save: Saved password successfully...\r"; - - return Yes; -} - -Bool User::Login(const UserPublicKey password) noexcept { - if (!password || !*password) return No; - - // now check if the password matches. - if (this->mUserFNV == Detail::user_fnv_generator(password, this)) { - kout << "User::Login: Password matches.\r"; - return Yes; - } - - kout << "User::Login: Password doesn't match.\r"; - return No; -} - -Bool User::operator==(const User& lhs) { - return lhs.mUserRing == this->mUserRing; -} - -Bool User::operator!=(const User& lhs) { - return lhs.mUserRing != this->mUserRing; -} - -//////////////////////////////////////////////////////////// -/// @brief Returns the user's name. -//////////////////////////////////////////////////////////// - -Char* User::Name() noexcept { - return this->mUserName; -} - -//////////////////////////////////////////////////////////// -/// @brief Returns the user's ring. -/// @return The king of ring the user is attached to. -//////////////////////////////////////////////////////////// - -const UserRingKind& User::Ring() noexcept { - return this->mUserRing; -} - -Bool User::IsStdUser() noexcept { - return this->Ring() == UserRingKind::kRingStdUser; -} - -Bool User::IsSuperUser() noexcept { - return this->Ring() == UserRingKind::kRingSuperUser; -} -} // namespace Kernel diff --git a/dev/kernel/src/UserMgr.cc b/dev/kernel/src/UserMgr.cc new file mode 100644 index 00000000..c41b445b --- /dev/null +++ b/dev/kernel/src/UserMgr.cc @@ -0,0 +1,129 @@ +/* + * ======================================================== + * + * NeKernel + * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + * + * File: User.cc + * Purpose: User class, used to provide authentication and security. + * + * ======================================================== + */ + +#include +#include +#include +#include +#include + +#define kStdUserType (0xEE) +#define kSuperUserType (0xEF) + +/// @file User.cc +/// @brief Multi-user support. + +namespace Kernel { +namespace Detail { + //////////////////////////////////////////////////////////// + /// \brief Constructs a password by hashing the password. + /// \param password password to hash. + /// \return the hashed password + //////////////////////////////////////////////////////////// + STATIC UInt64 user_fnv_generator(const Char* password, User* user) { + if (!password || !user) return 1; + if (*password == 0) return 1; + + kout << "user_fnv_generator: Hashing user password...\r"; + + const UInt64 FNV_OFFSET_BASIS = 0xcbf29ce484222325ULL; + const UInt64 FNV_PRIME = 0x100000001b3ULL; + + UInt64 hash = FNV_OFFSET_BASIS; + + while (*password) { + hash ^= (Utf8Char) (*password++); + hash *= FNV_PRIME; + } + + kout << "user_fnv_generator: Hashed user password.\r"; + + return 0; + } +} // namespace Detail + +//////////////////////////////////////////////////////////// +/// @brief User ring constructor. +//////////////////////////////////////////////////////////// +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)); +} + +//////////////////////////////////////////////////////////// +/// @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)); +} + +//////////////////////////////////////////////////////////// +/// @brief User destructor class. +//////////////////////////////////////////////////////////// +User::~User() = default; + +Bool User::Save(const UserPublicKey password) noexcept { + if (!password || *password == 0) return No; + + this->mUserFNV = Detail::user_fnv_generator(password, this); + + kout << "User::Save: Saved password successfully...\r"; + + return Yes; +} + +Bool User::Login(const UserPublicKey password) noexcept { + if (!password || !*password) return No; + + // now check if the password matches. + if (this->mUserFNV == Detail::user_fnv_generator(password, this)) { + kout << "User::Login: Password matches.\r"; + return Yes; + } + + kout << "User::Login: Password doesn't match.\r"; + return No; +} + +Bool User::operator==(const User& lhs) { + return lhs.mUserRing == this->mUserRing; +} + +Bool User::operator!=(const User& lhs) { + return lhs.mUserRing != this->mUserRing; +} + +//////////////////////////////////////////////////////////// +/// @brief Returns the user's name. +//////////////////////////////////////////////////////////// + +Char* User::Name() noexcept { + return this->mUserName; +} + +//////////////////////////////////////////////////////////// +/// @brief Returns the user's ring. +/// @return The king of ring the user is attached to. +//////////////////////////////////////////////////////////// + +const UserRingKind& User::Ring() noexcept { + return this->mUserRing; +} + +Bool User::IsStdUser() noexcept { + return this->Ring() == UserRingKind::kRingStdUser; +} + +Bool User::IsSuperUser() noexcept { + return this->Ring() == UserRingKind::kRingSuperUser; +} +} // namespace Kernel diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 5996adca..77421f5f 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -21,7 +21,6 @@ #include #include #include -#include "NeKit/Macros.h" ///! BUGS: 0 diff --git a/dev/user/SystemCalls.h b/dev/user/SystemCalls.h index c1b70513..d40dc127 100644 --- a/dev/user/SystemCalls.h +++ b/dev/user/SystemCalls.h @@ -23,6 +23,10 @@ typedef Ref FSRef; typedef Ref DLLRef; typedef Ref ThreadRef; typedef Ref SocketRef; +typedef Ref NetworkRef; +typedef Ref MutexRef; +typedef Ref EventRef; +typedef Ref SemaphoreRef; // ------------------------------------------------------------------------------------------ // /// @brief Dynamic Loader API. -- cgit v1.2.3 From f4babecc6d72aae688ad85fc726e22dbd1f82219 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 26 May 2025 20:29:57 +0200 Subject: feat!: Add IFS layer within DriveMgr, and IFS API. also: - Use ThreadID in AP system. - Refactor kernel according to new IFS layer. Signed-off-by: Amlal El Mahrouss --- dev/boot/src/root/ifs.json | 10 +++ dev/kernel/ArchKit/ArchKit.h | 2 - dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 4 +- dev/kernel/KernelKit/CodeMgr.h | 4 +- dev/kernel/KernelKit/DriveMgr.h | 16 +--- dev/kernel/KernelKit/IFS.h | 25 ++++++ dev/kernel/amd64-desktop.make | 2 +- dev/kernel/src/DriveMgr+IO.cc | 89 ---------------------- dev/kernel/src/FS/NeFS+FileSystemParser.cc | 1 + dev/kernel/src/IFS.cc | 89 ++++++++++++++++++++++ dev/kernel/src/UserProcessScheduler.cc | 1 + dev/user/SystemCalls.h | 20 +++-- 12 files changed, 148 insertions(+), 115 deletions(-) create mode 100644 dev/boot/src/root/ifs.json create mode 100644 dev/kernel/KernelKit/IFS.h delete mode 100644 dev/kernel/src/DriveMgr+IO.cc create mode 100644 dev/kernel/src/IFS.cc (limited to 'dev/kernel/src/FS/NeFS+FileSystemParser.cc') diff --git a/dev/boot/src/root/ifs.json b/dev/boot/src/root/ifs.json new file mode 100644 index 00000000..354ab503 --- /dev/null +++ b/dev/boot/src/root/ifs.json @@ -0,0 +1,10 @@ +{ + "type": "IFS", + "sys": [ + "/~drivers/fat32.sys", + "/~drivers/ntfs.sys", + "/~drivers/ext4.sys", + "/~drivers/iso9660.sys", + "/~drivers/nfs4.sys" + ] +} \ No newline at end of file diff --git a/dev/kernel/ArchKit/ArchKit.h b/dev/kernel/ArchKit/ArchKit.h index 08e8ab88..b6637ec1 100644 --- a/dev/kernel/ArchKit/ArchKit.h +++ b/dev/kernel/ArchKit/ArchKit.h @@ -77,8 +77,6 @@ struct HalSyscallEntry final { operator bool() { return fHooked; } }; -EXTERN_C Kernel::HAL::StackFramePtr mp_get_current_task(Kernel::Int64 pid); - inline Kernel::Array kSysCalls; inline Kernel::Array kKernCalls; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 1fbf9fea..cb1ec59b 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -101,7 +101,7 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C HAL::StackFramePtr mp_get_current_task(Int64 thrdid) { +EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) { if (thrdid > kSMPCount) return nullptr; return kHWThread[thrdid].mFramePtr; } @@ -112,7 +112,7 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(Int64 thrdid) { /// @param thrdid The thread ID. /***********************************************************************************/ -EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ProcessID thrdid) { +EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) { if (thrdid > kSMPCount) return NO; if (!stack_frame) return NO; diff --git a/dev/kernel/KernelKit/CodeMgr.h b/dev/kernel/KernelKit/CodeMgr.h index f4d46b4b..072ba4d5 100644 --- a/dev/kernel/KernelKit/CodeMgr.h +++ b/dev/kernel/KernelKit/CodeMgr.h @@ -23,10 +23,10 @@ namespace Kernel { typedef void (*rtl_main_kind)(void); /// @brief C++ Constructor entrypoint. -typedef void (*rtl_ctor_kind)(void); +typedef void (*rtl_cxx_ctor_kind)(void); /// @brief C++ Destructor entrypoint. -typedef void (*rtl_dtor_kind)(void); +typedef void (*rtl_cxx_dtor_kind)(void); /// @brief Executes a new process from a function. Kernel code only. /// @note This sets up a new stack, anything on the main function that calls the Kernel will not be diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index 684e2e5c..4a530deb 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -23,6 +23,8 @@ #define drv_sector_cnt(SIZE, SECTOR_SZ) (((SIZE) + (SECTOR_SZ)) / (SECTOR_SZ)) +#define kDriveHiddenPrefix '~' + namespace Kernel { enum { kInvalidDrive = -1, @@ -159,20 +161,6 @@ namespace Detect { Void io_drv_input(DriveTrait::DrivePacket pckt); Void io_drv_output(DriveTrait::DrivePacket pckt); - -/// @brief Read from IFS disk. -/// @param Mnt mounted interface. -/// @param DrvTrait drive info -/// @param DrvIndex drive index. -/// @return -Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex); - -/// @brief Write to IFS disk. -/// @param Mnt mounted interface. -/// @param DrvTrait drive info -/// @param DrvIndex drive index. -/// @return -Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex); } // namespace Kernel #endif /* ifndef INC_DRIVE_MANAGER_H */ diff --git a/dev/kernel/KernelKit/IFS.h b/dev/kernel/KernelKit/IFS.h new file mode 100644 index 00000000..5555764f --- /dev/null +++ b/dev/kernel/KernelKit/IFS.h @@ -0,0 +1,25 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#pragma once + +#include + +namespace Kernel { +/// @brief Read from IFS disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex); + +/// @brief Write to IFS disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex); +} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 49593101..21488782 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_HEFS__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot +CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_HEFS__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot ASM = nasm diff --git a/dev/kernel/src/DriveMgr+IO.cc b/dev/kernel/src/DriveMgr+IO.cc deleted file mode 100644 index 9137c91e..00000000 --- a/dev/kernel/src/DriveMgr+IO.cc +++ /dev/null @@ -1,89 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include -#include - -/************************************************************* - * - * File: DriveMgr+IO.cc - * Purpose: Filesystem to mountpoint interface. - * Date: 3/26/24 - * - * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - * - *************************************************************/ - -/// Useful macros regarding the IFS. - -#define fsi_ifs_write(DRV, TRAITS, MP) (MP->DRV()).fOutput(TRAITS) -#define fsi_ifs_read(DRV, TRAITS, MP) (MP->DRV()).fInput(TRAITS) - -namespace Kernel { -/// @brief Read from newfs disk. -/// @param Mnt mounted interface. -/// @param DrvTrait drive info -/// @param DrvIndex drive index. -/// @return -Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) { - if (!Mnt) return 1; - - DrvTrait.fPacket.fPacketGood = false; - - switch (DrvIndex) { - case MountpointInterface::kDriveIndexA: { - fsi_ifs_read(A, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexB: { - fsi_ifs_read(B, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexC: { - fsi_ifs_read(C, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexD: { - fsi_ifs_read(D, DrvTrait.fPacket, Mnt); - break; - } - } - - return DrvTrait.fPacket.fPacketGood; -} - -/// @brief Write to newfs disk. -/// @param Mnt mounted interface. -/// @param DrvTrait drive info -/// @param DrvIndex drive index. -/// @return -Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) { - if (!Mnt) return 1; - - DrvTrait.fPacket.fPacketGood = false; - - switch (DrvIndex) { - case MountpointInterface::kDriveIndexA: { - fsi_ifs_write(A, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexB: { - fsi_ifs_write(B, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexC: { - fsi_ifs_write(C, DrvTrait.fPacket, Mnt); - break; - } - case MountpointInterface::kDriveIndexD: { - fsi_ifs_write(D, DrvTrait.fPacket, Mnt); - break; - } - } - - return DrvTrait.fPacket.fPacketGood; -} -} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/src/FS/NeFS+FileSystemParser.cc b/dev/kernel/src/FS/NeFS+FileSystemParser.cc index 97b2ff36..dd0a1d9a 100644 --- a/dev/kernel/src/FS/NeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/NeFS+FileSystemParser.cc @@ -10,6 +10,7 @@ #include #include +#include #include #include #include diff --git a/dev/kernel/src/IFS.cc b/dev/kernel/src/IFS.cc new file mode 100644 index 00000000..ba2ec8c0 --- /dev/null +++ b/dev/kernel/src/IFS.cc @@ -0,0 +1,89 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include +#include + +/************************************************************* + * + * File: IFS.cc + * Purpose: Filesystem to mountpoint interface. + * Date: 05/26/2025 + * + * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + * + *************************************************************/ + +/// Useful macros regarding the IFS. + +#define fsi_ifs_write(DRV, TRAITS, MP) (MP->DRV()).fOutput(TRAITS) +#define fsi_ifs_read(DRV, TRAITS, MP) (MP->DRV()).fInput(TRAITS) + +namespace Kernel { +/// @brief Read from fs disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Int32 fs_ifs_read(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) { + if (!Mnt) return kErrorDisk; + + DrvTrait.fPacket.fPacketGood = false; + + switch (DrvIndex) { + case MountpointInterface::kDriveIndexA: { + fsi_ifs_read(A, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexB: { + fsi_ifs_read(B, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexC: { + fsi_ifs_read(C, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexD: { + fsi_ifs_read(D, DrvTrait.fPacket, Mnt); + break; + } + } + + return DrvTrait.fPacket.fPacketGood ? kErrorSuccess : kErrorDisk; +} + +/// @brief Write to fs disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Int32 fs_ifs_write(MountpointInterface* Mnt, DriveTrait& DrvTrait, Int32 DrvIndex) { + if (!Mnt) return kErrorDisk; + + DrvTrait.fPacket.fPacketGood = false; + + switch (DrvIndex) { + case MountpointInterface::kDriveIndexA: { + fsi_ifs_write(A, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexB: { + fsi_ifs_write(B, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexC: { + fsi_ifs_write(C, DrvTrait.fPacket, Mnt); + break; + } + case MountpointInterface::kDriveIndexD: { + fsi_ifs_write(D, DrvTrait.fPacket, Mnt); + break; + } + } + + return DrvTrait.fPacket.fPacketGood ? kErrorSuccess : kErrorDisk; +} +} // namespace Kernel \ No newline at end of file diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index f900f984..4bbd085a 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -126,6 +126,7 @@ ErrorOr USER_PROCESS::New(SizeT sz, SizeT pad_amount) { #ifdef __NE_VIRTUAL_MEMORY_SUPPORT__ auto vm_register = kKernelVM; + hal_write_cr3(this->VMRegister); auto ptr = mm_alloc_ptr(sz, Yes, Yes, pad_amount); diff --git a/dev/user/SystemCalls.h b/dev/user/SystemCalls.h index e8b4e59c..d77c0b8f 100644 --- a/dev/user/SystemCalls.h +++ b/dev/user/SystemCalls.h @@ -20,7 +20,7 @@ typedef VoidPtr Ref; typedef Ref IORef; typedef Ref FSRef; -typedef Ref DLLRef; +typedef Ref DylibRef; typedef Ref ThreadRef; typedef Ref SocketRef; typedef Ref NetworkRef; @@ -36,18 +36,18 @@ typedef Ref SemaphoreRef; /// @param symbol the symbol to look for /// @param dll_handle the Dylib handle. /// @return the proc pointer. -IMPORT_C Ref LdrGetDLLSymbolFromHandle(_Input const Char* symbol, _Input Ref dll_handle); +IMPORT_C Ref LdrGetDylibSymbolFromHandle(_Input const Char* symbol, _Input Ref dll_handle); /// @brief Open Dylib handle. /// @param path dll path. /// @param drv driver letter. /// @return a dylib ref. -IMPORT_C Ref LdrOpenDLLHandle(_Input const Char* path, _Input const Char* drive_letter); +IMPORT_C Ref LdrOpenDylibHandle(_Input const Char* path, _Input const Char* drive_letter); /// @brief Close Dylib handle /// @param dll_handle the dylib ref. /// @return whether it closed or not. -IMPORT_C UInt32 LdrCloseDLLHandle(_Input Ref* dll_handle); +IMPORT_C UInt32 LdrCloseDylibHandle(_Input Ref* dll_handle); // ------------------------------------------------------------------------------------------ // // File API. @@ -360,7 +360,17 @@ IMPORT_C BOOL FsCreateFile(const Char* path); IMPORT_C BOOL FsCreateAlias(const Char* path, const Char* from); // ------------------------------------------------------------------------------------------ // -// @brief String API. +// @brief Installable Filesystem API. +// ------------------------------------------------------------------------------------------ // + +IMPORT_C BOOL IfsMount(const Char* path, const Char* drive_letter); + +IMPORT_C BOOL IfsUnmount(const Char* drive_letter); + +IMPORT_C BOOL IfsIsMounted(const Char* drive_letter); + +// ------------------------------------------------------------------------------------------ // +// @brief String Manip API. // ------------------------------------------------------------------------------------------ // IMPORT_C Char* StrFmt(const Char* fmt, ...); -- cgit v1.2.3