Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Nov 2013 15:08:53 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r258171 - stable/9/sys/boot/i386/btx/btx
Message-ID:  <201311151508.rAFF8rDt055203@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Nov 15 15:08:53 2013
New Revision: 258171
URL: http://svnweb.freebsd.org/changeset/base/258171

Log:
  MFC 256293:
  Sanitize the %eflags returned by BIOS routines.  Some BIOS routines enter
  protected mode and may leave protected-mode-specific flags like PSL_NT set
  when they return to real mode.  This can cause a fault when BTX re-enters
  protected mode after the BIOS mode returns.
  
  PR:		amd64/182740

Modified:
  stable/9/sys/boot/i386/btx/btx/btx.S
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/boot/   (props changed)

Modified: stable/9/sys/boot/i386/btx/btx/btx.S
==============================================================================
--- stable/9/sys/boot/i386/btx/btx/btx.S	Fri Nov 15 13:55:55 2013	(r258170)
+++ stable/9/sys/boot/i386/btx/btx/btx.S	Fri Nov 15 15:08:53 2013	(r258171)
@@ -41,6 +41,8 @@
 		.set PSL_RESERVED_DEFAULT,0x00000002
 		.set PSL_T,0x00000100		# Trap flag
 		.set PSL_I,0x00000200		# Interrupt enable flag
+		.set PSL_D,0x00000400		# String instruction direction
+		.set PSL_NT,0x00004000		# Nested task flag
 		.set PSL_VM,0x00020000		# Virtual 8086 mode flag
 		.set PSL_AC,0x00040000		# Alignment check flag
 /*
@@ -611,8 +613,8 @@ rret_tramp:	movw $MEM_ESPR-0x08,%sp		# R
 		pushl %ds			#  regs
 		pushl %es
 		pushfl				# Save %eflags
-		cli				# Disable interrupts
-		std				# String ops dec
+		pushl $PSL_RESERVED_DEFAULT|PSL_D # Use clean %eflags with
+		popfl				#  string ops dec
 		xorw %ax,%ax			# Reset seg 
 		movw %ax,%ds			#  regs
 		movw %ax,%es			#  (%ss is already 0)
@@ -675,6 +677,7 @@ rret_tramp.1:	xorl %ecx,%ecx			# Zero
 		testl $V86F_FLAGS,%edx		# User wants flags?
 		jz rret_tramp.3			# No
 		movl MEM_ESPR-0x3c,%eax		# Read real mode flags
+		andl $~(PSL_T|PSL_NT),%eax	# Clear unsafe flags
 		movw %ax,-0x08(%esi)		# Update user flags (low 16)
 /*
  * Return to the user task



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311151508.rAFF8rDt055203>