diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-07 09:18:35 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-07 09:18:35 +0200 |
| commit | 1003d7a20bab6885b4edde7d11103a199de30d21 (patch) | |
| tree | a1992f26fd9afeb802bbb1829dec8ebe02ce5cd9 /dev/ZKA | |
| parent | 4019b870041d1ac50a48ba9e7a981df1afde96e6 (diff) | |
Daily bump.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA')
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 14 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalControlRegister.s | 5 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx | 21 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 46 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 61 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx | 5 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 51 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx | 3 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Processor.hxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/Sources/CodeMgr.cxx | 1 | ||||
| -rw-r--r-- | dev/ZKA/Sources/ExeMain.cxx | 12 | ||||
| -rw-r--r-- | dev/ZKA/Sources/HardwareThreadScheduler.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/Sources/PEFCodeMgr.cxx | 15 |
13 files changed, 134 insertions, 112 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index ab160648..c5f39eaa 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -46,17 +46,18 @@ namespace Kernel kcout << "BMPMgr: Allocated pointer!\r"; kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl; + kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl; kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (MIB): " << number(MIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (GIB): " << number(GIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl; - kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl; + kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; if (rw) - mm_update_pte(base_ptr, eFlagsRw); + mm_map_page(base_ptr, 0, eFlagsRw); if (user) - mm_update_pte(base_ptr, eFlagsUser); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser); return (VoidPtr)ptr_bit_set; } @@ -71,17 +72,18 @@ namespace Kernel kcout << "BMPMgr: Allocated pointer!\r"; kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl; + kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl; kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (MIB): " << number(MIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (GIB): " << number(GIB(ptr_bit_set[1])) << endl; kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl; - kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl; + kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; if (rw) - mm_update_pte(base_ptr, eFlagsRw); + mm_map_page(base_ptr, 0, eFlagsRw); if (user) - mm_update_pte(base_ptr, eFlagsUser); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser); return (VoidPtr)ptr_bit_set; } diff --git a/dev/ZKA/HALKit/AMD64/HalControlRegister.s b/dev/ZKA/HALKit/AMD64/HalControlRegister.s index 76053921..6fde8878 100644 --- a/dev/ZKA/HALKit/AMD64/HalControlRegister.s +++ b/dev/ZKA/HALKit/AMD64/HalControlRegister.s @@ -10,9 +10,14 @@ .globl hal_read_cr3 .globl hal_read_cr0 .globl hal_flush_tlb +.globl hal_invl_tlb .text +hal_invl_tlb: + invlpg (%rcx) + ret + hal_flush_tlb: call hal_read_cr3 mov %rax, %rcx diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx index 5f6c0552..a5bf07ec 100644 --- a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx +++ b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx @@ -134,31 +134,36 @@ namespace Kernel::HAL Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector); } - EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame); + EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame); /// @brief Called when the AP is ready. /// @internal - EXTERN_C Void hal_on_ap_startup(HAL::StackFramePtr stack_frame) + EXTERN_C Void hal_on_ap_startup(Void) { - mp_register_process(stack_frame); - ke_stop(RUNTIME_CHECK_FAILED); + while (Yes) + { + } } struct PROCESS_CONTROL_BLOCK final { - UserProcessPtr f_Process; + HAL::StackFramePtr f_Frame; + UInt8* f_Stack; + VoidPtr f_Image; } fBlocks[kSchedProcessLimitPerTeam] = {0}; EXTERN_C HAL::StackFramePtr _hal_leak_current_context(Void) { - return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process->StackFrame; + return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame; } - EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame) + EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame) { if (kSMPAware) { - fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process = &UserProcessScheduler::The().CurrentProcess().Leak(); + fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame; + fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr; + fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image; return Yes; } diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index 28f86b34..56853441 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -237,12 +237,58 @@ extern hal_real_init hal_reload_segments: sti + ;; Write address of syscall handler. + + mov rdx, [mp_system_call_handler] + shr rdx, 32 + mov rcx, 0xC0000082 + wrmsr + + ;; Set segments of syscall handler. + + xor rax, rax + mov rdx, 0x230008 + mov rcx, 0xC0000081 + wrmsr + + mov ecx, 0xC0000080 + rdmsr + or eax, 1 + wrmsr + jmp hal_real_init ret global hal_load_idt global hal_user_code_start +extern hal_system_call_enter +global mp_system_call_handler + +mp_system_call_handler: + + push r8 + push r9 + push r10 + push r11 + push r12 + push r13 + push r14 + push r15 + + jmp hal_system_call_enter + + pop r15 + pop r14 + pop r13 + pop r12 + pop r11 + pop r10 + pop r9 + pop r8 + + o64 sysret + hal_load_idt: cli lidt [rcx] diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index 2a6be79a..4403263a 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -21,66 +21,21 @@ section .text ;; rcx: code ptr. ;; rdx: stack ptr. mp_do_context_switch: - call mp_pre_switch - - mov ax, 0x18 + mov ax, 0x18 | 3 mov ds, ax mov es, ax - mov fs, ax mov gs, ax + mov fs, ax - mov rsp, rdx + push 0x18 | 3 + push rdx + push 0x200 + push 0x20 | 3 + push rcx - mov r11, 0x202 - o64 sysret + o64 iret ;; @brief Gets the current stack frame. mp_get_current_context: call _hal_leak_current_context ret - -extern hal_system_call_enter -global mp_system_call_handler - -mp_pre_switch: - mov rcx, 0xc0000082 - wrmsr - mov rcx, 0xc0000080 - rdmsr - or eax, 1 - wrmsr - mov rcx, 0xc0000081 - rdmsr - mov edx, 0x00180008 - wrmsr - - mov rdx, [mp_system_call_handler] - shr rdx, 32 - mov rcx, 0xc0000082 - wrmsr - - ret - -mp_system_call_handler: - - push r8 - push r9 - push r10 - push r11 - push r12 - push r13 - push r14 - push r15 - - jmp hal_system_call_enter - - pop r15 - pop r14 - pop r13 - pop r12 - pop r11 - pop r10 - pop r9 - pop r8 - - o64 sysret diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx index 8eb85e78..b0d444d9 100644 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx +++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx @@ -31,7 +31,8 @@ #endif // !kAlign EXTERN_C void hal_flush_tlb(); -EXTERN_C void hal_write_cr3(Kernel::UIntPtr phys_addr); +EXTERN_C void hal_invl_tlb(Kernel::UIntPtr addr); +EXTERN_C void hal_write_cr3(Kernel::UIntPtr pml4); EXTERN_C void hal_write_cr0(Kernel::UIntPtr bit); EXTERN_C Kernel::VoidPtr hal_read_cr0(); // @brief CPU control register. @@ -82,7 +83,7 @@ namespace Kernel::HAL } } // namespace Detail - struct ZKA_PDE final + struct ALIGN(0x08) ZKA_PDE final { ZKA_PTE ALIGN(kPTEAlign) Pte[kPTEMax]; }; diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx index 3c34ab68..dd9afd47 100644 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx @@ -16,46 +16,41 @@ namespace Kernel::HAL { - EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags) + /// @brief Set a PTE from pd_base. + /// @param virt_addr a valid virtual address. + /// @param phys_addr point to physical address. + /// @param flags the flags to put on the page. + /// @return Status code of page manip. + EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags) { VoidPtr pml4_base = hal_read_cr3(); - UIntPtr pml4_idx = ((UIntPtr)virt_addr >> 39) & 0x1FFF; - UIntPtr pdpt_idx = ((UIntPtr)virt_addr >> 30) & 0x1FFF; - UIntPtr pd_idx = ((UIntPtr)virt_addr >> 21) & 0x1FFF; - UIntPtr pte_idx = ((UIntPtr)virt_addr >> 12) & 0x1FFF; + UIntPtr pd_idx = ((UIntPtr)virt_addr >> 22); + UIntPtr pte_idx = ((UIntPtr)virt_addr >> 12) & 0x3FFF; + // Now PD + volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pml4_base) + pd_idx * sizeof(UIntPtr)); - // 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) + kcout << (*pd_entry & 0x01 ? "PageDir present." : "PageDir not present") << endl; - // Access PDPT entry - volatile UInt64* pdpt_entry = (volatile UInt64*)(((UInt64)pdpt_base) + pdpt_idx * sizeof(UIntPtr)); - UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags + if ((*pd_entry & 0x01) == 0) + { + *pd_entry |= 0x01; + } - // 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 (flags & eFlagsPresent) - *page_addr |= 0x01; // present bit - else if (flags & ~eFlagsPresent) - *page_addr &= 0x01; // present bit + volatile UIntPtr* page_addr = (volatile UIntPtr*)(((UInt64)pt_base) + (pte_idx * sizeof(UIntPtr))); - if (flags & eFlagsRw) - *page_addr |= 0x02; - else if (flags & ~eFlagsRw) - *page_addr &= 0x02; // present bit + kcout << (*page_addr & 0x01 ? "Page present." : "Page not present") << endl; + kcout << (*page_addr & 0x04 ? "User bit present." : "User bit not present") << endl; - if (flags & eFlagsUser) - *page_addr |= 0x04; - else if (flags & ~eFlagsUser) - *page_addr &= 0x04; // present bit + if (phys_addr == nullptr) + { + phys_addr = (VoidPtr)((*page_addr & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF)); + } - hal_write_cr3((UIntPtr)pml4_base); + (*page_addr) = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01; return 0; } diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx index cef5d368..89982cbc 100644 --- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx +++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx @@ -14,8 +14,7 @@ Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept if (imageStart == nullptr) this->Crash(); - HAL::mm_update_pte(imageStart, HAL::eFlagsPresent); - HAL::mm_update_pte(imageStart, HAL::eFlagsUser); + HAL::mm_map_page(imageStart, 0, HAL::eFlagsUser); this->Image = imageStart; } diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index fd3e7b0a..289d6f45 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -61,10 +61,12 @@ namespace Kernel::HAL eFlagsCount = 0x3, }; - /// @brief Updates a PTE from pd_base. + /// @brief Set a PTE from pd_base. /// @param virt_addr a valid virtual address. + /// @param phys_addr point to physical address. /// @param flags the flags to put on the page. - EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags); + /// @return Status code of page manip. + EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags); EXTERN_C UChar In8(UInt16 port); EXTERN_C UShort In16(UInt16 port); diff --git a/dev/ZKA/Sources/CodeMgr.cxx b/dev/ZKA/Sources/CodeMgr.cxx index ae4cb00b..8e560408 100644 --- a/dev/ZKA/Sources/CodeMgr.cxx +++ b/dev/ZKA/Sources/CodeMgr.cxx @@ -25,6 +25,7 @@ namespace Kernel proc.Kind = UserProcess::kExeKind; proc.StackSize = mib_cast(4); + rt_set_memory(proc.Name, 0, kProcessLen); rt_copy_memory((VoidPtr)process_name, proc.Name, rt_string_len(process_name)); return UserProcessScheduler::The().Add(proc) > 0; diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx index 036c5725..4497d5b3 100644 --- a/dev/ZKA/Sources/ExeMain.cxx +++ b/dev/ZKA/Sources/ExeMain.cxx @@ -112,11 +112,13 @@ namespace Kernel::Detail EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void) { - while (Yes) - { - Kernel::Char* p = nullptr; - *p = 4; - } + asm volatile( + ".intel_syntax;" + "start:" + "syscall;" + "jmp start;" + ".att_syntax;" + ); } namespace Kernel diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx index cbe0cc46..5b310fca 100644 --- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx +++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx @@ -79,7 +79,7 @@ namespace Kernel /// @note Those symbols are needed in order to switch and validate the stack. EXTERN Bool hal_check_stack(HAL::StackFramePtr stackPtr); - EXTERN_C Bool mp_register_process(HAL::StackFramePtr stackPtr); + EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr); /// @brief Switch to hardware thread. /// @param stack the new hardware thread. @@ -99,8 +99,10 @@ namespace Kernel if (this->IsBusy()) return false; + kcout << "Switching to the Process's HW thread...\r"; + this->Busy(true); - Bool ret = mp_register_process(fStack); + Bool ret = mp_register_process(image, stack_ptr, fStack); this->Busy(false); return ret; diff --git a/dev/ZKA/Sources/PEFCodeMgr.cxx b/dev/ZKA/Sources/PEFCodeMgr.cxx index 23dfae31..b6f7e3da 100644 --- a/dev/ZKA/Sources/PEFCodeMgr.cxx +++ b/dev/ZKA/Sources/PEFCodeMgr.cxx @@ -15,6 +15,7 @@ /// @brief PEF stack size symbol. #define cPefStackSizeSymbol "SizeOfReserveStack" +#define cPefNameSymbol "ProgramName" namespace Kernel { @@ -164,11 +165,10 @@ namespace Kernel Char* blobRet = new Char[container_header->Size]; - HAL::mm_update_pte(blobRet, HAL::eFlagsPresent); - HAL::mm_update_pte(blobRet, HAL::eFlagsUser); - if (container_header->Kind != kPefCode) - HAL::mm_update_pte(blobRet, HAL::eFlagsRw); + HAL::mm_map_page(blobRet, 0, HAL::eFlagsRw | HAL::eFlagsUser); + else + HAL::mm_map_page(blobRet, 0, HAL::eFlagsUser); rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size); @@ -214,6 +214,13 @@ namespace Kernel proc.Kind = procKind; proc.StackSize = *(UIntPtr*)exec.FindSymbol(cPefStackSizeSymbol, kPefData); + rt_set_memory(proc.Name, 0, kProcessLen); + + if (exec.FindSymbol(cPefNameSymbol, kPefData)) + rt_copy_memory((VoidPtr)exec.FindSymbol(cPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(cPefNameSymbol, kPefData))); + else + rt_copy_memory((VoidPtr) "UNNAMED PROCESS.", proc.Name, rt_string_len("UNNAMED PROCESS.")); + if (!proc.StackSize) { const auto cDefaultStackSizeMib = 8; |
