hex_is_qualified_for_int() treated every thread whose k0 or TLB lock state
was not UNLOCKED as unable to take an interrupt.
Block interrupts only in WAITING and QUEUED. Previously an interrupt
targeted at the owner of a contended lock was never delivered, so a guest
waiting for it hung.
Fixes: c9f3f0e95427 ("target/hexagon: wake K0 and TLB lock waiters")
Signed-off-by: Brian Cain <[email protected]>
---
target/hexagon/hex_interrupts.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/target/hexagon/hex_interrupts.c b/target/hexagon/hex_interrupts.c
index 26a574f76f2..54a1ee0fb58 100644
--- a/target/hexagon/hex_interrupts.c
+++ b/target/hexagon/hex_interrupts.c
@@ -241,8 +241,10 @@ static bool hex_is_qualified_for_int(CPUHexagonState *env,
int int_num)
bool ssr_ie = get_ssr_ie(env);
bool ssr_ex = get_ssr_ex(env);
bool imask = get_imask_bit(env, int_num);
- bool lock_pending = env->k0_lock_state != HEX_LOCK_UNLOCKED ||
- env->tlb_lock_state != HEX_LOCK_UNLOCKED;
+ bool lock_pending = env->k0_lock_state == HEX_LOCK_WAITING ||
+ env->k0_lock_state == HEX_LOCK_QUEUED ||
+ env->tlb_lock_state == HEX_LOCK_WAITING ||
+ env->tlb_lock_state == HEX_LOCK_QUEUED;
return syscfg_gie && !iad && ssr_ie && !ssr_ex && !imask && !lock_pending;
}
--
2.34.1