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);
     }