summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2015-10-04 09:39:40 +0000
committerrwatson <rwatson@FreeBSD.org>2015-10-04 09:39:40 +0000
commit707e8db7f896a73ccaf66fc93eb2c33f822c9596 (patch)
tree1a704e1838e71fcbc915a67d8abe240a252f1f88
parent0dee60f8c8e7a05cd88ff2cba642fdffd378d433 (diff)
downloadFreeBSD-src-707e8db7f896a73ccaf66fc93eb2c33f822c9596.zip
FreeBSD-src-707e8db7f896a73ccaf66fc93eb2c33f822c9596.tar.gz
Add missing stack unwind information to several assembly functions on
ARMv6/7: - Define _SAVE() macro to allow unwind data to be conditionally defined for ARM assembly code in the kernel. - Use _SAVE() to provide unwind information for bcopy_page(), and two (of many) instances of copyin() and copyout(). Reviewed by: andrew, imp MFC after: 3 days Sponsored by: University of Cambridge
-rw-r--r--sys/arm/arm/bcopy_page.S4
-rw-r--r--sys/arm/arm/bcopyinout.S3
-rw-r--r--sys/arm/include/asm.h2
3 files changed, 7 insertions, 2 deletions
diff --git a/sys/arm/arm/bcopy_page.S b/sys/arm/arm/bcopy_page.S
index 92e38cc..0d787b2 100644
--- a/sys/arm/arm/bcopy_page.S
+++ b/sys/arm/arm/bcopy_page.S
@@ -75,7 +75,7 @@ __FBSDID("$FreeBSD$");
#endif /* ! COPY_CHUNK */
#ifndef SAVE_REGS
-#define SAVE_REGS stmfd sp!, {r4-r8, lr}
+#define SAVE_REGS stmfd sp!, {r4-r8, lr}; _SAVE({r4-r8, lr})
#define RESTORE_REGS ldmfd sp!, {r4-r8, pc}
#endif
@@ -134,6 +134,7 @@ END(bcopy_page)
ENTRY(bzero_page)
stmfd sp!, {r4-r8, lr}
+ _SAVE({r4-r8, lr})
#ifdef BIG_LOOPS
mov r2, #(PAGE_SIZE >> 9)
#else
@@ -189,6 +190,7 @@ END(bzero_page)
ENTRY(bcopy_page)
pld [r0]
stmfd sp!, {r4, r5}
+ _SAVE({r4, r5})
mov ip, #32
ldr r2, [r0], #0x04 /* 0x00 */
ldr r3, [r0], #0x04 /* 0x04 */
diff --git a/sys/arm/arm/bcopyinout.S b/sys/arm/arm/bcopyinout.S
index c030e24..df0484e 100644
--- a/sys/arm/arm/bcopyinout.S
+++ b/sys/arm/arm/bcopyinout.S
@@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$");
#endif
-#define SAVE_REGS stmfd sp!, {r4-r11}
+#define SAVE_REGS stmfd sp!, {r4-r11}; _SAVE({r4-r11})
#define RESTORE_REGS ldmfd sp!, {r4-r11}
#if defined(_ARM_ARCH_5E)
@@ -341,6 +341,7 @@ ENTRY(copyout)
cmp r2, r3
blt .Lnormale
stmfd sp!, {r0-r2, r4, lr}
+ _SAVE({r0-r2, r4, lr})
mov r3, r0
mov r0, r1
mov r1, r3
diff --git a/sys/arm/include/asm.h b/sys/arm/include/asm.h
index 2f64c37..5958ea3 100644
--- a/sys/arm/include/asm.h
+++ b/sys/arm/include/asm.h
@@ -53,10 +53,12 @@
#define STOP_UNWINDING .cantunwind
#define _FNSTART .fnstart
#define _FNEND .fnend
+#define _SAVE(...) .save __VA_ARGS__
#else
#define STOP_UNWINDING
#define _FNSTART
#define _FNEND
+#define _SAVE(...)
#endif
/*
OpenPOWER on IntegriCloud