[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v14 33/80] target/arm: move fp_exception_el out of TCG helpers
From: |
Claudio Fontana |
Subject: |
[RFC v14 33/80] target/arm: move fp_exception_el out of TCG helpers |
Date: |
Fri, 16 Apr 2021 18:27:37 +0200 |
Signed-off-by: Claudio Fontana <cfontana@suse.de>
---
target/arm/cpu-sysemu.c | 100 ++++++++++++++++++++++++++++++++++++++++
target/arm/cpu-user.c | 5 ++
target/arm/tcg/helper.c | 100 ----------------------------------------
3 files changed, 105 insertions(+), 100 deletions(-)
diff --git a/target/arm/cpu-sysemu.c b/target/arm/cpu-sysemu.c
index 7cc721fe68..128616d90d 100644
--- a/target/arm/cpu-sysemu.c
+++ b/target/arm/cpu-sysemu.c
@@ -410,3 +410,103 @@ int sve_exception_el(CPUARMState *env, int el)
}
return 0;
}
+
+/*
+ * Return the exception level to which FP-disabled exceptions should
+ * be taken, or 0 if FP is enabled.
+ */
+int fp_exception_el(CPUARMState *env, int cur_el)
+{
+#ifndef CONFIG_USER_ONLY
+ /*
+ * CPACR and the CPTR registers don't exist before v6, so FP is
+ * always accessible
+ */
+ if (!arm_feature(env, ARM_FEATURE_V6)) {
+ return 0;
+ }
+
+ if (arm_feature(env, ARM_FEATURE_M)) {
+ /* CPACR can cause a NOCP UsageFault taken to current security state */
+ if (!v7m_cpacr_pass(env, env->v7m.secure, cur_el != 0)) {
+ return 1;
+ }
+
+ if (arm_feature(env, ARM_FEATURE_M_SECURITY) && !env->v7m.secure) {
+ if (!extract32(env->v7m.nsacr, 10, 1)) {
+ /* FP insns cause a NOCP UsageFault taken to Secure */
+ return 3;
+ }
+ }
+
+ return 0;
+ }
+
+ /*
+ * The CPACR controls traps to EL1, or PL1 if we're 32 bit:
+ * 0, 2 : trap EL0 and EL1/PL1 accesses
+ * 1 : trap only EL0 accesses
+ * 3 : trap no accesses
+ * This register is ignored if E2H+TGE are both set.
+ */
+ if ((arm_hcr_el2_eff(env) & (HCR_E2H | HCR_TGE)) != (HCR_E2H | HCR_TGE)) {
+ int fpen = extract32(env->cp15.cpacr_el1, 20, 2);
+
+ switch (fpen) {
+ case 0:
+ case 2:
+ if (cur_el == 0 || cur_el == 1) {
+ /* Trap to PL1, which might be EL1 or EL3 */
+ if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
+ return 3;
+ }
+ return 1;
+ }
+ if (cur_el == 3 && !is_a64(env)) {
+ /* Secure PL1 running at EL3 */
+ return 3;
+ }
+ break;
+ case 1:
+ if (cur_el == 0) {
+ return 1;
+ }
+ break;
+ case 3:
+ break;
+ }
+ }
+
+ /*
+ * The NSACR allows A-profile AArch32 EL3 and M-profile secure mode
+ * to control non-secure access to the FPU. It doesn't have any
+ * effect if EL3 is AArch64 or if EL3 doesn't exist at all.
+ */
+ if ((arm_feature(env, ARM_FEATURE_EL3) && !arm_el_is_aa64(env, 3) &&
+ cur_el <= 2 && !arm_is_secure_below_el3(env))) {
+ if (!extract32(env->cp15.nsacr, 10, 1)) {
+ /* FP insns act as UNDEF */
+ return cur_el == 2 ? 2 : 1;
+ }
+ }
+
+ /*
+ * For the CPTR registers we don't need to guard with an ARM_FEATURE
+ * check because zero bits in the registers mean "don't trap".
+ */
+
+ /* CPTR_EL2 : present in v7VE or v8 */
+ if (cur_el <= 2 && extract32(env->cp15.cptr_el[2], 10, 1)
+ && arm_is_el2_enabled(env)) {
+ /* Trap FP ops at EL2, NS-EL1 or NS-EL0 to EL2 */
+ return 2;
+ }
+
+ /* CPTR_EL3 : present in v8 */
+ if (extract32(env->cp15.cptr_el[3], 10, 1)) {
+ /* Trap all FP ops to EL3 */
+ return 3;
+ }
+#endif
+ return 0;
+}
diff --git a/target/arm/cpu-user.c b/target/arm/cpu-user.c
index 39093ade76..6a1a1fa273 100644
--- a/target/arm/cpu-user.c
+++ b/target/arm/cpu-user.c
@@ -38,3 +38,8 @@ int sve_exception_el(CPUARMState *env, int el)
{
return 0;
}
+
+int fp_exception_el(CPUARMState *env, int el)
+{
+ return 0;
+}
diff --git a/target/arm/tcg/helper.c b/target/arm/tcg/helper.c
index 4e027b98fe..2dbeb3a077 100644
--- a/target/arm/tcg/helper.c
+++ b/target/arm/tcg/helper.c
@@ -1625,106 +1625,6 @@ uint32_t HELPER(crc32c)(uint32_t acc, uint32_t val,
uint32_t bytes)
return crc32c(acc, buf, bytes) ^ 0xffffffff;
}
-/*
- * Return the exception level to which FP-disabled exceptions should
- * be taken, or 0 if FP is enabled.
- */
-int fp_exception_el(CPUARMState *env, int cur_el)
-{
-#ifndef CONFIG_USER_ONLY
- /*
- * CPACR and the CPTR registers don't exist before v6, so FP is
- * always accessible
- */
- if (!arm_feature(env, ARM_FEATURE_V6)) {
- return 0;
- }
-
- if (arm_feature(env, ARM_FEATURE_M)) {
- /* CPACR can cause a NOCP UsageFault taken to current security state */
- if (!v7m_cpacr_pass(env, env->v7m.secure, cur_el != 0)) {
- return 1;
- }
-
- if (arm_feature(env, ARM_FEATURE_M_SECURITY) && !env->v7m.secure) {
- if (!extract32(env->v7m.nsacr, 10, 1)) {
- /* FP insns cause a NOCP UsageFault taken to Secure */
- return 3;
- }
- }
-
- return 0;
- }
-
- /*
- * The CPACR controls traps to EL1, or PL1 if we're 32 bit:
- * 0, 2 : trap EL0 and EL1/PL1 accesses
- * 1 : trap only EL0 accesses
- * 3 : trap no accesses
- * This register is ignored if E2H+TGE are both set.
- */
- if ((arm_hcr_el2_eff(env) & (HCR_E2H | HCR_TGE)) != (HCR_E2H | HCR_TGE)) {
- int fpen = extract32(env->cp15.cpacr_el1, 20, 2);
-
- switch (fpen) {
- case 0:
- case 2:
- if (cur_el == 0 || cur_el == 1) {
- /* Trap to PL1, which might be EL1 or EL3 */
- if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
- return 3;
- }
- return 1;
- }
- if (cur_el == 3 && !is_a64(env)) {
- /* Secure PL1 running at EL3 */
- return 3;
- }
- break;
- case 1:
- if (cur_el == 0) {
- return 1;
- }
- break;
- case 3:
- break;
- }
- }
-
- /*
- * The NSACR allows A-profile AArch32 EL3 and M-profile secure mode
- * to control non-secure access to the FPU. It doesn't have any
- * effect if EL3 is AArch64 or if EL3 doesn't exist at all.
- */
- if ((arm_feature(env, ARM_FEATURE_EL3) && !arm_el_is_aa64(env, 3) &&
- cur_el <= 2 && !arm_is_secure_below_el3(env))) {
- if (!extract32(env->cp15.nsacr, 10, 1)) {
- /* FP insns act as UNDEF */
- return cur_el == 2 ? 2 : 1;
- }
- }
-
- /*
- * For the CPTR registers we don't need to guard with an ARM_FEATURE
- * check because zero bits in the registers mean "don't trap".
- */
-
- /* CPTR_EL2 : present in v7VE or v8 */
- if (cur_el <= 2 && extract32(env->cp15.cptr_el[2], 10, 1)
- && arm_is_el2_enabled(env)) {
- /* Trap FP ops at EL2, NS-EL1 or NS-EL0 to EL2 */
- return 2;
- }
-
- /* CPTR_EL3 : present in v8 */
- if (extract32(env->cp15.cptr_el[3], 10, 1)) {
- /* Trap all FP ops to EL3 */
- return 3;
- }
-#endif
- return 0;
-}
-
#ifndef CONFIG_USER_ONLY
ARMMMUIdx arm_stage1_mmu_idx(CPUARMState *env)
{
--
2.26.2
- [RFC v14 24/80] target/arm: move arm_sctlr away from tcg helpers, (continued)
- [RFC v14 24/80] target/arm: move arm_sctlr away from tcg helpers, Claudio Fontana, 2021/04/16
- [RFC v14 14/80] target/arm: split cpregs from tcg/helper.c, Claudio Fontana, 2021/04/16
- [RFC v14 23/80] target/arm: move sve_zcr_len_for_el to common_cpu, Claudio Fontana, 2021/04/16
- [RFC v14 20/80] target/arm: move arm_hcr_el2_eff from tcg/ to common_cpu, Claudio Fontana, 2021/04/16
- [RFC v14 26/80] target/arm: move aarch64_sync_32_to_64 (and vv) to cpu code, Claudio Fontana, 2021/04/16
- [RFC v14 27/80] target/arm: new cpu32 ARM 32 bit CPU Class, Claudio Fontana, 2021/04/16
- [RFC v14 28/80] target/arm: split 32bit and 64bit arm dump state, Claudio Fontana, 2021/04/16
- [RFC v14 29/80] target/arm: move a15 cpu model away from the TCG-only models, Claudio Fontana, 2021/04/16
- [RFC v14 25/80] target/arm: move arm_cpu_list to common_cpu, Claudio Fontana, 2021/04/16
- [RFC v14 32/80] target/arm: fix comments style of fp_exception_el before moving it, Claudio Fontana, 2021/04/16
- [RFC v14 33/80] target/arm: move fp_exception_el out of TCG helpers,
Claudio Fontana <=
- [RFC v14 38/80] target/arm: rename handle_semihosting to tcg_handle_semihosting, Claudio Fontana, 2021/04/16
- [RFC v14 42/80] target/arm: wrap call to aarch64_sve_change_el in tcg_enabled(), Claudio Fontana, 2021/04/16
- [RFC v14 45/80] MAINTAINERS: update arm kvm maintained files to all in target/arm/kvm/, Claudio Fontana, 2021/04/16
- [RFC v14 48/80] target/arm: remove kvm-stub.c, Claudio Fontana, 2021/04/16
- [RFC v14 34/80] target/arm: remove now useless ifndef from fp_exception_el, Claudio Fontana, 2021/04/16
- [RFC v14 30/80] target/arm: fixup sve_exception_el code style before move, Claudio Fontana, 2021/04/16
- [RFC v14 31/80] target/arm: move sve_exception_el out of TCG helpers, Claudio Fontana, 2021/04/16
- [RFC v14 39/80] target/arm: replace CONFIG_TCG with tcg_enabled, Claudio Fontana, 2021/04/16
- [RFC v14 36/80] target/arm: fix style of arm_cpu_do_interrupt functions before move, Claudio Fontana, 2021/04/16
- [RFC v14 35/80] target/arm: make further preparation for the exception code to move, Claudio Fontana, 2021/04/16