diff options
author | Alec Murphy <alec@checksum.fail> | 2021-07-08 15:58:28 -0400 |
---|---|---|
committer | Alec Murphy <alec@checksum.fail> | 2021-07-08 15:58:28 -0400 |
commit | 43d84b2ed7edf660fd3b273e0c176d87c6fac003 (patch) | |
tree | 2f95238e78536814112e0de8f2c6f5a62f23f018 | |
parent | 0da64c28edcc27455408b7948abd5c3bd722cd37 (diff) |
Libraries/Memory: Add a Memory library for handling per-task memory mapping
-rw-r--r-- | Boot/Libraries/Memory.HC | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Boot/Libraries/Memory.HC b/Boot/Libraries/Memory.HC new file mode 100644 index 0000000..43be05a --- /dev/null +++ b/Boot/Libraries/Memory.HC @@ -0,0 +1,90 @@ +/* clang-format off */ + +U32 @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 { +//PML2: Use 2Meg Pages + MOV EAX,0x87 //bit 7 is page size (2Meg) + XOR EDX,EDX + MOV RDI,R11 + MOV ECX,[MEM_2MEG_NUM] +@@20: MOV U32 [EDI],EAX + ADD EDI,4 + MOV U32 [EDI],EDX + ADD EDI,4 + ADD EAX,0x200000 + ADC EDX,0 + LOOP @@20 +//PML3: Use 2Meg Pages + MOV RAX,R11 + OR EAX,7 + XOR EDX,EDX + MOV RDI,R14 + MOV ECX,[MEM_1GIG_NUM] +@@25: MOV U32 [EDI],EAX + ADD EDI,4 + MOV U32 [EDI],EDX + ADD EDI,4 + ADD EAX,0x1000 + ADC EDX,0 + LOOP @@25 + JMP @@40 + +//PML3: Use 1Gig Pages +@@30: MOV EAX,0x87 //bit 7 is page size (1Gig) + XOR EDX,EDX + MOV RDI,R14 + MOV ECX,[MEM_1GIG_NUM] +@@35: MOV U32 [EDI],EAX + ADD EDI,4 + MOV U32 [EDI],EDX + ADD EDI,4 + ADD EAX,0x40000000 + ADC EDX,0 + LOOP @@35 + +//PML4 +@@40: MOV RAX,R14 + OR EAX,7 + XOR EDX,EDX + MOV RDI,R15 + MOV ECX,[MEM_512GIG_NUM] +@@45: MOV U32 [EDI],EAX + ADD EDI,4 + MOV U32 [EDI],EDX + ADD EDI,4 + ADD EAX,0x1000 + ADC EDX,0 + LOOP @@45 +} + task->user_data.u32[1] = _pml4; + return _pml2; +} + +/* clang-format on */ + +U64 @page_table_entry_ptr(U64 ptr, U8 *a) { + U64 entry_ptr = MemPageTable(a); + entry_ptr -= MemPageTable(0); + entry_ptr += ptr; + return entry_ptr; +} + +U0 @memory_map_address(U8 *ptr, U64 vaddr, U64 paddr) { + MemCpyU64(@page_table_entry_ptr(ptr, vaddr), MemPageTable(paddr), 1); +} + +class @memory { + U32 (*InitPageTablesForTask)(CTask * task); + U0 (*MapAddress)(CTask * task, U64 vaddr, U64 paddr); +}; + +@memory Memory; +Memory.InitPageTablesForTask = &@memory_init_page_tables_for_task; +Memory.MapAddress = &@memory_map_address; + +"memory ";
\ No newline at end of file |