Lines Matching +full:memory +full:- +full:region
1 // SPDX-License-Identifier: GPL-2.0
8 * handles walking the physical memory maps (and tracking memory regions
9 * to avoid) in order to select a physical memory location that can
37 /* Simplified build-specific string for starting entropy. */
49 hash = (hash << ((sizeof(hash) * 8) - 7)) | (hash >> 7); in rotate_xor()
78 * Store memory limit: MAXMEM on 64-bit and KERNEL_IMAGE_SIZE on 32-bit.
83 /* Number of immovable memory regions */
92 MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1,
101 if (one->start + one->size <= two->start) in mem_overlaps()
104 if (one->start >= two->start + two->size) in mem_overlaps()
124 return -EINVAL; in parse_memmap()
128 return -EINVAL; in parse_memmap()
133 return -EINVAL; in parse_memmap()
143 * memmap=nn@ss specifies usable region, should in parse_memmap()
152 * system can use. Region above the limit should be avoided. in parse_memmap()
158 return -EINVAL; in parse_memmap()
182 /* Store the specified memory limit if size > 0 */ in mem_avoid_memmap()
238 len = strnlen(args, COMMAND_LINE_SIZE-1); in handle_mem_options()
252 /* Stop at -- */ in handle_mem_options()
253 if (!val && strcmp(param, "--") == 0) in handle_mem_options()
280 * on 64-bit, and [16M, KERNEL_IMAGE_SIZE) on 32-bit.
287 * memory ranges lead to really hard to debug boot failures.
293 * What is not obvious how to avoid is the range of memory that is used
303 * in header.S, and the memory diagram is based on the one found in misc.c.
307 * - input + input_size >= output + output_size
308 * - kernel_total_size <= init_size
309 * - kernel_total_size <= output_size (see Note below)
310 * - output + init_size >= output + output_size
323 * |-----|--------|--------|--------------|-----------|--|-------------|
326 * output+init_size-ZO_INIT_SIZE output+output_size output+kernel_total_size
328 * [output, output+init_size) is the entire memory range used for
338 * [output+init_size-ZO_INIT_SIZE, output+init_size) is the worst-case
357 unsigned long init_size = boot_params_ptr->hdr.init_size; in mem_avoid_init()
362 * Avoid the region that is unsafe to overlap during in mem_avoid_init()
366 mem_avoid[MEM_AVOID_ZO_RANGE].size = (output + init_size) - input; in mem_avoid_init()
369 initrd_start = (u64)boot_params_ptr->ext_ramdisk_image << 32; in mem_avoid_init()
370 initrd_start |= boot_params_ptr->hdr.ramdisk_image; in mem_avoid_init()
371 initrd_size = (u64)boot_params_ptr->ext_ramdisk_size << 32; in mem_avoid_init()
372 initrd_size |= boot_params_ptr->hdr.ramdisk_size; in mem_avoid_init()
381 cmd_line_size = strnlen((char *)cmd_line, COMMAND_LINE_SIZE-1) + 1; in mem_avoid_init()
395 /* Enumerate the immovable memory regions */ in mem_avoid_init()
400 * Does this memory vector overlap a known avoided area? If so, record the
401 * overlap region with the lowest address.
408 u64 earliest = img->start + img->size; in mem_avoid_overlap()
415 earliest = overlap->start; in mem_avoid_overlap()
421 ptr = (struct setup_data *)(unsigned long)boot_params_ptr->hdr.setup_data; in mem_avoid_overlap()
426 avoid.size = sizeof(*ptr) + ptr->len; in mem_avoid_overlap()
430 earliest = overlap->start; in mem_avoid_overlap()
434 if (ptr->type == SETUP_INDIRECT && in mem_avoid_overlap()
435 ((struct setup_indirect *)ptr->data)->type != SETUP_INDIRECT) { in mem_avoid_overlap()
436 avoid.start = ((struct setup_indirect *)ptr->data)->addr; in mem_avoid_overlap()
437 avoid.size = ((struct setup_indirect *)ptr->data)->len; in mem_avoid_overlap()
441 earliest = overlap->start; in mem_avoid_overlap()
446 ptr = (struct setup_data *)(unsigned long)ptr->next; in mem_avoid_overlap()
463 static void store_slot_info(struct mem_vector *region, unsigned long image_size) in store_slot_info() argument
470 slot_area.addr = region->start; in store_slot_info()
471 slot_area.num = 1 + (region->size - image_size) / CONFIG_PHYSICAL_ALIGN; in store_slot_info()
478 * Skip as many 1GB huge pages as possible in the passed region
482 process_gb_huge_pages(struct mem_vector *region, unsigned long image_size) in process_gb_huge_pages() argument
489 store_slot_info(region, image_size); in process_gb_huge_pages()
493 /* Are there any 1GB pages in the region? */ in process_gb_huge_pages()
494 pud_start = ALIGN(region->start, PUD_SIZE); in process_gb_huge_pages()
495 pud_end = ALIGN_DOWN(region->start + region->size, PUD_SIZE); in process_gb_huge_pages()
499 store_slot_info(region, image_size); in process_gb_huge_pages()
503 /* Check if the head part of the region is usable. */ in process_gb_huge_pages()
504 if (pud_start >= region->start + image_size) { in process_gb_huge_pages()
505 tmp.start = region->start; in process_gb_huge_pages()
506 tmp.size = pud_start - region->start; in process_gb_huge_pages()
511 gb_huge_pages = (pud_end - pud_start) >> PUD_SHIFT; in process_gb_huge_pages()
516 max_gb_huge_pages -= gb_huge_pages; in process_gb_huge_pages()
519 /* Check if the tail part of the region is usable. */ in process_gb_huge_pages()
520 if (region->start + region->size >= pud_end + image_size) { in process_gb_huge_pages()
522 tmp.size = region->start + region->size - pud_end; in process_gb_huge_pages()
540 slot -= slot_areas[i].num; in slots_fetch_random()
555 struct mem_vector region, overlap; in __process_mem_region() local
558 /* Enforce minimum and memory limit. */ in __process_mem_region()
559 region.start = max_t(u64, entry->start, minimum); in __process_mem_region()
560 region_end = min(entry->start + entry->size, mem_limit); in __process_mem_region()
565 region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN); in __process_mem_region()
567 /* Did we raise the address above the passed in memory entry? */ in __process_mem_region()
568 if (region.start > region_end) in __process_mem_region()
572 region.size = region_end - region.start; in __process_mem_region()
574 /* Return if region can't contain decompressed kernel */ in __process_mem_region()
575 if (region.size < image_size) in __process_mem_region()
578 /* If nothing overlaps, store the region and return. */ in __process_mem_region()
579 if (!mem_avoid_overlap(®ion, &overlap)) { in __process_mem_region()
580 process_gb_huge_pages(®ion, image_size); in __process_mem_region()
584 /* Store beginning of region if holds at least image_size. */ in __process_mem_region()
585 if (overlap.start >= region.start + image_size) { in __process_mem_region()
586 region.size = overlap.start - region.start; in __process_mem_region()
587 process_gb_huge_pages(®ion, image_size); in __process_mem_region()
590 /* Clip off the overlapping region and start over. */ in __process_mem_region()
591 region.start = overlap.start + overlap.size; in __process_mem_region()
595 static bool process_mem_region(struct mem_vector *region, in process_mem_region() argument
601 * If no immovable memory found, or MEMORY_HOTREMOVE disabled, in process_mem_region()
602 * use @region directly. in process_mem_region()
605 __process_mem_region(region, minimum, image_size); in process_mem_region()
616 * If immovable memory found, filter the intersection between in process_mem_region()
617 * immovable memory and @region. in process_mem_region()
623 if (!mem_overlaps(region, &immovable_mem[i])) in process_mem_region()
628 region_end = region->start + region->size; in process_mem_region()
630 entry.start = clamp(region->start, start, end); in process_mem_region()
632 entry.size = entry_end - entry.start; in process_mem_region()
651 * Pick free memory more conservatively than the EFI spec allows: according to
652 * the spec, EFI_BOOT_SERVICES_{CODE|DATA} are also free memory and thus
654 * where using that memory leads to crashes. Buggy vendor EFI code registers
656 * that EFI_BOOT_SERVICES_DATA memory has not been touched by loader yet, which
663 if (md->type == EFI_CONVENTIONAL_MEMORY) in memory_type_is_free()
667 md->type == EFI_UNACCEPTED_MEMORY) in memory_type_is_free()
680 struct efi_info *e = &boot_params_ptr->efi_info; in process_efi_entries()
682 struct mem_vector region; in process_efi_entries() local
689 signature = (char *)&e->efi_loader_signature; in process_efi_entries()
696 if (e->efi_memmap_hi) { in process_efi_entries()
700 pmap = e->efi_memmap; in process_efi_entries()
702 pmap = (e->efi_memmap | ((__u64)e->efi_memmap_hi << 32)); in process_efi_entries()
705 nr_desc = e->efi_memmap_size / e->efi_memdesc_size; in process_efi_entries()
707 md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); in process_efi_entries()
708 if (md->attribute & EFI_MEMORY_MORE_RELIABLE) { in process_efi_entries()
715 md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); in process_efi_entries()
721 (md->attribute & EFI_MEMORY_SP)) in process_efi_entries()
725 !(md->attribute & EFI_MEMORY_MORE_RELIABLE)) in process_efi_entries()
728 region.start = md->phys_addr; in process_efi_entries()
729 region.size = md->num_pages << EFI_PAGE_SHIFT; in process_efi_entries()
730 if (process_mem_region(®ion, minimum, image_size)) in process_efi_entries()
747 struct mem_vector region; in process_e820_entries() local
751 for (i = 0; i < boot_params_ptr->e820_entries; i++) { in process_e820_entries()
752 entry = &boot_params_ptr->e820_table[i]; in process_e820_entries()
753 /* Skip non-RAM entries. */ in process_e820_entries()
754 if (entry->type != E820_TYPE_RAM) in process_e820_entries()
756 region.start = entry->addr; in process_e820_entries()
757 region.size = entry->size; in process_e820_entries()
758 if (process_mem_region(®ion, minimum, image_size)) in process_e820_entries()
774 debug_putstr("Aborted memory entries scan (more than 4 memmap= args)!\n"); in find_random_phys_addr()
798 * There are how many CONFIG_PHYSICAL_ALIGN-sized slots in find_random_virt_addr()
802 slots = 1 + (KERNEL_IMAGE_SIZE - minimum - image_size) / CONFIG_PHYSICAL_ALIGN; in find_random_virt_addr()
826 boot_params_ptr->hdr.loadflags |= KASLR_FLAG; in choose_random_location()
833 /* Record the various known unsafe memory ranges. */ in choose_random_location()
845 /* Walk available memory entries to find a random address. */ in choose_random_location()
848 warn("Physical KASLR disabled: no suitable memory region!"); in choose_random_location()