diff options
author | Helge Deller <deller@parisc-linux.org> | 2006-04-03 22:01:00 +0000 |
---|---|---|
committer | Helge Deller <deller@parisc-linux.org> | 2006-04-03 22:01:00 +0000 |
commit | 177ca078816a6e93a5c45699671f3e6b7cc8a870 (patch) | |
tree | 190c6a05df951d648fe887544b6cac4c1cf804c8 | |
parent | 176b4656d5b7230071b07adf85bc3cff733b5eaf (diff) | |
download | palo-177ca078816a6e93a5c45699671f3e6b7cc8a870.tar.gz |
make ELF32 and ELF64 loaders more similiar, other small fixups,
it's now PALO version 1.14
-rw-r--r-- | ipl/ipl.c | 1 | ||||
-rw-r--r-- | lib/common.h | 2 | ||||
-rw-r--r-- | lib/elf32.c | 7 | ||||
-rw-r--r-- | lib/elf64.c | 7 | ||||
-rw-r--r-- | lib/load.c | 5 |
5 files changed, 12 insertions, 10 deletions
@@ -161,7 +161,6 @@ load_kernel(int fd, unsigned *entryp, int *wide) i, loadable.segment[i].mem, loadable.segment[i].length, loadable.segment[i].offset); } - loadable.first = PHYS(loadable.first); if (!load_loadable((char *)loadable.first, fd, &loadable)) { diff --git a/lib/common.h b/lib/common.h index ff2eb48..8fbd0f8 100644 --- a/lib/common.h +++ b/lib/common.h @@ -32,7 +32,7 @@ #define __swab16(x) bswap_16(x) #endif /* __swab16 */ -#define PALOVERSION "1.13" +#define PALOVERSION "1.14" /* size of I/O block used in HP firmware */ #define FW_BLOCKSIZE 2048 diff --git a/lib/elf32.c b/lib/elf32.c index dae5dd8..1a4fd5a 100644 --- a/lib/elf32.c +++ b/lib/elf32.c @@ -47,7 +47,7 @@ int prepare_ELF32_loadable(int fd, struct loadable *loadable, int *wide) for (i = 0; i < eh.e_phnum; i++) { struct elf32_phdr ep; - struct loadsegment *seg = &loadable->segment[loadable->n++]; + struct loadsegment *seg; unsigned start, end; STRUCTREAD(fd, ep, __be32_to_cpu(eh.e_phoff) + i * sizeof ep); @@ -56,7 +56,7 @@ int prepare_ELF32_loadable(int fd, struct loadable *loadable, int *wide) /* vaddr or paddr? */ start = __be32_to_cpu(ep.p_vaddr); - if (loadable->n == 1 || start < loadable->first) + if (loadable->first == 0 || start < loadable->first) { loadable->first = start; } @@ -64,9 +64,10 @@ int prepare_ELF32_loadable(int fd, struct loadable *loadable, int *wide) if (end > last) last = end; + seg = &loadable->segment[loadable->n++]; seg->offset = __be32_to_cpu(ep.p_offset); - if (loadable->n == 1 || seg->offset < loadable->offset0) + if (loadable->offset0 == 0 || seg->offset < loadable->offset0) { loadable->offset0 = seg->offset; } diff --git a/lib/elf64.c b/lib/elf64.c index c6ab041..c993bc3 100644 --- a/lib/elf64.c +++ b/lib/elf64.c @@ -86,11 +86,9 @@ int prepare_ELF64_loadable(int fd, struct loadable *loadable, int *wide) if (__be32_to_cpu(ep.p_type) != PT_LOAD) continue; - seg = &loadable->segment[loadable->n++]; - /* vaddr or paddr? HP-UX kernel elf seems to use vaddr */ start = addr32(ep.p_vaddr); - if (loadable->n == 1 || start < loadable->first) + if (loadable->first == 0 || start < loadable->first) { loadable->first = start; } @@ -98,9 +96,10 @@ int prepare_ELF64_loadable(int fd, struct loadable *loadable, int *wide) if (end > last) last = end; + seg = &loadable->segment[loadable->n++]; seg->offset = addr32(ep.p_offset); - if (loadable->n == 1 || seg->offset < loadable->offset0) + if (loadable->offset0 == 0 || seg->offset < loadable->offset0) { loadable->offset0 = seg->offset; } @@ -29,7 +29,10 @@ int load_loadable(char *target, int fd, struct loadable *loadable) t = target + (seg->mem - loadable->first); memset(t, 0, seg->length + seg->zeros); - n = seekread(fd, t, seg->length, seg->offset); + if (seg->length) + n = seekread(fd, t, seg->length, seg->offset); + else + n = 0; if (0) printf("loaded segment read %d/%d bytes at %p first word is %x\r\n", n, seg->length, t, ((unsigned *)t)[0]); |