mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
powerpc: Fix bug caused by negation of 64-bit reloc_offset value
Although both ppc32 and ppc64 have a reloc_offset function, the ppc64 one produced the opposite sign to the ppc32 one. This standardizes on the ppc32 sign and fixes the merged 64-bit code to account for that. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
4a2885630b
commit
5a408329ed
2 changed files with 11 additions and 11 deletions
|
@ -1385,7 +1385,7 @@ _STATIC(__boot_from_prom)
|
||||||
addi r2,r2,0x4000
|
addi r2,r2,0x4000
|
||||||
|
|
||||||
/* Relocate the TOC from a virt addr to a real addr */
|
/* Relocate the TOC from a virt addr to a real addr */
|
||||||
sub r2,r2,r3
|
add r2,r2,r3
|
||||||
|
|
||||||
/* Restore parameters */
|
/* Restore parameters */
|
||||||
mr r3,r31
|
mr r3,r31
|
||||||
|
@ -1424,7 +1424,7 @@ _STATIC(__after_prom_start)
|
||||||
li r3,0 /* target addr */
|
li r3,0 /* target addr */
|
||||||
|
|
||||||
// XXX FIXME: Use phys returned by OF (r30)
|
// XXX FIXME: Use phys returned by OF (r30)
|
||||||
sub r4,r27,r26 /* source addr */
|
add r4,r27,r26 /* source addr */
|
||||||
/* current address of _start */
|
/* current address of _start */
|
||||||
/* i.e. where we are running */
|
/* i.e. where we are running */
|
||||||
/* the source addr */
|
/* the source addr */
|
||||||
|
@ -1444,7 +1444,7 @@ _STATIC(__after_prom_start)
|
||||||
bctr
|
bctr
|
||||||
|
|
||||||
4: LOADADDR(r5,klimit)
|
4: LOADADDR(r5,klimit)
|
||||||
sub 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
|
||||||
bl .copy_and_flush /* copy the rest */
|
bl .copy_and_flush /* copy the rest */
|
||||||
|
@ -1703,7 +1703,7 @@ _STATIC(start_here_multiplatform)
|
||||||
/* kernel but are still running in real mode. */
|
/* kernel but are still running in real mode. */
|
||||||
|
|
||||||
LOADADDR(r3,init_thread_union)
|
LOADADDR(r3,init_thread_union)
|
||||||
sub r3,r3,r26
|
add r3,r3,r26
|
||||||
|
|
||||||
/* set up a stack pointer (physical address) */
|
/* set up a stack pointer (physical address) */
|
||||||
addi r1,r3,THREAD_SIZE
|
addi r1,r3,THREAD_SIZE
|
||||||
|
@ -1714,12 +1714,12 @@ _STATIC(start_here_multiplatform)
|
||||||
LOADADDR(r2,__toc_start)
|
LOADADDR(r2,__toc_start)
|
||||||
addi r2,r2,0x4000
|
addi r2,r2,0x4000
|
||||||
addi r2,r2,0x4000
|
addi r2,r2,0x4000
|
||||||
sub r2,r2,r26
|
add r2,r2,r26
|
||||||
|
|
||||||
LOADADDR(r3,cpu_specs)
|
LOADADDR(r3,cpu_specs)
|
||||||
sub r3,r3,r26
|
add r3,r3,r26
|
||||||
LOADADDR(r4,cur_cpu_spec)
|
LOADADDR(r4,cur_cpu_spec)
|
||||||
sub r4,r4,r26
|
add r4,r4,r26
|
||||||
mr r5,r26
|
mr r5,r26
|
||||||
bl .identify_cpu
|
bl .identify_cpu
|
||||||
|
|
||||||
|
@ -1735,13 +1735,13 @@ _STATIC(start_here_multiplatform)
|
||||||
* code
|
* code
|
||||||
*/
|
*/
|
||||||
LOADADDR(r27, boot_cpuid)
|
LOADADDR(r27, boot_cpuid)
|
||||||
sub r27,r27,r26
|
add r27,r27,r26
|
||||||
lwz r27,0(r27)
|
lwz r27,0(r27)
|
||||||
|
|
||||||
LOADADDR(r24, paca) /* Get base vaddr of paca array */
|
LOADADDR(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. */
|
||||||
sub r13,r13,r26 /* convert to physical addr */
|
add r13,r13,r26 /* convert to physical addr */
|
||||||
mtspr SPRN_SPRG3,r13 /* PPPBBB: Temp... -Peter */
|
mtspr SPRN_SPRG3,r13 /* PPPBBB: Temp... -Peter */
|
||||||
|
|
||||||
/* Do very early kernel initializations, including initial hash table,
|
/* Do very early kernel initializations, including initial hash table,
|
||||||
|
@ -1781,7 +1781,7 @@ _STATIC(start_here_multiplatform)
|
||||||
andi. r3,r3,PLATFORM_LPAR
|
andi. r3,r3,PLATFORM_LPAR
|
||||||
bne 98f /* branch if result is !0 */
|
bne 98f /* branch if result is !0 */
|
||||||
LOADADDR(r6,_SDR1) /* Only if NOT LPAR */
|
LOADADDR(r6,_SDR1) /* Only if NOT LPAR */
|
||||||
sub r6,r6,r26
|
add r6,r6,r26
|
||||||
ld r6,0(r6) /* get the value of _SDR1 */
|
ld r6,0(r6) /* get the value of _SDR1 */
|
||||||
mtspr SPRN_SDR1,r6 /* set the htab location */
|
mtspr SPRN_SDR1,r6 /* set the htab location */
|
||||||
98:
|
98:
|
||||||
|
|
|
@ -2019,7 +2019,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
|
||||||
* On pSeries and BPA, copy the CPU hold code
|
* On pSeries and BPA, copy the CPU hold code
|
||||||
*/
|
*/
|
||||||
if (RELOC(of_platform) & (PLATFORM_PSERIES | PLATFORM_BPA))
|
if (RELOC(of_platform) & (PLATFORM_PSERIES | PLATFORM_BPA))
|
||||||
copy_and_flush(0, KERNELBASE - offset, 0x100, 0);
|
copy_and_flush(0, KERNELBASE + offset, 0x100, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue