mirror of
https://github.com/crash-utility/crash
synced 2025-01-19 07:10:43 +00:00
Fix for infrequent failures of the x86 "bt" command to handle cases
where a user space task with "resume_userspace" or "entry_INT80_32" at the top of the stack, or which was interrupted by the crash NMI while handling a timer interrupt. Without the patch, the backtrace would be proceeded with the error message "bt: cannot resolve stack trace", and then dump the text symbols found on the stack and all possible exception frames. (anderson@redhat.com)
This commit is contained in:
parent
483f98dab7
commit
8a846ffa5c
@ -1953,13 +1953,24 @@ find_trace(
|
|||||||
static int
|
static int
|
||||||
kernel_entry_from_user_space(sframe_t *curframe, struct bt_info *bt)
|
kernel_entry_from_user_space(sframe_t *curframe, struct bt_info *bt)
|
||||||
{
|
{
|
||||||
|
ulong stack_segment;
|
||||||
|
|
||||||
if (is_kernel_thread(bt->tc->task))
|
if (is_kernel_thread(bt->tc->task))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (((curframe->fp + 4 + SIZE(pt_regs)) == GET_STACKTOP(bt->task)) &&
|
stack_segment = GET_STACK_ULONG(curframe->fp + 4 + SIZE(pt_regs) - sizeof(kaddr_t));
|
||||||
!is_kernel_thread(bt->tc->task))
|
|
||||||
|
if ((curframe->fp + 4 + SIZE(pt_regs)) == GET_STACKTOP(bt->task)) {
|
||||||
|
if ((stack_segment == 0x7b) || (stack_segment == 0x2b))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else if (userspace_return(curframe->fp+4, bt))
|
}
|
||||||
|
|
||||||
|
if ((curframe->fp + 4 + SIZE(pt_regs) + 8) == GET_STACKTOP(bt->task)) {
|
||||||
|
if ((stack_segment == 0x7b) || (stack_segment == 0x2b))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (userspace_return(curframe->fp+4, bt))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
Loading…
Reference in New Issue
Block a user