Index: kernel/arch/arm32/src/debug/stacktrace.c
===================================================================
--- kernel/arch/arm32/src/debug/stacktrace.c	(revision aff0503b76b3e5fb8fac8b68d9813e1a5f514c4f)
+++ kernel/arch/arm32/src/debug/stacktrace.c	(revision 94d484ac742127ae8d87a7e0bb630fafe11f65be)
@@ -38,32 +38,43 @@
 #include <typedefs.h>
 
+#define FRAME_OFFSET_FP_PREV	-3
+#define FRAME_OFFSET_RA		-1
+
 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;
+	uint32_t *stack = (void *) fp;
+
+	*prev = stack[FRAME_OFFSET_FP_PREV];
+	return true;
 }
 
 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
 {
-	return false;
+	uint32_t *stack = (void *) fp;
+
+	*ra = stack[FRAME_OFFSET_RA];
+	return true;
 }
 
 bool uspace_frame_pointer_validate(uintptr_t fp)
 {
-	return false;
+	return fp != 0;
 }
 
 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
 {
-	return false;
+	return !copy_from_uspace((void *) prev,
+	    (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
 }
 
 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
 {
-	return false;
+	return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA,
+	    sizeof(*ra));
 }
 
Index: kernel/arch/arm32/src/debug/stacktrace_asm.S
===================================================================
--- kernel/arch/arm32/src/debug/stacktrace_asm.S	(revision aff0503b76b3e5fb8fac8b68d9813e1a5f514c4f)
+++ kernel/arch/arm32/src/debug/stacktrace_asm.S	(revision 94d484ac742127ae8d87a7e0bb630fafe11f65be)
@@ -33,6 +33,8 @@
 
 frame_pointer_get:
+	mov r0, fp
 	mov pc, lr
 
 program_counter_get:
+	mov r0, lr
 	mov pc, lr
