[PATCH 6/7] arm: Make use of memory_ranges
Simon Horman
horms at verge.net.au
Tue Aug 28 04:18:29 EDT 2012
Make use of struct memory_ranges and provide a global usablemem_rgns.
This is in preparation for adding device tree support.
Signed-off-by: Simon Horman <horms at verge.net.au>
---
kexec/arch/arm/crashdump-arm.c | 45 ++++++++++++++++++++++++++----------------
kexec/arch/arm/crashdump-arm.h | 2 ++
2 files changed, 30 insertions(+), 17 deletions(-)
diff --git a/kexec/arch/arm/crashdump-arm.c b/kexec/arch/arm/crashdump-arm.c
index 213dae2..01973b1 100644
--- a/kexec/arch/arm/crashdump-arm.c
+++ b/kexec/arch/arm/crashdump-arm.c
@@ -31,8 +31,16 @@
#include "../../crashdump.h"
#include "crashdump-arm.h"
+
+/*
+ * Used to save various memory ranges/regions needed for the captured
+ * kernel to boot. (lime memmap= option in other archs)
+ */
static struct memory_range crash_memory_ranges[CRASH_MAX_MEMORY_RANGES];
-static int crash_memory_nr_ranges;
+struct memory_ranges usablemem_rgns = {
+ .size = 0,
+ .ranges = crash_memory_ranges,
+};
/* memory range reserved for crashkernel */
static struct memory_range crash_reserved_mem;
@@ -65,16 +73,16 @@ static int crash_range_callback(void *UNUSED(data), int UNUSED(nr),
{
struct memory_range *range;
- if (crash_memory_nr_ranges >= CRASH_MAX_MEMORY_RANGES)
+ if (usablemem_rgns.size >= CRASH_MAX_MEMORY_RANGES)
return 1;
- range = &crash_memory_ranges[crash_memory_nr_ranges];
+ range = usablemem_rgns.ranges + usablemem_rgns.size;
if (strncmp(str, "System RAM\n", 11) == 0) {
range->start = base;
range->end = base + length - 1;
range->type = RANGE_RAM;
- crash_memory_nr_ranges++;
+ usablemem_rgns.size++;
} else if (strncmp(str, "Crash kernel\n", 13) == 0) {
crash_reserved_mem.start = base;
crash_reserved_mem.end = base + length - 1;
@@ -95,22 +103,24 @@ static void crash_exclude_range(void)
const struct memory_range *range = &crash_reserved_mem;
int i;
- for (i = 0; i < crash_memory_nr_ranges; i++) {
- struct memory_range *r = &crash_memory_ranges[i];
+ for (i = 0; i < usablemem_rgns.size; i++) {
+ struct memory_range *r = usablemem_rgns.ranges + i;
/*
* We assume that crash area is fully contained in
* some larger memory area.
*/
if (r->start <= range->start && r->end >= range->end) {
+ struct memory_range *new;
/*
* Let's split this area into 2 smaller ones and
* remove excluded range from between. First create
* new entry for the remaining area.
*/
- crash_memory_ranges[crash_memory_nr_ranges].start = range->end + 1;
- crash_memory_ranges[crash_memory_nr_ranges].end = r->end;
- crash_memory_nr_ranges++;
+ new = usablemem_rgns.ranges + usablemem_rgns.size;
+ new->start = range->end + 1;
+ new->end = r->end;
+ usablemem_rgns.size++;
/*
* Next update this area to end before excluded range.
*/
@@ -150,7 +160,7 @@ static int crash_get_memory_ranges(void)
*/
kexec_iomem_for_each_line(NULL, crash_range_callback, NULL);
- if (crash_memory_nr_ranges < 1) {
+ if (usablemem_rgns.size < 1) {
errno = EINVAL;
return -1;
}
@@ -164,8 +174,8 @@ static int crash_get_memory_ranges(void)
/*
* Make sure that the memory regions are sorted.
*/
- qsort(crash_memory_ranges, crash_memory_nr_ranges,
- sizeof(crash_memory_ranges[0]), range_cmp);
+ qsort(usablemem_rgns.ranges, usablemem_rgns.size,
+ sizeof(*usablemem_rgns.ranges), range_cmp);
return 0;
}
@@ -235,8 +245,8 @@ static void dump_memory_ranges(void)
crash_reserved_mem.start, crash_reserved_mem.end,
(unsigned long)range_size(&crash_reserved_mem) >> 20);
- for (i = 0; i < crash_memory_nr_ranges; i++) {
- struct memory_range *r = &crash_memory_ranges[i];
+ for (i = 0; i < usablemem_rgns.size; i++) {
+ struct memory_range *r = usablemem_rgns.ranges + i;
dbgprintf("memory range: [%#llx - %#llx] (%ldM)\n",
r->start, r->end, (unsigned long)range_size(r) >> 20);
}
@@ -272,11 +282,12 @@ int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline)
* Now that we have memory regions sorted, we can use first memory
* region as PHYS_OFFSET.
*/
- phys_offset = crash_memory_ranges[0].start;
+ phys_offset = usablemem_rgns.ranges->start;
dbgprintf("phys_offset: %#lx\n", phys_offset);
- err = crash_create_elf32_headers(info, &elf_info, crash_memory_ranges,
- crash_memory_nr_ranges, &buf, &bufsz,
+ err = crash_create_elf32_headers(info, &elf_info,
+ usablemem_rgns.ranges,
+ usablemem_rgns.size, &buf, &bufsz,
ELF_CORE_HEADER_ALIGN);
if (err)
return err;
diff --git a/kexec/arch/arm/crashdump-arm.h b/kexec/arch/arm/crashdump-arm.h
index a2e7824..a342922 100644
--- a/kexec/arch/arm/crashdump-arm.h
+++ b/kexec/arch/arm/crashdump-arm.h
@@ -9,6 +9,8 @@ extern "C" {
#define PAGE_OFFSET 0xc0000000
#define CRASH_MAX_MEMORY_RANGES 32
+extern struct memory_ranges usablemem_rgns;
+
struct kexec_info;
extern unsigned long phys_offset;
--
1.7.10.2.484.gcd07cc5
More information about the kexec
mailing list