From 5ab73cbcbaf6fb69d778d80cac65daf687cbd10b Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Fri, 8 Apr 2011 21:26:50 +0000 Subject: [PATCH] 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) --- sys/amd64/amd64/exception.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/amd64/amd64/exception.S b/sys/amd64/amd64/exception.S index 65515aad7b0b..c537a4f45c83 100644 --- a/sys/amd64/amd64/exception.S +++ b/sys/amd64/amd64/exception.S @@ -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