Add support for more than 4Gig of ram.
This is based on code in kvm.
diff --git a/src/post.c b/src/post.c
index ce30b9b..138e09c 100644
--- a/src/post.c
+++ b/src/post.c
@@ -124,17 +124,24 @@
coreboot_fill_map();
} else {
// On emulators, get memory size from nvram.
- u32 rs = (inb_cmos(CMOS_MEM_EXTMEM2_LOW)
- | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 8)) * 65536;
+ u32 rs = ((inb_cmos(CMOS_MEM_EXTMEM2_LOW) << 16)
+ | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 24));
if (rs)
rs += 16 * 1024 * 1024;
else
- rs = ((inb_cmos(CMOS_MEM_EXTMEM_LOW)
- | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 8)) * 1024
+ rs = (((inb_cmos(CMOS_MEM_EXTMEM_LOW) << 10)
+ | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 18))
+ 1 * 1024 * 1024);
SET_EBDA(ram_size, rs);
add_e820(0, rs, E820_RAM);
+ // Check for memory over 4Gig
+ u64 high = ((inb_cmos(CMOS_MEM_HIGHMEM_LOW) << 16)
+ | (inb_cmos(CMOS_MEM_HIGHMEM_MID) << 24)
+ | ((u64)inb_cmos(CMOS_MEM_HIGHMEM_HIGH) << 32));
+ SET_EBDA(ram_size_over4G, high);
+ add_e820(0x100000000ull, high, E820_RAM);
+
/* reserve 256KB BIOS area at the end of 4 GB */
add_e820(0xfffc0000, 256*1024, E820_RESERVED);
}