From 6a85c6ede66f723e1415552482e1c6640653efa2 Mon Sep 17 00:00:00 2001
From: dzwdz
Date: Mon, 1 Aug 2022 16:33:44 +0200
Subject: amd64: /video/b device, provided by grub

---
 src/kernel/arch/amd64/32/paging.c | 24 +++++++++++++-----------
 1 file changed, 13 insertions(+), 11 deletions(-)

(limited to 'src/kernel/arch/amd64/32')

diff --git a/src/kernel/arch/amd64/32/paging.c b/src/kernel/arch/amd64/32/paging.c
index f33168d..16c3526 100644
--- a/src/kernel/arch/amd64/32/paging.c
+++ b/src/kernel/arch/amd64/32/paging.c
@@ -8,7 +8,7 @@ __attribute__((aligned(4096)))
 static pe_generic_t pdpte_low[512]; // 0-512gb
 
 __attribute__((aligned(4096)))
-static pe_generic_t pde_low[512]; // 0-1gb
+static pe_generic_t pde_low[4][512]; // 4 * 0-1gb
 
 void pml4_identity_init(void) {
 	memset32(pml4_identity, 0, sizeof pml4_identity);
@@ -21,18 +21,20 @@ void pml4_identity_init(void) {
 		.address = ((uintptr_t)pdpte_low) >> 12,
 	};
 
-	pdpte_low[0] = (pe_generic_t) {
-		.present = 1,
-		.writeable = 1,
-		.address = ((uintptr_t)pde_low) >> 12,
-	};
-
-	for (int i = 0; i < 512; i++) {
-		pde_low[i] = (pe_generic_t) {
+	for (int i = 0; i < 4; i++) {
+		pdpte_low[i] = (pe_generic_t) {
 			.present = 1,
 			.writeable = 1,
-			.large = 1,
-			.address = (i * 2 * 1024 * 1024) >> 12,
+			.address = ((uintptr_t)&pde_low[i]) >> 12,
 		};
+
+		for (int j = 0; j < 512; j++) {
+			pde_low[i][j] = (pe_generic_t) {
+				.present = 1,
+				.writeable = 1,
+				.large = 1,
+				.address = (i * 512 + j) << 9,
+			};
+		}
 	}
 }
-- 
cgit v1.2.3