All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PULL 06/51] target/arm: Split arm_cpu_data_is_big_endian
Date: Thu, 24 Oct 2019 17:26:39 +0100	[thread overview]
Message-ID: <20191024162724.31675-7-peter.maydell@linaro.org> (raw)
In-Reply-To: <20191024162724.31675-1-peter.maydell@linaro.org>

From: Richard Henderson <richard.henderson@linaro.org>

Set TBFLAG_ANY.BE_DATA in rebuild_hflags_common_32 and
rebuild_hflags_a64 instead of rebuild_hflags_common, where we do
not need to re-test is_a64() nor re-compute the various inputs.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20191023150057.25731-5-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target/arm/cpu.h    | 49 +++++++++++++++++++++++++++------------------
 target/arm/helper.c | 16 +++++++++++----
 2 files changed, 42 insertions(+), 23 deletions(-)

diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index ad79a6153bb..4d961474ce7 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -3108,33 +3108,44 @@ static inline uint64_t arm_sctlr(CPUARMState *env, int el)
     }
 }
 
+static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
+                                                  bool sctlr_b)
+{
+#ifdef CONFIG_USER_ONLY
+    /*
+     * In system mode, BE32 is modelled in line with the
+     * architecture (as word-invariant big-endianness), where loads
+     * and stores are done little endian but from addresses which
+     * are adjusted by XORing with the appropriate constant. So the
+     * endianness to use for the raw data access is not affected by
+     * SCTLR.B.
+     * In user mode, however, we model BE32 as byte-invariant
+     * big-endianness (because user-only code cannot tell the
+     * difference), and so we need to use a data access endianness
+     * that depends on SCTLR.B.
+     */
+    if (sctlr_b) {
+        return true;
+    }
+#endif
+    /* In 32bit endianness is determined by looking at CPSR's E bit */
+    return env->uncached_cpsr & CPSR_E;
+}
+
+static inline bool arm_cpu_data_is_big_endian_a64(int el, uint64_t sctlr)
+{
+    return sctlr & (el ? SCTLR_EE : SCTLR_E0E);
+}
 
 /* Return true if the processor is in big-endian mode. */
 static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
 {
-    /* In 32bit endianness is determined by looking at CPSR's E bit */
     if (!is_a64(env)) {
-        return
-#ifdef CONFIG_USER_ONLY
-            /* In system mode, BE32 is modelled in line with the
-             * architecture (as word-invariant big-endianness), where loads
-             * and stores are done little endian but from addresses which
-             * are adjusted by XORing with the appropriate constant. So the
-             * endianness to use for the raw data access is not affected by
-             * SCTLR.B.
-             * In user mode, however, we model BE32 as byte-invariant
-             * big-endianness (because user-only code cannot tell the
-             * difference), and so we need to use a data access endianness
-             * that depends on SCTLR.B.
-             */
-            arm_sctlr_b(env) ||
-#endif
-                ((env->uncached_cpsr & CPSR_E) ? 1 : 0);
+        return arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env));
     } else {
         int cur_el = arm_current_el(env);
         uint64_t sctlr = arm_sctlr(env, cur_el);
-
-        return (sctlr & (cur_el ? SCTLR_EE : SCTLR_E0E)) != 0;
+        return arm_cpu_data_is_big_endian_a64(cur_el, sctlr);
     }
 }
 
diff --git a/target/arm/helper.c b/target/arm/helper.c
index f05d0424745..4c65476d936 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -11061,9 +11061,6 @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
     flags = FIELD_DP32(flags, TBFLAG_ANY, MMUIDX,
                        arm_to_core_mmu_idx(mmu_idx));
 
-    if (arm_cpu_data_is_big_endian(env)) {
-        flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
-    }
     if (arm_singlestep_active(env)) {
         flags = FIELD_DP32(flags, TBFLAG_ANY, SS_ACTIVE, 1);
     }
@@ -11073,7 +11070,14 @@ static uint32_t rebuild_hflags_common(CPUARMState *env, int fp_el,
 static uint32_t rebuild_hflags_common_32(CPUARMState *env, int fp_el,
                                          ARMMMUIdx mmu_idx, uint32_t flags)
 {
-    flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, arm_sctlr_b(env));
+    bool sctlr_b = arm_sctlr_b(env);
+
+    if (sctlr_b) {
+        flags = FIELD_DP32(flags, TBFLAG_A32, SCTLR_B, 1);
+    }
+    if (arm_cpu_data_is_big_endian_a32(env, sctlr_b)) {
+        flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
+    }
     flags = FIELD_DP32(flags, TBFLAG_A32, NS, !access_secure_reg(env));
 
     return rebuild_hflags_common(env, fp_el, mmu_idx, flags);
@@ -11122,6 +11126,10 @@ static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
 
     sctlr = arm_sctlr(env, el);
 
+    if (arm_cpu_data_is_big_endian_a64(el, sctlr)) {
+        flags = FIELD_DP32(flags, TBFLAG_ANY, BE_DATA, 1);
+    }
+
     if (cpu_isar_feature(aa64_pauth, env_archcpu(env))) {
         /*
          * In order to save space in flags, we record only whether
-- 
2.20.1



  parent reply	other threads:[~2019-10-24 16:56 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-24 16:26 [PULL 00/51] target-arm queue Peter Maydell
2019-10-24 16:26 ` [PULL 01/51] hw/gpio: Fix property accessors of the AST2600 GPIO 1.8V model Peter Maydell
2019-10-24 16:26 ` [PULL 02/51] aspeed: Add an AST2600 eval board Peter Maydell
2019-10-24 16:26 ` [PULL 03/51] target/arm: Split out rebuild_hflags_common Peter Maydell
2019-10-24 16:26 ` [PULL 04/51] target/arm: Split out rebuild_hflags_a64 Peter Maydell
2019-10-24 16:26 ` [PULL 05/51] target/arm: Split out rebuild_hflags_common_32 Peter Maydell
2019-10-24 16:26 ` Peter Maydell [this message]
2019-10-24 16:26 ` [PULL 07/51] target/arm: Split out rebuild_hflags_m32 Peter Maydell
2019-10-24 16:26 ` [PULL 08/51] target/arm: Reduce tests vs M-profile in cpu_get_tb_cpu_state Peter Maydell
2019-10-24 16:26 ` [PULL 09/51] target/arm: Split out rebuild_hflags_a32 Peter Maydell
2019-10-24 16:26 ` [PULL 10/51] target/arm: Split out rebuild_hflags_aprofile Peter Maydell
2019-10-24 16:26 ` [PULL 11/51] target/arm: Hoist XSCALE_CPAR, VECLEN, VECSTRIDE in cpu_get_tb_cpu_state Peter Maydell
2019-10-24 16:26 ` [PULL 12/51] target/arm: Simplify set of PSTATE_SS " Peter Maydell
2019-10-24 16:26 ` [PULL 13/51] target/arm: Hoist computation of TBFLAG_A32.VFPEN Peter Maydell
2019-10-24 16:26 ` [PULL 14/51] target/arm: Add arm_rebuild_hflags Peter Maydell
2019-10-24 16:26 ` [PULL 15/51] target/arm: Split out arm_mmu_idx_el Peter Maydell
2019-10-24 16:26 ` [PULL 16/51] target/arm: Hoist store to cs_base in cpu_get_tb_cpu_state Peter Maydell
2019-10-24 16:26 ` [PULL 17/51] target/arm: Add HELPER(rebuild_hflags_{a32, a64, m32}) Peter Maydell
2019-10-24 16:26 ` [PULL 18/51] target/arm: Rebuild hflags at EL changes Peter Maydell
2019-10-24 16:26 ` [PULL 19/51] target/arm: Rebuild hflags at MSR writes Peter Maydell
2019-10-24 16:26 ` [PULL 20/51] target/arm: Rebuild hflags at CPSR writes Peter Maydell
2019-10-24 16:26 ` [PULL 21/51] target/arm: Rebuild hflags at Xscale SCTLR writes Peter Maydell
2019-10-24 16:26 ` [PULL 22/51] target/arm: Rebuild hflags for M-profile Peter Maydell
2019-10-24 16:26 ` [PULL 23/51] target/arm: Rebuild hflags for M-profile NVIC Peter Maydell
2019-10-24 16:26 ` [PULL 24/51] linux-user/aarch64: Rebuild hflags for TARGET_WORDS_BIGENDIAN Peter Maydell
2019-10-24 16:26 ` [PULL 25/51] linux-user/arm: " Peter Maydell
2019-10-24 16:26 ` [PULL 26/51] target/arm: Rely on hflags correct in cpu_get_tb_cpu_state Peter Maydell
2019-10-24 16:27 ` [PULL 27/51] hw/net/fsl_etsec/etsec.c: Switch to transaction-based ptimer API Peter Maydell
2019-10-24 16:27 ` [PULL 28/51] hw/timer/xilinx_timer.c: " Peter Maydell
2019-10-24 16:27 ` [PULL 29/51] hw/dma/xilinx_axidma.c: " Peter Maydell
2019-10-24 16:27 ` [PULL 30/51] hw/timer/slavio_timer: Remove useless check for NULL t->timer Peter Maydell
2019-10-24 16:27 ` [PULL 31/51] hw/timer/slavio_timer.c: Switch to transaction-based ptimer API Peter Maydell
2019-10-24 16:27 ` [PULL 32/51] hw/timer/grlib_gptimer.c: " Peter Maydell
2019-10-24 16:27 ` [PULL 33/51] hw/m68k/mcf5206.c: " Peter Maydell
2019-10-24 16:27 ` [PULL 34/51] hw/watchdog/milkymist-sysctl.c: " Peter Maydell
2019-10-24 16:27 ` [PULL 35/51] target/arm/monitor: Introduce qmp_query_cpu_model_expansion Peter Maydell
2019-10-24 16:27 ` [PULL 36/51] tests: arm: Introduce cpu feature tests Peter Maydell
2019-10-24 16:27 ` [PULL 37/51] target/arm: Allow SVE to be disabled via a CPU property Peter Maydell
2019-10-24 16:27 ` [PULL 38/51] target/arm/cpu64: max cpu: Introduce sve<N> properties Peter Maydell
2019-10-24 16:27 ` [PULL 39/51] target/arm/kvm64: Add kvm_arch_get/put_sve Peter Maydell
2019-10-24 16:27 ` [PULL 40/51] target/arm/kvm64: max cpu: Enable SVE when available Peter Maydell
2019-10-24 16:27 ` [PULL 41/51] target/arm/kvm: scratch vcpu: Preserve input kvm_vcpu_init features Peter Maydell
2019-10-24 16:27 ` [PULL 42/51] target/arm/cpu64: max cpu: Support sve properties with KVM Peter Maydell
2019-10-24 16:27 ` [PULL 43/51] target/arm/kvm: host cpu: Add support for sve<N> properties Peter Maydell
2019-10-24 16:27 ` [PULL 44/51] hw/misc/bcm2835_thermal: Add a dummy BCM2835 thermal sensor Peter Maydell
2019-10-24 16:27 ` [PULL 45/51] hw/arm/bcm2835_peripherals: Use the thermal sensor block Peter Maydell
2019-10-24 16:27 ` [PULL 46/51] hw/timer/bcm2835: Add the BCM2835 SYS_timer Peter Maydell
2019-10-24 16:27 ` [PULL 47/51] hw/arm/bcm2835_peripherals: Use the SYS_timer Peter Maydell
2019-10-24 16:27 ` [PULL 48/51] hw/arm/bcm2836: Make the SoC code modular Peter Maydell
2019-10-24 16:27 ` [PULL 49/51] hw/arm/bcm2836: Rename cpus[] as cpu[].core Peter Maydell
2019-10-24 16:27 ` [PULL 50/51] hw/arm/raspi: Use AddressSpace when using arm_boot::write_secondary_boot Peter Maydell
2019-10-24 16:27 ` [PULL 51/51] hw/arm/highbank: Use AddressSpace when using write_secondary_boot() Peter Maydell
2019-10-24 18:18 ` [PULL 00/51] target-arm queue Philippe Mathieu-Daudé
2019-10-24 19:29   ` Mark Cave-Ayland

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191024162724.31675-7-peter.maydell@linaro.org \
    --to=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.