powerpc/fsl-booke: Fix CONFIG_RELOCATABLE support on FSL Book-E ppc32
PATCH v2 1/1 powerpc/fsl-booke: Fix CONFIG_RELOCATABLE support on FSL Book-E ppc32
The following commit broke CONFIG_RELOCATABLE support on FSL Book-E parts:
commit 549e8152de8039506f69c677a4546e5427aa6ae7
Author: Paul Mackerras <[email protected]> Date: Sat Aug 30 11:43:47 2008 +1000
powerpc: Make the 64-bit kernel as a position-independent executable
The change to __va and __pa to use PAGE_OFFSET & MEMORY_START causes problems on the Book-E parts because we don't know MEMORY_START until after we parse the device tree. We need __va to work properly to even parse the device tree so we have a chicken an egg. So go back to using he other definition of __va/__pa on CONFIG_BOOKE and use the PAGE_OFFSET/MEMORY_START version on "Classic" PPC64.
Also updated casts to handle phys_addr_t being a different size from unsigned long (ie 36-bit physical on PPC32).
---
* Fixed some grammaticaly issues pointed out by Becky in code comments
arch/powerpc/include/asm/page.h | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-)
arch/powerpc/include/asm/page.h +14 -1
@@ -108,8 +108,21 @@ extern phys_addr_t kernstart_addr;#define pfn_to_kaddr (pfn) __va((pfn) << PAGE_SHIFT)#define virt_addr_valid (kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) -#define __va (x) ((void *)((unsigned long)(x) + PAGE_OFFSET - MEMORY_START)) +/* +* On Book-E parts we need __va to parse the device tree and we can't +* determine MEMORY_START until then. However we can determine PHYSICAL_START +* from information at hand (program counter, TLB lookup). +* +* On non-Book-E PPC64 PAGE_OFFSET and MEMORY_START are constants so use +* the other definitions for __va & __pa. +*/ +#ifdef CONFIG_BOOKE +#define __va (x) ((void *)(unsigned long)((phys_addr_t)(x) - PHYSICAL_START + KERNELBASE)) +#define __pa (x) ((unsigned long)(x) + PHYSICAL_START - KERNELBASE) +#else +#define __va (x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))#define __pa (x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START) +#endif /* * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
Signature · 1 line
1.6.0.6