diff options
Diffstat (limited to 'dev/zka/HALKit')
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalBMPMgr.cxx | 38 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalCPU.cxx | 2 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalDebugOutput.cxx | 1 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalKernelMain.cxx | 16 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalMPContextSwitch.asm | 3 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalPaging.cxx | 75 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalPagingMgr.cxx | 162 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/Paging.hxx | 2 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/Processor.hxx | 7 | ||||
| -rw-r--r-- | dev/zka/HALKit/ARM64/HalKernelMain.cxx | 5 | ||||
| -rw-r--r-- | dev/zka/HALKit/ARM64/Paging.hxx | 2 |
11 files changed, 212 insertions, 101 deletions
diff --git a/dev/zka/HALKit/AMD64/HalBMPMgr.cxx b/dev/zka/HALKit/AMD64/HalBMPMgr.cxx index b788902a..0c941977 100644 --- a/dev/zka/HALKit/AMD64/HalBMPMgr.cxx +++ b/dev/zka/HALKit/AMD64/HalBMPMgr.cxx @@ -63,15 +63,29 @@ namespace Kernel this->GetBitMapStatus(ptr_bit_set); mm_map_page(ptr_bit_set, ~eFlagsPresent); - mm_map_page(ptr_bit_set, ~eFlagsRw); + mm_map_page(ptr_bit_set, ~eFlagsWr); mm_map_page(ptr_bit_set, ~eFlagsUser); return Yes; } + UInt32 MakeFlags(Bool wr, Bool user) + { + + UInt32 flags = eFlagsPresent; + + if (wr) + flags |= eFlagsWr; + + if (user) + flags |= eFlagsUser; + + return flags; + } + /// @brief Iterate over availables pages for a free one. /// @return The new address which was found. - auto FindBitMap(VoidPtr base_ptr, SizeT size, Bool rw, Bool user) -> VoidPtr + auto FindBitMap(VoidPtr base_ptr, SizeT size, Bool wr, Bool user) -> VoidPtr { VoidPtr base = reinterpret_cast<VoidPtr>(((UIntPtr)base_ptr) + kPageSize); @@ -89,6 +103,9 @@ namespace Kernel this->GetBitMapStatus(ptr_bit_set); + UInt32 flags = this->MakeFlags(wr, user); + mm_map_page(ptr_bit_set, flags); + return (VoidPtr)ptr_bit_set; } } @@ -102,6 +119,9 @@ namespace Kernel this->GetBitMapStatus(ptr_bit_set); + UInt32 flags = this->MakeFlags(wr, user); + mm_map_page(ptr_bit_set, flags); + return (VoidPtr)ptr_bit_set; } @@ -136,25 +156,25 @@ namespace Kernel } // namespace Detail /// @brief Allocate a new page to be used by the OS. - /// @param rw read/write bit. + /// @param wr read/write bit. /// @param user user bit. /// @return - auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr + auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size) -> VoidPtr { VoidPtr ptr_new = nullptr; Detail::IBitMapAllocator traits; - ptr_new = traits.FindBitMap(kKernelBitMpStart, size, rw, user); + ptr_new = traits.FindBitMap(kKernelBitMpStart, size, wr, user); if (!ptr_new) { ke_stop(RUNTIME_CHECK_PAGE); } - if (rw) - mm_map_page(ptr_new, eFlagsRw | eFlagsPresent); - else if (user && rw) - mm_map_page(ptr_new, eFlagsUser | eFlagsRw | eFlagsPresent); + if (wr) + mm_map_page(ptr_new, eFlagsWr | eFlagsPresent); + else if (user && wr) + mm_map_page(ptr_new, eFlagsUser | eFlagsWr | eFlagsPresent); else if (user) mm_map_page(ptr_new, eFlagsUser | eFlagsPresent); else diff --git a/dev/zka/HALKit/AMD64/HalCPU.cxx b/dev/zka/HALKit/AMD64/HalCPU.cxx index 0af8a921..1a7b51df 100644 --- a/dev/zka/HALKit/AMD64/HalCPU.cxx +++ b/dev/zka/HALKit/AMD64/HalCPU.cxx @@ -12,7 +12,7 @@ /** * @file HalCPU.cxx - * @brief CPU Common API. + * @brief Common CPU API. */ namespace Kernel::HAL diff --git a/dev/zka/HALKit/AMD64/HalDebugOutput.cxx b/dev/zka/HALKit/AMD64/HalDebugOutput.cxx index 296bbcec..903900d3 100644 --- a/dev/zka/HALKit/AMD64/HalDebugOutput.cxx +++ b/dev/zka/HALKit/AMD64/HalDebugOutput.cxx @@ -6,7 +6,6 @@ #include <ArchKit/ArchKit.hxx> #include <KernelKit/DebugOutput.hxx> -#include <KernelKit/Framebuffer.hxx> #include <NewKit/Utils.hxx> #include <NewKit/New.hxx> diff --git a/dev/zka/HALKit/AMD64/HalKernelMain.cxx b/dev/zka/HALKit/AMD64/HalKernelMain.cxx index 1ed11953..ad978a08 100644 --- a/dev/zka/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/zka/HALKit/AMD64/HalKernelMain.cxx @@ -8,7 +8,6 @@ #include <Modules/CoreCG/FbRenderer.hxx> #include <FirmwareKit/Handover.hxx> #include <KernelKit/FileMgr.hxx> -#include <KernelKit/Framebuffer.hxx> #include <KernelKit/Heap.hxx> #include <KernelKit/PEFCodeMgr.hxx> #include <KernelKit/UserProcessScheduler.hxx> @@ -19,7 +18,7 @@ #include <NetworkKit/IPC.hxx> #include <CFKit/Property.hxx> #include <Modules/CoreCG/TextRenderer.hxx> -#include <Modules/CoreCG/WindowRenderer.hxx> +#include <Modules/CoreCG/DesktopRenderer.hxx> namespace Kernel::HAL { @@ -28,8 +27,14 @@ namespace Kernel::HAL EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept; } // namespace Kernel::HAL +namespace Kernel +{ + EXTERN UserProcessScheduler* cProcessScheduler; +} + EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::VoidPtr mp_user_switch_proc; +EXTERN_C Kernel::Char mp_user_switch_proc_stack_begin[]; /// @brief Kernel init procedure. EXTERN_C void hal_init_platform( @@ -37,14 +42,14 @@ EXTERN_C void hal_init_platform( { kHandoverHeader = HandoverHeader; + Kernel::cProcessScheduler = nullptr; + if (kHandoverHeader->f_Magic != kHandoverMagic && kHandoverHeader->f_Version != kHandoverVersion) { return; } - CG::CGDrawBackground(); - // get page size. kKernelBitMpSize = kHandoverHeader->f_BitMapSize; @@ -90,7 +95,8 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::NeFileSystemMgr* mgr = Kernel::mm_new_class<Kernel::NeFileSystemMgr>(); Kernel::NeFileSystemMgr::Mount(mgr); - Kernel::HAL::mm_map_page(mp_user_switch_proc, Kernel::HAL::eFlagsUser); + Kernel::HAL::mm_map_page(mp_user_switch_proc, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsWr | Kernel::HAL::eFlagsPresent); + Kernel::HAL::mm_map_page(mp_user_switch_proc_stack_begin, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsWr | Kernel::HAL::eFlagsPresent); mp_do_user_switch(); diff --git a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm index 4251f232..c6480778 100644 --- a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm @@ -12,8 +12,7 @@ [global mp_do_user_switch] [global mp_do_context_switch_pre] [global mp_user_switch_proc] -[global mp_user_switch_proc_real] -[global mp_user_switch_proc_stack_end] +[global mp_user_switch_proc_stack_begin] section .text diff --git a/dev/zka/HALKit/AMD64/HalPaging.cxx b/dev/zka/HALKit/AMD64/HalPaging.cxx deleted file mode 100644 index ac8b1a73..00000000 --- a/dev/zka/HALKit/AMD64/HalPaging.cxx +++ /dev/null @@ -1,75 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies. - - File: HalProcessor.cxx - Purpose: Platform processor routines. - -------------------------------------------- */ - -#include <HALKit/AMD64/Paging.hxx> -#include <HALKit/AMD64/Processor.hxx> - -namespace Kernel::HAL -{ - STATIC Void mm_map_page_status(PTE* pte) - { - if (!pte) - return; - - kcout << (pte->Present ? "Present" : "Not Present") << endl; - kcout << (pte->Wr ? "W/R" : "Not W/R") << endl; - kcout << (pte->User ? "User" : "Not User") << endl; - } - - /// @brief Maps or allocates a page from virt_addr. - /// @internal - /// @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 manipulation process. - EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, UInt32 flags) - { - return 0; - } - - /// @brief Maps or allocates a page from virt_addr. - /// @internal - /// @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 manipulation process. - EXTERN_C Int32 _mm_map_page(VoidPtr virt_addr, UInt32 flags, ZKA_PDE* pde, SizeT pte) - { - if (!virt_addr || !pde || !pte) - return -1; - - if (pde->fEntries[pte]->Present) - { - rt_cli(); - - if (flags & ~eFlagsPresent) - pde->fEntries[pte]->Present = false; - else if (flags & eFlagsPresent) - pde->fEntries[pte]->Present = true; - - if (flags & eFlagsRw) - pde->fEntries[pte]->Wr = true; - else if (flags & ~eFlagsRw) - pde->fEntries[pte]->Wr = false; - - if (flags & eFlagsUser) - pde->fEntries[pte]->User = true; - else if (flags & ~eFlagsUser) - pde->fEntries[pte]->User = false; - - mm_map_page_status(pde->fEntries[pte]); - - rt_sti(); - - return 0; - } - - return -2; - } -} // namespace Kernel::HAL diff --git a/dev/zka/HALKit/AMD64/HalPagingMgr.cxx b/dev/zka/HALKit/AMD64/HalPagingMgr.cxx new file mode 100644 index 00000000..9d721e32 --- /dev/null +++ b/dev/zka/HALKit/AMD64/HalPagingMgr.cxx @@ -0,0 +1,162 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + File: HalPagingMgr.cxx + Purpose: Platform Paging Manager.. + +------------------------------------------- */ + +#include <HALKit/AMD64/Paging.hxx> +#include <HALKit/AMD64/Processor.hxx> + +namespace Kernel::HAL +{ + typedef UInt32 PageTableIndex; + + /// \brief Page store type. + struct ZKA_PAGE_STORE final + { + struct + { + PDE* fPde{nullptr}; + PTE* fPte{nullptr}; + VoidPtr fVAddr{nullptr}; + } fInternalStore; + + Bool fStoreOp{No}; // Store operation in progress. + + bool IsValidPage(PTE* pte) + { + return pte && pte->Present; + } + + bool IsWRPage(PTE* pte) + { + return pte && pte->Wr; + } + + bool IsUserPage(PTE* pte) + { + return pte && pte->User; + } + + static ZKA_PAGE_STORE& The() + { + static ZKA_PAGE_STORE the; + return the; + } + }; + + /// \brief Retrieve the page status of a PTE. + STATIC Void mmi_page_status(PTE* pte) + { + kcout << (pte->Present ? "Present" : "Not Present") << endl; + kcout << (pte->Wr ? "W/R" : "Not W/R") << endl; + kcout << (pte->ExecDisable ? "NX" : "Not NX") << endl; + kcout << (pte->User ? "User" : "Not User") << endl; + } + + STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry); + + /// @brief Maps or allocates a page from virtual_address. + /// @param virtual_address 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 manipulation process. + EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, UInt32 flags) + { + if (!virtual_address || + !flags) + return 0; + + // Constants for table index bits + const UInt64 cPmlIndexMask = 0x1FFULL; // Mask for PML4, PDPT, PD, PT index (9 bits) + const UInt64 cPtIndexMask = 0xFFFULL; // Mask for page table index (12 bits) + + UInt64 cr3 = (UInt64)hal_read_cr3(); + + ZKA_PAGE_STORE& page_store = ZKA_PAGE_STORE::The(); + + // Extract the indices from the virtual address + UInt64 pml4_index = ((UIntPtr)virtual_address >> 39) & cPmlIndexMask; + UInt64 pdpt_index = ((UIntPtr)virtual_address >> 30) & cPmlIndexMask; + UInt64 pd_index = ((UIntPtr)virtual_address >> 21) & cPmlIndexMask; + UInt64 pt_index = ((UIntPtr)virtual_address >> 12) & cPmlIndexMask; + + while (page_store.fStoreOp) + ; + + page_store.fStoreOp = Yes; + + if (page_store.fInternalStore.fVAddr == virtual_address) + { + page_store.fStoreOp = No; + return mmi_map_page_table_entry(page_store.fInternalStore.fVAddr, flags, page_store.fInternalStore.fPte); + } + + const auto cPmlEntrySize = 8; + + // Read the PML4 entry from memory + UInt64 pml4_base = cr3 & ~cPtIndexMask; // CR3 points to the PML4 table base, mask off lower bits + UInt64 pml4_entry = (pml4_base + pml4_index * cPmlEntrySize); // Each entry is 8 bytes + + // Read the PDPT entry + UInt64 pdpt_base = pml4_entry & ~cPtIndexMask; // Get the PDPT base physical address + UInt64 pdpt_entry = (pdpt_base + pdpt_index * cPmlEntrySize); + + // Read the PD entry + UInt64 pd_base = pdpt_entry & ~cPtIndexMask; // Get the Page Directory base physical address + UInt64 pd_entry = (pd_base + pd_index * cPmlEntrySize); + + // Read the PT entry + UInt64 pt_base = pd_entry & ~cPtIndexMask; // Get the Page Table base physical address + UInt64 pt_entry = (pt_base + pt_index * cPmlEntrySize); + + // Lastly, grab the pte entry. + ZKA_PTE* pte_struct = reinterpret_cast<ZKA_PTE*>((UIntPtr*)pt_entry); + + return mmi_map_page_table_entry(virtual_address, flags, pte_struct); + } + + /// @brief Maps flags for a specific pte. + /// @internal Internal function. + STATIC Int32 mmi_map_page_table_entry(VoidPtr virtual_address, UInt32 flags, ZKA_PTE* pt_entry) + { + if (flags & ~eFlagsPresent) + pt_entry->Present = false; + else if (flags & eFlagsPresent) + pt_entry->Present = true; + + if (flags & eFlagsWr) + pt_entry->Wr = true; + else if (flags & ~eFlagsWr) + pt_entry->Wr = false; + + if (flags & eFlagsNX) + pt_entry->ExecDisable = true; + else if (flags & ~eFlagsNX) + pt_entry->ExecDisable = false; + + if (flags & eFlagsUser) + pt_entry->User = true; + else if (flags & ~eFlagsUser) + pt_entry->User = false; + + hal_invl_tlb(reinterpret_cast<VoidPtr>(pt_entry)); + + mmi_page_status(pt_entry); + + ZKA_PAGE_STORE& page_store = ZKA_PAGE_STORE::The(); + + // Update Internal store. + + page_store.fInternalStore.fPde = nullptr; + page_store.fInternalStore.fPte = pt_entry; + page_store.fInternalStore.fVAddr = virtual_address; + + page_store.fStoreOp = No; + + return 0; + } +} // namespace Kernel::HAL diff --git a/dev/zka/HALKit/AMD64/Paging.hxx b/dev/zka/HALKit/AMD64/Paging.hxx index f127d0e4..2b78e89d 100644 --- a/dev/zka/HALKit/AMD64/Paging.hxx +++ b/dev/zka/HALKit/AMD64/Paging.hxx @@ -88,7 +88,7 @@ namespace Kernel::HAL ZKA_PTE* ALIGN(kPageAlign) fEntries[kPageMax]; }; - auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr; + auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size) -> VoidPtr; auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL diff --git a/dev/zka/HALKit/AMD64/Processor.hxx b/dev/zka/HALKit/AMD64/Processor.hxx index e39cac0a..fab5c372 100644 --- a/dev/zka/HALKit/AMD64/Processor.hxx +++ b/dev/zka/HALKit/AMD64/Processor.hxx @@ -54,9 +54,10 @@ namespace Kernel::HAL /// @brief Virtual memory flags. enum { - eFlagsPresent = 0x1, - eFlagsRw = 0x2, - eFlagsUser = 0x4, + eFlagsPresent = 1 << 0, + eFlagsWr = 1 << 1, + eFlagsUser = 1 << 2, + eFlagsNX = 1 << 3, eFlagsCount = 3, }; diff --git a/dev/zka/HALKit/ARM64/HalKernelMain.cxx b/dev/zka/HALKit/ARM64/HalKernelMain.cxx index a1b75ccf..67b98765 100644 --- a/dev/zka/HALKit/ARM64/HalKernelMain.cxx +++ b/dev/zka/HALKit/ARM64/HalKernelMain.cxx @@ -8,7 +8,6 @@ #include <Modules/CoreCG/FbRenderer.hxx> #include <FirmwareKit/Handover.hxx> #include <KernelKit/FileMgr.hxx> -#include <KernelKit/Framebuffer.hxx> #include <KernelKit/Heap.hxx> #include <KernelKit/PEFCodeMgr.hxx> #include <KernelKit/UserProcessScheduler.hxx> @@ -18,7 +17,7 @@ #include <Modules/ACPI/ACPIFactoryInterface.hxx> #include <NetworkKit/IPC.hxx> #include <CFKit/Property.hxx> -#include <Modules/CoreCG/TextRenderer.hxx> +#include <Modules/CoreCG/DesktopRenderer.hxx> namespace Kernel::HAL { @@ -43,7 +42,7 @@ EXTERN_C void hal_init_platform( return; } - CG::CGDrawBackground(); + CG::CGDrawDesktopBackground(); // get page size. kKernelBitMpSize = kHandoverHeader->f_BitMapSize; diff --git a/dev/zka/HALKit/ARM64/Paging.hxx b/dev/zka/HALKit/ARM64/Paging.hxx index 7fe020ef..b6e8708f 100644 --- a/dev/zka/HALKit/ARM64/Paging.hxx +++ b/dev/zka/HALKit/ARM64/Paging.hxx @@ -107,7 +107,7 @@ namespace Kernel::HAL PTE_4KB ALIGN(kPageAlign) fEntries[kPageMax]; }; - auto mm_alloc_bitmap(Boolean rw, Boolean user, SizeT size) -> VoidPtr; + auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size) -> VoidPtr; auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL |
