diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-09-03 19:55:57 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-09-03 19:55:57 +0200 |
| commit | afe7a2048513132f5ab28a8c5cdb6cbbc6e04993 (patch) | |
| tree | a4b9082672097c170479e92afb400e287b0a2b78 /dev/ZKA/HALKit | |
| parent | a4114685aa464471bcc6d4df39e184d85dd991c7 (diff) | |
[ IMP ] Many improvements and kernel changes.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKA/HALKit')
| -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 |
8 files changed, 124 insertions, 63 deletions
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. */ |
