svn commit: r267085 - stable/8/sys/amd64/amd64
Konstantin Belousov
kib at FreeBSD.org
Thu Jun 5 00:50:56 UTC 2014
Author: kib
Date: Thu Jun 5 00:50:55 2014
New Revision: 267085
URL: http://svnweb.freebsd.org/changeset/base/267085
Log:
MFC r266846:
When usermode loaded non-default segment selector into the %gs,
correctly prepare KGSBASE msr to restore the user descriptor base on
the last swapgs during return to usermode.
Modified:
stable/8/sys/amd64/amd64/exception.S
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/ (props changed)
Modified: stable/8/sys/amd64/amd64/exception.S
==============================================================================
--- stable/8/sys/amd64/amd64/exception.S Thu Jun 5 00:43:32 2014 (r267084)
+++ stable/8/sys/amd64/amd64/exception.S Thu Jun 5 00:50:55 2014 (r267085)
@@ -718,21 +718,38 @@ ld_fsbase:
pushfq
cli
movl $MSR_GSBASE,%ecx
+ /* Save current kernel %gs base into %r12d:%r13d */
rdmsr
+ movl %eax,%r12d
+ movl %edx,%r13d
.globl ld_gs
ld_gs:
movw %si,%gs
+ /* Save user %gs base into %r14d:%r15d */
+ rdmsr
+ movl %eax,%r14d
+ movl %edx,%r15d
+ /* Restore kernel %gs base */
+ movl %r12d,%eax
+ movl %r13d,%edx
wrmsr
popfq
+ /*
+ * Restore user %gs base, either from PCB if used for TLS, or
+ * from the previously saved msr read.
+ */
+ movl $MSR_KGSBASE,%ecx
cmpw $KUG32SEL,%si
jne 1f
- movl $MSR_KGSBASE,%ecx
movl PCB_GSBASE(%r8),%eax
movl PCB_GSBASE+4(%r8),%edx
+ jmp ld_gsbase
+1:
+ movl %r14d,%eax
+ movl %r15d,%edx
.globl ld_gsbase
ld_gsbase:
- wrmsr
-1:
+ wrmsr /* May trap if non-canonical, but only for TLS. */
.globl ld_es
ld_es:
movw TF_ES(%rsp),%es
More information about the svn-src-stable-8
mailing list