diff options
| -rw-r--r-- | arch/powerpc/include/asm/ppc_asm.h | 13 | 
1 files changed, 13 insertions, 0 deletions
| diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index f595b98079ee..1279c59624ed 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -295,6 +295,11 @@ n:   *   you want to access various offsets within it).  On ppc32 this is   *   identical to LOAD_REG_IMMEDIATE.   * + * LOAD_REG_ADDR_PIC(rn, name) + *   Loads the address of label 'name' into register 'run'. Use this when + *   the kernel doesn't run at the linked or relocated address. Please + *   note that this macro will clobber the lr register. + *   * LOAD_REG_ADDRBASE(rn, name)   * ADDROFF(name)   *   LOAD_REG_ADDRBASE loads part of the address of label 'name' into @@ -305,6 +310,14 @@ n:   *      LOAD_REG_ADDRBASE(rX, name)   *      ld	rY,ADDROFF(name)(rX)   */ + +/* Be careful, this will clobber the lr register. */ +#define LOAD_REG_ADDR_PIC(reg, name)		\ +	bl	0f;				\ +0:	mflr	reg;				\ +	addis	reg,reg,(name - 0b)@ha;		\ +	addi	reg,reg,(name - 0b)@l; +  #ifdef __powerpc64__  #define LOAD_REG_IMMEDIATE(reg,expr)		\  	lis     reg,(expr)@highest;		\ | 
