summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHelge Deller <deller@parisc-linux.org>2006-04-03 22:01:00 +0000
committerHelge Deller <deller@parisc-linux.org>2006-04-03 22:01:00 +0000
commit177ca078816a6e93a5c45699671f3e6b7cc8a870 (patch)
tree190c6a05df951d648fe887544b6cac4c1cf804c8
parent176b4656d5b7230071b07adf85bc3cff733b5eaf (diff)
downloadpalo-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.c1
-rw-r--r--lib/common.h2
-rw-r--r--lib/elf32.c7
-rw-r--r--lib/elf64.c7
-rw-r--r--lib/load.c5
5 files changed, 12 insertions, 10 deletions
diff --git a/ipl/ipl.c b/ipl/ipl.c
index 86803cd..f6bc1f8 100644
--- a/ipl/ipl.c
+++ b/ipl/ipl.c
@@ -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;
}
diff --git a/lib/load.c b/lib/load.c
index ea17f1a..92942f8 100644
--- a/lib/load.c
+++ b/lib/load.c
@@ -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]);