From d35aefa9ae150a8a5943ca3d9102020a5382de0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Fri, 15 Jun 2018 17:25:33 +0200 Subject: [PATCH 01/23] ppc/pnv: introduce a new intc_create() operation to the chip model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Power9, the thread interrupt presenter has a different type and is linked to the chip owning the cores. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 21 +++++++++++++++++++-- hw/ppc/pnv_core.c | 18 +++++++++--------- include/hw/ppc/pnv.h | 1 + 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 0d2b79f798..c7e127ae97 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -671,6 +671,13 @@ static uint32_t pnv_chip_core_pir_p8(PnvChip *chip, uint32_t core_id) return (chip->chip_id << 7) | (core_id << 3); } +static Object *pnv_chip_power8_intc_create(PnvChip *chip, Object *child, + Error **errp) +{ + return icp_create(child, TYPE_PNV_ICP, XICS_FABRIC(qdev_get_machine()), + errp); +} + /* * 0:48 Reserved - Read as zeroes * 49:52 Node ID @@ -686,6 +693,12 @@ static uint32_t pnv_chip_core_pir_p9(PnvChip *chip, uint32_t core_id) return (chip->chip_id << 8) | (core_id << 2); } +static Object *pnv_chip_power9_intc_create(PnvChip *chip, Object *child, + Error **errp) +{ + return NULL; +} + /* Allowed core identifiers on a POWER8 Processor Chip : * * @@ -721,6 +734,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x221ef04980000000ull; /* P8 Murano DD2.1 */ k->cores_mask = POWER8E_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->intc_create = pnv_chip_power8_intc_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8E"; } @@ -734,6 +748,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x220ea04980000000ull; /* P8 Venice DD2.0 */ k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->intc_create = pnv_chip_power8_intc_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8"; } @@ -747,6 +762,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x120d304980000000ull; /* P8 Naples DD1.0 */ k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; + k->intc_create = pnv_chip_power8_intc_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8NVL"; } @@ -760,6 +776,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->chip_cfam_id = 0x220d104900008000ull; /* P9 Nimbus DD2.0 */ k->cores_mask = POWER9_CORE_MASK; k->core_pir = pnv_chip_core_pir_p9; + k->intc_create = pnv_chip_power9_intc_create; k->xscom_base = 0x00603fc00000000ull; dc->desc = "PowerNV Chip POWER9"; } @@ -892,8 +909,8 @@ static void pnv_chip_core_realize(PnvChip *chip, Error **errp) object_property_set_int(OBJECT(pnv_core), pcc->core_pir(chip, core_hwid), "pir", &error_fatal); - object_property_add_const_link(OBJECT(pnv_core), "xics", - qdev_get_machine(), &error_fatal); + object_property_add_const_link(OBJECT(pnv_core), "chip", + OBJECT(chip), &error_fatal); object_property_set_bool(OBJECT(pnv_core), true, "realized", &error_fatal); object_unref(OBJECT(pnv_core)); diff --git a/hw/ppc/pnv_core.c b/hw/ppc/pnv_core.c index f7cf33f547..a9f129fc2c 100644 --- a/hw/ppc/pnv_core.c +++ b/hw/ppc/pnv_core.c @@ -99,13 +99,14 @@ static const MemoryRegionOps pnv_core_xscom_ops = { .endianness = DEVICE_BIG_ENDIAN, }; -static void pnv_realize_vcpu(PowerPCCPU *cpu, XICSFabric *xi, Error **errp) +static void pnv_realize_vcpu(PowerPCCPU *cpu, PnvChip *chip, Error **errp) { CPUPPCState *env = &cpu->env; int core_pir; int thread_index = 0; /* TODO: TCG supports only one thread */ ppc_spr_t *pir = &env->spr_cb[SPR_PIR]; Error *local_err = NULL; + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); object_property_set_bool(OBJECT(cpu), true, "realized", &local_err); if (local_err) { @@ -113,7 +114,7 @@ static void pnv_realize_vcpu(PowerPCCPU *cpu, XICSFabric *xi, Error **errp) return; } - cpu->intc = icp_create(OBJECT(cpu), TYPE_PNV_ICP, xi, &local_err); + cpu->intc = pcc->intc_create(chip, OBJECT(cpu), &local_err); if (local_err) { error_propagate(errp, local_err); return; @@ -143,13 +144,12 @@ static void pnv_core_realize(DeviceState *dev, Error **errp) void *obj; int i, j; char name[32]; - Object *xi; + Object *chip; - xi = object_property_get_link(OBJECT(dev), "xics", &local_err); - if (!xi) { - error_setg(errp, "%s: required link 'xics' not found: %s", - __func__, error_get_pretty(local_err)); - return; + chip = object_property_get_link(OBJECT(dev), "chip", &local_err); + if (!chip) { + error_propagate(errp, local_err); + error_prepend(errp, "required link 'chip' not found: "); } pc->threads = g_new(PowerPCCPU *, cc->nr_threads); @@ -166,7 +166,7 @@ static void pnv_core_realize(DeviceState *dev, Error **errp) } for (j = 0; j < cc->nr_threads; j++) { - pnv_realize_vcpu(pc->threads[j], XICS_FABRIC(xi), &local_err); + pnv_realize_vcpu(pc->threads[j], PNV_CHIP(chip), &local_err); if (local_err) { goto err; } diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 90759240a7..e934e84f55 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -76,6 +76,7 @@ typedef struct PnvChipClass { hwaddr xscom_base; uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); + Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); } PnvChipClass; #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP From 04026890f2d71afb36dbef24c370171cd0c42913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Fri, 15 Jun 2018 17:25:34 +0200 Subject: [PATCH 02/23] ppc/pnv: introduce a new isa_create() operation to the chip model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This moves the details of the ISA bus creation under the LPC model but more important, the new PnvChip operation will let us choose the chip class to use when we introduce the different chip classes for Power9 and Power8. It hides away the processor chip controllers from the machine. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 34 +++++++++++++++++++--------------- hw/ppc/pnv_lpc.c | 30 +++++++++++++++++++++++++----- include/hw/ppc/pnv.h | 1 + include/hw/ppc/pnv_lpc.h | 3 +-- 4 files changed, 46 insertions(+), 22 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index c7e127ae97..ac828d1331 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -529,24 +529,24 @@ static void pnv_reset(void) cpu_physical_memory_write(PNV_FDT_ADDR, fdt, fdt_totalsize(fdt)); } -static ISABus *pnv_isa_create(PnvChip *chip) +static ISABus *pnv_chip_power8_isa_create(PnvChip *chip, Error **errp) { - PnvLpcController *lpc = &chip->lpc; - ISABus *isa_bus; - qemu_irq *irqs; - PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + return pnv_lpc_isa_create(&chip->lpc, true, errp); +} - /* let isa_bus_new() create its own bridge on SysBus otherwise - * devices speficied on the command line won't find the bus and - * will fail to create. - */ - isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, - &error_fatal); +static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *chip, Error **errp) +{ + return pnv_lpc_isa_create(&chip->lpc, false, errp); +} - irqs = pnv_lpc_isa_irq_create(lpc, pcc->chip_type, ISA_NUM_IRQS); +static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp) +{ + return NULL; +} - isa_bus_irqs(isa_bus, irqs); - return isa_bus; +static ISABus *pnv_isa_create(PnvChip *chip, Error **errp) +{ + return PNV_CHIP_GET_CLASS(chip)->isa_create(chip, errp); } static void pnv_init(MachineState *machine) @@ -646,7 +646,7 @@ static void pnv_init(MachineState *machine) g_free(chip_typename); /* Instantiate ISA bus on chip 0 */ - pnv->isa_bus = pnv_isa_create(pnv->chips[0]); + pnv->isa_bus = pnv_isa_create(pnv->chips[0], &error_fatal); /* Create serial port */ serial_hds_isa_init(pnv->isa_bus, 0, MAX_ISA_SERIAL_PORTS); @@ -735,6 +735,7 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->cores_mask = POWER8E_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; k->intc_create = pnv_chip_power8_intc_create; + k->isa_create = pnv_chip_power8_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8E"; } @@ -749,6 +750,7 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; k->intc_create = pnv_chip_power8_intc_create; + k->isa_create = pnv_chip_power8_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8"; } @@ -763,6 +765,7 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->cores_mask = POWER8_CORE_MASK; k->core_pir = pnv_chip_core_pir_p8; k->intc_create = pnv_chip_power8_intc_create; + k->isa_create = pnv_chip_power8nvl_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8NVL"; } @@ -777,6 +780,7 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->cores_mask = POWER9_CORE_MASK; k->core_pir = pnv_chip_core_pir_p9; k->intc_create = pnv_chip_power9_intc_create; + k->isa_create = pnv_chip_power9_isa_create; k->xscom_base = 0x00603fc00000000ull; dc->desc = "PowerNV Chip POWER9"; } diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c index 402c4fefa8..d7721320a2 100644 --- a/hw/ppc/pnv_lpc.c +++ b/hw/ppc/pnv_lpc.c @@ -22,6 +22,7 @@ #include "target/ppc/cpu.h" #include "qapi/error.h" #include "qemu/log.h" +#include "hw/isa/isa.h" #include "hw/ppc/pnv.h" #include "hw/ppc/pnv_lpc.h" @@ -535,16 +536,35 @@ static void pnv_lpc_isa_irq_handler(void *opaque, int n, int level) } } -qemu_irq *pnv_lpc_isa_irq_create(PnvLpcController *lpc, int chip_type, - int nirqs) +ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp) { + Error *local_err = NULL; + ISABus *isa_bus; + qemu_irq *irqs; + qemu_irq_handler handler; + + /* let isa_bus_new() create its own bridge on SysBus otherwise + * devices speficied on the command line won't find the bus and + * will fail to create. + */ + isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return NULL; + } + /* Not all variants have a working serial irq decoder. If not, * handling of LPC interrupts becomes a platform issue (some * platforms have a CPLD to do it). */ - if (chip_type == PNV_CHIP_POWER8NVL) { - return qemu_allocate_irqs(pnv_lpc_isa_irq_handler, lpc, nirqs); + if (use_cpld) { + handler = pnv_lpc_isa_irq_handler_cpld; } else { - return qemu_allocate_irqs(pnv_lpc_isa_irq_handler_cpld, lpc, nirqs); + handler = pnv_lpc_isa_irq_handler; } + + irqs = qemu_allocate_irqs(handler, lpc, ISA_NUM_IRQS); + + isa_bus_irqs(isa_bus, irqs); + return isa_bus; } diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index e934e84f55..563279f3e0 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -77,6 +77,7 @@ typedef struct PnvChipClass { uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); + ISABus *(*isa_create)(PnvChip *chip, Error **errp); } PnvChipClass; #define PNV_CHIP_TYPE_SUFFIX "-" TYPE_PNV_CHIP diff --git a/include/hw/ppc/pnv_lpc.h b/include/hw/ppc/pnv_lpc.h index 53fdd5bb64..d657489b07 100644 --- a/include/hw/ppc/pnv_lpc.h +++ b/include/hw/ppc/pnv_lpc.h @@ -70,7 +70,6 @@ typedef struct PnvLpcController { PnvPsi *psi; } PnvLpcController; -qemu_irq *pnv_lpc_isa_irq_create(PnvLpcController *lpc, int chip_type, - int nirqs); +ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp); #endif /* _PPC_PNV_LPC_H */ From b94020268e0b6659499e250d25346baaa9888fed Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Mon, 18 Jun 2018 14:26:35 +0200 Subject: [PATCH 03/23] spapr_cpu_core: migrate per-CPU data A per-CPU machine data pointer was recently added to PowerPCCPU. The motivation is to to hide platform specific details from the core CPU code. This per-CPU data can hold state which is relevant to the guest though, eg, Virtual Processor Areas, and we should migrate this state. This patch adds the plumbing so that we can migrate the per-CPU data for PAPR guests. We only do this for newer machine types for the sake of backward compatibility. No state is migrated for the moment: the vmstate_spapr_cpu_state structure will be populated by subsequent patches. Signed-off-by: Greg Kurz [dwg: Fix some trivial spelling and spacing errors] Signed-off-by: David Gibson --- hw/ppc/spapr.c | 7 ++++++- hw/ppc/spapr_cpu_core.c | 22 ++++++++++++++++++++-- include/hw/ppc/spapr_cpu_core.h | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index db0fb385d4..3174468fc5 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -4115,7 +4115,12 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", true); HW_COMPAT_2_12 \ { \ .driver = TYPE_POWERPC_CPU, \ - .property = "pre-3.0-migration", \ + .property = "pre-3.0-migration", \ + .value = "on", \ + }, \ + { \ + .driver = TYPE_SPAPR_CPU_CORE, \ + .property = "pre-3.0-migration", \ .value = "on", \ }, diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index aef3be33a3..f129ac884e 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -129,6 +129,15 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp) g_free(sc->threads); } +static const VMStateDescription vmstate_spapr_cpu_state = { + .name = "spapr_cpu", + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_END_OF_LIST() + }, +}; + static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, Error **errp) { @@ -194,6 +203,10 @@ static PowerPCCPU *spapr_create_vcpu(sPAPRCPUCore *sc, int i, Error **errp) } cpu->machine_data = g_new0(sPAPRCPUState, 1); + if (!sc->pre_3_0_migration) { + vmstate_register(NULL, cs->cpu_index, &vmstate_spapr_cpu_state, + cpu->machine_data); + } object_unref(obj); return cpu; @@ -204,10 +217,13 @@ err: return NULL; } -static void spapr_delete_vcpu(PowerPCCPU *cpu) +static void spapr_delete_vcpu(PowerPCCPU *cpu, sPAPRCPUCore *sc) { sPAPRCPUState *spapr_cpu = spapr_cpu_state(cpu); + if (!sc->pre_3_0_migration) { + vmstate_unregister(NULL, &vmstate_spapr_cpu_state, cpu->machine_data); + } cpu->machine_data = NULL; g_free(spapr_cpu); object_unparent(OBJECT(cpu)); @@ -253,7 +269,7 @@ err_unrealize: } err: while (--i >= 0) { - spapr_delete_vcpu(sc->threads[i]); + spapr_delete_vcpu(sc->threads[i], sc); } g_free(sc->threads); error_propagate(errp, local_err); @@ -261,6 +277,8 @@ err: static Property spapr_cpu_core_properties[] = { DEFINE_PROP_INT32("node-id", sPAPRCPUCore, node_id, CPU_UNSET_NUMA_NODE_ID), + DEFINE_PROP_BOOL("pre-3.0-migration", sPAPRCPUCore, pre_3_0_migration, + false), DEFINE_PROP_END_OF_LIST() }; diff --git a/include/hw/ppc/spapr_cpu_core.h b/include/hw/ppc/spapr_cpu_core.h index 8ceea2973a..9e2821e4b3 100644 --- a/include/hw/ppc/spapr_cpu_core.h +++ b/include/hw/ppc/spapr_cpu_core.h @@ -31,6 +31,7 @@ typedef struct sPAPRCPUCore { /*< public >*/ PowerPCCPU **threads; int node_id; + bool pre_3_0_migration; /* older machine don't know about sPAPRCPUState */ } sPAPRCPUCore; typedef struct sPAPRCPUCoreClass { From 7f9fe3f02d9e796e8bcd37628e17127dec515991 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Mon, 18 Jun 2018 14:26:49 +0200 Subject: [PATCH 04/23] spapr_cpu_core: migrate VPA related state QEMU implements the "Shared Processor LPAR" (SPLPAR) option, which allows the hypervisor to time-slice a physical processor into multiple virtual processor. The intent is to allow more guests to run, and to optimize processor utilization. The guest OS can cede idle VCPUs, so that their processing capacity may be used by other VCPUs, with the H_CEDE hcall. The guest OS can also optimize spinlocks, by confering the time-slice of a spinning VCPU to the spinlock holder if it's currently notrunning, with the H_CONFER hcall. Both hcalls depend on a "Virtual Processor Area" (VPA) to be registered by the guest OS, generally during early boot. Other per-VCPU areas can be registered: the "SLB Shadow Buffer" which allows a more efficient dispatching of VCPUs, and the "Dispatch Trace Log Buffer" (DTL) which is used to compute time stolen by the hypervisor. Both DTL and SLB Shadow areas depend on the VPA to be registered. The VPA/SLB Shadow/DTL are state that QEMU should migrate, but this doesn't happen, for no apparent reason other than it was just never coded. This causes the features listed above to stop working after migration, and it breaks the logic of the H_REGISTER_VPA hcall in the destination. The VPA is set at the guest request, ie, we don't have to migrate it before the guest has actually set it. This patch hence adds an "spapr_cpu/vpa" subsection to the recently introduced per-CPU machine data migration stream. Since DTL and SLB Shadow are optional and both depend on VPA, they get their own subsections "spapr_cpu/vpa/slb_shadow" and "spapr_cpu/vpa/dtl" hanging from the "spapr_cpu/vpa" subsection. Note that this won't break migration to older QEMUs. Is is already handled by only registering the vmstate handler for per-CPU data with newer machine types. Signed-off-by: Greg Kurz Signed-off-by: David Gibson --- hw/ppc/spapr_cpu_core.c | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index f129ac884e..67f1596c57 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -129,6 +129,67 @@ static void spapr_cpu_core_unrealize(DeviceState *dev, Error **errp) g_free(sc->threads); } +static bool slb_shadow_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu = opaque; + + return spapr_cpu->slb_shadow_addr != 0; +} + +static const VMStateDescription vmstate_spapr_cpu_slb_shadow = { + .name = "spapr_cpu/vpa/slb_shadow", + .version_id = 1, + .minimum_version_id = 1, + .needed = slb_shadow_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT64(slb_shadow_addr, sPAPRCPUState), + VMSTATE_UINT64(slb_shadow_size, sPAPRCPUState), + VMSTATE_END_OF_LIST() + } +}; + +static bool dtl_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu = opaque; + + return spapr_cpu->dtl_addr != 0; +} + +static const VMStateDescription vmstate_spapr_cpu_dtl = { + .name = "spapr_cpu/vpa/dtl", + .version_id = 1, + .minimum_version_id = 1, + .needed = dtl_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT64(dtl_addr, sPAPRCPUState), + VMSTATE_UINT64(dtl_size, sPAPRCPUState), + VMSTATE_END_OF_LIST() + } +}; + +static bool vpa_needed(void *opaque) +{ + sPAPRCPUState *spapr_cpu = opaque; + + return spapr_cpu->vpa_addr != 0; +} + +static const VMStateDescription vmstate_spapr_cpu_vpa = { + .name = "spapr_cpu/vpa", + .version_id = 1, + .minimum_version_id = 1, + .needed = vpa_needed, + .fields = (VMStateField[]) { + VMSTATE_UINT64(vpa_addr, sPAPRCPUState), + VMSTATE_END_OF_LIST() + }, + .subsections = (const VMStateDescription * []) { + &vmstate_spapr_cpu_slb_shadow, + &vmstate_spapr_cpu_dtl, + NULL + } +}; + static const VMStateDescription vmstate_spapr_cpu_state = { .name = "spapr_cpu", .version_id = 1, @@ -136,6 +197,10 @@ static const VMStateDescription vmstate_spapr_cpu_state = { .fields = (VMStateField[]) { VMSTATE_END_OF_LIST() }, + .subsections = (const VMStateDescription * []) { + &vmstate_spapr_cpu_vpa, + NULL + } }; static void spapr_realize_vcpu(PowerPCCPU *cpu, sPAPRMachineState *spapr, From 77864267c3c82a4938d628b9313bce8fcce6373d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Mon, 18 Jun 2018 19:05:39 +0200 Subject: [PATCH 05/23] ppc/pnv: introduce Pnv8Chip and Pnv9Chip models MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It introduces a base PnvChip class from which the specific processor chip classes, Pnv8Chip and Pnv9Chip, inherit. Each of them needs to define an init and a realize routine which will create the controllers of the target processor. For the moment, the base PnvChip class handles the XSCOM bus and the cores. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 281 +++++++++++++++++++++++++++---------------- include/hw/ppc/pnv.h | 24 +++- 2 files changed, 202 insertions(+), 103 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index ac828d1331..a29ea996b4 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -531,12 +531,14 @@ static void pnv_reset(void) static ISABus *pnv_chip_power8_isa_create(PnvChip *chip, Error **errp) { - return pnv_lpc_isa_create(&chip->lpc, true, errp); + Pnv8Chip *chip8 = PNV8_CHIP(chip); + return pnv_lpc_isa_create(&chip8->lpc, true, errp); } static ISABus *pnv_chip_power8nvl_isa_create(PnvChip *chip, Error **errp) { - return pnv_lpc_isa_create(&chip->lpc, false, errp); + Pnv8Chip *chip8 = PNV8_CHIP(chip); + return pnv_lpc_isa_create(&chip8->lpc, false, errp); } static ISABus *pnv_chip_power9_isa_create(PnvChip *chip, Error **errp) @@ -725,6 +727,103 @@ static Object *pnv_chip_power9_intc_create(PnvChip *chip, Object *child, */ #define POWER9_CORE_MASK (0xffffffffffffffull) +static void pnv_chip_power8_instance_init(Object *obj) +{ + Pnv8Chip *chip8 = PNV8_CHIP(obj); + + object_initialize(&chip8->psi, sizeof(chip8->psi), TYPE_PNV_PSI); + object_property_add_child(obj, "psi", OBJECT(&chip8->psi), NULL); + object_property_add_const_link(OBJECT(&chip8->psi), "xics", + OBJECT(qdev_get_machine()), &error_abort); + + object_initialize(&chip8->lpc, sizeof(chip8->lpc), TYPE_PNV_LPC); + object_property_add_child(obj, "lpc", OBJECT(&chip8->lpc), NULL); + object_property_add_const_link(OBJECT(&chip8->lpc), "psi", + OBJECT(&chip8->psi), &error_abort); + + object_initialize(&chip8->occ, sizeof(chip8->occ), TYPE_PNV_OCC); + object_property_add_child(obj, "occ", OBJECT(&chip8->occ), NULL); + object_property_add_const_link(OBJECT(&chip8->occ), "psi", + OBJECT(&chip8->psi), &error_abort); +} + +static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp) + { + PnvChip *chip = PNV_CHIP(chip8); + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); + const char *typename = pnv_chip_core_typename(chip); + size_t typesize = object_type_get_instance_size(typename); + int i, j; + char *name; + XICSFabric *xi = XICS_FABRIC(qdev_get_machine()); + + name = g_strdup_printf("icp-%x", chip->chip_id); + memory_region_init(&chip8->icp_mmio, OBJECT(chip), name, PNV_ICP_SIZE); + sysbus_init_mmio(SYS_BUS_DEVICE(chip), &chip8->icp_mmio); + g_free(name); + + sysbus_mmio_map(SYS_BUS_DEVICE(chip), 1, PNV_ICP_BASE(chip)); + + /* Map the ICP registers for each thread */ + for (i = 0; i < chip->nr_cores; i++) { + PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize); + int core_hwid = CPU_CORE(pnv_core)->core_id; + + for (j = 0; j < CPU_CORE(pnv_core)->nr_threads; j++) { + uint32_t pir = pcc->core_pir(chip, core_hwid) + j; + PnvICPState *icp = PNV_ICP(xics_icp_get(xi, pir)); + + memory_region_add_subregion(&chip8->icp_mmio, pir << 12, + &icp->mmio); + } + } +} + +static void pnv_chip_power8_realize(DeviceState *dev, Error **errp) +{ + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev); + PnvChip *chip = PNV_CHIP(dev); + Pnv8Chip *chip8 = PNV8_CHIP(dev); + Error *local_err = NULL; + + pcc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Processor Service Interface (PSI) Host Bridge */ + object_property_set_int(OBJECT(&chip8->psi), PNV_PSIHB_BASE(chip), + "bar", &error_fatal); + object_property_set_bool(OBJECT(&chip8->psi), true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip8->psi.xscom_regs); + + /* Create LPC controller */ + object_property_set_bool(OBJECT(&chip8->lpc), true, "realized", + &error_fatal); + pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip8->lpc.xscom_regs); + + /* Interrupt Management Area. This is the memory region holding + * all the Interrupt Control Presenter (ICP) registers */ + pnv_chip_icp_realize(chip8, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* Create the simplified OCC model */ + object_property_set_bool(OBJECT(&chip8->occ), true, "realized", &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip8->occ.xscom_regs); +} + static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -738,6 +837,9 @@ static void pnv_chip_power8e_class_init(ObjectClass *klass, void *data) k->isa_create = pnv_chip_power8_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8E"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); } static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) @@ -753,6 +855,9 @@ static void pnv_chip_power8_class_init(ObjectClass *klass, void *data) k->isa_create = pnv_chip_power8_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); } static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) @@ -768,6 +873,25 @@ static void pnv_chip_power8nvl_class_init(ObjectClass *klass, void *data) k->isa_create = pnv_chip_power8nvl_isa_create; k->xscom_base = 0x003fc0000000000ull; dc->desc = "PowerNV Chip POWER8NVL"; + + device_class_set_parent_realize(dc, pnv_chip_power8_realize, + &k->parent_realize); +} + +static void pnv_chip_power9_instance_init(Object *obj) +{ +} + +static void pnv_chip_power9_realize(DeviceState *dev, Error **errp) +{ + PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev); + Error *local_err = NULL; + + pcc->parent_realize(dev, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } } static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) @@ -783,6 +907,9 @@ static void pnv_chip_power9_class_init(ObjectClass *klass, void *data) k->isa_create = pnv_chip_power9_isa_create; k->xscom_base = 0x00603fc00000000ull; dc->desc = "PowerNV Chip POWER9"; + + device_class_set_parent_realize(dc, pnv_chip_power9_realize, + &k->parent_realize); } static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp) @@ -815,59 +942,9 @@ static void pnv_chip_core_sanitize(PnvChip *chip, Error **errp) } } -static void pnv_chip_init(Object *obj) +static void pnv_chip_instance_init(Object *obj) { - PnvChip *chip = PNV_CHIP(obj); - PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); - - chip->xscom_base = pcc->xscom_base; - - object_initialize(&chip->lpc, sizeof(chip->lpc), TYPE_PNV_LPC); - object_property_add_child(obj, "lpc", OBJECT(&chip->lpc), NULL); - - object_initialize(&chip->psi, sizeof(chip->psi), TYPE_PNV_PSI); - object_property_add_child(obj, "psi", OBJECT(&chip->psi), NULL); - object_property_add_const_link(OBJECT(&chip->psi), "xics", - OBJECT(qdev_get_machine()), &error_abort); - - object_initialize(&chip->occ, sizeof(chip->occ), TYPE_PNV_OCC); - object_property_add_child(obj, "occ", OBJECT(&chip->occ), NULL); - object_property_add_const_link(OBJECT(&chip->occ), "psi", - OBJECT(&chip->psi), &error_abort); - - /* The LPC controller needs PSI to generate interrupts */ - object_property_add_const_link(OBJECT(&chip->lpc), "psi", - OBJECT(&chip->psi), &error_abort); -} - -static void pnv_chip_icp_realize(PnvChip *chip, Error **errp) -{ - PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip); - const char *typename = pnv_chip_core_typename(chip); - size_t typesize = object_type_get_instance_size(typename); - int i, j; - char *name; - XICSFabric *xi = XICS_FABRIC(qdev_get_machine()); - - name = g_strdup_printf("icp-%x", chip->chip_id); - memory_region_init(&chip->icp_mmio, OBJECT(chip), name, PNV_ICP_SIZE); - sysbus_init_mmio(SYS_BUS_DEVICE(chip), &chip->icp_mmio); - g_free(name); - - sysbus_mmio_map(SYS_BUS_DEVICE(chip), 1, PNV_ICP_BASE(chip)); - - /* Map the ICP registers for each thread */ - for (i = 0; i < chip->nr_cores; i++) { - PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize); - int core_hwid = CPU_CORE(pnv_core)->core_id; - - for (j = 0; j < CPU_CORE(pnv_core)->nr_threads; j++) { - uint32_t pir = pcc->core_pir(chip, core_hwid) + j; - PnvICPState *icp = PNV_ICP(xics_icp_get(xi, pir)); - - memory_region_add_subregion(&chip->icp_mmio, pir << 12, &icp->mmio); - } - } + PNV_CHIP(obj)->xscom_base = PNV_CHIP_GET_CLASS(obj)->xscom_base; } static void pnv_chip_core_realize(PnvChip *chip, Error **errp) @@ -951,37 +1028,6 @@ static void pnv_chip_realize(DeviceState *dev, Error **errp) error_propagate(errp, error); return; } - - /* Create LPC controller */ - object_property_set_bool(OBJECT(&chip->lpc), true, "realized", - &error_fatal); - pnv_xscom_add_subregion(chip, PNV_XSCOM_LPC_BASE, &chip->lpc.xscom_regs); - - /* Interrupt Management Area. This is the memory region holding - * all the Interrupt Control Presenter (ICP) registers */ - pnv_chip_icp_realize(chip, &error); - if (error) { - error_propagate(errp, error); - return; - } - - /* Processor Service Interface (PSI) Host Bridge */ - object_property_set_int(OBJECT(&chip->psi), PNV_PSIHB_BASE(chip), - "bar", &error_fatal); - object_property_set_bool(OBJECT(&chip->psi), true, "realized", &error); - if (error) { - error_propagate(errp, error); - return; - } - pnv_xscom_add_subregion(chip, PNV_XSCOM_PSIHB_BASE, &chip->psi.xscom_regs); - - /* Create the simplified OCC model */ - object_property_set_bool(OBJECT(&chip->occ), true, "realized", &error); - if (error) { - error_propagate(errp, error); - return; - } - pnv_xscom_add_subregion(chip, PNV_XSCOM_OCC_BASE, &chip->occ.xscom_regs); } static Property pnv_chip_properties[] = { @@ -1009,8 +1055,10 @@ static ICSState *pnv_ics_get(XICSFabric *xi, int irq) int i; for (i = 0; i < pnv->num_chips; i++) { - if (ics_valid_irq(&pnv->chips[i]->psi.ics, irq)) { - return &pnv->chips[i]->psi.ics; + Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]); + + if (ics_valid_irq(&chip8->psi.ics, irq)) { + return &chip8->psi.ics; } } return NULL; @@ -1022,7 +1070,8 @@ static void pnv_ics_resend(XICSFabric *xi) int i; for (i = 0; i < pnv->num_chips; i++) { - ics_resend(&pnv->chips[i]->psi.ics); + Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]); + ics_resend(&chip8->psi.ics); } } @@ -1063,7 +1112,8 @@ static void pnv_pic_print_info(InterruptStatsProvider *obj, } for (i = 0; i < pnv->num_chips; i++) { - ics_pic_print_info(&pnv->chips[i]->psi.ics, mon); + Pnv8Chip *chip8 = PNV8_CHIP(pnv->chips[i]); + ics_pic_print_info(&chip8->psi.ics, mon); } } @@ -1098,7 +1148,7 @@ static void pnv_set_num_chips(Object *obj, Visitor *v, const char *name, pnv->num_chips = num_chips; } -static void pnv_machine_initfn(Object *obj) +static void pnv_machine_instance_init(Object *obj) { PnvMachineState *pnv = PNV_MACHINE(obj); pnv->num_chips = 1; @@ -1138,11 +1188,18 @@ static void pnv_machine_class_init(ObjectClass *oc, void *data) pnv_machine_class_props_init(oc); } -#define DEFINE_PNV_CHIP_TYPE(type, class_initfn) \ - { \ - .name = type, \ - .class_init = class_initfn, \ - .parent = TYPE_PNV_CHIP, \ +#define DEFINE_PNV8_CHIP_TYPE(type, class_initfn) \ + { \ + .name = type, \ + .class_init = class_initfn, \ + .parent = TYPE_PNV8_CHIP, \ + } + +#define DEFINE_PNV9_CHIP_TYPE(type, class_initfn) \ + { \ + .name = type, \ + .class_init = class_initfn, \ + .parent = TYPE_PNV9_CHIP, \ } static const TypeInfo types[] = { @@ -1150,7 +1207,7 @@ static const TypeInfo types[] = { .name = TYPE_PNV_MACHINE, .parent = TYPE_MACHINE, .instance_size = sizeof(PnvMachineState), - .instance_init = pnv_machine_initfn, + .instance_init = pnv_machine_instance_init, .class_init = pnv_machine_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_XICS_FABRIC }, @@ -1162,16 +1219,36 @@ static const TypeInfo types[] = { .name = TYPE_PNV_CHIP, .parent = TYPE_SYS_BUS_DEVICE, .class_init = pnv_chip_class_init, - .instance_init = pnv_chip_init, + .instance_init = pnv_chip_instance_init, .instance_size = sizeof(PnvChip), .class_size = sizeof(PnvChipClass), .abstract = true, }, - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER9, pnv_chip_power9_class_init), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8, pnv_chip_power8_class_init), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8E, pnv_chip_power8e_class_init), - DEFINE_PNV_CHIP_TYPE(TYPE_PNV_CHIP_POWER8NVL, - pnv_chip_power8nvl_class_init), + + /* + * P9 chip and variants + */ + { + .name = TYPE_PNV9_CHIP, + .parent = TYPE_PNV_CHIP, + .instance_init = pnv_chip_power9_instance_init, + .instance_size = sizeof(Pnv9Chip), + }, + DEFINE_PNV9_CHIP_TYPE(TYPE_PNV_CHIP_POWER9, pnv_chip_power9_class_init), + + /* + * P8 chip and variants + */ + { + .name = TYPE_PNV8_CHIP, + .parent = TYPE_PNV_CHIP, + .instance_init = pnv_chip_power8_instance_init, + .instance_size = sizeof(Pnv8Chip), + }, + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8, pnv_chip_power8_class_init), + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8E, pnv_chip_power8e_class_init), + DEFINE_PNV8_CHIP_TYPE(TYPE_PNV_CHIP_POWER8NVL, + pnv_chip_power8nvl_class_init), }; DEFINE_TYPES(types) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 563279f3e0..86d5f54e54 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -57,12 +57,32 @@ typedef struct PnvChip { MemoryRegion xscom_mmio; MemoryRegion xscom; AddressSpace xscom_as; +} PnvChip; + +#define TYPE_PNV8_CHIP "pnv8-chip" +#define PNV8_CHIP(obj) OBJECT_CHECK(Pnv8Chip, (obj), TYPE_PNV8_CHIP) + +typedef struct Pnv8Chip { + /*< private >*/ + PnvChip parent_obj; + + /*< public >*/ MemoryRegion icp_mmio; PnvLpcController lpc; PnvPsi psi; PnvOCC occ; -} PnvChip; +} Pnv8Chip; + +#define TYPE_PNV9_CHIP "pnv9-chip" +#define PNV9_CHIP(obj) OBJECT_CHECK(Pnv9Chip, (obj), TYPE_PNV9_CHIP) + +typedef struct Pnv9Chip { + /*< private >*/ + PnvChip parent_obj; + + /*< public >*/ +} Pnv9Chip; typedef struct PnvChipClass { /*< private >*/ @@ -75,6 +95,8 @@ typedef struct PnvChipClass { hwaddr xscom_base; + DeviceRealize parent_realize; + uint32_t (*core_pir)(PnvChip *chip, uint32_t core_id); Object *(*intc_create)(PnvChip *chip, Object *child, Error **errp); ISABus *(*isa_create)(PnvChip *chip, Error **errp); From bb7ab95c96756663cf76914b171971d9582f828d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Mon, 18 Jun 2018 19:05:40 +0200 Subject: [PATCH 06/23] ppc/pnv: consolidate the creation of the ISA bus device tree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The device tree node of the ISA bus was being partially done in different places. Move all the nodes creation under the same routine. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/pnv.c | 51 +++++++++++++++++++++++---------------------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index a29ea996b4..7401ffe5b0 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -265,18 +265,6 @@ static void pnv_dt_icp(PnvChip *chip, void *fdt, uint32_t pir, g_free(reg); } -static int pnv_chip_lpc_offset(PnvChip *chip, void *fdt) -{ - char *name; - int offset; - - name = g_strdup_printf("/xscom@%" PRIx64 "/isa@%x", - (uint64_t) PNV_XSCOM_BASE(chip), PNV_XSCOM_LPC_BASE); - offset = fdt_path_offset(fdt, name); - g_free(name); - return offset; -} - static void pnv_dt_chip(PnvChip *chip, void *fdt) { const char *typename = pnv_chip_core_typename(chip); @@ -285,16 +273,6 @@ static void pnv_dt_chip(PnvChip *chip, void *fdt) pnv_dt_xscom(chip, fdt, 0); - /* The default LPC bus of a multichip system is on chip 0. It's - * recognized by the firmware (skiboot) using a "primary" - * property. - */ - if (chip->chip_id == 0x0) { - int lpc_offset = pnv_chip_lpc_offset(chip, fdt); - - _FDT((fdt_setprop(fdt, lpc_offset, "primary", NULL, 0))); - } - for (i = 0; i < chip->nr_cores; i++) { PnvCore *pnv_core = PNV_CORE(chip->cores + i * typesize); @@ -418,16 +396,35 @@ static int pnv_dt_isa_device(DeviceState *dev, void *opaque) return 0; } -static void pnv_dt_isa(ISABus *bus, void *fdt, int lpc_offset) +static int pnv_chip_isa_offset(PnvChip *chip, void *fdt) { + char *name; + int offset; + + name = g_strdup_printf("/xscom@%" PRIx64 "/isa@%x", + (uint64_t) PNV_XSCOM_BASE(chip), PNV_XSCOM_LPC_BASE); + offset = fdt_path_offset(fdt, name); + g_free(name); + return offset; +} + +/* The default LPC bus of a multichip system is on chip 0. It's + * recognized by the firmware (skiboot) using a "primary" property. + */ +static void pnv_dt_isa(PnvMachineState *pnv, void *fdt) +{ + int isa_offset = pnv_chip_isa_offset(pnv->chips[0], fdt); ForeachPopulateArgs args = { .fdt = fdt, - .offset = lpc_offset, + .offset = isa_offset, }; + _FDT((fdt_setprop(fdt, isa_offset, "primary", NULL, 0))); + /* ISA devices are not necessarily parented to the ISA bus so we * can not use object_child_foreach() */ - qbus_walk_children(BUS(bus), pnv_dt_isa_device, NULL, NULL, NULL, &args); + qbus_walk_children(BUS(pnv->isa_bus), pnv_dt_isa_device, NULL, NULL, NULL, + &args); } static void *pnv_dt_create(MachineState *machine) @@ -438,7 +435,6 @@ static void *pnv_dt_create(MachineState *machine) char *buf; int off; int i; - int lpc_offset; fdt = g_malloc0(FDT_MAX_SIZE); _FDT((fdt_create_empty_tree(fdt, FDT_MAX_SIZE))); @@ -480,8 +476,7 @@ static void *pnv_dt_create(MachineState *machine) } /* Populate ISA devices on chip 0 */ - lpc_offset = pnv_chip_lpc_offset(pnv->chips[0], fdt); - pnv_dt_isa(pnv->isa_bus, fdt, lpc_offset); + pnv_dt_isa(pnv, fdt); if (pnv->bmc) { pnv_dt_bmc_sensors(pnv->bmc, fdt); From ad99d04c76debb0d60c0bbb5d4f6ebb3509ddc91 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 14 Jun 2018 16:33:58 +1000 Subject: [PATCH 07/23] target/ppc: Allow cpu compatiblity checks based on type, not instance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ppc_check_compat() is used in a number of places to check if a cpu object supports a certain compatiblity mode, subject to various constraints. It takes a PowerPCCPU *, however it really only depends on the cpu's class. We have upcoming cases where it would be useful to make compatibility checks before we fully instantiate the cpu objects. ppc_type_check_compat() will now make an equivalent check, but based on a CPU's QOM typename instead of an instantiated CPU object. We make use of the new interface in several places in spapr, where we're essentially making a global check, rather than one specific to a particular cpu. This avoids some ugly uses of first_cpu to grab a "representative" instance. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater --- hw/ppc/spapr.c | 10 ++++------ hw/ppc/spapr_caps.c | 19 +++++++++---------- target/ppc/compat.c | 27 +++++++++++++++++++++------ target/ppc/cpu.h | 4 ++++ 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 3174468fc5..bc179f6f89 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1616,8 +1616,8 @@ static void spapr_machine_reset(void) first_ppc_cpu = POWERPC_CPU(first_cpu); if (kvm_enabled() && kvmppc_has_cap_mmu_radix() && - ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0, - spapr->max_compat_pvr)) { + ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00, 0, + spapr->max_compat_pvr)) { /* If using KVM with radix mode available, VCPUs can be started * without a HPT because KVM will start them in radix mode. * Set the GR bit in PATB so that we know there is no HPT. */ @@ -2520,7 +2520,6 @@ static void spapr_machine_init(MachineState *machine) long load_limit, fw_size; char *filename; Error *resize_hpt_err = NULL; - PowerPCCPU *first_ppc_cpu; msi_nonbroken = true; @@ -2618,10 +2617,9 @@ static void spapr_machine_init(MachineState *machine) /* init CPUs */ spapr_init_cpus(spapr); - first_ppc_cpu = POWERPC_CPU(first_cpu); if ((!kvm_enabled() || kvmppc_has_cap_mmu_radix()) && - ppc_check_compat(first_ppc_cpu, CPU_POWERPC_LOGICAL_3_00, 0, - spapr->max_compat_pvr)) { + ppc_type_check_compat(machine->cpu_type, CPU_POWERPC_LOGICAL_3_00, 0, + spapr->max_compat_pvr)) { /* KVM and TCG always allow GTSE with radix... */ spapr_ovec_set(spapr->ov5, OV5_MMU_RADIX_GTSE); } diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 00e43a9ba7..469f38f0ef 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -327,27 +327,26 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { }; static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, - CPUState *cs) + const char *cputype) { sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(spapr); - PowerPCCPU *cpu = POWERPC_CPU(cs); sPAPRCapabilities caps; caps = smc->default_caps; - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_07, - 0, spapr->max_compat_pvr)) { + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_07, + 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF; caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; } - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_06_PLUS, - 0, spapr->max_compat_pvr)) { + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_06_PLUS, + 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; } - if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_2_06, - 0, spapr->max_compat_pvr)) { + if (!ppc_type_check_compat(cputype, CPU_POWERPC_LOGICAL_2_06, + 0, spapr->max_compat_pvr)) { caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_OFF; caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_OFF; caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; @@ -384,7 +383,7 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr) sPAPRCapabilities dstcaps = spapr->eff; sPAPRCapabilities srccaps; - srccaps = default_caps_with_cpu(spapr, first_cpu); + srccaps = default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type); for (i = 0; i < SPAPR_CAP_NUM; i++) { /* If not default value then assume came in with the migration */ if (spapr->mig.caps[i] != spapr->def.caps[i]) { @@ -446,7 +445,7 @@ void spapr_caps_reset(sPAPRMachineState *spapr) int i; /* First compute the actual set of caps we're running with.. */ - default_caps = default_caps_with_cpu(spapr, first_cpu); + default_caps = default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type); for (i = 0; i < SPAPR_CAP_NUM; i++) { /* Store the defaults */ diff --git a/target/ppc/compat.c b/target/ppc/compat.c index 807c906f68..7de4bf3122 100644 --- a/target/ppc/compat.c +++ b/target/ppc/compat.c @@ -105,17 +105,13 @@ static const CompatInfo *compat_by_pvr(uint32_t pvr) return NULL; } -bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, - uint32_t min_compat_pvr, uint32_t max_compat_pvr) +static bool pcc_compat(PowerPCCPUClass *pcc, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr) { - PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); const CompatInfo *compat = compat_by_pvr(compat_pvr); const CompatInfo *min = compat_by_pvr(min_compat_pvr); const CompatInfo *max = compat_by_pvr(max_compat_pvr); -#if !defined(CONFIG_USER_ONLY) - g_assert(cpu->vhyp); -#endif g_assert(!min_compat_pvr || min); g_assert(!max_compat_pvr || max); @@ -134,6 +130,25 @@ bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, return true; } +bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr) +{ + PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); + +#if !defined(CONFIG_USER_ONLY) + g_assert(cpu->vhyp); +#endif + + return pcc_compat(pcc, compat_pvr, min_compat_pvr, max_compat_pvr); +} + +bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr) +{ + PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(object_class_by_name(cputype)); + return pcc_compat(pcc, compat_pvr, min_compat_pvr, max_compat_pvr); +} + void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp) { const CompatInfo *compat = compat_by_pvr(compat_pvr); diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index 874da6efbc..c7f3fb6b73 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -1369,7 +1369,11 @@ static inline int cpu_mmu_index (CPUPPCState *env, bool ifetch) #if defined(TARGET_PPC64) bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr, uint32_t min_compat_pvr, uint32_t max_compat_pvr); +bool ppc_type_check_compat(const char *cputype, uint32_t compat_pvr, + uint32_t min_compat_pvr, uint32_t max_compat_pvr); + void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp); + #if !defined(CONFIG_USER_ONLY) void ppc_set_compat_all(uint32_t compat_pvr, Error **errp); #endif From 9f6edd066e92f61543ea561b7c3cb340f30a7017 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 14 Jun 2018 16:37:28 +1000 Subject: [PATCH 08/23] spapr: Compute effective capability values earlier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, the effective values of the various spapr capability flags were only determined at machine reset time. That was a lazy way of making sure it was after cpu initialization so it could use the cpu object to inform the defaults. But we've now improved the compat checking code so that we don't need to instantiate the cpus to use it. That lets us move the resolution of the capability defaults much earlier. This is going to be necessary for some future capabilities. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater --- hw/ppc/spapr.c | 6 ++++-- hw/ppc/spapr_caps.c | 9 ++++++--- include/hw/ppc/spapr.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index bc179f6f89..4a0b679166 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -1612,7 +1612,7 @@ static void spapr_machine_reset(void) void *fdt; int rc; - spapr_caps_reset(spapr); + spapr_caps_apply(spapr); first_ppc_cpu = POWERPC_CPU(first_cpu); if (kvm_enabled() && kvmppc_has_cap_mmu_radix() && @@ -2526,7 +2526,9 @@ static void spapr_machine_init(MachineState *machine) QLIST_INIT(&spapr->phbs); QTAILQ_INIT(&spapr->pending_dimm_unplugs); - /* Check HPT resizing availability */ + /* Determine capabilities to run with */ + spapr_caps_init(spapr); + kvmppc_check_papr_resize_hpt(&resize_hpt_err); if (spapr->resize_hpt == SPAPR_RESIZE_HPT_DEFAULT) { /* diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 469f38f0ef..dabed817d1 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -439,12 +439,12 @@ SPAPR_CAP_MIG_STATE(cfpc, SPAPR_CAP_CFPC); SPAPR_CAP_MIG_STATE(sbbc, SPAPR_CAP_SBBC); SPAPR_CAP_MIG_STATE(ibs, SPAPR_CAP_IBS); -void spapr_caps_reset(sPAPRMachineState *spapr) +void spapr_caps_init(sPAPRMachineState *spapr) { sPAPRCapabilities default_caps; int i; - /* First compute the actual set of caps we're running with.. */ + /* Compute the actual set of caps we should run with */ default_caps = default_caps_with_cpu(spapr, MACHINE(spapr)->cpu_type); for (i = 0; i < SPAPR_CAP_NUM; i++) { @@ -455,8 +455,11 @@ void spapr_caps_reset(sPAPRMachineState *spapr) spapr->eff.caps[i] = default_caps.caps[i]; } } +} - /* .. then apply those caps to the virtual hardware */ +void spapr_caps_apply(sPAPRMachineState *spapr) +{ + int i; for (i = 0; i < SPAPR_CAP_NUM; i++) { sPAPRCapabilityInfo *info = &capability_table[i]; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 3388750fc7..9dbd6010f5 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -798,7 +798,8 @@ static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) return spapr->eff.caps[cap]; } -void spapr_caps_reset(sPAPRMachineState *spapr); +void spapr_caps_init(sPAPRMachineState *spapr); +void spapr_caps_apply(sPAPRMachineState *spapr); void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp); int spapr_caps_post_migration(sPAPRMachineState *spapr); From e2e4f64118d128c41bd3c787afd2b9822ab758cd Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 28 Mar 2018 14:45:44 +1100 Subject: [PATCH 09/23] spapr: Add cpu_apply hook to capabilities MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit spapr capabilities have an apply hook to actually activate (or deactivate) the feature in the system at reset time. However, a number of capabilities affect the setup of cpus, and need to be applied to each of them - including hotplugged cpus for extra complication. To make this simpler, add an optional cpu_apply hook that is called from spapr_cpu_reset(). Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater --- hw/ppc/spapr_caps.c | 19 +++++++++++++++++++ hw/ppc/spapr_cpu_core.c | 2 ++ include/hw/ppc/spapr.h | 1 + 3 files changed, 22 insertions(+) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index dabed817d1..68a4243efc 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -59,6 +59,8 @@ typedef struct sPAPRCapabilityInfo { sPAPRCapPossible *possible; /* Make sure the virtual hardware can support this capability */ void (*apply)(sPAPRMachineState *spapr, uint8_t val, Error **errp); + void (*cpu_apply)(sPAPRMachineState *spapr, PowerPCCPU *cpu, + uint8_t val, Error **errp); } sPAPRCapabilityInfo; static void spapr_cap_get_bool(Object *obj, Visitor *v, const char *name, @@ -472,6 +474,23 @@ void spapr_caps_apply(sPAPRMachineState *spapr) } } +void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu) +{ + int i; + + for (i = 0; i < SPAPR_CAP_NUM; i++) { + sPAPRCapabilityInfo *info = &capability_table[i]; + + /* + * If the apply function can't set the desired level and thinks it's + * fatal, it should cause that. + */ + if (info->cpu_apply) { + info->cpu_apply(spapr, cpu, spapr->eff.caps[i], &error_fatal); + } + } +} + void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp) { Error *local_err = NULL; diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index 67f1596c57..bfb94f650c 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -76,6 +76,8 @@ static void spapr_cpu_reset(void *opaque) spapr_cpu->slb_shadow_size = 0; spapr_cpu->dtl_addr = 0; spapr_cpu->dtl_size = 0; + + spapr_caps_cpu_apply(SPAPR_MACHINE(qdev_get_machine()), cpu); } void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r3) diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 9dbd6010f5..9dd46a72f6 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -800,6 +800,7 @@ static inline uint8_t spapr_get_cap(sPAPRMachineState *spapr, int cap) void spapr_caps_init(sPAPRMachineState *spapr); void spapr_caps_apply(sPAPRMachineState *spapr); +void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu); void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp); int spapr_caps_post_migration(sPAPRMachineState *spapr); From 24c6863c7b61efcfe4a0f0916ed4e8b797c8d281 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 14 Jun 2018 12:11:08 +1000 Subject: [PATCH 10/23] target/ppc: Add kvmppc_hpt_needs_host_contiguous_pages() helper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KVM HV has a restriction that for HPT mode guests, guest pages must be hpa contiguous as well as gpa contiguous. We have to account for that in various places. We determine whether we're subject to this restriction from the SMMU information exposed by KVM. Planned cleanups to the way we handle this will require knowing whether this restriction is in play in wider parts of the code. So, expose a helper function which returns it. This does mean some redundant calls to kvm_get_smmu_info(), but they'll go away again with future cleanups. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Cédric Le Goater --- target/ppc/kvm.c | 17 +++++++++++++++-- target/ppc/kvm_ppc.h | 6 ++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 5c0e313ca6..50b5d01432 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -406,9 +406,22 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu, } } +bool kvmppc_hpt_needs_host_contiguous_pages(void) +{ + PowerPCCPU *cpu = POWERPC_CPU(first_cpu); + static struct kvm_ppc_smmu_info smmu_info; + + if (!kvm_enabled()) { + return false; + } + + kvm_get_smmu_info(cpu, &smmu_info); + return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL); +} + static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift) { - if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) { + if (!kvmppc_hpt_needs_host_contiguous_pages()) { return true; } @@ -445,7 +458,7 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu) /* If we have HV KVM, we need to forbid CI large pages if our * host page size is smaller than 64K. */ - if (smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL) { + if (kvmppc_hpt_needs_host_contiguous_pages()) { if (getpagesize() >= 0x10000) { cpu->hash64_opts->flags |= PPC_HASH64_CI_LARGEPAGE; } else { diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index e2840e1d33..a7ddb8a5d6 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -70,6 +70,7 @@ int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags, int shift); int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); +bool kvmppc_hpt_needs_host_contiguous_pages(void); bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path); #else @@ -222,6 +223,11 @@ static inline uint64_t kvmppc_rma_size(uint64_t current_size, return ram_size; } +static inline bool kvmppc_hpt_needs_host_contiguous_pages(void) +{ + return false; +} + static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) { return true; From 4fe75a8ccd8005f8d0322c5b85ebee6243b2e753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Mon, 18 Jun 2018 19:34:00 +0200 Subject: [PATCH 11/23] spapr: split the IRQ allocation sequence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Today, when a device requests for IRQ number in a sPAPR machine, the spapr_irq_alloc() routine first scans the ICSState status array to find an empty slot and then performs the assignement of the selected numbers. Split this sequence in two distinct routines : spapr_irq_find() for lookups and spapr_irq_claim() for claiming the IRQ numbers. This will ease the introduction of a static layout of IRQ numbers. Signed-off-by: Cédric Le Goater Signed-off-by: David Gibson --- hw/ppc/spapr.c | 50 ++++++++++++++++++++++++++++++++++++++++++ hw/ppc/spapr_events.c | 18 +++++++++++---- hw/ppc/spapr_pci.c | 23 ++++++++++++++++--- hw/ppc/spapr_vio.c | 10 ++++++++- include/hw/ppc/spapr.h | 4 ++++ 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 4a0b679166..b7705c3944 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3816,6 +3816,36 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum) return -1; } +int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp) +{ + ICSState *ics = spapr->ics; + int first = -1; + + assert(ics); + + /* + * MSIMesage::data is used for storing VIRQ so + * it has to be aligned to num to support multiple + * MSI vectors. MSI-X is not affected by this. + * The hint is used for the first IRQ, the rest should + * be allocated continuously. + */ + if (align) { + assert((num == 1) || (num == 2) || (num == 4) || + (num == 8) || (num == 16) || (num == 32)); + first = ics_find_free_block(ics, num, num); + } else { + first = ics_find_free_block(ics, num, 1); + } + + if (first < 0) { + error_setg(errp, "can't find a free %d-IRQ block", num); + return -1; + } + + return first + ics->offset; +} + /* * Allocate the IRQ number and set the IRQ type, LSI or MSI */ @@ -3894,6 +3924,26 @@ int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, return first; } +int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp) +{ + ICSState *ics = spapr->ics; + + assert(ics); + + if (!ics_valid_irq(ics, irq)) { + error_setg(errp, "IRQ %d is invalid", irq); + return -1; + } + + if (!ICS_IRQ_FREE(ics, irq - ics->offset)) { + error_setg(errp, "IRQ %d is not free", irq); + return -1; + } + + spapr_irq_set_lsi(spapr, irq, lsi); + return 0; +} + void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num) { ICSState *ics = spapr->ics; diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c index 86836f0626..e4f5946a21 100644 --- a/hw/ppc/spapr_events.c +++ b/hw/ppc/spapr_events.c @@ -707,13 +707,18 @@ void spapr_clear_pending_events(sPAPRMachineState *spapr) void spapr_events_init(sPAPRMachineState *spapr) { + int epow_irq; + + epow_irq = spapr_irq_findone(spapr, &error_fatal); + + spapr_irq_claim(spapr, epow_irq, false, &error_fatal); + QTAILQ_INIT(&spapr->pending_events); spapr->event_sources = spapr_event_sources_new(); spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_EPOW, - spapr_irq_alloc(spapr, 0, false, - &error_fatal)); + epow_irq); /* NOTE: if machine supports modern/dedicated hotplug event source, * we add it to the device-tree unconditionally. This means we may @@ -724,9 +729,14 @@ void spapr_events_init(sPAPRMachineState *spapr) * checking that it's enabled. */ if (spapr->use_hotplug_event_source) { + int hp_irq; + + hp_irq = spapr_irq_findone(spapr, &error_fatal); + + spapr_irq_claim(spapr, hp_irq, false, &error_fatal); + spapr_event_sources_register(spapr->event_sources, EVENT_CLASS_HOT_PLUG, - spapr_irq_alloc(spapr, 0, false, - &error_fatal)); + hp_irq); } spapr->epow_notifier.notify = spapr_powerdown_req; diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c index f936ce63ef..497b896c7d 100644 --- a/hw/ppc/spapr_pci.c +++ b/hw/ppc/spapr_pci.c @@ -279,6 +279,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, spapr_pci_msi *msi; int *config_addr_key; Error *err = NULL; + int i; /* Fins sPAPRPHBState */ phb = spapr_pci_find_phb(spapr, buid); @@ -371,8 +372,7 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, } /* Allocate MSIs */ - irq = spapr_irq_alloc_block(spapr, req_num, false, - ret_intr_type == RTAS_TYPE_MSI, &err); + irq = spapr_irq_find(spapr, req_num, ret_intr_type == RTAS_TYPE_MSI, &err); if (err) { error_reportf_err(err, "Can't allocate MSIs for device %x: ", config_addr); @@ -380,6 +380,16 @@ static void rtas_ibm_change_msi(PowerPCCPU *cpu, sPAPRMachineState *spapr, return; } + for (i = 0; i < req_num; i++) { + spapr_irq_claim(spapr, irq + i, false, &err); + if (err) { + error_reportf_err(err, "Can't allocate MSIs for device %x: ", + config_addr); + rtas_st(rets, 0, RTAS_OUT_HW_ERROR); + return; + } + } + /* Release previous MSIs */ if (msi) { spapr_irq_free(spapr, msi->first_irq, msi->num); @@ -1698,7 +1708,14 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp) uint32_t irq; Error *local_err = NULL; - irq = spapr_irq_alloc_block(spapr, 1, true, false, &local_err); + irq = spapr_irq_findone(spapr, &local_err); + if (local_err) { + error_propagate(errp, local_err); + error_prepend(errp, "can't allocate LSIs: "); + return; + } + + spapr_irq_claim(spapr, irq, true, &local_err); if (local_err) { error_propagate(errp, local_err); error_prepend(errp, "can't allocate LSIs: "); diff --git a/hw/ppc/spapr_vio.c b/hw/ppc/spapr_vio.c index 4555c648a8..daf85130b5 100644 --- a/hw/ppc/spapr_vio.c +++ b/hw/ppc/spapr_vio.c @@ -475,7 +475,15 @@ static void spapr_vio_busdev_realize(DeviceState *qdev, Error **errp) dev->qdev.id = id; } - dev->irq = spapr_irq_alloc(spapr, dev->irq, false, &local_err); + if (!dev->irq) { + dev->irq = spapr_irq_findone(spapr, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + } + + spapr_irq_claim(spapr, dev->irq, false, &local_err); if (local_err) { error_propagate(errp, local_err); return; diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 9dd46a72f6..6bfdf5a2fb 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -776,6 +776,10 @@ int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_hint, bool lsi, Error **errp); int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, bool align, Error **errp); +int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, + Error **errp); +#define spapr_irq_findone(spapr, errp) spapr_irq_find(spapr, 1, false, errp) +int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp); void spapr_irq_free(sPAPRMachineState *spapr, int irq, int num); qemu_irq spapr_qirq(sPAPRMachineState *spapr, int irq); From 71b5c8d26e35549db4b83d907b2886623d8dd99a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= Date: Mon, 18 Jun 2018 19:34:01 +0200 Subject: [PATCH 12/23] spapr: remove unused spapr_irq routines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit spapr_irq_alloc_block and spapr_irq_alloc() are now deprecated. Signed-off-by: Cédric Le Goater Reviewed-by: David Gibson Signed-off-by: David Gibson --- hw/ppc/spapr.c | 80 +----------------------------------------- include/hw/ppc/spapr.h | 4 --- 2 files changed, 1 insertion(+), 83 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index b7705c3944..78186500e9 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3846,84 +3846,6 @@ int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp) return first + ics->offset; } -/* - * Allocate the IRQ number and set the IRQ type, LSI or MSI - */ -static void spapr_irq_set_lsi(sPAPRMachineState *spapr, int irq, bool lsi) -{ - ics_set_irq_type(spapr->ics, irq - spapr->ics->offset, lsi); -} - -int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_hint, bool lsi, - Error **errp) -{ - ICSState *ics = spapr->ics; - int irq; - - assert(ics); - - if (irq_hint) { - if (!ICS_IRQ_FREE(ics, irq_hint - ics->offset)) { - error_setg(errp, "can't allocate IRQ %d: already in use", irq_hint); - return -1; - } - irq = irq_hint; - } else { - irq = ics_find_free_block(ics, 1, 1); - if (irq < 0) { - error_setg(errp, "can't allocate IRQ: no IRQ left"); - return -1; - } - irq += ics->offset; - } - - spapr_irq_set_lsi(spapr, irq, lsi); - trace_spapr_irq_alloc(irq); - - return irq; -} - -/* - * Allocate block of consecutive IRQs, and return the number of the first IRQ in - * the block. If align==true, aligns the first IRQ number to num. - */ -int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, - bool align, Error **errp) -{ - ICSState *ics = spapr->ics; - int i, first = -1; - - assert(ics); - - /* - * MSIMesage::data is used for storing VIRQ so - * it has to be aligned to num to support multiple - * MSI vectors. MSI-X is not affected by this. - * The hint is used for the first IRQ, the rest should - * be allocated continuously. - */ - if (align) { - assert((num == 1) || (num == 2) || (num == 4) || - (num == 8) || (num == 16) || (num == 32)); - first = ics_find_free_block(ics, num, num); - } else { - first = ics_find_free_block(ics, num, 1); - } - if (first < 0) { - error_setg(errp, "can't find a free %d-IRQ block", num); - return -1; - } - - first += ics->offset; - for (i = first; i < first + num; ++i) { - spapr_irq_set_lsi(spapr, i, lsi); - } - - trace_spapr_irq_alloc_block(first, num, lsi, align); - - return first; -} - int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp) { ICSState *ics = spapr->ics; @@ -3940,7 +3862,7 @@ int spapr_irq_claim(sPAPRMachineState *spapr, int irq, bool lsi, Error **errp) return -1; } - spapr_irq_set_lsi(spapr, irq, lsi); + ics_set_irq_type(ics, irq - ics->offset, lsi); return 0; } diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 6bfdf5a2fb..8a9142244f 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -772,10 +772,6 @@ int spapr_get_vcpu_id(PowerPCCPU *cpu); void spapr_set_vcpu_id(PowerPCCPU *cpu, int cpu_index, Error **errp); PowerPCCPU *spapr_find_cpu(int vcpu_id); -int spapr_irq_alloc(sPAPRMachineState *spapr, int irq_hint, bool lsi, - Error **errp); -int spapr_irq_alloc_block(sPAPRMachineState *spapr, int num, bool lsi, - bool align, Error **errp); int spapr_irq_find(sPAPRMachineState *spapr, int num, bool align, Error **errp); #define spapr_irq_findone(spapr, errp) spapr_irq_find(spapr, 1, false, errp) From 88d8d5555d0257a31b5891a328d957cc9b579eb2 Mon Sep 17 00:00:00 2001 From: John Arbuckle Date: Mon, 18 Jun 2018 11:50:24 -0400 Subject: [PATCH 13/23] fpu_helper.c: fix helper_fpscr_clrbit() function Fix the helper_fpscr_clrbit() function so it correctly sets the FEX and VX bits. Determining the value for the Floating Point Status and Control Register's (FPSCR) FEX bit is suppose to be done like this: FEX = (VX & VE) | (OX & OE) | (UX & UE) | (ZX & ZE) | (XX & XE)) It is described as "the logical OR of all the floating-point exception bits masked by their respective enable bits". It was not implemented correctly. The value of FEX would stay on even when all other bits were set to off. The VX bit is described as "the logical OR of all of the invalid operation exceptions". This bit was also not implemented correctly. It too would stay on when all the other bits were set to off. My main source of information is an IBM document called: PowerPC Microprocessor Family: The Programming Environments for 32-Bit Microprocessors Page 62 is where the FPSCR information is located. This is an older copy than the one I use but it is still very useful: https://www.pdfdrive.net/powerpc-microprocessor-family-the-programming-environments-for-32-e3087633.html I use a G3 and G5 iMac to compare bit values with QEMU. This patch fixed all the problems I was having with these bits. Signed-off-by: John Arbuckle [dwg: Re-wrapped commit message] Signed-off-by: David Gibson --- target/ppc/fpu_helper.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/target/ppc/fpu_helper.c b/target/ppc/fpu_helper.c index d31a933cbb..7714bfe0f9 100644 --- a/target/ppc/fpu_helper.c +++ b/target/ppc/fpu_helper.c @@ -325,6 +325,34 @@ void helper_fpscr_clrbit(CPUPPCState *env, uint32_t bit) case FPSCR_RN: fpscr_set_rounding_mode(env); break; + case FPSCR_VXSNAN: + case FPSCR_VXISI: + case FPSCR_VXIDI: + case FPSCR_VXZDZ: + case FPSCR_VXIMZ: + case FPSCR_VXVC: + case FPSCR_VXSOFT: + case FPSCR_VXSQRT: + case FPSCR_VXCVI: + if (!fpscr_ix) { + /* Set VX bit to zero */ + env->fpscr &= ~(1 << FPSCR_VX); + } + break; + case FPSCR_OX: + case FPSCR_UX: + case FPSCR_ZX: + case FPSCR_XX: + case FPSCR_VE: + case FPSCR_OE: + case FPSCR_UE: + case FPSCR_ZE: + case FPSCR_XE: + if (!fpscr_eex) { + /* Set the FEX bit */ + env->fpscr &= ~(1 << FPSCR_FEX); + } + break; default: break; } From a69232e2a36b9fcee46ddbf140ab2de1583abf39 Mon Sep 17 00:00:00 2001 From: Sebastian Bauer Date: Mon, 18 Jun 2018 23:38:16 +0200 Subject: [PATCH 14/23] sm501: Fix hardware cursor color conversion According to the sm501 specs the hardware cursor colors are to be given in the rgb565 format, but the code currently interprets them as bgr565. Therefore, the colors of the hardware cursors are wrong in the QEMU display, e.g., the standard mouse pointer of AmigaOS appears blue instead of red. This change fixes this issue by replacing the existing naive bgr565 => rgb888 conversion with a standard rgb565 => rgb888 one that also scales the color component values properly. Signed-off-by: Sebastian Bauer Signed-off-by: David Gibson --- hw/display/sm501.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/display/sm501.c b/hw/display/sm501.c index ca0840f6fa..8206ae81a1 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -652,9 +652,9 @@ static inline void get_hwc_palette(SM501State *state, int crt, uint8_t *palette) } else { rgb565 = color_reg & 0xFFFF; } - palette[i * 3 + 0] = (rgb565 << 3) & 0xf8; /* red */ - palette[i * 3 + 1] = (rgb565 >> 3) & 0xfc; /* green */ - palette[i * 3 + 2] = (rgb565 >> 8) & 0xf8; /* blue */ + palette[i * 3 + 0] = ((rgb565 >> 11) * 527 + 23) >> 6; /* r */ + palette[i * 3 + 1] = (((rgb565 >> 5) & 0x3f) * 259 + 33) >> 6; /* g */ + palette[i * 3 + 2] = ((rgb565 & 0x1f) * 527 + 23) >> 6; /* b */ } } From 39aeba6caa4b9de8b195fddddae5cc5835d19b04 Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Tue, 19 Jun 2018 10:52:15 +0200 Subject: [PATCH 15/23] ppc4xx_i2c: Remove unimplemented sdata and intr registers We don't emulate slave mode so related registers are not needed. [lh]sadr are only retained to avoid too many warnings and simplify debugging but sdata is not even correct because device has a 4 byte FIFO instead so just remove this unimplemented register for now. The intr register is also not implemented correctly, it is for diagnostics and normally not even visible on device without explicitly enabling it. As no guests are known to need this remove it as well. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- hw/i2c/ppc4xx_i2c.c | 16 +--------------- include/hw/i2c/ppc4xx_i2c.h | 4 +--- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index d1936dbdca..4e0aaae1fc 100644 --- a/hw/i2c/ppc4xx_i2c.c +++ b/hw/i2c/ppc4xx_i2c.c @@ -3,7 +3,7 @@ * * Copyright (c) 2007 Jocelyn Mayer * Copyright (c) 2012 François Revol - * Copyright (c) 2016 BALATON Zoltan + * Copyright (c) 2016-2018 BALATON Zoltan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -63,7 +63,6 @@ static void ppc4xx_i2c_reset(DeviceState *s) i2c->mdcntl = 0; i2c->sts = 0; i2c->extsts = 0x8f; - i2c->sdata = 0; i2c->lsadr = 0; i2c->hsadr = 0; i2c->clkdiv = 0; @@ -71,7 +70,6 @@ static void ppc4xx_i2c_reset(DeviceState *s) i2c->xfrcnt = 0; i2c->xtcntlss = 0; i2c->directcntl = 0xf; - i2c->intr = 0; } static inline bool ppc4xx_i2c_is_master(PPC4xxI2CState *i2c) @@ -139,9 +137,6 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr addr, unsigned int size) TYPE_PPC4xx_I2C, __func__); } break; - case 2: - ret = i2c->sdata; - break; case 4: ret = i2c->lmadr; break; @@ -181,9 +176,6 @@ static uint64_t ppc4xx_i2c_readb(void *opaque, hwaddr addr, unsigned int size) case 16: ret = i2c->directcntl; break; - case 17: - ret = i2c->intr; - break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" @@ -229,9 +221,6 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value, } } break; - case 2: - i2c->sdata = value; - break; case 4: i2c->lmadr = value; if (i2c_bus_busy(i2c->bus)) { @@ -302,9 +291,6 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value, case 16: i2c->directcntl = value & 0x7; break; - case 17: - i2c->intr = value; - break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { qemu_log_mask(LOG_UNIMP, "%s: Unimplemented register 0x%" diff --git a/include/hw/i2c/ppc4xx_i2c.h b/include/hw/i2c/ppc4xx_i2c.h index 3c603071bd..e4b6ded855 100644 --- a/include/hw/i2c/ppc4xx_i2c.h +++ b/include/hw/i2c/ppc4xx_i2c.h @@ -3,7 +3,7 @@ * * Copyright (c) 2007 Jocelyn Mayer * Copyright (c) 2012 François Revol - * Copyright (c) 2016 BALATON Zoltan + * Copyright (c) 2016-2018 BALATON Zoltan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -49,7 +49,6 @@ typedef struct PPC4xxI2CState { uint8_t mdcntl; uint8_t sts; uint8_t extsts; - uint8_t sdata; uint8_t lsadr; uint8_t hsadr; uint8_t clkdiv; @@ -57,7 +56,6 @@ typedef struct PPC4xxI2CState { uint8_t xfrcnt; uint8_t xtcntlss; uint8_t directcntl; - uint8_t intr; } PPC4xxI2CState; #endif /* PPC4XX_I2C_H */ From ef9173a5c086b5114343a86943f9b26a9c72d7d6 Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Tue, 19 Jun 2018 10:52:15 +0200 Subject: [PATCH 16/23] ppc4xx_i2c: Implement directcntl register As well as being able to generate its own i2c transactions, the ppc4xx i2c controller has a DIRECTCNTL register which allows explicit control of the i2c lines. Using this register an OS can directly bitbang i2c operations. In order to let emulated i2c devices respond to this, we need to wire up the DIRECTCNTL register to qemu's bitbanged i2c handling code. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- default-configs/ppc-softmmu.mak | 1 + default-configs/ppcemb-softmmu.mak | 1 + hw/i2c/ppc4xx_i2c.c | 14 +++++++++++++- include/hw/i2c/ppc4xx_i2c.h | 4 ++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.mak index abeeb0418a..851b4afc21 100644 --- a/default-configs/ppc-softmmu.mak +++ b/default-configs/ppc-softmmu.mak @@ -26,6 +26,7 @@ CONFIG_USB_EHCI_SYSBUS=y CONFIG_SM501=y CONFIG_IDE_SII3112=y CONFIG_I2C=y +CONFIG_BITBANG_I2C=y # For Macs CONFIG_MAC=y diff --git a/default-configs/ppcemb-softmmu.mak b/default-configs/ppcemb-softmmu.mak index 67d18b2e0e..37af1930b3 100644 --- a/default-configs/ppcemb-softmmu.mak +++ b/default-configs/ppcemb-softmmu.mak @@ -19,3 +19,4 @@ CONFIG_USB_EHCI_SYSBUS=y CONFIG_SM501=y CONFIG_IDE_SII3112=y CONFIG_I2C=y +CONFIG_BITBANG_I2C=y diff --git a/hw/i2c/ppc4xx_i2c.c b/hw/i2c/ppc4xx_i2c.c index 4e0aaae1fc..fca80d695a 100644 --- a/hw/i2c/ppc4xx_i2c.c +++ b/hw/i2c/ppc4xx_i2c.c @@ -30,6 +30,7 @@ #include "cpu.h" #include "hw/hw.h" #include "hw/i2c/ppc4xx_i2c.h" +#include "bitbang_i2c.h" #define PPC4xx_I2C_MEM_SIZE 18 @@ -46,6 +47,11 @@ #define IIC_XTCNTLSS_SRST (1 << 0) +#define IIC_DIRECTCNTL_SDAC (1 << 3) +#define IIC_DIRECTCNTL_SCLC (1 << 2) +#define IIC_DIRECTCNTL_MSDA (1 << 1) +#define IIC_DIRECTCNTL_MSCL (1 << 0) + static void ppc4xx_i2c_reset(DeviceState *s) { PPC4xxI2CState *i2c = PPC4xx_I2C(s); @@ -289,7 +295,12 @@ static void ppc4xx_i2c_writeb(void *opaque, hwaddr addr, uint64_t value, i2c->xtcntlss = value; break; case 16: - i2c->directcntl = value & 0x7; + i2c->directcntl = value & (IIC_DIRECTCNTL_SDAC & IIC_DIRECTCNTL_SCLC); + i2c->directcntl |= (value & IIC_DIRECTCNTL_SCLC ? 1 : 0); + bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SCL, + i2c->directcntl & IIC_DIRECTCNTL_MSCL); + i2c->directcntl |= bitbang_i2c_set(i2c->bitbang, BITBANG_I2C_SDA, + (value & IIC_DIRECTCNTL_SDAC) != 0) << 1; break; default: if (addr < PPC4xx_I2C_MEM_SIZE) { @@ -322,6 +333,7 @@ static void ppc4xx_i2c_init(Object *o) sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); sysbus_init_irq(SYS_BUS_DEVICE(s), &s->irq); s->bus = i2c_init_bus(DEVICE(s), "i2c"); + s->bitbang = bitbang_i2c_init(s->bus); } static void ppc4xx_i2c_class_init(ObjectClass *klass, void *data) diff --git a/include/hw/i2c/ppc4xx_i2c.h b/include/hw/i2c/ppc4xx_i2c.h index e4b6ded855..ea6c8e1a58 100644 --- a/include/hw/i2c/ppc4xx_i2c.h +++ b/include/hw/i2c/ppc4xx_i2c.h @@ -31,6 +31,9 @@ #include "hw/sysbus.h" #include "hw/i2c/i2c.h" +/* from hw/i2c/bitbang_i2c.h */ +typedef struct bitbang_i2c_interface bitbang_i2c_interface; + #define TYPE_PPC4xx_I2C "ppc4xx-i2c" #define PPC4xx_I2C(obj) OBJECT_CHECK(PPC4xxI2CState, (obj), TYPE_PPC4xx_I2C) @@ -42,6 +45,7 @@ typedef struct PPC4xxI2CState { I2CBus *bus; qemu_irq irq; MemoryRegion iomem; + bitbang_i2c_interface *bitbang; uint8_t mdata; uint8_t lmadr; uint8_t hmadr; From 0c8d8c8b8fd6db3110a5be3886b1ed9ba89be8b1 Mon Sep 17 00:00:00 2001 From: BALATON Zoltan Date: Tue, 19 Jun 2018 10:52:15 +0200 Subject: [PATCH 17/23] target/ppc: Add missing opcode for icbt on PPC440 According to PPC440 User Manual PPC440 has multiple opcodes for icbt instruction: one for compatibility with older cores and two 440 specific opcodes one of which is defined in BookE. QEMU only implements two of these, add the missing one. Signed-off-by: BALATON Zoltan Signed-off-by: David Gibson --- target/ppc/translate.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/target/ppc/translate.c b/target/ppc/translate.c index 5fe1ba6555..3a215a1dc6 100644 --- a/target/ppc/translate.c +++ b/target/ppc/translate.c @@ -6707,6 +6707,8 @@ GEN_HANDLER_E(mbar, 0x1F, 0x16, 0x1a, 0x001FF801, GEN_HANDLER(msync_4xx, 0x1F, 0x16, 0x12, 0x03FFF801, PPC_BOOKE), GEN_HANDLER2_E(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE, PPC2_BOOKE206), +GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x06, 0x08, 0x03E00001, + PPC_440_SPEC), GEN_HANDLER(lvsl, 0x1f, 0x06, 0x00, 0x00000001, PPC_ALTIVEC), GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC), GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC), From d21bbcc655b4f611f3d9246d50dba0b6a404d784 Mon Sep 17 00:00:00 2001 From: Alexey Kardashevskiy Date: Thu, 21 Jun 2018 19:05:58 +1000 Subject: [PATCH 18/23] pseries: Update SLOF firmware image to qemu-slof-20180621 The changes are: 1. fixed broken_sc1; 2. added switching between boot consoles; 3. added PXE boot. The full list is: > lib/libnet/pxelinux: Fix two off-by-one bugs in the pxelinux.cfg parser > lib/libnet/pxelinux: Make the size handling for pxelinux_load_cfg more logical > libc: Add a simple implementation of an assert() function > libnet: Support UUID-based pxelinux.cfg file names > slof: Add a helper function to get the contents of a property in C code > libnet: Add support for DHCPv4 options 209 and 210 > libnet: Wire up pxelinux.cfg network booting > libnet: Add functions for downloading and parsing pxelinux.cfg files > libnet: Put code for determing TFTP error strings into a separate function > libc: Add the snprintf() function > libnet: Pass ip_version via struct filename_ip > resolve ihandle and xt handle in the input command (like for the output) > Fix output word > obp-tftp: Make sure to not overwrite paflof in memory > libnet: Get rid of unused huge_load and block_size parameters > libc: Check for NULL pointers in free() > libc: Implement strrchr() > libnet: Get rid of unnecessary (char *) casts > broken_sc1: check for H_PRIVILEGE > OF: Use new property "stdout-path" for boot console Signed-off-by: Alexey Kardashevskiy Signed-off-by: David Gibson --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 913880 -> 924840 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index a843e1e8b1..99e15a737b 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -17,7 +17,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20171214. + built from git tag qemu-slof-20180621. - sgabios (the Serial Graphics Adapter option ROM) provides a means for legacy x86 software to communicate with an attached serial console as diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index d46c83efb706e4664fec834234ba69d96ede3473..4e0e33f8297888ca8e143be784c30ce404f072cd 100644 GIT binary patch delta 231859 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%0D4jQz;;-J5%#X5@(v=sdd zs^j1R#>0S+NSUsn%^}A0_XDKZ`=)Wl|4qP2nCX8AC}oLy3xXH>flPu%ArELG zhk;L!0oD(Px)d%B;$ym0kiiC&S45cw8A3odiW&~T7fFkNnr^5mN{|(8LXHQNgc);+6ax>WH7v-A zoT5PeCb$Hs!+^~oP*MaHZ0HVc02OLtNvxpxGLXZd35yp}e+ja}8o5xP!^J@j32gR& zT0Yq9*#Wl4i}e_Eu|3ot9?0rBK~}Vm8(bW;aRZAzY<$xj>N&)i*o3BU0Ml|%T5Wnl z3x}8#8?11L+QSPfLmBu4+4QDQXaVUnn*N}PL(GT`bcho+^FaZP#UE@B!2Xb812s{x z$g}f6-Ob!_q$P)b%0FG2|K_0YzIxi@{GVlq4Zrw%R1_~DkwR^GT z58e~taiJw8fq*ypkj-GPf!3BYT!U&K!~SI zYvd3!0^h-k6sVwmc_4oaqGd_AxD9CMkr!2=iXf|%Yn z{X;K@7?bd%=>nY`V)eqHEB8RgLzFMP3|7x4C<5{%Vh0?f5M;TLpa`ga1`>y;M~H(O zXA?iVbppkt+QBWsfBB()*ra=@`0#Agmq(W!_9UTTbauHoU z=;$zzIJyO(Rt2a zB0v;WoPvCYZULyP1ri5a0ChhDpP(qHAqf&kQ!fT85kcZ;>g7Q5asL^j;hkfMQG9}O zprvkDG$?}>oP$yYngzX zJ_Dbi3aD7coJtT>1r>?d#37A-X+c%cCU0yCI>0RwBUR88sVHWeRs~Iwg2d5$pe6vC zT@jTQR0H+Ou((vs2JFRpK{eQz3N&o^L900#_ypBZ3sDAsQ2PKRj#`K^z}2J8Bf-^! zdIebWv>K=|44R(ujYG&t4Rk~t$QMvIKth^NPz`iKBS;+GcL%`jK`C`m;zRZvDEJxp z1l9Q#ilFtafmUgOHDt}%ONJE4hn5-`l_J%>Y)0Xp!(Xt`k2(az!^bG z9n}5@*$r_Qyl7Bg2Gzd~tlvljB#$LlH9!NESj06oz>(rDs0m76*c5<@FytxgL@#H2Jq1uK$=p@RZ~nvlMulqQaLiIxmlzmb*!1GYn$1hqiL z1r~F)Qot38krrt10+e8&`2-fRTA)?A*u>|6?PJn90Pe$j3u=Lu-GT~4bOS&GZ&*^5 zwhQ*Yt#%B=VC^~6C&Y7#)(dK*wPE=|QNq9{s12SOMijDeagaO~3w3aGF?4YFTn9YC z3~Hf4)4Bk(*3yAZ>OrFrE)HrGV6j+l0ywQm3+jQI+n}a3S`g`-0cR2>{RU_&*8p_e z5praKdI$`Bf(D@GI~D^BKsgkf_#d!=%z}msz=ac&;Tf<~m<0_VfMuiwjX+H|ELx2s zAZ{|sf$A^4*!KFbpU^2teD5R1uW0xW&_EZZUs=f0$i*c3%c#VI@m4f21;RAqQ&hABpTg5fTK~$9aNEEQRglI zR+r?C)+mG4KfnphYHJ9AvHtsC$5xh67;b z9V{}S1!@4SsSDBwiVT=IX!Qj)2SMw-fIZ-nJy|daG;)p{QqZ^v0?|m~+@NZafln|P zROe$82U&z;mgA%_uT5?Ce; zq9I}dScX|JV%78uAamDEKLFCm1$G!yq!`3okvh{A7ITO(MH)f8A87_rW&;%tf(nO0 zgu&<4i82dDi9k({Qh|6UN^82q5)N@jz3CekbBHr;nqC0nZJXWz;(dWCj&^}DvLL>T z&Vx8M8WsrAr=}Y$E`${{WZ>R^NVH<0wT@Cr2D#`sNt01B~~ zB&hN4}$IOCAY=hXc3u?>FG+log2M6ORh`MLf13=1OK}?I&04rk_j0>7Bu$)7jF>Lw*5LE^- zEv{<%1CZ(?Fje0ms(yjem>5&M7$h3vr68uo$3WG^H$nUs-v(6(%?$CYAg+st#b|;W zL}7x~^a(3C#2MWn1}1nx3{2>O8kn#Ns%{%Z-7bjx6823$0Md49`hztbVoV9=rmf%* zV@ec*a1*5<+=A%_W}qyZxMq68eUSVwh+&EUAg)V_gP4|-260`|4oI3zf@axdNYpST zF99uN7iAVqf#%_q3b6B}1yezTs90JksW#IuJOiB&SvI|36^A$@G^7h`Jl!VXaoSQg-`&>4A{g$L#D_D zBFHiZKEZ-p(-&;u5NG@YZj?z27J`GEjRHq!(%)B?#mVKMmL{?|)WziuV3*aGgVGEZ zmz9IscUZ(LK!fDi#Bl_D1t?On_^<*J^oTVEIKP|z^Q;)u<{G& z?m|&!!72x6PoXMp`hv|IVp3J0w2GyGuc`veGgWm>+rlBnR5cAk&6>Vp2Z%dwy1^EZ z?gb1CjF=~c30AF|o&eUiZ@R-a4spgq(nB!kTjeiF*{?qh;tsqx@o8GX4L!6NbY@1XyXk-wJZPgLb(ybcO z67&|VMr%fiK!-Z2K~ojTr3_3QM>n|o6U1HB-$3pXld1vj=Ebrip@t9SFEOSXA+X1! zY80@ZYbIEu1@Tyo-t-IGIK=8}KR8fK42f`atf7wA2_xpeecrZ5R_S4l1s( zbZKfp@y5(B{pnT?L9ZH6X$LYCRGEOz6b93Lf;FIIibZp+40g}edO)M0HV6`GwPBD@ zs|B4>g2gwrd5}=6ErNtvEohh+o4PJYsMYp?Lrtm{lt{6u`vpnNwg140nW>HmoaCkI zKm`ZLgRoG84t~^$f%1S+9ol@e2uvE3ld$-|4pNy)LuSgcWVQMw(?6Wy5c8^sr8bzo z&}pN3w8p#$OdQnM$6{ea(ewkmIK&ytrcVG-b<;oW;t*qMXqs*SrdL7v>!vsC<`8F0 z11T0`YAl)tl5G+J4_z=dO`2Y?heLci{~iu;re?WmdpX1zm8LJ)!y)d8wh~hu)GKA+ z6KqCXi3u0S5iHH~z=kdY8_IYJ%sB^kqEQPhgrNZen&SaY(YCr(D9AZo@P%pPYz1*@6;^mfIP<6+^er>q~wvMR1?9JZgG;IvG%|%$b?|{IF$O-tHt<2QqRfKr;8lvE(t;g05^cvJ&5~!X3rhhoVAub7WB63K8+8+#jf?YCT zhe&mS8gSU;4Z!k7U7#Wsso4Ol>$)YbjEZ7Gs36KL5 zn(X>PH6Kz5CJD`>{h+~0kT^60!NoxzUj4w__O;1isPwn|6@G|2!Ghb;C*EDDeWRpB5BSXl!N61WD~I$NkXTs_Fspfrx= z@rfGK8xlE0r3EK~G<0IRc%s$x1xGo=>L;Qm1{OO|DGqW7XjBC`Za_o!AaU^g41CHF zp&k@+*c<|C#XiPjKd2V;W|)3-K8GOF#0}FQ9N`dSns{gW0UJ<1Y~rWs6Aps}zD+-H zm_tlzBB+Ch#q>!rU=8(xlhEeRB%#IBB-k7@C>R(R7~tZd4mmahL6hYmZ$ry^NoZ|4 z33afN0WJ=TP?70ACpna)Btb*M419uS<5SR*j4Ze}!6!HcEy=*eK}m)Qv`!J~az1EbF$J{84okyu z3TXZb^U`j?DWEgsv4~Fvg$hy{mV$O`rXo*4sDgY3lfW@YJJn&@Uv^P%!Kt9~8ZtS;* zkQjoOHB({f9URgOaPeuNB#I?DP6I7=Lj(vyJ!n`1B#v$lXf%hBfk6v;EhXa=(8MSM zpWrmmvLU2Zb8zuF(=YsF7flwN2HR7I=Hh9vo)5ZBID9w_mebMIgYQxkWfq(sGkt;+ zsC=Ie8rT4hGNHxI^c7$yF$+#VGTot;LyT$qi|GpHpt5xa2Si|o%Jc)E8H*VXP<{qf z#|+4>4{yO4u*?ea4TChaKA(ZsCWMQFx?EUt$c!ss$1)4f_yDnLCJ&U>0Mqp|K}$@q zMBGeRWdm^lJmO};hT+hHXC|n!S%{hEXTlOB#2f}`P^*rCPjDt=`2=EX9b5v(`iYsa zJPk7lWFg2P(6}8aB|*y!X_z>u2a6>{W`Y*xgB$^lwdr%5I5>?3XFgzHU<8$@U_nSG z1NAdz!isUIrBa|`8f59G=?Bhmh$YPgjSsHI^z|&XW|tJG5@p~MoQ2ltfs2Fe#%7Me z^bPDBqTYhDVEF~&5O{RVf;Ak`qGMJKb`Q;305(usa26;SK(?a!c-9lBg4v)@z*17o zR)Hj(*`R?nP=Gp zc#1&=nwaLmf*;~32Do}y6AmU0QxA%csSMLa-8lr91?MDzU6V8i)G@~98jx2(ooRGm zpcZKiGN9^`RXbxz62Ah3n7#J9_)LwJmfQzN1IiS}2GP-tT*E9QbKF>KWd+D#419v~Emi{5`XMl@?Y7s1f zJs-WigGTav^zsfS4r(rg4<&=9B3RpI{syook_G3Z)hVDk3{W9AACydxN>I2ss7}G= zGSE&?EJgkNXVVKZz+v%j`hpBl4LKiFTw*a{0S7p+m<1QW7MU!F07nJ0-~z~szk0z1 zu<(LrMQKoZ#K0%G08()v$_tn{sNTR*gf2i^0|84<3t$IygR&|Eq9wBcbn}1!Hb=jh z{vi@Hy|7RK>ehuC;1ne-xDYgFg(VFx1RoqF$|SgO`g(Q_F=@etV8b!%i-j<=7s1S4 zqyRO05e~B##Xz02s0HerMRUN3RB92Z=EIV$7Ttl$gDN8|@{3`1FNWC7EV$SJY_zoC zVjPZGJO%2?#h{&XSVCa&5lAjv3_iP1lv!}`AE=Hcpu?-N=vZO_(Xk`}Y&Wyu67Xd_ zqRfIz8o*kox8CItRFVSqK^XW1m%ySCnyujC3m|3T5=b|wUT_I$U=B-twggm#W6AqV zK_ekp)Gr0K9k8hf75$)%HPGw_PL>ROf=j{m8z?Ym#D-dNs^Wq?VunZ1%83O}cyaB2YZBwlbXrKqA57y~}>4S++0qbL0b^=`9F$*pS zpWY)XEw~&Ml~}yCJOtF&5tCXDI`kY%Qd~X-oW-OCm*Ys?%a4E+Fbgif15TRKg3Cci zYhW>I1<&*iH5_70D^$P=nFUw)fRnek;0jpqK_gHOT3@UH^@NZj5H1dCXMvIvS~^=% z0`6RU3$B1w5HJIwNoobGH31DbIhZ(TAs{vb4}iL$%z`VPKszTZ{(vhzZ^4xyt3ghK z*#K=ltwd|x%E81zc@>KdD>bG+VBrw07hH*>69T{60A>-iu3HHUGniLk;y6aaR)QA8 znqn5aD?z<*C2THR10Km>T6tjl0zOdtdnG7VKsg-bb#Mj-5qyFxLF2AihB{Wl#(AJF zhiKyyT={LfLpj($P$7)P=2f8P43@UpD$xF5Y~nKD)NU-e3Y0FeB=S|Do&c!Kfj9x= zZ19Ngst#yuu0pLK8DO!t3ato&i-V?@vAKK;G&Wbk`lwL9%Yj0fflqK1S~~+Sj-#Ei z3RZ-{%mFo%LFT|ZWw6+XiGxO*u^dMxxSDDDhldflqKXXwn>u zk5+>wW3goB)dt{f?=83*)CU3?2z8+>DE)y91a(P3;!um=;-Hla*evP*mkQE?t3gNL zW3zD!*hXf-)fZqYK?8$WRIcHHs$2spX`}_$fVR3|QyBqngh>mo0qvFtt&|1@4>Wy% z+J$Q-Ourxt%ARXrbu84Ia-i~*flqJ^+TvumIH)O##hYtj{T8S>ve3cLHL!*$EVy9e z;89tm;W~)p_ypI0b|8Yn7iJJhA;>|n6azB|CJxG_SRAw-R0LwFW^%mR!3RqC^poQHAQ00hC9MmPkV&jGaXk=^vrAcfG zE`Sv<3vPG-uKAe-H)c%V02;a9*Z`)DHiGgc7M&YGEAp|3Z{mR(w8;cqH`Q+fWO)q%BA!f80ylD%u`%)fSGHr$>aF{-5eYN@2^b3zU#JskkO)<$sho!fG z+LOrcfR-;?V8a(M4?*qOqBrdxhnUe8kToD}Flngsx4;HtVd7BdZ?T#_;U4IM4z$q> zd8jkDB!E*G)0Q7#+Gr~%+^}@Dwt^xUi}*H%=@ZyM6AIfvqr})0fEo(e#HWBQtltLe zpTi>x97*6hY#Zpt1#J32JydMs;2Hw69k3lVNPlXLwts-MM0c=2bJz|M7{dT;M7`h+P!J;ZB49h) zcYubuLD!l=jfVJ@PjCllcnBm8jXJnEXh;bZ)ll_vpdL2^pWqI(`&|`a;^4+OC>o#! z!8M>wy}&h8fbL6U7TmD_=5kPJfX(HwTn}}L0w~TvE`iM$KrMueg9>>pGtE0eUc+Mk zPS8*u^Ykl^IfSHk!lqfEX2SBzP8F~tlLdEzGBY+qK*8`AGXa3|Eki99ahOFgPeF^g zU0Ty0eCH5j+NA@wkXdk-1vrL{1$V)!ey9$4P&Z4El?AlP2I2vP1c;BNy}BDT!GO&m zP=5#{4${ZKfG{Tp+>uHa+zlES0x3Xu0qD9gkT|+VP$dr%M^_I@3?OlI_22{IM41J5 zf0!P?3n~Zp!0IQ62@Hy$OwGV2xJPXI0VYl{rady?0hgpbkT8JNZ>z*WYfnJxK>Cnv zf{BBCf=CN2cF?r42lbo~g!lxoJxqJnKySXNZ;1tqbgn2CPx zh3N-gafli10|fw<7}|%Ux3+K6^oG|QVodvHLFswZ1zv*q%b@hC=?6Z5_}iu%yakyL z3usU=ZS4DuT69zuP10eHRK=lwr144og;^PBc5T729 znlA93LyYNw-1G^bL3G*l3oM*sQU~f#Xa5zU#mNCk1R5Oxb={FHhWY#eD3gN3q4vVX zA?FB53myRFHqc^Xv}WjmU(*+WqTs;4=>cCj#JmoIT25G^^dP9YicK6evX8~wgFe#@ zVnAb|2NR|Xh=Z#3gP@89_ln7L!j0q7QY=5nttIchnUeJ(1IY4%}^J{fed8e6Fda!9DvGy zv@kuS03I8VIs{UWrR#sl1w3ZJEO_V|IM%%mfo7UP7Qnm)N}?bOKr;Mhf!=TO#mXJN115Omof`>OjTzq&N)Wz2zk$(6VIMS02 zqlXO4W#}OT69EH9$u0i0VQf?#O<{#_TZw2Pw)sR zqa!Rph(iPH2sFTs?1B^|NA^Jqk|U5JkXi8PK5*Pg9Yq^cfw}bPC9u5LQBbQ4^sbiqZ8)PiR8F2p|O9T6>{updQ5X3nMc~I$rtPeD?46+Ax?3l$K zCJu^FWc467g4Cl%D2qKz98#mgyPhoeAk82RsDsZe_Ta-R`2>%FQUFK|%%LDQNIfV8 zfY>k(g2EOgjyi~jFb9${ptD#!3@r9A4UiZ&I)>V1M1%-xgd@byfkTq%7_60YoCzHC zOvl;467|PHMH$EvhznQ2^2l*e9}^@F@ex8CR3(6d2`!3`gF4wD_2}k+I@us`baOxr zTNcDIRq#slIH+ZdtN~if9tU-Du~`g?TabE~#W3}txCM#BEQX4o07W549ISr2%zF+l zrW2FEfx&cQ8zh~c*abYI^!~ZK{ThRwBQ-g!8M>`3ZUr& z&z=i(4Kh*4qC=D)9YVzh%=q}1`ZLav!K~!ES1Vx9Y~w?Tm!g~CoOmmGzNl2 z;kgCi+Q(b)9LS~E6o9;n#Rum=t!OOb=LNvEm9gM?P)3|h5_O?(2_LT179*C46o{4H?UFkQ$1`<+?v!WKwiUw8yoF#Q=L zC;xQWmmHi@7eRJ`3R5mfctc1&!HWx~Pk6#1#&q$?^ar4Mrb|5216VjjlLaq<*3Wfg zrku;5#y=LvU4eNPM1%J9K*xZtpsj#`t&YB81MLA{0pEEhYAkpK)N4ef$<-;)_S6;7 z@sA*JNHD_1ufnFCuev~ux*7oPOfw5!?U+8{4!dZ*;8oCuI4rKc3K}m5HOSF|<0@$2 z7gY73i-QJ^K~){pcd+2Q3L44;i9_555oX{MyatNGqUlraunRH^UTd3P@S8(S>Kdrh zK=Mcyba43Eg6Ri-v5PVbUONR=Sbq&<8#aZg&6w5Tox&j7K$Awu>Y>exYdBKwby%E0 zeFKY=>!2|R7SQz|5D9otUq>5+fNKDyC?tzvQFgrr93%CD*Fj||C<{OgWKe{TcwL88 zd(d!$i-SfSK~)@D_+LjGKve{l^$dK1*I|n^VdlWZL35Myu*?8lM?3nG3Dj5z8H8Fr zGQh<_L5a;lpiwAn;-Ewf^DxMM*h;YLpuQnU0_swj_zh6-VKL|isJz1_j$YV+CKnm_ z1aE-GQIO16EMQ>p1C^^cKto#C3<5R6v5A9LZ(|wuzp()vr_6#kAO}?>3*H1d5sS*3 zpqd`!6j-E#!is@U@FpmEfyALfpa>JkF}rnh2G~Y#!JDvFFVsL#iv;Ago3K;?H4rWi zstvK^?wg;$`OE7jD3UFoQUWK@n6y zft&>L0!SR<1%x;#%VY8SZIIVM>S5+Ulg(`jaFJ;&cpKzekOG*2Fa;n!mSl1pwio&~ zNFkOY_BJeQ!fb>tx46A)x&kw&n9*&}v2s{kdIv{K;|}EPLSw-@sKY<2b3tBa;1j$9 zYWX6?5?uVn^Z+(av8218SqzXo#6j@by$hPX0EvTq%D{jS2Mwu%#G&e8h1*@!HW<8+ zyt@Ew57XTP;8_bP!F!5 z4ugqvLwo`)9yKg0bLzP^F8d5qBR{reF#4`+p!UqX)2+X%9ed2BmqBU!nCjs7!g_0?wgK z4-&wGwe^AzKvfBrtoi`dT*Tt~2eA7)V6g-8B?F(}15h&tIZ&bE4?&h=G3Ozuh{(Yv zu>jnBWO}%1dI1-wxFKkA982gv1hp=(gv7%a;2^9Qd=^h2AEG-HD*gy$ z2^RM}0=0FpSo8?g0>mZ`%J{aRv0${Ie}W_Ko`PyHq>h~+w32_i0^IC17JQ0Y)Ueot zMj06R1fPOR3Pg}2#1DW&u>Luy@&{E)XbyP}N*5sCLPBPBJ}8P9_ynJW>R6CCG$F&q zK@P;?)8`sX@He!=mvp0Q`ii`k+{IOwt*ak=HpjrOJ=#i!iN=AHwZ(;QfG>l3?!XWjq$b?!17e^f+Sq(QIlu%ee zZA_?!e3%8OGhwUqLDNVe3qY&ikbMFZhqdCN4$23c$0zs}Rsn+f46EVdphi5b>;-K~ z1A72u0jST2C1~Hm4x@a#VY-11rx?@QBjEDfSnw^VDg!wQYIP}y4KfMTuL7~5R>Q?# zKx>4z(DMA9!}Nwt9AZrGe86=5JJ9?!NF&TZu-o_q-+=}SLEKR}? zn|Gi|K9D#>JwhB*q=3wUsE4P9caXU!Vc5V4LgEd$xMdc6_Xo^y7JLs&P%tB)dGI}C z>;*RF12^G4sObi>5}r4w|B&RAmxL8kFkz^V-m6W&AjT=i^j>3nffA>f*L#pPAnhQU zfnjwysC~u2C-@$gY#}~Gh~uaj-#b7m#`iwZChGe$;4GIc_#SmMeswvhk^tEN8WRTD z46^|y4yqwR;!qdCBKJM0LIR0H)x*R;aDYRuUho6zs2V(kKA?vXG$=lRCMZA#LM?)o zb{|0P7?3zD=%6w10i+Hj4x*8=`Uh}OfpQv50;U0$#bE})EQV!qm^e&5>SPx@q&|R# zt3eh+eGUu351>6Bpkx6`GSgQxad0sUewYCcc4om38^9~}k_A72`lwi1C?7#F4H{qs z=?1$DMDPiI1Py|NY=ij*B+S4k_z^Zx3UvjzkOqlEb|cgag6}It)(Bb;0#X3#harnY z3!;ypOoSv3E73lJ>T8fV)FQYztSJK(hm~|6!I=&e{xAuc1)$zM$RL!nA2bXB@)&Y4R1ZoKFb$xlHpn0_pJ6pz1858xRy2Zx6-4j} zegrk$v6PG-L2WINIZzM4lKe+lWdt=JBo4YwS@0969fYJIACy}e_yj+}vIbNGTwDa& zM*0Lx^H7`0L2Vz9Mp!Wd)d&~2fE3lAe85F@vfw9J?SXCptoA@R09JcI)q}hMYG8kY zwLzfj;o=3*qWx3LbOQxWaYo4b+x3E<(Q+{?wS0#82xbr{s2TVKKf`fue0&!9}q3@WoA79b>Cz|BXm&!C6~#RoKh34$6+AP0cvdXVA>R^omJ zwP`@&5cA+A?iU7dj+Peu0-8F(GNAGWasf=e;1|%YVQdP}%9T>6OTM6$D{yhtc};{% zP^Ux?;-KD^Ehqy*y$TL$20p>Bpn?rK2%ufdub`3vSsd!1udo~r3G3Cc$p4C#Vd3J) z8CDfkdx7EuWHBtq!om_JegPbo%z|HEfEo3IUtw7ZY9%aze*-xW6dN#cP-)4)C-@CE zH3Bmkno+)i%3+Xtm^e&5EaySZfjRvfxKaW+3#tJwApu@M&n);&X?lVWNR3_p z4OClTDI~sub|F||4#j^%PiG*@Kt4cEXE1Tluo#xq^9@vgFoA}Bp|L9njm2-EWsjg> zLKFWEighdw{SMpm^BuW`2uUm8g*M-DG!VZ-8i>Y%-*GhWzk~aXm_hLU1EiGt!2&L& zm<4~RKueJy7T^wl{SVOg1}vWbf!uKaB&H6lZRRGCv1rErww#b{Z9`D21YFVGJb-> z9E(SPg1YC}#6g3qAgf_cf)4Whge{x_rAAPWgNcKO*Fa?eOao|{2LqqrPgo@k^8-vA zly?#3DuWVq=<+A1QU!@a)FZ?}btEXMg2DtT(fmZtz@SRF9O|N9prncH1E|HnKn8%s zAr`ELtA|x2FmafAP=x_<5X56F_RyUD3)I~Qi9^(b#le;EFHnCU)K~>sgyhm+pkf%L z0b&q?3TOz2flu&P)${{lpgq37KyiV^i@!iQ8KDtu6R58I1Uj#X$`#kT}F5 zgnCf%3KBvp!#{`_?jRgOoi*tZAG7J8NjL0(!{vcAi6#2}-h#x!UszucS~|dD;V-1RWfuJV18UVj zn1}w!z(gFN9{T48G3*~~paRXXe+gh6(t`hR)EEEipa#HtEa(Qn{QD2$UunUApjG8q zs;qyI$t-5Ue~^ZQwBSEbj|rPfNX#+|{)ep2_ZIvQY8hZr`5)BK1f^tXG(nOwpWuH` zc>)rLMiX3o64*Ch|3SGORBoa9=0DmP1uV(@2bJJhqW%8{aPTn;{)cS#WfuGo@f@?@ z|0gi1cVIiE{=@p>sCEi5h=6mIu@Lw?9grmu&#>5oJk7u-!~knGLo_19-KHN<;1p#R zVn~{%#wnUC!~ko9LJWXqKOqL}*;0rBG=K-nB+vpx5HedJ!~iN-KqWO)92$B;3==@( z5+I8}!2t?Bs6`c^A!d+EL3tS@4hiWw zT1f`-KE#`=D?r1E417XNuueO~7KAvc4nbBA4Mrw#Cmg=o6CR9AN2Wh8;}lC`2E`c` zeas+Vg2Z9=K+R)@wWrbC#SCjt!_-6F%M6+SV-{jI0u{ZY%tFj&pu!i#h=3FQj)NFtcHH!g3hQY?wGKE}7R&H_!w{D)TXD>@uH&i9Caeyn~9cut7yw_+TPx zFcCeNh#O4A4=iFV!~(kV1+xtx!~$v?V3xc>EK|UqGZtdOUU3SsV6QlZSjC_@kyQ$k za9QO*30F*t6_oIiLkHAyWZ)BGRhxbRl)zcFKslFLh}943cGfVk+nI$}lb|N0flaDs z1!Xx=$Msb|J9U#zO3{MmfyQ(8S0N8{I+kEIYVCD#|Rx zt_Fz)b}ew?G!|k9)kq*aVJ1P{$POE%g^EMlg+lCh;P{hbhs6_A9u`mRZs6=t&kmkv zL8J$`e#k5ye2@`V+_S@4HBj@)A>9lic2N9+G6h7OK^0oDv7-&3!R?0(pgF@Q1mG5f zChI^3K>`9vkHBh0(-ZWi75zJ@<=K*FR_O9s^MqNc2JuHSv@pKu`imwK!a1XUWgq%%|WKSh1k(*V|eJGS396w!oVlQj$ZA+ z#6cqhn0+uIc2JRld>Ne*Xr3Nq5Gai!g&JHOG#`kiJZ1+C<$~%oP*Mh6+60R((5wc? z97r_6%RF{aaRL$tgjxwb4NSN=Xkn-b1ICRALY$kR zS%Y&Ms1~dj;zW&a24$GZu=s|W3>ODQHx?grfqVigN}w)>B?B(dQZdZ&86hrkXAjY5 zXHbTgpm@dC(I4MJQU(B>i68W`gUjBy9b;AR02Fc}MRgBJ0Dx;$vk;s)*D z!aS@?h#RulR$7P~bYlSK!6HK3;Jw$P%tG8-V0K*qoy-Ihfi67};szZQheaRBn}H}m^dg*v4k}b=-4T2=7Yl&R8&DNP=Q7!4_cVQ#X&>- z*es};Zs5o%R?h?KfFe5#G94qt1M0+J(>Dpakq>IWGH8tq$b)Ff6fO>u$7T-b+}TLb z1|hU);{g?yAP2!L0HsEd1&5{!1c4k3TDXDDz$;jf_7mbkOZ_U4;Y}eP(9S84JbJSb+kyKp7?u>VIPK0Iv#m5AcG_g_|G3 zz@QB3M>6mU@uH_Gm^h9!#fu|N@u^M!U<9i1_&}44Ae*2rRst1O417X-=T>(=Ms`-%2hpPuIpZx|ZC_q68DONzE?LvIu)DG{DGN?ck zCtud|3!$81^?b0z3w3}BWY$xN542bZ$s)KoYHOcC1vI7t@*t?HM^+CL2es-!;xO|; zX%D0xQWGPNa8-dxpeHtH;^jk6Y*2B2P(^@b0c0%-pAbJNAVA`f5M+RhgQ_@?IM_k; z3=FEE2{#5lA%4)v3`hc|0VWQM3a|zScvSF%q5`?~1C1hnQ27or2cn)q1+sKbh#%JU zgPIQ(uLoHSYVE3HjG_whqYau=fYgE1gQ`oA#SjY+4gyt|AaRHV2yyf%hNdz8HU@@z z@Sr9rwS$@tFbhEKK#&h01~GsxsAm9K3@V7QITTdhfGkFL5Ns?2Vh+MVh%^D3N?>46 zg(fY3G{SnPAPbS)BLtddoQ|0Xgg_C4Yz{Ph zgh9C;Bn}H`m^f&;HI@alLc%(ronK;7!XS&W_*6Ioyst`HNEo#B;V`C4gg1b_#v~*> zeSHCkn30e$Xk)-_=c zz*|TZRM}whf+(m2#G+9Yw1Np#Dnbo}8t~A0 zy^uJ1`i6$7IC}bqiGyk@06^ z>Da_U154P%L6MD395mVnT5$!6is{*+99-T)QXmh3f*TeM&{9AOy-Nxc2Q`SXqys6) z+A?V&DNreZMS(O6IH4E|NrM`GSX?I!YQlqp4CFdU@&dPhq&21|h;oQ}3rT~*8Jk8> z(gb+}s!<3UFVdj>q1aq<0PGTGAsL402Fx6y^+GZ*&!Po_49G-K;D90klfz#`G67@`x_VGclLgd`LDztz$d>^PmSFLc3}n-Hy^stn_dso` z0HrksJ|P)UCl}-bs6}vb&{zeQFqH*`CrCY-IkK>jLNiB}hk=1nak>dJhhV*stPleO zBj~thh-PS9@(Ia`LB%0i8zBxFA_N5?x_VHsfyB|(gKB6{v4XB1R6}0@H3!f&fWjHH zKLcF@hz}A+R}TteWZ#1_4g;T%ENr9@=6jep@<^d7D4~E{4blLsdtn-2;yK`y$1EgU zFwK-x%u5zDX8@|sK?x2TE}+($Ea+fbkZ;k&L1iB(bkN1;fX8{Hg=9fZcPtf+>=AH9 zQ!gY7IszVx$#S6X8nV}+NnQ??4dO}$HBhz5 zz$YXR$}S*rXaazXg9cJSBco`Jlm|8EK!ppG$;IB3f%DD^6W(f~*t6e^&^s0OnDZQxrC zW&tP-z%(#0FsQ*S0HpyWakvGbZW$;_pdkmzIebEjbEa?L1o1r!osE&zi0f z$SEeJ4DuW(N+1eX*MowUflo*oa#*{ukTU4NZ7ich${;_0=CIIWT=@lfay3~<1!O9g zOrQd?0ZZ#b1xKSo1=OejRSjqsshk1rPZ2d1QUSRFWEmt3R@XyEbyYw`4M-g3HJJDv zm_}Gt4AYniO16ALDxhdY)(8`S1Jekb&xC0Njde2c38{k00%VOaaWhC@tAbkJpjd(E zW3dO9N_;}9UegQwImMV%gQf?7B1IK7S0dD9O<&;8DORrv%AFv4Am*&D2Xz%d_JeXK zNE}+!!^J_1en4)62B9#tU8V}o6Y$|Iggv0X56GR6kVA-rnw&~lhWJ%`z_lH-km?L@ zttKs`3aT7HB@NU{P{@KxA~icmP^iHwc8C@5bf*UC^GXS+gN8-1l+o(b-!pTF)eEVE zDsU{xOC7XI6mw~>kOs*AAU{FE4DKflSk{9$1R)LzLy#lUJfH!(^HK!Vv_Y2u1r8`F zqKktn5iIFl1Jr`V;sFiNunm?rl?G^iHb@-gP>}twAk}~j1T!$8S*!_amVgc_h4>hv zoPkeB6V%uMiGvJ+ih`m>Qwwz@T@4h%AoZ|H2&x_=&IZg+cBn}Nph*5k( zTA-2&mNr2{tKh`Xz$c^y>Y9Tjpc>%f4?rPrqzxKa!{QNbP=3cI{$TooRiJK`_BUwz zAI*W36_Qb0X z8qmgKfj;yoK_UGa(*t}!Z94rG(-nTOi!ux8@0j|5LsVKwAJitmru7cAlcoP-`h!YP z0yF@X?x5NbEf@_ztvyfaZ+psnbDTL78@z+#XgNDNDE zFog8al7$RG!Gk5j3_e};p$;Y<6%1k}?&Ru2=04XnV_ zL+v*K^+3Rf4Wc>B1k@J=83fY+4Kfp0GXka_CJst-psWm0&!7&fy&3p~Oh9Q4Bo0c$ z3=9bIISdSppke@=t*4)n=HO%>AWQ;3ufeGC2Zf7z>$z+VCLlFk_)@XcM#n1a+vm zDfEs8AyWmg3Cu#KCSXRrkSTg|9NJkn1(hGjRzQQs6jXj7i$fbsrszI}Mu{nUZh)B& zP7HA)(csH;sKjQumT365n&OiHx4ooYLNzL`U7MUsM!w^hp1V+&}eJ6-p;eN1$ z6*aIz5*oOcpdtkn77#xm)PvGDmStO(plMZPCqYvUDDD`Ludak;6e}ID%Z!DrK=lA9 zv>+~HP=}6&S%K;SkT}Ez2yyV;bE3>bRx6+dfYlywW@Q$#gY42~7P1q7O4&s~7u-4Q znEpW&R9-urfHE9&z-sD++(6AnkVOy&u-JnVGy|WI8>pfKi9>=0Ar5mGx_VF$V^a?s z{6JR^n)qb~MLW6$XbUzPp$XUxRC*%C2~6DM$aDeFXphGqFm2=s$^amB5DQns)OmtJ z8YB*}4=(PtW4eJEC~SNjpkd?d0N$CxEacY%4J3b1W&?Q+VkUzIv=;M64Lk-7XyEz7 z0uLH{aP^=(1~LaG4pkorDyBd?dLZUA`GXcqG4Kfmf+i=xeRqfkxI~c1^bN6`VoX6M z(?7(6=m}u{^lgcpg46fMaWTL2`&M9hFK{1$8>=>PBEqs6Nris9|%8m z&2)p4pnwSdFB~DBPd%#oCU2)_=Li&pyCi$A;cqK8mB=Oplh536-UM)X89pmlB-C>0=wAWZxQSR=Dg_>Jis{(*W?5jtQ-y-*~mOh*db zaL~vo1D{YNs7MEiLma~d7YEH&BV}fBQ0Iz)Pbdl$5=i1=plTZ=4l)l(9IhVJ_C!->w_!^U>1sA0bV)a z6%8(G5fl0_g)yN0#7G9fEQkSRPb6`;ddOK;-a;{;K{{*-(28!jfjELT7P5)lSSS{U zfw5>o12Zu84d}WuF{wCEp8$(P;&i}?K3OOZ)b~eH05c#CRH-0~L*pV2R9hj7LnAv5 zEeK(87Y8|Os9q=@)K}jAKrM;~&4gl6p8y)#K^BLqPXLYUGl9wt zXljE+Rsvd>!+f5|0uH*QM6}ce)0YTpwPLX-5wtKJNgSp=2~@TsiNowk5&@^u`Xsa# z4oqJ%sE3B6PaKrZ82E&e(b5oHJ*bZeIvNG7Y)J-9KY+v`*%@9aC4&N*32BraW>AU= zw7g510b^_c7b4O^sUY2;q5)JyfQE6Q?SfQ}=^v(Yic5m>3$iq5O)&$XP^tt(8Z-}q zB+UZigQPVe(jW&SOM_w*By9na2Gvi<($FSuss}_GG@gVc?GG{yq&os44KfT#IsoRh z42U$S;zE)R1O+lkcLhWm6z53NAt2L0(j5?KP_rLNIuvI242U!+l#rxBEd@{$HgyF= z8srgVY0#Vo$nYHyX;4cTNje_L_VMIA^s11t+N2}w2vWD`iX0xSzs zi!2KYJdkV$SQagoV?j27WM_b7(IPn(rgsHc78EN;Cda|_?f}bz!WCH-78)nOvS=|J z4{{~Q-Wy<9kUdCx6F{*7l6?V|1(}2_3-SX<_Q&*u*_aWW2n~*O4u~|!EF|4YAU*@1 zP`U&}8ZC;Gp%Ia;0g*kZuczG{`O_!;?XLkhBLx8ZDMnpe|33fJlP^5J`6$ zOm_xE8ZDmFLCQgfS3smeL5QR~6XvlFh&0G9B$n8ztTU3?x$Z4p#$h5$s=9V}W5@*_yC0z|ZY9w#3&Ly5rjj(MEA+~Cdqph76a z0U~`Jtf>s9DF7nMJ|AR387OUoj7orrnuA5lL4E{@7C=PP=YuS$yfD3DKFES9n5!m0 zq>qC&)xk6^fQWtvi#C9=2gs-m5K;97AZr^yAq5gW01*ubi#EcXcmX2Xz5rxxi^236 z3qaO(z@$Gwq@RN|b%N3Z1D{YP!}J3SK>@cAWI-1+I5PzxqV8bP9;m}J6(FMJ5K*YP znFbKiIYK=rao-qUjJ(m}ZfQTMn1hRH=!1No7K-Nxy`D+72T75Cd+9{x15Ay8+h-f%ibSliK3lPzE zh$zg22N2Qii$NAlW0-zoG01{xP@}RKrhixh3b-X83uZtwM3w+V)Ez836DFzv5iJLc z&V~kDmH|X`IaqWKG-R?IAfnfofUKQ+Vfu?DAZzDA%ZjW7h_v}qkhKe;i6^T7BAN~s zT>|x2Rs%$II#_fW%!COL(c=(Nm}3?|M87WuS-WzkmnOC)B0c3Q&1aj~PjR4@|!SR36m)MwW->xNHZgJZNGONq!$pJ^(5Y+U$rV ze-P@u>;$MhXt*3%9_GFRs641Sk1P)jz3c|4JgC2cB!386o@Y;h%7X^8kmQd*(^~cd zs641&f+T+w=Kc*(c~GH@B!3)KF9+;T1_lOW28QV$Iytyx_=IxM z(!vF3Smi*|LJnG5xB!id9B5j|K}!o4VfvwIAqOojT!e;I4m2&~prwUNFt{O6&?|8Hpe%!9^%9$NhWhQ@y$H2(9@;{OlKd}#dV zp~e4SsQ>by@t=np|BTEqd1(CSp~gQW_|O*yKA}8l{O6&@KO;Ldedj^rKMytj8M$Hd z(D=_ojekZySolHXKMytj8TnxTgT{XzYWy?u!NLz3|9PnK&&Ut+A2j~+P~)EwbSE09 zF35w%e;#W5GeU3Y5XytbKlmCAMEoD(D=_si+?qk{m}T&M~i>Z zYAjIrA1(fMpyfk8H2(9^;vdx20_%syKlsdMB=_q>+h_UE_|Hd+e*>8L(D=_s zi+=-X{>X>Me?D6L8^Zh#jsJYK_=gO*@d@Qa<3ArQ{*7SfL*qXmwftuUPv|l52^B!& zzW_D=Gg?8@cL6m13((@<2I{^7X#5wT#lJmFKQ#UeQ1d^dBh-Bb(D*Mvi+@*W_!dCp zzW^=%Jz?_D_%A?<|3GN|DuBj+0b2YALYwsk(D*Mvi~k^K`C9;u{{po99}M$9H2w?F z;vY5~R{)Lw0<`!KgVrAf(D*Mvi~mSy{Z{~u{{po5kAl`;1 zQPA)ygvNg%TKq>t({CX({tMCKKN{-3LTLOKqQ!p9de;PFYilFgdgckql(D*BY#(xo7{AWV*cM&xHi_qdf6Pmt?pz&XX7XLZW{9go( z|01;b&xPrS#(xo7{O7{-L*u^)E&g+1{)5JU5nBA`LDNSOH2#aw;=cfzK8m36UxXI_ zh0ypdg2sOlTKpG7(@zmJ{)^D!zXV$T6hY&^2rd3AVD>}fzX&bGw9~%E9Xz{-n z=09lsm!QQzXxbZWJ~aMI(Bl6Hv~Dbc#(xP~{2zguUkZ(X@G102ZQG;J^i>Lt|5CL0 zKMFO!6dM1fXz_m(WvX zaurbcltSab6fORbLF=|sX#9gOx;@&Hts)_%B6^|8vmts}vgl zrD*Yg9u~gP_%B6^{|hkpLF2y^E&gF+Yo*ZmFGY+03o!RVyDsXz~95We~c_%B0?|5vc^ zg~opwTKvC(mXBr7_%B0?|2NR|R|bv$GPL-A4|5+h{>#wf{{t-iq48ga7XRO&`KKHj z|K(`${{xzS%AxTOz61p+fBb@`&vIz|m!rl1KdAr8q48gi8vjfzQ1_KXy z;a3ig|8ms$X977Fl)uZN@n4P_|4iJ_`mY=s|K+Ih&%_4}zjA2&m!rl%6FR1S^*a@6<-uQ3I?4;ugFsPWGv3JZT|{FkG~Ka(gde4z1PjvD_=Vle&C z_%BC|erOWGl@gaTffoNV(DJte8vhk& z@h=aKKt7=gX#7{8#lIr7e5-)Qe+63nL+>ULs({9S1zP;W4)?5p#(xD`{Hs9oM+G$g zE70O!4H|zH(D<)Fi+^=!`mKP*e+63ntHaz6jsFU?_}7G*UkQ!>O0@XbgT_xKH2y2m z;$IIMzLn7UuSAP~*w|PlH2y2m;vY6PRtb&&O0@VlfX06%H2y2m;@=QjKUG5GzY;C} z4Wa3y5*q)NXz_0ZtzRmk@n4A+|3=X8tAxgXC0hI&LCdE~X#7{A#lJB$ek!5yUx^m~ zrm*mZ#(yPR{F}nehsJ*;TKrqU!Ur1vm1yyA0n-nS|4Ov@w}kq?3L5`aXz_0ejo&J0 z{8ypHKWuEU3L5`aXz_0abzc=U{;Sa9-x_8=H2$m5;@=utepEr@zX~n>ZD8`y_^(2X ze_Lq&u7bvY6)_{;SdA-veeoH2$m6 z;@=ZmK2$^FzZxz6y`cG{8XEuAXz}j@Eg!3)@n4M=|31+4R}GE-YP9$dhK7GNH2$m6 z;y)Os9~%GFXz?EcvmYA&)oAe_0`osK{;SdAKNOmNs-f{;jTZl*(Dq})>d{G{gvSgz7#ik4kV23K zPz)ez0EGxh{Kxcw6`W#HlR+LqmItY4;1imxF}-00r&#@DPzpnm2QTUc$%A4NSsY{z zNF3xbWN}c61BruT3RxVK(m>)M4n2{PNWO12<9Ah#jetp^iF3*^KD(;KdFiW$P?L2gIVX9067$Sp|XG1J#y;}nDaNG>QV){fG3^1TnATEI5=2s_1C80Gpb$b5H}IIg;5w%mla9dj3)eZtrmyqk z;$T|(Vfu#EoMO}2Zg2`H?S$$CoxsU}q*EK3ZI=mvEnEgl8c5PG3zvb?Ad7 zs|O`f2EOU4_c?_EK?NR2FIph;f&zv+uCFZme6#B^WAg_Yt(FzD%s5t1<1_osH zbEbcI$SLNf3-U4ppU^5$Od-pI%mImm+=J{sP!NE`K|zD0UZ7`s!y``dKxk313X~v_ zr9s{SX#+V2**K8*LE@kUfuvp#>fKcZ(^hhcIjsVvWn^iPF(7Rq*B~1Qb2VB?BRFSz z!DCLbdOc_%u?mzxkj(?7ZIF4OSVA&S4-_gOaZmz5QZEGB4G0nkc?(%RC{#e=AoGyb zgS^MUr!BM!6m7^FK;Z<^fR=HD)=W=$!YQVt2hk|B8ZDy;K|Q)!V)}yJoMJ+&LD7U{ zp|HyI15Y@`rr+Dm$x*)=Etd#`l0O5V&}y`LP!AL;AaPLWA{z$UWC;=n=|grrC{#e= zpfrT69uz7daY#uvz4s|6rx$E!YBeazkQ9qRi^(IK`y& zK_LQ?2SpjOc_q^wo^gszkGsvu;k6p%5@bo34?&d&l4bg!5CRzniXLS3po3sR;vc4e z*uyF2xCWGdkmN<7>0=GZG05hDLWF@&XboDlh)$1x&M9865ArKW8WaJ@#)13-5(lLU zWaFUDUIR)ENb1Ev)`HZ7tV320@-|2uE!&8J)Pa)W8c-x4Yk(%FHE8)p?9B9r7o1}C z;FGgJ27(-d6i6N|!X#!) zzwnY%EXV-j5TUhbF(v^GxV0enAlnBDD3Ey|dy(vu1f4nq5-*s(;Q*(Y&{|MLAj|KV ze&7|S*z`UrE)J=+Xh~ldn%dT`n7-g3r&!clP~nNBSr+67kl~_xIqUSfK}TTZboBTy~}sRyNMBzYxhslN{7PbBvkLE~i|s8m5# z4{{&K9FV(^)bD_~{{zT9(?j2J3UV2N+|0lyv|a!tCM~ocWG0dx*vR*K1CYG1(0Wi< zAyzm3#|v~Lo&x0=ao#jN121C_5x@^E88Ngqkv6ck7xV_$%coqqi*C%=&is67A@ z1lftC7-l%=pfHqj#$nnwPBAW1Xg1me9kJO2N{~p}O=e6__=XgMn?PM~BzZ%J=@Y=_ zKqG3C2V~@D6R5aEQfG2w`iF0vV$ z(*=HTigB5N3SN+7Zh#Gu+Ju%>O+k(a$-e+QW_sBVP62qz*n}1Fhr_`QavP21PoOo6Vr{z1ae6f*@KZH<6g0@RL() zy53JtPD8Y~fCcwvP~0OM2}-^o`!m2sPCx#Wlb;Kg_BU669VLhs1%?jOKl}uR4k(R+ z^v(e5l?0VBNJg80tO7}|0Gl#B{1>v~M-hi0!9K{4s z1S6XO&9Iw)fa6LCbYl;4;y0Nw-QhPZ!nc5GS|rVe4$}*MbBb}9LnCyH2H244%YJhT zNST4$%D^YI1!M!NrVC(A&^X)@0M_KS1>|ugb>>iSY{8KQwty@}Ru4*zAp0O$KxhkE z_?t*fpYR8iKS5;&NF8PtIPeGL8Bhp;=rBFtFQ*un z1vD3If#ibeZGSlhq)ecZzXfCos-_KKP0-Z7m0|jaf1Kiip!h{nW;$cKz(1s7bSuaX zBzX%^sm;JAv{eJ59jyp5Ju$riMLSwnuz*I%)&Q{f>DT{p@{5>3%d4$O@i1M%go_29 z;kKg1gas%>K(45O7-RmQlYja=F)j|Ftst|I+-rVedcuEBvFUsdI60!Wf^0{U)PXi? zx1!|`&}qU9Amc%q5J|l`G-9`+MVQ`-=?DHJ2O7wENct>5aRD;#2H3e%)wy7<1xX+& zG`}!4fD7VSrma6fW580Nqg0Wziyp{q20o!}9N?l&Ya3dQfsGMwL#sUWJf=S25|e^? zc^g{9fl5|JE-^0H#QZjo=?zR=;?vz3x%k0>C$$YN_vnBu200`HUr~#DyrVx1mLWC8+QQ*}4OwJ)Mb*fBL?A zoE%KsPJp!=Z39ITl7(=GfHDS>xD}`n2buH&V$yLYE`BZ}kY1X$2$J6d?dtlbW>2H9FrFf#B7ZMOgyO4HlGhCvhJb`P*&)3>1rMnD9g zF(ZY`cC;K}1qvsSv5>NfX?p{Bx`AnX2biAj#)7OFEgx8ck|9Vlq(GX!jD<^J`o7hi z9E{tiuV2k6KK&X@z-T+Db%x{}xHmxoha_$dDmOqzJ^*`@Y5R-m3;ejmrkk-sjTYJt zib*6Lh7QvcSh>WwtU)y-1E0_if$1Aqxx^(w1|cak0u`ztX@%(rKx2_R(8AZyVfq2E zF`&X3q|O0sj3B7kLo!C^!*m5UF6i9Mj)>_K#JI$!hp}-9fM;urcAy0>%$qyVQn@v# zBmmjc0JdfNb~Y}4un9stK<-4f@BzZY1z-z>c7S3HNf9U)vV+0^njUr>02?ca7U()3 zrWb&efxE3B+iyUPLu&@vFic;-&V^_b?*JK#WStGD5MbaF+Q~5e0SA}(baoCdes~E1 zUc!!~Sm(oZ0}d`RE*nsh4$`Cmwv=h72AH0n#=#{Z1((FEk|%&QgTfD_IRI=UV+5$| z5ZZ}U@Pj&LmM5lv;NSvJpeb;2iAh;Q%RKO^c~mC_aB_)x89`%VCt8^6f)XXjHnj8( zn`YaI7W|ecrf=Yc*!zH!OAK72XzfG`d|06G1R0Lx7^4l-1-Q7xjNq1{MF!kbv`7Fo zak#j|m~0MA@8IIn0~fYJyUW}WOJYuz^)14 z1i-Xw2H3voYCK#5QgFl3f>`&$^Z*`+;SD@UNply-5+uWILDdGx(i_t!aB+z z{Taw?SaR5f7Lqz2rVH>w^R&=zP(ng7Q0K#R2VSJ0+YNF(k~}CHK$_=0=Hy`74Qpod zatVM_0n=^^hy$*{M1*#ul_=H+rtxu!altCs-4T$`Fyliicz2@}D|VoS$-pPH8&Yad zPve8z*8#C_8d&5j$W74d@faVMfF#@&wBWU#{+^FZ9N~x^U`Hf@w~L^778E*sLc7sI z-40q2>;~19NCP~I(D|R;XldFW6b2yoe*l;A)3@<+2^hhm9=rzy$x_e}$e>o$9<(N> zp~LhC{9IyO_Mmjgz$dgvVfqDrE^$G$g57AtbO!-0F)2Mz)&MC(OZ%V*6aX0mDg;3C z0T5$A^(~Ssj5bWaAiyPNr3Wqh_Mk-xtfb!qDyfk4*+a{qJq=)Er<)6M@k_zI1hNxJ zF{myR1i1y2LP2g>0oLRRDyNW?!My@%6CsJi-2k!^N!$VE^$TF*1VFKbB&|1HUWiK^ z-e}$ficBPF2WY{)2htHs+6zhpNb<0SAbZi`M-Q46_hRH2kO6!`dqJ*3GRFZFq6~aO zd!d==nGlzNlmpBV%vci;<`Uy_faZj~0ieMrX`#KK#DHulC@4UNf(QA8h4!KqMh*|A zUl8Wf1J}LN*+jSmtibUL(t(ymV1c_AEixQIz5%H}08YzHdryG#&h#{}VIV((B+-H# zZWvm|a0J`VC$txmF`V|IHFg|9VadQJ1UecXxpi*<@-|2uEe=3kdl4=%E=QQW0@#s4 z`_M9pfyeX!Q7$nnxH%ZX4e}+Q&^}OFKnh+*PyzAO-dVNDyQxl465| z=?_Ga%INs_5{HHCKD54>BQ#6x z+W1fBZ$BtNk=*SBs%;tgg!T(eUm(FHt_eywNYb!i*blNEN!;r(DV%VkzSraMT23JGZ3?|(6U!hTM%>1C2!0#dLD+K(1NIs(%dAZt1x0M?{+ z0OUs`zd1l1a{w(yKnVq;-x-=!4>(MJAjKt)9`Z&TrW;6snp~1xoPubf?yN99K?*5S z4}eNWB&(f4MH2&`(18kw(P*J=Uoiau$Y@aa*69FRkQ;y!2uLqlzJWDA51{26oe$GL zNO6gA+C%f(f$9BXT;f6p(4q*GP^7uUxST=R0c89Ih||zwMCZfw29Pp)kS!o(FQ!lU z$|*K|n>3ez6l@6MAX?VYW0?K`q)87{o-ptU9TWh!akLJi#R$yMgP1WQAj2ij2`all z+MzvYHyMzf(4=t?)FMF&V*3Tt3uHji^OciB>mXYEz#WPfFM15qFUW9-alsv00d}a+ zLG%c^FijRIdJm#Skqb0>4=w-~RZ<5*d?dHQ%7TL%pf!ywmw**4{tki)Q6$B%talJC z&$vR9=RwFIAk)DIpsc5L5EOq%+F{A%ASj%W#B~Iwe~{%8lX3-xH3Of}AevBgXQ$rjKhYRL7t8z>wY_=FA% zfTLdPFj^9a%>*3=1v`?3peY;$E-@}Qkbgn?A!%IbFeuFx{l8|Zcig%`-A1z?jLL2-}dGg$lk2wHZ4btI2~LJCQ}tHSgT z%Fv-`p(AKzjzPk71r<=CD#pdZbmRu4^a@kq5`ZVABWSS$%GWAfVq6}eh+yCoI?4c! zeWs%vpwepkGZij@Bv=u36fN*!WyevpGRFgycR*%=@*0xUVI}2JP>Mhj_b8a|pvoma zUH%{^JJZnsu&bqxqD2TSJdP%S942)X6yZo_z@-boNuB9v1xOjw(FSk@A$1fjQef?= zqtGFeqmUsIFYxgJNXEi);8C<#gL?%n);vJ51@bziuVQo*ErQ_AM9W+rAax*pkO4!c zqYuE|Fgl76U6AB@6s@-K1O+t%pU^Q#^f?^^MJJL!U{P`mR4E~edxDBDkUq4i1r>K{ zTw+|FpppqBZvajf(~qff32?$ZaSXEY;F}tkfDtT>fX`1rvH-3YEjpclOjl5crc|M0 z=#eQfJpe5Em6Jp07+T@yabkJ{SQ0d=bPTO#2bGNKAa_Hv?=i^0xz;hXc!JgN$3XFg zi&{dc|Y9g9ewF5nLT86Cl({Z$Dg2nl9P$EIn1S=PgqsN@W z^beXyCFOCn$nyeaQjp6QfWu*WxE2>be8lWHxaTsxO$*fj1^F1H5UnYu^I`f1El?X7 z)Z+ljUjTcN>G%zBbuj&z7MH;Ea~fQnnrPX|36z~c8bCCXPxKO|3uuGJCPCSTflufJ zTFimQF15MDlwc!kCqOZYq92l7Pe6y{PiR0|<7L`h0$i}NBvoLresEC3h6)6;a2 zorIQ$yrE^*i34CKF+!&KgifFpZ8{&OAJE|vQ-USS6KGimwqx@Iq^BZu0xb?)Bc^`< zxzQVx1sV8+PBMTa)$1f$T))IUi5nP9FVF+|0TiYno6w3oABX7+^ti;p^Rz-I zLGg*C*~wt~1&}0o`u-#+^pPa>Jf`V`%1MFg2Kt~DEhs~QEcgLVI83J?ku*I`pGyF| zoQdg_09a=FG?2)={hS<3r=XeQlm*4DIE7Yt`FxoEL7z)(y4*od4yjXU zjW}2-eF`$P?{x~)k417UEa{xWhzLmbJcU+(`GSIpflufZBw~b4feI!h^FWg!W8AW8BRTD16rj0c&67A>&W!zr{JyI>U0JzV;F<@AQRCd05)H81}y>%9i|(Ya*1*IgF+dk4>I5~ zeVQqkfRsPXFpwmYV?Y&#DVNyvf4p2AOlJ;&v)1%)rd$GG5u-DpNJUZ(i~KWafgb=$ z(;zz`8DM&t8JB>OKPUzn_=Ld6;UgIWtDMe)G$D!m7ff$3;}V}fUyO_0>nvLB4)efS zw0MEJ=qy@;EdUhiAj=)52Uu{4PZu}m;+KNE2o%XkHiL?Mb1pHi0FdDzO$m^IC^P30 zu!0MMf)Gg)+-9`+2>=y9AVWGJHeWaA;x~e&>a(DHiew0E?(8gDX{MJj%>pU4okfeb z08jw~vf}{Q4oy%d0xM+m(V{C5S~;DA%*RZ>W(6urKnVt9DO$@}k71fMXzmpn z3Fpuv36`$Tq2;k4P#}VgdjSrV>1ozn0$i{ZeGbwV&;lQ6hve`eXiT05#R!r(D5kBs z#HODU=Hg&FuQ1)fmP=d`EjC~Y|GWV>P^NzaSqNL(a^3+VsAj_@AQcG80t|dY=RxTX z)s_GoE-|hkP;i3eGr$&Uf&vCf87w)R2N{DT4(einw8Q10%K@H&?1cLaEk}V?57}~w zF$LY2u3^ii#}xpw3}p8Kh=a>)xdhM6`ptyh*;IOQ60X?f!OgFHDcKU=afJ{WPA;@5Qf*n$_y8wz! zB>7-aGH2iuy5InI0s5?r|B2}b>_EW}O06JekS5#oZ+2V)Qb905kQqp31{q9Out&BN zEmDG^S?R(Au$|M}?Ya1sOhAzUvH@f$l3{M3AOnf7nBD*iqV4uv{E~3Rpq3w!V%O>S z?YYFQV6B1+XoVUqUw}_lMA8-vEekI^fH=tA0lKi1>B0wS56}TtZh%izMAEDCVfq3G zB+p(%i=7Zqf@a_ox~MR{z==zo5z>8`&gKYPp>h$@-eS7w0I|vpBm-K=DRdE}71gQ) zM`#yD>LMubqew!M*hNTNVEQyiq}iN{XfXg<+~>$8#uWn1RTn2f90zF_Pgiq-J8lKI z_?;f+#3f*41r4T)XrT^EnBa?Ekemb>taRcM;|c}23={-6z_tjYWezKj=?_54V5@~M zewZHM2&!+Lp`*Y;mp}#}8LYQrx`Q*9SP(2eFQJ8bD70C236vR-mfy&ffDGajx`b9t zg+hbj5_Fc}5~y-Pvd`he^b5|=fET)i7Atxyrnw-+|0T3|35C|>mkPjTuFxg4sBpM2 zJ;4QTHd@a`Z^iTpD29VF36jG?K|#sDCv*uiZYFdIl(UfJ^*&7h05Tjr5`GD-64CLP zuHecgmIRwczJyj=zy?Ne3)3Uq*{3y%p0JfUF01uP=j)L(*h^VfqC(P^$~hh|Kc;_pz$xYgy5bkPJlxS}nL^)U`UEd7@jy^(lYvj@Dvm(EiV^6Lk_vpjE>dKG2b)3W zKuRjft7!QE=AEn4_wNTCGUUxA01wZr=F{Rm^x0@Zl2Uih#z$RcJ1_3bG%`kM0|$7x=(Z(lQ^UlyntT+##vd2NlI2 zm!m~Wu)*{TK1eC)Dte@3O!MUuvx0fx8jeW0h9gq0DNHw5#VN*g4H5}L*DxYs`T<{< z2fq0tMZq=9C{Xa@5|au7Wd#O4p=%gXFg*YyuMd+)>vWh@OmFbx5@RwrF@1v{mlzkU zLcF$M`h+YlF{W!9rYnF}C0s+Rv7?|_@EUaT_!_8SLJC+|5q}LWz@rSN7x*LF^I`gi zJT5V&>kQK!0=dMeU-t(sdVnJwNuwo2oe$Fk0=dMdzboP55V{UB z7|9~N3DX+_xezOmukVf4x{U!q7qpL$OMozAlD#?8-k)6Bo3V> zy#8SNgAy*W>0&`#0$i{&ysm$MG_l-*U^_ZMMG$g{Z8TweK@d{N-9T&ZM1hhw1E0_h z=wikjXdw$)^d1Br{hbyJ^|a9qP$VHa6;^@X0EHNmIPB=I8<4FXOg9oBUPuc@^1_V* zh!>^>!&=EV&=M+WkO*Y=xt*LGOgAQgN06CrK%1N2f{~^zZh*oP$pO*Ow%H9xX)!%4 z1hh07lutlDMvDm80cAJPBf?>NLkO1`R}3g*K>A*Q(~!^&P{<)!785c3K?tZTrNqTC zT`ZJKfHMYE_%ZMa-JEVO$0a_!ER;)tD+ZLBKw<&YCn#}=O}_>f1Z6RhV8QeaVO-*Z zAbrRtcT6`3;}SE3o%nVWtt~NyUI10MY?!P9Vw0WK0hT=MqbTIp`Ls zB0`o2#Sa6Y&@Hq=6PBEBp(Re(VE-+U3z5vR_%VG$IG30e>{z^8pr}EThZSYF(3*j< zpqU1c{SJ@?&bQDKY%H`wzm))$2PG9Gb7MhC1EjwJDvuW6v7qn($uEG)gUmzH9|!Uu zNd5#=9+X>=ArM$5>sTKhIyxWM*1-Uiu^WL{jxbc0Ax6|!P_LL^cla~tFiWOdL)f4c+H zcD;=jZgC3J4@7c_NyR~{s@tGi9$CM~^baWVXyFQKW=3&|am9hc3*>)D)ueeF6kkZ@ z#DZE2AbIp~pI#q@v}pe}T9Y6inrv?Wn0_IO3vx9*lBuv%dWQoXszP_rVkO>Vx)P7y#<>NZmn;19ODQxS6B&0vv4~`{&WC9+p!qxc8{3u?0}3) zq{VOvNa=yX9Aqw9v1?c{eL@VV*aWTdxC2szWCduf0c1x!G-B_306U8D2Pi0bcLJ#7L~;UL94%~}p(*t)T26rVtM8)a0Ju3IeasBgpB~^8 z6uOHZ)DF`x#BqsnC4fR1Yqb2Yp zkX;~s3E+kT)BS?!0+w82O!pzhw$^=6EF-zq802=4dbGrw^k8~GGHA2`6y_j#5RIe{ zG`5$_CB~Hmb39}YTH zw^Hu%D)F_1q#gl4?tZ2BzGl4Gt2|XG!oN;22fd}^#Cm&z>P12lGR^bnMXko*lBR(pt6>cG}|JcNvb z8-XutM$!ih$A=(~B8jI!>kTUkSW#a+cLQXj9~ft5n4F}3z1f#MO#vB^KC3uJMLNu`2nFOVbADiA}5=?+<3VqB@95C_RaqDbfwT1H7dFns~Y z9M}@9M`-1jUc&SXpb-)sfoa)XVp6b8<>0%(k(>is5s}R$#+3#Q<42I0Q=vzoVh>53 z)sN{DK@1<`S1Q1Qj+QX|zm~ zHeEi4OP?v_#`J(3SlWJ!7Vx0OPC1~BD4>7`nSquuj3!LqkOT4&G=LvN`|i(jxCD$+ zK^X<42`xjUfno_Hj#f;8W=eBGhJivCBoA3IBJ>!Xcl=g0qhh(v>cLhV|qhAmzYsH z$XJkz(c&x}TJt>t8G~dkXgVjKONDv+kz53uc6*8zPw^Gg1B#$0M1VD~ z=Hw81iWW<8E2eKKLW+f_Xt9(5QV()DBo8q?g)9=8E>_GXV3Yw0dImnBXJ}CaE8Cxe zOyTOvm^8|1#PcJJ2tytL4 z$szR|Eka=B0 zqMoB=J$MMBMKo-i$#b*_h7~H$LAeddj;saK6Uw>tnDi!0pHR*vW(7AFEhb_5K?wl4 zbCeAVH3mMR7m(eP)4!F2rWinne7#VZe!z-LjOm32sGSn^0+c0@EQWO(UVxGaHgS-_ zNaC=eju)Ut2a>ps!1N6jpaRTe`hyCjGksp5RaJ2NK-mgOzwU+U4wbO9@d7OdV8zS} zwCo0p@fVQoz(Oz3V!>Hq`hrT3qXed302_XblSAkQTEEoc!n7(#;b~9>DtT9Pa%jCk z3w8%+zI=(6fk3C0RB?%MWrKXlz$f%lVR}FnXz33qtfwEV;u27T4PCrM%M7q|{n7(6 z7NAxQjWMm4Xh91b6MP9Ou#kcb)N!vyYHGbi%MaNTrZ-e`iE+Vgf~;4ZzO9-|0KR+Y zCA3(3R?Q_~1nauJL-_W zix0gC(+fa`dV$(qpfClcbtFTr4@_SGGW1?G7boKn$aK`T8ZH4PSZa8MR+_=K(!GLg zo}bQE%O$`C8;E@c+3PUftd>ha3D%i=g_cQRHO(srNEtK@q!^YJU!moY98j^tz$f%7 zW4b^cmpCJMh*9Vjs1if+1!zNP9VBT6)IpOS(<{g>pXqINTmoFMQx;yWfFzJ@AVFA6 zyaL~^GyPc|mw*>s46UqzrJGl10T0W9uh4221CQwr_0TLR1ilUz$-O!P(+fb7;6*X7 z(L&gK#qQ0hLw^d_u1mfcAk*|JHz%>tCbg7`VRos~Tf$Cn6 zsc5kT+a2{9EnC2fsMnC8N~YJ44USB27{E3$z2N}UT5mw+B6$&(%-*0y8>qwA#3ja+ z3vw3&pU@k~u$j;sv~q06f$0TJpta&@ zAbkT_N;jRYnM*(lHbD0VEt2$BOgCue5|e^06$RhKjO4@o4bu}q@~{m124pz0{DbKe znz{6tb{v>~0Hh8!_wfcTKbc5O{{WKD2gNBUM9>N@(7aX)ml#(8s8s}#hqR=phqZ7C zaKRk^mI1t0YkFG?mw*&(f!15JILY5IeM1XU@Vo_?h~(k|P;fEu3B85H$#k(+E`fTu z4QMsFJ}AOKiqYZ*wz%poTHL_A_ZBUK!GiBC$Z}-IfP#~Ok6Gv~G_sbpB1P6)w8+xW zn0}!Z6j`A15acSfc0m4yX>CZ$PTnq<-mnvNF#lV~VtJvrXjS}<1Je`QK<0rmCCEIq zNOOBJeL@?Tm=SED@LRMGM=?d*gQS=Ti3JXC| z#=s}^PGP!0JD2$M_I9L0Gv0v=MG8W_8`C$mbBVz#rFYQv^3U421e7d5@c=RjEuLW0 z!|x)%&0VH<;8SI%yLEu3??4qXNDnBKkt_;Hm|oBU3Jp*wfaF1S6_PxxR(yvRD@Gfp zFX-SBL%0PL=Sccs3-aD=02eaT**dud;7gR=9hg30A1Dsr-2jIL`l{d^2c}Qx1XY2c zKJPnFOAE1UU_V=L7gXA1dXu!RPEC>;L4~iTlc`b(N8@jl}xQal@6l8n>*!bzsySVtJ zil9a5d$c@Zeqp*mH?mvNLca)91%M2LED14s4=R9AECn@7`Gh{8d7>DUCK>pIK6pS@ zuc-BM2`CkV6oCZMTwV+^6eJGG#aT3Nj>LxlOn4;}SQr0JTLy?n2AhAu!K@0u@Oc=upExE-|hWP=WyI zgN)-QeLzcC#UMUN9xY*&fD#G=pU_88n4*{q65td12r?H*yaW`EAoU8 zdO|;!m{dH-`5XF_JiJtmG3~OB9wKK7j%aNqq?@P#O4yKA}Zi2`Jrw#6blK zGXppLzQ&RZ(m8ULFo#P_suHA) zflufgdYzCky%j@1&}uSw+85Z2S_pm6geQt36K>V*XDv2T7yCkB)9;gl5HL+&L41c)PF+@bJ+68 zZ)geJ02&A1Kqest0xUy(LkoM@akAggk~^#%{RWDAW`<~Z7KdAa7D+G*zJo#;$>I>G zKfj}u`>-4DzYBm;H`8};i6iwLEpA}B?K^DE)I2T$_$f}`A;UvV-yxH)THir&fn+tT zZ2yi{7l2w_^SH#gDnVhyz$f$_(&*Ltj@IafjT?OjRk}###&k?SFpo=23ATRhJ1Cx! zn z-8Wrq0hfRgEI@vsWuj0}1TgRk{Q$Wb$pX+Kj|E&}TvZ?!g5(3HE#MMIKNU8nWBP&x zpyhm^Z~&=7E57t5Ouw)IS`j4uK#N1TlhEQ27DqqO8cwj&aesgUAIYh(K>Gp7nL`kA#5m#RPQQPEQ(Wi=$jwN`=pC4zu#ihk3YL9;U}VSX6Ba@$fCC_PuoJ9) zpyjq$jp-j2a)~LyLiQ(Gu7kzSPl4$Ui@3z6+b`l$haYtQ6V&`ba#S_Qkqmr7KVb`g z7I6t=RfAjx5=6^XFqi)X#VL{@RUj9F)PwRnk~pm3{D~H8HJ|_lsc(REd48e=cnzrF z0m(y`n*0Q*M>1EdWBP){Tw-3eAfJQOp%sL%i1-Qe9FjiR`1enc|B%FWUrbv9P3u}e zLFo}m4sHj?O-SN;6Q&z1;S%FA0_9+k8-9Q@{PeUXuq^cpt<=-;m_A_%mzWf+6#a!( z-suQTKd^*L4?ZOQ3$41TWtjc}q#xFQ_=Ofbpi#)BTw+|cpxny9C-e()l&RJ)P!*5l z@>-C+AbGUx0$NoB(hrNxUmf7C`nIK@hTvCDcB5ZttuWYd=`XZ04mLjZ3$n4C=@gU0@k>3!Ts}v?wuOG2LMqmzWZ)3i*W=EwHhJUoRlFW!W+=0VTMDK&2Uy zk70ANzab;x)31RP!xHCjP~#X$aV@my{0&)DGTm%BmjG7{C?zrQ3H`PJ4|56qMvEIz z-d>K>%=wKLH+7((1L=n>9nt)amLp&(^EXz( z0~rs=FiyYGG7PLF{0&O1NPdN7l;3Dkw>HcAW6byerd}Mi0QfA;2`UBYor}YP|G^+=d z^dNckN@&OQ1uK#4{eu>L^`HU>qz`(eKieuUfh<^@{6UK=xFsORAUO^eD1Xr65SGyX zfEe6b^k!xki_ z+6FE$sYZ|!Kzh;QNhe{t!3HidCD;h@f3$dk#ruEAZ45&HK^Y0j8c>5`1E>iNN*4@# zLjMiG751?WTmtYD0RN+vbg;_*zXw?Dw+%=uLjFS!{!!Zqn!|y{&i@SX-1qdbji9kO zF)j|H{~#G8XTXxxe^7CPB;Eu{7a(Ur%eQSCxdfz|K#2h)2uhwFauf^g04UnW z_H(ie3p0QM49QR(kLd}Uxx|8?wW%-zT1f~u6{92sIh#+I0aUIanb!?Mg~4%h6~dkaEb~GGoZzr-h}B2Te!qv1+g##T5BA%*?$YNQ_!+n3n)Su z_=FibrVG3U?epKlCBW4J@;^vW1MEH_MzmH#eZzEtt%%OJFe6%C0^PC&l84sW!i;F~ z6B;qSU@N#7n7&{uG?ul58PS>z(27Wy5#$=A&~2H1ek+%_6tq<#%!n2#T0f?3;}VmC zuCowk1eGyJx_2CyZm^9@jH?Bdra*pN0runcv~7soAEt|D~bb+KnRw7vi zE4P?H+L6SyKTJ2+iInY_&>|MJ1_LAyo#zu~0tFV5{)UR_6LunHOJ=kht_>6!41B`O z5+LV_IWeP0Ce*#mXpsqXFEdC#l6|0rvkS?+%xIChIVp94-Dq z>#%lniE*`oav4Y-l7*v~(P~GyeQ3EE9!O{vCUksAm>Df`G*nDqu$xQF3YHU?(GmkJ zl9@s7L2^Gl(7@N$icV+U!zCyM_bgh90ByF~!zISm4r;)}9Sq-XvSI8)($Wt%Co=Rdxix*hBXGP04usq2IvJNG%KmvTiY-j~* zCn%{i@Cma)3RW#Pv?zk58#c6jq?0iH!a>AdNntinErw)YL&da1Tw+q4AZ;My(c-Sv zW4gg1#3DXnwutEtGr2^Wh1oK|{?%ebYy807ffji>3DYNlEP`b+HnjL_sF;2LBoB88 zS~hF-nEv4qQpLjtsz{Lh(FuwdkO!bmQ?9vlZDBT$RwScf zQO$;y1-mq+Hyq~DV`>nXzTq$^%s@_L;1gy?i>kH{(;pm0aw5|MeG`ormNc# zE&;ACm|+3aHyq^>pT7JE7r#*#$de!&Ksu0I2y6PVqvasbnNdf;?bB&TA#*6~!ouum zAq^Vm2FXH-Gj@=@NJfJi03g|Y;Btf=_8!t7|_4J%mK(b_2RP(jOTaO=^s8mMSE#wEtp1#&I}pD>32IOz&; zpv6neis>7Uafv0t%;x~*2_(YB!1?u>o;1Ywa>=x!gO9P;EbpqK_XlVf!c^qh&(P+Z-2_SP} ziGc$xF@O%LIRWxCC^0bb33D=lJw5%~38ehb2`Z$K91ChEoCHnWKtqxfy)dnq9&nON zOtK5)NRXjuG2S}8{v={(Nf>-5Ba-nwpfVApEdcBmElyC`jU*2%mN?NORwrTl1F*9| z#T7_D$Q)#S71ISyaft=Nodt?$BzaiVgA*;nVFel|T6?qy6h|O?7J%I;#0d%xB=Z^s zrY|_fC6)wB$ef@Igd}eOiVKi_kU2==u(;v``2$HDma#ZN!HOiVH(}aoq@=@%Rt|Kn zm~L>IODqVML^wfFjieoJ9Y(%~RHa-X3Q2u0C^azf33CZdFF3;`K7IOWF8+F0oN%Ef z1(@Ht&1v_t?p zu^VJAbmB{x3oQ|VMrc9uFn4pKMY_(1Y3Gnah#Qm!ki69kGLC^ym|J7|hI3rvj0WJg z?DVPUxCFrsPHkasw1|T_gd45Jq_<-Ffpegt4lz(~fg3IBgI0^218qeH1uMut@L;Uy zbk*}*g7BdqZnU;j%!TOz=MhGtnu+b!LkbOx0g&rg* z%#Buz!-EekT0w&#=efiT`=HUzjTUYFpwI#N2Q3fwPtU)=C9c#D@(}}{Fb`T_^@FMy zka))QhRs}JQam7aNY3mBr5=#{1kkc~QE6cwkOpK0Ap1ZHpv}Iti-?0Jg?T`_krcxM zg9okrnIJHI!bPOS!Go6eCVg!+5&AbxyU7E1T&u(Epbf%@frApdC?ji zpvm4#Tw+`kK-n22Zvi$xiWd}^NbZK~M+-ezTbdUwk-;L77i2DyIiOX(Ap5dFkq)vC ze2R!DvoJ6CieFJMAEeH@57Uo4uHaZ^D9WHZ; zc|li52=k(aJlqFpAr32bc|kP{l6(4hOfR_1C1wSkU=ij8ML&`}Yyh1PEr#Mi?q}c= z<^!)65M>tT1JA&SPG5SNOAvG&7`wMHA1IcQ%z_P`^P!dSFu(AjmGCgX@PQYwf$RtX z&FG413-h7HPd~_4AlIP9kDU$qsmsfl65V*6EN3+*yR$GqTJ*yLo*ymZCxTiiAnVa0KCWYW!&RixjUO!m zOoTZbGDk3d+f~r55uh*v8HQHQSAb#yB#xe81*Sg$SyBme1X{*~g_!`yv|F5_%)$bo zg`%RwSR03!@(dx%^hijmEaX%=W1kg%N=z4o$0kmk% zh5Aa6Qg#|$c6Os>L5hn;KOtpmt(efiK3Ix&eWA2OT3D-fh ztI*Vhe!2)O3ec}B0L_nI=MuAm1v&cSQdq?&h?X;9K_>`lZ3zntg0mtbCxUvB*SW;F zra;3`a00j{7D7LM2~^XA8~|(l38KXXtcxOumdBv0&4dL(d;LYDg$227yi$GX_3Zdmx zXnR3gSO^r5NCs(uG6w^nu#f{dV6}um79z`oG66^)EmMNpoj16|xTb;v6eJIwml3-O z*=*0QEi42w8p$YFSPG%#x2PA>9d3eF0)XNSWE5Kdg5_@^kX1Z<-%yuISmxL41B`EXt6L2RF#0lp#u}bXbltSS`uMlwEUy@y7%lpt}?h2Wyv!op}#0$tlFEDW+A$=_}}rcby9D!{*TvNH<{L#9Qgg@r-JAt^Hi zmAD||SAdQ+7M*_d7N|&iz{zebER5FRgxiD`P0+o^!onw}JDlMXV-f~m046&9E6gZn zVc`d0)1`%l(P9T~<_ECe>1ww@s~*0BtQP^5nMf{$E?p58L5mQW4@AJ{mWT=qi=dU1 zpfSqZTwna+iH{1rbv!M|rf|iY7c|rsv zk7V97P#poX4y~?pxG;UgZRh~Gx3CB({E>9QlBEb*G{cgk2wF5x2gN7ImKor@;3NX# zBbf)A0~7(}OeAsWH3q^Wpg=(quU{}-;0~9VS1ibvAal_o8+w6+un1b7%z$PK5sZ*X^0VIzejxcewV1zDT7Zy_hZQT-O78ZjH?=TCCS%C9A zv#=QWm@N!U;BcD3$Un4y?vicjB6$+s2KQ! z#i5fd;%ISEb6~o|eJ(MpnV>2Jqz-!vLRcJ>Mv%;(1qw`%dJk}#F%k#meI$A4nq*;d zko`#Fu)HOnFl{Yp9hx{=Ne5aZaUax52bGK<^Fj6?=`R8WHAoyS(qQw-;%JcuYrTu3 zwLVHGOuuj+sTU@WRtC-jMIFeV4PgHXiKA6)H3z0W;1aW%1&t_i5RK$aSkWtvRZQk0BWV^A9MxkWZt7?!6b50Oe^U^?DPgCp_R1^C|&_Cj+0b z1V|&2Jls5x1CYdFEo2Fdc%MGu0hbupY*4&{%!4!(g(N_k21!3?Xy5^tSkP>ky=d_b z3x5evd?M+C1&{|B>~D(Ncv&vO9FKBh?tNB zD7hd>gGS~ba)|}OorM;y&=udp5@;C{?p(BZo(;;5px}WtE43s*MKO|num*wzNF9=R zsl@aR50O@INc;c~sA>yKqLr~Qhf1QwcSFVW2M@W#tY8k7M2l~jgC)`8dk!f682E%G zA!D0bl4va#n1dxj>QEi*@CeDlk`ds^axF=;c!j$cEnbZ#OfPtZ6!4O0`5NvIw0sTs z2U>N z2uq?>nQ-T##W&o!Xz@K46n!A)LWZohq|l-n7VJ_Wb*RCf@E9rBr6j;rxRw-Jw8Da2 z3N0IhmU%qp5;KYcwL}>Bgrz_N7@6lcTaTs)u&v7T+kzDgry_E-6kPvw47TyVcIjKkdsD>xp|-%0@>98 zsSu^nDpZ|>=?Tw3V@RNa1EdZuX5el@%c!6gtSI)PWz>0~h7HKP3s8H}a^mz2(?2}p z60?GvkCyXbIZ_&A4pNxT2ZbdApRf!E*xc!1&$$GQU=bsOR+_?^kTPi5u0mjX!*kHW z1yERm3`37Nf$1BbbBQUz`gJm(z(H~ZbO*k$OaSO~VbSSNpK}Qs!MbxYAVZN9!^U!D z(DIr=!gPTbprweQ<~PU@Xho<_!gPlhpqK%f2a-pNIatWaVC1ps1t|J3Vh)t%`GjTA z@))QI_kv5z3N|PugQG5$LCbsdK`9R8K4@JkgI2cIf$Rs#qs8!ij%hEE60QtdOKJfq z%o+HEWuXym_L57$3s$bkqD3?;r^%v4G+Z1l$2L?1bHFS*2|V57vcpfEy`*AbZh;U$+C7xWlkVc8Dw zN>E{8S+q!YxG-Je6?_Ci7A}Z*U_V63p=E2hU1$Zj z1<0=;eQ2o!HV7b(mP$YeNx$I|<5~m?a|S+Pc?Gb2)2F@R5`Z_K<ta~PpmXBd6M;=rzAO#X=Ny1x@<3Rxqay(=r zWO~?JE&(Z6Z6%MEo0A?)Z+HtDSqH^BNE2Et!iFd0L53n(mdr7I1IRMiFopaH@Swx= zr*F9gy`X1G3(KQrYFN^h2PGXO!{8x^7OjgJrVG5|5}zLbo{OU%EvjH1Qb5blFuN7d zGBhld6+lS|$!?ej70@y|^ss(m1xQ9`5ModRxqyKI=3@oOK-Bc5@3;hm;I^Wb-7p_3 zpk;2Dj}<@(4aqf&L1}=2Pgo&gdcb=w@p=#!NgD2Hv?Kwy9xX}0Jq^kSNanyj4N9U& z;>jTWAnQS?fti7U3*qVM2JbwzUKTNy8B{p5{14s;%br|@B6$PdnfCSsXf>6gQ8ca_B z2|fc0f=Vfn%7Ez;K!R=`LE1ry7bI9P{lEn-F)2lmP9$$H0i{!r{DkQr!15qNkmW(e z2S|R$bcKr`{h&$+Nq#9PO@ZVuOb-CdgUmyg2c-&-{EO)gV0pA+YAMuvN(|FCfaI0X z()3bLbTjY?D@ja$0G3Bft4l%A2$DCLE^vuU%u5Lrgvj=T;tM1XN`**$0#z1ByeXlj z!llsgQc9R!aEVJyN(n6)E``RMQpNNIV0pCUwG@<(LG~?}egQ0xmM)fotOd#Mn06Ut zJX&xr17$go^o{8TV0pCSVi`0zl^LcdfaI0Yf@>MH##7dqJ^?I`R$woK2A6Wc^aEgd zQ1BxK*D_FYW#AK5u9*G-ERW{BWuWK<$uF3$aD_`uN*T?2%c0&=J~2H2EDs7UB=eU; z{ipn4dIMMu-eLL!uskSQk@Z8PTP0(_=Ht8rd{I_lTt;Co)ysOQT3Q^0G0;@2eR?d=us`0o&c5y1qZS` zD7Zn!&zL>|EDs6}WO-0FfvSGDXUbx-Ot}!zZi;3La$jpx_6o z@0h*;Y#+36hLz1LLBS7_-!T0FSRRynk@T+;fSP+_y1)&Pd(pDfDo|;`z$dKEFx>$p zuZ|X7t3d7q$!kn60L!Dr*D7dyse4Rc0G3CKuT{|aQqP!v0W1#+A7uAI<4e6`+D$Go zDRngOtpWu<$odu24Z!js5 z8UoV~faEpMqH{GUd4c2&rhfp-gMtfLKQuZu0;Vh6;u4e6Kr2mFgQ5eZzhZg-SRSo3 zSq&{sG!{&60L!D5CTl>k2hx9F`UbE(T5??jElo6DOn-2TOUz3H6kbT~TLVq5nxJS! zN^XWnKnC*(Yl6ZLSv@Fv82E%W4W>KX<`R?AMDy<&Q2c=8Bc>OCsy14`6wac}U({3yn^#3DXts za*0W4fy_ge2f3GlPgrZi^Z>9t$UG$Zbs+bGUgtaB6KLE*VgGw`Gd60WS@)pwt?twNJqLohTK&2%}K4Q89SRO5U*Fj4o?S|O@RW0Lz2aBg=!F2h!g#eF9h>%{%Ks&H>4Xg<^hIRNgUdIpA#&=AuFB_w1GAcH{`gB$?Yz`(E(6apY|P)s1J z2k8figB*aY9uxu$e8PI5kVaB(Z^FR9P!Ey-IRIG$C{1CZ529jb>G z1@=$}f$z9LRu2jRkogH9`;lDa04jMw5+Da4YXF4+NE|H+96;(o;vfegs|SSuNF0=P zk<9l3g&0U2bIRK&o6o?F)Kp_B94>Ay0Jv8y^ zfgFIW9vTJuAl*pntuv+@JmzAn*9X~;tRCtyeY6;`2DyWQPgoyhKeBpI0D#2NV!(z6 zWFeohKFEG#^`HO%sRy|iITP4GbEiHicOYwkSqw@7NFK0hfm#46M3L2l0tRFO$YIFp z_dwNyN+G!V5C(=#piPWHdG{y;T=TnyL1z_1ybRP;f`6_N$EphOKa=fHG>*IZ)t z`k>kpS-u2n9$K-q85D9LeV~{_Ru3(9^wAm-n?WJRzz1HG$bhW=3B-H@NQ@$im(8G% z18D#i8%P@LLZBKzQH|_DP{@JQgJJ|(y$n=6sC+|K4+=PtdQeou)z>pH*g@+N15o*c ztN|2qAPu0XhHGG8uOmn1QV)u1WcAP(G5}>xWc8qsWCdxMFkRspmsq_4 zTE)KwWDiIl6tzeOxYVaEufGCsRudP)vfv7fet1 z$R*}w2;w8l!@>oWB$3S93JNEXK2Z1|sds~kUzmQOf=jes*bo$xND5p*X%D0kL?asr z3MmFYVIxosA*pv*0uta8HUfDJSv@GEKZk5a?LwR#1q5BtSum zq`?tdkr;uJ7_tS>C^P~kB_#C@cc2aeIRIHbC?r7UgF+0Z9%R2WC`dsPpr}ID015$+ zI4I4-G%zqQID-rTiG!jFN&PmEy&!Rr!;sWF`hX<(guw?2BdeDH)!`rwpu~l&0a}b0 zfn1EN0h%j~KxqqEJxCqM98gpusow!j{6?V6hos&Kl(`uAgpC;(#2Jtmd2Is)B}hU6 zyxK#`7-S)mfjdDS0m%nUd(9^8p(p~(9*#elv$C~JHx^S6wt`(K>@_TCu{;Le&Oot85o?QNy`M}0Avl&qy@f3 z4z7WL!3Aou2`FzMs|SSu$O4c>$m(lAF5(k5L5qp)pp<3`(f}&2kTf`fG8af3q!PN(GQSBB_CTKANHy`9qW(LF*D(u8M6HrJa83ao^CZH%p65j!eA_hKTQvq<&_c8^=%w?ps z4GK_@JgC@0h=Ym@1_qEgT2?Uv#S}=~0ldJ@SlAR4!l2ulp~W58JdgrVT0?TkHjp}y zcmX(%nSvq&bhstDHjvH8+CY4eHt_mGBU4Zr1WE+x+R)<%lny}JAe+UcOhGvT$ynI> z1JfJe`TcrfQ%FF=BN8@MZHgAour>6iXyFVu5R`C`EGmPBml-Hrki=o;n}HG%GpM+R z`UraUjj$Q0FhkM+v%m}#p-AGeRUu}eh(!{ITL6k!Bys3vP{L-&5gW?DzyM2%W}rOz z2s4G4fqa5w5L~?n0|O&cmIHYdlyb}hz>B5oh0Q>j7)c{+V%ZEW6T^LoR>8q06U{(z ziewIK*MJ!)DItmP02Q|ke8Og+q=Ou^&^#ix1I-|AkdGPo#CD(=1U?c0Bn~zR5hCCt z5kTT-AdrFbAnJFfed~ECgvlEAYVwA%MgeOb_@3Iw1sEDm!=!So4VxWuG(f>Il@Jctj{*D&4S z3&UV+kBguo$y#mRDJc1++-b~8CC$<}u=#a$0n@K_9 z5C_An2qCCPcB8o$yf+l29^zhWga(j8kOU}XLDR~RB7b!gxX9!a0}q5CiwA5!@r{d* zk?DQJ^c&x~+?bLcOjr29WybXZl;0T`7^iDYPx!&5CzJ{{fPo20Gl(}#UjS0q4)P%b z1B08w^anq<^tft31sMYaQ%%FfK=JANKe^14s(2b#>E%>5?pr($lMdaY-?A$tg^q@r%oj xYY!-UFfcGET$ujg7nd2=T~NKlz`!7+-mdVQt6kwY_jZNfJX^l8yqmsfG622nD delta 221666 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 diff --git a/roms/SLOF b/roms/SLOF index 2317427ce7..7d37babcfa 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit 2317427ce76006723f7ae103a6998ab41dd79c68 +Subproject commit 7d37babcfa48a6eb08e726a8d13b745cb2eebe1c From 2309832afdaf8d6451ebc2e81bace8eb8ea41293 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 16 Mar 2018 19:19:13 +1100 Subject: [PATCH 19/23] spapr: Maximum (HPT) pagesize property MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The way the POWER Hash Page Table (HPT) MMU is virtualized by KVM HV means that every page that the guest puts in the pagetables must be truly physically contiguous, not just GPA-contiguous. In effect this means that an HPT guest can't use any pagesizes greater than the host page size used to back its memory. At present we handle this by changing what we advertise to the guest based on the backing pagesizes. This is pretty bad, because it means the guest sees a different environment depending on what should be host configuration details. As a start on fixing this, we add a new capability parameter to the pseries machine type which gives the maximum allowed pagesizes for an HPT guest. For now we just create and validate the parameter without making it do anything. For backwards compatibility, on older machine types we set it to the max available page size for the host. For the 3.0 machine type, we fix it to 16, the intention being to only allow HPT pagesizes up to 64kiB by default in future. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 12 +++++++++ hw/ppc/spapr_caps.c | 56 ++++++++++++++++++++++++++++++++++++++++++ include/hw/ppc/spapr.h | 4 ++- 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 78186500e9..70b150b098 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -63,6 +63,7 @@ #include "hw/virtio/vhost-scsi-common.h" #include "exec/address-spaces.h" +#include "exec/ram_addr.h" #include "hw/usb.h" #include "qemu/config-file.h" #include "qemu/error-report.h" @@ -4015,6 +4016,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data) smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; + smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */ spapr_caps_add_properties(smc, &error_abort); } @@ -4103,8 +4105,18 @@ static void spapr_machine_2_12_instance_options(MachineState *machine) static void spapr_machine_2_12_class_options(MachineClass *mc) { + sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc); + uint8_t mps; + spapr_machine_3_0_class_options(mc); SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_12); + + if (kvmppc_hpt_needs_host_contiguous_pages()) { + mps = ctz64(qemu_getrampagesize()); + } else { + mps = 34; /* allow everything up to 16GiB, i.e. everything */ + } + smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = mps; } DEFINE_SPAPR_MACHINE(2_12, "2.12", false); diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 68a4243efc..6cdc0c94e7 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -27,6 +27,7 @@ #include "qapi/visitor.h" #include "sysemu/hw_accel.h" #include "target/ppc/cpu.h" +#include "target/ppc/mmu-hash64.h" #include "cpu-models.h" #include "kvm_ppc.h" @@ -144,6 +145,42 @@ out: g_free(val); } +static void spapr_cap_get_pagesize(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + sPAPRCapabilityInfo *cap = opaque; + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + uint8_t val = spapr_get_cap(spapr, cap->index); + uint64_t pagesize = (1ULL << val); + + visit_type_size(v, name, &pagesize, errp); +} + +static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) +{ + sPAPRCapabilityInfo *cap = opaque; + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); + uint64_t pagesize; + uint8_t val; + Error *local_err = NULL; + + visit_type_size(v, name, &pagesize, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + if (!is_power_of_2(pagesize)) { + error_setg(errp, "cap-%s must be a power of 2", cap->name); + return; + } + + val = ctz64(pagesize); + spapr->cmd_line_caps[cap->index] = true; + spapr->eff.caps[cap->index] = val; +} + static void cap_htm_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { if (!val) { @@ -267,6 +304,16 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" +static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, + uint8_t val, Error **errp) +{ + if (val < 12) { + error_setg(errp, "Require at least 4kiB hpt-max-page-size"); + } else if (val < 16) { + warn_report("Many guests require at least 64kiB hpt-max-page-size"); + } +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_HTM] = { .name = "htm", @@ -326,6 +373,15 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .possible = &cap_ibs_possible, .apply = cap_safe_indirect_branch_apply, }, + [SPAPR_CAP_HPT_MAXPAGESIZE] = { + .name = "hpt-max-page-size", + .description = "Maximum page size for Hash Page Table guests", + .index = SPAPR_CAP_HPT_MAXPAGESIZE, + .get = spapr_cap_get_pagesize, + .set = spapr_cap_set_pagesize, + .type = "int", + .apply = cap_hpt_maxpagesize_apply, + }, }; static sPAPRCapabilities default_caps_with_cpu(sPAPRMachineState *spapr, diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 8a9142244f..4bc9dbff96 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -66,8 +66,10 @@ typedef enum { #define SPAPR_CAP_SBBC 0x04 /* Indirect Branch Serialisation */ #define SPAPR_CAP_IBS 0x05 +/* HPT Maximum Page Size (encoded as a shift) */ +#define SPAPR_CAP_HPT_MAXPAGESIZE 0x06 /* Num Caps */ -#define SPAPR_CAP_NUM (SPAPR_CAP_IBS + 1) +#define SPAPR_CAP_NUM (SPAPR_CAP_HPT_MAXPAGESIZE + 1) /* * Capability Values From 123eec655287e43e0e86154e8093a394aefa3958 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Wed, 18 Apr 2018 14:21:45 +1000 Subject: [PATCH 20/23] spapr: Use maximum page size capability to simplify memory backend checking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The way we used to handle KVM allowable guest pagesizes for PAPR guests required some convoluted checking of memory attached to the guest. The allowable pagesizes advertised to the guest cpus depended on the memory which was attached at boot, but then we needed to ensure that any memory later hotplugged didn't change which pagesizes were allowed. Now that we have an explicit machine option to control the allowable maximum pagesize we can simplify this. We just check all memory backends against that declared pagesize. We check base and cold-plugged memory at reset time, and hotplugged memory at pre_plug() time. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr.c | 17 +++++++---------- hw/ppc/spapr_caps.c | 21 +++++++++++++++++++++ include/hw/ppc/spapr.h | 3 +++ target/ppc/kvm.c | 14 -------------- target/ppc/kvm_ppc.h | 6 ------ 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 70b150b098..0d032a1ad0 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -3192,11 +3192,13 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { const sPAPRMachineClass *smc = SPAPR_MACHINE_GET_CLASS(hotplug_dev); + sPAPRMachineState *spapr = SPAPR_MACHINE(hotplug_dev); PCDIMMDevice *dimm = PC_DIMM(dev); PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm); MemoryRegion *mr; uint64_t size; - char *mem_dev; + Object *memdev; + hwaddr pagesize; if (!smc->dr_lmb_enabled) { error_setg(errp, "Memory hotplug not supported for this machine"); @@ -3215,15 +3217,10 @@ static void spapr_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev, return; } - mem_dev = object_property_get_str(OBJECT(dimm), PC_DIMM_MEMDEV_PROP, NULL); - if (mem_dev && !kvmppc_is_mem_backend_page_size_ok(mem_dev)) { - error_setg(errp, "Memory backend has bad page size. " - "Use 'memory-backend-file' with correct mem-path."); - goto out; - } - -out: - g_free(mem_dev); + memdev = object_property_get_link(OBJECT(dimm), PC_DIMM_MEMDEV_PROP, + &error_abort); + pagesize = host_memory_backend_pagesize(MEMORY_BACKEND(memdev)); + spapr_check_pagesize(spapr, pagesize, errp); } struct sPAPRDIMMState { diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 6cdc0c94e7..722b213d9a 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -26,6 +26,7 @@ #include "qapi/error.h" #include "qapi/visitor.h" #include "sysemu/hw_accel.h" +#include "exec/ram_addr.h" #include "target/ppc/cpu.h" #include "target/ppc/mmu-hash64.h" #include "cpu-models.h" @@ -304,14 +305,34 @@ static void cap_safe_indirect_branch_apply(sPAPRMachineState *spapr, #define VALUE_DESC_TRISTATE " (broken, workaround, fixed)" +void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize, + Error **errp) +{ + hwaddr maxpagesize = (1ULL << spapr->eff.caps[SPAPR_CAP_HPT_MAXPAGESIZE]); + + if (!kvmppc_hpt_needs_host_contiguous_pages()) { + return; + } + + if (maxpagesize > pagesize) { + error_setg(errp, + "Can't support %"HWADDR_PRIu" kiB guest pages with %" + HWADDR_PRIu" kiB host pages with this KVM implementation", + maxpagesize >> 10, pagesize >> 10); + } +} + static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, uint8_t val, Error **errp) { if (val < 12) { error_setg(errp, "Require at least 4kiB hpt-max-page-size"); + return; } else if (val < 16) { warn_report("Many guests require at least 64kiB hpt-max-page-size"); } + + spapr_check_pagesize(spapr, qemu_getrampagesize(), errp); } sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 4bc9dbff96..7e028164ba 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -806,4 +806,7 @@ void spapr_caps_cpu_apply(sPAPRMachineState *spapr, PowerPCCPU *cpu); void spapr_caps_add_properties(sPAPRMachineClass *smc, Error **errp); int spapr_caps_post_migration(sPAPRMachineState *spapr); +void spapr_check_pagesize(sPAPRMachineState *spapr, hwaddr pagesize, + Error **errp); + #endif /* HW_SPAPR_H */ diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 50b5d01432..9cfbd388ad 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -500,26 +500,12 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu) cpu->hash64_opts->flags &= ~PPC_HASH64_1TSEG; } } - -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - Object *mem_obj = object_resolve_path(obj_path, NULL); - long pagesize = host_memory_backend_pagesize(MEMORY_BACKEND(mem_obj)); - - return pagesize >= max_cpu_page_size; -} - #else /* defined (TARGET_PPC64) */ static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu) { } -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - return true; -} - #endif /* !defined (TARGET_PPC64) */ unsigned long kvm_arch_vcpu_id(CPUState *cpu) diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index a7ddb8a5d6..443fca0a4e 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -71,7 +71,6 @@ int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); bool kvmppc_hpt_needs_host_contiguous_pages(void); -bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path); #else @@ -228,11 +227,6 @@ static inline bool kvmppc_hpt_needs_host_contiguous_pages(void) return false; } -static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path) -{ - return true; -} - static inline bool kvmppc_has_cap_spapr_vfio(void) { return false; From 27f00f0a108484a975dc075086f8461ff279e1b3 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 26 Mar 2018 15:01:22 +1100 Subject: [PATCH 21/23] target/ppc: Add ppc_hash64_filter_pagesizes() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The paravirtualized PAPR platform sometimes needs to restrict the guest to using only some of the page sizes actually supported by the host's MMU. At the moment this is handled in KVM specific code, but for consistency we want to apply the same limitations to all accelerators. This makes a start on this by providing a helper function in the cpu code to allow platform code to remove some of the cpu's page size definitions via a caller supplied callback. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- target/ppc/mmu-hash64.c | 59 +++++++++++++++++++++++++++++++++++++++++ target/ppc/mmu-hash64.h | 3 +++ 2 files changed, 62 insertions(+) diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c index aa200cba4c..276d9015e7 100644 --- a/target/ppc/mmu-hash64.c +++ b/target/ppc/mmu-hash64.c @@ -1166,3 +1166,62 @@ const PPCHash64Options ppc_hash64_opts_POWER7 = { }, } }; + +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, + bool (*cb)(void *, uint32_t, uint32_t), + void *opaque) +{ + PPCHash64Options *opts = cpu->hash64_opts; + int i; + int n = 0; + bool ci_largepage = false; + + assert(opts); + + n = 0; + for (i = 0; i < ARRAY_SIZE(opts->sps); i++) { + PPCHash64SegmentPageSizes *sps = &opts->sps[i]; + int j; + int m = 0; + + assert(n <= i); + + if (!sps->page_shift) { + break; + } + + for (j = 0; j < ARRAY_SIZE(sps->enc); j++) { + PPCHash64PageSize *ps = &sps->enc[j]; + + assert(m <= j); + if (!ps->page_shift) { + break; + } + + if (cb(opaque, sps->page_shift, ps->page_shift)) { + if (ps->page_shift >= 16) { + ci_largepage = true; + } + sps->enc[m++] = *ps; + } + } + + /* Clear rest of the row */ + for (j = m; j < ARRAY_SIZE(sps->enc); j++) { + memset(&sps->enc[j], 0, sizeof(sps->enc[j])); + } + + if (m) { + n++; + } + } + + /* Clear the rest of the table */ + for (i = n; i < ARRAY_SIZE(opts->sps); i++) { + memset(&opts->sps[i], 0, sizeof(opts->sps[i])); + } + + if (!ci_largepage) { + opts->flags &= ~PPC_HASH64_CI_LARGEPAGE; + } +} diff --git a/target/ppc/mmu-hash64.h b/target/ppc/mmu-hash64.h index 53dcec5b93..f11efc9cbc 100644 --- a/target/ppc/mmu-hash64.h +++ b/target/ppc/mmu-hash64.h @@ -20,6 +20,9 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu, void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val); void ppc_hash64_init(PowerPCCPU *cpu); void ppc_hash64_finalize(PowerPCCPU *cpu); +void ppc_hash64_filter_pagesizes(PowerPCCPU *cpu, + bool (*cb)(void *, uint32_t, uint32_t), + void *opaque); #endif /* From 9dceda5fc34a5868012260ee7271c7a6f36cc1f4 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 16 Apr 2018 16:47:19 +1000 Subject: [PATCH 22/23] spapr: Limit available pagesizes to provide a consistent guest environment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit KVM HV has some limitations (deriving from the hardware) that mean not all host-cpu supported pagesizes may be usable in the guest. At present this means that KVM guests and TCG guests may see different available page sizes even if they notionally have the same vcpu model. This is confusing and also prevents migration between TCG and KVM. This patch makes the environment consistent by always allowing the same set of pagesizes. Since we can't remove the KVM limitations, we do this by always applying the same limitations it has, even to TCG guests. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater Reviewed-by: Greg Kurz --- hw/ppc/spapr_caps.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c index 722b213d9a..62663ebdf5 100644 --- a/hw/ppc/spapr_caps.c +++ b/hw/ppc/spapr_caps.c @@ -335,6 +335,39 @@ static void cap_hpt_maxpagesize_apply(sPAPRMachineState *spapr, spapr_check_pagesize(spapr, qemu_getrampagesize(), errp); } +static bool spapr_pagesize_cb(void *opaque, uint32_t seg_pshift, + uint32_t pshift) +{ + unsigned maxshift = *((unsigned *)opaque); + + assert(pshift >= seg_pshift); + + /* Don't allow the guest to use pages bigger than the configured + * maximum size */ + if (pshift > maxshift) { + return false; + } + + /* For whatever reason, KVM doesn't allow multiple pagesizes + * within a segment, *except* for the case of 16M pages in a 4k or + * 64k segment. Always exclude other cases, so that TCG and KVM + * guests see a consistent environment */ + if ((pshift != seg_pshift) && (pshift != 24)) { + return false; + } + + return true; +} + +static void cap_hpt_maxpagesize_cpu_apply(sPAPRMachineState *spapr, + PowerPCCPU *cpu, + uint8_t val, Error **errp) +{ + unsigned maxshift = val; + + ppc_hash64_filter_pagesizes(cpu, spapr_pagesize_cb, &maxshift); +} + sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { [SPAPR_CAP_HTM] = { .name = "htm", @@ -402,6 +435,7 @@ sPAPRCapabilityInfo capability_table[SPAPR_CAP_NUM] = { .set = spapr_cap_set_pagesize, .type = "int", .apply = cap_hpt_maxpagesize_apply, + .cpu_apply = cap_hpt_maxpagesize_cpu_apply, }, }; From e5ca28ecab5c69b7578e22391a66c97c3979ffd8 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Mon, 16 Apr 2018 16:19:52 +1000 Subject: [PATCH 23/23] spapr: Don't rewrite mmu capabilities in KVM mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently during KVM initialization on POWER, kvm_fixup_page_sizes() rewrites a bunch of information in the cpu state to reflect the capabilities of the host MMU and KVM. This overwrites the information that's already there reflecting how the TCG implementation of the MMU will operate. This means that we can get guest-visibly different behaviour between KVM and TCG (and between different KVM implementations). That's bad. It also prevents migration between KVM and TCG. The pseries machine type now has filtering of the pagesizes it allows the guest to use which means it can present a consistent model of the MMU across all accelerators. So, we can now replace kvm_fixup_page_sizes() with kvm_check_mmu() which merely verifies that the expected cpu model can be faithfully handled by KVM, rather than updating the cpu model to match KVM. We call kvm_check_mmu() from the spapr cpu reset code. This is a hack: conceptually it makes more sense where fixup_page_sizes() was - in the KVM cpu init path. However, doing that would require moving the platform's pagesize filtering much earlier, which would require a lot of work making further adjustments. There wouldn't be a lot of concrete point to doing that, since the only KVM implementation which has the awkward MMU restrictions is KVM HV, which can only work with an spapr guest anyway. Signed-off-by: David Gibson Reviewed-by: Cédric Le Goater --- hw/ppc/spapr_cpu_core.c | 2 + target/ppc/kvm.c | 135 ++++++++++++++++++++-------------------- target/ppc/kvm_ppc.h | 5 ++ 3 files changed, 73 insertions(+), 69 deletions(-) diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c index bfb94f650c..993759db47 100644 --- a/hw/ppc/spapr_cpu_core.c +++ b/hw/ppc/spapr_cpu_core.c @@ -78,6 +78,8 @@ static void spapr_cpu_reset(void *opaque) spapr_cpu->dtl_size = 0; spapr_caps_cpu_apply(SPAPR_MACHINE(qdev_get_machine()), cpu); + + kvm_check_mmu(cpu, &error_fatal); } void spapr_cpu_set_entry_state(PowerPCCPU *cpu, target_ulong nip, target_ulong r3) diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 9cfbd388ad..4df4ff6cbf 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -419,93 +419,93 @@ bool kvmppc_hpt_needs_host_contiguous_pages(void) return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL); } -static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift) +void kvm_check_mmu(PowerPCCPU *cpu, Error **errp) { - if (!kvmppc_hpt_needs_host_contiguous_pages()) { - return true; - } - - return (1ul << shift) <= rampgsize; -} - -static long max_cpu_page_size; - -static void kvm_fixup_page_sizes(PowerPCCPU *cpu) -{ - static struct kvm_ppc_smmu_info smmu_info; - static bool has_smmu_info; - CPUPPCState *env = &cpu->env; + struct kvm_ppc_smmu_info smmu_info; int iq, ik, jq, jk; - /* We only handle page sizes for 64-bit server guests for now */ - if (!(env->mmu_model & POWERPC_MMU_64)) { + /* For now, we only have anything to check on hash64 MMUs */ + if (!cpu->hash64_opts || !kvm_enabled()) { return; } - /* Collect MMU info from kernel if not already */ - if (!has_smmu_info) { - kvm_get_smmu_info(cpu, &smmu_info); - has_smmu_info = true; + kvm_get_smmu_info(cpu, &smmu_info); + + if (ppc_hash64_has(cpu, PPC_HASH64_1TSEG) + && !(smmu_info.flags & KVM_PPC_1T_SEGMENTS)) { + error_setg(errp, + "KVM does not support 1TiB segments which guest expects"); + return; } - if (!max_cpu_page_size) { - max_cpu_page_size = qemu_getrampagesize(); - } - - /* Convert to QEMU form */ - memset(cpu->hash64_opts->sps, 0, sizeof(*cpu->hash64_opts->sps)); - - /* If we have HV KVM, we need to forbid CI large pages if our - * host page size is smaller than 64K. - */ - if (kvmppc_hpt_needs_host_contiguous_pages()) { - if (getpagesize() >= 0x10000) { - cpu->hash64_opts->flags |= PPC_HASH64_CI_LARGEPAGE; - } else { - cpu->hash64_opts->flags &= ~PPC_HASH64_CI_LARGEPAGE; - } + if (smmu_info.slb_size < cpu->hash64_opts->slb_size) { + error_setg(errp, "KVM only supports %u SLB entries, but guest needs %u", + smmu_info.slb_size, cpu->hash64_opts->slb_size); + return; } /* - * XXX This loop should be an entry wide AND of the capabilities that - * the selected CPU has with the capabilities that KVM supports. + * Verify that every pagesize supported by the cpu model is + * supported by KVM with the same encodings */ - for (ik = iq = 0; ik < KVM_PPC_PAGE_SIZES_MAX_SZ; ik++) { + for (iq = 0; iq < ARRAY_SIZE(cpu->hash64_opts->sps); iq++) { PPCHash64SegmentPageSizes *qsps = &cpu->hash64_opts->sps[iq]; - struct kvm_ppc_one_seg_page_size *ksps = &smmu_info.sps[ik]; + struct kvm_ppc_one_seg_page_size *ksps; - if (!kvm_valid_page_size(smmu_info.flags, max_cpu_page_size, - ksps->page_shift)) { - continue; - } - qsps->page_shift = ksps->page_shift; - qsps->slb_enc = ksps->slb_enc; - for (jk = jq = 0; jk < KVM_PPC_PAGE_SIZES_MAX_SZ; jk++) { - if (!kvm_valid_page_size(smmu_info.flags, max_cpu_page_size, - ksps->enc[jk].page_shift)) { - continue; - } - qsps->enc[jq].page_shift = ksps->enc[jk].page_shift; - qsps->enc[jq].pte_enc = ksps->enc[jk].pte_enc; - if (++jq >= PPC_PAGE_SIZES_MAX_SZ) { + for (ik = 0; ik < ARRAY_SIZE(smmu_info.sps); ik++) { + if (qsps->page_shift == smmu_info.sps[ik].page_shift) { break; } } - if (++iq >= PPC_PAGE_SIZES_MAX_SZ) { - break; + if (ik >= ARRAY_SIZE(smmu_info.sps)) { + error_setg(errp, "KVM doesn't support for base page shift %u", + qsps->page_shift); + return; + } + + ksps = &smmu_info.sps[ik]; + if (ksps->slb_enc != qsps->slb_enc) { + error_setg(errp, +"KVM uses SLB encoding 0x%x for page shift %u, but guest expects 0x%x", + ksps->slb_enc, ksps->page_shift, qsps->slb_enc); + return; + } + + for (jq = 0; jq < ARRAY_SIZE(qsps->enc); jq++) { + for (jk = 0; jk < ARRAY_SIZE(ksps->enc); jk++) { + if (qsps->enc[jq].page_shift == ksps->enc[jk].page_shift) { + break; + } + } + + if (jk >= ARRAY_SIZE(ksps->enc)) { + error_setg(errp, "KVM doesn't support page shift %u/%u", + qsps->enc[jq].page_shift, qsps->page_shift); + return; + } + if (qsps->enc[jq].pte_enc != ksps->enc[jk].pte_enc) { + error_setg(errp, +"KVM uses PTE encoding 0x%x for page shift %u/%u, but guest expects 0x%x", + ksps->enc[jk].pte_enc, qsps->enc[jq].page_shift, + qsps->page_shift, qsps->enc[jq].pte_enc); + return; + } } } - cpu->hash64_opts->slb_size = smmu_info.slb_size; - if (!(smmu_info.flags & KVM_PPC_1T_SEGMENTS)) { - cpu->hash64_opts->flags &= ~PPC_HASH64_1TSEG; + + if (ppc_hash64_has(cpu, PPC_HASH64_CI_LARGEPAGE)) { + /* Mostly what guest pagesizes we can use are related to the + * host pages used to map guest RAM, which is handled in the + * platform code. Cache-Inhibited largepages (64k) however are + * used for I/O, so if they're mapped to the host at all it + * will be a normal mapping, not a special hugepage one used + * for RAM. */ + if (getpagesize() < 0x10000) { + error_setg(errp, + "KVM can't supply 64kiB CI pages, which guest expects"); + } } } -#else /* defined (TARGET_PPC64) */ - -static inline void kvm_fixup_page_sizes(PowerPCCPU *cpu) -{ -} - #endif /* !defined (TARGET_PPC64) */ unsigned long kvm_arch_vcpu_id(CPUState *cpu) @@ -551,9 +551,6 @@ int kvm_arch_init_vcpu(CPUState *cs) CPUPPCState *cenv = &cpu->env; int ret; - /* Gather server mmu info from KVM and update the CPU state */ - kvm_fixup_page_sizes(cpu); - /* Synchronize sregs with kvm */ ret = kvm_arch_sync_sregs(cpu); if (ret) { diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h index 443fca0a4e..657582bb32 100644 --- a/target/ppc/kvm_ppc.h +++ b/target/ppc/kvm_ppc.h @@ -71,6 +71,7 @@ int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift); bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu); bool kvmppc_hpt_needs_host_contiguous_pages(void); +void kvm_check_mmu(PowerPCCPU *cpu, Error **errp); #else @@ -227,6 +228,10 @@ static inline bool kvmppc_hpt_needs_host_contiguous_pages(void) return false; } +static inline void kvm_check_mmu(PowerPCCPU *cpu, Error **errp) +{ +} + static inline bool kvmppc_has_cap_spapr_vfio(void) { return false;