diff options
Diffstat (limited to 'arch/powerpc/kernel/prom_init.c')
| -rw-r--r-- | arch/powerpc/kernel/prom_init.c | 14 | 
1 files changed, 7 insertions, 7 deletions
| diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 7f7fb7fd991..13f8d168b3f 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c @@ -2832,11 +2832,13 @@ static void unreloc_toc(void)  {  }  #else -static void __reloc_toc(void *tocstart, unsigned long offset, -			unsigned long nr_entries) +static void __reloc_toc(unsigned long offset, unsigned long nr_entries)  {  	unsigned long i; -	unsigned long *toc_entry = (unsigned long *)tocstart; +	unsigned long *toc_entry; + +	/* Get the start of the TOC by using r2 directly. */ +	asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));  	for (i = 0; i < nr_entries; i++) {  		*toc_entry = *toc_entry + offset; @@ -2850,8 +2852,7 @@ static void reloc_toc(void)  	unsigned long nr_entries =  		(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long); -	/* Need to add offset to get at __prom_init_toc_start */ -	__reloc_toc(__prom_init_toc_start + offset, offset, nr_entries); +	__reloc_toc(offset, nr_entries);  	mb();  } @@ -2864,8 +2865,7 @@ static void unreloc_toc(void)  	mb(); -	/* __prom_init_toc_start has been relocated, no need to add offset */ -	__reloc_toc(__prom_init_toc_start, -offset, nr_entries); +	__reloc_toc(-offset, nr_entries);  }  #endif  #endif |