[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/28] target/alpha: Fix SWCR_TRAP_ENABLE_MASK
From: |
Alex Bennée |
Subject: |
[PULL 03/28] target/alpha: Fix SWCR_TRAP_ENABLE_MASK |
Date: |
Thu, 26 Sep 2019 19:35:28 +0100 |
From: Richard Henderson <address@hidden>
The CONFIG_USER_ONLY adjustment blindly mashed the swcr
exception enable bits into the fpcr exception disable bits.
However, fpcr_exc_enable has already converted the exception
disable bits into the exception status bits in order to make
it easier to mask status bits at runtime.
Instead, merge the swcr enable bits with the fpcr before we
convert to status bits.
Signed-off-by: Richard Henderson <address@hidden>
Signed-off-by: Alex Bennée <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Message-Id: <address@hidden>
diff --git a/target/alpha/helper.c b/target/alpha/helper.c
index 10602fb339..e21c488aa3 100644
--- a/target/alpha/helper.c
+++ b/target/alpha/helper.c
@@ -46,34 +46,39 @@ void cpu_alpha_store_fpcr(CPUAlphaState *env, uint64_t val)
uint32_t fpcr = val >> 32;
uint32_t t = 0;
+ /* Record the raw value before adjusting for linux-user. */
+ env->fpcr = fpcr;
+
+#ifdef CONFIG_USER_ONLY
+ /*
+ * Override some of these bits with the contents of ENV->SWCR.
+ * In system mode, some of these would trap to the kernel, at
+ * which point the kernel's handler would emulate and apply
+ * the software exception mask.
+ */
+ uint32_t soft_fpcr = alpha_ieee_swcr_to_fpcr(env->swcr) >> 32;
+ fpcr |= soft_fpcr & FPCR_STATUS_MASK;
+#endif
+
t |= CONVERT_BIT(fpcr, FPCR_INED, FPCR_INE);
t |= CONVERT_BIT(fpcr, FPCR_UNFD, FPCR_UNF);
t |= CONVERT_BIT(fpcr, FPCR_OVFD, FPCR_OVF);
t |= CONVERT_BIT(fpcr, FPCR_DZED, FPCR_DZE);
t |= CONVERT_BIT(fpcr, FPCR_INVD, FPCR_INV);
- env->fpcr = fpcr;
env->fpcr_exc_enable = ~t & FPCR_STATUS_MASK;
env->fpcr_dyn_round = rm_map[(fpcr & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT];
env->fpcr_flush_to_zero = (fpcr & FPCR_UNFD) && (fpcr & FPCR_UNDZ);
env->fp_status.flush_inputs_to_zero = (fpcr & FPCR_DNZ) != 0;
-
#ifdef CONFIG_USER_ONLY
- /*
- * Override some of these bits with the contents of ENV->SWCR.
- * In system mode, some of these would trap to the kernel, at
- * which point the kernel's handler would emulate and apply
- * the software exception mask.
- */
if (env->swcr & SWCR_MAP_DMZ) {
env->fp_status.flush_inputs_to_zero = 1;
}
if (env->swcr & SWCR_MAP_UMZ) {
env->fpcr_flush_to_zero = 1;
}
- env->fpcr_exc_enable &= ~(alpha_ieee_swcr_to_fpcr(env->swcr) >> 32);
#endif
}
--
2.20.1
- [PULL 00/28] testing updates (docker,podman,tcg,alpha), Alex Bennée, 2019/09/26
- [PULL 01/28] target/alpha: Use array for FPCR_DYN conversion, Alex Bennée, 2019/09/26
- [PULL 02/28] target/alpha: Fix SWCR_MAP_UMZ, Alex Bennée, 2019/09/26
- [PULL 03/28] target/alpha: Fix SWCR_TRAP_ENABLE_MASK,
Alex Bennée <=
- [PULL 05/28] target/alpha: Write to fpcr_flush_to_zero once, Alex Bennée, 2019/09/26
- [PULL 04/28] target/alpha: Handle SWCR_MAP_DMZ earlier, Alex Bennée, 2019/09/26
- [PULL 06/28] target/alpha: Mask IOV exception with INV for user-only, Alex Bennée, 2019/09/26
- [PULL 09/28] tests/docker: add sanitizers back to clang build, Alex Bennée, 2019/09/26
- [PULL 08/28] target/ppc: fix signal delivery for ppc64abi32, Alex Bennée, 2019/09/26
- [PULL 10/28] tests/docker: fix DOCKER_PARTIAL_IMAGES, Alex Bennée, 2019/09/26
- [PULL 07/28] target/alpha: Tidy helper_fp_exc_raise_s, Alex Bennée, 2019/09/26
- [PULL 11/28] tests/docker: remove python2.7 from debian9-mxe, Alex Bennée, 2019/09/26
- [PULL 13/28] podman: fix command invocation, Alex Bennée, 2019/09/26
- [PULL 14/28] tests/tcg: clean-up some comments after the de-tangling, Alex Bennée, 2019/09/26