svn commit: r267086 - stable/9/sys/amd64/amd64
Konstantin Belousov
kib at FreeBSD.org
Thu Jun 5 01:00:27 UTC 2014
Author: kib
Date: Thu Jun 5 01:00:27 2014
New Revision: 267086
URL: http://svnweb.freebsd.org/changeset/base/267086
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.
Approved by: re (gjb)
Modified:
stable/9/sys/amd64/amd64/exception.S
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/amd64/amd64/exception.S
==============================================================================
--- stable/9/sys/amd64/amd64/exception.S Thu Jun 5 00:50:55 2014 (r267085)
+++ stable/9/sys/amd64/amd64/exception.S Thu Jun 5 01:00:27 2014 (r267086)
@@ -722,21 +722,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-9
mailing list