summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kexec/arch/ia64/crashdump-ia64.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/kexec/arch/ia64/crashdump-ia64.c b/kexec/arch/ia64/crashdump-ia64.c
index 54747ac..338a6af 100644
--- a/kexec/arch/ia64/crashdump-ia64.c
+++ b/kexec/arch/ia64/crashdump-ia64.c
@@ -76,18 +76,29 @@ static void add_loaded_segments_info(struct kexec_info *info,
{
int i;
for(i = 0; i < ehdr->e_phnum; i++) {
- unsigned long start, end;
struct mem_phdr *phdr;
phdr = &ehdr->e_phdr[i];
if (phdr->p_type != PT_LOAD)
continue;
- start = phdr->p_paddr;
- end = phdr->p_paddr + phdr->p_memsz;
loaded_segments[loaded_segments_num].start =
- start&~(ELF_PAGE_SIZE-1);
+ phdr->p_paddr & ~(ELF_PAGE_SIZE-1);
loaded_segments[loaded_segments_num].end =
- (end + ELF_PAGE_SIZE - 1)&~(ELF_PAGE_SIZE - 1);
+ loaded_segments[loaded_segments_num].start;
+
+ while (i < ehdr->e_phnum) {
+ phdr = &ehdr->e_phdr[i];
+ if (phdr->p_type != PT_LOAD)
+ break;
+ if (loaded_segments[loaded_segments_num].end !=
+ phdr->p_paddr & ~(ELF_PAGE_SIZE-1))
+ break;
+ loaded_segments[loaded_segments_num].end +=
+ (phdr->p_memsz + ELF_PAGE_SIZE - 1) &
+ ~(ELF_PAGE_SIZE - 1);
+ i++;
+ }
+
loaded_segments_num++;
}
}