diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-09-04 12:56:23 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-09-04 12:56:23 +0200 |
| commit | a0a90c80e5dd17df8f609aebc253b4bf9147f90f (patch) | |
| tree | 459f98ea125db490e887bd85b38fd9165a9491b4 /dev/ZKA | |
| parent | cc9ce57cac59bd443e2319e3b8f427172b93f7da (diff) | |
Created a new branch for the overhaul project.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA')
35 files changed, 223 insertions, 317 deletions
diff --git a/dev/ZKA/FirmwareKit/Handover.hxx b/dev/ZKA/FirmwareKit/Handover.hxx index 46fca139..80d68afa 100644 --- a/dev/ZKA/FirmwareKit/Handover.hxx +++ b/dev/ZKA/FirmwareKit/Handover.hxx @@ -62,10 +62,9 @@ namespace Kernel::HEL UInt64 f_Magic; UInt64 f_Version; - VoidPtr f_VirtualStart; + VoidPtr f_BitMapStart; SizeT f_VirtualSize; VoidPtr f_PhysicalStart; - VoidPtr f_HeapStart; VoidPtr f_KernelImage; VoidPtr f_StartupChime; diff --git a/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx new file mode 100644 index 00000000..677b1219 --- /dev/null +++ b/dev/ZKA/HALKit/AMD64/HalBitMapMgr.cxx @@ -0,0 +1,99 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#include <ArchKit/ArchKit.hxx> + +#define cVMHMagic ((Kernel::UIntPtr)0x10210) + +#ifdef __ZKA_AMD64__ +#include <HALKit/AMD64/HalPageAlloc.hxx> +#elif defined(__ZKA_ARM64__) +#include <HALKit/ARM64/HalPageAlloc.hxx> +#endif + +#include <NewKit/Defines.hxx> +#include <NewKit/KernelCheck.hxx> + +namespace Kernel +{ + namespace HAL + { + namespace Detail + { + struct AllocatorTraits final + { + /// @brief Iterate over availables pages for a free one. + /// @return The new address which was found. + VoidPtr FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) noexcept + { + while (base_ptr && size) + { + UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(base_ptr); + + if (ptr_bit_set[0] != cVMHMagic) + { + ptr_bit_set[0] = cVMHMagic; + ptr_bit_set[1] = size; + + kcout << "BBP: STATUS\r"; + kcout << "BBP: MAG: " << hex_number(ptr_bit_set[0]) << endl; + kcout << "BBP: ADDRESS: " << hex_number((UIntPtr)ptr_bit_set) << endl; + kcout << "BBP: SIZE: " << hex_number(ptr_bit_set[1]) << endl; + + if (rw) + mm_update_pte(base_ptr, eFlagsRw); + + if (user) + mm_update_pte(base_ptr, eFlagsUser); + + return (VoidPtr)(ptr_bit_set + 2); + } + + base_ptr = reinterpret_cast<VoidPtr>(reinterpret_cast<UIntPtr>(base_ptr) + size); + } + + return nullptr; + } + }; + } // namespace Detail + + /// @brief Allocate a new page to be used by the OS. + /// @param rw read/write bit. + /// @param user user bit. + /// @return + auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr + { + VoidPtr ptr_new = nullptr; + Detail::AllocatorTraits traits; + + ptr_new = traits.FindBitMap(kKernelVirtualStart, size, rw, user); + + return ptr_new; + } + + auto mm_free_bitmap(VoidPtr page_ptr) -> Bool + { + if (!page_ptr) + return false; + + UIntPtr* ptr_bit_set = reinterpret_cast<UIntPtr*>(page_ptr) - 2; + + if (!ptr_bit_set[0] || + ptr_bit_set[0] != cVMHMagic) + return false; + + kcout << "BBP: FREE STATUS\r"; + kcout << "BBP: MAG: " << hex_number(ptr_bit_set[0]) << endl; + kcout << "BBP: ADDRESSS: " << hex_number((UIntPtr)ptr_bit_set) << endl; + kcout << "BBP: SIZE: " << hex_number(ptr_bit_set[1]) << endl; + + ptr_bit_set[0] = 0UL; + ptr_bit_set[1] = 0UL; + + return true; + } + } // namespace HAL +} // namespace Kernel diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index 611ec596..1bb54588 100644 --- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx +++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -13,6 +13,9 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); + + Kernel::UserProcessHelper::StartScheduling(); + Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } /// @brief Handle page fault. @@ -20,6 +23,8 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); + + Kernel::UserProcessHelper::StartScheduling(); Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } @@ -28,6 +33,8 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); + + Kernel::UserProcessHelper::StartScheduling(); Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } @@ -44,6 +51,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); + + Kernel::UserProcessHelper::StartScheduling(); Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx index 2e76d73a..b524b04c 100644 --- a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx +++ b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx @@ -160,10 +160,10 @@ namespace Kernel::HAL { fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process = &UserProcessScheduler::The().CurrentProcess().Leak(); - return true; + return Yes; } - return false; + return No; } /***********************************************************************************/ diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx index 4474295f..19d62965 100644 --- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx @@ -47,8 +47,6 @@ namespace Kernel::HAL for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx) { - MUST_PASS(ptr_ivt[idt_indx]); - Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate; @@ -62,8 +60,6 @@ namespace Kernel::HAL for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx) { - MUST_PASS(ptr_ivt[idt_indx]); - Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate; diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index 34398871..33c3f689 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -56,7 +56,6 @@ namespace Kernel::HAL Kernel::Property cKernelVersion; Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; -EXTERN Kernel::Boolean kAllocationInProgress; EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; Kernel::Void hal_real_init(Kernel::Void) noexcept; @@ -93,17 +92,12 @@ EXTERN_C void hal_init_platform( Kernel::Void hal_real_init(Kernel::Void) noexcept { - // reset kAllocationInProgress field to zero. - kAllocationInProgress = false; - - kKernelVMHStart = kHandoverHeader->f_HeapStart; - // get page size. kKernelVirtualSize = kHandoverHeader->f_VirtualSize; // get virtual address start (for the heap) kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( - reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart)); + reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart)); // get physical address start. kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( @@ -136,7 +130,6 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept auto fs = new Kernel::NewFilesystemManager(); MUST_PASS(fs); - MUST_PASS(fs->GetParser()); Kernel::NewFilesystemManager::Mount(fs); diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index dc534589..39a80922 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -67,20 +67,15 @@ mp_system_call_handler: o64 sysret mp_do_context_switch_pre: + mov rcx, 0xc0000082 + wrmsr mov rcx, 0xc0000080 rdmsr or eax, 1 wrmsr - mov rcx, 0xc0000081 rdmsr - mov rax, 0x00000000 mov edx, 0x00180008 wrmsr - mov rcx, 0xc0000082 - mov rax, mp_system_call_handler - mov rdx, 0x0 - wrmsr - ret diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx deleted file mode 100644 index 28b5f9be..00000000 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx +++ /dev/null @@ -1,149 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - -------------------------------------------- */ - -#include <ArchKit/ArchKit.hxx> - -#define cVMHMagic (0xDEEFD00D) -#define cPaddingVMH (16) - -#ifdef __ZKA_AMD64__ -#include <HALKit/AMD64/HalPageAlloc.hxx> -#elif defined(__ZKA_ARM64__) -#include <HALKit/ARM64/HalPageAlloc.hxx> -#endif - -#include <NewKit/Defines.hxx> -#include <NewKit/KernelCheck.hxx> - -Kernel::Boolean kAllocationInProgress = false; - -namespace Kernel -{ - namespace HAL - { - namespace Detail - { - struct VIRTUAL_MEMORY_HEADER - { - UInt32 Magic; - Boolean Present : 1; - Boolean ReadWrite : 1; - Boolean User : 1; - SizeT Size; - }; - - struct VirtualMemoryHeaderTraits final - { - /// @brief Get next header. - /// @param current - /// @return - VIRTUAL_MEMORY_HEADER* Next(VIRTUAL_MEMORY_HEADER* current) - { - if (current->Magic != cVMHMagic) - return current; - - return current + sizeof(VIRTUAL_MEMORY_HEADER) + current->Size; - } - - /// @brief Get previous header. - /// @param current - /// @return - VIRTUAL_MEMORY_HEADER* Prev(VIRTUAL_MEMORY_HEADER* current) - { - if (current->Magic != cVMHMagic) - return current; - - return current - sizeof(VIRTUAL_MEMORY_HEADER) - current->Size; - } - }; - } // namespace Detail - - /// @brief Allocates a new page of memory. - /// @param sz the size of it. - /// @param rw read/write flag. - /// @param user user flag. - /// @return the page table of it. - STATIC auto hal_try_alloc_new_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr - { - if (kAllocationInProgress) - return nullptr; - - kAllocationInProgress = true; - - //! fetch from the start. - Detail::VIRTUAL_MEMORY_HEADER* vmh_header = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>(kKernelVMHStart); - Detail::VirtualMemoryHeaderTraits traits; - - while (vmh_header->Present && - vmh_header->Magic == cVMHMagic) - { - vmh_header = traits.Next(vmh_header); - - if (vmh_header == reinterpret_cast<VoidPtr>(kBadPtr)) - { - ke_stop(RUNTIME_CHECK_POINTER); - return nullptr; - } - } - - vmh_header->Magic = cVMHMagic; - vmh_header->Present = true; - vmh_header->ReadWrite = rw; - vmh_header->User = user; - vmh_header->Size = size; - - kAllocationInProgress = false; - - VoidPtr result = reinterpret_cast<VoidPtr>(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); - - mm_update_pte(result, (rw ? eFlagsRw : 0)); - mm_update_pte(result, (user ? eFlagsUser : 0)); - - return result; - } - - /// @brief Allocate a new page to be used by the OS. - /// @param rw read/write bit. - /// @param user user bit. - /// @return - auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr - { - kcout << "PageAlloc: Waiting now..."; - - // Wait for a ongoing allocation to complete. - while (kAllocationInProgress) - { - (Void)0; - } - - kcout << ", done waiting, allocating...\r"; - - if (size == 0) - ++size; - - // Now allocate the page. - return hal_try_alloc_new_page(rw, user, size); - } - - auto hal_free_page(VoidPtr page_ptr) -> Bool - { - if (!page_ptr) - return false; - - Detail::VIRTUAL_MEMORY_HEADER* result = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>((UIntPtr)page_ptr - sizeof(Detail::VIRTUAL_MEMORY_HEADER)); - - if (result->Magic != cVMHMagic) - return false; - - if (result->Present != true) - return true; - - result->Present = false; - - return true; - } - } // namespace HAL -} // namespace Kernel diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx index aadabd9c..8eb85e78 100644 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx +++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx @@ -87,8 +87,8 @@ namespace Kernel::HAL ZKA_PTE ALIGN(kPTEAlign) Pte[kPTEMax]; }; - auto hal_alloc_page(Boolean rw, Boolean user, SizeT size) -> VoidPtr; - auto hal_free_page(VoidPtr page_ptr) -> Bool; + auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr; + auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL namespace Kernel diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx index 407b7e51..3c34ab68 100644 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx @@ -27,32 +27,37 @@ namespace Kernel::HAL // Access PML4 entry volatile UInt64* pml4_entry = (volatile UInt64*)(((UInt64)pml4_base) + pml4_idx * sizeof(UIntPtr)); - UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages) + UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages) // Access PDPT entry volatile UInt64* pdpt_entry = (volatile UInt64*)(((UInt64)pdpt_base) + pdpt_idx * sizeof(UIntPtr)); - UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags + UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags + // Now PD volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pd_base) + pd_idx * sizeof(UIntPtr)); UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags + // And then PTE volatile UInt64* page_addr = (volatile UInt64*)(((UInt64)pt_base) + (pte_idx * sizeof(UIntPtr))); - if (page_addr) - { - if (flags & eFlagsPresent) - *page_addr |= 0x01; // present bit + if (flags & eFlagsPresent) + *page_addr |= 0x01; // present bit + else if (flags & ~eFlagsPresent) + *page_addr &= 0x01; // present bit - if (flags & eFlagsRw) - *page_addr |= 0x02; + if (flags & eFlagsRw) + *page_addr |= 0x02; + else if (flags & ~eFlagsRw) + *page_addr &= 0x02; // present bit - if (flags & eFlagsUser) - *page_addr |= 0x02; + if (flags & eFlagsUser) + *page_addr |= 0x04; + else if (flags & ~eFlagsUser) + *page_addr &= 0x04; // present bit - return Yes; - } + hal_write_cr3((UIntPtr)pml4_base); - return No; + return 0; } Void Out8(UInt16 port, UInt8 value) diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index a80e13cb..b7fa080c 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -56,11 +56,10 @@ namespace Kernel::HAL /// @brief Virtual memory flags. enum { - eFlagsPresent, - eFlagsUser, - eFlagsRw, - eFlagsExecDisable, - eFlagsCount, + eFlagsPresent = 0x01, + eFlagsRw = 0x02, + eFlagsUser = 0x04, + eFlagsCount = 0x3, }; /// @brief Updates a PTE from pd_base. @@ -100,7 +99,7 @@ namespace Kernel::HAL using InterruptId = UInt16; /* For each element in the IVT */ /// @brief Stack frame (as retrieved from assembly.) - struct PACKED StackFrame final + struct StackFrame final { UIntPtr R8{0}; UIntPtr R9{0}; @@ -293,7 +292,6 @@ EXTERN_C Kernel::Void hal_load_gdt(Kernel::HAL::RegisterGDT ptr); #define kKernelIdtSize 0x100 #define kKernelInterruptId 0x32 -inline Kernel::VoidPtr kKernelVMHStart = nullptr; inline Kernel::VoidPtr kKernelVirtualStart = nullptr; inline Kernel::UIntPtr kKernelVirtualSize = 0UL; diff --git a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx index 996b93ee..052f8c64 100644 --- a/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx +++ b/dev/ZKA/HALKit/AMD64/Storage/ATA-PIO.cxx @@ -107,7 +107,7 @@ ATAInit_Retry: OutMaster = (Bus == ATA_PRIMARY_IO) ? ATA_MASTER : ATA_SLAVE; - Kernel::kcout << "newoskrnl.exe: Create ATA module.\r"; + Kernel::kcout << "newoskrnl.exe: Created IDE module.\r"; return true; } diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx index 52e4f1ee..d51f0421 100644 --- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx @@ -76,14 +76,12 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept // reset kAllocationInProgress field to zero. kAllocationInProgress = false; - kKernelVMHStart = kHandoverHeader->f_HeapStart; - // get page size. kKernelVirtualSize = kHandoverHeader->f_VirtualSize; // get virtual address start (for the heap) kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( - reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart)); + reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart)); // get physical address start. kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( diff --git a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx b/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx index ef3b6db1..ab77f1d0 100644 --- a/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx +++ b/dev/ZKA/HALKit/ARM64/HalPageAlloc.hxx @@ -96,7 +96,7 @@ namespace Kernel::HAL LongDescLevel3 ALIGN(kPTEAlign) Pte[kPTEMax]; }; - VoidPtr hal_alloc_page(Boolean rw, Boolean user, SizeT size); + VoidPtr mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size); } // namespace Kernel::HAL namespace Kernel diff --git a/dev/ZKA/HALKit/ARM64/Processor.hxx b/dev/ZKA/HALKit/ARM64/Processor.hxx index 1880d36c..ad2bdc7b 100644 --- a/dev/ZKA/HALKit/ARM64/Processor.hxx +++ b/dev/ZKA/HALKit/ARM64/Processor.hxx @@ -42,7 +42,6 @@ namespace Kernel::HAL typedef StackFrame* StackFramePtr; } // namespace Kernel::HAL -inline Kernel::VoidPtr kKernelVMHStart = nullptr; inline Kernel::VoidPtr kKernelVirtualStart = nullptr; inline Kernel::UIntPtr kKernelVirtualSize = 0UL; diff --git a/dev/ZKA/HALKit/POWER/HalHardware.cxx b/dev/ZKA/HALKit/POWER/HalHardware.cxx index 9fb841c8..eb335d70 100644 --- a/dev/ZKA/HALKit/POWER/HalHardware.cxx +++ b/dev/ZKA/HALKit/POWER/HalHardware.cxx @@ -11,7 +11,7 @@ namespace Kernel { namespace HAL { - UIntPtr hal_alloc_page(bool rw, bool user) + UIntPtr mm_alloc_bitmap(bool rw, bool user) { return 0; } diff --git a/dev/ZKA/KernelKit/Heap.hxx b/dev/ZKA/KernelKit/Heap.hxx index 65b71774..27c79c83 100644 --- a/dev/ZKA/KernelKit/Heap.hxx +++ b/dev/ZKA/KernelKit/Heap.hxx @@ -30,10 +30,10 @@ namespace Kernel /// @return if it exists. Boolean mm_is_valid_heap(VoidPtr heap_ptr); - /// @brief allocate chunk of memory. - /// @param sz size of pointer - /// @param rw read write (true to enable it) - /// @param user is it accesible by user processes? + /// @brief Allocate chunk of memory. + /// @param sz Size of pointer + /// @param rw Read Write bit. + /// @param user User enable bit. /// @return The newly allocated pointer. VoidPtr mm_new_ke_heap(const SizeT sz, const Bool rw, const Bool user); diff --git a/dev/ZKA/NewKit/KernelCheck.hxx b/dev/ZKA/NewKit/KernelCheck.hxx index 58a76acb..8797ff86 100644 --- a/dev/ZKA/NewKit/KernelCheck.hxx +++ b/dev/ZKA/NewKit/KernelCheck.hxx @@ -20,7 +20,7 @@ namespace Kernel Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) #ifdef __DEBUG__ -#define MUST_PASS(EXPR) __MUST_PASS(EXPR, __FILE__, __LINE__) +#define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) #define assert(EXPR) MUST_PASS(EXPR, RUNTIME_CHECK_EXPRESSION) #else #define MUST_PASS(EXPR) (Kernel::Void)(EXPR) @@ -43,6 +43,7 @@ enum RUNTIME_CHECK RUNTIME_CHECK_BOOTSTRAP, RUNTIME_CHECK_UNEXCPECTED, RUNTIME_CHECK_FILESYSTEM, + RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, RUNTIME_CHECK_COUNT, }; diff --git a/dev/ZKA/NewKit/Macros.hxx b/dev/ZKA/NewKit/Macros.hxx index 153b8c45..b9242e79 100644 --- a/dev/ZKA/NewKit/Macros.hxx +++ b/dev/ZKA/NewKit/Macros.hxx @@ -7,31 +7,31 @@ #pragma once #ifndef KIB -#define KIB(X) ((X) / 1024) +#define KIB(X) (Kernel::UInt64)((X) / 1024) #endif #ifndef kib_cast -#define kib_cast(X) ((X)*1024) +#define kib_cast(X) (Kernel::UInt64)((X)*1024) #endif #ifndef MIB -#define MIB(X) ((Kernel::UInt64)KIB(X) / 1024) +#define MIB(X) (Kernel::UInt64)((Kernel::UInt64)KIB(X) / 1024) #endif #ifndef mib_cast -#define mib_cast(X) ((Kernel::UInt64)kib_cast(X) * 1024) +#define mib_cast(X) (Kernel::UInt64)((Kernel::UInt64)kib_cast(X) * 1024) #endif #ifndef GIB -#define GIB(X) ((Kernel::UInt64)MIB(X) / 1024) +#define GIB(X) (Kernel::UInt64)((Kernel::UInt64)MIB(X) / 1024) #endif #ifndef gib_cast -#define gib_cast(X) ((Kernel::UInt64)mib_cast(X) * 1024) +#define gib_cast(X) (Kernel::UInt64)((Kernel::UInt64)mib_cast(X) * 1024) #endif #ifndef TIB -#define TIB(X) ((Kernel::UInt64)GIB(X) / 1024) +#define TIB(X) (Kernel::UInt64)((Kernel::UInt64)GIB(X) / 1024) #endif #ifndef tib_cast @@ -94,7 +94,7 @@ #define CANT_REACH() __builtin_unreachable() #endif -#define kBadPtr 0xFBFBFBFBFBFBFBFB +#define kInvalidAddress 0xFBFBFBFBFBFBFBFB #define kBadAddress 0x00000000000000 #define kMaxAddr 0xFFFFFFFFFFFFFFFF #define kPathLen 255 diff --git a/dev/ZKA/NewKit/PageAllocator.hxx b/dev/ZKA/NewKit/PageAllocator.hxx index b485e722..a6d84aa0 100644 --- a/dev/ZKA/NewKit/PageAllocator.hxx +++ b/dev/ZKA/NewKit/PageAllocator.hxx @@ -13,7 +13,6 @@ namespace Kernel { namespace Detail { - VoidPtr create_page_wrapper(Boolean rw, Boolean user, SizeT pageSz); void exec_disable(UIntPtr addr); bool page_disable(UIntPtr addr); } // namespace Detail diff --git a/dev/ZKA/NewKit/PageManager.hxx b/dev/ZKA/NewKit/PageManager.hxx index 249c0cc9..0de37803 100644 --- a/dev/ZKA/NewKit/PageManager.hxx +++ b/dev/ZKA/NewKit/PageManager.hxx @@ -33,6 +33,8 @@ namespace Kernel void NoExecute(const bool enable = false); const bool& NoExecute(); + operator bool() { return fVirtAddr; } + bool Reclaim(); bool Shareable(); bool Present(); @@ -68,7 +70,7 @@ namespace Kernel bool Free(Ref<PTEWrapper*>& wrapper); private: - void FlushTLB(UIntPtr VirtAddr); + void FlushTLB(); private: friend PTEWrapper; diff --git a/dev/ZKA/NewKit/Ref.hxx b/dev/ZKA/NewKit/Ref.hxx index 977c353a..7f5167c2 100644 --- a/dev/ZKA/NewKit/Ref.hxx +++ b/dev/ZKA/NewKit/Ref.hxx @@ -84,7 +84,7 @@ namespace Kernel NonNullRef(T* ref) : fRef(ref, true) { - MUST_PASS(ref != nullptr); + MUST_PASS(ref); } Ref<T>& operator->() diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx index 934f418c..84c58b3a 100644 --- a/dev/ZKA/Sources/DLLMain.cxx +++ b/dev/ZKA/Sources/DLLMain.cxx @@ -150,14 +150,12 @@ namespace Kernel::Detail }; } // namespace Kernel::Detail -namespace Kernel +EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void) { - EXTERN UserProcessScheduler* cProcessScheduler; -} // namespace Kernel + while (Yes) + { -EXTERN_C Kernel::Void HangCPU(Kernel::Void) -{ - while (1); + } } /// @brief Application entrypoint. @@ -189,10 +187,6 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void) CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.exe: Running System Component: ", 10, 10, RGB(0, 0, 0)); CG::CGDrawStringToWnd(cKernelWnd, kSysDrv, 10, 10 + (FONT_SIZE_X * Kernel::rt_string_len("newoskrnl.exe: Running System Component: ")), RGB(0, 0, 0)); - /// @note BThread doesn't parse the symbols so doesn't nullify them, .bss is though. - Kernel::cProcessScheduler = nullptr; - Kernel::UserProcessHelper::StartScheduling(); - CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.exe: Starting ZKA System...", 20, 10, RGB(0, 0, 0)); Kernel::sched_execute_thread(HangCPU, "HANG TEST"); @@ -201,6 +195,4 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void) { Kernel::UserProcessHelper::StartScheduling(); } - - Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/dev/ZKA/Sources/FS/NewFS.cxx b/dev/ZKA/Sources/FS/NewFS.cxx index bf55a56f..e3ec6184 100644 --- a/dev/ZKA/Sources/FS/NewFS.cxx +++ b/dev/ZKA/Sources/FS/NewFS.cxx @@ -1035,11 +1035,11 @@ namespace Kernel::Detail sMountpointInterface.C() = io_construct_drive(); sMountpointInterface.D() = io_construct_drive(); - kcout << "newoskrnl.exe: Testing main drive...\r"; + kcout << "newoskrnl.exe: Testing A:\r"; sMountpointInterface.A().fVerify(&sMountpointInterface.A().fPacket); - kcout << "newoskrnl.exe: Testing main drive [ OK ]...\r"; + kcout << "newoskrnl.exe: Testing A: [ OK ]\r"; return true; } diff --git a/dev/ZKA/Sources/Framebuffer.cxx b/dev/ZKA/Sources/Framebuffer.cxx index 76fe7172..3794e458 100644 --- a/dev/ZKA/Sources/Framebuffer.cxx +++ b/dev/ZKA/Sources/Framebuffer.cxx @@ -44,7 +44,7 @@ namespace Kernel { return fFrameBufferAddr.Leak()->fBase != 0 && fColour != FramebufferColorKind::INVALID && - fFrameBufferAddr.Leak()->fBase != kBadPtr; + fFrameBufferAddr.Leak()->fBase != kInvalidAddress; } /// @brief Set color kind of framebuffer. diff --git a/dev/ZKA/Sources/Heap.cxx b/dev/ZKA/Sources/Heap.cxx index bd7e299b..e036badb 100644 --- a/dev/ZKA/Sources/Heap.cxx +++ b/dev/ZKA/Sources/Heap.cxx @@ -85,10 +85,10 @@ namespace Kernel return allocatedPtr; } - /// @brief allocate chunk of memory. - /// @param sz size of pointer - /// @param rw read write (true to enable it) - /// @param user is it accesible by user processes? + /// @brief Allocate chunk of memory. + /// @param sz Size of pointer + /// @param rw Read Write bit. + /// @param user User enable bit. /// @return The newly allocated pointer. VoidPtr mm_new_ke_heap(const SizeT sz, const bool rw, const bool user) { @@ -99,28 +99,29 @@ namespace Kernel if (szFix == 0) ++szFix; - auto wrapper = kHeapPageManager.Request(rw, user, false, szFix); + auto wrapper = kHeapPageManager.Request(rw, user, No, szFix); Detail::HEAP_INFORMATION_BLOCK_PTR heap_info_ptr = reinterpret_cast<Detail::HEAP_INFORMATION_BLOCK_PTR>( - wrapper.VirtualAddress()); + wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK)); heap_info_ptr->fHeapSize = szFix; - heap_info_ptr->fMagic = kKernelHeapMagic; - heap_info_ptr->fCRC32 = 0U; // dont fill it for now. - heap_info_ptr->fHeapPtr = wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK); - heap_info_ptr->fPage = 0UL; - heap_info_ptr->fUser = user; - heap_info_ptr->fPresent = true; + heap_info_ptr->fMagic = kKernelHeapMagic; + heap_info_ptr->fCRC32 = 0U; // dont fill it for now. + heap_info_ptr->fHeapPtr = wrapper.VirtualAddress() + sizeof(Detail::HEAP_INFORMATION_BLOCK); + heap_info_ptr->fPage = 0UL; + heap_info_ptr->fUser = user; + heap_info_ptr->fPresent = true; ++kHeapCount; + auto result = reinterpret_cast<VoidPtr>(heap_info_ptr->fHeapPtr); + kLatestAllocation = heap_info_ptr; Detail::mm_alloc_fini_timeout(); - return reinterpret_cast<VoidPtr>(heap_info_ptr + - sizeof(Detail::HEAP_INFORMATION_BLOCK)); + return result; } /// @brief Makes a page heap. @@ -132,7 +133,7 @@ namespace Kernel return -kErrorInternal; if (((IntPtr)heap_ptr - sizeof(Detail::HEAP_INFORMATION_BLOCK)) <= 0) return -kErrorInternal; - if (((IntPtr)heap_ptr - kBadPtr) < 0) + if (((IntPtr)heap_ptr - kInvalidAddress) < 0) return -kErrorInternal; Detail::mm_alloc_init_timeout(); @@ -157,7 +158,7 @@ namespace Kernel return -kErrorInternal; if (((IntPtr)heap_ptr - sizeof(Detail::HEAP_INFORMATION_BLOCK)) <= 0) return -kErrorInternal; - if (((IntPtr)heap_ptr - kBadPtr) < 0) + if (((IntPtr)heap_ptr - kInvalidAddress) < 0) return -kErrorInternal; Detail::mm_alloc_init_timeout(); @@ -188,12 +189,12 @@ namespace Kernel } heapInfoBlk->fHeapSize = 0UL; - heapInfoBlk->fPresent = false; - heapInfoBlk->fHeapPtr = 0; - heapInfoBlk->fCRC32 = 0; - heapInfoBlk->fMagic = 0; + heapInfoBlk->fPresent = false; + heapInfoBlk->fHeapPtr = 0; + heapInfoBlk->fCRC32 = 0; + heapInfoBlk->fMagic = 0; - PTEWrapper pageWrapper(false, false, false, reinterpret_cast<UIntPtr>(heapInfoBlk)); + PTEWrapper pageWrapper(false, false, false, reinterpret_cast<UIntPtr>(heapInfoBlk) - sizeof(Detail::HEAP_INFORMATION_BLOCK)); Ref<PTEWrapper*> pteAddress{&pageWrapper}; kHeapPageManager.Free(pteAddress); diff --git a/dev/ZKA/Sources/KernelCheck.cxx b/dev/ZKA/Sources/KernelCheck.cxx index a05c265a..0ed96593 100644 --- a/dev/ZKA/Sources/KernelCheck.cxx +++ b/dev/ZKA/Sources/KernelCheck.cxx @@ -56,6 +56,7 @@ namespace Kernel { case RUNTIME_CHECK_PROCESS: { CGDrawString("0x00000008 No more processes to run, this is because that ZKA ran out of processes.", start_y, x, panicTxt); + RecoveryFactory::Recover(); break; } case RUNTIME_CHECK_ACPI: { @@ -102,7 +103,7 @@ namespace Kernel break; } case RUNTIME_CHECK_FAILED: { - CGDrawString("0x10000001 Assertion failed.", start_y, x, panicTxt); + CGDrawString("0x10000001 Kernel bug-check failure.", start_y, x, panicTxt); RecoveryFactory::Recover(); break; } @@ -120,13 +121,6 @@ namespace Kernel Void RecoveryFactory::Recover() noexcept { - const auto cMaxSeconds = Seconds(4); - - HardwareTimer timer(cMaxSeconds); - timer.Wait(); - - kcout << "newoskrnl.exe: Shutting down computer...\r"; - PowerFactoryInterface power(nullptr); power.Shutdown(); } @@ -135,6 +129,9 @@ namespace Kernel { if (!expr) { + kcout << "ASSERTION FAILED: FILE: " << file << endl; + kcout << "ASSERTION FAILED: LINE: " << line << endl; + ke_stop(RUNTIME_CHECK_FAILED); // Runtime Check failed } } diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx index b3b62609..7429751f 100644 --- a/dev/ZKA/Sources/MP.cxx +++ b/dev/ZKA/Sources/MP.cxx @@ -125,12 +125,12 @@ namespace Kernel ///! @brief Default constructor. HardwareThreadScheduler::HardwareThreadScheduler() { - kcout << "newoskrnl.exe: initializing HardwareThreadScheduler." << endl; + kcout << "newoskrnl.exe: Initializing HardwareThreadScheduler." << endl; cSMPCoreName.GetKey() += "Property\\MPClass"; cSMPCoreName.GetValue() = (PropertyId)this; - kcout << "newoskrnl.exe: initialized HardwareThreadScheduler." << endl; + kcout << "newoskrnl.exe: Initialized HardwareThreadScheduler." << endl; } ///! @brief Default destructor. diff --git a/dev/ZKA/Sources/NewFS+FileManager.cxx b/dev/ZKA/Sources/NewFS+FileManager.cxx index 98e0e3af..20fb623d 100644 --- a/dev/ZKA/Sources/NewFS+FileManager.cxx +++ b/dev/ZKA/Sources/NewFS+FileManager.cxx @@ -19,6 +19,7 @@ namespace Kernel { MUST_PASS(Detail::fs_init_newfs()); fImpl = new NewFSParser(); + MUST_PASS(fImpl); kcout << "newoskrnl.exe: We are done here... (NewFilesystemManager).\r"; } diff --git a/dev/ZKA/Sources/PageAllocator.cxx b/dev/ZKA/Sources/PageAllocator.cxx index dec6c470..e68d0659 100644 --- a/dev/ZKA/Sources/PageAllocator.cxx +++ b/dev/ZKA/Sources/PageAllocator.cxx @@ -11,19 +11,6 @@ /// @brief Internal namespace, used internally by Kernel. namespace Kernel::Detail { - VoidPtr create_page_wrapper(Boolean rw, Boolean user, SizeT pageSz) - { - auto addr = HAL::hal_alloc_page(rw, user, pageSz); - - if (addr == kBadAddress) - { - kcout << "[create_page_wrapper] kBadAddress returned\n"; - ke_stop(RUNTIME_CHECK_POINTER); - } - - return addr; - } - void exec_disable(UIntPtr VirtualAddr) { #ifdef __ZKA_SUPPORT_NX__ diff --git a/dev/ZKA/Sources/PageManager.cxx b/dev/ZKA/Sources/PageManager.cxx index d14130ff..dd18709f 100644 --- a/dev/ZKA/Sources/PageManager.cxx +++ b/dev/ZKA/Sources/PageManager.cxx @@ -35,11 +35,8 @@ namespace Kernel /// @brief Flush virtual address. /// @param VirtAddr - Void PageManager::FlushTLB(UIntPtr VirtAddr) + Void PageManager::FlushTLB() { - if (VirtAddr == kBadAddress) - return; - hal_flush_tlb(); } @@ -64,31 +61,20 @@ namespace Kernel PTEWrapper PageManager::Request(Boolean Rw, Boolean User, Boolean ExecDisable, SizeT Sz) { // Store PTE wrapper right after PTE. - VoidPtr ptr = Kernel::HAL::hal_alloc_page(Rw, User, Sz); - - if (ptr == kBadAddress) - { - kcout << "[create_page_wrapper] kBadAddress returned\n"; - ke_stop(RUNTIME_CHECK_POINTER); - } + VoidPtr ptr = Kernel::HAL::mm_alloc_bitmap(Rw, User, Sz); return PTEWrapper{Rw, User, ExecDisable, reinterpret_cast<UIntPtr>(ptr)}; } - /// @brief Disable PTE. + /// @brief Disable BitMap. /// @param wrapper the wrapper. - /// @return - bool PageManager::Free(Ref<PTEWrapper*>& wrapper) + /// @return If the page bitmap was cleared or not. + Bool PageManager::Free(Ref<PTEWrapper*>& wrapper) { - if (wrapper) - { - if (!Kernel::HAL::hal_free_page((VoidPtr)wrapper->VirtualAddress())) - return false; + if (!Kernel::HAL::mm_free_bitmap((VoidPtr)wrapper->VirtualAddress())) + return false; - return true; - } - - return false; + return true; } /// @brief Virtual PTE address. diff --git a/dev/ZKA/Sources/ThreadLocalStorage.cxx b/dev/ZKA/Sources/ThreadLocalStorage.cxx index f4794bdd..e68593f6 100644 --- a/dev/ZKA/Sources/ThreadLocalStorage.cxx +++ b/dev/ZKA/Sources/ThreadLocalStorage.cxx @@ -21,7 +21,7 @@ using namespace Kernel; -namespace Detail +namespace Kernel::Detail { /// \brief UserProcess thread information header. struct THREAD_HEADER_BLOCK final diff --git a/dev/ZKA/Sources/User.cxx b/dev/ZKA/Sources/User.cxx index 5a4c2335..871d011f 100644 --- a/dev/ZKA/Sources/User.cxx +++ b/dev/ZKA/Sources/User.cxx @@ -77,7 +77,6 @@ namespace Kernel SizeT len = rt_string_len(password_to_fill); Char* password = new Char[len]; - MUST_PASS(password); // fill data first, generate hash. diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx index dc142b18..26d8be79 100644 --- a/dev/ZKA/Sources/UserProcessScheduler.cxx +++ b/dev/ZKA/Sources/UserProcessScheduler.cxx @@ -28,13 +28,13 @@ namespace Kernel /// @brief Exit Code global variable. /***********************************************************************************/ - UInt32 cLastExitCode = 0U; + STATIC UInt32 cLastExitCode = 0U; /***********************************************************************************/ /// @brief UserProcess scheduler instance. /***********************************************************************************/ - UserProcessScheduler* cProcessScheduler = nullptr; + STATIC UserProcessScheduler* cProcessScheduler; /// @brief Gets the last exit code. /// @note Not thread-safe. @@ -53,11 +53,9 @@ namespace Kernel if (this->Name == 0) return; - kcout << this->Name << ": crashed. (id = " << number(kErrorProcessFault) << endl; + kcout << this->Name << ": crashed, ID = " << number(kErrorProcessFault) << endl; this->Exit(kErrorProcessFault); - - UserProcessHelper::StartScheduling(); } /// @brief Gets the local last exit code. @@ -246,8 +244,12 @@ namespace Kernel } process.StackFrame = new HAL::StackFrame(); - - MUST_PASS(process.StackFrame); + + if (!process.StackFrame) + { + process.Crash(); + return -kErrorProcessFault; + } if (process.Image) { @@ -291,6 +293,11 @@ namespace Kernel UserProcessScheduler& UserProcessScheduler::The() { + if (!cProcessScheduler) + { + cProcessScheduler = new UserProcessScheduler(); + } + MUST_PASS(cProcessScheduler); return *cProcessScheduler; } @@ -414,14 +421,6 @@ namespace Kernel SizeT UserProcessHelper::StartScheduling() { - if (!cProcessScheduler) - { - cProcessScheduler = new UserProcessScheduler(); - MUST_PASS(cProcessScheduler); - - kcout << "newoskrnl.exe: Team capacity: " << number(cProcessScheduler->CurrentTeam().AsArray().Capacity()) << endl; - } - SizeT ret = cProcessScheduler->Run(); return ret; } diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make index 02224e93..0e8cbad4 100644 --- a/dev/ZKA/amd64-efi.make +++ b/dev/ZKA/amd64-efi.make @@ -35,10 +35,10 @@ COPY = cp ASMFLAGS = -f win64 # Kernel subsystem is 17 and entrypoint is __ImageStart -LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000 +LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x1000000 LDOBJ = Objects/*.obj -# This file is the Kernel, responsible of task management and memory. +# This file is the Kernel, responsible of task, memory, driver, sci, disk and device management. KERNEL = newoskrnl.exe .PHONY: error |
