summaryrefslogtreecommitdiffstats
path: root/sys/amd64/amd64/trap.c
diff options
context:
space:
mode:
authorbsd <bsd@FreeBSD.org>2000-02-20 20:51:23 +0000
committerbsd <bsd@FreeBSD.org>2000-02-20 20:51:23 +0000
commit85f1c223b39c92c49e8b7c6c7ad39d3e42a27574 (patch)
tree24b3d3119a30ef55034eb6483b006f39f272b986 /sys/amd64/amd64/trap.c
parent5e5e3ebba622666325b5191546c69ed7f00a5781 (diff)
downloadFreeBSD-src-85f1c223b39c92c49e8b7c6c7ad39d3e42a27574.zip
FreeBSD-src-85f1c223b39c92c49e8b7c6c7ad39d3e42a27574.tar.gz
Don't forget to reset the hardware debug registers when a process that
was using them exits. Don't allow a user process to cause the kernel to take a TRCTRAP on a user space address. Reviewed by: jlemon, sef Approved by: jkh
Diffstat (limited to 'sys/amd64/amd64/trap.c')
-rw-r--r--sys/amd64/amd64/trap.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 4199346..a8b73cf 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -519,8 +519,26 @@ kernel_trap:
frame.tf_eflags &= ~PSL_T;
return;
}
+ /*
+ * Ignore debug register trace traps due to
+ * accesses in the user's address space, which
+ * can happen under several conditions such as
+ * if a user sets a watchpoint on a buffer and
+ * then passes that buffer to a system call.
+ * We still want to get TRCTRAPS for addresses
+ * in kernel space because that is useful when
+ * debugging the kernel.
+ */
+ if (user_dbreg_trap()) {
+ /*
+ * Reset breakpoint bits because the
+ * processor doesn't
+ */
+ load_dr6(rdr6() & 0xfffffff0);
+ return;
+ }
/*
- * Fall through.
+ * Fall through (TRCTRAP kernel mode, kernel address)
*/
case T_BPTFLT:
/*
OpenPOWER on IntegriCloud