summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-08-21 15:44:57 +0000
committerkib <kib@FreeBSD.org>2017-08-21 15:44:57 +0000
commit7f25864e738474a6a3382736dce5600f592d6ab9 (patch)
treecccdd3f0e7155016d27d259d87871dd0cab5f928
parentf6bf3586d8949013aa8db2240f8d53dc64ce512e (diff)
downloadFreeBSD-src-7f25864e738474a6a3382736dce5600f592d6ab9.zip
FreeBSD-src-7f25864e738474a6a3382736dce5600f592d6ab9.tar.gz
MFC r322667,r322706:
Improve i386 #UD low-level kdtrace hook. Approved by: re (marius)
-rw-r--r--sys/i386/i386/exception.s22
1 files changed, 15 insertions, 7 deletions
diff --git a/sys/i386/i386/exception.s b/sys/i386/i386/exception.s
index a3674c7..0b124ac 100644
--- a/sys/i386/i386/exception.s
+++ b/sys/i386/i386/exception.s
@@ -185,21 +185,29 @@ calltrap:
#ifdef KDTRACE_HOOKS
SUPERALIGN_TEXT
IDTVEC(ill)
- /* Check if there is no DTrace hook registered. */
- cmpl $0,dtrace_invop_jump_addr
+ /*
+ * Check if a DTrace hook is registered. The default (data) segment
+ * cannot be used for this since %ds is not known good until we
+ * verify that the entry was from kernel mode.
+ */
+ cmpl $0,%ss:dtrace_invop_jump_addr
je norm_ill
- /* Check if this is a user fault. */
- cmpl $GSEL_KPL, 4(%esp) /* Check the code segment. */
-
- /* If so, just handle it as a normal trap. */
+ /*
+ * Check if this is a user fault. If so, just handle it as a normal
+ * trap.
+ */
+ cmpl $GSEL_KPL, 4(%esp) /* Check the code segment */
jne norm_ill
+ testl $PSL_VM, 8(%esp) /* and vm86 mode. */
+ jnz norm_ill
/*
* This is a kernel instruction fault that might have been caused
* by a DTrace provider.
*/
- pushal /* Push all registers onto the stack. */
+ pushal
+ cld
/*
* Set our jump address for the jump back in the event that
OpenPOWER on IntegriCloud