From d50c68b2f05c7e899ca31da70a382b75f69399c7 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Tue, 22 Sep 2015 16:29:55 +0000 Subject: [PATCH] Re-check for new ast after ast was handled. We should not return to usermode with pending asts. Reviewed by: andrew Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D3667 --- sys/arm64/arm64/exception.S | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/arm64/arm64/exception.S b/sys/arm64/arm64/exception.S index b05941f5eac..9bbbde727ea 100644 --- a/sys/arm64/arm64/exception.S +++ b/sys/arm64/arm64/exception.S @@ -100,10 +100,11 @@ __FBSDID("$FreeBSD$"); .macro do_ast /* Disable interrupts */ mrs x19, daif +1: msr daifset, #2 /* Read the current thread flags */ -1: ldr x1, [x18, #PC_CURTHREAD] /* Load curthread */ + ldr x1, [x18, #PC_CURTHREAD] /* Load curthread */ ldr x2, [x1, #TD_FLAGS] /* Check if we have either bits set */ @@ -120,9 +121,8 @@ __FBSDID("$FreeBSD$"); mov x0, sp bl _C_LABEL(ast) - /* Disable interrupts */ - mrs x19, daif - msr daifset, #2 + /* Re-check for new ast scheduled */ + b 1b 2: /* Restore interrupts */