From 6d5c99effe27af7590c4c4adad9af211b29fb178 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 16 Jul 2024 20:22:09 -0400 Subject: [PATCH] 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. --- src/system/kernel/arch/x86/arch_debug.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/system/kernel/arch/x86/arch_debug.cpp b/src/system/kernel/arch/x86/arch_debug.cpp index 76dd6139a2..e20a9d84a0 100644 --- a/src/system/kernel/arch/x86/arch_debug.cpp +++ b/src/system/kernel/arch/x86/arch_debug.cpp @@ -1142,6 +1142,15 @@ arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount, addr_t bp = x86_get_stack_frame(); 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) { onKernelStack = onKernelStack && is_kernel_stack_address(thread, bp); @@ -1170,11 +1179,10 @@ arch_debug_get_stack_trace(addr_t* returnAddresses, int32 maxCount, if (ip == 0) break; - if (skipFrames <= 0 - && ((flags & STACK_TRACE_KERNEL) != 0 || onKernelStack)) { - returnAddresses[count++] = ip; - } else + if (skipFrames > 0) skipFrames--; + else + returnAddresses[count++] = ip; bp = nextBp; }