powerpc/32: Add the ability for a classic ppc kernel to be loaded at 32M
authorDale Farnsworth <dale@farnsworth.org>
Wed, 17 Dec 2008 10:09:13 +0000 (10:09 +0000)
committerPaul Mackerras <paulus@samba.org>
Tue, 23 Dec 2008 04:13:29 +0000 (15:13 +1100)
Add the ability for a classic ppc kernel to be loaded at an address
of 32MB.  This done by fixing a few places that assume we are loaded
at address 0, and by changing several uses of KERNELBASE to use
PAGE_OFFSET, instead.

Signed-off-by: Dale Farnsworth <dale@farnsworth.org>
Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/include/asm/ppc_asm.h
arch/powerpc/kernel/head_32.S
arch/powerpc/mm/init_32.c
arch/powerpc/mm/pgtable_32.c
arch/powerpc/mm/ppc_mmu_32.c

index c4a029ccb4d31d5273cc6e43fc381e23ff6f9c08..1a0d628eb114bc0f1a6a930ee1a171c91c1eae06 100644 (file)
@@ -425,14 +425,14 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
 #define fromreal(rd)   tovirt(rd,rd)
 
 #define tophys(rd,rs)                          \
-0:     addis   rd,rs,-KERNELBASE@h;            \
+0:     addis   rd,rs,-PAGE_OFFSET@h;           \
        .section ".vtop_fixup","aw";            \
        .align  1;                              \
        .long   0b;                             \
        .previous
 
 #define tovirt(rd,rs)                          \
-0:     addis   rd,rs,KERNELBASE@h;             \
+0:     addis   rd,rs,PAGE_OFFSET@h;            \
        .section ".ptov_fixup","aw";            \
        .align  1;                              \
        .long   0b;                             \
index 2660619246542e91e53d7461c8e33db9687f049b..a1c4cfd25dedb0fee8e01cdddd8ba66f76f0dc88 100644 (file)
@@ -183,7 +183,8 @@ __after_mmu_off:
        bl      reloc_offset
        mr      r26,r3
        addis   r4,r3,KERNELBASE@h      /* current address of _start */
-       cmpwi   0,r4,0                  /* are we already running at 0? */
+       lis     r5,PHYSICAL_START@h
+       cmplw   0,r4,r5                 /* already running at PHYSICAL_START? */
        bne     relocate_kernel
 /*
  * we now have the 1st 16M of ram mapped with the bats.
@@ -811,13 +812,13 @@ giveup_altivec:
 
 /*
  * This code is jumped to from the startup code to copy
- * the kernel image to physical address 0.
+ * the kernel image to physical address PHYSICAL_START.
  */
 relocate_kernel:
        addis   r9,r26,klimit@ha        /* fetch klimit */
        lwz     r25,klimit@l(r9)
        addis   r25,r25,-KERNELBASE@h
-       li      r3,0                    /* Destination base address */
+       lis     r3,PHYSICAL_START@h     /* Destination base address */
        li      r6,0                    /* Destination offset */
        li      r5,0x4000               /* # bytes of memory to copy */
        bl      copy_and_flush          /* copy the first 0x4000 bytes */
@@ -1188,11 +1189,11 @@ mmu_off:
 
 /*
  * Use the first pair of BAT registers to map the 1st 16MB
- * of RAM to KERNELBASE.  From this point on we can't safely
+ * of RAM to PAGE_OFFSET.  From this point on we can't safely
  * call OF any more.
  */
 initial_bats:
-       lis     r11,KERNELBASE@h
+       lis     r11,PAGE_OFFSET@h
        mfspr   r9,SPRN_PVR
        rlwinm  r9,r9,16,16,31          /* r9 = 1 for 601, 4 for 604 */
        cmpwi   0,r9,1
index 578294c3b1ceeb28df9a73e05520e19659591608..666a5e8a5be1d582685d20b23ce5ec045f83cd4d 100644 (file)
@@ -48,7 +48,7 @@
 
 #if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL)
 /* The ammount of lowmem must be within 0xF0000000 - KERNELBASE. */
-#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - KERNELBASE))
+#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - PAGE_OFFSET))
 #error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_START_KERNEL"
 #endif
 #endif
index cd5609759d449a4eb0f4046df5863fb0dfa3ece2..8cba46fc9e3bfb647914c55cd7de8e4601b718fa 100644 (file)
@@ -269,7 +269,7 @@ int map_page(unsigned long va, phys_addr_t pa, int flags)
 }
 
 /*
- * Map in a big chunk of physical memory starting at KERNELBASE.
+ * Map in a big chunk of physical memory starting at PAGE_OFFSET.
  */
 void __init mapin_ram(void)
 {
@@ -278,7 +278,7 @@ void __init mapin_ram(void)
        int ktext;
 
        s = mmu_mapin_ram();
-       v = KERNELBASE + s;
+       v = PAGE_OFFSET + s;
        p = memstart_addr + s;
        for (; s < total_lowmem; s += PAGE_SIZE) {
                ktext = ((char *) v >= _stext && (char *) v < etext);
index 9d97db7b7cf76d6cc32d84eae919ab3f94ecdb74..45d925360b89aa3a2b17f71daa2a823f6b11c7ef 100644 (file)
@@ -95,16 +95,16 @@ unsigned long __init mmu_mapin_ram(void)
                        break;
        }
 
-       setbat(2, KERNELBASE, 0, bl, _PAGE_RAM);
-       done = (unsigned long)bat_addrs[2].limit - KERNELBASE + 1;
+       setbat(2, PAGE_OFFSET, 0, bl, _PAGE_RAM);
+       done = (unsigned long)bat_addrs[2].limit - PAGE_OFFSET + 1;
        if ((done < tot) && !bat_addrs[3].limit) {
                /* use BAT3 to cover a bit more */
                tot -= done;
                for (bl = 128<<10; bl < max_size; bl <<= 1)
                        if (bl * 2 > tot)
                                break;
-               setbat(3, KERNELBASE+done, done, bl, _PAGE_RAM);
-               done = (unsigned long)bat_addrs[3].limit - KERNELBASE + 1;
+               setbat(3, PAGE_OFFSET+done, done, bl, _PAGE_RAM);
+               done = (unsigned long)bat_addrs[3].limit - PAGE_OFFSET + 1;
        }
 
        return done;