PPC: Fix TLB invalidation bug within the PPC interrupt handler.
Commit 41557447d30eeb944e42069513df13585f5e6c7f also introduced a subtle TLB flush bug. By applying a mask to the interrupt MSR which cleared the IR/DR bits at the start of the interrupt handler, the logic towards the end of the handler to force a TLB flush if either one of these bits were set would never be triggered. This patch simply changes the IR/DR bit check in the TLB flush logic to use the original MSR value (albeit with some interrupt-specific bits cleared) so that the IR/DR bits are preserved at the point where the check takes place. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Acked-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
da12872a09
commit
52d631dcc7
@ -2960,7 +2960,7 @@ static inline void powerpc_excp(CPUPPCState *env, int excp_model, int excp)
|
|||||||
if (asrr1 != -1)
|
if (asrr1 != -1)
|
||||||
env->spr[asrr1] = env->spr[srr1];
|
env->spr[asrr1] = env->spr[srr1];
|
||||||
/* If we disactivated any translation, flush TLBs */
|
/* If we disactivated any translation, flush TLBs */
|
||||||
if (new_msr & ((1 << MSR_IR) | (1 << MSR_DR)))
|
if (msr & ((1 << MSR_IR) | (1 << MSR_DR)))
|
||||||
tlb_flush(env, 1);
|
tlb_flush(env, 1);
|
||||||
|
|
||||||
if (msr_ile) {
|
if (msr_ile) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user