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
This commit is contained in:
Ingo Weinhold 2008-01-19 10:56:40 +00:00
parent 42a5ea091a
commit 1111ffc50b
2 changed files with 9 additions and 5 deletions

View File

@ -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);
}

View File

@ -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;
}