Revision: 9208b26f2567
Branch: default
Author: Jack Lange <
jack....@gmail.com>
Date: Wed Jun 19 06:11:12 2013
Log: Modify bootmem allocator to allow non-zero base address.
http://code.google.com/p/kitten/source/detail?r=9208b26f2567
Modified:
/arch/x86_64/kernel/setup.c
/include/lwk/bootmem.h
/kernel/mm/bootmem.c
=======================================
--- /arch/x86_64/kernel/setup.c Fri May 11 14:03:49 2012
+++ /arch/x86_64/kernel/setup.c Wed Jun 19 06:11:12 2013
@@ -95,14 +95,20 @@
unsigned long end_pfn
)
{
- unsigned long bootmap_size, bootmap;
+ unsigned long bootmap_size = 0, bootmap = 0;
- bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
- bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size, PAGE_SIZE);
+ bootmap_size = bootmem_bootmap_pages(end_pfn) << PAGE_SHIFT;
+
+ bootmap = find_e820_area(start_pfn << PAGE_SHIFT,
+ end_pfn << PAGE_SHIFT,
+ bootmap_size, PAGE_SIZE);
+
if (bootmap == -1L)
- panic("Cannot find bootmem map of size %ld\n",bootmap_size);
- bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
- e820_bootmem_free(0, end_pfn << PAGE_SHIFT);
+ panic("Cannot find bootmem map of size %ld\n", bootmap_size);
+
+ bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, start_pfn, end_pfn);
+
+ e820_bootmem_free(start_pfn << PAGE_SHIFT, end_pfn << PAGE_SHIFT);
reserve_bootmem(bootmap, bootmap_size);
}
=======================================
--- /include/lwk/bootmem.h Mon Oct 6 11:39:38 2008
+++ /include/lwk/bootmem.h Wed Jun 19 06:11:12 2013
@@ -23,8 +23,9 @@
} bootmem_data_t;
extern unsigned long __init bootmem_bootmap_pages(unsigned long pages);
-extern unsigned long __init init_bootmem(unsigned long start,
- unsigned long pages);
+extern unsigned long __init init_bootmem(unsigned long mapstart_pfn,
+ unsigned long start_pfn,
+ unsigned long end_pfn);
extern void __init reserve_bootmem(unsigned long addr, unsigned long size);
extern void * __init alloc_bootmem(unsigned long size);
extern void * __init alloc_bootmem_aligned(unsigned long size,
=======================================
--- /kernel/mm/bootmem.c Wed Aug 24 17:43:40 2011
+++ /kernel/mm/bootmem.c Wed Jun 19 06:11:12 2013
@@ -95,17 +95,17 @@
static unsigned long __init
init_bootmem_core(
bootmem_data_t *bdata,
- unsigned long mapstart,
- unsigned long start,
- unsigned long end
+ unsigned long mapstart_pfn,
+ unsigned long start_pfn,
+ unsigned long end_pfn
)
{
- unsigned long mapsize = ((end - start)+7)/8;
+ unsigned long mapsize = ((end_pfn - start_pfn) + 7) / 8;
mapsize = ALIGN(mapsize, sizeof(long));
- bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);
- bdata->node_boot_start = (start << PAGE_SHIFT);
- bdata->node_low_pfn = end;
+ bdata->node_bootmem_map = phys_to_virt(mapstart_pfn << PAGE_SHIFT);
+ bdata->node_boot_start = (start_pfn << PAGE_SHIFT);
+ bdata->node_low_pfn = end_pfn;
link_bootmem(bdata);
/*
@@ -470,9 +470,11 @@
* Initialize boot memory allocator.
*/
unsigned long __init
-init_bootmem(unsigned long start, unsigned long pages)
+init_bootmem(unsigned long mapstart_pfn,
+ unsigned long start_pfn,
+ unsigned long end_pfn)
{
- return init_bootmem_core(&bootmem_data, start, 0, pages);
+ return init_bootmem_core(&bootmem_data, mapstart_pfn, start_pfn, end_pfn);
}
/**