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

Reply via email to