/* Return a sorted list of available memory ranges. */ int get_memory_ranges(struct memory_range **range, int *ranges, unsigned long kexec_flags) { int nr, ret; nr = kexec_iomem_for_each_line("System RAM\n", kexec_sh_memory_range_callback, NULL); *range = memory_range; *ranges = nr; /* * Redefine the memory region boundaries if kernel * exports the limits and if it is panic kernel. * Override user values only if kernel exported values are * subset of user defined values. */ if (kexec_flags & KEXEC_ON_CRASH) { unsigned long long start, end; ret = parse_iomem_single("Crash kernel\n", &start, &end); if (ret != 0) { fprintf(stderr, "parse_iomem_single failed.\n"); return -1; } if (start > mem_min) mem_min = start; if (end < mem_max) mem_max = end; } return 0; }
/** * crash_get_memory_ranges() - read system physical memory * * Function reads through system physical memory and stores found memory regions * in @crash_memory_ranges. Number of memory regions found is placed in * @crash_memory_nr_ranges. Regions are sorted in ascending order. * * Returns %0 in case of success and %-1 otherwise (errno is set). */ static int crash_get_memory_ranges(void) { /* * First read all memory regions that can be considered as * system memory including the crash area. */ kexec_iomem_for_each_line(NULL, crash_range_callback, NULL); if (crash_memory_nr_ranges < 1) { errno = EINVAL; return -1; } /* * Exclude memory reserved for crashkernel (this may result a split memory * region). */ crash_exclude_range(); /* * Make sure that the memory regions are sorted. */ qsort(crash_memory_ranges, crash_memory_nr_ranges, sizeof(crash_memory_ranges[0]), range_cmp); return 0; }
/* Return a sorted list of available memory ranges. */ static int crash_get_memory_ranges(struct memory_range **range, int *ranges) { crash_sh_range_nr = 0; kexec_iomem_for_each_line(NULL, crash_sh_memory_range_callback, NULL); *range = crash_memory_range; *ranges = crash_sh_range_nr; return 0; }
int parse_iomem_single(char *str, uint64_t *start, uint64_t *end) { struct memory_range range; int ret; memset(&range, 0, sizeof(range)); ret = kexec_iomem_for_each_line(str, kexec_iomem_single_callback, &range); if (ret == 1) { if (start) *start = range.start; if (end) *end = range.end; ret = 0; } else ret = -1; return ret; }