diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-09 10:27:19 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-09 10:27:19 +0200 |
| commit | 04e3bbd771c8a50822aa9e75c8715349fc4ecda4 (patch) | |
| tree | fc4509cdf3738a750f93a617dd01029d1ae1d58d /dev/ZKA | |
| parent | ef71b80d3df1969a2be85eadf2d83cd85745469d (diff) | |
META: Bumping repository.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA')
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx | 10 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalKernelMain.cxx | 8 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm | 13 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 54 | ||||
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/Processor.hxx | 14 | ||||
| -rw-r--r-- | dev/ZKA/amd64-efi.make | 2 |
6 files changed, 66 insertions, 35 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx index 56a5f3a6..cb302f93 100644 --- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx @@ -54,10 +54,10 @@ namespace Kernel kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; if (rw) - mm_map_page(base_ptr, 0, eFlagsRw); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsPresent); if (user) - mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser | eFlagsPresent); return (VoidPtr)ptr_bit_set; } @@ -80,10 +80,10 @@ namespace Kernel kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl; if (rw) - mm_map_page(base_ptr, 0, eFlagsRw); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsPresent); if (user) - mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser); + mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser | eFlagsPresent); return (VoidPtr)ptr_bit_set; } @@ -141,6 +141,8 @@ namespace Kernel ptr_bit_set[0] = cBitMpMagic; ptr_bit_set[2] = No; + mm_map_page(page_ptr, 0, 0); + return true; } } // namespace HAL diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx index e6d5d292..e59eb7cf 100644 --- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx @@ -56,6 +56,9 @@ namespace Kernel::HAL Kernel::Property cKernelVersion; Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser}; +EXTERN_C ATTRIBUTE(naked) void mp_user_switch_proc(void); +EXTERN_C Kernel::UInt8* mp_user_switch_proc_end; + EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept; EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void); @@ -112,7 +115,7 @@ EXTERN_C void hal_init_platform( EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { Kernel::HAL::Register64 idtBase; - idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; + idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable; CONST Kernel::HAL::IDTLoader cIDT; cIDT.Load(idtBase); @@ -126,6 +129,9 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept MUST_PASS(fs); + Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc, 0, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent); + Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc_end, 0, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent); + Kernel::NewFilesystemMgr::Mount(fs); const auto cPassword = "ZKA_KERNEL_AUTHORITY"; diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm index c61db220..945830e2 100644 --- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm @@ -11,13 +11,18 @@ [global mp_do_user_switch] [global mp_do_context_switch_pre] +[global mp_user_switch_proc] +[global mp_user_switch_proc_end] section .text -;; Does a user mode switch, and then loads the task to be run. -;; rcx: code ptr. -;; rdx: stack ptr. +;; @brief Switch to user mode. mp_do_user_switch: + mov rbp, rsp + mov rsp, mp_user_switch_proc_end + + invlpg [0] + mov ax, 0x18 | 3 mov ds, ax mov es, ax @@ -36,8 +41,6 @@ mp_do_user_switch: mov rdx, mp_user_switch_proc push rdx - mov rsp, mp_user_switch_proc_end - o64 iret section .bss diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx index 56b4e190..24c123df 100644 --- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx +++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx @@ -10,7 +10,7 @@ #include <HALKit/AMD64/Processor.hxx> /** - * @file Processor.cpp + * @file HalProcessor.cxx * @brief This file is about processor specific functions (in/out/cli/std...) */ @@ -23,6 +23,11 @@ namespace Kernel::HAL /// @return Status code of page manip. EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags) { + rt_cli(); + + const auto cPAddrMask = 0x000ffffffffff000; + const auto cFlagsMask = 0xFFF; + VoidPtr pml4_base = hal_read_cr3(); UIntPtr pd_idx = ((UIntPtr)virt_addr >> 22); @@ -31,25 +36,12 @@ namespace Kernel::HAL // Now get pd_entry volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pml4_base) + (pd_idx * kPTEAlign)); - // Don't bother allocate directory. - if (!(*pd_entry & 0x01)) - { - ke_stop(RUNTIME_CHECK_PAGE); - } - - UInt64 pt_base = pd_entry[pd_idx] & ~0xFFF; // Remove flags - - // And then PTE - volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pt_base + (pte_idx * kPTEAlign)); - - kcout << (pt_entry[0] & 0x01 ? "Page Present." : "Page Not Present.") << endl; - kcout << (pt_entry[0] & 0x02 ? "Page RW." : "Page Not RW.") << endl; - kcout << (pt_entry[0] & 0x04 ? "Page User." : "Page Not User.") << endl; + UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags switch ((UIntPtr)phys_addr) { case kBadAddress: { - phys_addr = (VoidPtr)((pt_entry[0] & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF)); + phys_addr = (VoidPtr)((pt_base & cPAddrMask) + ((UIntPtr)virt_addr & cFlagsMask)); break; } default: { @@ -57,16 +49,38 @@ namespace Kernel::HAL } } - if (!(pt_entry[0] & 0x01)) + // And then PTE + volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pt_base + (pte_idx * kPTEAlign)); + + if (!(*pt_entry & eFlagsPresent)) { - pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01; - hal_write_cr3(pml4_base); + *pt_entry = ((UIntPtr)phys_addr) | (flags & 0xFFF) | eFlagsPresent; + hal_invl_tlb((VoidPtr)virt_addr); + + kcout << "=================================================\r"; + kcout << "Post page allocation.\r"; + kcout << "=================================================\r"; + kcout << (*pt_entry & eFlagsPresent ? "Page Present." : "Page Not Present.") << endl; + kcout << (*pt_entry & eFlagsRw ? "Page RW." : "Page Not RW.") << endl; + kcout << (*pt_entry & eFlagsUser ? "Page User." : "Page Not User.") << endl; + + rt_sti(); return 0; } - pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF); + *pt_entry = ((UIntPtr)phys_addr) | (flags & 0xFFF) | eFlagsPresent; + + hal_invl_tlb((VoidPtr)virt_addr); + + kcout << "=================================================\r"; + kcout << "Post page change.\r"; + kcout << "=================================================\r"; + kcout << (*pt_entry & eFlagsPresent ? "Page Present." : "Page Not Present.") << endl; + kcout << (*pt_entry & eFlagsRw ? "Page RW." : "Page Not RW.") << endl; + kcout << (*pt_entry & eFlagsUser ? "Page User." : "Page Not User.") << endl; + rt_sti(); return 0; } diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx index 289d6f45..90310aa1 100644 --- a/dev/ZKA/HALKit/AMD64/Processor.hxx +++ b/dev/ZKA/HALKit/AMD64/Processor.hxx @@ -55,10 +55,16 @@ namespace Kernel::HAL /// @brief Virtual memory flags. enum { - eFlagsPresent = 0x01, - eFlagsRw = 0x02, - eFlagsUser = 0x04, - eFlagsCount = 0x3, + eFlagsPresent = 1 << 0, + eFlagsRw = 1 << 1, + eFlagsUser = 1 << 2, + eFlagsWt = 1 << 3, + eFlagsNoCache = 1 << 4, + eFlagsAccess = 1 << 5, + eFlagsDirty = 1 << 6, + eFlagsHuge = 1 << 7, + eFlagsGlobal = 1 << 8, + eFlagsCount = 8, }; /// @brief Set a PTE from pd_base. diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make index 00c2664e..ad6d799b 100644 --- a/dev/ZKA/amd64-efi.make +++ b/dev/ZKA/amd64-efi.make @@ -34,7 +34,7 @@ COPY = cp # Add assembler, linker, and object files variables. ASMFLAGS = -f win64 -# Kernel subsystem is 17 and entrypoint is __ImageStart +# Kernel subsystem is 17 and entrypoint is hal_init_platform LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000 LDOBJ = Objects/*.obj |
