mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
ppc patch queue 2020-08-18
Here's my first pull request for qemu-5.2, which has quite a few accumulated things. Highlights are: * Preliminary support for POWER10 (Power ISA 3.1) instruction emulation * Add documentation on the (very confusing) pseries NUMA configuration * Fix some bugs handling edge cases with XICS, XIVE and kernel_irqchip * Fix icount for a number of POWER registers * Many cleanups to error handling in XIVE code * Validate size of -prom-env data -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEdfRlhq5hpmzETofcbDjKyiDZs5IFAl87VpwACgkQbDjKyiDZ s5LjIxAAs8YAQe3uDRz1Wb9GftoMmEHdq7JQoO0FbXDQIVXzpTAXmFLSBtCWKl6p O1MEIy/o48b5ORXJqSDSA5LgxbHxYfHdIPEY5Tbn/TGvTvKyCukx9n11milUG8In JxRrOTQBnQAAHkLoyuZyrWKOauC0N1scNrnX9Geuid13GcmqHg1d2alXAUu8jEeC HSiVmtMqqyyqTx2xA4vfhaGuuwTthnKNfbGdg9ksVqBsCW+etn6ZKGImt8hBe3qO 5iqbQZvFbkpzgbjkhDzUDM6tmUAFN55y/Y+y7I8Tz4/IX7d3WbdqpplwrXXVWkpq 2gcBBjQ/9a1hPTBRVN9jn4CvHfhILBfeHIElUiLpSTQZQQALymTnnI2pLCgKoEFX LcchXbjiX+pZ2OJnAijpwBcknjgT2U/ZNyiqHJfSQ6jzlYx1YtUf4xGUsgloSiK8 9QDK8o2k0Cm8Be+lPMBMmTctoi8bq+8SN5UUF710WQL235J58o9+z1vuGO2HVk3x flBtv/+B890wcCDpGU80DPs/LSzR0xTTbA5JsWft2fvO569mda0MoWkJH5w6jvSc ZLYqljCzFCVW+tKiGHzaBalJaMwn0+QMDTsxzP3yTt5LmmEeRXpBELgvrW64IobD xBeryH3nG4SwxFSJq+4ATfvUzjy/Eo58lTTl6c53Ji8/D3aFwsA= =L9Wi -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-5.2-20200818' into staging ppc patch queue 2020-08-18 Here's my first pull request for qemu-5.2, which has quite a few accumulated things. Highlights are: * Preliminary support for POWER10 (Power ISA 3.1) instruction emulation * Add documentation on the (very confusing) pseries NUMA configuration * Fix some bugs handling edge cases with XICS, XIVE and kernel_irqchip * Fix icount for a number of POWER registers * Many cleanups to error handling in XIVE code * Validate size of -prom-env data # gpg: Signature made Tue 18 Aug 2020 05:18:36 BST # gpg: using RSA key 75F46586AE61A66CC44E87DC6C38CACA20D9B392 # gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>" [full] # gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>" [full] # gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>" [full] # gpg: aka "David Gibson (kernel.org) <dwg@kernel.org>" [unknown] # Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392 * remotes/dgibson/tags/ppc-for-5.2-20200818: (40 commits) spapr/xive: Use xive_source_esb_len() nvram: Exit QEMU if NVRAM cannot contain all -prom-env data spapr/xive: Simplify error handling of kvmppc_xive_cpu_synchronize_state() ppc/xive: Simplify error handling in xive_tctx_realize() spapr/xive: Simplify error handling in kvmppc_xive_connect() ppc/xive: Fix error handling in vmstate_xive_tctx_*() callbacks spapr/xive: Fix error handling in kvmppc_xive_post_load() spapr/kvm: Fix error handling in kvmppc_xive_pre_save() spapr/xive: Rework error handling of kvmppc_xive_set_source_config() spapr/xive: Rework error handling in kvmppc_xive_get_queues() spapr/xive: Rework error handling of kvmppc_xive_[gs]et_queue_config() spapr/xive: Rework error handling of kvmppc_xive_cpu_[gs]et_state() spapr/xive: Rework error handling of kvmppc_xive_mmap() spapr/xive: Rework error handling of kvmppc_xive_source_reset() spapr/xive: Rework error handling of kvmppc_xive_cpu_connect() spapr: Simplify error handling in spapr_phb_realize() spapr/xive: Convert KVM device fd checks to assert() ppc/xive: Introduce dedicated kvm_irqchip_in_kernel() wrappers ppc/xive: Rework setup of XiveSource::esb_mmio target/ppc: Integrate icount to purr, vtb, and tbu40 ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
dd8014e4e9
29 changed files with 719 additions and 302 deletions
|
@ -558,7 +558,8 @@ static int spapr_dt_dynamic_reconfiguration_memory(SpaprMachineState *spapr,
|
|||
int nb_numa_nodes = machine->numa_state->num_nodes;
|
||||
int ret, i, offset;
|
||||
uint64_t lmb_size = SPAPR_MEMORY_BLOCK_SIZE;
|
||||
uint32_t prop_lmb_size[] = {0, cpu_to_be32(lmb_size)};
|
||||
uint32_t prop_lmb_size[] = {cpu_to_be32(lmb_size >> 32),
|
||||
cpu_to_be32(lmb_size & 0xffffffff)};
|
||||
uint32_t *int_buf, *cur_index, buf_len;
|
||||
int nr_nodes = nb_numa_nodes ? nb_numa_nodes : 1;
|
||||
MemoryDeviceInfoList *dimms = NULL;
|
||||
|
@ -905,7 +906,8 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
|||
uint32_t lrdr_capacity[] = {
|
||||
cpu_to_be32(max_device_addr >> 32),
|
||||
cpu_to_be32(max_device_addr & 0xffffffff),
|
||||
0, cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE),
|
||||
cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE >> 32),
|
||||
cpu_to_be32(SPAPR_MEMORY_BLOCK_SIZE & 0xffffffff),
|
||||
cpu_to_be32(ms->smp.max_cpus / ms->smp.threads),
|
||||
};
|
||||
uint32_t maxdomain = cpu_to_be32(spapr->gpu_numa_id > 1 ? 1 : 0);
|
||||
|
|
|
@ -180,24 +180,24 @@ static void spapr_cap_set_pagesize(Object *obj, Visitor *v, const char *name,
|
|||
|
||||
static void cap_htm_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
if (!val) {
|
||||
/* TODO: We don't support disabling htm yet */
|
||||
return;
|
||||
}
|
||||
if (tcg_enabled()) {
|
||||
error_setg(errp,
|
||||
"No Transactional Memory support in TCG,"
|
||||
" try appending -machine cap-htm=off");
|
||||
error_setg(errp, "No Transactional Memory support in TCG");
|
||||
error_append_hint(errp, "Try appending -machine cap-htm=off\n");
|
||||
} else if (kvm_enabled() && !kvmppc_has_cap_htm()) {
|
||||
error_setg(errp,
|
||||
"KVM implementation does not support Transactional Memory,"
|
||||
" try appending -machine cap-htm=off"
|
||||
);
|
||||
"KVM implementation does not support Transactional Memory");
|
||||
error_append_hint(errp, "Try appending -machine cap-htm=off\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void cap_vsx_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
|
||||
|
@ -209,13 +209,14 @@ static void cap_vsx_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
|
|||
* rid of anything that doesn't do VMX */
|
||||
g_assert(env->insns_flags & PPC_ALTIVEC);
|
||||
if (!(env->insns_flags2 & PPC2_VSX)) {
|
||||
error_setg(errp, "VSX support not available,"
|
||||
" try appending -machine cap-vsx=off");
|
||||
error_setg(errp, "VSX support not available");
|
||||
error_append_hint(errp, "Try appending -machine cap-vsx=off\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void cap_dfp_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
||||
CPUPPCState *env = &cpu->env;
|
||||
|
||||
|
@ -224,8 +225,8 @@ static void cap_dfp_apply(SpaprMachineState *spapr, uint8_t val, Error **errp)
|
|||
return;
|
||||
}
|
||||
if (!(env->insns_flags2 & PPC2_DFP)) {
|
||||
error_setg(errp, "DFP support not available,"
|
||||
" try appending -machine cap-dfp=off");
|
||||
error_setg(errp, "DFP support not available");
|
||||
error_append_hint(errp, "Try appending -machine cap-dfp=off\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -239,6 +240,7 @@ SpaprCapPossible cap_cfpc_possible = {
|
|||
static void cap_safe_cache_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
uint8_t kvm_val = kvmppc_get_cap_safe_cache();
|
||||
|
||||
if (tcg_enabled() && val) {
|
||||
|
@ -247,9 +249,9 @@ static void cap_safe_cache_apply(SpaprMachineState *spapr, uint8_t val,
|
|||
cap_cfpc_possible.vals[val]);
|
||||
} else if (kvm_enabled() && (val > kvm_val)) {
|
||||
error_setg(errp,
|
||||
"Requested safe cache capability level not supported by kvm,"
|
||||
" try appending -machine cap-cfpc=%s",
|
||||
cap_cfpc_possible.vals[kvm_val]);
|
||||
"Requested safe cache capability level not supported by KVM");
|
||||
error_append_hint(errp, "Try appending -machine cap-cfpc=%s\n",
|
||||
cap_cfpc_possible.vals[kvm_val]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -263,6 +265,7 @@ SpaprCapPossible cap_sbbc_possible = {
|
|||
static void cap_safe_bounds_check_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
uint8_t kvm_val = kvmppc_get_cap_safe_bounds_check();
|
||||
|
||||
if (tcg_enabled() && val) {
|
||||
|
@ -271,9 +274,9 @@ static void cap_safe_bounds_check_apply(SpaprMachineState *spapr, uint8_t val,
|
|||
cap_sbbc_possible.vals[val]);
|
||||
} else if (kvm_enabled() && (val > kvm_val)) {
|
||||
error_setg(errp,
|
||||
"Requested safe bounds check capability level not supported by kvm,"
|
||||
" try appending -machine cap-sbbc=%s",
|
||||
cap_sbbc_possible.vals[kvm_val]);
|
||||
"Requested safe bounds check capability level not supported by KVM");
|
||||
error_append_hint(errp, "Try appending -machine cap-sbbc=%s\n",
|
||||
cap_sbbc_possible.vals[kvm_val]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -290,6 +293,7 @@ SpaprCapPossible cap_ibs_possible = {
|
|||
static void cap_safe_indirect_branch_apply(SpaprMachineState *spapr,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
uint8_t kvm_val = kvmppc_get_cap_safe_indirect_branch();
|
||||
|
||||
if (tcg_enabled() && val) {
|
||||
|
@ -298,9 +302,9 @@ static void cap_safe_indirect_branch_apply(SpaprMachineState *spapr,
|
|||
cap_ibs_possible.vals[val]);
|
||||
} else if (kvm_enabled() && (val > kvm_val)) {
|
||||
error_setg(errp,
|
||||
"Requested safe indirect branch capability level not supported by kvm,"
|
||||
" try appending -machine cap-ibs=%s",
|
||||
cap_ibs_possible.vals[kvm_val]);
|
||||
"Requested safe indirect branch capability level not supported by KVM");
|
||||
error_append_hint(errp, "Try appending -machine cap-ibs=%s\n",
|
||||
cap_ibs_possible.vals[kvm_val]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -377,23 +381,35 @@ static void cap_hpt_maxpagesize_cpu_apply(SpaprMachineState *spapr,
|
|||
static void cap_nested_kvm_hv_apply(SpaprMachineState *spapr,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
||||
|
||||
if (!val) {
|
||||
/* capability disabled by default */
|
||||
return;
|
||||
}
|
||||
|
||||
if (tcg_enabled()) {
|
||||
error_setg(errp,
|
||||
"No Nested KVM-HV support in tcg,"
|
||||
" try appending -machine cap-nested-hv=off");
|
||||
error_setg(errp, "No Nested KVM-HV support in TCG");
|
||||
error_append_hint(errp, "Try appending -machine cap-nested-hv=off\n");
|
||||
} else if (kvm_enabled()) {
|
||||
if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0,
|
||||
spapr->max_compat_pvr)) {
|
||||
error_setg(errp, "Nested KVM-HV only supported on POWER9");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine max-cpu-compat=power9\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!kvmppc_has_cap_nested_kvm_hv()) {
|
||||
error_setg(errp,
|
||||
"KVM implementation does not support Nested KVM-HV,"
|
||||
" try appending -machine cap-nested-hv=off");
|
||||
"KVM implementation does not support Nested KVM-HV");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-nested-hv=off\n");
|
||||
} else if (kvmppc_set_cap_nested_kvm_hv(val) < 0) {
|
||||
error_setg(errp,
|
||||
"Error enabling cap-nested-hv with KVM, try cap-nested-hv=off");
|
||||
error_setg(errp, "Error enabling cap-nested-hv with KVM");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-nested-hv=off\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -401,6 +417,7 @@ static void cap_nested_kvm_hv_apply(SpaprMachineState *spapr,
|
|||
static void cap_large_decr_apply(SpaprMachineState *spapr,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
|
||||
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
|
||||
|
||||
|
@ -411,22 +428,23 @@ static void cap_large_decr_apply(SpaprMachineState *spapr,
|
|||
if (tcg_enabled()) {
|
||||
if (!ppc_check_compat(cpu, CPU_POWERPC_LOGICAL_3_00, 0,
|
||||
spapr->max_compat_pvr)) {
|
||||
error_setg(errp,
|
||||
"Large decrementer only supported on POWER9, try -cpu POWER9");
|
||||
error_setg(errp, "Large decrementer only supported on POWER9");
|
||||
error_append_hint(errp, "Try -cpu POWER9\n");
|
||||
return;
|
||||
}
|
||||
} else if (kvm_enabled()) {
|
||||
int kvm_nr_bits = kvmppc_get_cap_large_decr();
|
||||
|
||||
if (!kvm_nr_bits) {
|
||||
error_setg(errp,
|
||||
"No large decrementer support,"
|
||||
" try appending -machine cap-large-decr=off");
|
||||
error_setg(errp, "No large decrementer support");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-large-decr=off\n");
|
||||
} else if (pcc->lrg_decr_bits != kvm_nr_bits) {
|
||||
error_setg(errp,
|
||||
"KVM large decrementer size (%d) differs to model (%d),"
|
||||
" try appending -machine cap-large-decr=off",
|
||||
kvm_nr_bits, pcc->lrg_decr_bits);
|
||||
"KVM large decrementer size (%d) differs to model (%d)",
|
||||
kvm_nr_bits, pcc->lrg_decr_bits);
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-large-decr=off\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -435,14 +453,15 @@ static void cap_large_decr_cpu_apply(SpaprMachineState *spapr,
|
|||
PowerPCCPU *cpu,
|
||||
uint8_t val, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
CPUPPCState *env = &cpu->env;
|
||||
target_ulong lpcr = env->spr[SPR_LPCR];
|
||||
|
||||
if (kvm_enabled()) {
|
||||
if (kvmppc_enable_cap_large_decr(cpu, val)) {
|
||||
error_setg(errp,
|
||||
"No large decrementer support,"
|
||||
" try appending -machine cap-large-decr=off");
|
||||
error_setg(errp, "No large decrementer support");
|
||||
error_append_hint(errp,
|
||||
"Try appending -machine cap-large-decr=off\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -457,6 +476,7 @@ static void cap_large_decr_cpu_apply(SpaprMachineState *spapr,
|
|||
static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist();
|
||||
|
||||
if (tcg_enabled() && val) {
|
||||
|
@ -479,14 +499,15 @@ static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val,
|
|||
return;
|
||||
}
|
||||
error_setg(errp,
|
||||
"Requested count cache flush assist capability level not supported by kvm,"
|
||||
" try appending -machine cap-ccf-assist=off");
|
||||
"Requested count cache flush assist capability level not supported by KVM");
|
||||
error_append_hint(errp, "Try appending -machine cap-ccf-assist=off\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void cap_fwnmi_apply(SpaprMachineState *spapr, uint8_t val,
|
||||
Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
if (!val) {
|
||||
return; /* Disabled by default */
|
||||
}
|
||||
|
|
|
@ -139,6 +139,7 @@ SpaprIrq spapr_irq_dual = {
|
|||
|
||||
static int spapr_irq_check(SpaprMachineState *spapr, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
MachineState *machine = MACHINE(spapr);
|
||||
|
||||
/*
|
||||
|
@ -179,14 +180,19 @@ static int spapr_irq_check(SpaprMachineState *spapr, Error **errp)
|
|||
|
||||
/*
|
||||
* On a POWER9 host, some older KVM XICS devices cannot be destroyed and
|
||||
* re-created. Detect that early to avoid QEMU to exit later when the
|
||||
* guest reboots.
|
||||
* re-created. Same happens with KVM nested guests. Detect that early to
|
||||
* avoid QEMU to exit later when the guest reboots.
|
||||
*/
|
||||
if (kvm_enabled() &&
|
||||
spapr->irq == &spapr_irq_dual &&
|
||||
kvm_kernel_irqchip_required() &&
|
||||
xics_kvm_has_broken_disconnect(spapr)) {
|
||||
error_setg(errp, "KVM is too old to support ic-mode=dual,kernel-irqchip=on");
|
||||
error_setg(errp,
|
||||
"KVM is incompatible with ic-mode=dual,kernel-irqchip=on");
|
||||
error_append_hint(errp,
|
||||
"This can happen with an old KVM or in a KVM nested guest.\n");
|
||||
error_append_hint(errp,
|
||||
"Try without kernel-irqchip or with kernel-irqchip=off.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1796,6 +1796,7 @@ static void spapr_phb_destroy_msi(gpointer opaque)
|
|||
|
||||
static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
/* We don't use SPAPR_MACHINE() in order to exit gracefully if the user
|
||||
* tries to add a sPAPR PHB to a non-pseries machine.
|
||||
*/
|
||||
|
@ -1813,7 +1814,6 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
|||
uint64_t msi_window_size = 4096;
|
||||
SpaprTceTable *tcet;
|
||||
const unsigned windows_supported = spapr_phb_windows_supported(sphb);
|
||||
Error *local_err = NULL;
|
||||
|
||||
if (!spapr) {
|
||||
error_setg(errp, TYPE_SPAPR_PCI_HOST_BRIDGE " needs a pseries machine");
|
||||
|
@ -1964,13 +1964,12 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
|||
|
||||
/* Initialize the LSI table */
|
||||
for (i = 0; i < PCI_NUM_PINS; i++) {
|
||||
uint32_t irq = SPAPR_IRQ_PCI_LSI + sphb->index * PCI_NUM_PINS + i;
|
||||
int irq = SPAPR_IRQ_PCI_LSI + sphb->index * PCI_NUM_PINS + i;
|
||||
|
||||
if (smc->legacy_irq_allocation) {
|
||||
irq = spapr_irq_findone(spapr, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate_prepend(errp, local_err,
|
||||
"can't allocate LSIs: ");
|
||||
irq = spapr_irq_findone(spapr, errp);
|
||||
if (irq < 0) {
|
||||
error_prepend(errp, "can't allocate LSIs: ");
|
||||
/*
|
||||
* Older machines will never support PHB hotplug, ie, this is an
|
||||
* init only path and QEMU will terminate. No need to rollback.
|
||||
|
@ -1979,9 +1978,8 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
spapr_irq_claim(spapr, irq, true, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate_prepend(errp, local_err, "can't allocate LSIs: ");
|
||||
if (spapr_irq_claim(spapr, irq, true, errp) < 0) {
|
||||
error_prepend(errp, "can't allocate LSIs: ");
|
||||
goto unrealize;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue