From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39074) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uv572-00035Z-Dg for qemu-devel@nongnu.org; Fri, 05 Jul 2013 08:27:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Uv570-0000S8-W6 for qemu-devel@nongnu.org; Fri, 05 Jul 2013 08:27:44 -0400 Received: from e28smtp05.in.ibm.com ([122.248.162.5]:36157) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Uv570-0000RJ-A9 for qemu-devel@nongnu.org; Fri, 05 Jul 2013 08:27:42 -0400 Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 5 Jul 2013 17:52:20 +0530 Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 8E13F1258052 for ; Fri, 5 Jul 2013 17:56:46 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r65CS3RM27984106 for ; Fri, 5 Jul 2013 17:58:04 +0530 Received: from d28av02.in.ibm.com (loopback [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r65CRYds026330 for ; Fri, 5 Jul 2013 22:27:34 +1000 Date: Fri, 5 Jul 2013 17:52:04 +0530 From: Prerna Saxena Message-ID: <20130705175212.6f8d9294@zephyr> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] Target-ppc : Enhance the CPU node labels for guest device tree for pseries. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: QEMU Cc: Alexey Kardashevisky [PATCH] Target-ppc : Enhance the CPU node labels for the guest device tree for pseries. In absence of a -CPU parameter in the qemu command line, the nodes of KVM-enabled guest device tree look like this : /proc/device-tree/cpus/HOST@0/... /proc/device-tree/cpus/HOST@4/... This patch replaces this obscure 'HOST' label with a more descriptive label. This is gathered by first identifying the PVR of the host, and then determining the host CPU alias which corresponds to the model indicated by this PVR. Sample Final outcome for an KVM-enabled pseries guest running on POWER7: /proc/device-tree/cpus/PowerPC,POWER7@0/... /proc/device-tree/cpus/PowerPC,POWER7@4/... This also helps userspace tools like ppc64_cpu, which expect the device tree to be in this format in the guest. Signed-off-by: Prerna Saxena --- hw/ppc/spapr.c | 17 ++++++++++++++--- target-ppc/cpu-qom.h | 1 + target-ppc/translate_init.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index fe34291..e084f3f 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -79,6 +79,7 @@ #define HTAB_SIZE(spapr) (1ULL << ((spapr)->htab_shift)) +#define PPC_DEVTREE_STR "PowerPC," sPAPREnvironment *spapr; int spapr_allocate_irq(int hint, bool lsi) @@ -295,9 +296,12 @@ static void *spapr_create_fdt_skel(const char *cpu_model, _FDT((fdt_property_cell(fdt, "#address-cells", 0x1))); _FDT((fdt_property_cell(fdt, "#size-cells", 0x0))); - modelname = g_strdup(cpu_model); + /* device tree nodes must look like this : + * PowerPC,CPU_ALIAS@0 + */ + modelname = g_strdup_printf(PPC_DEVTREE_STR "%s", cpu_model); - for (i = 0; i < strlen(modelname); i++) { + for (i = strlen(PPC_DEVTREE_STR); i < strlen(modelname); i++) { modelname[i] = toupper(modelname[i]); } @@ -735,7 +739,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args) MemoryRegion *sysmem = get_system_memory(); MemoryRegion *ram = g_new(MemoryRegion, 1); hwaddr rma_alloc_size; - uint32_t initrd_base = 0; + uint32_t initrd_base = 0, pvr = 0; long kernel_size = 0, initrd_size = 0; long load_limit, rtas_limit, fw_size; char *filename; @@ -959,6 +963,13 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args) spapr->entry_point = 0x100; + /* Ensure that cpu_model is correctly reflected for a KVM guest */ + if (kvm_enabled() && !strcmp(cpu_model, "host")) { + asm ("mfpvr %0" + : "=r"(pvr)); + cpu_model = ppc_cpu_alias_by_pvr(pvr); + } + /* Prepare the device tree */ spapr->fdt_skel = spapr_create_fdt_skel(cpu_model, initrd_base, initrd_size, diff --git a/target-ppc/cpu-qom.h b/target-ppc/cpu-qom.h index 84ba105..90dd1dd 100644 --- a/target-ppc/cpu-qom.h +++ b/target-ppc/cpu-qom.h @@ -99,6 +99,7 @@ static inline PowerPCCPU *ppc_env_get_cpu(CPUPPCState *env) #define ENV_OFFSET offsetof(PowerPCCPU, env) PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr); +const char *ppc_cpu_alias_by_pvr(uint32_t pvr); void ppc_cpu_do_interrupt(CPUState *cpu); void ppc_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c index 50e0ee5..21a7f6f 100644 --- a/target-ppc/translate_init.c +++ b/target-ppc/translate_init.c @@ -7913,6 +7913,34 @@ PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr) return pcc; } +const char *ppc_cpu_alias_by_pvr(uint32_t pvr) +{ + int i; + const char *cpu_alias; + char *offset, *model; + + cpu_alias = object_class_get_name(OBJECT_CLASS + (ppc_cpu_class_by_pvr(pvr))); + + /* Replace the full class name in cpu_alias with the CPU alias + * Eg, POWER7_V2.3-POWERPC64-CPU can simply be called + * POWER7 + */ + + offset = strstr(cpu_alias, "-" TYPE_POWERPC_CPU); + if (offset) { + model = g_strndup(cpu_alias, offset - cpu_alias); + for (i = 0; ppc_cpu_aliases[i].model != NULL; i++) { + if (strcmp(ppc_cpu_aliases[i].model, model) == 0) { + g_free(model); + return ppc_cpu_aliases[i].alias; + } + } + g_free(model); + } + return NULL; +} + static gint ppc_cpu_compare_class_name(gconstpointer a, gconstpointer b) { ObjectClass *oc = (ObjectClass *)a; -- 1.7.11.7 -- Prerna Saxena Linux Technology Centre, IBM Systems and Technology Lab, Bangalore, India