[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 14/48] target/sparc: Split out build_sfsr
From: |
Richard Henderson |
Subject: |
[PATCH v4 14/48] target/sparc: Split out build_sfsr |
Date: |
Tue, 12 Oct 2021 19:45:33 -0700 |
Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/sparc/mmu_helper.c | 72 +++++++++++++++++++++++++--------------
1 file changed, 46 insertions(+), 26 deletions(-)
diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c
index 2ad47391d0..014601e701 100644
--- a/target/sparc/mmu_helper.c
+++ b/target/sparc/mmu_helper.c
@@ -502,16 +502,60 @@ static inline int ultrasparc_tag_match(SparcTLBEntry *tlb,
return 0;
}
+static uint64_t build_sfsr(CPUSPARCState *env, int mmu_idx, int rw)
+{
+ uint64_t sfsr = SFSR_VALID_BIT;
+
+ switch (mmu_idx) {
+ case MMU_PHYS_IDX:
+ sfsr |= SFSR_CT_NOTRANS;
+ break;
+ case MMU_USER_IDX:
+ case MMU_KERNEL_IDX:
+ sfsr |= SFSR_CT_PRIMARY;
+ break;
+ case MMU_USER_SECONDARY_IDX:
+ case MMU_KERNEL_SECONDARY_IDX:
+ sfsr |= SFSR_CT_SECONDARY;
+ break;
+ case MMU_NUCLEUS_IDX:
+ sfsr |= SFSR_CT_NUCLEUS;
+ break;
+ default:
+ g_assert_not_reached();
+ }
+
+ if (rw == 1) {
+ sfsr |= SFSR_WRITE_BIT;
+ } else if (rw == 4) {
+ sfsr |= SFSR_NF_BIT;
+ }
+
+ if (env->pstate & PS_PRIV) {
+ sfsr |= SFSR_PR_BIT;
+ }
+
+ if (env->dmmu.sfsr & SFSR_VALID_BIT) { /* Fault status register */
+ sfsr |= SFSR_OW_BIT; /* overflow (not read before another fault) */
+ }
+
+ /* FIXME: ASI field in SFSR must be set */
+
+ return sfsr;
+}
+
static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical,
int *prot, MemTxAttrs *attrs,
target_ulong address, int rw, int mmu_idx)
{
CPUState *cs = env_cpu(env);
unsigned int i;
+ uint64_t sfsr;
uint64_t context;
- uint64_t sfsr = 0;
bool is_user = false;
+ sfsr = build_sfsr(env, mmu_idx, rw);
+
switch (mmu_idx) {
case MMU_PHYS_IDX:
g_assert_not_reached();
@@ -520,29 +564,18 @@ static int get_physical_address_data(CPUSPARCState *env,
hwaddr *physical,
/* fallthru */
case MMU_KERNEL_IDX:
context = env->dmmu.mmu_primary_context & 0x1fff;
- sfsr |= SFSR_CT_PRIMARY;
break;
case MMU_USER_SECONDARY_IDX:
is_user = true;
/* fallthru */
case MMU_KERNEL_SECONDARY_IDX:
context = env->dmmu.mmu_secondary_context & 0x1fff;
- sfsr |= SFSR_CT_SECONDARY;
break;
- case MMU_NUCLEUS_IDX:
- sfsr |= SFSR_CT_NUCLEUS;
- /* FALLTHRU */
default:
context = 0;
break;
}
- if (rw == 1) {
- sfsr |= SFSR_WRITE_BIT;
- } else if (rw == 4) {
- sfsr |= SFSR_NF_BIT;
- }
-
for (i = 0; i < 64; i++) {
/* ctx match, vaddr match, valid? */
if (ultrasparc_tag_match(&env->dtlb[i], address, context, physical)) {
@@ -592,22 +625,9 @@ static int get_physical_address_data(CPUSPARCState *env,
hwaddr *physical,
return 0;
}
- if (env->dmmu.sfsr & SFSR_VALID_BIT) { /* Fault status register */
- sfsr |= SFSR_OW_BIT; /* overflow (not read before
- another fault) */
- }
-
- if (env->pstate & PS_PRIV) {
- sfsr |= SFSR_PR_BIT;
- }
-
- /* FIXME: ASI field in SFSR must be set */
- env->dmmu.sfsr = sfsr | SFSR_VALID_BIT;
-
+ env->dmmu.sfsr = sfsr;
env->dmmu.sfar = address; /* Fault address register */
-
env->dmmu.tag_access = (address & ~0x1fffULL) | context;
-
return 1;
}
}
--
2.25.1
- [PATCH v4 05/48] linux-user/hppa: Remove EXCP_UNALIGN handling, (continued)
- [PATCH v4 05/48] linux-user/hppa: Remove EXCP_UNALIGN handling, Richard Henderson, 2021/10/12
- [PATCH v4 06/48] target/microblaze: Do not set MO_ALIGN for user-only, Richard Henderson, 2021/10/12
- [PATCH v4 11/48] linux-user/hppa: Remove POWERPC_EXCP_ALIGN handling, Richard Henderson, 2021/10/12
- [PATCH v4 12/48] target/sh4: Set fault address in superh_cpu_do_unaligned_access, Richard Henderson, 2021/10/12
- [PATCH v4 07/48] target/ppc: Move SPR_DSISR setting to powerpc_excp, Richard Henderson, 2021/10/12
- [PATCH v4 08/48] target/ppc: Set fault address in ppc_cpu_do_unaligned_access, Richard Henderson, 2021/10/12
- [PATCH v4 09/48] target/ppc: Restrict ppc_cpu_do_unaligned_access to sysemu, Richard Henderson, 2021/10/12
- [PATCH v4 10/48] target/s390x: Implement s390x_cpu_record_sigbus, Richard Henderson, 2021/10/12
- [PATCH v4 13/48] target/sparc: Remove DEBUG_UNALIGNED, Richard Henderson, 2021/10/12
- [PATCH v4 14/48] target/sparc: Split out build_sfsr,
Richard Henderson <=
- [PATCH v4 15/48] target/sparc: Set fault address in sparc_cpu_do_unaligned_access, Richard Henderson, 2021/10/12
- [PATCH v4 16/48] accel/tcg: Report unaligned atomics for user-only, Richard Henderson, 2021/10/12
- [PATCH v4 18/48] target/i386: Use MO_128 for 16 byte atomics, Richard Henderson, 2021/10/12
- [PATCH v4 17/48] target/arm: Use MO_128 for 16 byte atomics, Richard Henderson, 2021/10/12
- [PATCH v4 23/48] accel/tcg: Move cpu_atomic decls to exec/cpu_ldst.h, Richard Henderson, 2021/10/12
- [PATCH v4 24/48] target/mips: Use cpu_*_data_ra for msa load/store, Richard Henderson, 2021/10/12
- [PATCH v4 28/48] target/arm: Use cpu_*_mmu instead of helper_*_mmu, Richard Henderson, 2021/10/12
- [PATCH v4 19/48] target/ppc: Use MO_128 for 16 byte atomics, Richard Henderson, 2021/10/12
- [PATCH v4 21/48] target/hexagon: Implement cpu_mmu_index, Richard Henderson, 2021/10/12
- [PATCH v4 20/48] target/s390x: Use MO_128 for 16 byte atomics, Richard Henderson, 2021/10/12