libroot/ppc: Add missing stack_trace
This commit is contained in:
@@ -17,6 +17,7 @@ for architectureObject in [ MultiArchSubDirSetup ppc ] {
|
|||||||
byteorder.S
|
byteorder.S
|
||||||
compatibility.c # only here until the places where those functions
|
compatibility.c # only here until the places where those functions
|
||||||
# are used are fixed
|
# are used are fixed
|
||||||
|
stack_trace.cpp
|
||||||
stack_frame.c
|
stack_frame.c
|
||||||
# systeminfo.c
|
# systeminfo.c
|
||||||
system_time.c
|
system_time.c
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Haiku, Inc. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Michael Lotz, [email protected]
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libroot_private.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*! Captures a stack trace (the return addresses) of the current thread.
|
||||||
|
\param returnAddresses The array the return address shall be written to.
|
||||||
|
\param maxCount The maximum number of return addresses to be captured.
|
||||||
|
\param skipFrames The number of stack frames that shall be skipped.
|
||||||
|
\param stackBase The base address of the thread stack.
|
||||||
|
\param stackEnd The first address past the thread stack.
|
||||||
|
\return The number of return addresses written to the given array.
|
||||||
|
*/
|
||||||
|
int32
|
||||||
|
__arch_get_stack_trace(addr_t* returnAddresses, int32 maxCount,
|
||||||
|
int32 skipFrames, addr_t stackBase, addr_t stackEnd)
|
||||||
|
{
|
||||||
|
int32 count = 0;
|
||||||
|
addr_t basePointer = (addr_t)get_stack_frame();
|
||||||
|
|
||||||
|
while (basePointer != 0 && count < maxCount) {
|
||||||
|
if (basePointer < stackBase || basePointer >= stackEnd)
|
||||||
|
break;
|
||||||
|
|
||||||
|
struct stack_frame {
|
||||||
|
addr_t previous;
|
||||||
|
addr_t return_address;
|
||||||
|
};
|
||||||
|
|
||||||
|
stack_frame* frame = (stack_frame*)basePointer;
|
||||||
|
|
||||||
|
if (skipFrames <= 0)
|
||||||
|
returnAddresses[count++] = frame->return_address;
|
||||||
|
else
|
||||||
|
skipFrames--;
|
||||||
|
|
||||||
|
basePointer = frame->previous;
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user