diff options
author | kib <kib@FreeBSD.org> | 2017-08-21 15:44:57 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2017-08-21 15:44:57 +0000 |
commit | 7f25864e738474a6a3382736dce5600f592d6ab9 (patch) | |
tree | cccdd3f0e7155016d27d259d87871dd0cab5f928 | |
parent | f6bf3586d8949013aa8db2240f8d53dc64ce512e (diff) | |
download | FreeBSD-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.s | 22 |
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 |