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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to