mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-01-10 23:15:28 +00:00
target/arm: Compute TB_FLAGS for TBI for user-only
Enables, but does not turn on, TBI for CONFIG_USER_ONLY. Backports commit c47eaf9fc2af68cfbdbd9ae31f8e2e5ebb7022b4 from qemu
This commit is contained in:
parent
b928902908
commit
8124b9f975
|
@ -6277,7 +6277,7 @@ uint32_t HELPER(rbit)(uint32_t x)
|
|||
return revbit32(x);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
|
||||
/* These should probably raise undefined insn exceptions. */
|
||||
void HELPER(v7m_msr)(CPUARMState *env, uint32_t reg, uint32_t val)
|
||||
|
@ -8672,6 +8672,7 @@ void arm_cpu_do_interrupt(CPUState *cs)
|
|||
cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
|
||||
//}
|
||||
}
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
/* Return the exception level which controls this address translation regime */
|
||||
static inline uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
|
||||
|
@ -8701,6 +8702,8 @@ static inline uint32_t regime_el(CPUARMState *env, ARMMMUIdx mmu_idx)
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
||||
/* Return the SCTLR value which controls this address translation regime */
|
||||
static inline uint32_t regime_sctlr(CPUARMState *env, ARMMMUIdx mmu_idx)
|
||||
{
|
||||
|
@ -8756,6 +8759,22 @@ static inline bool regime_translation_big_endian(CPUARMState *env,
|
|||
return (regime_sctlr(env, mmu_idx) & SCTLR_EE) != 0;
|
||||
}
|
||||
|
||||
/* Return the TTBR associated with this translation regime */
|
||||
static inline uint64_t regime_ttbr(CPUARMState *env, ARMMMUIdx mmu_idx,
|
||||
int ttbrn)
|
||||
{
|
||||
if (mmu_idx == ARMMMUIdx_S2NS) {
|
||||
return env->cp15.vttbr_el2;
|
||||
}
|
||||
if (ttbrn == 0) {
|
||||
return env->cp15.ttbr0_el[regime_el(env, mmu_idx)];
|
||||
} else {
|
||||
return env->cp15.ttbr1_el[regime_el(env, mmu_idx)];
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
/* Return the TCR controlling this translation regime */
|
||||
static inline TCR *regime_tcr(CPUARMState *env, ARMMMUIdx mmu_idx)
|
||||
{
|
||||
|
@ -8776,20 +8795,6 @@ static inline ARMMMUIdx stage_1_mmu_idx(ARMMMUIdx mmu_idx)
|
|||
return mmu_idx;
|
||||
}
|
||||
|
||||
/* Return the TTBR associated with this translation regime */
|
||||
static inline uint64_t regime_ttbr(CPUARMState *env, ARMMMUIdx mmu_idx,
|
||||
int ttbrn)
|
||||
{
|
||||
if (mmu_idx == ARMMMUIdx_S2NS) {
|
||||
return env->cp15.vttbr_el2;
|
||||
}
|
||||
if (ttbrn == 0) {
|
||||
return env->cp15.ttbr0_el[regime_el(env, mmu_idx)];
|
||||
} else {
|
||||
return env->cp15.ttbr1_el[regime_el(env, mmu_idx)];
|
||||
}
|
||||
}
|
||||
|
||||
/* Return true if the translation regime is using LPAE format page tables */
|
||||
static inline bool regime_using_lpae_format(CPUARMState *env,
|
||||
ARMMMUIdx mmu_idx)
|
||||
|
@ -8815,6 +8820,7 @@ bool arm_s1_regime_using_lpae_format(CPUARMState *env, ARMMMUIdx mmu_idx)
|
|||
return regime_using_lpae_format(env, mmu_idx);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static inline bool regime_is_user(CPUARMState *env, ARMMMUIdx mmu_idx)
|
||||
{
|
||||
switch (mmu_idx) {
|
||||
|
@ -9521,6 +9527,7 @@ static uint8_t convert_stage2_attrs(CPUARMState *env, uint8_t s2attrs)
|
|||
|
||||
return (hiattr << 6) | (hihint << 4) | (loattr << 2) | lohint;
|
||||
}
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va,
|
||||
ARMMMUIdx mmu_idx)
|
||||
|
@ -9592,6 +9599,7 @@ ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
||||
ARMMMUIdx mmu_idx)
|
||||
{
|
||||
|
@ -12851,11 +12859,7 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
|
|||
*pc = env->pc;
|
||||
flags = FIELD_DP32(flags, TBFLAG_ANY, AARCH64_STATE, 1);
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
/*
|
||||
* Get control bits for tagged addresses. Note that the
|
||||
* translator only uses this for instruction addresses.
|
||||
*/
|
||||
/* Get control bits for tagged addresses. */
|
||||
{
|
||||
ARMMMUIdx stage1 = stage_1_mmu_idx(mmu_idx);
|
||||
ARMVAParameters p0 = aa64_va_parameters_both(env, 0, stage1);
|
||||
|
@ -12874,7 +12878,6 @@ void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
|
|||
flags = FIELD_DP32(flags, TBFLAG_A64, TBII, tbii);
|
||||
flags = FIELD_DP32(flags, TBFLAG_A64, TBID, tbid);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cpu_isar_feature(aa64_sve, cpu)) {
|
||||
int sve_el = sve_exception_el(env, current_el);
|
||||
|
|
|
@ -965,31 +965,9 @@ typedef struct ARMVAParameters {
|
|||
bool using64k : 1;
|
||||
} ARMVAParameters;
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
static inline ARMVAParameters aa64_va_parameters_both(CPUARMState *env,
|
||||
uint64_t va,
|
||||
ARMMMUIdx mmu_idx)
|
||||
{
|
||||
ARMVAParameters result = {0};
|
||||
/* 48-bit address space */
|
||||
result.tsz = 16;
|
||||
/* We can't handle tagged addresses properly in user-only mode */
|
||||
result.tbi = false;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static inline ARMVAParameters aa64_va_parameters(CPUARMState *env,
|
||||
uint64_t va,
|
||||
ARMMMUIdx mmu_idx, bool data)
|
||||
{
|
||||
return aa64_va_parameters_both(env, va, mmu_idx);
|
||||
}
|
||||
#else
|
||||
ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va,
|
||||
ARMMMUIdx mmu_idx);
|
||||
ARMVAParameters aa64_va_parameters(CPUARMState *env, uint64_t va,
|
||||
ARMMMUIdx mmu_idx, bool data);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue