diff options
-rw-r--r-- | Boot/Libraries/Memory.HC | 27 |
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 |