Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccdcef72 authored by Dale Farnsworth's avatar Dale Farnsworth Committed by Paul Mackerras
Browse files

powerpc/32: Add the ability for a classic ppc kernel to be loaded at 32M



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: default avatarDale Farnsworth <dale@farnsworth.org>
Signed-off-by: default avatarAnton Vorontsov <avorontsov@ru.mvista.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 01695a96
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;				\
+6 −5
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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);
+4 −4
Original line number Diff line number Diff line
@@ -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;