Index: uspace/lib/libc/arch/arm32/Makefile.inc
===================================================================
--- uspace/lib/libc/arch/arm32/Makefile.inc	(revision f0452536864f254d60b591dec3f5ce98a9645f1f)
+++ uspace/lib/libc/arch/arm32/Makefile.inc	(revision f1848d67fa6c3a3d60583a9ec31aff6dfcf95754)
@@ -40,5 +40,5 @@
 	arch/$(UARCH)/src/stacktrace.S
 
-GCC_CFLAGS += -ffixed-r9 -mtp=soft
+GCC_CFLAGS += -ffixed-r9 -mtp=soft -mapcs-frame -fno-omit-frame-pointer
 LFLAGS += -N $(SOFTINT_PREFIX)/libsoftint.a
 
Index: uspace/lib/libc/arch/arm32/include/fibril.h
===================================================================
--- uspace/lib/libc/arch/arm32/include/fibril.h	(revision f0452536864f254d60b591dec3f5ce98a9645f1f)
+++ uspace/lib/libc/arch/arm32/include/fibril.h	(revision f1848d67fa6c3a3d60583a9ec31aff6dfcf95754)
@@ -58,9 +58,11 @@
  *  @param ptls  Pointer to the TCB.
  */
-#define context_set(c, _pc, stack, size, ptls) 			\
-	(c)->pc = (sysarg_t) (_pc);				\
-	(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; 	\
-        (c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET;
-
+#define context_set(c, _pc, stack, size, ptls) \
+	do { \
+		(c)->pc = (sysarg_t) (_pc); \
+		(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \
+ 		(c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET; \
+		(c)->fp = 0; \
+	} while (0)
 
 /** Fibril context. 
@@ -79,7 +81,7 @@
 	uint32_t r7;
 	uint32_t r8;
-	uint32_t tls;
+	uint32_t tls;	/* r9 */
 	uint32_t r10;
-	uint32_t r11;
+	uint32_t fp;	/* r11 */
 } context_t;
 
Index: uspace/lib/libc/arch/arm32/src/entry.s
===================================================================
--- uspace/lib/libc/arch/arm32/src/entry.s	(revision f0452536864f254d60b591dec3f5ce98a9645f1f)
+++ uspace/lib/libc/arch/arm32/src/entry.s	(revision f1848d67fa6c3a3d60583a9ec31aff6dfcf95754)
@@ -43,4 +43,12 @@
 	str r2, [r0]
 
+	#
+	# Create the first stack frame.
+	#
+	mov fp, #0
+	mov ip, sp
+	push {fp, ip, lr, pc}
+	sub fp, ip, #4
+
 	# Pass pcb_ptr to __main as the first argument (in r0)
 	mov r0, r1
Index: uspace/lib/libc/arch/arm32/src/stacktrace.S
===================================================================
--- uspace/lib/libc/arch/arm32/src/stacktrace.S	(revision f0452536864f254d60b591dec3f5ce98a9645f1f)
+++ uspace/lib/libc/arch/arm32/src/stacktrace.S	(revision f1848d67fa6c3a3d60583a9ec31aff6dfcf95754)
@@ -36,9 +36,20 @@
 
 frame_pointer_get:
-frame_pointer_prev:
-frame_pointer_validate:
-return_address_get:
-program_counter_get:
-	mov r0, #0
+	mov r0, fp
 	mov pc, lr
 
+frame_pointer_prev:
+	ldr r0, [r0, #-12]
+	mov pc, lr
+
+frame_pointer_validate:
+	mov pc, lr
+
+return_address_get:
+	ldr r0, [r0, #-4]
+	mov pc, lr
+
+program_counter_get:
+	mov r0, lr 
+	mov pc, lr
+
Index: uspace/lib/libc/arch/arm32/src/thread_entry.s
===================================================================
--- uspace/lib/libc/arch/arm32/src/thread_entry.s	(revision f0452536864f254d60b591dec3f5ce98a9645f1f)
+++ uspace/lib/libc/arch/arm32/src/thread_entry.s	(revision f1848d67fa6c3a3d60583a9ec31aff6dfcf95754)
@@ -35,3 +35,11 @@
 #
 __thread_entry:
+	#
+	# Create the first stack frame.
+	#
+	mov fp, #0
+	mov ip, sp
+	push {fp, ip, lr, pc}
+	sub fp, ip, #4
+
         b __thread_main
