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 <Russ.Dill@ti.com>
This commit is contained in:
Russ Dill 2013-09-17 02:48:24 -07:00 committed by 黄涛
commit 5b4bb81c25

View file

@ -1,7 +1,32 @@
#ifndef __ASM_ARM_SUSPEND_H
#define __ASM_ARM_SUSPEND_H
#include <asm/pie.h>
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