summaryrefslogtreecommitdiffhomepage
path: root/dev/zka/HALKit
diff options
context:
space:
mode:
Diffstat (limited to 'dev/zka/HALKit')
-rw-r--r--dev/zka/HALKit/AMD64/HalBMPMgr.cxx38
-rw-r--r--dev/zka/HALKit/AMD64/HalCPU.cxx2
-rw-r--r--dev/zka/HALKit/AMD64/HalDebugOutput.cxx1
-rw-r--r--dev/zka/HALKit/AMD64/HalKernelMain.cxx16
-rw-r--r--dev/zka/HALKit/AMD64/HalMPContextSwitch.asm3
-rw-r--r--dev/zka/HALKit/AMD64/HalPaging.cxx75
-rw-r--r--dev/zka/HALKit/AMD64/HalPagingMgr.cxx162
-rw-r--r--dev/zka/HALKit/AMD64/Paging.hxx2
-rw-r--r--dev/zka/HALKit/AMD64/Processor.hxx7
-rw-r--r--dev/zka/HALKit/ARM64/HalKernelMain.cxx5
-rw-r--r--dev/zka/HALKit/ARM64/Paging.hxx2
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