Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Sep 2018 17:33:59 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r338976 - in head/sys: amd64/amd64 i386/i386
Message-ID:  <201809271733.w8RHXx2G043044@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Thu Sep 27 17:33:59 2018
New Revision: 338976
URL: https://svnweb.freebsd.org/changeset/base/338976

Log:
  Don't clear DR6 for debug exceptions from userland.
  
  This reverts part of r333368.  The attempt to clear DR6 was occuring
  too soon as trapsignal() does not pause to let the debugger notice the
  SIGTRAP and query DR6.  The signal exchange does not occur until much
  later during ast().  As a result, GDB was no longer recognizing
  hardware breakpoints and watchpoints on x86.
  
  In addition, any userland programs that want to inspect DR6 in a
  SIGTRAP handler don't have a way to do this if we clear DR6 in the
  exception handler.
  
  Instead of relying on the kernel to clear DR6, debuggers will have to
  explicitly clear it after a trace trap (which they needed to do on
  older kernels anyway).
  
  Reviewed by:	kib
  Approved by:	re (delphij)
  MFC after:	3 days
  Differential Revision:	https://reviews.freebsd.org/D17319

Modified:
  head/sys/amd64/amd64/trap.c
  head/sys/i386/i386/trap.c

Modified: head/sys/amd64/amd64/trap.c
==============================================================================
--- head/sys/amd64/amd64/trap.c	Thu Sep 27 17:22:40 2018	(r338975)
+++ head/sys/amd64/amd64/trap.c	Thu Sep 27 17:33:59 2018	(r338976)
@@ -659,12 +659,6 @@ trap(struct trapframe *frame)
 	KASSERT((read_rflags() & PSL_I) != 0, ("interrupts disabled"));
 	trapsignal(td, &ksi);
 
-	/*
-	 * Clear any pending debug exceptions after allowing a
-	 * debugger to read DR6 while stopped in trapsignal().
-	 */
-	if (type == T_TRCTRAP)
-		load_dr6(0);
 userret:
 	userret(td, frame);
 	KASSERT(PCB_USER_FPU(td->td_pcb),

Modified: head/sys/i386/i386/trap.c
==============================================================================
--- head/sys/i386/i386/trap.c	Thu Sep 27 17:22:40 2018	(r338975)
+++ head/sys/i386/i386/trap.c	Thu Sep 27 17:33:59 2018	(r338976)
@@ -762,12 +762,6 @@ kernel_trctrap:
 	KASSERT((read_eflags() & PSL_I) != 0, ("interrupts disabled"));
 	trapsignal(td, &ksi);
 
-	/*
-	 * Clear any pending debug exceptions after allowing a
-	 * debugger to read DR6 while stopped in trapsignal().
-	 */
-	if (type == T_TRCTRAP)
-		load_dr6(0);
 user:
 	userret(td, frame);
 	KASSERT(PCB_USER_FPU(td->td_pcb),



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