diff --git a/arch/sparc/kernel/stacktrace.c b/arch/sparc/kernel/stacktrace.c
index 1d1fc45d3309216559ecd4a09951362b36c0afd6..b755b31599d7d2f012ac69a3f3a5eb4f9f94740c 100644
--- a/arch/sparc/kernel/stacktrace.c
+++ b/arch/sparc/kernel/stacktrace.c
@@ -51,10 +51,7 @@ void save_stack_trace(struct stack_trace *trace, uint32_t sp, uint32_t pc)
 	/* flush register windows to memory*/
 	leon_reg_win_flush();
 
-	do {
-		if (!stack_valid(sp))
-			break;
-
+	while (trace->nr_entries < trace->max_entries) {
 
 		sf   = (struct sparc_stackf *) sp;
 		regs = (struct pt_regs *) (sf + 1);
@@ -67,7 +64,9 @@ void save_stack_trace(struct stack_trace *trace, uint32_t sp, uint32_t pc)
 		pc = sf->callers_pc;
 		sp = (uint32_t) sf->fp;
 
-	} while (trace->nr_entries < trace->max_entries);
+		if (!stack_valid(sp))
+			break;
+	}
 }
 
 
@@ -92,18 +91,20 @@ void die(void)
  * @param pc a program counter
  *
  * @note this is called by the trap handler
+ *
  */
 
 void trace(uint32_t fp, uint32_t pc)
 {
-	uint32_t entries[30];
-
+#define MAX_ENTRIES 30
 	struct stack_trace x;
+        struct sparc_stackf *frames[MAX_ENTRIES];
+        struct pt_regs      *regs[MAX_ENTRIES];
 
-
-	x.max_entries = 30;
+	x.max_entries = MAX_ENTRIES;
 	x.nr_entries  = 0;
-	x.entries     = entries;
+	x.frames      = frames;
+	x.regs        = regs;
 
 	save_stack_trace(&x, fp, pc);
 }