:: commit 98c5b88f5e7614e43cccc31302733a9cab185e58

mintsuki <mintsuki@protonmail.com> — 2020-09-27 17:14

parents: 86a69d8724

MTRR: Ensure size of MTRR range is aligned to the closest power of 2

diff --git a/Makefile b/Makefile
index 265cc974..b023610e 100644
--- a/Makefile
+++ b/Makefile
@@ -10,7 +10,6 @@ all: stage2 decompressor
 
 clean: stage2-clean decompressor-clean
 	rm -f stage2/stage2.bin.gz
-	#rm -f limine-install
 
 stage2:
 	$(MAKE) -C stage2 all
@@ -36,16 +35,16 @@ test.img:
 	parted -s test.img mklabel msdos
 	parted -s test.img mkpart primary 2048s 100%
 
-echfs-test: limine-install test.img
+echfs-test: test.img
 	$(MAKE) -C test
 	echfs-utils -m -p0 test.img quick-format 512
 	echfs-utils -m -p0 test.img import test/test.elf boot/test.elf
 	echfs-utils -m -p0 test.img import test/limine.cfg limine.cfg
 	echfs-utils -m -p0 test.img import test/bg.bmp bg.bmp
 	./limine-install limine.bin test.img
-	qemu-system-x86_64 -net none -smp 4 -hda test.img -debugcon stdio -enable-kvm
+	qemu-system-x86_64 -net none -smp 4 -hda test.img -debugcon stdio
 
-ext2-test: limine-install test.img
+ext2-test: test.img
 	$(MAKE) -C test
 	rm -rf test_image/
 	mkdir test_image
@@ -61,9 +60,9 @@ ext2-test: limine-install test.img
 	sudo losetup -d `cat loopback_dev`
 	rm -rf test_image loopback_dev
 	./limine-install limine.bin test.img
-	qemu-system-x86_64 -hda test.img -debugcon stdio
+	qemu-system-x86_64 -hda test.img -smp 4 -debugcon stdio
 
-fat32-test: limine-install test.img
+fat32-test: test.img
 	$(MAKE) -C test
 	rm -rf test_image/
 	mkdir test_image
@@ -79,4 +78,4 @@ fat32-test: limine-install test.img
 	sudo losetup -d `cat loopback_dev`
 	rm -rf test_image loopback_dev
 	./limine-install limine.bin test.img
-	qemu-system-x86_64 -hda test.img -debugcon stdio
+	qemu-system-x86_64 -hda test.img -smp 4 -debugcon stdio
diff --git a/limine.bin b/limine.bin
index 35db061c..af965851 100644
Binary files a/limine.bin and b/limine.bin differ
diff --git a/stage2/mm/mtrr.c b/stage2/mm/mtrr.c
index 5f90c4e3..dfc333ba 100644
--- a/stage2/mm/mtrr.c
+++ b/stage2/mm/mtrr.c
@@ -30,13 +30,25 @@ static bool is_block_in_mtrr_range(struct mtrr *mtrr, uint64_t block_base, uint6
 bool mtrr_set_range(uint64_t base, uint64_t size, uint8_t memory_type) {
     uint32_t eax, ebx, ecx, edx;
 
-    cpuid(0x80000008, 0, &eax, &ebx, &ecx, &edx);
+    if (cpuid(0x80000008, 0, &eax, &ebx, &ecx, &edx))
+        return false;
+
     uint8_t maxphysaddr = eax & 0xff;
     print("mtrr: Max phys addr: %u\n", maxphysaddr);
 
     base = ALIGN_DOWN(base, 0x1000);
+
+    // Size must be aligned on a power of 2 (this is a slow method but this is
+    // not time sensitive)
+    for (uint64_t aligned_size = 1; ; aligned_size *= 2) {
+        if (aligned_size >= size) {
+            size = aligned_size;
+            break;
+        }
+    }
+
     size = ALIGN_UP(size, 0x1000);
-    uint64_t mask = (((uint64_t)1 << maxphysaddr) - 1) & ~((uint64_t)size - 1);
+    uint64_t mask = (((uint64_t)1 << maxphysaddr) - 1) & ~(size - 1);
 
     print("mtrr: Base: %X Mask: %X\n", base, mask);
 
tab: 248 wrap: offon