diff options
author | Magnus Damm <magnus@valinux.co.jp> | 2007-03-15 17:53:19 +0900 |
---|---|---|
committer | Simon Horman <horms@verge.net.au> | 2007-03-19 13:38:50 +0900 |
commit | 78cd98999c9e00c2fe3347d4664c5bdc8dd91497 (patch) | |
tree | c07f068fdb9b434ddd24878f59b3bdc58cf9bd62 | |
parent | bc1eb4e071f864de82474bade25c0273a7fecb6b (diff) |
Move memory range variables
Move memory range variables
The common kexec code is currently using two global variables to keep
track of memory ranges. Other data is kept in a per-instance structure.
This mix is of per-instance and global variables is confusing and leads
to messy code in general. So let's not.
This patch moves the global variables into struct kexec_info and makes
sure that structure is passed along where needed. No logic is changed.
Signed-off-by: Magnus Damm <magnus@valinux.co.jp>
Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r-- | kexec/kexec-elf-exec.c | 2 | ||||
-rw-r--r-- | kexec/kexec.c | 42 | ||||
-rw-r--r-- | kexec/kexec.h | 6 |
3 files changed, 25 insertions, 25 deletions
diff --git a/kexec/kexec-elf-exec.c b/kexec/kexec-elf-exec.c index f65a625..27844c3 100644 --- a/kexec/kexec-elf-exec.c +++ b/kexec/kexec-elf-exec.c @@ -93,7 +93,7 @@ int elf_exec_load(struct mem_ehdr *ehdr, struct kexec_info *info) /* If I can't use the default paddr find a new * hole for the dynamic executable. */ - if (!valid_memory_range(first, last)) { + if (!valid_memory_range(info, first, last)) { unsigned long hole; hole = locate_hole(info, last - first + 1, align, diff --git a/kexec/kexec.c b/kexec/kexec.c index a490731..5d6dd97 100644 --- a/kexec/kexec.c +++ b/kexec/kexec.c @@ -78,12 +78,8 @@ void *xrealloc(void *ptr, size_t size) return buf; } - -/* local variables */ -static struct memory_range *memory_range; -static int memory_ranges; - -int valid_memory_range(unsigned long sstart, unsigned long send) +int valid_memory_range(struct kexec_info *info, + unsigned long sstart, unsigned long send) { int i; if (sstart > send) { @@ -92,15 +88,16 @@ int valid_memory_range(unsigned long sstart, unsigned long send) if ((send > mem_max) || (sstart < mem_min)) { return 0; } - for (i = 0; i < memory_ranges; i++) { + for (i = 0; i < info->memory_ranges; i++) { unsigned long mstart, mend; /* Only consider memory ranges */ - if (memory_range[i].type != RANGE_RAM) + if (info->memory_range[i].type != RANGE_RAM) continue; - mstart = memory_range[i].start; - mend = memory_range[i].end; - if (i < memory_ranges - 1 && mend == memory_range[i+1].start) - mend = memory_range[i+1].end; + mstart = info->memory_range[i].start; + mend = info->memory_range[i].end; + if (i < info->memory_ranges - 1 + && mend == info->memory_range[i+1].start) + mend = info->memory_range[i+1].end; /* Check to see if we are fully contained */ if ((mstart <= sstart) && (mend >= send)) { @@ -110,13 +107,14 @@ int valid_memory_range(unsigned long sstart, unsigned long send) return 0; } -int valid_memory_segment(struct kexec_segment *segment) +static int valid_memory_segment(struct kexec_info *info, + struct kexec_segment *segment) { unsigned long sstart, send; sstart = (unsigned long)segment->mem; send = sstart + segment->memsz - 1; - return valid_memory_range(sstart, send); + return valid_memory_range(info, sstart, send); } void print_segments(FILE *f, struct kexec_info *info) @@ -197,17 +195,17 @@ unsigned long locate_hole(struct kexec_info *info, } /* Compute the free memory ranges */ - max_mem_ranges = memory_ranges + info->nr_segments; + max_mem_ranges = info->memory_ranges + info->nr_segments; mem_range = xmalloc(max_mem_ranges *sizeof(struct memory_range)); mem_ranges = 0; /* Perform a merge on the 2 sorted lists of memory ranges */ - for (j = 0, i = 0; i < memory_ranges; i++) { + for (j = 0, i = 0; i < info->memory_ranges; i++) { unsigned long long sstart, send; unsigned long long mstart, mend; - mstart = memory_range[i].start; - mend = memory_range[i].end; - if (memory_range[i].type != RANGE_RAM) + mstart = info->memory_range[i].start; + mend = info->memory_range[i].end; + if (info->memory_range[i].type != RANGE_RAM) continue; while ((j < info->nr_segments) && (((unsigned long)info->segment[j].mem) <= mend)) { @@ -312,7 +310,7 @@ void add_segment(struct kexec_info *info, } last = base + memsz -1; - if (!valid_memory_range(base, last)) { + if (!valid_memory_range(info, base, last)) { die("Invalid memory segment %p - %p\n", (void *)base, (void *)last); } @@ -589,7 +587,7 @@ static int my_load(const char *type, int fileind, int argc, char **argv, kernel_buf, kernel_size); #endif - if (get_memory_ranges(&memory_range, &memory_ranges, + if (get_memory_ranges(&info.memory_range, &info.memory_ranges, info.kexec_flags) < 0) { fprintf(stderr, "Could not get memory layout\n"); return -1; @@ -638,7 +636,7 @@ static int my_load(const char *type, int fileind, int argc, char **argv, } /* Verify all of the segments load to a valid location in memory */ for (i = 0; i < info.nr_segments; i++) { - if (!valid_memory_segment(info.segment +i)) { + if (!valid_memory_segment(&info, info.segment +i)) { fprintf(stderr, "Invalid memory segment %p - %p\n", info.segment[i].mem, ((char *)info.segment[i].mem) + diff --git a/kexec/kexec.h b/kexec/kexec.h index 8fd3edb..2b6ff81 100644 --- a/kexec/kexec.h +++ b/kexec/kexec.h @@ -112,6 +112,8 @@ struct memory_range { struct kexec_info { struct kexec_segment *segment; int nr_segments; + struct memory_range *memory_range; + int memory_ranges; void *entry; struct mem_ehdr rhdr; unsigned long backup_start; @@ -124,8 +126,8 @@ struct kexec_info { void usage(void); int get_memory_ranges(struct memory_range **range, int *ranges, unsigned long kexec_flags); -int valid_memory_range(unsigned long sstart, unsigned long send); -int valid_memory_segment(struct kexec_segment *segment); +int valid_memory_range(struct kexec_info *info, + unsigned long sstart, unsigned long send); void print_segments(FILE *file, struct kexec_info *info); int sort_segments(struct kexec_info *info); unsigned long locate_hole(struct kexec_info *info, |