Add a helper that generates a short snippet of code that updates PIE
relocations, loads the stack pointer and calls a C (or asm) function.
The code gets placed into a PIE section.

Signed-off-by: Russ Dill <russ.d...@ti.com>
---
 arch/arm/include/asm/suspend.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h
index cd20029..92996f0 100644
--- a/arch/arm/include/asm/suspend.h
+++ b/arch/arm/include/asm/suspend.h
@@ -1,6 +1,8 @@
 #ifndef __ASM_ARM_SUSPEND_H
 #define __ASM_ARM_SUSPEND_H
 
+#include <asm/pie.h>
+
 struct sleep_save_sp {
        u32 *save_ptr_stash;
        u32 save_ptr_stash_phys;
@@ -9,4 +11,27 @@ struct sleep_save_sp {
 extern void cpu_resume(void);
 extern int cpu_suspend(unsigned long, int (*)(unsigned long));
 
+/**
+ * ARM_PIE_RESUME - generate a PIE trampoline for resume
+ * @proc:      SoC, should match argument used with PIE_OVERLAY_SECTION()
+ * @func:      C or asm function to call at resume
+ * @stack:     stack to use before calling func
+ */
+#define ARM_PIE_RESUME(proc, func, stack)                              \
+static void __naked __noreturn __pie(proc) proc##_resume_trampoline2(void) \
+{                                                                      \
+       __asm__ __volatile__(                                           \
+       "       mov     sp, %0\n"                                       \
+       : : "r"((stack)) : "sp");                                       \
+                                                                       \
+       func();                                                         \
+}                                                                      \
+                                                                       \
+void __naked __noreturn __pie(proc) proc##_resume_trampoline(void)     \
+{                                                                      \
+       pie_relocate_from_pie();                                        \
+       proc##_resume_trampoline2();                                    \
+}                                                                      \
+EXPORT_PIE_SYMBOL(proc##_resume_trampoline)
+
 #endif
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to