summaryrefslogtreecommitdiffstats
path: root/sys/arm/include
diff options
context:
space:
mode:
authorandrew <andrew@FreeBSD.org>2013-06-27 18:54:18 +0000
committerandrew <andrew@FreeBSD.org>2013-06-27 18:54:18 +0000
commitf34711c79a85884eccfaed80b433941bd6a03c8f (patch)
treea375d2070bdf2dbf0b3631fef770a29c8d396beb /sys/arm/include
parent8a3748f531c8740f607c4699474b610e9fd67f6c (diff)
downloadFreeBSD-src-f34711c79a85884eccfaed80b433941bd6a03c8f.zip
FreeBSD-src-f34711c79a85884eccfaed80b433941bd6a03c8f.tar.gz
Add UNWINDSVCFRAME to provide the unwind pseudo ops to allow us to unwind
past a trapframe. Use this macro in exception_exit as it is the function the unwinder enters as the functions that store the frame setting lr to point to it.
Diffstat (limited to 'sys/arm/include')
-rw-r--r--sys/arm/include/asmacros.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/sys/arm/include/asmacros.h b/sys/arm/include/asmacros.h
index f83c14f..18dcef5 100644
--- a/sys/arm/include/asmacros.h
+++ b/sys/arm/include/asmacros.h
@@ -206,7 +206,16 @@
mov r0, r0; /* NOP for previous instruction */ \
add sp, sp, #(4*15); /* Adjust the stack pointer */ \
ldmia sp, {sp, lr, pc}^ /* Restore lr and exit */
-#endif
+#endif
+#if defined(__ARM_EABI__)
+#define UNWINDSVCFRAME \
+ .save {r13-r15}; /* Restore sp, lr, pc */ \
+ .pad #(2*4); /* Skip user sp and lr */ \
+ .save {r0-r12}; /* Restore r0-r12 */ \
+ .pad #(4) /* Skip spsr */
+#else
+#define UNWINDSVCFRAME
+#endif
#define DATA(name) \
.data ; \
OpenPOWER on IntegriCloud