aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlec Murphy <alec@checksum.fail>2021-07-08 15:58:28 -0400
committerAlec Murphy <alec@checksum.fail>2021-07-08 15:58:28 -0400
commit43d84b2ed7edf660fd3b273e0c176d87c6fac003 (patch)
tree2f95238e78536814112e0de8f2c6f5a62f23f018
parent0da64c28edcc27455408b7948abd5c3bd722cd37 (diff)
Libraries/Memory: Add a Memory library for handling per-task memory mapping
-rw-r--r--Boot/Libraries/Memory.HC90
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