From 1111ffc50b3aa5868d41ada0666bf603c1810fbf Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sat, 19 Jan 2008 10:56:40 +0000 Subject: [PATCH] An outermost stack frame (having a NULL previous frame) was incorrectly recognized as iframe. Fixes the read fault when doing "sc" for a kernel thread. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23628 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/arch/x86/arch_debug.cpp | 9 +++++---- src/system/kernel/arch/x86/arch_thread.c | 5 ++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/system/kernel/arch/x86/arch_debug.cpp b/src/system/kernel/arch/x86/arch_debug.cpp index af693c36a5..650c11f784 100644 --- a/src/system/kernel/arch/x86/arch_debug.cpp +++ b/src/system/kernel/arch/x86/arch_debug.cpp @@ -29,8 +29,6 @@ struct stack_frame { #define NUM_PREVIOUS_LOCATIONS 32 -extern struct iframe_stack gBootFrameStack; - static bool already_visited(uint32 *visited, int32 *_last, int32 *_num, uint32 ebp) @@ -200,8 +198,11 @@ is_kernel_stack_address(struct thread* thread, addr_t address) static bool is_iframe(struct thread* thread, addr_t frame) { - return is_kernel_stack_address(thread, frame) - && (*(addr_t*)frame & ~IFRAME_TYPE_MASK) == 0; + if (!is_kernel_stack_address(thread, frame)) + return false; + + addr_t previousFrame = *(addr_t*)frame; + return ((previousFrame & ~IFRAME_TYPE_MASK) == 0 && previousFrame != 0); } diff --git a/src/system/kernel/arch/x86/arch_thread.c b/src/system/kernel/arch/x86/arch_thread.c index 689ef3fcd6..acbf40fb5f 100644 --- a/src/system/kernel/arch/x86/arch_thread.c +++ b/src/system/kernel/arch/x86/arch_thread.c @@ -67,8 +67,11 @@ find_previous_iframe(addr_t frame) while (frame >= thread->kernel_stack_base && frame < thread->kernel_stack_base + KERNEL_STACK_SIZE) { addr_t previousFrame = *(addr_t*)frame; - if ((previousFrame & ~IFRAME_TYPE_MASK) == 0) + if ((previousFrame & ~IFRAME_TYPE_MASK) == 0) { + if (previousFrame == 0) + return NULL; return (struct iframe*)frame; + } frame = previousFrame; }