Read max_cpus variable from QEMU_CFG. If not provided, use value of smp_cpus. Signed-off-by: Jes Sorensen diff --git a/bios/rombios.h b/bios/rombios.h index 8ece2ee..dbf3bd3 100644 --- a/bios/rombios.h +++ b/bios/rombios.h @@ -65,6 +65,7 @@ #define QEMU_CFG_UUID 0x02 #define QEMU_CFG_NUMA 0x0d #define QEMU_CFG_BOOT_MENU 0x0e +#define QEMU_CFG_MAX_CPUS 0x0f #define QEMU_CFG_ARCH_LOCAL 0x8000 #define QEMU_CFG_ACPI_TABLES (QEMU_CFG_ARCH_LOCAL + 0) #define QEMU_CFG_SMBIOS_ENTRIES (QEMU_CFG_ARCH_LOCAL + 1) diff --git a/bios/rombios32.c b/bios/rombios32.c index 69e82b1..610fc1f 100644 --- a/bios/rombios32.c +++ b/bios/rombios32.c @@ -436,6 +436,7 @@ void delay_ms(int n) } uint16_t smp_cpus; +uint16_t max_cpus; uint32_t cpuid_signature; uint32_t cpuid_features; uint32_t cpuid_ext_features; @@ -526,6 +527,19 @@ static uint16_t smbios_entries(void) return cnt; } +static uint16_t get_max_cpus(void) +{ + uint16_t cnt; + + qemu_cfg_select(QEMU_CFG_MAX_CPUS); + qemu_cfg_read((uint8_t*)&cnt, sizeof(cnt)); + + if (!cnt) + cnt = smp_cpus; + + return cnt; +} + uint64_t qemu_cfg_get64 (void) { uint64_t ret; @@ -2689,6 +2703,12 @@ void rombios32_init(uint32_t *s3_resume_vector, uint8_t *shutdown_flag) smp_probe(); +#ifdef BX_QEMU + max_cpus = get_max_cpus(); +#else + max_cpus = smp_cpus; +#endif + find_bios_table_area(); if (*shutdown_flag == 0xfe) {