[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: David Gibson <dwg@au1.ibm.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
7e78e5e502
Коммит
e58c3495e6
|
@ -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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
_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)
|
||||||
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)
|
||||||
* 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)
|
||||||
#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)
|
||||||
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)
|
||||||
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:
|
||||||
#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:
|
||||||
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:
|
||||||
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)
|
||||||
* 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)
|
||||||
#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)
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
/* 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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
* 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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
||||||
_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)
|
||||||
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:
|
||||||
|
|
||||||
#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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
*/
|
*/
|
||||||
_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 @@ n:
|
||||||
#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 OFF(name) name@l
|
#define LOAD_REG_ADDR(reg,name) LOAD_REG_IMMEDIATE(reg, name)
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче