From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MvvP6-0004w7-2G for qemu-devel@nongnu.org; Thu, 08 Oct 2009 11:59:44 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MvvOw-0004hY-Nj for qemu-devel@nongnu.org; Thu, 08 Oct 2009 11:59:39 -0400 Received: from [199.232.76.173] (port=39097 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MvvOv-0004gI-Nl for qemu-devel@nongnu.org; Thu, 08 Oct 2009 11:59:33 -0400 Received: from mx1.redhat.com ([209.132.183.28]:1026) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MvvOv-0002Ku-75 for qemu-devel@nongnu.org; Thu, 08 Oct 2009 11:59:33 -0400 From: Gleb Natapov Date: Thu, 8 Oct 2009 17:59:24 +0200 Message-Id: <1255017566-26220-20-git-send-email-gleb@redhat.com> In-Reply-To: <1255017566-26220-1-git-send-email-gleb@redhat.com> References: <1255017566-26220-1-git-send-email-gleb@redhat.com> Subject: [Qemu-devel] [PATCH 19/21] Read max number of cpus from VM. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: kevin@koconnor.net Cc: qemu-devel@nongnu.org Signed-off-by: Gleb Natapov --- src/paravirt.c | 12 ++++++++++++ src/paravirt.h | 1 + src/smp.c | 9 ++++++++- src/util.h | 1 + 4 files changed, 22 insertions(+), 1 deletions(-) diff --git a/src/paravirt.c b/src/paravirt.c index 8fbeb9c..da5923b 100644 --- a/src/paravirt.c +++ b/src/paravirt.c @@ -281,3 +281,15 @@ void qemu_cfg_get_numa_data(u64 *data, int n) for (i = 0; i < n; i++) qemu_cfg_read((u8*)(data + i), sizeof(u64)); } + +u16 qemu_cfg_get_max_cpus(void) +{ + u16 cnt; + + if (!qemu_cfg_present) + return 0; + + qemu_cfg_read_entry(&cnt, QEMU_CFG_MAX_CPUS, sizeof(cnt)); + + return cnt; +} diff --git a/src/paravirt.h b/src/paravirt.h index 04a6907..a3f9be4 100644 --- a/src/paravirt.h +++ b/src/paravirt.h @@ -51,5 +51,6 @@ int qemu_cfg_smbios_load_external(int type, char **p, unsigned *nr_structs, unsigned *max_struct_size, char *end); int qemu_cfg_get_numa_nodes(void); void qemu_cfg_get_numa_data(u64 *data, int n); +u16 qemu_cfg_get_max_cpus(void); #endif diff --git a/src/smp.c b/src/smp.c index 44a7929..6879472 100644 --- a/src/smp.c +++ b/src/smp.c @@ -9,6 +9,7 @@ #include "config.h" // CONFIG_* #include "cmos.h" // CMOS_BIOS_SMP_COUNT #include "farptr.h" // ASSERT32 +#include "paravirt.h" #define APIC_ICR_LOW ((u8*)BUILD_APIC_ADDR + 0x300) #define APIC_SVR ((u8*)BUILD_APIC_ADDR + 0x0F0) @@ -61,6 +62,7 @@ wrmsr_smp(u32 index, u64 val) } u32 CountCPUs VAR16VISIBLE; +u32 MaxCountCPUs VAR16VISIBLE; extern void smp_ap_boot_code(); ASM16( " .global smp_ap_boot_code\n" @@ -134,7 +136,12 @@ smp_probe(void) // Restore memory. *(u64*)BUILD_AP_BOOT_ADDR = old; - dprintf(1, "Found %d cpu(s)\n", readl(&CountCPUs)); + MaxCountCPUs = qemu_cfg_get_max_cpus(); + if (!MaxCountCPUs || MaxCountCPUs < CountCPUs) + MaxCountCPUs = CountCPUs; + + dprintf(1, "Found %d cpu(s) max supported %d cpu(s)\n", readl(&CountCPUs), + MaxCountCPUs); } // Reset variables to zero diff --git a/src/util.h b/src/util.h index ca16ac7..401e6ea 100644 --- a/src/util.h +++ b/src/util.h @@ -221,6 +221,7 @@ void smm_init(); // smp.c extern u32 CountCPUs; +extern u32 MaxCountCPUs; void wrmsr_smp(u32 index, u64 val); void smp_probe(void); void smp_probe_setup(void); -- 1.6.3.3