mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
target/arm: Introduce arm_hcr_el2_eff
Replace arm_hcr_el2_{fmo,imo,amo} with a more general routine that also takes SCR_EL3.NS (aka arm_is_secure_below_el3) into account, as documented for the plethora of bits in HCR_EL2. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20181210150501.7990-2-richard.henderson@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
ab638a328f
commit
f777844460
3 changed files with 83 additions and 71 deletions
|
@ -85,8 +85,8 @@ static bool icv_access(CPUARMState *env, int hcr_flags)
|
|||
* * access if NS EL1 and either IMO or FMO == 1:
|
||||
* CTLR, DIR, PMR, RPR
|
||||
*/
|
||||
bool flagmatch = ((hcr_flags & HCR_IMO) && arm_hcr_el2_imo(env)) ||
|
||||
((hcr_flags & HCR_FMO) && arm_hcr_el2_fmo(env));
|
||||
uint64_t hcr_el2 = arm_hcr_el2_eff(env);
|
||||
bool flagmatch = hcr_el2 & hcr_flags & (HCR_IMO | HCR_FMO);
|
||||
|
||||
return flagmatch && arm_current_el(env) == 1
|
||||
&& !arm_is_secure_below_el3(env);
|
||||
|
@ -1552,8 +1552,9 @@ static void icc_dir_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
|||
/* No need to include !IsSecure in route_*_to_el2 as it's only
|
||||
* tested in cases where we know !IsSecure is true.
|
||||
*/
|
||||
route_fiq_to_el2 = arm_hcr_el2_fmo(env);
|
||||
route_irq_to_el2 = arm_hcr_el2_imo(env);
|
||||
uint64_t hcr_el2 = arm_hcr_el2_eff(env);
|
||||
route_fiq_to_el2 = hcr_el2 & HCR_FMO;
|
||||
route_irq_to_el2 = hcr_el2 & HCR_IMO;
|
||||
|
||||
switch (arm_current_el(env)) {
|
||||
case 3:
|
||||
|
@ -1895,8 +1896,8 @@ static CPAccessResult gicv3_irqfiq_access(CPUARMState *env,
|
|||
if ((env->cp15.scr_el3 & (SCR_FIQ | SCR_IRQ)) == (SCR_FIQ | SCR_IRQ)) {
|
||||
switch (el) {
|
||||
case 1:
|
||||
if (arm_is_secure_below_el3(env) ||
|
||||
(arm_hcr_el2_imo(env) == 0 && arm_hcr_el2_fmo(env) == 0)) {
|
||||
/* Note that arm_hcr_el2_eff takes secure state into account. */
|
||||
if ((arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) == 0) {
|
||||
r = CP_ACCESS_TRAP_EL3;
|
||||
}
|
||||
break;
|
||||
|
@ -1936,8 +1937,8 @@ static CPAccessResult gicv3_dir_access(CPUARMState *env,
|
|||
static CPAccessResult gicv3_sgi_access(CPUARMState *env,
|
||||
const ARMCPRegInfo *ri, bool isread)
|
||||
{
|
||||
if ((arm_hcr_el2_imo(env) || arm_hcr_el2_fmo(env)) &&
|
||||
arm_current_el(env) == 1 && !arm_is_secure_below_el3(env)) {
|
||||
if (arm_current_el(env) == 1 &&
|
||||
(arm_hcr_el2_eff(env) & (HCR_IMO | HCR_FMO)) != 0) {
|
||||
/* Takes priority over a possible EL3 trap */
|
||||
return CP_ACCESS_TRAP_EL2;
|
||||
}
|
||||
|
@ -1961,7 +1962,7 @@ static CPAccessResult gicv3_fiq_access(CPUARMState *env,
|
|||
if (env->cp15.scr_el3 & SCR_FIQ) {
|
||||
switch (el) {
|
||||
case 1:
|
||||
if (arm_is_secure_below_el3(env) || !arm_hcr_el2_fmo(env)) {
|
||||
if ((arm_hcr_el2_eff(env) & HCR_FMO) == 0) {
|
||||
r = CP_ACCESS_TRAP_EL3;
|
||||
}
|
||||
break;
|
||||
|
@ -2000,7 +2001,7 @@ static CPAccessResult gicv3_irq_access(CPUARMState *env,
|
|||
if (env->cp15.scr_el3 & SCR_IRQ) {
|
||||
switch (el) {
|
||||
case 1:
|
||||
if (arm_is_secure_below_el3(env) || !arm_hcr_el2_imo(env)) {
|
||||
if ((arm_hcr_el2_eff(env) & HCR_IMO) == 0) {
|
||||
r = CP_ACCESS_TRAP_EL3;
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue