mirror of https://gitee.com/openkylin/linux.git
[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:
parent
ea183a957a
commit
cbbcf34011
|
@ -1100,17 +1100,37 @@ static int __init early_init_dt_scan_memory(unsigned long node,
|
|||
|
||||
static void __init early_reserve_mem(void)
|
||||
{
|
||||
unsigned long base, size;
|
||||
unsigned long *reserve_map;
|
||||
u64 base, size;
|
||||
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);
|
||||
#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) {
|
||||
base = *(reserve_map++);
|
||||
size = *(reserve_map++);
|
||||
if (size == 0)
|
||||
break;
|
||||
DBG("reserving: %lx -> %lx\n", base, size);
|
||||
DBG("reserving: %llx -> %llx\n", base, size);
|
||||
lmb_reserve(base, size);
|
||||
}
|
||||
|
||||
|
|
|
@ -137,8 +137,8 @@ struct prom_t {
|
|||
};
|
||||
|
||||
struct mem_map_entry {
|
||||
unsigned long base;
|
||||
unsigned long size;
|
||||
u64 base;
|
||||
u64 size;
|
||||
};
|
||||
|
||||
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
|
||||
* 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);
|
||||
|
||||
if (size == 0)
|
||||
|
|
Loading…
Reference in New Issue