summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Damm <magnus@valinux.co.jp>2007-03-15 17:53:19 +0900
committerSimon Horman <horms@verge.net.au>2007-03-19 13:38:50 +0900
commit78cd98999c9e00c2fe3347d4664c5bdc8dd91497 (patch)
treec07f068fdb9b434ddd24878f59b3bdc58cf9bd62
parentbc1eb4e071f864de82474bade25c0273a7fecb6b (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.c2
-rw-r--r--kexec/kexec.c42
-rw-r--r--kexec/kexec.h6
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,