Index: sys/arm64/arm64/exception.S =================================================================== --- sys/arm64/arm64/exception.S +++ sys/arm64/arm64/exception.S @@ -63,8 +63,13 @@ .endm .macro restore_registers el - msr daifset, #2 /* Disable interrupts, x18 may change - * in the interrupt exception handler */ +.if \el == 1 + msr daifset, #2 + /* + * Disable interrupts, x18 may change in the interrupt exception + * handler. For EL0 exceptions, do_ast already did this. + */ +.endif ldp x18, lr, [sp], #16 ldp x10, x11, [sp], #16 .if \el == 0 @@ -110,8 +115,7 @@ /* Check if we have either bits set */ mov x3, #((TDF_ASTPENDING|TDF_NEEDRESCHED) >> 8) lsl x3, x3, #8 - and x2, x2, x3 - cmp x2, #0 + tst x2, x3 b.eq 2f /* Restore interrupts */ @@ -155,6 +159,7 @@ save_registers 0 mov x0, sp bl arm_cpu_intr + do_ast restore_registers 0 eret