kernel/x86: Make arch_debug_get_stack_trace handle user-only stack traces.
Begin by getting the user iframe, and remove the logic that was preventing any return addresses from being reported if STACK_TRACE_KERNEL was unset.
This commit is contained in:
@@ -1142,6 +1142,15 @@ arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount,
|
|||||||
addr_t bp = x86_get_stack_frame();
|
addr_t bp = x86_get_stack_frame();
|
||||||
bool onKernelStack = true;
|
bool onKernelStack = true;
|
||||||
|
|
||||||
|
if ((flags & (STACK_TRACE_KERNEL | STACK_TRACE_USER)) == STACK_TRACE_USER) {
|
||||||
|
iframe* frame = x86_get_user_iframe();
|
||||||
|
if (frame == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bp = frame->bp;
|
||||||
|
onKernelStack = false;
|
||||||
|
}
|
||||||
|
|
||||||
while (bp != 0 && count < maxCount) {
|
while (bp != 0 && count < maxCount) {
|
||||||
onKernelStack = onKernelStack
|
onKernelStack = onKernelStack
|
||||||
&& is_kernel_stack_address(thread, bp);
|
&& is_kernel_stack_address(thread, bp);
|
||||||
@@ -1170,11 +1179,10 @@ arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount,
|
|||||||
if (ip == 0)
|
if (ip == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (skipFrames <= 0
|
if (skipFrames > 0)
|
||||||
&& ((flags & STACK_TRACE_KERNEL) != 0 || onKernelStack)) {
|
|
||||||
returnAddresses[count++] = ip;
|
|
||||||
} else
|
|
||||||
skipFrames--;
|
skipFrames--;
|
||||||
|
else
|
||||||
|
returnAddresses[count++] = ip;
|
||||||
|
|
||||||
bp = nextBp;
|
bp = nextBp;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user