|
|
@@ -961,6 +961,7 @@ static void _stop(struct pl330_thread *thrd)
|
|
|
{
|
|
|
void __iomem *regs = thrd->dmac->base;
|
|
|
u8 insn[6] = {0, 0, 0, 0, 0, 0};
|
|
|
+ u32 inten = readl(regs + INTEN);
|
|
|
|
|
|
if (_state(thrd) == PL330_STATE_FAULT_COMPLETING)
|
|
|
UNTIL(thrd, PL330_STATE_FAULTING | PL330_STATE_KILLING);
|
|
|
@@ -973,10 +974,13 @@ static void _stop(struct pl330_thread *thrd)
|
|
|
|
|
|
_emit_KILL(0, insn);
|
|
|
|
|
|
- /* Stop generating interrupts for SEV */
|
|
|
- writel(readl(regs + INTEN) & ~(1 << thrd->ev), regs + INTEN);
|
|
|
-
|
|
|
_execute_DBGINSN(thrd, insn, is_manager(thrd));
|
|
|
+
|
|
|
+ /* clear the event */
|
|
|
+ if (inten & (1 << thrd->ev))
|
|
|
+ writel(1 << thrd->ev, regs + INTCLR);
|
|
|
+ /* Stop generating interrupts for SEV */
|
|
|
+ writel(inten & ~(1 << thrd->ev), regs + INTEN);
|
|
|
}
|
|
|
|
|
|
/* Start doing req 'idx' of thread 'thrd' */
|