[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 18/19] target-ppc: Enhance the CPU node labels for the
From: |
Alexey Kardashevskiy |
Subject: |
[Qemu-ppc] [PATCH 18/19] target-ppc: Enhance the CPU node labels for the guest device tree for pseries. |
Date: |
Sat, 6 Jul 2013 23:54:15 +1000 |
From: Prerna Saxena <address@hidden>
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/address@hidden/...
/proc/device-tree/cpus/address@hidden/...
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,address@hidden/...
/proc/device-tree/cpus/PowerPC,address@hidden/...
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 <address@hidden>
Signed-off-by: Alexey Kardashevskiy <address@hidden>
---
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 26dd3f7..5ecd81b 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -80,6 +80,7 @@
#define HTAB_SIZE(spapr) (1ULL << ((spapr)->htab_shift))
+#define PPC_DEVTREE_STR "PowerPC,"
sPAPREnvironment *spapr;
int spapr_allocate_irq(int hint, bool lsi)
@@ -296,9 +297,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,address@hidden
+ */
+ 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]);
}
@@ -1112,7 +1116,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;
@@ -1342,6 +1346,13 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
register_savevm_live(NULL, "spapr/htab", -1, 1,
&savevm_htab_handlers, spapr);
+ /* 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 a14a3d9..2ad45c2 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 c4b466b..2b013c2 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -7947,6 +7947,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.8.3.2
- [Qemu-ppc] [PATCH 10/19] pseries: rework PAPR virtual SCSI, (continued)
- [Qemu-ppc] [PATCH 10/19] pseries: rework PAPR virtual SCSI, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 11/19] pseries: savevm support for PAPR virtual SCSI, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 12/19] pseries: savevm support for pseries machine, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 13/19] pseries: savevm support for PCI host bridge, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 14/19] target-ppc: Add helper for KVM_PPC_RTAS_DEFINE_TOKEN, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 15/19] pseries: Support for in-kernel XICS interrupt controller, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 16/19] pseries: savevm support with KVM, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 17/19] target-ppc: Add POWER8 v1.0 CPU model, Alexey Kardashevskiy, 2013/07/06
- [Qemu-ppc] [PATCH 18/19] target-ppc: Enhance the CPU node labels for the guest device tree for pseries.,
Alexey Kardashevskiy <=
- [Qemu-ppc] [PATCH v2 18/19] target-ppc: Enhance the CPU node labels for the guest device tree for pseries., Prerna Saxena, 2013/07/08
[Qemu-ppc] [PATCH 19/19] spapr-pci: rework MSI/MSIX, Alexey Kardashevskiy, 2013/07/06
[Qemu-ppc] [PATCH 08/19] pseries: savevm support for PAPR VIO logical tty, Alexey Kardashevskiy, 2013/07/06
Re: [Qemu-ppc] [PATCH 00/19 v4] spapr: migration, pci, msi, power8, Anthony Liguori, 2013/07/29