]> xenbits.xensource.com Git - seabios.git/commitdiff
config: Add function to check if fw_cfg exists
authorPetr Berky <petr.berky@email.cz>
Tue, 28 Mar 2017 21:03:53 +0000 (23:03 +0200)
committerKevin O'Connor <kevin@koconnor.net>
Thu, 30 Mar 2017 01:13:21 +0000 (21:13 -0400)
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@email.cz>
src/fw/paravirt.c
src/fw/paravirt.h

index 707502da907cb526f18ae9ef2d4669d59e2def83..5b23d786bea9d9bb1ef9707b9f705ef32efc530c 100644 (file)
@@ -32,9 +32,16 @@ u32 RamSize;
 u64 RamSizeOver4G;
 // Type of emulator platform.
 int PlatformRunningOn VARFSEG;
+// cfg enabled
+int cfg_enabled = 0;
 // cfg_dma enabled
 int cfg_dma_enabled = 0;
 
+inline int qemu_cfg_enabled(void)
+{
+    return cfg_enabled;
+}
+
 inline int qemu_cfg_dma_enabled(void)
 {
     return cfg_dma_enabled;
@@ -392,7 +399,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_enabled()) {
+        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;
@@ -571,6 +580,7 @@ void qemu_cfg_init(void)
             return;
 
     dprintf(1, "Found QEMU fw_cfg\n");
+    cfg_enabled = 1;
 
     // Detect DMA interface.
     u32 id;
index 16f3d9a68ad2319889be6b443b2680b898ebb241..a14d83e101a3df89480302c1c96935fc35717a1f 100644 (file)
@@ -49,6 +49,7 @@ static inline int runningOnKVM(void) {
 // QEMU_CFG_DMA ID bit
 #define QEMU_CFG_VERSION_DMA    2
 
+int qemu_cfg_enabled(void);
 int qemu_cfg_dma_enabled(void);
 void qemu_preinit(void);
 void qemu_platform_setup(void);