Commit 3e306fcd authored by Anton Blanchard's avatar Anton Blanchard Committed by Linus Torvalds

[PATCH] ppc64: fix some issues with mem_reserve

I found a couple of issues with reserve_mem:

- If we try and mem_reserve something of zero length, everything
  reserved after it would get ignored. This is because early_reserve_mem
  sees a zero length as a terminator.
- The code rounded the top down instead of up.
Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 722d9361
...@@ -587,17 +587,19 @@ static unsigned long __init prom_next_cell(int s, cell_t **cellp) ...@@ -587,17 +587,19 @@ static unsigned long __init prom_next_cell(int s, cell_t **cellp)
static void reserve_mem(unsigned long base, unsigned long size) static void reserve_mem(unsigned long base, unsigned long size)
{ {
unsigned long offset = reloc_offset(); unsigned long offset = reloc_offset();
unsigned long top = base + size;
unsigned long cnt = RELOC(mem_reserve_cnt); unsigned long cnt = RELOC(mem_reserve_cnt);
/* We need to always keep one empty entry so that we if (!size)
return;
base = _ALIGN_DOWN(base, PAGE_SIZE);
size = _ALIGN_UP(size, PAGE_SIZE);
/*
* We need to always keep one empty entry so that we
* have our terminator with "size" set to 0 since we are * have our terminator with "size" set to 0 since we are
* dumb and just copy this entire array to the boot params * dumb and just copy this entire array to the boot params
*/ */
base = _ALIGN_DOWN(base, PAGE_SIZE);
top = _ALIGN_DOWN(top, PAGE_SIZE);
size = top - base;
if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
prom_panic("Memory reserve map exhausted !\n"); prom_panic("Memory reserve map exhausted !\n");
RELOC(mem_reserve_map)[cnt].base = base; RELOC(mem_reserve_map)[cnt].base = base;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment