summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/shared/src
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/shared/src')
-rw-r--r--c/src/lib/libcpu/powerpc/shared/src/Makefile.am4
-rw-r--r--c/src/lib/libcpu/powerpc/shared/src/stack.c42
-rw-r--r--c/src/lib/libcpu/powerpc/shared/src/stackTrace.h8
3 files changed, 52 insertions, 2 deletions
diff --git a/c/src/lib/libcpu/powerpc/shared/src/Makefile.am b/c/src/lib/libcpu/powerpc/shared/src/Makefile.am
index 784cedd4a9..623a6fad80 100644
--- a/c/src/lib/libcpu/powerpc/shared/src/Makefile.am
+++ b/c/src/lib/libcpu/powerpc/shared/src/Makefile.am
@@ -5,12 +5,12 @@
VPATH = @srcdir@:@srcdir@/../../../shared/src
-C_FILES = cache.c cache_aligned_malloc.c cache_manager.c
+C_FILES = cache.c cache_aligned_malloc.c cache_manager.c stack.c
C_O_FILES = $(C_FILES:%.c=$(ARCH)/%.$(OBJEXT))
include_libcpudir = $(includedir)/libcpu
-include_libcpu_HEADERS = cache_.h cache.h
+include_libcpu_HEADERS = cache_.h cache.h stackTrace.h
OBJS = $(C_O_FILES)
diff --git a/c/src/lib/libcpu/powerpc/shared/src/stack.c b/c/src/lib/libcpu/powerpc/shared/src/stack.c
new file mode 100644
index 0000000000..bf97cb53db
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/shared/src/stack.c
@@ -0,0 +1,42 @@
+#include "stackTrace.h"
+#include <rtems/bspIo.h>
+#include <libcpu/spr.h>
+
+SPR_RO(LR)
+
+typedef struct FrameRec_ {
+ struct FrameRec_ *up;
+ void *lr;
+} FrameRec, *Frame;
+
+#define CPU_STACK_TRACE_DEPTH 40
+
+void CPU_stack_take_snapshot(void **stack, int size, void *pc, void *lr, void *r1)
+{
+register Frame p = (Frame)lr;
+register int i=0;
+ if (pc) stack[i++]=pc;
+ if (!p)
+ p = (Frame)_read_LR();
+ stack[i++]=p;
+ p = r1;
+ if (!p) /* no macro for reading user regs */
+ __asm__ __volatile__("mr %0, %%r1":"=r"(p));
+ for (; i<size-1 && p->up; p=p->up, i++) {
+ stack[i]=p->up->lr;
+ }
+ stack[i]=0;
+}
+
+void CPU_print_stack(void)
+{
+ void *stck[CPU_STACK_TRACE_DEPTH];
+ int i;
+ CPU_stack_take_snapshot(stck,CPU_STACK_TRACE_DEPTH,0,0,0);
+ for (i=0; stck[i]; i++) {
+ if (i%5) printk("--> ");
+ else printk("\n");
+ printk("0x%08x",stck[i]);
+ }
+ printk("\n");
+}
diff --git a/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h b/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h
new file mode 100644
index 0000000000..b85b333876
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/shared/src/stackTrace.h
@@ -0,0 +1,8 @@
+#ifndef CPU_STACK_UTIL_H
+#define CPU_STACK_UTIL_H
+
+void CPU_stack_take_snapshot(void **stack, int size, void *pc, void *lr, void *r1);
+
+void CPU_print_stack(void);
+
+#endif