static void __init contig_initmem_init(void) { unsigned long bootmap_size, bootmap; bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_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(&contig_page_data, 0, end_pfn << PAGE_SHIFT); reserve_bootmem(bootmap, bootmap_size); }
void __init reserve_trampoline_memory(void) { unsigned long mem; /* Has to be in very low memory so we can execute real-mode AP code. */ mem = find_e820_area(0, 1<<20, TRAMPOLINE_SIZE, PAGE_SIZE); if (mem == -1L) panic("Cannot allocate trampoline\n"); trampoline_base = __va(mem); reserve_early(mem, mem + TRAMPOLINE_SIZE, "TRAMPOLINE"); }
static void __init contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn) { unsigned long bootmap_size, bootmap; bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_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(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT); reserve_bootmem(bootmap, bootmap_size, BOOTMEM_DEFAULT); }
/** * This sets up the bootstrap memory allocator. It is a simple * bitmap based allocator that tracks memory at a page granularity. * Once the bootstrap process is complete, each unallocated page * is added to the real memory allocator's free pool. Memory allocated * during bootstrap remains allocated forever, unless explicitly * freed before turning things over to the real memory allocator. */ static void __init setup_bootmem_allocator( unsigned long start_pfn, unsigned long end_pfn ) { unsigned long bootmap_size, bootmap; bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = find_e820_area(0, 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); reserve_bootmem(bootmap, bootmap_size); }
/* Callback for SLIT parsing */ void __init acpi_numa_slit_init(struct acpi_table_slit *slit) { unsigned length; unsigned long phys; length = slit->header.length; phys = find_e820_area(0, max_pfn_mapped<<PAGE_SHIFT, length, PAGE_SIZE); if (phys == -1L) panic(" Can not save slit!\n"); acpi_slit = __va(phys); memcpy(acpi_slit, slit, length); reserve_early(phys, phys + length, "ACPI SLIT"); }
static void __init contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn) { unsigned long bootmap_size, bootmap; bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT; bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size); if (bootmap == -1L) panic("Cannot find bootmem map of size %ld\n",bootmap_size); bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn); #ifdef CONFIG_XEN e820_bootmem_free(NODE_DATA(0), 0, xen_start_info->nr_pages<<PAGE_SHIFT); #else e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT); #endif reserve_bootmem(bootmap, bootmap_size); }
/** * acpi_reserve_wakeup_memory - do _very_ early ACPI initialisation * * We allocate a page from the first 1MB of memory for the wakeup * routine for when we come back from a sleep state. The * runtime allocator allows specification of <16MB pages, but not * <1MB pages. */ void __init acpi_reserve_wakeup_memory(void) { unsigned long mem; if ((&wakeup_code_end - &wakeup_code_start) > WAKEUP_SIZE) { printk(KERN_ERR "ACPI: Wakeup code way too big, S3 disabled.\n"); return; } mem = find_e820_area(0, 1<<20, WAKEUP_SIZE, PAGE_SIZE); if (mem == -1L) { printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n"); return; } acpi_realmode = (unsigned long) phys_to_virt(mem); acpi_wakeup_address = mem; reserve_early(mem, mem + WAKEUP_SIZE, "ACPI WAKEUP"); }
static void __init find_early_table_space(unsigned long end) { unsigned long puds, pmds, tables, start; puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; tables = round_up(puds * sizeof(pud_t), PAGE_SIZE) + round_up(pmds * sizeof(pmd_t), PAGE_SIZE); /* RED-PEN putting page tables only on node 0 could cause a hotspot and fill up ZONE_DMA. The page tables need roughly 0.5KB per GB. */ start = 0x8000; table_start = find_e820_area(start, end, tables); if (table_start == -1UL) panic("Cannot find space for the kernel page tables"); table_start >>= PAGE_SHIFT; table_end = table_start; early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n", end, table_start << PAGE_SHIFT, (table_start << PAGE_SHIFT) + tables); }