Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Sep 2015 18:30:07 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r288123 - head/sys/arm64/arm64
Message-ID:  <201509221830.t8MIU7c8074899@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue Sep 22 18:30:06 2015
New Revision: 288123
URL: https://svnweb.freebsd.org/changeset/base/288123

Log:
  Call ast when handling irq from userspace, otherwise we could miss
  reschedule.  Right now arm_cpu_intr() does critical_exit() as the last
  action, so the impact is not serious.
  
  Remove duplicated interrupt disable in restore_registers macro, when
  returning to usermode.  The do_ast macro disabled interrupts for us.
  
  Reviewed by:	andrew
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D3714

Modified:
  head/sys/arm64/arm64/exception.S

Modified: head/sys/arm64/arm64/exception.S
==============================================================================
--- head/sys/arm64/arm64/exception.S	Tue Sep 22 18:16:52 2015	(r288122)
+++ head/sys/arm64/arm64/exception.S	Tue Sep 22 18:30:06 2015	(r288123)
@@ -63,8 +63,13 @@ __FBSDID("$FreeBSD$");
 .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
@@ -155,6 +160,7 @@ handle_el0_irq:
 	save_registers 0
 	mov	x0, sp
 	bl	arm_cpu_intr
+	do_ast
 	restore_registers 0
 	eret
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201509221830.t8MIU7c8074899>