Author: jhb
Date: Fri Jun 12 15:06:17 2015
New Revision: 284324
URL: https://svnweb.freebsd.org/changeset/base/284324

Log:
  Ensure that the upper 16 bits of segment registers manually saved in
  trapframes are cleared by explicitly pushing a zero and then moving
  the segment register into the low 16 bits.  Certain Intel processors
  treat a push of a segment register as a move of the segment register
  into the low 16 bits leaving the upper 16 bits of the word in the
  stack unchanged.
  
  Reviewed by:  kib
  MFC after:    1 month

Modified:
  head/sys/i386/i386/exception.s
  head/sys/i386/include/asmacros.h

Modified: head/sys/i386/i386/exception.s
==============================================================================
--- head/sys/i386/i386/exception.s      Fri Jun 12 15:03:59 2015        
(r284323)
+++ head/sys/i386/i386/exception.s      Fri Jun 12 15:06:17 2015        
(r284324)
@@ -157,9 +157,12 @@ IDTVEC(xmm)
        .type   alltraps,@function
 alltraps:
        pushal
-       pushl   %ds
-       pushl   %es
-       pushl   %fs
+       pushl   $0
+       movl    %ds,(%esp)
+       pushl   $0
+       movl    %es,(%esp)
+       pushl   $0
+       movl    %fs,(%esp)
 alltraps_with_regs_pushed:
        SET_KERNEL_SREGS
        cld
@@ -233,9 +236,12 @@ IDTVEC(lcall_syscall)
        pushl   $7                      /* sizeof "lcall 7,0" */
        subl    $4,%esp                 /* skip over tf_trapno */
        pushal
-       pushl   %ds
-       pushl   %es
-       pushl   %fs
+       pushl   $0
+       movl    %ds,(%esp)
+       pushl   $0
+       movl    %es,(%esp)
+       pushl   $0
+       movl    %fs,(%esp)
        SET_KERNEL_SREGS
        cld
        FAKE_MCOUNT(TF_EIP(%esp))
@@ -259,9 +265,12 @@ IDTVEC(int0x80_syscall)
        pushl   $2                      /* sizeof "int 0x80" */
        subl    $4,%esp                 /* skip over tf_trapno */
        pushal
-       pushl   %ds
-       pushl   %es
-       pushl   %fs
+       pushl   $0
+       movl    %ds,(%esp)
+       pushl   $0
+       movl    %es,(%esp)
+       pushl   $0
+       movl    %fs,(%esp)
        SET_KERNEL_SREGS
        cld
        FAKE_MCOUNT(TF_EIP(%esp))
@@ -416,13 +425,16 @@ doreti_iret:
 doreti_iret_fault:
        subl    $8,%esp
        pushal
-       pushl   %ds
+       pushl   $0
+       movl    %ds,(%esp)
        .globl  doreti_popl_ds_fault
 doreti_popl_ds_fault:
-       pushl   %es
+       pushl   $0
+       movl    %es,(%esp)
        .globl  doreti_popl_es_fault
 doreti_popl_es_fault:
-       pushl   %fs
+       pushl   $0
+       movl    %fs,(%esp)
        .globl  doreti_popl_fs_fault
 doreti_popl_fs_fault:
        sti

Modified: head/sys/i386/include/asmacros.h
==============================================================================
--- head/sys/i386/include/asmacros.h    Fri Jun 12 15:03:59 2015        
(r284323)
+++ head/sys/i386/include/asmacros.h    Fri Jun 12 15:06:17 2015        
(r284324)
@@ -146,9 +146,12 @@
        pushl   $0 ;            /* dummy error code */                  \
        pushl   $0 ;            /* dummy trap type */                   \
        pushal ;                /* 8 ints */                            \
-       pushl   %ds ;           /* save data and extra segments ... */  \
-       pushl   %es ;                                                   \
-       pushl   %fs
+       pushl   $0 ;            /* save data and extra segments ... */  \
+       mov     %ds,(%esp) ;                                            \
+       pushl   $0 ;                                                    \
+       mov     %es,(%esp) ;                                            \
+       pushl   $0 ;                                                    \
+       mov     %fs,(%esp)
        
 #define        POP_FRAME                                                       
\
        popl    %fs ;                                                   \
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to