Index: src/system/boot/platform/bios_ia32/video.cpp
===================================================================
--- src/system/boot/platform/bios_ia32/video.cpp	(revision 33034)
+++ src/system/boot/platform/bios_ia32/video.cpp	(working copy)
@@ -833,7 +833,7 @@
 	if (lastBase != 0
 		&& (lastBase != gKernelArgs.frame_buffer.physical_buffer.start
 			|| lastSize < gKernelArgs.frame_buffer.physical_buffer.size)) {
-		mmu_free((void *)sFrameBuffer, lastSize);
+		mmu_free((void *)lastBase, lastSize);
 		lastBase = 0;
 	}
 	if (lastBase == 0) {
Index: src/system/boot/platform/bios_ia32/cpu.h
===================================================================
--- src/system/boot/platform/bios_ia32/cpu.h	(revision 33034)
+++ src/system/boot/platform/bios_ia32/cpu.h	(working copy)
@@ -13,6 +13,7 @@
 extern "C" {
 #endif
 
+extern void mtrr_dump(void);
 extern void cpu_init(void);
 
 #ifdef __cplusplus
Index: src/system/boot/platform/bios_ia32/console.cpp
===================================================================
--- src/system/boot/platform/bios_ia32/console.cpp	(revision 33034)
+++ src/system/boot/platform/bios_ia32/console.cpp	(working copy)
@@ -71,9 +71,10 @@
 		return bufferSize;
 
 	for (uint32 i = 0; i < bufferSize; i++) {
-		if (string[0] == '\n')
+		if (string[0] == '\n') {
 			sScreenOffset += sScreenWidth - (sScreenOffset % sScreenWidth);
-		else
+			spin(1 * 1000 * 1000);
+		} else
 			sScreenBase[sScreenOffset++] = sColor | string[0];
 
 		if (sScreenOffset >= sScreenWidth * sScreenHeight)
Index: src/system/boot/platform/bios_ia32/cpu.cpp
===================================================================
--- src/system/boot/platform/bios_ia32/cpu.cpp	(revision 33034)
+++ src/system/boot/platform/bios_ia32/cpu.cpp	(working copy)
@@ -251,7 +251,89 @@
 }
 
 
+static uint64
+read_msr(uint32 msr)
+{
+	uint32 low, high;
+	asm volatile ("rdmsr" : "=a"(low), "=d"(high) : "c"(msr));
+	return ((uint64)high << 32) | low;
+}
+
+
+static void
+write_msr(uint32 msr, uint64 value)
+{
+	uint32 low = (uint32)value;
+	uint32 high = (uint32)(value >> 32);
+	asm volatile ("wrmsr" : : "a"(low), "d"(high), "c"(msr));
+}
+
+
+static const char *
+mtrr_type_to_string(uint8 type)
+{
+	switch (type) {
+		case 0:
+			return "uncacheable";
+		case 1:
+			return "write combining";
+		case 4:
+			return "write-through";
+		case 5:
+			return "write-protected";
+		case 6:
+			return "write-back";
+		default:
+			return "reserved";
+	}
+}
+
+
+static bool
+get_mtrr(uint32 index, uint64 *_base, uint64 *_length, uint8 *_type)
+{
+	uint64 mask = read_msr(0x201 + index * 2);
+	if ((mask & (1 << 11)) == 0)
+		return false;
+
+	uint64 base = read_msr(0x200 + index * 2);
+
+	*_base = base & ~(B_PAGE_SIZE - 1);
+	*_length = (~mask & ((1ULL << 36) - 1)) + B_PAGE_SIZE;
+	*_type = base & 0xff;
+
+	return true;
+}
+
+
 extern "C" void
+mtrr_dump()
+{
+	uint32 count = (read_msr(0xfe) & 0xff);
+	dprintf("mtrr: %lu variable ranges\n", count);
+
+	uint64 defaultType = read_msr(0x2ff);
+	dprintf("mtrr: default type: 0x%llx (%s, variable %sabled, fixed %sabled)\n",
+		defaultType, mtrr_type_to_string(defaultType),
+		(defaultType & (1 << 11)) != 0 ? "en" : "dis",
+		(defaultType & (1 << 10)) != 0 ? "en" : "dis");
+
+	for (uint32 i = 0; i < count; i++) {
+		uint64 base, length;
+		uint8 type;
+		if (get_mtrr(i, &base, &length, &type)) {
+			dprintf("mtrr: entry %lu: base: 0x%llx; length: 0x%llx; type: %u %s\n",
+				i, base, length, type, mtrr_type_to_string(type));
+		} else
+			dprintf("mtrr: entry %lu: empty\n", i);
+	}
+
+	// set default to uncachable
+	write_msr(0x2ff, read_msr(0x2ff) & ~0xff);
+}
+
+
+extern "C" void
 cpu_init()
 {
 	if (check_cpu_features() != B_OK)
Index: src/system/boot/platform/bios_ia32/start.c
===================================================================
--- src/system/boot/platform/bios_ia32/start.c	(revision 33034)
+++ src/system/boot/platform/bios_ia32/start.c	(working copy)
@@ -138,6 +138,7 @@
 	//if (sBootOptions & BOOT_OPTION_DEBUG_OUTPUT)
 		serial_enable();
 
+	mtrr_dump();
 	apm_init();
 	acpi_init();
 	smp_init();
