Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Apr 2011 21:26:50 +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: r220460 - head/sys/amd64/amd64
Message-ID:  <201104082126.p38LQoLH092275@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Fri Apr  8 21:26:50 2011
New Revision: 220460
URL: http://svn.freebsd.org/changeset/base/220460

Log:
  Disable local interrupts before testing the PCB_FULL_IRET flag.
  Thread might be preempted after testing, which causes the flag to be
  cleared. If ast was not delivered, we will do sysret with potentially
  wrong fs/gs bases.
  
  Reviewed by:	jhb, jkim
  MFC after:	1 week (together with r220430, r220452)

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

Modified: head/sys/amd64/amd64/exception.S
==============================================================================
--- head/sys/amd64/amd64/exception.S	Fri Apr  8 19:54:29 2011	(r220459)
+++ head/sys/amd64/amd64/exception.S	Fri Apr  8 21:26:50 2011	(r220460)
@@ -383,10 +383,11 @@ IDTVEC(fast_syscall)
 	movq	%rsp,%rdi
 	call	syscall
 1:	movq	PCPU(CURPCB),%rax
+	/* Disable interrupts before testing PCB_FULL_IRET. */
+	cli
 	testl	$PCB_FULL_IRET,PCB_FLAGS(%rax)
 	jnz	3f
 	/* Check for and handle AST's on return to userland. */
-	cli
 	movq	PCPU(CURTHREAD),%rax
 	testl	$TDF_ASTPENDING | TDF_NEEDRESCHED,TD_FLAGS(%rax)
 	je	2f



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