mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 14:15:39 +00:00
target/arm: Pass more cpu state to arm_excp_unmasked
Avoid redundant computation of cpu state by passing it in from the caller, which has already computed it for itself. Backports commit be87955687446be152f366af543c9234eab78a7c from qemu
This commit is contained in:
parent
6023db20bc
commit
975f0a9bc5
|
@ -402,14 +402,13 @@ static void arm_cpu_reset(CPUState *s)
|
|||
}
|
||||
|
||||
static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
|
||||
unsigned int target_el)
|
||||
unsigned int target_el,
|
||||
unsigned int cur_el, bool secure,
|
||||
uint64_t hcr_el2)
|
||||
{
|
||||
CPUARMState *env = cs->env_ptr;
|
||||
unsigned int cur_el = arm_current_el(env);
|
||||
bool secure = arm_is_secure(env);
|
||||
bool pstate_unmasked;
|
||||
int8_t unmasked = 0;
|
||||
uint64_t hcr_el2;
|
||||
|
||||
/*
|
||||
* Don't take exceptions if they target a lower EL.
|
||||
|
@ -420,8 +419,6 @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
|
|||
return false;
|
||||
}
|
||||
|
||||
hcr_el2 = arm_hcr_el2_eff(env);
|
||||
|
||||
switch (excp_idx) {
|
||||
case EXCP_FIQ:
|
||||
pstate_unmasked = !(env->daif & PSTATE_F);
|
||||
|
@ -526,6 +523,7 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
CPUClass *cc = CPU_GET_CLASS(env->uc, cs);
|
||||
uint32_t cur_el = arm_current_el(env);
|
||||
bool secure = arm_is_secure(env);
|
||||
uint64_t hcr_el2 = arm_hcr_el2_eff(env);
|
||||
uint32_t target_el;
|
||||
uint32_t excp_idx;
|
||||
bool ret = false;
|
||||
|
@ -533,7 +531,8 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
if (interrupt_request & CPU_INTERRUPT_FIQ) {
|
||||
excp_idx = EXCP_FIQ;
|
||||
target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el)) {
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el,
|
||||
cur_el, secure, hcr_el2)) {
|
||||
cs->exception_index = excp_idx;
|
||||
env->exception.target_el = target_el;
|
||||
cc->do_interrupt(cs);
|
||||
|
@ -543,7 +542,8 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
||||
excp_idx = EXCP_IRQ;
|
||||
target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el)) {
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el,
|
||||
cur_el, secure, hcr_el2)) {
|
||||
cs->exception_index = excp_idx;
|
||||
env->exception.target_el = target_el;
|
||||
cc->do_interrupt(cs);
|
||||
|
@ -553,7 +553,8 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
if (interrupt_request & CPU_INTERRUPT_VIRQ) {
|
||||
excp_idx = EXCP_VIRQ;
|
||||
target_el = 1;
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el)) {
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el,
|
||||
cur_el, secure, hcr_el2)) {
|
||||
cs->exception_index = excp_idx;
|
||||
env->exception.target_el = target_el;
|
||||
cc->do_interrupt(cs);
|
||||
|
@ -563,7 +564,8 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
if (interrupt_request & CPU_INTERRUPT_VFIQ) {
|
||||
excp_idx = EXCP_VFIQ;
|
||||
target_el = 1;
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el)) {
|
||||
if (arm_excp_unmasked(cs, excp_idx, target_el,
|
||||
cur_el, secure, hcr_el2)) {
|
||||
cs->exception_index = excp_idx;
|
||||
env->exception.target_el = target_el;
|
||||
cc->do_interrupt(cs);
|
||||
|
|
Loading…
Reference in a new issue