[SeaBIOS] [PATCH 8/8] Convert some QEMU cmos config variables to the romfile interface.

Kevin O'Connor kevin at koconnor.net
Sun Feb 10 05:48:35 CET 2013


Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/ata.c      |  1 -
 src/clock.c    |  5 ++---
 src/cmos.h     | 12 ++++--------
 src/floppy.c   | 21 ++++++---------------
 src/paravirt.c | 31 +++++++++++++++++++++++++++++++
 5 files changed, 43 insertions(+), 27 deletions(-)

diff --git a/src/ata.c b/src/ata.c
index 59ae765..9909fb8 100644
--- a/src/ata.c
+++ b/src/ata.c
@@ -9,7 +9,6 @@
 #include "ioport.h" // inb
 #include "util.h" // dprintf
 #include "byteorder.h" // be16_to_cpu
-#include "cmos.h" // inb_cmos
 #include "pic.h" // enable_hwirq
 #include "biosvar.h" // GET_GLOBAL
 #include "pci.h" // foreachpci
diff --git a/src/clock.c b/src/clock.c
index bbcafd7..c84882d 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -300,9 +300,8 @@ timer_setup(void)
     SET_BDA(timer_counter, ticks);
 
     // Setup Century storage
-    if (CONFIG_QEMU) {
-        Century = inb_cmos(CMOS_CENTURY);
-    } else {
+    Century = romfile_loadint("etc/century", 0);
+    if (!Century) {
         // Infer current century from the year.
         u8 year = inb_cmos(CMOS_RTC_YEAR);
         if (year > 0x80)
diff --git a/src/cmos.h b/src/cmos.h
index e4b6462..df1d465 100644
--- a/src/cmos.h
+++ b/src/cmos.h
@@ -6,6 +6,7 @@
 #ifndef __CMOS_H
 #define __CMOS_H
 
+// Standard BIOS RTC chip entries
 #define CMOS_RTC_SECONDS         0x00
 #define CMOS_RTC_SECONDS_ALARM   0x01
 #define CMOS_RTC_MINUTES         0x02
@@ -21,6 +22,9 @@
 #define CMOS_STATUS_C            0x0c
 #define CMOS_STATUS_D            0x0d
 #define CMOS_RESET_CODE          0x0f
+
+// QEMU cmos config fields.  DO NOT ADD MORE.  (All new content should
+// be passed via the fw_cfg "file" interface.)
 #define CMOS_FLOPPY_DRIVE_TYPE   0x10
 #define CMOS_DISK_DATA           0x12
 #define CMOS_EQUIPMENT_INFO      0x14
@@ -41,14 +45,6 @@
 #define CMOS_MEM_HIGHMEM_HIGH    0x5d
 #define CMOS_BIOS_SMP_COUNT      0x5f
 
-// CMOS_FLOPPY_DRIVE_TYPE bitdefs
-#define CFD_NO_DRIVE 0
-#define CFD_360KB    1
-#define CFD_12MB     2
-#define CFD_720KB    3
-#define CFD_144MB    4
-#define CFD_288MB    5
-
 #ifndef __ASSEMBLY__
 
 #include "ioport.h" // inb, outb
diff --git a/src/floppy.c b/src/floppy.c
index 2887e78..00b57c1 100644
--- a/src/floppy.c
+++ b/src/floppy.c
@@ -10,7 +10,6 @@
 #include "config.h" // CONFIG_FLOPPY
 #include "biosvar.h" // SET_BDA
 #include "util.h" // dprintf
-#include "cmos.h" // inb_cmos
 #include "pic.h" // eoi_pic1
 #include "bregs.h" // struct bregs
 #include "boot.h" // boot_add_floppy
@@ -125,20 +124,12 @@ floppy_setup(void)
         return;
     dprintf(3, "init floppy drives\n");
 
-    if (CONFIG_QEMU) {
-        u8 type = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE);
-        if (type & 0xf0)
-            addFloppy(0, type >> 4);
-        if (type & 0x0f)
-            addFloppy(1, type & 0x0f);
-    } else {
-        u8 type = romfile_loadint("etc/floppy0", 0);
-        if (type)
-            addFloppy(0, type);
-        type = romfile_loadint("etc/floppy1", 0);
-        if (type)
-            addFloppy(1, type);
-    }
+    u8 type = romfile_loadint("etc/floppy0", 0);
+    if (type)
+        addFloppy(0, type);
+    type = romfile_loadint("etc/floppy1", 0);
+    if (type)
+        addFloppy(1, type);
 
     outb(0x02, PORT_DMA1_MASK_REG);
 
diff --git a/src/paravirt.c b/src/paravirt.c
index aa4a421..0cf5149 100644
--- a/src/paravirt.c
+++ b/src/paravirt.c
@@ -132,6 +132,31 @@ qemu_cfg_read_entry(void *buf, int e, int len)
 }
 
 static int
+qemu_value_read_file(struct romfile_s *file, void *dst, u32 maxlen)
+{
+    if (file->size > maxlen)
+        return -1;
+    memcpy(dst, &file->rawsize, file->size);
+    return file->size;
+}
+
+static void
+qemu_value_add(char *name, int value)
+{
+    struct romfile_s *file = malloc_tmp(sizeof(*file));
+    if (!file) {
+        warn_noalloc();
+        return;
+    }
+    memset(file, 0, sizeof(*file));
+    strtcpy(file->name, name, sizeof(file->name));
+    file->rawsize = value; // Use rawsize to store the value.
+    file->size = 4;
+    file->copy = qemu_value_read_file;
+    romfile_add(file);
+}
+
+static int
 qemu_cfg_read_file(struct romfile_s *file, void *dst, u32 maxlen)
 {
     if (file->size > maxlen)
@@ -180,6 +205,12 @@ struct qemu_smbios_header {
 static void
 qemu_cfg_legacy(void)
 {
+    // Misc cmos items.
+    qemu_value_add("etc/century", inb_cmos(CMOS_CENTURY));
+    u8 floppy = inb_cmos(CMOS_FLOPPY_DRIVE_TYPE);
+    qemu_value_add("etc/floppy0", floppy >> 4);
+    qemu_value_add("etc/floppy1", floppy & 0x0f);
+
     // Misc config items.
     qemu_romfile_add("etc/show-boot-menu", QEMU_CFG_BOOT_MENU, 0, 2);
     qemu_romfile_add("etc/irq0-override", QEMU_CFG_IRQ0_OVERRIDE, 0, 1);
-- 
1.7.11.7




More information about the SeaBIOS mailing list