Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 11 Jul 2016 15:52:52 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r302573 - head/sys/i386/i386
Message-ID:  <201607111552.u6BFqqH2059523@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Mon Jul 11 15:52:52 2016
New Revision: 302573
URL: https://svnweb.freebsd.org/changeset/base/302573

Log:
  Fill tf_trapno for trap frames created for syscall.
  
  If tf_trapno contains garbage which appears to be equal to T_NMI,
  e.g. due to thread previously entered kernel due to NMI, doreti
  sequence skips ast, and does so until a trap or hardware interrupt
  occur.
  
  The visible effects of the issue are quite confusing.  First, signals
  delivery is postponed in observable ways.  In particular, the
  guarantee that unblocked async signals queue is flushed before a
  return from syscall, is broken.  Second, if there are pending signals,
  all interruptible sleeps of the stuck thread are aborted immediately.
  
  Since modern CPUs are relatively fast and tickless kernel generates
  low interrupt rate, the faulty condition might exist for long time (in
  an application time scale).
  
  In collaboration with:	pho
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/sys/i386/i386/exception.s

Modified: head/sys/i386/i386/exception.s
==============================================================================
--- head/sys/i386/i386/exception.s	Mon Jul 11 15:50:06 2016	(r302572)
+++ head/sys/i386/i386/exception.s	Mon Jul 11 15:52:52 2016	(r302573)
@@ -234,7 +234,7 @@ IDTVEC(lcall_syscall)
 	pushfl				/* save eflags */
 	popl	8(%esp)			/* shuffle into tf_eflags */
 	pushl	$7			/* sizeof "lcall 7,0" */
-	subl	$4,%esp			/* skip over tf_trapno */
+	pushl	$0			/* tf_trapno */
 	pushal
 	pushl	$0
 	movw	%ds,(%esp)
@@ -263,7 +263,7 @@ IDTVEC(lcall_syscall)
 	SUPERALIGN_TEXT
 IDTVEC(int0x80_syscall)
 	pushl	$2			/* sizeof "int 0x80" */
-	subl	$4,%esp			/* skip over tf_trapno */
+	pushl	$0			/* tf_trapno */
 	pushal
 	pushl	$0
 	movw	%ds,(%esp)



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