All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] target/arm: Remove unnecessary gen_io_end() calls
@ 2020-06-19 17:03 ` Peter Maydell
  0 siblings, 0 replies; 22+ messages in thread
From: Peter Maydell @ 2020-06-19 17:03 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Richard Henderson, Alex Bennée, Paolo Bonzini,
	Pavel Dovgalyuk

Since commit ba3e7926691ed3 it has been unnecessary for target code
to call gen_io_end() after an IO instruction in icount mode; it is
sufficient to call gen_io_start() before it and to force the end of
the TB.

Many now-unnecessary calls to gen_io_end() were removed in commit
9e9b10c6491153b, but some were missed or accidentally added later.
Remove unneeded calls from the arm target:

 * the call in the handling of exception-return-via-LDM is
   unnecessary, and the code is already forcing end-of-TB
 * the call in the VFP access check code is more complicated:
   we weren't ending the TB, so we need to add the code to
   force that by setting DISAS_UPDATE
 * the doc comment for ARM_CP_IO doesn't need to mention
   gen_io_end() any more

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target/arm/cpu.h               | 2 +-
 target/arm/translate-vfp.inc.c | 7 +++----
 target/arm/translate.c         | 3 ---
 3 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index 677584e5da0..cf66b8c7fb0 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -2334,7 +2334,7 @@ static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
  * migration or KVM state synchronization. (Typically this is for "registers"
  * which are actually used as instructions for cache maintenance and so on.)
  * IO indicates that this register does I/O and therefore its accesses
- * need to be surrounded by gen_io_start()/gen_io_end(). In particular,
+ * need to be marked with gen_io_start() and also end the TB. In particular,
  * registers which implement clocks or timers require this.
  * RAISES_EXC is for when the read or write hook might raise an exception;
  * the generated code will synchronize the CPU state before calling the hook
diff --git a/target/arm/translate-vfp.inc.c b/target/arm/translate-vfp.inc.c
index e1a90175983..bf31b186578 100644
--- a/target/arm/translate-vfp.inc.c
+++ b/target/arm/translate-vfp.inc.c
@@ -119,15 +119,14 @@ static bool full_vfp_access_check(DisasContext *s, bool ignore_vfp_enabled)
         if (s->v7m_lspact) {
             /*
              * Lazy state saving affects external memory and also the NVIC,
-             * so we must mark it as an IO operation for icount.
+             * so we must mark it as an IO operation for icount (and cause
+             * this to be the last insn in the TB).
              */
             if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
+                s->base.is_jmp = DISAS_UPDATE;
                 gen_io_start();
             }
             gen_helper_v7m_preserve_fp_state(cpu_env);
-            if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
-                gen_io_end();
-            }
             /*
              * If the preserve_fp_state helper doesn't throw an exception
              * then it will clear LSPACT; we don't need to repeat this for
diff --git a/target/arm/translate.c b/target/arm/translate.c
index 6d18892adee..2677eaeb1e1 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -8824,9 +8824,6 @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n)
             gen_io_start();
         }
         gen_helper_cpsr_write_eret(cpu_env, tmp);
-        if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
-            gen_io_end();
-        }
         tcg_temp_free_i32(tmp);
         /* Must exit loop to check un-masked IRQs */
         s->base.is_jmp = DISAS_EXIT;
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2020-06-25  9:23 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-19 17:03 [PATCH] target/arm: Remove unnecessary gen_io_end() calls Peter Maydell
2020-06-19 17:03 ` Peter Maydell
2020-06-19 17:15 ` Alex Bennée
2020-06-19 17:15   ` Alex Bennée
2020-06-19 17:24 ` no-reply
2020-06-19 17:24   ` no-reply
2020-06-20  0:23 ` Richard Henderson
2020-06-20  0:23   ` Richard Henderson
2020-06-22  7:17 ` Pavel Dovgalyuk
2020-06-22  7:17   ` Pavel Dovgalyuk
2020-06-22  7:30   ` Role of qemu-arm vincent Dupaquis
2020-06-22  8:57     ` Alex Bennée
2020-06-22  9:29       ` Philippe Mathieu-Daudé
2020-06-22 11:27         ` vincent Dupaquis
2020-06-22 12:16           ` Peter Maydell
2020-06-22 13:03             ` vincent Dupaquis
2020-06-22 13:43               ` Peter Maydell
2020-06-24  8:45                 ` vincent Dupaquis
2020-06-24 10:14                   ` Alex Bennée
2020-06-25  6:52                     ` vincent Dupaquis
2020-06-25  8:46                       ` Peter Maydell
2020-06-25  9:23                       ` Alex Bennée

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.