Initial support for coreboot.

Add new option for targetting a coreboot payload.
When in coreboot mode, configure out those parts of the code that wont
    work on real hardware.
Don't include cmos.h in files that don't need it.
diff --git a/src/apm.c b/src/apm.c
index 1d8ceef..f7646c9 100644
--- a/src/apm.c
+++ b/src/apm.c
@@ -14,6 +14,11 @@
 static void
 out_str(const char *str_cs)
 {
+    if (CONFIG_COREBOOT) {
+        BX_INFO("APM request '%s'\n", str_cs);
+        return;
+    }
+
     u8 *s = (u8*)str_cs;
     for (;;) {
         u8 c = GET_VAR(CS, *s);
diff --git a/src/ata.c b/src/ata.c
index 438f1e7..e319cf1 100644
--- a/src/ata.c
+++ b/src/ata.c
@@ -645,11 +645,25 @@
 static u8
 get_translation(int driveid)
 {
-    u8 channel = driveid / 2;
-    u8 translation = inb_cmos(CMOS_BIOS_DISKTRANSFLAG + channel/2);
-    translation >>= 2 * (driveid % 4);
-    translation &= 0x03;
-    return translation;
+    if (! CONFIG_COREBOOT) {
+        // Emulators pass in the translation info via nvram.
+        u8 channel = driveid / 2;
+        u8 translation = inb_cmos(CMOS_BIOS_DISKTRANSFLAG + channel/2);
+        translation >>= 2 * (driveid % 4);
+        translation &= 0x03;
+        return translation;
+    }
+
+    // On COREBOOT, use a heuristic to determine translation type.
+    u16 heads = GET_EBDA(ata.devices[driveid].pchs.heads);
+    u16 cylinders = GET_EBDA(ata.devices[driveid].pchs.cylinders);
+    u16 spt = GET_EBDA(ata.devices[driveid].pchs.spt);
+
+    if (cylinders <= 1024 && heads <= 16 && spt <= 63)
+        return ATA_TRANSLATION_NONE;
+    if (cylinders * heads <= 131072)
+        return ATA_TRANSLATION_LARGE;
+    return ATA_TRANSLATION_LBA;
 }
 
 static void
diff --git a/src/config.h b/src/config.h
index c7ec67e..4ae23dc 100644
--- a/src/config.h
+++ b/src/config.h
@@ -13,6 +13,9 @@
 #define CONFIG_APPNAME "Bochs"
 #endif
 
+// Configure as a payload coreboot payload.
+#define CONFIG_COREBOOT 0
+
 #define CONFIG_DEBUG_SERIAL 0
 
 #define CONFIG_FLOPPY_SUPPORT 1
diff --git a/src/disk.c b/src/disk.c
index 152b811..00eec81 100644
--- a/src/disk.c
+++ b/src/disk.c
@@ -8,7 +8,6 @@
 #include "disk.h" // floppy_13
 #include "biosvar.h" // struct bregs
 #include "config.h" // CONFIG_*
-#include "cmos.h" // inb_cmos
 #include "util.h" // debug_enter
 #include "ata.h" // ATA_*
 
diff --git a/src/post.c b/src/post.c
index 1464572..a6f7c3d 100644
--- a/src/post.c
+++ b/src/post.c
@@ -80,14 +80,21 @@
 static void
 ram_probe(void)
 {
-    u32 rs = (inb_cmos(CMOS_MEM_EXTMEM2_LOW)
+    u32 rs;
+    if (CONFIG_COREBOOT) {
+        // XXX - just hardcode for now.
+        rs = 128*1024*1024;
+    } else {
+        // On emulators, get memory size from nvram.
+        rs = (inb_cmos(CMOS_MEM_EXTMEM2_LOW)
               | (inb_cmos(CMOS_MEM_EXTMEM2_HIGH) << 8)) * 65536;
-    if (rs)
-        rs += 16 * 1024 * 1024;
-    else
-        rs = ((inb_cmos(CMOS_MEM_EXTMEM_LOW)
-               | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 8)) * 1024
-              + 1 * 1024 * 1024);
+        if (rs)
+            rs += 16 * 1024 * 1024;
+        else
+            rs = ((inb_cmos(CMOS_MEM_EXTMEM_LOW)
+                   | (inb_cmos(CMOS_MEM_EXTMEM_HIGH) << 8)) * 1024
+                  + 1 * 1024 * 1024);
+    }
 
     SET_EBDA(ram_size, rs);
     BX_INFO("ram_size=0x%08x\n", rs);
@@ -131,10 +138,17 @@
 
     ebda->ipl.count = ip - ebda->ipl.table;
     ebda->ipl.sequence = 0xffff;
-    ebda->ipl.bootorder = (inb_cmos(CMOS_BIOS_BOOTFLAG2)
-                           | ((inb_cmos(CMOS_BIOS_BOOTFLAG1) & 0xf0) << 4));
-    if (!(inb_cmos(CMOS_BIOS_BOOTFLAG1) & 1))
+    if (CONFIG_COREBOOT) {
+        // XXX - hardcode defaults for coreboot.
+        ebda->ipl.bootorder = 0x00000231;
         ebda->ipl.checkfloppysig = 1;
+    } else {
+        // On emulators, get boot order from nvram.
+        ebda->ipl.bootorder = (inb_cmos(CMOS_BIOS_BOOTFLAG2)
+                               | ((inb_cmos(CMOS_BIOS_BOOTFLAG1) & 0xf0) << 4));
+        if (!(inb_cmos(CMOS_BIOS_BOOTFLAG1) & 1))
+            ebda->ipl.checkfloppysig = 1;
+    }
 }
 
 static void
diff --git a/src/rombios32.c b/src/rombios32.c
index 4db3465..fde32a9 100644
--- a/src/rombios32.c
+++ b/src/rombios32.c
@@ -18,7 +18,6 @@
 //  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
 
 #include "util.h" // BX_INFO
-#include "cmos.h" // inb_cmos
 #include "pci.h" // PCIDevice
 #include "types.h" // u32
 #include "config.h" // CONFIG_*
@@ -1668,6 +1667,10 @@
 
 void rombios32_init(void)
 {
+    if (CONFIG_COREBOOT)
+        // XXX - not supported on coreboot yet.
+        return;
+
     BX_INFO("Starting rombios32\n");
 
 #if (CONFIG_USE_EBDA_TABLES == 1)
diff --git a/src/system.c b/src/system.c
index 68fbf54..72c0735 100644
--- a/src/system.c
+++ b/src/system.c
@@ -8,7 +8,6 @@
 #include "util.h" // irq_restore
 #include "biosvar.h" // BIOS_CONFIG_TABLE
 #include "ioport.h" // inb
-#include "cmos.h" // inb_cmos
 
 #define E820_RAM          1
 #define E820_RESERVED     2