]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/sparc64/kernel/stacktrace.c
Merge branch 'audit.b51' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit...
[linux-2.6-omap-h63xx.git] / arch / sparc64 / kernel / stacktrace.c
index 84d39e873e880655d32b4b1ceb05ea32ddc9cf79..01b52f561af49f86a0bb5e0f1513af60fe9aaef4 100644 (file)
@@ -20,6 +20,8 @@ void save_stack_trace(struct stack_trace *trace)
        thread_base = (unsigned long) tp;
        do {
                struct reg_window *rw;
+               struct pt_regs *regs;
+               unsigned long pc;
 
                /* Bogus frame pointer? */
                if (fp < (thread_base + sizeof(struct thread_info)) ||
@@ -27,11 +29,19 @@ void save_stack_trace(struct stack_trace *trace)
                        break;
 
                rw = (struct reg_window *) fp;
+               regs = (struct pt_regs *) (rw + 1);
+
+               if ((regs->magic & ~0x1ff) == PT_REGS_MAGIC) {
+                       pc = regs->tpc;
+                       fp = regs->u_regs[UREG_I6] + STACK_BIAS;
+               } else {
+                       pc = rw->ins[7];
+                       fp = rw->ins[6] + STACK_BIAS;
+               }
+
                if (trace->skip > 0)
                        trace->skip--;
                else
-                       trace->entries[trace->nr_entries++] = rw->ins[7];
-
-               fp = rw->ins[6] + STACK_BIAS;
+                       trace->entries[trace->nr_entries++] = pc;
        } while (trace->nr_entries < trace->max_entries);
 }