Commit e58c3495 authored by David Gibson's avatar David Gibson Committed by Paul Mackerras

[PATCH] powerpc: Cleanup LOADADDR etc. asm macros

This patch consolidates the variety of macros used for loading 32 or
64-bit constants in assembler (LOADADDR, LOADBASE, SET_REG_TO_*).  The
idea is to make the set of macros consistent across 32 and 64 bit and
to make it more obvious which is the appropriate one to use in a given
situation.  The new macros and their semantics are described in the
comments in ppc_asm.h.

In the process, we change several places that were unnecessarily using
immediate loads on ppc64 to use the GOT/TOC.  Likewise we cleanup a
couple of places where we were clumsily subtracting PAGE_OFFSET with
asm instructions to use assemble-time arithmetic or the toreal() macro
instead.
Signed-off-by: default avatarDavid Gibson <dwg@au1.ibm.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 7e78e5e5
...@@ -130,7 +130,7 @@ _GLOBAL(__save_cpu_setup) ...@@ -130,7 +130,7 @@ _GLOBAL(__save_cpu_setup)
mfcr r7 mfcr r7
/* Get storage ptr */ /* Get storage ptr */
LOADADDR(r5,cpu_state_storage) LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
/* We only deal with 970 for now */ /* We only deal with 970 for now */
mfspr r0,SPRN_PVR mfspr r0,SPRN_PVR
...@@ -164,7 +164,7 @@ _GLOBAL(__restore_cpu_setup) ...@@ -164,7 +164,7 @@ _GLOBAL(__restore_cpu_setup)
/* Get storage ptr (FIXME when using anton reloc as we /* Get storage ptr (FIXME when using anton reloc as we
* are running with translation disabled here * are running with translation disabled here
*/ */
LOADADDR(r5,cpu_state_storage) LOAD_REG_IMMEDIATE(r5,cpu_state_storage)
/* We only deal with 970 for now */ /* We only deal with 970 for now */
mfspr r0,SPRN_PVR mfspr r0,SPRN_PVR
......
...@@ -988,7 +988,7 @@ _GLOBAL(enter_rtas) ...@@ -988,7 +988,7 @@ _GLOBAL(enter_rtas)
stwu r1,-INT_FRAME_SIZE(r1) stwu r1,-INT_FRAME_SIZE(r1)
mflr r0 mflr r0
stw r0,INT_FRAME_SIZE+4(r1) stw r0,INT_FRAME_SIZE+4(r1)
LOADADDR(r4, rtas) LOAD_REG_ADDR(r4, rtas)
lis r6,1f@ha /* physical return address for rtas */ lis r6,1f@ha /* physical return address for rtas */
addi r6,r6,1f@l addi r6,r6,1f@l
tophys(r6,r6) tophys(r6,r6)
......
...@@ -689,9 +689,8 @@ _GLOBAL(enter_rtas) ...@@ -689,9 +689,8 @@ _GLOBAL(enter_rtas)
std r6,PACASAVEDMSR(r13) std r6,PACASAVEDMSR(r13)
/* Setup our real return addr */ /* Setup our real return addr */
SET_REG_TO_LABEL(r4,.rtas_return_loc) LOAD_REG_ADDR(r4,.rtas_return_loc)
SET_REG_TO_CONST(r9,PAGE_OFFSET) clrldi r4,r4,2 /* convert to realmode address */
sub r4,r4,r9
mtlr r4 mtlr r4
li r0,0 li r0,0
...@@ -706,7 +705,7 @@ _GLOBAL(enter_rtas) ...@@ -706,7 +705,7 @@ _GLOBAL(enter_rtas)
sync /* disable interrupts so SRR0/1 */ sync /* disable interrupts so SRR0/1 */
mtmsrd r0 /* don't get trashed */ mtmsrd r0 /* don't get trashed */
SET_REG_TO_LABEL(r4,rtas) LOAD_REG_ADDR(r4, rtas)
ld r5,RTASENTRY(r4) /* get the rtas->entry value */ ld r5,RTASENTRY(r4) /* get the rtas->entry value */
ld r4,RTASBASE(r4) /* get the rtas->base value */ ld r4,RTASBASE(r4) /* get the rtas->base value */
...@@ -718,8 +717,7 @@ _GLOBAL(enter_rtas) ...@@ -718,8 +717,7 @@ _GLOBAL(enter_rtas)
_STATIC(rtas_return_loc) _STATIC(rtas_return_loc)
/* relocation is off at this point */ /* relocation is off at this point */
mfspr r4,SPRN_SPRG3 /* Get PACA */ mfspr r4,SPRN_SPRG3 /* Get PACA */
SET_REG_TO_CONST(r5, PAGE_OFFSET) clrldi r4,r4,2 /* convert to realmode address */
sub r4,r4,r5 /* RELOC the PACA base pointer */
mfmsr r6 mfmsr r6
li r0,MSR_RI li r0,MSR_RI
...@@ -728,7 +726,7 @@ _STATIC(rtas_return_loc) ...@@ -728,7 +726,7 @@ _STATIC(rtas_return_loc)
mtmsrd r6 mtmsrd r6
ld r1,PACAR1(r4) /* Restore our SP */ ld r1,PACAR1(r4) /* Restore our SP */
LOADADDR(r3,.rtas_restore_regs) LOAD_REG_IMMEDIATE(r3,.rtas_restore_regs)
ld r4,PACASAVEDMSR(r4) /* Restore our MSR */ ld r4,PACASAVEDMSR(r4) /* Restore our MSR */
mtspr SPRN_SRR0,r3 mtspr SPRN_SRR0,r3
......
...@@ -39,9 +39,9 @@ _GLOBAL(load_up_fpu) ...@@ -39,9 +39,9 @@ _GLOBAL(load_up_fpu)
* to another. Instead we call giveup_fpu in switch_to. * to another. Instead we call giveup_fpu in switch_to.
*/ */
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
LOADBASE(r3, last_task_used_math) LOAD_REG_ADDRBASE(r3, last_task_used_math)
toreal(r3) toreal(r3)
PPC_LL r4,OFF(last_task_used_math)(r3) PPC_LL r4,ADDROFF(last_task_used_math)(r3)
PPC_LCMPI 0,r4,0 PPC_LCMPI 0,r4,0
beq 1f beq 1f
toreal(r4) toreal(r4)
...@@ -77,7 +77,7 @@ _GLOBAL(load_up_fpu) ...@@ -77,7 +77,7 @@ _GLOBAL(load_up_fpu)
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
subi r4,r5,THREAD subi r4,r5,THREAD
fromreal(r4) fromreal(r4)
PPC_STL r4,OFF(last_task_used_math)(r3) PPC_STL r4,ADDROFF(last_task_used_math)(r3)
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/* restore registers and return */ /* restore registers and return */
/* we haven't used ctr or xer or lr */ /* we haven't used ctr or xer or lr */
...@@ -113,8 +113,8 @@ _GLOBAL(giveup_fpu) ...@@ -113,8 +113,8 @@ _GLOBAL(giveup_fpu)
1: 1:
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
li r5,0 li r5,0
LOADBASE(r4,last_task_used_math) LOAD_REG_ADDRBASE(r4,last_task_used_math)
PPC_STL r5,OFF(last_task_used_math)(r4) PPC_STL r5,ADDROFF(last_task_used_math)(r4)
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
blr blr
......
...@@ -154,12 +154,12 @@ _GLOBAL(__secondary_hold) ...@@ -154,12 +154,12 @@ _GLOBAL(__secondary_hold)
bne 100b bne 100b
#ifdef CONFIG_HMT #ifdef CONFIG_HMT
LOADADDR(r4, .hmt_init) SET_REG_IMMEDIATE(r4, .hmt_init)
mtctr r4 mtctr r4
bctr bctr
#else #else
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
LOADADDR(r4, .pSeries_secondary_smp_init) LOAD_REG_IMMEDIATE(r4, .pSeries_secondary_smp_init)
mtctr r4 mtctr r4
mr r3,r24 mr r3,r24
bctr bctr
...@@ -205,9 +205,10 @@ exception_marker: ...@@ -205,9 +205,10 @@ exception_marker:
#define EX_LR 72 #define EX_LR 72
/* /*
* We're short on space and time in the exception prolog, so we can't use * We're short on space and time in the exception prolog, so we can't
* the normal LOADADDR macro. Normally we just need the low halfword of the * use the normal SET_REG_IMMEDIATE macro. Normally we just need the
* address, but for Kdump we need the whole low word. * low halfword of the address, but for Kdump we need the whole low
* word.
*/ */
#ifdef CONFIG_CRASH_DUMP #ifdef CONFIG_CRASH_DUMP
#define LOAD_HANDLER(reg, label) \ #define LOAD_HANDLER(reg, label) \
...@@ -713,7 +714,7 @@ system_reset_iSeries: ...@@ -713,7 +714,7 @@ system_reset_iSeries:
lbz r23,PACAPROCSTART(r13) /* Test if this processor lbz r23,PACAPROCSTART(r13) /* Test if this processor
* should start */ * should start */
sync sync
LOADADDR(r3,current_set) LOAD_REG_IMMEDIATE(r3,current_set)
sldi r28,r24,3 /* get current_set[cpu#] */ sldi r28,r24,3 /* get current_set[cpu#] */
ldx r3,r3,r28 ldx r3,r3,r28
addi r1,r3,THREAD_SIZE addi r1,r3,THREAD_SIZE
...@@ -746,8 +747,8 @@ iSeries_secondary_smp_loop: ...@@ -746,8 +747,8 @@ iSeries_secondary_smp_loop:
decrementer_iSeries_masked: decrementer_iSeries_masked:
li r11,1 li r11,1
stb r11,PACALPPACA+LPPACADECRINT(r13) stb r11,PACALPPACA+LPPACADECRINT(r13)
LOADBASE(r12,tb_ticks_per_jiffy) LOAD_REG_ADDRBASE(r12,tb_ticks_per_jiffy)
lwz r12,OFF(tb_ticks_per_jiffy)(r12) lwz r12,ADDROFF(tb_ticks_per_jiffy)(r12)
mtspr SPRN_DEC,r12 mtspr SPRN_DEC,r12
/* fall through */ /* fall through */
...@@ -1412,7 +1413,7 @@ _GLOBAL(pSeries_secondary_smp_init) ...@@ -1412,7 +1413,7 @@ _GLOBAL(pSeries_secondary_smp_init)
* physical cpu id in r24, we need to search the pacas to find * physical cpu id in r24, we need to search the pacas to find
* which logical id maps to our physical one. * which logical id maps to our physical one.
*/ */
LOADADDR(r13, paca) /* Get base vaddr of paca array */ LOAD_REG_IMMEDIATE(r13, paca) /* Get base vaddr of paca array */
li r5,0 /* logical cpu id */ li r5,0 /* logical cpu id */
1: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */ 1: lhz r6,PACAHWCPUID(r13) /* Load HW procid from paca */
cmpw r6,r24 /* Compare to our id */ cmpw r6,r24 /* Compare to our id */
...@@ -1446,8 +1447,8 @@ _GLOBAL(pSeries_secondary_smp_init) ...@@ -1446,8 +1447,8 @@ _GLOBAL(pSeries_secondary_smp_init)
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
_STATIC(__start_initialization_iSeries) _STATIC(__start_initialization_iSeries)
/* Clear out the BSS */ /* Clear out the BSS */
LOADADDR(r11,__bss_stop) LOAD_REG_IMMEDIATE(r11,__bss_stop)
LOADADDR(r8,__bss_start) LOAD_REG_IMMEDIATE(r8,__bss_start)
sub r11,r11,r8 /* bss size */ sub r11,r11,r8 /* bss size */
addi r11,r11,7 /* round up to an even double word */ addi r11,r11,7 /* round up to an even double word */
rldicl. r11,r11,61,3 /* shift right by 3 */ rldicl. r11,r11,61,3 /* shift right by 3 */
...@@ -1458,17 +1459,17 @@ _STATIC(__start_initialization_iSeries) ...@@ -1458,17 +1459,17 @@ _STATIC(__start_initialization_iSeries)
3: stdu r0,8(r8) 3: stdu r0,8(r8)
bdnz 3b bdnz 3b
4: 4:
LOADADDR(r1,init_thread_union) LOAD_REG_IMMEDIATE(r1,init_thread_union)
addi r1,r1,THREAD_SIZE addi r1,r1,THREAD_SIZE
li r0,0 li r0,0
stdu r0,-STACK_FRAME_OVERHEAD(r1) stdu r0,-STACK_FRAME_OVERHEAD(r1)
LOADADDR(r3,cpu_specs) LOAD_REG_IMMEDIATE(r3,cpu_specs)
LOADADDR(r4,cur_cpu_spec) LOAD_REG_IMMEDIATE(r4,cur_cpu_spec)
li r5,0 li r5,0
bl .identify_cpu bl .identify_cpu
LOADADDR(r2,__toc_start) LOAD_REG_IMMEDIATE(r2,__toc_start)
addi r2,r2,0x4000 addi r2,r2,0x4000
addi r2,r2,0x4000 addi r2,r2,0x4000
...@@ -1528,7 +1529,7 @@ _GLOBAL(__start_initialization_multiplatform) ...@@ -1528,7 +1529,7 @@ _GLOBAL(__start_initialization_multiplatform)
li r24,0 li r24,0
/* Switch off MMU if not already */ /* Switch off MMU if not already */
LOADADDR(r4, .__after_prom_start - KERNELBASE) LOAD_REG_IMMEDIATE(r4, .__after_prom_start - KERNELBASE)
add r4,r4,r30 add r4,r4,r30
bl .__mmu_off bl .__mmu_off
b .__after_prom_start b .__after_prom_start
...@@ -1548,7 +1549,7 @@ _STATIC(__boot_from_prom) ...@@ -1548,7 +1549,7 @@ _STATIC(__boot_from_prom)
/* put a relocation offset into r3 */ /* put a relocation offset into r3 */
bl .reloc_offset bl .reloc_offset
LOADADDR(r2,__toc_start) LOAD_REG_IMMEDIATE(r2,__toc_start)
addi r2,r2,0x4000 addi r2,r2,0x4000
addi r2,r2,0x4000 addi r2,r2,0x4000
...@@ -1588,9 +1589,9 @@ _STATIC(__after_prom_start) ...@@ -1588,9 +1589,9 @@ _STATIC(__after_prom_start)
*/ */
bl .reloc_offset bl .reloc_offset
mr r26,r3 mr r26,r3
SET_REG_TO_CONST(r27,KERNELBASE) LOAD_REG_IMMEDIATE(r27, KERNELBASE)
LOADADDR(r3, PHYSICAL_START) /* target addr */ LOAD_REG_IMMEDIATE(r3, PHYSICAL_START) /* target addr */
// XXX FIXME: Use phys returned by OF (r30) // XXX FIXME: Use phys returned by OF (r30)
add r4,r27,r26 /* source addr */ add r4,r27,r26 /* source addr */
...@@ -1598,7 +1599,7 @@ _STATIC(__after_prom_start) ...@@ -1598,7 +1599,7 @@ _STATIC(__after_prom_start)
/* i.e. where we are running */ /* i.e. where we are running */
/* the source addr */ /* the source addr */
LOADADDR(r5,copy_to_here) /* # bytes of memory to copy */ LOAD_REG_IMMEDIATE(r5,copy_to_here) /* # bytes of memory to copy */
sub r5,r5,r27 sub r5,r5,r27
li r6,0x100 /* Start offset, the first 0x100 */ li r6,0x100 /* Start offset, the first 0x100 */
...@@ -1608,11 +1609,11 @@ _STATIC(__after_prom_start) ...@@ -1608,11 +1609,11 @@ _STATIC(__after_prom_start)
/* this includes the code being */ /* this includes the code being */
/* executed here. */ /* executed here. */
LOADADDR(r0, 4f) /* Jump to the copy of this code */ LOAD_REG_IMMEDIATE(r0, 4f) /* Jump to the copy of this code */
mtctr r0 /* that we just made/relocated */ mtctr r0 /* that we just made/relocated */
bctr bctr
4: LOADADDR(r5,klimit) 4: LOAD_REG_IMMEDIATE(r5,klimit)
add r5,r5,r26 add r5,r5,r26
ld r5,0(r5) /* get the value of klimit */ ld r5,0(r5) /* get the value of klimit */
sub r5,r5,r27 sub r5,r5,r27
...@@ -1694,7 +1695,7 @@ _GLOBAL(pmac_secondary_start) ...@@ -1694,7 +1695,7 @@ _GLOBAL(pmac_secondary_start)
mtmsrd r3 /* RI on */ mtmsrd r3 /* RI on */
/* Set up a paca value for this processor. */ /* Set up a paca value for this processor. */
LOADADDR(r4, paca) /* Get base vaddr of paca array */ LOAD_REG_IMMEDIATE(r4, paca) /* Get base vaddr of paca array */
mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */
add r13,r13,r4 /* for this processor. */ add r13,r13,r4 /* for this processor. */
mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */ mtspr SPRN_SPRG3,r13 /* Save vaddr of paca in SPRG3 */
...@@ -1731,7 +1732,7 @@ _GLOBAL(__secondary_start) ...@@ -1731,7 +1732,7 @@ _GLOBAL(__secondary_start)
bl .early_setup_secondary bl .early_setup_secondary
/* Initialize the kernel stack. Just a repeat for iSeries. */ /* Initialize the kernel stack. Just a repeat for iSeries. */
LOADADDR(r3,current_set) LOAD_REG_ADDR(r3, current_set)
sldi r28,r24,3 /* get current_set[cpu#] */ sldi r28,r24,3 /* get current_set[cpu#] */
ldx r1,r3,r28 ldx r1,r3,r28
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
...@@ -1742,8 +1743,8 @@ _GLOBAL(__secondary_start) ...@@ -1742,8 +1743,8 @@ _GLOBAL(__secondary_start)
mtlr r7 mtlr r7
/* enable MMU and jump to start_secondary */ /* enable MMU and jump to start_secondary */
LOADADDR(r3,.start_secondary_prolog) LOAD_REG_ADDR(r3, .start_secondary_prolog)
SET_REG_TO_CONST(r4, MSR_KERNEL) LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
#ifdef DO_SOFT_DISABLE #ifdef DO_SOFT_DISABLE
ori r4,r4,MSR_EE ori r4,r4,MSR_EE
#endif #endif
...@@ -1792,8 +1793,8 @@ _STATIC(start_here_multiplatform) ...@@ -1792,8 +1793,8 @@ _STATIC(start_here_multiplatform)
* be detached from the kernel completely. Besides, we need * be detached from the kernel completely. Besides, we need
* to clear it now for kexec-style entry. * to clear it now for kexec-style entry.
*/ */
LOADADDR(r11,__bss_stop) LOAD_REG_IMMEDIATE(r11,__bss_stop)
LOADADDR(r8,__bss_start) LOAD_REG_IMMEDIATE(r8,__bss_start)
sub r11,r11,r8 /* bss size */ sub r11,r11,r8 /* bss size */
addi r11,r11,7 /* round up to an even double word */ addi r11,r11,7 /* round up to an even double word */
rldicl. r11,r11,61,3 /* shift right by 3 */ rldicl. r11,r11,61,3 /* shift right by 3 */
...@@ -1831,7 +1832,7 @@ _STATIC(start_here_multiplatform) ...@@ -1831,7 +1832,7 @@ _STATIC(start_here_multiplatform)
/* up the htab. This is done because we have relocated the */ /* up the htab. This is done because we have relocated the */
/* kernel but are still running in real mode. */ /* kernel but are still running in real mode. */
LOADADDR(r3,init_thread_union) LOAD_REG_IMMEDIATE(r3,init_thread_union)
add r3,r3,r26 add r3,r3,r26
/* set up a stack pointer (physical address) */ /* set up a stack pointer (physical address) */
...@@ -1840,14 +1841,14 @@ _STATIC(start_here_multiplatform) ...@@ -1840,14 +1841,14 @@ _STATIC(start_here_multiplatform)
stdu r0,-STACK_FRAME_OVERHEAD(r1) stdu r0,-STACK_FRAME_OVERHEAD(r1)
/* set up the TOC (physical address) */ /* set up the TOC (physical address) */
LOADADDR(r2,__toc_start) LOAD_REG_IMMEDIATE(r2,__toc_start)
addi r2,r2,0x4000 addi r2,r2,0x4000
addi r2,r2,0x4000 addi r2,r2,0x4000
add r2,r2,r26 add r2,r2,r26
LOADADDR(r3,cpu_specs) LOAD_REG_IMMEDIATE(r3, cpu_specs)
add r3,r3,r26 add r3,r3,r26
LOADADDR(r4,cur_cpu_spec) LOAD_REG_IMMEDIATE(r4,cur_cpu_spec)
add r4,r4,r26 add r4,r4,r26
mr r5,r26 mr r5,r26
bl .identify_cpu bl .identify_cpu
...@@ -1863,11 +1864,11 @@ _STATIC(start_here_multiplatform) ...@@ -1863,11 +1864,11 @@ _STATIC(start_here_multiplatform)
* nowhere it can be initialized differently before we reach this * nowhere it can be initialized differently before we reach this
* code * code
*/ */
LOADADDR(r27, boot_cpuid) LOAD_REG_IMMEDIATE(r27, boot_cpuid)
add r27,r27,r26 add r27,r27,r26
lwz r27,0(r27) lwz r27,0(r27)
LOADADDR(r24, paca) /* Get base vaddr of paca array */ LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */ mulli r13,r27,PACA_SIZE /* Calculate vaddr of right paca */
add r13,r13,r24 /* for this processor. */ add r13,r13,r24 /* for this processor. */
add r13,r13,r26 /* convert to physical addr */ add r13,r13,r26 /* convert to physical addr */
...@@ -1880,8 +1881,8 @@ _STATIC(start_here_multiplatform) ...@@ -1880,8 +1881,8 @@ _STATIC(start_here_multiplatform)
mr r3,r31 mr r3,r31
bl .early_setup bl .early_setup
LOADADDR(r3,.start_here_common) LOAD_REG_IMMEDIATE(r3, .start_here_common)
SET_REG_TO_CONST(r4, MSR_KERNEL) LOAD_REG_IMMEDIATE(r4, MSR_KERNEL)
mtspr SPRN_SRR0,r3 mtspr SPRN_SRR0,r3
mtspr SPRN_SRR1,r4 mtspr SPRN_SRR1,r4
rfid rfid
...@@ -1895,7 +1896,7 @@ _STATIC(start_here_common) ...@@ -1895,7 +1896,7 @@ _STATIC(start_here_common)
/* The following code sets up the SP and TOC now that we are */ /* The following code sets up the SP and TOC now that we are */
/* running with translation enabled. */ /* running with translation enabled. */
LOADADDR(r3,init_thread_union) LOAD_REG_IMMEDIATE(r3,init_thread_union)
/* set up the stack */ /* set up the stack */
addi r1,r3,THREAD_SIZE addi r1,r3,THREAD_SIZE
...@@ -1908,16 +1909,16 @@ _STATIC(start_here_common) ...@@ -1908,16 +1909,16 @@ _STATIC(start_here_common)
li r3,0 li r3,0
bl .do_cpu_ftr_fixups bl .do_cpu_ftr_fixups
LOADADDR(r26, boot_cpuid) LOAD_REG_IMMEDIATE(r26, boot_cpuid)
lwz r26,0(r26) lwz r26,0(r26)
LOADADDR(r24, paca) /* Get base vaddr of paca array */ LOAD_REG_IMMEDIATE(r24, paca) /* Get base vaddr of paca array */
mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */ mulli r13,r26,PACA_SIZE /* Calculate vaddr of right paca */
add r13,r13,r24 /* for this processor. */ add r13,r13,r24 /* for this processor. */
mtspr SPRN_SPRG3,r13 mtspr SPRN_SPRG3,r13
/* ptr to current */ /* ptr to current */
LOADADDR(r4,init_task) LOAD_REG_IMMEDIATE(r4, init_task)
std r4,PACACURRENT(r13) std r4,PACACURRENT(r13)
/* Load the TOC */ /* Load the TOC */
...@@ -1940,7 +1941,7 @@ _STATIC(start_here_common) ...@@ -1940,7 +1941,7 @@ _STATIC(start_here_common)
_GLOBAL(hmt_init) _GLOBAL(hmt_init)
#ifdef CONFIG_HMT #ifdef CONFIG_HMT
LOADADDR(r5, hmt_thread_data) LOAD_REG_IMMEDIATE(r5, hmt_thread_data)
mfspr r7,SPRN_PVR mfspr r7,SPRN_PVR
srwi r7,r7,16 srwi r7,r7,16
cmpwi r7,0x34 /* Pulsar */ cmpwi r7,0x34 /* Pulsar */
...@@ -1961,7 +1962,7 @@ _GLOBAL(hmt_init) ...@@ -1961,7 +1962,7 @@ _GLOBAL(hmt_init)
b 101f b 101f
__hmt_secondary_hold: __hmt_secondary_hold:
LOADADDR(r5, hmt_thread_data) LOAD_REG_IMMEDIATE(r5, hmt_thread_data)
clrldi r5,r5,4 clrldi r5,r5,4
li r7,0 li r7,0
mfspr r6,SPRN_PIR mfspr r6,SPRN_PIR
...@@ -1989,7 +1990,7 @@ __hmt_secondary_hold: ...@@ -1989,7 +1990,7 @@ __hmt_secondary_hold:
#ifdef CONFIG_HMT #ifdef CONFIG_HMT
_GLOBAL(hmt_start_secondary) _GLOBAL(hmt_start_secondary)
LOADADDR(r4,__hmt_secondary_hold) LOAD_REG_IMMEDIATE(r4,__hmt_secondary_hold)
clrldi r4,r4,4 clrldi r4,r4,4
mtspr SPRN_NIADORM, r4 mtspr SPRN_NIADORM, r4
mfspr r4, SPRN_MSRDORM mfspr r4, SPRN_MSRDORM
......
...@@ -38,14 +38,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP) ...@@ -38,14 +38,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_CAN_NAP)
/* We must dynamically check for the NAP feature as it /* We must dynamically check for the NAP feature as it
* can be cleared by CPU init after the fixups are done * can be cleared by CPU init after the fixups are done
*/ */
LOADBASE(r3,cur_cpu_spec) LOAD_REG_ADDRBASE(r3,cur_cpu_spec)
ld r4,OFF(cur_cpu_spec)(r3) ld r4,ADDROFF(cur_cpu_spec)(r3)
ld r4,CPU_SPEC_FEATURES(r4) ld r4,CPU_SPEC_FEATURES(r4)
andi. r0,r4,CPU_FTR_CAN_NAP andi. r0,r4,CPU_FTR_CAN_NAP
beqlr beqlr
/* Now check if user or arch enabled NAP mode */ /* Now check if user or arch enabled NAP mode */
LOADBASE(r3,powersave_nap) LOAD_REG_ADDRBASE(r3,powersave_nap)
lwz r4,OFF(powersave_nap)(r3) lwz r4,ADDROFF(powersave_nap)(r3)
cmpwi 0,r4,0 cmpwi 0,r4,0
beqlr beqlr
......
...@@ -68,7 +68,7 @@ _GLOBAL(reloc_offset) ...@@ -68,7 +68,7 @@ _GLOBAL(reloc_offset)
mflr r0 mflr r0
bl 1f bl 1f
1: mflr r3 1: mflr r3
LOADADDR(r4,1b) LOAD_REG_IMMEDIATE(r4,1b)
subf r3,r4,r3 subf r3,r4,r3
mtlr r0 mtlr r0
blr blr
...@@ -80,7 +80,7 @@ _GLOBAL(add_reloc_offset) ...@@ -80,7 +80,7 @@ _GLOBAL(add_reloc_offset)
mflr r0 mflr r0
bl 1f bl 1f
1: mflr r5 1: mflr r5
LOADADDR(r4,1b) LOAD_REG_IMMEDIATE(r4,1b)
subf r5,r4,r5 subf r5,r4,r5
add r3,r3,r5 add r3,r3,r5
mtlr r0 mtlr r0
......
...@@ -39,7 +39,7 @@ _GLOBAL(reloc_offset) ...@@ -39,7 +39,7 @@ _GLOBAL(reloc_offset)
mflr r0 mflr r0
bl 1f bl 1f
1: mflr r3 1: mflr r3
LOADADDR(r4,1b) LOAD_REG_IMMEDIATE(r4,1b)
subf r3,r4,r3 subf r3,r4,r3
mtlr r0 mtlr r0
blr blr
...@@ -51,7 +51,7 @@ _GLOBAL(add_reloc_offset) ...@@ -51,7 +51,7 @@ _GLOBAL(add_reloc_offset)
mflr r0 mflr r0
bl 1f bl 1f
1: mflr r5 1: mflr r5
LOADADDR(r4,1b) LOAD_REG_IMMEDIATE(r4,1b)
subf r5,r4,r5 subf r5,r4,r5
add r3,r3,r5 add r3,r3,r5
mtlr r0 mtlr r0
...@@ -498,15 +498,15 @@ _GLOBAL(identify_cpu) ...@@ -498,15 +498,15 @@ _GLOBAL(identify_cpu)
*/ */
_GLOBAL(do_cpu_ftr_fixups) _GLOBAL(do_cpu_ftr_fixups)
/* Get CPU 0 features */ /* Get CPU 0 features */
LOADADDR(r6,cur_cpu_spec) LOAD_REG_IMMEDIATE(r6,cur_cpu_spec)
sub r6,r6,r3 sub r6,r6,r3
ld r4,0(r6) ld r4,0(r6)
sub r4,r4,r3 sub r4,r4,r3
ld r4,CPU_SPEC_FEATURES(r4) ld r4,CPU_SPEC_FEATURES(r4)
/* Get the fixup table */ /* Get the fixup table */
LOADADDR(r6,__start___ftr_fixup) LOAD_REG_IMMEDIATE(r6,__start___ftr_fixup)
sub r6,r6,r3 sub r6,r6,r3
LOADADDR(r7,__stop___ftr_fixup) LOAD_REG_IMMEDIATE(r7,__stop___ftr_fixup)
sub r7,r7,r3 sub r7,r7,r3
/* Do the fixup */ /* Do the fixup */
1: cmpld r6,r7 1: cmpld r6,r7
......
...@@ -156,52 +156,56 @@ GLUE(.,name): ...@@ -156,52 +156,56 @@ GLUE(.,name):
#endif #endif
/* /*
* LOADADDR( rn, name ) * LOAD_REG_IMMEDIATE(rn, expr)
* loads the address of 'name' into 'rn' * Loads the value of the constant expression 'expr' into register 'rn'
* using immediate instructions only. Use this when it's important not
* to reference other data (i.e. on ppc64 when the TOC pointer is not
* valid).
* *
* LOADBASE( rn, name ) * LOAD_REG_ADDR(rn, name)
* loads the address (possibly without the low 16 bits) of 'name' into 'rn' * Loads the address of label 'name' into register 'rn'. Use this when
* suitable for base+disp addressing * you don't particularly need immediate instructions only, but you need
* the whole address in one register (e.g. it's a structure address and
* you want to access various offsets within it). On ppc32 this is
* identical to LOAD_REG_IMMEDIATE.
*
* LOAD_REG_ADDRBASE(rn, name)
* ADDROFF(name)
* LOAD_REG_ADDRBASE loads part of the address of label 'name' into
* register 'rn'. ADDROFF(name) returns the remainder of the address as
* a constant expression. ADDROFF(name) is a signed expression < 16 bits
* in size, so is suitable for use directly as an offset in load and store
* instructions. Use this when loading/storing a single word or less as:
* LOAD_REG_ADDRBASE(rX, name)
* ld rY,ADDROFF(name)(rX)
*/ */
#ifdef __powerpc64__ #ifdef __powerpc64__
#define LOADADDR(rn,name) \ #define LOAD_REG_IMMEDIATE(reg,expr) \
lis rn,name##@highest; \ lis (reg),(expr)@highest; \
ori rn,rn,name##@higher; \ ori (reg),(reg),(expr)@higher; \
rldicr rn,rn,32,31; \ rldicr (reg),(reg),32,31; \
oris rn,rn,name##@h; \ oris (reg),(reg),(expr)@h; \
ori rn,rn,name##@l ori (reg),(reg),(expr)@l;
#define LOADBASE(rn,name) \ #define LOAD_REG_ADDR(reg,name) \
ld rn,name@got(r2) ld (reg),name@got(r2)
#define OFF(name) 0 #define LOAD_REG_ADDRBASE(reg,name) LOAD_REG_ADDR(reg,name)
#define ADDROFF(name) 0
#define SET_REG_TO_CONST(reg, value) \
lis reg,(((value)>>48)&0xFFFF); \
ori reg,reg,(((value)>>32)&0xFFFF); \
rldicr reg,reg,32,31; \
oris reg,reg,(((value)>>16)&0xFFFF); \
ori reg,reg,((value)&0xFFFF);
#define SET_REG_TO_LABEL(reg, label) \
lis reg,(label)@highest; \
ori reg,reg,(label)@higher; \
rldicr reg,reg,32,31; \
oris reg,reg,(label)@h; \
ori reg,reg,(label)@l;
/* offsets for stack frame layout */ /* offsets for stack frame layout */
#define LRSAVE 16 #define LRSAVE 16
#else /* 32-bit */ #else /* 32-bit */
#define LOADADDR(rn,name) \
lis rn,name@ha; \
addi rn,rn,name@l
#define LOADBASE(rn,name) \ #define LOAD_REG_IMMEDIATE(reg,expr) \
lis rn,name@ha lis (reg),(expr)@ha; \
addi (reg),(reg),(expr)@l;
#define LOAD_REG_ADDR(reg,name) LOAD_REG_IMMEDIATE(reg, name)
#define OFF(name) name@l #define LOAD_REG_ADDRBASE(reg, name) lis (reg),name@ha
#define ADDROFF(name) name@l
/* offsets for stack frame layout */ /* offsets for stack frame layout */
#define LRSAVE 4 #define LRSAVE 4
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment