diff options
author | andrew <andrew@FreeBSD.org> | 2013-06-27 18:54:18 +0000 |
---|---|---|
committer | andrew <andrew@FreeBSD.org> | 2013-06-27 18:54:18 +0000 |
commit | f34711c79a85884eccfaed80b433941bd6a03c8f (patch) | |
tree | a375d2070bdf2dbf0b3631fef770a29c8d396beb /sys/arm/include | |
parent | 8a3748f531c8740f607c4699474b610e9fd67f6c (diff) | |
download | FreeBSD-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.h | 11 |
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 ; \ |