svn commit: r290668 - in stable: 10/sys/i386/i386 10/sys/i386/include 9/sys/i386/i386 9/sys/i386/include

John Baldwin jhb at FreeBSD.org
Wed Nov 11 01:32:37 UTC 2015


Author: jhb
Date: Wed Nov 11 01:32:35 2015
New Revision: 290668
URL: https://svnweb.freebsd.org/changeset/base/290668

Log:
  MFC 284324,290164:
  Workaround debuggers that try to read the full 32-bit words holding
  selectors in trapframes.
  
  284324:
  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.
  
  290164:
  Use movw instead of movl (or plain mov) when moving segment registers
  into memory.  This is a nop on clang's assembler, but some assemblers
  complain if the size suffix is incorrect.

Modified:
  stable/9/sys/i386/i386/exception.s
  stable/9/sys/i386/include/asmacros.h
Directory Properties:
  stable/9/sys/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/10/sys/i386/i386/exception.s
  stable/10/sys/i386/include/asmacros.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/9/sys/i386/i386/exception.s
==============================================================================
--- stable/9/sys/i386/i386/exception.s	Wed Nov 11 00:45:41 2015	(r290667)
+++ stable/9/sys/i386/i386/exception.s	Wed Nov 11 01:32:35 2015	(r290668)
@@ -158,9 +158,12 @@ IDTVEC(xmm)
 	.type	alltraps, at function
 alltraps:
 	pushal
-	pushl	%ds
-	pushl	%es
-	pushl	%fs
+	pushl	$0
+	movw	%ds,(%esp)
+	pushl	$0
+	movw	%es,(%esp)
+	pushl	$0
+	movw	%fs,(%esp)
 alltraps_with_regs_pushed:
 	SET_KERNEL_SREGS
 	cld
@@ -234,9 +237,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
+	movw	%ds,(%esp)
+	pushl	$0
+	movw	%es,(%esp)
+	pushl	$0
+	movw	%fs,(%esp)
 	SET_KERNEL_SREGS
 	cld
 	FAKE_MCOUNT(TF_EIP(%esp))
@@ -260,9 +266,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
+	movw	%ds,(%esp)
+	pushl	$0
+	movw	%es,(%esp)
+	pushl	$0
+	movw	%fs,(%esp)
 	SET_KERNEL_SREGS
 	cld
 	FAKE_MCOUNT(TF_EIP(%esp))
@@ -417,13 +426,16 @@ doreti_iret:
 doreti_iret_fault:
 	subl	$8,%esp
 	pushal
-	pushl	%ds
+	pushl	$0
+	movw	%ds,(%esp)
 	.globl	doreti_popl_ds_fault
 doreti_popl_ds_fault:
-	pushl	%es
+	pushl	$0
+	movw	%es,(%esp)
 	.globl	doreti_popl_es_fault
 doreti_popl_es_fault:
-	pushl	%fs
+	pushl	$0
+	movw	%fs,(%esp)
 	.globl	doreti_popl_fs_fault
 doreti_popl_fs_fault:
 	sti

Modified: stable/9/sys/i386/include/asmacros.h
==============================================================================
--- stable/9/sys/i386/include/asmacros.h	Wed Nov 11 00:45:41 2015	(r290667)
+++ stable/9/sys/i386/include/asmacros.h	Wed Nov 11 01:32:35 2015	(r290668)
@@ -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 ... */	\
+	movw	%ds,(%esp) ;						\
+	pushl	$0 ;							\
+	movw	%es,(%esp) ;						\
+	pushl	$0 ;							\
+	movw	%fs,(%esp)
 	
 #define	POP_FRAME							\
 	popl	%fs ;							\


More information about the svn-src-stable-9 mailing list