aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Murphy <alec@checksum.fail>2021-07-09 21:40:47 -0400
committerAlec Murphy <alec@checksum.fail>2021-07-09 21:40:47 -0400
commit7e8ed49196b61710243e89f906eb9e6e8cd84866 (patch)
treee13534b75761b25024ae2fa38e48a225e84399d5
parent45b0e4c80c4909f70a7c38dd479b8059229d7331 (diff)
Libraries/Memory: Memory.InitPageTablesForTask() returns class @pmlHEADmaster
-rw-r--r--Boot/Libraries/Memory.HC27
1 files changed, 23 insertions, 4 deletions
diff --git a/Boot/Libraries/Memory.HC b/Boot/Libraries/Memory.HC
index 43be05a..b3425e8 100644
--- a/Boot/Libraries/Memory.HC
+++ b/Boot/Libraries/Memory.HC
@@ -1,12 +1,19 @@
+class @pml {
+ U32 pml2;
+ U32 pml3;
+ U32 pml4;
+};
+
/* clang-format off */
-U32 @memory_init_page_tables_for_task(CTask *task) {
+@pml *@memory_init_page_tables_for_task(CTask *task) {
U32 reg R11 _pml2 = MAllocAligned(MEM_2MEG_NUM * 8, 4096, task->code_heap);
U32 reg R14 _pml3 = MAllocAligned(MEM_1GIG_NUM * 8, 4096, task->code_heap);
U32 reg R15 _pml4 = MAllocAligned(MEM_512GIG_NUM * 8, 4096, task->code_heap);
asm {
+ PUSH_REGS
//PML2: Use 2Meg Pages
MOV EAX,0x87 //bit 7 is page size (2Meg)
XOR EDX,EDX
@@ -60,9 +67,14 @@ asm {
ADD EAX,0x1000
ADC EDX,0
LOOP @@45
+ POP_REGS
}
task->user_data.u32[1] = _pml4;
- return _pml2;
+ @pml *pml = CAlloc(sizeof(@pml));
+ pml->pml2 = _pml2;
+ pml->pml3 = _pml3;
+ pml->pml4 = _pml4;
+ return pml;
}
/* clang-format on */
@@ -74,17 +86,24 @@ U64 @page_table_entry_ptr(U64 ptr, U8 *a) {
return entry_ptr;
}
+U8 *@memory_malloc_2meg_pages(CTask *task, I64 count) {
+ return MAllocAligned(0x200000 * count, 0x200000, task->code_heap);
+}
+
U0 @memory_map_address(U8 *ptr, U64 vaddr, U64 paddr) {
MemCpyU64(@page_table_entry_ptr(ptr, vaddr), MemPageTable(paddr), 1);
+ Yield;
}
class @memory {
- U32 (*InitPageTablesForTask)(CTask * task);
- U0 (*MapAddress)(CTask * task, U64 vaddr, U64 paddr);
+ @pml *(*InitPageTablesForTask)(CTask * task);
+ U8 *(*MAlloc2MegPages)(CTask * task, I64 count);
+ U0 (*MapAddress)(U8 * ptr, U64 vaddr, U64 paddr);
};
@memory Memory;
Memory.InitPageTablesForTask = &@memory_init_page_tables_for_task;
+Memory.MAlloc2MegPages = &@memory_malloc_2meg_pages;
Memory.MapAddress = &@memory_map_address;
"memory "; \ No newline at end of file