aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2020-07-19 10:29:05 +0100
committerPeter Maydell <peter.maydell@linaro.org>2020-07-19 10:29:05 +0100
commit9fc87111005e8903785db40819af66b8f85b8b96 (patch)
tree2aebee3f20db42af2898ef37f4f718e5b62ffb4b
parentb4421193299c09dfe690ec93c9b4713ed710aa3e (diff)
parentba3c35d9c4026361fd380b269dc6def9510b7166 (diff)
downloadqemu-9fc87111005e8903785db40819af66b8f85b8b96.zip
qemu-9fc87111005e8903785db40819af66b8f85b8b96.tar.gz
qemu-9fc87111005e8903785db40819af66b8f85b8b96.tar.bz2
Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20200717' into staging
Fix vector min/max fallback expansion Fix singlestep from exception and interrupt # gpg: Signature made Fri 17 Jul 2020 19:13:32 BST # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * remotes/rth/tags/pull-tcg-20200717: tcg/cpu-exec: precise single-stepping after an interrupt tcg/cpu-exec: precise single-stepping after an exception tcg: Save/restore vecop_list around minmax fallback Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--accel/tcg/cpu-exec.c19
-rw-r--r--tcg/tcg-op-vec.c2
2 files changed, 20 insertions, 1 deletions
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index d95c484..66d38f9 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -504,6 +504,17 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
cc->do_interrupt(cpu);
qemu_mutex_unlock_iothread();
cpu->exception_index = -1;
+
+ if (unlikely(cpu->singlestep_enabled)) {
+ /*
+ * After processing the exception, ensure an EXCP_DEBUG is
+ * raised when single-stepping so that GDB doesn't miss the
+ * next instruction.
+ */
+ *ret = EXCP_DEBUG;
+ cpu_handle_debug_exception(cpu);
+ return true;
+ }
} else if (!replay_has_interrupt()) {
/* give a chance to iothread in replay mode */
*ret = EXCP_INTERRUPT;
@@ -577,7 +588,13 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
else {
if (cc->cpu_exec_interrupt(cpu, interrupt_request)) {
replay_interrupt();
- cpu->exception_index = -1;
+ /*
+ * After processing the interrupt, ensure an EXCP_DEBUG is
+ * raised when single-stepping so that GDB doesn't miss the
+ * next instruction.
+ */
+ cpu->exception_index =
+ (cpu->singlestep_enabled ? EXCP_DEBUG : -1);
*last_tb = NULL;
}
/* The target hook may have updated the 'cpu->interrupt_request';
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
index f784517..ed6fb55 100644
--- a/tcg/tcg-op-vec.c
+++ b/tcg/tcg-op-vec.c
@@ -657,7 +657,9 @@ static void do_minmax(unsigned vece, TCGv_vec r, TCGv_vec a,
TCGv_vec b, TCGOpcode opc, TCGCond cond)
{
if (!do_op3(vece, r, a, b, opc)) {
+ const TCGOpcode *hold_list = tcg_swap_vecop_list(NULL);
tcg_gen_cmpsel_vec(cond, vece, r, a, b, a, b);
+ tcg_swap_vecop_list(hold_list);
}
}