diff options
author | 2013-10-17 15:54:11 +0000 | |
---|---|---|
committer | 2013-10-17 15:54:11 +0000 | |
commit | 5842670d18e4ef008fa42fabe0f2beada45e4ad0 (patch) | |
tree | 9fb2e1fc17c87e7ae0c92dee9dfcd844ab2226db | |
parent | the explanation for locally-defined ecoff is even simpler now that (diff) | |
download | wireguard-openbsd-5842670d18e4ef008fa42fabe0f2beada45e4ad0.tar.xz wireguard-openbsd-5842670d18e4ef008fa42fabe0f2beada45e4ad0.zip |
zap ecoff and a.out support like in MI loadfile
-rw-r--r-- | sys/arch/zaurus/stand/zboot/loadfile.c | 297 |
1 files changed, 1 insertions, 296 deletions
diff --git a/sys/arch/zaurus/stand/zboot/loadfile.c b/sys/arch/zaurus/stand/zboot/loadfile.c index d2ae4fbe155..b7551c9cc89 100644 --- a/sys/arch/zaurus/stand/zboot/loadfile.c +++ b/sys/arch/zaurus/stand/zboot/loadfile.c @@ -1,5 +1,5 @@ /* $NetBSD: loadfile.c,v 1.10 2000/12/03 02:53:04 tsutsui Exp $ */ -/* $OpenBSD: loadfile.c,v 1.5 2013/10/17 08:02:18 deraadt Exp $ */ +/* $OpenBSD: loadfile.c,v 1.6 2013/10/17 15:54:11 deraadt Exp $ */ /*- * Copyright (c) 1997 The NetBSD Foundation, Inc. @@ -88,18 +88,10 @@ #define BOOT_ZBOOT -#ifdef BOOT_ECOFF -#include <sys/exec_ecoff.h> -static int coff_exec(int, struct ecoff_exechdr *, u_long *, int); -#endif #ifdef BOOT_ELF #include <sys/exec_elf.h> static int elf_exec(int, Elf_Ehdr *, u_long *, int); #endif -#ifdef BOOT_AOUT -#include <sys/exec.h> -static int aout_exec(int, struct exec *, u_long *, int); -#endif #ifdef BOOT_ZBOOT #include <dev/cons.h> /* XXX */ static int zboot_exec(int, u_long *, int); @@ -113,16 +105,9 @@ int loadfile(const char *fname, u_long *marks, int flags) { union { -#ifdef BOOT_ECOFF - struct ecoff_exechdr coff; -#endif #ifdef BOOT_ELF Elf_Ehdr elf; #endif -#ifdef BOOT_AOUT - struct exec aout; -#endif - } hdr; ssize_t nr; int fd, rval; @@ -139,11 +124,6 @@ loadfile(const char *fname, u_long *marks, int flags) goto err; } -#ifdef BOOT_ECOFF - if (!ECOFF_BADMAG(&hdr.coff)) { - rval = coff_exec(fd, &hdr.coff, marks, flags); - } else -#endif #ifdef BOOT_ELF if (memcmp(hdr.elf.e_ident, ELFMAG, SELFMAG) == 0 && hdr.elf.e_ident[EI_CLASS] == ELFCLASS) { @@ -154,15 +134,6 @@ loadfile(const char *fname, u_long *marks, int flags) #endif } else #endif -#ifdef BOOT_AOUT - if (OKMAGIC(N_GETMAGIC(hdr.aout)) -#ifndef NO_MID_CHECK - && N_GETMID(hdr.aout) == MID_MACHINE -#endif - ) { - rval = aout_exec(fd, &hdr.aout, marks, flags); - } else -#endif { rval = 1; errno = EFTYPE; @@ -178,88 +149,6 @@ err: return -1; } -#ifdef BOOT_ECOFF -static int -coff_exec(int fd, struct ecoff_exechdr *coff, u_long *marks, int flags) -{ - paddr_t offset = marks[MARK_START]; - paddr_t minp = ~0, maxp = 0, pos; - - /* Read in text. */ - if (lseek(fd, ECOFF_TXTOFF(coff), SEEK_SET) == -1) { - WARN(("lseek text")); - return 1; - } - - if (coff->a.tsize != 0) { - if (flags & LOAD_TEXT) { - PROGRESS(("%lu", coff->a.tsize)); - if (READ(fd, coff->a.text_start, coff->a.tsize) != - coff->a.tsize) { - return 1; - } - } - else { - if (lseek(fd, coff->a.tsize, SEEK_CUR) == -1) { - WARN(("read text")); - return 1; - } - } - if (flags & (COUNT_TEXT|LOAD_TEXT)) { - pos = coff->a.text_start; - if (minp > pos) - minp = pos; - pos += coff->a.tsize; - if (maxp < pos) - maxp = pos; - } - } - - /* Read in data. */ - if (coff->a.dsize != 0) { - if (flags & LOAD_DATA) { - PROGRESS(("+%lu", coff->a.dsize)); - if (READ(fd, coff->a.data_start, coff->a.dsize) != - coff->a.dsize) { - WARN(("read data")); - return 1; - } - } - if (flags & (COUNT_DATA|LOAD_DATA)) { - pos = coff->a.data_start; - if (minp > pos) - minp = pos; - pos += coff->a.dsize; - if (maxp < pos) - maxp = pos; - } - } - - /* Zero out bss. */ - if (coff->a.bsize != 0) { - if (flags & LOAD_BSS) { - PROGRESS(("+%lu", coff->a.bsize)); - BZERO(coff->a.bss_start, coff->a.bsize); - } - if (flags & (COUNT_BSS|LOAD_BSS)) { - pos = coff->a.bss_start; - if (minp > pos) - minp = pos; - pos = coff->a.bsize; - if (maxp < pos) - maxp = pos; - } - } - - marks[MARK_START] = LOADADDR(minp); - marks[MARK_ENTRY] = LOADADDR(coff->a.entry); - marks[MARK_NSYM] = 1; /* XXX: Kernel needs >= 0 */ - marks[MARK_SYM] = LOADADDR(maxp); - marks[MARK_END] = LOADADDR(maxp); - return 0; -} -#endif /* BOOT_ECOFF */ - #ifdef BOOT_ELF static int elf_exec(int fd, Elf_Ehdr *elf, u_long *marks, int flags) @@ -436,190 +325,6 @@ elf_exec(int fd, Elf_Ehdr *elf, u_long *marks, int flags) } #endif /* BOOT_ELF */ -#ifdef BOOT_AOUT -static int -aout_exec(int fd, struct exec *x, u_long *marks, int flags) -{ - u_long entry = x->a_entry; - paddr_t aoutp = 0; - paddr_t minp, maxp; - int cc; - paddr_t offset = marks[MARK_START]; - u_long magic = N_GETMAGIC(*x); - int sub; - - /* In OMAGIC and NMAGIC, exec header isn't part of text segment */ - if (magic == OMAGIC || magic == NMAGIC) - sub = 0; - else - sub = sizeof(*x); - - minp = maxp = ALIGNENTRY(entry); - - if (lseek(fd, sizeof(*x), SEEK_SET) == -1) { - WARN(("lseek text")); - return 1; - } - - /* - * Leave a copy of the exec header before the text. - * The kernel may use this to verify that the - * symbols were loaded by this boot program. - */ - if (magic == OMAGIC || magic == NMAGIC) { - if (flags & LOAD_HDR && maxp >= sizeof(*x)) - BCOPY(x, maxp - sizeof(*x), sizeof(*x)); - } - else { - if (flags & LOAD_HDR) - BCOPY(x, maxp, sizeof(*x)); - if (flags & (LOAD_HDR|COUNT_HDR)) - maxp += sizeof(*x); - } - - /* - * Read in the text segment. - */ - if (flags & LOAD_TEXT) { - PROGRESS(("%ld", x->a_text)); - - if (READ(fd, maxp, x->a_text - sub) != x->a_text - sub) { - WARN(("read text")); - return 1; - } - } else { - if (lseek(fd, x->a_text - sub, SEEK_CUR) == -1) { - WARN(("seek text")); - return 1; - } - } - if (flags & (LOAD_TEXT|COUNT_TEXT)) - maxp += x->a_text - sub; - - /* - * Provide alignment if required - */ - if (magic == ZMAGIC || magic == NMAGIC) { - int size = -(unsigned int)maxp & (__LDPGSZ - 1); - - if (flags & LOAD_TEXTA) { - PROGRESS(("/%d", size)); - BZERO(maxp, size); - } - - if (flags & (LOAD_TEXTA|COUNT_TEXTA)) - maxp += size; - } - - /* - * Read in the data segment. - */ - if (flags & LOAD_DATA) { - PROGRESS(("+%ld", x->a_data)); - - if (READ(fd, maxp, x->a_data) != x->a_data) { - WARN(("read data")); - return 1; - } - } - else { - if (lseek(fd, x->a_data, SEEK_CUR) == -1) { - WARN(("seek data")); - return 1; - } - } - if (flags & (LOAD_DATA|COUNT_DATA)) - maxp += x->a_data; - - /* - * Zero out the BSS section. - * (Kernel doesn't care, but do it anyway.) - */ - if (flags & LOAD_BSS) { - PROGRESS(("+%ld", x->a_bss)); - - BZERO(maxp, x->a_bss); - } - - if (flags & (LOAD_BSS|COUNT_BSS)) - maxp += x->a_bss; - - /* - * Read in the symbol table and strings. - * (Always set the symtab size word.) - */ - if (flags & LOAD_SYM) - BCOPY(&x->a_syms, maxp, sizeof(x->a_syms)); - - if (flags & (LOAD_SYM|COUNT_SYM)) { - maxp += sizeof(x->a_syms); - aoutp = maxp; - } - - if (x->a_syms > 0) { - /* Symbol table and string table length word. */ - - if (flags & LOAD_SYM) { - PROGRESS(("+[%ld", x->a_syms)); - - if (READ(fd, maxp, x->a_syms) != x->a_syms) { - WARN(("read symbols")); - return 1; - } - } else { - if (lseek(fd, x->a_syms, SEEK_CUR) == -1) { - WARN(("seek symbols")); - return 1; - } - } - if (flags & (LOAD_SYM|COUNT_SYM)) - maxp += x->a_syms; - - if (read(fd, &cc, sizeof(cc)) != sizeof(cc)) { - WARN(("read string table")); - return 1; - } - - if (flags & LOAD_SYM) { - BCOPY(&cc, maxp, sizeof(cc)); - - /* String table. Length word includes itself. */ - - PROGRESS(("+%d]", cc)); - } - if (flags & (LOAD_SYM|COUNT_SYM)) - maxp += sizeof(cc); - - cc -= sizeof(int); - if (cc <= 0) { - WARN(("symbol table too short")); - return 1; - } - - if (flags & LOAD_SYM) { - if (READ(fd, maxp, cc) != cc) { - WARN(("read strings")); - return 1; - } - } else { - if (lseek(fd, cc, SEEK_CUR) == -1) { - WARN(("seek strings")); - return 1; - } - } - if (flags & (LOAD_SYM|COUNT_SYM)) - maxp += cc; - } - - marks[MARK_START] = LOADADDR(minp); - marks[MARK_ENTRY] = LOADADDR(entry); - marks[MARK_NSYM] = x->a_syms; - marks[MARK_SYM] = LOADADDR(aoutp); - marks[MARK_END] = LOADADDR(maxp); - return 0; -} -#endif /* BOOT_AOUT */ - #ifdef BOOT_ZBOOT static int zboot_exec(int fd, u_long *marks, int flags) |