]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
add helpers to read etc/boot-cpus at resume time
authorIgor Mammedov <imammedo@redhat.com>
Thu, 13 Oct 2016 12:38:27 +0000 (14:38 +0200)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 25 Oct 2016 13:58:17 +0000 (09:58 -0400)
Signed-off-by: Igor Mammedov <imammedo@redhat.com>
src/fw/paravirt.c
src/fw/paravirt.h
src/fw/smp.c

index 33a471bdecc17a707bf3483627b61c2d94638145..125066ddc6329c875fb050ecfbc29b4947afed05 100644 (file)
@@ -319,6 +319,44 @@ qemu_romfile_add(char *name, int select, int skip, int size)
     romfile_add(&qfile->file);
 }
 
+static int
+qemu_romfile_get_fwcfg_entry(char *name, int *select)
+{
+    struct romfile_s *file = romfile_find(name);
+    if (!file)
+        return 0;
+    struct qemu_romfile_s *qfile;
+    qfile = container_of(file, struct qemu_romfile_s, file);
+    if (select)
+        *select = qfile->select;
+    return file->size;
+}
+
+static int boot_cpus_sel;
+static int boot_cpus_file_sz;
+
+u16
+qemu_init_present_cpus_count(void)
+{
+    u16 smp_count = romfile_loadint("etc/boot-cpus",
+                                    rtc_read(CMOS_BIOS_SMP_COUNT) + 1);
+    boot_cpus_file_sz =
+        qemu_romfile_get_fwcfg_entry("etc/boot-cpus", &boot_cpus_sel);
+    return smp_count;
+}
+
+u16
+qemu_get_present_cpus_count(void)
+{
+    u16 smp_count;
+    if (!boot_cpus_file_sz) {
+        smp_count = rtc_read(CMOS_BIOS_SMP_COUNT) + 1;
+    } else {
+        qemu_cfg_read_entry(&smp_count, boot_cpus_sel, boot_cpus_file_sz);
+    }
+    return smp_count;
+}
+
 struct e820_reservation {
     u64 address;
     u64 length;
index ed8e5f1f8abbc8cd412362bc1770b4f41679fbec..6f26fd089f7ebcd07d0bd264a66a0dfe1aa097aa 100644 (file)
@@ -52,4 +52,7 @@ void qemu_preinit(void);
 void qemu_platform_setup(void);
 void qemu_cfg_init(void);
 
+u16 qemu_init_present_cpus_count(void);
+u16 qemu_get_present_cpus_count(void);
+
 #endif
index 31bcc6a07792e2b88e7943040c262937f62501fb..9c404b9aff8e8b15386414bb206ae3f40a4b4ee8 100644 (file)
@@ -12,6 +12,7 @@
 #include "stacks.h" // yield
 #include "util.h" // smp_setup, msr_feature_control_setup
 #include "x86.h" // wrmsr
+#include "paravirt.h" // qemu_*_present_cpus_count
 
 #define APIC_ICR_LOW ((u8*)BUILD_APIC_ADDR + 0x300)
 #define APIC_SVR     ((u8*)BUILD_APIC_ADDR + 0x0F0)
@@ -131,8 +132,8 @@ smp_scan(void)
     writel(APIC_ICR_LOW, 0x000C4600 | sipi_vector);
 
     // Wait for other CPUs to process the SIPI.
-    u8 cmos_smp_count = rtc_read(CMOS_BIOS_SMP_COUNT) + 1;
-    while (cmos_smp_count != CountCPUs)
+    u16 expected_cpus_count = qemu_get_present_cpus_count();
+    while (expected_cpus_count != CountCPUs)
         asm volatile(
             // Release lock and allow other processors to use the stack.
             "  movl %%esp, %1\n"
@@ -159,9 +160,9 @@ smp_setup(void)
         return;
 
     MaxCountCPUs = romfile_loadint("etc/max-cpus", 0);
-    u8 cmos_smp_count = rtc_read(CMOS_BIOS_SMP_COUNT) + 1;
-    if (MaxCountCPUs < cmos_smp_count)
-        MaxCountCPUs = cmos_smp_count;
+    u16 smp_count = qemu_init_present_cpus_count();
+    if (MaxCountCPUs < smp_count)
+        MaxCountCPUs = smp_count;
 
     smp_scan();
 }