Index: kernel/arch/sparc64/src/debug/stacktrace.c
===================================================================
--- kernel/arch/sparc64/src/debug/stacktrace.c	(revision be6cef1be0dc2c677a0cbe6a56cde9c7cbca71c9)
+++ kernel/arch/sparc64/src/debug/stacktrace.c	(revision 08c88b8417ff45cba6767f098910f4feecc24b6b)
@@ -37,17 +37,30 @@
 #include <typedefs.h>
 
+#include <arch/stack.h>
+
+#define FRAME_OFFSET_FP_PREV	14
+#define FRAME_OFFSET_RA		15
+
+extern void alloc_window_and_flush(void);
+
 bool kernel_frame_pointer_validate(uintptr_t fp)
 {
-	return false;
+	return fp != 0;
 }
 
 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
 {
-	return false;
+	uint64_t *stack = (void *) fp;
+	alloc_window_and_flush();
+	*prev = stack[FRAME_OFFSET_FP_PREV] + STACK_BIAS;
+	return true;
 }
 
 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
 {
-	return false;
+	uint64_t *stack = (void *) fp;
+	alloc_window_and_flush();
+	*ra = stack[FRAME_OFFSET_RA];
+	return true;
 }
 
Index: kernel/arch/sparc64/src/debug/stacktrace_asm.S
===================================================================
--- kernel/arch/sparc64/src/debug/stacktrace_asm.S	(revision be6cef1be0dc2c677a0cbe6a56cde9c7cbca71c9)
+++ kernel/arch/sparc64/src/debug/stacktrace_asm.S	(revision 08c88b8417ff45cba6767f098910f4feecc24b6b)
@@ -27,15 +27,26 @@
 #
 
+#include <arch/stack.h>
+
 .text
 
 .global frame_pointer_get
 .global program_counter_get
+.global alloc_window_and_flush
 
 frame_pointer_get:
+	# Add the stack bias to %sp to get the actual address.
 	retl
-	nop
+	add %sp, STACK_BIAS, %o0
 
 program_counter_get:
 	retl
-	nop
+	mov %o7, %o0
 
+alloc_window_and_flush:
+	save %sp, -(STACK_WINDOW_SAVE_AREA_SIZE+STACK_ARG_SAVE_AREA_SIZE), %sp
+	# Flush all other windows to memory so that we can read their contents.
+	flushw
+	ret
+	restore
+
