From e47e393fc01c663ca634068c56a41eb74ed01439 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 2 Sep 2024 17:30:15 +0200 Subject: [ FIX ] A fix has been found for the SYSRET issue. Will apply it later. Signed-off-by: Amlal El Mahrouss --- dev/ZBA/Sources/HEL/AMD64/BootMain.cxx | 2 +- dev/ZKA/HALKit/AMD64/HalControlRegister.s | 10 +- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx | 2 +- dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx | 19 ++- dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 29 +---- dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 127 ++------------------- dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 34 +++++- dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx | 2 +- dev/ZKA/HALKit/AMD64/Processor.hxx | 16 +-- dev/ZKA/HALKit/ARM64/HalKernelMain.cxx | 102 +---------------- dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx | 2 +- dev/ZKA/KernelKit/UserProcessScheduler.hxx | 2 +- dev/ZKA/Sources/CodeManager.cxx | 2 +- dev/ZKA/Sources/DLLMain.cxx | 11 +- dev/ZKA/Sources/MP.cxx | 12 +- dev/ZKA/Sources/PEFCodeManager.cxx | 2 +- 16 files changed, 101 insertions(+), 273 deletions(-) (limited to 'dev') diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx index ff8c3211..bb929028 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx +++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx @@ -191,7 +191,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, handoverHdrPtr->f_HeapStart = 0; - while (BS->AllocatePool(EfiRuntimeServicesCode, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk) + while (BS->AllocatePool(EfiLoaderData, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk) ; handoverHdrPtr->f_VirtualSize = diff --git a/dev/ZKA/HALKit/AMD64/HalControlRegister.s b/dev/ZKA/HALKit/AMD64/HalControlRegister.s index 879d35c1..11c52ff3 100644 --- a/dev/ZKA/HALKit/AMD64/HalControlRegister.s +++ b/dev/ZKA/HALKit/AMD64/HalControlRegister.s @@ -15,7 +15,7 @@ hal_flush_tlb: call hal_read_cr3 - mov %rcx, %rax + mov %rax, %rcx call hal_write_cr3 ret @@ -24,17 +24,17 @@ hal_read_cr3: ret hal_read_cr0: - movq %rax, %cr0 + movq %cr0, %rax ret hal_read_cr2: - movq %rax, %cr2 + movq %cr3, %rax ret hal_write_cr3: - movq %cr3, %rdi + movq %rcx, %cr3 ret hal_write_cr0: - movq %cr0, %rdi + movq %rcx, %cr3 ret diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index 7838a8ed..1101e5e2 100644 --- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx +++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -66,7 +66,7 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr /// @brief Enter Kernel call from assembly (DDK only). /// @param stack the stack pushed from assembly routine. /// @return nothing. -EXTERN_C Kernel::Void hal_Kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9) +EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9) { if (rcx <= (kSyscalls.Count() - 1)) { diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx index 3b91aa88..0033f614 100644 --- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx @@ -51,11 +51,26 @@ namespace Kernel::HAL { volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; - for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) + for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx) { MUST_PASS(ptr_ivt[idt_indx]); - Detail::kInterruptVectorTable[idt_indx].Selector = idt_indx == kSyscallRoute ? kGdtUserCodeSelector : kGdtCodeSelector; + Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector; + Detail::kInterruptVectorTable[idt_indx].Ist = 0; + Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate; + Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__); + Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & __INT16_MAX__); + Detail::kInterruptVectorTable[idt_indx].OffsetHigh = + (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__); + + Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; + } + + for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx) + { + MUST_PASS(ptr_ivt[idt_indx]); + + Detail::kInterruptVectorTable[idt_indx].Selector = (idt_indx == kSyscallRoute) ? kGdtUserCodeSelector : kGdtKernelCodeSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate; Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__); diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index 5fe8b1aa..d3decfde 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -129,15 +129,11 @@ IntNormal 26 IntNormal 27 IntNormal 28 IntNormal 29 - IntExp 30 - IntNormal 31 - IntNormal 32 -IntNormal 34 - IntNormal 33 +IntNormal 34 IntNormal 35 IntNormal 36 IntNormal 37 @@ -154,25 +150,10 @@ IntNormal 47 IntNormal 48 IntNormal 49 -[extern hal_system_call_enter] -[extern hal_Kernel_call_enter] - -__ZKA_INT_50: - cli - - push rcx - push rdx - push rax - - call hal_system_call_enter - - pop rax - pop rdx - pop rcx - - sti - iretq +[extern hal_kernel_call_enter] +IntNormal 50 + __ZKA_INT_51: cli @@ -182,7 +163,7 @@ __ZKA_INT_51: push r9 push rax - call hal_Kernel_call_enter + call hal_kernel_call_enter pop rax pop r9 diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index faf59920..af767938 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -63,16 +63,16 @@ namespace Kernel::HAL /* GDT, mostly descriptors for user and kernel segments. */ STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[9] = { - {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, // Null entry - {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0x9A, .fGranularity = 0xA0, .fBase2 = 0}, // Kernel code - {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0x92, .fGranularity = 0xA0, .fBase2 = 0}, // Kernel data - {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0xFA, .fGranularity = 0xA0, .fBase2 = 0}, // User code - {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBase2 = 0}, // User data + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBaseHigh = 0}, // Null entry + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fGranularity = 0xA0, .fBaseHigh = 0}, // Kernel code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fGranularity = 0xA0, .fBaseHigh = 0}, // Kernel data + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fGranularity = 0xA0, .fBaseHigh = 0}, // User code + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data // reserve them for later. - {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, // Null entry - {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, - {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, - {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data + {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data }; Kernel::Void hal_real_init(Kernel::Void) noexcept; @@ -134,115 +134,6 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); - // Register the basic system calls. - - constexpr auto cTlsInterrupt = 0x11; - constexpr auto cTlsInstallInterrupt = 0x12; - constexpr auto cNewInterrupt = 0x13; - constexpr auto cDeleteInterrupt = 0x14; - constexpr auto cExitInterrupt = 0x15; - constexpr auto cLastExitInterrupt = 0x16; - constexpr auto cCatalogOpen = 0x17; - constexpr auto cForkRead = 0x18; - constexpr auto cForkWrite = 0x19; - constexpr auto cCatalogClose = 0x20; - constexpr auto cCatalogRemove = 0x21; - constexpr auto cCatalogCreate = 0x22; - constexpr auto cRebootInterrupt = 0x23; - constexpr auto cShutdownInterrupt = 0x24; - constexpr auto cLPCSendMsg = 0x25; - constexpr auto cLPCOpenMsg = 0x26; - constexpr auto cLPCCloseMsg = 0x27; - constexpr auto cCreateThreadInterrupt = 0x28; - - kSyscalls[cTlsInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - if (tls_check_syscall_impl(rdx) == false) - { - Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); - } - }; - - kSyscalls[cNewInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - // get HAC struct. - HEAP_ALLOC_INFO* rdxInf = reinterpret_cast(rdx); - - if (!rdxInf) - return; - - // assign the fThe field with the pointer. - rdxInf->fThe = Kernel::UserProcessScheduler::The().CurrentProcess().Leak().New(rdxInf->fTheSz); - }; - - kSyscalls[cDeleteInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - // get HAC struct. - HEAP_ALLOC_INFO* rdxInf = reinterpret_cast(rdx); - - if (!rdxInf) - return; - - // delete ptr with sz in mind. - Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz); - }; - - kSyscalls[cTlsInstallInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast(rdx); - - if (!rdxPb) - return; - - // install the fTIB and fGIB. - rt_install_tib(rdxPb->fTIB, rdxPb->fGIB); - }; - - kSyscalls[cCreateThreadInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - CREATE_THREAD_INFO* rdxPb = reinterpret_cast(rdx); - - if (!rdxPb) - return; - - // install the fTIB and fGIB. - Kernel::sched_execute_thread(rdxPb->fMain, rdxPb->fName); - }; - - kSyscalls[cExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_EXIT_INFO* rdxEi = reinterpret_cast(rdx); - - if (!rdxEi) - return; - - Kernel::kcout << "newoskrnl.dll: " << rdxEi->fReason << "\r"; - Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Exit(rdxEi->fCode); - }; - - kSyscalls[cLastExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_EXIT_INFO* rdxEi = reinterpret_cast(rdx); - - if (!rdxEi) - return; - - rdxEi->fCode = Kernel::sched_get_exit_code(); - }; - - kSyscalls[cRebootInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr); - pow.Reboot(); - }; - - kSyscalls[cShutdownInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr); - pow.Shutdown(); - }; - - kSyscalls[cTlsInterrupt].fHooked = true; - kSyscalls[cTlsInstallInterrupt].fHooked = true; - kSyscalls[cDeleteInterrupt].fHooked = true; - kSyscalls[cNewInterrupt].fHooked = true; - kSyscalls[cExitInterrupt].fHooked = true; - kSyscalls[cLastExitInterrupt].fHooked = true; - kSyscalls[cShutdownInterrupt].fHooked = true; - kSyscalls[cRebootInterrupt].fHooked = true; - kSyscalls[cCreateThreadInterrupt].fHooked = true; - if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index 42d5ffe5..601ff29e 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -21,8 +21,21 @@ section .text ;; rcx: code ptr. ;; rdx: stack ptr. mp_do_context_switch: + jmp mp_jump_user_mode +mp_jump_user_mode: mov r11, 0x0202 - mov rsp, rdx + mov r13, rdx + mov r12, rcx + + mov eax, 0x23 + mov ds, eax + mov gs, eax + mov es, eax + mov fs, eax + + mov rcx, r12 + mov rsp, r13 + o64 sysret ;; @brief Gets the current stack frame. @@ -30,8 +43,27 @@ mp_get_current_context: call _hal_leak_current_context ret +extern hal_system_call_enter + +mp_system_call_handler: + cli + + push rcx + push rdx + push rax + + call hal_system_call_enter + + pop rax + pop rdx + pop rcx + + sti + sysret + mp_do_context_switch_pre: ; Enable SCE that enables sysret and syscall + mov rax, mp_system_call_handler mov rcx, 0xc0000082 wrmsr mov rcx, 0xc0000080 diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx index e8a89f85..50d00368 100644 --- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx +++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx @@ -9,7 +9,7 @@ using namespace Kernel; -Void UserProcess::SetEntrypoint(VoidPtr imageStart) noexcept +Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept { if (imageStart == nullptr) this->Crash(); diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index 570346c1..ec053435 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -24,7 +24,7 @@ EXTERN_C #include } -#define kSyscallRoute (0x32) +#define kSyscallRoute (51) #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) @@ -32,8 +32,8 @@ EXTERN_C #define kInterruptGate (0x8E) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) -#define kGdtCodeSelector (0x08) -#define kGdtUserCodeSelector (0x2b) +#define kGdtKernelCodeSelector (0x08) +#define kGdtUserCodeSelector (0x23) namespace Kernel { @@ -110,7 +110,7 @@ namespace Kernel::HAL UIntPtr R8{0}; UIntPtr R9{0}; UIntPtr R10{0}; - UIntPtr R11{0}; + UIntPtr R11{0}; // not tied to r11, rax this time! UIntPtr R12{0}; UIntPtr R13{0}; UIntPtr R14{0}; @@ -237,12 +237,12 @@ namespace Kernel::HAL struct PACKED ZKA_GDT_ENTRY final { - UInt16 fLimit0; - UInt16 fBase0; - UInt8 fBase1; + UInt16 fLimitLow; + UInt16 fBaseLow; + UInt8 fBaseMid; UInt8 fAccessByte; UInt8 fGranularity; - UInt8 fBase2; + UInt8 fBaseHigh; }; } // namespace Detail diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx index 9145eec0..6bb3d7b4 100644 --- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -50,7 +49,7 @@ namespace Kernel::HAL { /// @brief Gets the system cores using the MADT. /// @param rsdPtr The 'RSD PTR' data structure. - EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr); + EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept; } // namespace Kernel::HAL Kernel::Void hal_real_init(Kernel::Void) noexcept; @@ -90,104 +89,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept kKernelPhysicalStart = reinterpret_cast( reinterpret_cast(kHandoverHeader->f_PhysicalStart)); - // Register the basic system calls. - - constexpr auto cTlsInterrupt = 0x11; - constexpr auto cTlsInstallInterrupt = 0x12; - constexpr auto cNewInterrupt = 0x13; - constexpr auto cDeleteInterrupt = 0x14; - constexpr auto cExitInterrupt = 0x15; - constexpr auto cLastExitInterrupt = 0x16; - constexpr auto cCatalogOpen = 0x17; - constexpr auto cForkRead = 0x18; - constexpr auto cForkWrite = 0x19; - constexpr auto cCatalogClose = 0x20; - constexpr auto cCatalogRemove = 0x21; - constexpr auto cCatalogCreate = 0x22; - constexpr auto cRebootInterrupt = 0x23; - constexpr auto cShutdownInterrupt = 0x24; - constexpr auto cLPCSendMsg = 0x25; - constexpr auto cLPCOpenMsg = 0x26; - constexpr auto cLPCCloseMsg = 0x27; - - kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - if (tls_check_syscall_impl(rdx) == false) - { - Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Crash(); - } - }; - - kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - // get HAC struct. - HEAP_ALLOC_INFO* rdxInf = reinterpret_cast(rdx); - - if (!rdxInf) - return; - - // assign the fThe field with the pointer. - rdxInf->fThe = Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().New(rdxInf->fTheSz); - }; - - kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - // get HAC struct. - HEAP_ALLOC_INFO* rdxInf = reinterpret_cast(rdx); - - if (!rdxInf) - return; - - // delete ptr with sz in mind. - Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz); - }; - - kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast(rdx); - - if (!rdxPb) - return; - - // install the fTIB and fGIB. - rt_install_tib(rdxPb->fTIB, rdxPb->fGIB); - }; - - kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_EXIT_INFO* rdxEi = reinterpret_cast(rdx); - - if (!rdxEi) - return; - - Kernel::kcout << "newoskrnl.dll: " << rdxEi->fReason << "\r"; - Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Exit(rdxEi->fCode); - }; - - kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - PROCESS_EXIT_INFO* rdxEi = reinterpret_cast(rdx); - - if (!rdxEi) - return; - - rdxEi->fCode = Kernel::sched_get_exit_code(); - }; - - kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr); - pow.Reboot(); - }; - - kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr); - pow.Shutdown(); - }; - - kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; - kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; - - if (kHandoverHeader->f_MultiProcessingEnabled) + if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); else Kernel::HAL::mp_get_cores(nullptr); diff --git a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx index 74e37d91..781c639a 100644 --- a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx +++ b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx @@ -8,7 +8,7 @@ using namespace Kernel; -Void UserProcess::SetEntrypoint(UIntPtr& imageStart) noexcept +Void UserProcess::SetImageStart(UIntPtr& imageStart) noexcept { if (imageStart == 0) this->Crash(); diff --git a/dev/ZKA/KernelKit/UserProcessScheduler.hxx b/dev/ZKA/KernelKit/UserProcessScheduler.hxx index da6a9fc2..7a7d200e 100644 --- a/dev/ZKA/KernelKit/UserProcessScheduler.hxx +++ b/dev/ZKA/KernelKit/UserProcessScheduler.hxx @@ -138,7 +138,7 @@ namespace Kernel ZKA_COPY_DEFAULT(UserProcess) public: - void SetEntrypoint(VoidPtr imageStart) noexcept; + void SetImageStart(VoidPtr imageStart) noexcept; const UInt32& GetExitCode() noexcept; public: diff --git a/dev/ZKA/Sources/CodeManager.cxx b/dev/ZKA/Sources/CodeManager.cxx index 5f634539..f01bf41c 100644 --- a/dev/ZKA/Sources/CodeManager.cxx +++ b/dev/ZKA/Sources/CodeManager.cxx @@ -20,7 +20,7 @@ namespace Kernel return false; UserProcess proc; - proc.SetEntrypoint(reinterpret_cast(main)); + proc.SetImageStart(reinterpret_cast(main)); proc.Kind = UserProcess::kExeKind; proc.StackSize = mib_cast(1); diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx index d8edeaaf..25be253f 100644 --- a/dev/ZKA/Sources/DLLMain.cxx +++ b/dev/ZKA/Sources/DLLMain.cxx @@ -188,8 +188,15 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void) Kernel::cProcessScheduler = nullptr; Kernel::ProcessHelper::StartScheduling(); - CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.dll: Starting ZKA System...", 30, 10, RGB(0, 0, 0)); + CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.dll: Starting ZKA System...", 20, 10, RGB(0, 0, 0)); + + static Kernel::MainKind fn = []() -> void {while(1); }; + Kernel::sched_execute_thread(fn, "ZKA Logger"); + + while (Yes) + { + Kernel::ProcessHelper::StartScheduling(); + } - Kernel::ProcessHelper::StartScheduling(); Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx index 9c7a47f3..5b44a119 100644 --- a/dev/ZKA/Sources/MP.cxx +++ b/dev/ZKA/Sources/MP.cxx @@ -98,15 +98,15 @@ namespace Kernel fStack = frame; - auto ret = mp_register_process(fStack); - - if (!ret) + if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) { - mp_do_context_switch_pre(); - return mp_do_context_switch(image, stack_ptr, fStack) != 0; + return mp_register_process(fStack); } - return ret; + kcout << "newoskrnl: Switching now...\r"; + + mp_do_context_switch_pre(); + return mp_do_context_switch(image, stack_ptr, fStack) != 0; } ///! @brief Tells if processor is waked up. diff --git a/dev/ZKA/Sources/PEFCodeManager.cxx b/dev/ZKA/Sources/PEFCodeManager.cxx index 11743373..0f1a4885 100644 --- a/dev/ZKA/Sources/PEFCodeManager.cxx +++ b/dev/ZKA/Sources/PEFCodeManager.cxx @@ -206,7 +206,7 @@ namespace Kernel UserProcess proc; - proc.SetEntrypoint(errOrStart.Leak().Leak()); + proc.SetImageStart(errOrStart.Leak().Leak()); proc.Kind = procKind; proc.StackSize = *(UIntPtr*)exec.FindSymbol(cPefStackSizeSymbol, kPefData); -- cgit v1.2.3