[SeaBIOS] [PATCH] config: Add function to check if fw_cfg exists

petr.berky at email.cz petr.berky at email.cz
Tue Mar 14 21:33:53 CET 2017


>From 405de6e571a2bf332452a17ae98f7b3a0613365e Mon Sep 17 00:00:00 2001
From: Petr Berky <petr.berky at email.cz>
Date: Tue, 14 Mar 2017 20:30:52 +0100
Subject: [PATCH] config: Add function to check if fw_cfg exists

It was found qemu_get_present_cpus_count may return impossible
number of cpus because of not checking if fw_cfg exists before
using it. That  may lead to undefined behavior of emulator,
in particular Bochs that freezes.

Signed-off-by: Petr Berky <petr.berky at email.cz>
---
 src/fw/paravirt.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c
index 707502d..b2cfc23 100644
--- a/src/fw/paravirt.c
+++ b/src/fw/paravirt.c
@@ -220,6 +220,21 @@ qemu_cfg_select(u16 f)
     outw(f, PORT_QEMU_CFG_CTL);
 }
 
+static int
+qemu_cfg_check_signature(void)
+{
+    int i;
+    char *sig = "QEMU";
+
+    qemu_cfg_select(QEMU_CFG_SIGNATURE);
+    for (i = 0; i < 4; i++) {
+        if (inb(PORT_QEMU_CFG_DATA) != sig[i]) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
 static void
 qemu_cfg_dma_transfer(void *address, u32 length, u32 control)
 {
@@ -392,7 +407,9 @@ u16
 qemu_get_present_cpus_count(void)
 {
     u16 smp_count = 0;
-    qemu_cfg_read_entry(&smp_count, QEMU_CFG_NB_CPUS, sizeof(smp_count));
+    if (qemu_cfg_check_signature() == 0) {
+        qemu_cfg_read_entry(&smp_count, QEMU_CFG_NB_CPUS, sizeof(smp_count));
+    }
     u16 cmos_cpu_count = rtc_read(CMOS_BIOS_SMP_COUNT) + 1;
     if (smp_count < cmos_cpu_count) {
         smp_count = cmos_cpu_count;
@@ -563,12 +580,9 @@ void qemu_cfg_init(void)
         return;
 
     // Detect fw_cfg interface.
-    qemu_cfg_select(QEMU_CFG_SIGNATURE);
-    char *sig = "QEMU";
-    int i;
-    for (i = 0; i < 4; i++)
-        if (inb(PORT_QEMU_CFG_DATA) != sig[i])
-            return;
+    if (qemu_cfg_check_signature() != 0) {
+        return;
+    }
 
     dprintf(1, "Found QEMU fw_cfg\n");
 
-- 
2.11.0




More information about the SeaBIOS mailing list