• Home
  • Raw
  • Download

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
57 /* Simplified build-specific string for starting entropy. */
69 hash = (hash << ((sizeof(hash) * 8) - 7)) | (hash >> 7); in rotate_xor()
101 /* Store memory limit specified by "mem=nn[KMG]" or "memmap=nn[KMG]" */
111 MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1,
120 if (one->start + one->size <= two->start) in mem_overlaps()
123 if (one->start >= two->start + two->size) in mem_overlaps()
143 return -EINVAL; in parse_memmap()
147 return -EINVAL; in parse_memmap()
152 return -EINVAL; in parse_memmap()
161 /* memmap=nn@ss specifies usable region, should be skipped */ in parse_memmap()
168 * system can use. Region above the limit should be avoided. in parse_memmap()
174 return -EINVAL; in parse_memmap()
198 /* Store the specified memory limit if size > 0 */ in mem_avoid_memmap()
269 /* Stop at -- */ in handle_mem_options()
270 if (!val && strcmp(param, "--") == 0) { in handle_mem_options()
271 warn("Only '--' specified in cmdline"); in handle_mem_options()
273 return -1; in handle_mem_options()
288 return -EINVAL; in handle_mem_options()
305 * memory ranges lead to really hard to debug boot failures.
311 * What is not obvious how to avoid is the range of memory that is used
321 * in header.S, and the memory diagram is based on the one found in misc.c.
325 * - input + input_size >= output + output_size
326 * - kernel_total_size <= init_size
327 * - kernel_total_size <= output_size (see Note below)
328 * - output + init_size >= output + output_size
341 * |-----|--------|--------|--------------|-----------|--|-------------|
344 * output+init_size-ZO_INIT_SIZE output+output_size output+kernel_total_size
346 * [output, output+init_size) is the entire memory range used for
356 * [output+init_size-ZO_INIT_SIZE, output+init_size) is the worst-case
375 unsigned long init_size = boot_params->hdr.init_size; in mem_avoid_init()
381 * Avoid the region that is unsafe to overlap during in mem_avoid_init()
385 mem_avoid[MEM_AVOID_ZO_RANGE].size = (output + init_size) - input; in mem_avoid_init()
390 initrd_start = (u64)boot_params->ext_ramdisk_image << 32; in mem_avoid_init()
391 initrd_start |= boot_params->hdr.ramdisk_image; in mem_avoid_init()
392 initrd_size = (u64)boot_params->ext_ramdisk_size << 32; in mem_avoid_init()
393 initrd_size |= boot_params->hdr.ramdisk_size; in mem_avoid_init()
399 cmd_line = (u64)boot_params->ext_cmd_line_ptr << 32; in mem_avoid_init()
400 cmd_line |= boot_params->hdr.cmd_line_ptr; in mem_avoid_init()
428 * Does this memory vector overlap a known avoided area? If so, record the
429 * overlap region with the lowest address.
436 unsigned long earliest = img->start + img->size; in mem_avoid_overlap()
443 earliest = overlap->start; in mem_avoid_overlap()
449 ptr = (struct setup_data *)(unsigned long)boot_params->hdr.setup_data; in mem_avoid_overlap()
454 avoid.size = sizeof(*ptr) + ptr->len; in mem_avoid_overlap()
458 earliest = overlap->start; in mem_avoid_overlap()
462 ptr = (struct setup_data *)(unsigned long)ptr->next; in mem_avoid_overlap()
481 static void store_slot_info(struct mem_vector *region, unsigned long image_size) in store_slot_info() argument
488 slot_area.addr = region->start; in store_slot_info()
489 slot_area.num = (region->size - image_size) / in store_slot_info()
499 * Skip as many 1GB huge pages as possible in the passed region
503 process_gb_huge_pages(struct mem_vector *region, unsigned long image_size) in process_gb_huge_pages() argument
510 store_slot_info(region, image_size); in process_gb_huge_pages()
514 addr = ALIGN(region->start, PUD_SIZE); in process_gb_huge_pages()
515 /* Did we raise the address above the passed in memory entry? */ in process_gb_huge_pages()
516 if (addr < region->start + region->size) in process_gb_huge_pages()
517 size = region->size - (addr - region->start); in process_gb_huge_pages()
521 size -= PUD_SIZE; in process_gb_huge_pages()
522 max_gb_huge_pages--; in process_gb_huge_pages()
528 store_slot_info(region, image_size); in process_gb_huge_pages()
534 * processing the remaining head or tail part of the passed region in process_gb_huge_pages()
538 if (addr >= region->start + image_size) { in process_gb_huge_pages()
539 tmp.start = region->start; in process_gb_huge_pages()
540 tmp.size = addr - region->start; in process_gb_huge_pages()
544 size = region->size - (addr - region->start) - i * PUD_SIZE; in process_gb_huge_pages()
565 slot -= slot_areas[i].num; in slots_fetch_random()
580 struct mem_vector region, overlap; in process_mem_region() local
585 /* On 32-bit, ignore entries entirely above our maximum. */ in process_mem_region()
586 if (IS_ENABLED(CONFIG_X86_32) && entry->start >= KERNEL_IMAGE_SIZE) in process_mem_region()
590 if (entry->start + entry->size < minimum) in process_mem_region()
593 /* Ignore entries above memory limit */ in process_mem_region()
594 end = min(entry->size + entry->start, mem_limit); in process_mem_region()
595 if (entry->start >= end) in process_mem_region()
597 cur_entry.start = entry->start; in process_mem_region()
598 cur_entry.size = end - entry->start; in process_mem_region()
600 region.start = cur_entry.start; in process_mem_region()
601 region.size = cur_entry.size; in process_mem_region()
605 start_orig = region.start; in process_mem_region()
608 if (region.start < minimum) in process_mem_region()
609 region.start = minimum; in process_mem_region()
612 region.start = ALIGN(region.start, CONFIG_PHYSICAL_ALIGN); in process_mem_region()
614 /* Did we raise the address above the passed in memory entry? */ in process_mem_region()
615 if (region.start > cur_entry.start + cur_entry.size) in process_mem_region()
619 region.size -= region.start - start_orig; in process_mem_region()
621 /* On 32-bit, reduce region size to fit within max size. */ in process_mem_region()
623 region.start + region.size > KERNEL_IMAGE_SIZE) in process_mem_region()
624 region.size = KERNEL_IMAGE_SIZE - region.start; in process_mem_region()
626 /* Return if region can't contain decompressed kernel */ in process_mem_region()
627 if (region.size < image_size) in process_mem_region()
630 /* If nothing overlaps, store the region and return. */ in process_mem_region()
631 if (!mem_avoid_overlap(&region, &overlap)) { in process_mem_region()
632 process_gb_huge_pages(&region, image_size); in process_mem_region()
636 /* Store beginning of region if holds at least image_size. */ in process_mem_region()
637 if (overlap.start > region.start + image_size) { in process_mem_region()
640 beginning.start = region.start; in process_mem_region()
641 beginning.size = overlap.start - region.start; in process_mem_region()
645 /* Return if overlap extends to or past end of region. */ in process_mem_region()
646 if (overlap.start + overlap.size >= region.start + region.size) in process_mem_region()
649 /* Clip off the overlapping region and start over. */ in process_mem_region()
650 region.size -= overlap.start - region.start + overlap.size; in process_mem_region()
651 region.start = overlap.start + overlap.size; in process_mem_region()
657 * Returns true if mirror region found (and must have been processed
663 struct efi_info *e = &boot_params->efi_info; in process_efi_entries()
665 struct mem_vector region; in process_efi_entries() local
672 signature = (char *)&e->efi_loader_signature; in process_efi_entries()
679 if (e->efi_memmap_hi) { in process_efi_entries()
683 pmap = e->efi_memmap; in process_efi_entries()
685 pmap = (e->efi_memmap | ((__u64)e->efi_memmap_hi << 32)); in process_efi_entries()
688 nr_desc = e->efi_memmap_size / e->efi_memdesc_size; in process_efi_entries()
690 md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); in process_efi_entries()
691 if (md->attribute & EFI_MEMORY_MORE_RELIABLE) { in process_efi_entries()
698 md = efi_early_memdesc_ptr(pmap, e->efi_memdesc_size, i); in process_efi_entries()
701 * Here we are more conservative in picking free memory than in process_efi_entries()
705 * free memory and thus available to place the kernel image into, in process_efi_entries()
706 * but in practice there's firmware where using that memory leads in process_efi_entries()
711 if (md->type != EFI_CONVENTIONAL_MEMORY) in process_efi_entries()
715 !(md->attribute & EFI_MEMORY_MORE_RELIABLE)) in process_efi_entries()
718 region.start = md->phys_addr; in process_efi_entries()
719 region.size = md->num_pages << EFI_PAGE_SHIFT; in process_efi_entries()
720 process_mem_region(&region, minimum, image_size); in process_efi_entries()
740 struct mem_vector region; in process_e820_entries() local
744 for (i = 0; i < boot_params->e820_entries; i++) { in process_e820_entries()
745 entry = &boot_params->e820_table[i]; in process_e820_entries()
746 /* Skip non-RAM entries. */ in process_e820_entries()
747 if (entry->type != E820_TYPE_RAM) in process_e820_entries()
749 region.start = entry->addr; in process_e820_entries()
750 region.size = entry->size; in process_e820_entries()
751 process_mem_region(&region, minimum, image_size); in process_e820_entries()
764 debug_putstr("Aborted memory entries scan (more than 4 memmap= args)!\n"); in find_random_phys_addr()
789 * There are how many CONFIG_PHYSICAL_ALIGN-sized slots in find_random_virt_addr()
793 slots = (KERNEL_IMAGE_SIZE - minimum - image_size) / in find_random_virt_addr()
826 boot_params->hdr.loadflags |= KASLR_FLAG; in choose_random_location()
831 /* Record the various known unsafe memory ranges. */ in choose_random_location()
841 /* Walk available memory entries to find a random address. */ in choose_random_location()
844 warn("Physical KASLR disabled: no suitable memory region!"); in choose_random_location()