[PATCH] powerpc: Fixed memory reserve map layout

powerpc: Fixed memory reserve map layout

The memory reserve map is suppose to be a pair of 64-bit integers
to represent each region.  On ppc32 the code was treating the
pair as two 32-bit integers.  Additional the prom_init code was
producing the wrong layout on ppc32.

Added a simple check to try to provide backwards compatibility.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Kumar Gala 2006-01-11 17:57:13 -06:00 committed by Paul Mackerras
parent ea183a957a
commit cbbcf34011
2 changed files with 28 additions and 8 deletions

View File

@ -1100,17 +1100,37 @@ static int __init early_init_dt_scan_memory(unsigned long node,
static void __init early_reserve_mem(void) static void __init early_reserve_mem(void)
{ {
unsigned long base, size; u64 base, size;
unsigned long *reserve_map; u64 *reserve_map;
reserve_map = (unsigned long *)(((unsigned long)initial_boot_params) + reserve_map = (u64 *)(((unsigned long)initial_boot_params) +
initial_boot_params->off_mem_rsvmap); initial_boot_params->off_mem_rsvmap);
#ifdef CONFIG_PPC32
/*
* Handle the case where we might be booting from an old kexec
* image that setup the mem_rsvmap as pairs of 32-bit values
*/
if (*reserve_map > 0xffffffffull) {
u32 base_32, size_32;
u32 *reserve_map_32 = (u32 *)reserve_map;
while (1) {
base_32 = *(reserve_map_32++);
size_32 = *(reserve_map_32++);
if (size_32 == 0)
break;
DBG("reserving: %lx -> %lx\n", base_32, size_32);
lmb_reserve(base_32, size_32);
}
return;
}
#endif
while (1) { while (1) {
base = *(reserve_map++); base = *(reserve_map++);
size = *(reserve_map++); size = *(reserve_map++);
if (size == 0) if (size == 0)
break; break;
DBG("reserving: %lx -> %lx\n", base, size); DBG("reserving: %llx -> %llx\n", base, size);
lmb_reserve(base, size); lmb_reserve(base, size);
} }

View File

@ -137,8 +137,8 @@ struct prom_t {
}; };
struct mem_map_entry { struct mem_map_entry {
unsigned long base; u64 base;
unsigned long size; u64 size;
}; };
typedef u32 cell_t; typedef u32 cell_t;
@ -897,9 +897,9 @@ static unsigned long __init prom_next_cell(int s, cell_t **cellp)
* If problems seem to show up, it would be a good start to track * If problems seem to show up, it would be a good start to track
* them down. * them down.
*/ */
static void reserve_mem(unsigned long base, unsigned long size) static void reserve_mem(u64 base, u64 size)
{ {
unsigned long top = base + size; u64 top = base + size;
unsigned long cnt = RELOC(mem_reserve_cnt); unsigned long cnt = RELOC(mem_reserve_cnt);
if (size == 0) if (size == 0)