mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-05-05 07:52:15 +00:00
target/arm: factor MDCR_EL2 common handling
This adds a common helper to compute the effective value of MDCR_EL2. That is the actual value if EL2 is enabled in the current security context, or 0 elsewise. Backports 59dd089cf9e4a9cddee596c8a1378620df51b9bb
This commit is contained in:
parent
b657bfc59b
commit
b42e6d6036
|
@ -278,6 +278,11 @@ static CPAccessResult access_trap_aa32s_el1(CPUARMState *env,
|
||||||
return CP_ACCESS_TRAP_UNCATEGORIZED;
|
return CP_ACCESS_TRAP_UNCATEGORIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint64_t arm_mdcr_el2_eff(CPUARMState *env)
|
||||||
|
{
|
||||||
|
return arm_is_el2_enabled(env) ? env->cp15.mdcr_el2 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check for traps to "powerdown debug" registers, which are controlled
|
/* Check for traps to "powerdown debug" registers, which are controlled
|
||||||
* by MDCR.TDOSA
|
* by MDCR.TDOSA
|
||||||
*/
|
*/
|
||||||
|
@ -285,11 +290,11 @@ static CPAccessResult access_tdosa(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
bool isread)
|
bool isread)
|
||||||
{
|
{
|
||||||
int el = arm_current_el(env);
|
int el = arm_current_el(env);
|
||||||
bool mdcr_el2_tdosa = (env->cp15.mdcr_el2 & MDCR_TDOSA) ||
|
uint64_t mdcr_el2 = arm_mdcr_el2_eff(env);
|
||||||
(env->cp15.mdcr_el2 & MDCR_TDE) ||
|
bool mdcr_el2_tdosa = (mdcr_el2 & MDCR_TDOSA) || (mdcr_el2 & MDCR_TDE) ||
|
||||||
(arm_hcr_el2_eff(env) & HCR_TGE);
|
(arm_hcr_el2_eff(env) & HCR_TGE);
|
||||||
|
|
||||||
if (el < 2 && mdcr_el2_tdosa && !arm_is_secure_below_el3(env)) {
|
if (el < 2 && mdcr_el2_tdosa) {
|
||||||
return CP_ACCESS_TRAP_EL2;
|
return CP_ACCESS_TRAP_EL2;
|
||||||
}
|
}
|
||||||
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDOSA)) {
|
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDOSA)) {
|
||||||
|
@ -305,11 +310,11 @@ static CPAccessResult access_tdra(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
bool isread)
|
bool isread)
|
||||||
{
|
{
|
||||||
int el = arm_current_el(env);
|
int el = arm_current_el(env);
|
||||||
bool mdcr_el2_tdra = (env->cp15.mdcr_el2 & MDCR_TDRA) ||
|
uint64_t mdcr_el2 = arm_mdcr_el2_eff(env);
|
||||||
(env->cp15.mdcr_el2 & MDCR_TDE) ||
|
bool mdcr_el2_tdra = (mdcr_el2 & MDCR_TDRA) || (mdcr_el2 & MDCR_TDE) ||
|
||||||
(arm_hcr_el2_eff(env) & HCR_TGE);
|
(arm_hcr_el2_eff(env) & HCR_TGE);
|
||||||
|
|
||||||
if (el < 2 && mdcr_el2_tdra && !arm_is_secure_below_el3(env)) {
|
if (el < 2 && mdcr_el2_tdra) {
|
||||||
return CP_ACCESS_TRAP_EL2;
|
return CP_ACCESS_TRAP_EL2;
|
||||||
}
|
}
|
||||||
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDA)) {
|
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDA)) {
|
||||||
|
@ -325,11 +330,11 @@ static CPAccessResult access_tda(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
bool isread)
|
bool isread)
|
||||||
{
|
{
|
||||||
int el = arm_current_el(env);
|
int el = arm_current_el(env);
|
||||||
bool mdcr_el2_tda = (env->cp15.mdcr_el2 & MDCR_TDA) ||
|
uint64_t mdcr_el2 = arm_mdcr_el2_eff(env);
|
||||||
(env->cp15.mdcr_el2 & MDCR_TDE) ||
|
bool mdcr_el2_tda = (mdcr_el2 & MDCR_TDA) || (mdcr_el2 & MDCR_TDE) ||
|
||||||
(arm_hcr_el2_eff(env) & HCR_TGE);
|
(arm_hcr_el2_eff(env) & HCR_TGE);
|
||||||
|
|
||||||
if (el < 2 && mdcr_el2_tda && !arm_is_secure_below_el3(env)) {
|
if (el < 2 && mdcr_el2_tda) {
|
||||||
return CP_ACCESS_TRAP_EL2;
|
return CP_ACCESS_TRAP_EL2;
|
||||||
}
|
}
|
||||||
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDA)) {
|
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TDA)) {
|
||||||
|
@ -345,9 +350,9 @@ static CPAccessResult access_tpm(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||||
bool isread)
|
bool isread)
|
||||||
{
|
{
|
||||||
int el = arm_current_el(env);
|
int el = arm_current_el(env);
|
||||||
|
uint64_t mdcr_el2 = arm_mdcr_el2_eff(env);
|
||||||
|
|
||||||
if (el < 2 && (env->cp15.mdcr_el2 & MDCR_TPM)
|
if (el < 2 && (mdcr_el2 & MDCR_TPM)) {
|
||||||
&& !arm_is_secure_below_el3(env)) {
|
|
||||||
return CP_ACCESS_TRAP_EL2;
|
return CP_ACCESS_TRAP_EL2;
|
||||||
}
|
}
|
||||||
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TPM)) {
|
if (el < 3 && (env->cp15.mdcr_el3 & MDCR_TPM)) {
|
||||||
|
|
Loading…
Reference in a new issue