aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2022-05-05 13:52:22 -0500
committerRichard Henderson <richard.henderson@linaro.org>2022-05-05 13:52:22 -0500
commit31abf61c4929a91275fe32f1fafe6e6b3e840b2a (patch)
tree696cb00a00b9bbd23b650af483041cb0922fc996 /hw
parente91b8994115d2f093e7556c9af2d051a26a98cfb (diff)
parentbf3dd1e6d0d7c5c4906f89776e15dddc22af784b (diff)
Merge tag 'pull-ppc-20220505' of https://gitlab.com/danielhb/qemu into staging
ppc patch queue for 2022-05-05: The star of the show in this PR is the 'Remove hidden usages of *env' work done by VĂ­ctor, which impacts a lot of target/ppc code and we want to get it landed ASAP so future target/ppc contributions can be based on it. Other changes: - XIVE fixes in guest interrupt handling - BookE debug interrupt fix - vhost-user TARGET_PPC64 macro fix - valgrind fixes in kvmppc functions # -----BEGIN PGP SIGNATURE----- # # iHUEABYKAB0WIQQX6/+ZI9AYAK8oOBk82cqW3gMxZAUCYnQbpgAKCRA82cqW3gMx # ZM1ZAQChjU/oBVDlhrlfInGjOcdXlM4l0R0pDQZ6dm1NYVqcvgD/WRNWj+tQ2H1V # xmKXSzrGlDyYFu1uozfU8kvYJeHaKgw= # =eRrg # -----END PGP SIGNATURE----- # gpg: Signature made Thu 05 May 2022 01:47:02 PM CDT # gpg: using EDDSA key 17EBFF9923D01800AF2838193CD9CA96DE033164 # gpg: Good signature from "Daniel Henrique Barboza <danielhb413@gmail.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 17EB FF99 23D0 1800 AF28 3819 3CD9 CA96 DE03 3164 * tag 'pull-ppc-20220505' of https://gitlab.com/danielhb/qemu: (30 commits) target/ppc: Change MSR_* to follow POWER ISA numbering convention target/ppc: Add unused msr bits FIELDs target/ppc: Remove msr_de macro target/ppc: Remove msr_hv macro target/ppc: Remove msr_ts macro target/ppc: Remove msr_fe0 and msr_fe1 macros target/ppc: Remove msr_ep macro target/ppc: Remove msr_dr macro target/ppc: Remove msr_ir macro target/ppc: Remove msr_cm macro target/ppc: Remove msr_fp macro target/ppc: Remove msr_gs macro target/ppc: Remove msr_me macro target/ppc: Remove msr_pow macro target/ppc: Remove msr_ce macro target/ppc: Remove msr_ee macro target/ppc: Remove msr_ile macro target/ppc: Remove msr_ds macro target/ppc: Remove msr_le macro target/ppc: Remove msr_pr macro ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r--hw/intc/xive.c25
-rw-r--r--hw/intc/xive2.c18
-rw-r--r--hw/ppc/pegasos2.c2
-rw-r--r--hw/ppc/spapr.c2
-rw-r--r--hw/virtio/vhost-user.c2
5 files changed, 36 insertions, 13 deletions
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index b8e4c7294d..ae221fed73 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -114,6 +114,17 @@ static void xive_tctx_notify(XiveTCTX *tctx, uint8_t ring)
}
}
+void xive_tctx_reset_os_signal(XiveTCTX *tctx)
+{
+ /*
+ * Lower the External interrupt. Used when pulling an OS
+ * context. It is necessary to avoid catching it in the hypervisor
+ * context. It should be raised again when re-pushing the OS
+ * context.
+ */
+ qemu_irq_lower(xive_tctx_output(tctx, TM_QW1_OS));
+}
+
static void xive_tctx_set_cppr(XiveTCTX *tctx, uint8_t ring, uint8_t cppr)
{
uint8_t *regs = &tctx->regs[ring];
@@ -388,6 +399,8 @@ static uint64_t xive_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx,
/* Invalidate CAM line */
qw1w2_new = xive_set_field32(TM_QW1W2_VO, qw1w2, 0);
xive_tctx_set_os_cam(tctx, qw1w2_new);
+
+ xive_tctx_reset_os_signal(tctx);
return qw1w2;
}
@@ -413,10 +426,16 @@ static void xive_tctx_need_resend(XiveRouter *xrtr, XiveTCTX *tctx,
/* Reset the NVT value */
nvt.w4 = xive_set_field32(NVT_W4_IPB, nvt.w4, 0);
xive_router_write_nvt(xrtr, nvt_blk, nvt_idx, &nvt, 4);
-
- /* Merge in current context */
- xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
+ /*
+ * Always call xive_tctx_ipb_update(). Even if there were no
+ * escalation triggered, there could be a pending interrupt which
+ * was saved when the context was pulled and that we need to take
+ * into account by recalculating the PIPR (which is not
+ * saved/restored).
+ * It will also raise the External interrupt signal if needed.
+ */
+ xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
/*
diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
index 3aff42a69e..4d9ff41956 100644
--- a/hw/intc/xive2.c
+++ b/hw/intc/xive2.c
@@ -269,6 +269,7 @@ uint64_t xive2_tm_pull_os_ctx(XivePresenter *xptr, XiveTCTX *tctx,
xive2_tctx_save_os_ctx(xrtr, tctx, nvp_blk, nvp_idx);
}
+ xive_tctx_reset_os_signal(tctx);
return qw1w2;
}
@@ -316,7 +317,6 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr, XiveTCTX *tctx,
{
Xive2Nvp nvp;
uint8_t ipb;
- uint8_t cppr = 0;
/*
* Grab the associated thread interrupt context registers in the
@@ -337,7 +337,7 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr, XiveTCTX *tctx,
/* Automatically restore thread context registers */
if (xive2_router_get_config(xrtr) & XIVE2_VP_SAVE_RESTORE &&
do_restore) {
- cppr = xive2_tctx_restore_os_ctx(xrtr, tctx, nvp_blk, nvp_idx, &nvp);
+ xive2_tctx_restore_os_ctx(xrtr, tctx, nvp_blk, nvp_idx, &nvp);
}
ipb = xive_get_field32(NVP2_W2_IPB, nvp.w2);
@@ -345,11 +345,15 @@ static void xive2_tctx_need_resend(Xive2Router *xrtr, XiveTCTX *tctx,
nvp.w2 = xive_set_field32(NVP2_W2_IPB, nvp.w2, 0);
xive2_router_write_nvp(xrtr, nvp_blk, nvp_idx, &nvp, 2);
}
-
- /* An IPB or CPPR change can trigger a resend */
- if (ipb || cppr) {
- xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
- }
+ /*
+ * Always call xive_tctx_ipb_update(). Even if there were no
+ * escalation triggered, there could be a pending interrupt which
+ * was saved when the context was pulled and that we need to take
+ * into account by recalculating the PIPR (which is not
+ * saved/restored).
+ * It will also raise the External interrupt signal if needed.
+ */
+ xive_tctx_ipb_update(tctx, TM_QW1_OS, ipb);
}
/*
diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
index 56bf203dfd..9411ca6b16 100644
--- a/hw/ppc/pegasos2.c
+++ b/hw/ppc/pegasos2.c
@@ -461,7 +461,7 @@ static void pegasos2_hypercall(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)
/* The TCG path should also be holding the BQL at this point */
g_assert(qemu_mutex_iothread_locked());
- if (msr_pr) {
+ if (FIELD_EX64(env->msr, MSR, PR)) {
qemu_log_mask(LOG_GUEST_ERROR, "Hypercall made with MSR[PR]=1\n");
env->gpr[3] = H_PRIVILEGE;
} else if (env->gpr[3] == KVMPPC_H_RTAS) {
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 22569305d2..fe9937e811 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1269,7 +1269,7 @@ static void emulate_spapr_hypercall(PPCVirtualHypervisor *vhyp,
g_assert(!vhyp_cpu_in_nested(cpu));
- if (msr_pr) {
+ if (FIELD_EX64(env->msr, MSR, PR)) {
hcall_dprintf("Hypercall made with MSR[PR]=1\n");
env->gpr[3] = H_PRIVILEGE;
} else {
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index 2d434ff0bc..afd51f79b3 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -51,7 +51,7 @@
#include "hw/acpi/acpi.h"
#define VHOST_USER_MAX_RAM_SLOTS ACPI_MAX_RAM_SLOTS
-#elif defined(TARGET_PPC) || defined(TARGET_PPC_64)
+#elif defined(TARGET_PPC) || defined(TARGET_PPC64)
#include "hw/ppc/spapr.h"
#define VHOST_USER_MAX_RAM_SLOTS SPAPR_MAX_RAM_SLOTS