]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/commit
MFC 227430
authorrstone <rstone@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Sun, 27 May 2012 00:38:36 +0000 (00:38 +0000)
committerrstone <rstone@ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f>
Sun, 27 May 2012 00:38:36 +0000 (00:38 +0000)
commitc2e383259e6c7d39c45743a6bf1c5e430591fb4a
treeb55a074634a0b37a7c863d0e68cd6dda7da85f29
parent81a5f2587b5761828ec0bd8788f7420b392147bb
MFC 227430

 On i386, fbt probes are implemented by writing an invalid opcode over
 certain instructions in a function prologue or epilogue.  DTrace has a
 hook into the invalid opcode fault handler that checks whether the fault
 was due to an probe and if so, runs the DTrace magic.

 Upon returning from an invalid opcode fault caused by a probe, DTrace must
 emulate the instruction that was replaced with the invalid opcode and then
 return control to the instruction following the invalid opcode.

 There were a pair of related bugs in the emulation for the leave
 instruction.  The leave instruction is used to pop off a stack frame prior
 to returning from a function.  The emulation for this instruction must
 move the trap frame for the invalid opcode fault down the stack to the
 bottom of the stack frame that is being removed, and then execute an iret.

 At two points in this process, the emulation code was storing values above
 the current value of the stack pointer.  This opened up a window in which
 if we were two take an interrupt, the trap frame for the interrupt would
 overwrite the values stored on the stack, causing the system to panic
 later.

 The first bug was that at one point the emulation code saves the new value
 for $esp above the current stack pointer value.  The fix is to save this
 value instead inside of the original trap frame.  At this point we do
 not need the original trap frame so this is safe.

 The second bug is that when the emulate code loads $esp from the stack, it
 points part-way through the new trap frame instead of at its beginning.
 The emulation code adjusts the stack pointer to the correct value
 immediately afterwards, but this still leaves a one instruction window in
 which an interrupt would corrupt this trap frame.  Fix this by adjusting
 the stack frame value before loading it into $esp.

 This fixes panics in invop_leave on i386 when using fbt return probes.

 Reviewed by:  rpaulo, attilio

git-svn-id: svn://svn.freebsd.org/base/stable/8@236133 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
sys/cddl/dev/dtrace/i386/dtrace_asm.S