aboutsummaryrefslogtreecommitdiff
path: root/sys/amd64
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2011-04-08 21:26:50 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2011-04-08 21:26:50 +0000
commit5ab73cbcbaf6fb69d778d80cac65daf687cbd10b (patch)
treec0a6c16dd23cf8037179bc2b4f23fcb95e27da03 /sys/amd64
parent80c2cdcffec4490465a90d88b1868561cacbc4d8 (diff)
downloadsrc-5ab73cbcbaf6fb69d778d80cac65daf687cbd10b.tar.gz
src-5ab73cbcbaf6fb69d778d80cac65daf687cbd10b.zip
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)
Notes
Notes: svn path=/head/; revision=220460
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/exception.S3
1 files changed, 2 insertions, 1 deletions
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