diff options
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/ZBA/Sources/HEL/AMD64/BootJump.S | 6 | ||||
| -rw-r--r-- | dev/ZBA/Sources/Thread.cxx | 5 | ||||
| -rw-r--r-- | dev/ZBA/amd64-efi.make | 2 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx | 14 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm | 11 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 31 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 41 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx | 6 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 33 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx | 14 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Processor.hxx | 37 | ||||
| -rw-r--r-- | dev/ZKA/KernelKit/PEFDLLInterface.hxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/NewKit/Macros.hxx | 12 | ||||
| -rw-r--r-- | dev/ZKA/Sources/CodeManager.cxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/Sources/DLLInterface.cxx | 11 | ||||
| -rw-r--r-- | dev/ZKA/Sources/DLLMain.cxx | 2 | ||||
| -rw-r--r-- | dev/ZKA/Sources/MP.cxx | 11 | ||||
| -rw-r--r-- | dev/ZKA/Sources/PEFCodeManager.cxx | 8 | ||||
| -rw-r--r-- | dev/ZKA/Sources/UserProcessScheduler.cxx | 5 | ||||
| -rw-r--r-- | dev/ZKA/amd64-efi.make | 2 |
20 files changed, 152 insertions, 103 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootJump.S b/dev/ZBA/Sources/HEL/AMD64/BootJump.S index f9943ecf..d8e09d4e 100644 --- a/dev/ZBA/Sources/HEL/AMD64/BootJump.S +++ b/dev/ZBA/Sources/HEL/AMD64/BootJump.S @@ -9,15 +9,9 @@ @brief this function setups a stack and then jumps to a function */ rt_jump_to_address: - mov rsp, r8 - - push rax - push rdx mov rbx, rcx mov rcx, rdx jmp rbx - pop rdx - pop rax ret diff --git a/dev/ZBA/Sources/Thread.cxx b/dev/ZBA/Sources/Thread.cxx index c7a62a04..1ea83618 100644 --- a/dev/ZBA/Sources/Thread.cxx +++ b/dev/ZBA/Sources/Thread.cxx @@ -22,6 +22,9 @@ EXTERN_C{ #include <string.h> } +EXTERN_C Void +rt_jump_to_address(VoidPtr start, VoidPtr handover); + // External boot services symbol. EXTERN EfiBootServices* BS; @@ -162,7 +165,7 @@ namespace Boot err_fn(handover); } - reinterpret_cast<HEL::HandoverProc>(fStartAddress)(handover); + rt_jump_to_address(fStartAddress, handover); } const Char* BThread::GetName() diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make index 62147f7c..d75f2aaf 100644 --- a/dev/ZBA/amd64-efi.make +++ b/dev/ZBA/amd64-efi.make @@ -36,7 +36,7 @@ EMU_FLAGS=-net none -m 8G -M q35 -cpu qemu64 \ file=fat:rw:Sources/Root/,index=2,format=raw \ -drive id=disk_2,file=$(IMG_2),if=none \ -device ahci,id=ahci \ - -device ide-hd,drive=disk_2,bus=ahci.0 -d int -no-reboot + -device ide-hd,drive=disk_2,bus=ahci.0 -d int LD_FLAGS=-e Main --subsystem=10 diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx index 0033f614..9a0914f8 100644 --- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx @@ -10,9 +10,6 @@ namespace Kernel::HAL { namespace Detail { - STATIC RegisterGDT kRegGdt; - STATIC HAL::Register64 kRegIdt; - STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64 kInterruptVectorTable[kKernelIdtSize]; @@ -41,10 +38,7 @@ namespace Kernel::HAL /// @return Void GDTLoader::Load(RegisterGDT& gdt) { - Detail::kRegGdt.Base = gdt.Base; - Detail::kRegGdt.Limit = gdt.Limit; - - hal_load_gdt(Detail::kRegGdt); + hal_load_gdt(gdt); } Void IDTLoader::Load(Register64& idt) @@ -81,11 +75,7 @@ namespace Kernel::HAL Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; } - Detail::kRegIdt.Base = reinterpret_cast<UIntPtr>(Detail::kInterruptVectorTable); - Detail::kRegIdt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * - (kKernelIdtSize - 1); - - hal_load_idt(Detail::kRegIdt); + hal_load_idt(idt); Detail::hal_remap_intel_pic_ctrl(); } diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm index d3decfde..d59cc197 100644 --- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm @@ -140,7 +140,14 @@ IntNormal 37 IntNormal 38 IntNormal 39 IntNormal 40 -IntNormal 41 + +extern mp_system_call_handler + +__ZKA_INT_41: + cmp rcx, 0 + jne mp_system_call_handler + iretq + IntNormal 42 IntNormal 43 IntNormal 44 @@ -218,7 +225,7 @@ hal_load_gdt: push 0x08 lea rax, [rel rt_reload_segments] push rax - retfq + o64 retf rt_reload_segments: mov ax, 0x10 mov ds, ax diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index d99431fa..2cdeb7f0 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -64,19 +64,35 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept; EXTERN_C void hal_user_code_start(void); EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); +/* @brief TSS */ + +Kernel::HAL::Detail::ZKA_TSS cTSS = { + .fReserved1 = 0x0, + .fRsp0 = 0x0, + .fRsp1 = 0x0, + .fRsp2 = 0x0, + .fReserved2 = 0x0, + .fIst1 = 0x0, + .fIst2 = 0x0, + .fIst3 = 0x0, + .fIst4 = 0x0, + .fIst5 = 0x0, + .fIst6 = 0x0, + .fIst7 = 0x0, + .fReserved3 = 0x0, + .fReserved4 = 0x0, + .fIopb = 0x0, +}; /* GDT, mostly descriptors for user and kernel segments. */ -STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[9] = { +STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[6] = { {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel code {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel data {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fFlags = 0xA0, .fBaseHigh = 0}, // User code {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fFlags = 0xA0, .fBaseHigh = 0}, // User data // reserve them for later. - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data - {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data + {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, }; EXTERN_C void hal_init_platform( @@ -117,7 +133,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::HAL::RegisterGDT gdtBase; gdtBase.Base = reinterpret_cast<Kernel::UIntPtr>(cGdt); - gdtBase.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * 9); + gdtBase.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * 6) - 1; CONST Kernel::HAL::GDTLoader cGDT; cGDT.Load(gdtBase); @@ -126,7 +142,8 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::HAL::Register64 idtBase; idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; - idtBase.Limit = 0; + idtBase.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * + (kKernelIdtSize - 1); CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index ac68dfad..dc534589 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -21,6 +21,9 @@ section .text ;; rcx: code ptr. ;; rdx: stack ptr. mp_do_context_switch: + mov rsp, rdx + mov rbp, rsp + mov r9, [r8 + (8 * 2)] mov r10, [r8 + (8 * 3)] mov fs, [r8 + (8 * 4)] @@ -31,11 +34,11 @@ mp_do_context_switch: mov gs, [r8 + (8 * 9)] mov r8, [r8] + mov rax, rcx + mov r11, 0x202 - mov rsp, rdx - xor rax, rax - o64 sysret + o64 sysret ;; @brief Gets the current stack frame. mp_get_current_context: @@ -43,35 +46,41 @@ mp_get_current_context: ret extern hal_system_call_enter +global mp_system_call_handler mp_system_call_handler: + swapgs + push r8 push r9 push r10 - call hal_system_call_enter + jmp hal_system_call_enter pop r10 pop r9 pop r8 - sysret + swapgs + sti + + o64 sysret mp_do_context_switch_pre: + mov rcx, 0xc0000080 + rdmsr + or eax, 1 + wrmsr - xor rdx, rdx - mov rax, 0x202 - mov rcx, 0xc0000084 + mov rcx, 0xc0000081 + rdmsr + mov rax, 0x00000000 + mov edx, 0x00180008 wrmsr - xor rax, rax - mov rax, mp_system_call_handler - mov rdx, rax - shr rdx, 32 + mov rcx, 0xc0000082 - wrmsr - xor rax, rax - mov rdx, 0x230008 - mov rcx, 0xc0000081 + 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 index 3d8deac2..28b5f9be 100644 --- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx +++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx @@ -98,11 +98,9 @@ namespace Kernel kAllocationInProgress = false; VoidPtr result = reinterpret_cast<VoidPtr>(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); - VoidPtr cr3 = hal_read_cr3(); - mm_update_pte(cr3, 0, result, eFlagsPresent | (rw ? eFlagsRw : 0) | (user ? eFlagsUser : 0)); - mm_update_pte(cr3, 0, result, (rw ? eFlagsRw : 0)); - mm_update_pte(cr3, 0, result, (user ? eFlagsUser : 0)); + mm_update_pte(result, (rw ? eFlagsRw : 0)); + mm_update_pte(result, (user ? eFlagsUser : 0)); return result; } diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx index 94d989e7..169c02f5 100644 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx @@ -16,25 +16,38 @@ namespace Kernel::HAL { - EXTERN_C Int32 mm_update_pte(VoidPtr pd_base, VoidPtr phys_addr, VoidPtr virt_addr, UInt32 flags) + EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags) { - UIntPtr pte_idx = (UIntPtr)virt_addr >> 12; + VoidPtr pml4_base = hal_read_cr3(); - volatile PTE* pte = (volatile PTE*)((UIntPtr)pd_base + (kPTEAlign * pte_idx)); + 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; - if (pte) + // Access PML4 entry + volatile UInt64* pml4_entry = (volatile UInt64*)(pml4_base + pml4_idx * sizeof(UIntPtr)); + UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages) + + // Access PDPT entry + volatile UInt64* pdpt_entry = (volatile UInt64*)(pdpt_base + pdpt_idx * sizeof(UIntPtr)); + UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags + + volatile UInt64* pd_entry = (volatile UInt64*)(pd_base + pd_idx * sizeof(UIntPtr)); + UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags + + volatile UInt64* page_addr = (volatile UInt64*)((UIntPtr)pt_base + (pte_idx * sizeof(UIntPtr))); + + if (page_addr) { if (flags & eFlagsPresent) - pte->Present = flags & eFlagsPresent; + *page_addr |= 0x01; // present bit if (flags & eFlagsRw) - pte->Rw = flags & eFlagsRw; + *page_addr |= 0x02; if (flags & eFlagsUser) - pte->User = flags & eFlagsUser; - - if (flags & eFlagsExecDisable) - pte->ExecDisable = flags & eFlagsExecDisable; + *page_addr |= 0x02; return Yes; } diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx index 7b1f1711..bf98d01d 100644 --- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx +++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx @@ -14,14 +14,24 @@ Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept if (imageStart == nullptr) this->Crash(); - HAL::mm_update_pte(hal_read_cr3(), 0, imageStart, HAL::eFlagsPresent | HAL::eFlagsUser); + HAL::mm_update_pte(imageStart, HAL::eFlagsPresent | HAL::eFlagsUser); this->Image = imageStart; } namespace Kernel { - bool hal_check_stack(HAL::StackFramePtr stack_ptr) + /***********************************************************************************/ + /// @brief Unimplemented function (crashes by default) + /// @param + /***********************************************************************************/ + + EXTERN_C Void __zka_pure_call(void) + { + asm volatile ("mov %r8, 0; mov %r9, 1; syscall"); + } + + Bool hal_check_stack(HAL::StackFramePtr stack_ptr) { if (!stack_ptr) return false; diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index 911af46e..0f24a2be 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -24,16 +24,16 @@ EXTERN_C #include <cpuid.h> } -#define kSyscallRoute (51) +#define kSyscallRoute (0x29) #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) -#define kInterruptGate (0x8E) -#define kTrapGate (0xEF) -#define kTaskGate (0b10001100) -#define kGdtKernelCodeSelector (0x08) -#define kGdtUserCodeSelector (0x23) +#define kInterruptGate (0x8E) +#define kTrapGate (0xEF) +#define kTaskGate (0b10001100) +#define kGdtKernelCodeSelector (0x08) +#define kGdtUserCodeSelector (0x23) namespace Kernel { @@ -62,16 +62,13 @@ namespace Kernel::HAL eFlagsUser, eFlagsRw, eFlagsExecDisable, - eFlagsSetPhysAddress, eFlagsCount, }; /// @brief Updates a PTE from pd_base. - /// @param pd_base a valid PDE address. - /// @param phys_addr a valid phyiscal address. /// @param virt_addr a valid virtual address. /// @param flags the flags to put on the page. - EXTERN_C Int32 mm_update_pte(VoidPtr pd_base, VoidPtr phys_addr, VoidPtr virt_addr, UInt32 flags); + EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags); EXTERN_C UChar In8(UInt16 port); EXTERN_C UShort In16(UInt16 port); @@ -230,6 +227,26 @@ namespace Kernel::HAL /// @brief Processor specific namespace. namespace Detail { + /* @brief TSS struct. */ + struct ZKA_TSS final + { + UInt32 fReserved1; + UInt64 fRsp0; + UInt64 fRsp1; + UInt64 fRsp2; + UInt64 fReserved2; + UInt64 fIst1; + UInt64 fIst2; + UInt64 fIst3; + UInt64 fIst4; + UInt64 fIst5; + UInt64 fIst6; + UInt64 fIst7; + UInt64 fReserved3; + UInt16 fReserved4; + UInt16 fIopb; + }; + /** @brief Global descriptor table entry, either null, code or data. */ diff --git a/dev/ZKA/KernelKit/PEFDLLInterface.hxx b/dev/ZKA/KernelKit/PEFDLLInterface.hxx index cfedd07c..ef1a844f 100644 --- a/dev/ZKA/KernelKit/PEFDLLInterface.hxx +++ b/dev/ZKA/KernelKit/PEFDLLInterface.hxx @@ -84,7 +84,7 @@ namespace Kernel if (!ret) { if (kind == kPefCode) - return (VoidPtr)__zka_pure_call; + return (VoidPtr)&__zka_pure_call; return nullptr; } diff --git a/dev/ZKA/NewKit/Macros.hxx b/dev/ZKA/NewKit/Macros.hxx index 4b1f4268..153b8c45 100644 --- a/dev/ZKA/NewKit/Macros.hxx +++ b/dev/ZKA/NewKit/Macros.hxx @@ -15,27 +15,27 @@ #endif #ifndef MIB -#define MIB(X) ((UInt64)KIB(X) / 1024) +#define MIB(X) ((Kernel::UInt64)KIB(X) / 1024) #endif #ifndef mib_cast -#define mib_cast(X) ((UInt64)kib_cast(X) * 1024) +#define mib_cast(X) ((Kernel::UInt64)kib_cast(X) * 1024) #endif #ifndef GIB -#define GIB(X) ((UInt64)MIB(X) / 1024) +#define GIB(X) ((Kernel::UInt64)MIB(X) / 1024) #endif #ifndef gib_cast -#define gib_cast(X) ((UInt64)mib_cast(X) * 1024) +#define gib_cast(X) ((Kernel::UInt64)mib_cast(X) * 1024) #endif #ifndef TIB -#define TIB(X) ((UInt64)GIB(X) / 1024) +#define TIB(X) ((Kernel::UInt64)GIB(X) / 1024) #endif #ifndef tib_cast -#define tib_cast(X) ((UInt64)gib_cast(X) * 1024) +#define tib_cast(X) ((Kernel::UInt64)gib_cast(X) * 1024) #endif #ifndef ARRAY_SIZE diff --git a/dev/ZKA/Sources/CodeManager.cxx b/dev/ZKA/Sources/CodeManager.cxx index f01bf41c..7e180ac0 100644 --- a/dev/ZKA/Sources/CodeManager.cxx +++ b/dev/ZKA/Sources/CodeManager.cxx @@ -23,7 +23,7 @@ namespace Kernel proc.SetImageStart(reinterpret_cast<VoidPtr>(main)); proc.Kind = UserProcess::kExeKind; - proc.StackSize = mib_cast(1); + proc.StackSize = kib_cast(8); rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(processName)); diff --git a/dev/ZKA/Sources/DLLInterface.cxx b/dev/ZKA/Sources/DLLInterface.cxx index 0ff6e91b..c18f2f00 100644 --- a/dev/ZKA/Sources/DLLInterface.cxx +++ b/dev/ZKA/Sources/DLLInterface.cxx @@ -13,14 +13,3 @@ #include <KernelKit/UserProcessScheduler.hxx> using namespace Kernel; - -/***********************************************************************************/ -/// @brief Unimplemented function (crashes by default) -/// @param -/***********************************************************************************/ - -EXTERN_C void __zka_pure_call(void) -{ - kcout << "newoskrnl.exe: Unimplemented entrypoint symbol!\r"; - UserProcessScheduler::The().CurrentProcess().Leak().Crash(); -} diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx index 8faa7a08..934f418c 100644 --- a/dev/ZKA/Sources/DLLMain.cxx +++ b/dev/ZKA/Sources/DLLMain.cxx @@ -155,7 +155,7 @@ namespace Kernel EXTERN UserProcessScheduler* cProcessScheduler; } // namespace Kernel -Kernel::Void HangCPU(Kernel::Void) +EXTERN_C Kernel::Void HangCPU(Kernel::Void) { while (1); } diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx index 23916a2f..fcf555cb 100644 --- a/dev/ZKA/Sources/MP.cxx +++ b/dev/ZKA/Sources/MP.cxx @@ -15,6 +15,10 @@ ///! @brief This file handles multi processing in the Kernel. ///! @brief Multi processing is needed for multi-tasking operations. +#ifdef __ZKA_AMD64__ +EXTERN Kernel::HAL::Detail::ZKA_TSS cTSS; +#endif // ifdef __ZKA_AMD64__ + namespace Kernel { /***********************************************************************************/ @@ -100,13 +104,18 @@ namespace Kernel if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) { +#ifdef __ZKA_AMD64__ + cTSS.fRsp0 = (UIntPtr)stack_ptr; +#endif // ifdef __ZKA_AMD64__ return mp_register_process(fStack); } //! SMP is disabled here. mp_do_context_switch_pre(); - return mp_do_context_switch(image, stack_ptr, fStack) != 0; + mp_do_context_switch(image, stack_ptr, fStack); + + return true; } ///! @brief Tells if processor is waked up. diff --git a/dev/ZKA/Sources/PEFCodeManager.cxx b/dev/ZKA/Sources/PEFCodeManager.cxx index 911281f6..a797fd50 100644 --- a/dev/ZKA/Sources/PEFCodeManager.cxx +++ b/dev/ZKA/Sources/PEFCodeManager.cxx @@ -166,14 +166,6 @@ namespace Kernel rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size); -#ifdef __ZKA_AMD64__ - HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, HAL::eFlagsPresent); - HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, HAL::eFlagsUser); - HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, (container_header->Kind != kPefCode ? HAL::eFlagsRw : 0)); -#else -#warning ! No page bits set fo blob ! -#endif - mm_delete_ke_heap(blob); return blobRet; } diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx index 1d49ff5c..dc142b18 100644 --- a/dev/ZKA/Sources/UserProcessScheduler.cxx +++ b/dev/ZKA/Sources/UserProcessScheduler.cxx @@ -260,7 +260,7 @@ namespace Kernel if (!process.StackReserve) { process.StackReserve = (UInt8*)mm_new_ke_heap(kSchedMaxStackSz, Yes, Yes); - kcout << "newoskrnl.exe: Use fallback reserve.\r"; + kcout << "newoskrnl.exe: Use fallback reserve size.\r"; } } else @@ -341,10 +341,11 @@ namespace Kernel kcout << process.Name << ": will be runned.\r"; // tell helper to find a core to schedule on. - if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame, + if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame, process.ProcessId)) { process.Crash(); + continue; } process.Exit(); diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make index 730c4b10..02224e93 100644 --- a/dev/ZKA/amd64-efi.make +++ b/dev/ZKA/amd64-efi.make @@ -5,7 +5,7 @@ CC = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -shared -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ +CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ -std=c++20 -D__ZKA_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ \ -D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../ZBA |
