From: Russ Dill Date: Tue, 17 Sep 2013 09:48:24 +0000 (-0700) Subject: ARM: PIE: Add macro for generating PIE resume trampoline X-Git-Tag: firefly_0821_release~6485 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5b4bb81c25ff3ccaaaab565264eb08db564d1c2a;p=firefly-linux-kernel-4.4.55.git ARM: PIE: Add macro for generating PIE resume trampoline 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 --- diff --git a/arch/arm/include/asm/suspend.h b/arch/arm/include/asm/suspend.h index 1c0a551ae375..a9c350556a5f 100644 --- a/arch/arm/include/asm/suspend.h +++ b/arch/arm/include/asm/suspend.h @@ -1,7 +1,32 @@ #ifndef __ASM_ARM_SUSPEND_H #define __ASM_ARM_SUSPEND_H +#include + 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