powerpc: introduce macro LOAD_REG_ADDR_PIC
This is used to get the address of a variable when the kernel is not running at the linked or relocated address. Signed-off-by: Kevin Hao <haokexin@gmail.com> Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
parent
99739611e8
commit
1c49abec67
@ -295,6 +295,11 @@ n:
|
|||||||
* you want to access various offsets within it). On ppc32 this is
|
* you want to access various offsets within it). On ppc32 this is
|
||||||
* identical to LOAD_REG_IMMEDIATE.
|
* 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)
|
* LOAD_REG_ADDRBASE(rn, name)
|
||||||
* ADDROFF(name)
|
* ADDROFF(name)
|
||||||
* LOAD_REG_ADDRBASE loads part of the address of label 'name' into
|
* LOAD_REG_ADDRBASE loads part of the address of label 'name' into
|
||||||
@ -305,6 +310,14 @@ n:
|
|||||||
* LOAD_REG_ADDRBASE(rX, name)
|
* LOAD_REG_ADDRBASE(rX, name)
|
||||||
* ld rY,ADDROFF(name)(rX)
|
* 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__
|
#ifdef __powerpc64__
|
||||||
#define LOAD_REG_IMMEDIATE(reg,expr) \
|
#define LOAD_REG_IMMEDIATE(reg,expr) \
|
||||||
lis reg,(expr)@highest; \
|
lis reg,(expr)@highest; \
|
||||||
|
Loading…
Reference in New Issue
Block a user