Date: Sat, 5 Apr 2003 13:39:05 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 28254 for review Message-ID: <200304052139.h35Ld5qe021901@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=28254 Change 28254 by peter@peter_overcee on 2003/04/05 13:38:52 Checkpoint. Evil hacks to fit an elf64 loader into an i386 loader. Not finished yet. Stolen from imgact_elf{,32,64}.c. Affected files ... .. //depot/projects/hammer/sys/boot/common/Makefile.inc#3 edit .. //depot/projects/hammer/sys/boot/common/load_elf.c#4 edit .. //depot/projects/hammer/sys/boot/common/load_elf32.c#1 add .. //depot/projects/hammer/sys/boot/common/load_elf64.c#1 add .. //depot/projects/hammer/sys/i386/include/elf.h#2 edit Differences ... ==== //depot/projects/hammer/sys/boot/common/Makefile.inc#3 (text+ko) ==== @@ -1,9 +1,19 @@ # $FreeBSD: src/sys/boot/common/Makefile.inc,v 1.14 2002/08/29 02:02:27 peter Exp $ SRCS+= bcache.c boot.c commands.c console.c devopen.c interp.c -SRCS+= interp_backslash.c interp_parse.c load_elf.c ls.c misc.c +SRCS+= interp_backslash.c interp_parse.c ls.c misc.c SRCS+= module.c panic.c +.if ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "powerpc" +SRCS+= load_elf32.c load_elf64.c +.endif +.if ${MACHINE_ARCH} == "powerpc" +SRCS+= load_elf32.c +.endif +.if ${MACHINE_ARCH} == "sparc64" || ${MACHINE_ARCH} == "ia64" || ${MACHINE_ARCH} == "alpha" +SRCS+= load_elf32.c +.endif + .if defined(LOADER_NET_SUPPORT) SRCS+= dev_net.c .endif ==== //depot/projects/hammer/sys/boot/common/load_elf.c#4 (text+ko) ==== @@ -62,17 +62,17 @@ vm_offset_t off; } *elf_file_t; -static int elf_loadimage(struct preloaded_file *mp, elf_file_t ef, vm_offset_t loadaddr); -static int elf_lookup_symbol(struct preloaded_file *mp, elf_file_t ef, const char* name, Elf_Sym* sym); +static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef, vm_offset_t loadaddr); +static int __elfN(lookup_symbol)(struct preloaded_file *mp, elf_file_t ef, const char* name, Elf_Sym* sym); #ifdef __sparc__ -static void elf_reloc_ptr(struct preloaded_file *mp, elf_file_t ef, +static void __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef, void *p, void *val, size_t len); #endif -static int elf_parse_modmetadata(struct preloaded_file *mp, elf_file_t ef); +static int __elfN(parse_modmetadata)(struct preloaded_file *mp, elf_file_t ef); static char *fake_modname(const char *name); -const char *elf_kerneltype = "elf kernel"; -const char *elf_moduletype = "elf module"; +const char *__elfN(kerneltype) = __XSTRING(__ELF_WORD_SIZE) "kernel"; +const char *__elfN(moduletype) = __XSTRING(__ELF_WORD_SIZE) "module"; /* * Attempt to load the file (file) as an ELF module. It will be stored at @@ -80,7 +80,7 @@ * will be saved in (result). */ int -elf_loadfile(char *filename, vm_offset_t dest, struct preloaded_file **result) +__elfN(loadfile)(char *filename, vm_offset_t dest, struct preloaded_file **result) { struct preloaded_file *fp, *kfp; struct elf_file ef; @@ -134,12 +134,12 @@ if (ehdr->e_type == ET_DYN) { /* Looks like a kld module */ if (kfp == NULL) { - printf("elf_loadfile: can't load module before kernel\n"); + printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module before kernel\n"); err = EPERM; goto oerr; } - if (strcmp(elf_kerneltype, kfp->f_type)) { - printf("elf_loadfile: can't load module with kernel type '%s'\n", kfp->f_type); + if (strcmp(__elfN(kerneltype), kfp->f_type)) { + printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module with kernel type '%s'\n", kfp->f_type); err = EPERM; goto oerr; } @@ -155,7 +155,7 @@ } else if (ehdr->e_type == ET_EXEC) { /* Looks like a kernel */ if (kfp != NULL) { - printf("elf_loadfile: kernel already loaded\n"); + printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n"); err = EPERM; goto oerr; } @@ -164,7 +164,7 @@ */ dest = (vm_offset_t) ehdr->e_entry; if (dest == 0) { - printf("elf_loadfile: not a kernel (maybe static binary?)\n"); + printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n"); err = EPERM; goto oerr; } @@ -180,14 +180,14 @@ */ fp = file_alloc(); if (fp == NULL) { - printf("elf_loadfile: cannot allocate module info\n"); + printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: cannot allocate module info\n"); err = EPERM; goto out; } if (ef.kernel) setenv("kernelname", filename, 1); fp->f_name = strdup(filename); - fp->f_type = strdup(ef.kernel ? elf_kerneltype : elf_moduletype); + fp->f_type = strdup(ef.kernel ? __elfN(kerneltype) : __elfN(moduletype)); #ifdef ELF_VERBOSE if (ef.kernel) @@ -196,7 +196,7 @@ printf("%s ", filename); #endif - fp->f_size = elf_loadimage(fp, &ef, dest); + fp->f_size = __elfN(loadimage)(fp, &ef, dest); if (fp->f_size == 0 || fp->f_addr == 0) goto ioerr; @@ -224,7 +224,7 @@ * the Elf header, load the image at (off) */ static int -elf_loadimage(struct preloaded_file *fp, elf_file_t ef, vm_offset_t off) +__elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, vm_offset_t off) { int i; u_int j; @@ -261,7 +261,7 @@ ef->off = off; if ((ehdr->e_phoff + ehdr->e_phnum * sizeof(*phdr)) > ef->firstlen) { - printf("elf_loadimage: program header not within first page\n"); + printf(__XSTRING(__ELF_WORD_SIZE) "_loadimage: program header not within first page\n"); goto out; } phdr = (Elf_Phdr *)(ef->firstpage + ehdr->e_phoff); @@ -295,12 +295,12 @@ if (phdr[i].p_filesz > fpcopy) { if (lseek(ef->fd, (off_t)(phdr[i].p_offset + fpcopy), SEEK_SET) == -1) { - printf("\nelf_loadexec: cannot seek\n"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadexec: cannot seek\n"); goto out; } if (archsw.arch_readin(ef->fd, phdr[i].p_vaddr + off + fpcopy, phdr[i].p_filesz - fpcopy) != (ssize_t)(phdr[i].p_filesz - fpcopy)) { - printf("\nelf_loadexec: archsw.readin failed\n"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadexec: archsw.readin failed\n"); goto out; } } @@ -315,7 +315,7 @@ /* no archsw.arch_bzero */ buf = malloc(PAGE_SIZE); if (buf == NULL) { - printf("\nelf_loadimage: malloc() failed\n"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadimage: malloc() failed\n"); goto out; } bzero(buf, PAGE_SIZE); @@ -353,12 +353,12 @@ if (shdr == NULL) goto nosyms; if (lseek(ef->fd, (off_t)ehdr->e_shoff, SEEK_SET) == -1) { - printf("\nelf_loadimage: cannot lseek() to section headers"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadimage: cannot lseek() to section headers"); goto nosyms; } result = read(ef->fd, shdr, chunk); if (result < 0 || (size_t)result != chunk) { - printf("\nelf_loadimage: read section headers failed"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadimage: read section headers failed"); goto nosyms; } symtabindex = -1; @@ -423,14 +423,14 @@ #endif if (lseek(ef->fd, (off_t)shdr[i].sh_offset, SEEK_SET) == -1) { - printf("\nelf_loadimage: could not seek for symbols - skipped!"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadimage: could not seek for symbols - skipped!"); lastaddr = ssym; ssym = 0; goto nosyms; } result = archsw.arch_readin(ef->fd, lastaddr, shdr[i].sh_size); if (result < 0 || (size_t)result != shdr[i].sh_size) { - printf("\nelf_loadimage: could not read symbols - skipped!"); + printf("\n" __XSTRING(__ELF_WORD_SIZE) "_loadimage: could not read symbols - skipped!"); lastaddr = ssym; ssym = 0; goto nosyms; @@ -513,7 +513,7 @@ COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains)); ef->buckets = ef->hashtab + 2; ef->chains = ef->buckets + ef->nbuckets; - if (elf_parse_modmetadata(fp, ef) == 0) + if (__elfN(parse_modmetadata)(fp, ef) == 0) goto out; if (ef->kernel) /* kernel must not depend on anything */ @@ -559,7 +559,7 @@ } int -elf_parse_modmetadata(struct preloaded_file *fp, elf_file_t ef) +__elfN(parse_modmetadata)(struct preloaded_file *fp, elf_file_t ef) { struct mod_metadata md; struct mod_depend *mdepend; @@ -568,10 +568,10 @@ char *s, *v, **p, **p_stop; int modcnt, minfolen; - if (elf_lookup_symbol(fp, ef, "__start_set_modmetadata_set", &sym) != 0) + if (__elfN(lookup_symbol)(fp, ef, "__start_set_modmetadata_set", &sym) != 0) return ENOENT; p = (char **)(sym.st_value + ef->off); - if (elf_lookup_symbol(fp, ef, "__stop_set_modmetadata_set", &sym) != 0) + if (__elfN(lookup_symbol)(fp, ef, "__stop_set_modmetadata_set", &sym) != 0) return ENOENT; p_stop = (char **)(sym.st_value + ef->off); @@ -579,13 +579,13 @@ while (p < p_stop) { COPYOUT(p, &v, sizeof(v)); #ifdef __sparc64__ - elf_reloc_ptr(fp, ef, p, &v, sizeof(v)); + __elfN(reloc_ptr)(fp, ef, p, &v, sizeof(v)); #else v += ef->off; #endif COPYOUT(v, &md, sizeof(md)); #ifdef __sparc64__ - elf_reloc_ptr(fp, ef, v, &md, sizeof(md)); + __elfN(reloc_ptr)(fp, ef, v, &md, sizeof(md)); #else md.md_cval += ef->off; md.md_data += ef->off; @@ -639,9 +639,9 @@ return h; } -static const char elf_bad_symtable[] = "elf_lookup_symbol: corrupt symbol table\n"; +static const char __elfN(bad_symtable)[] = __XSTRING(__ELF_WORD_SIZE) "_lookup_symbol: corrupt symbol table\n"; int -elf_lookup_symbol(struct preloaded_file *fp, elf_file_t ef, const char* name, +__elfN(lookup_symbol)(struct preloaded_file *fp, elf_file_t ef, const char* name, Elf_Sym *symp) { Elf_Hashelt symnum; @@ -654,13 +654,13 @@ while (symnum != STN_UNDEF) { if (symnum >= ef->nchains) { - printf(elf_bad_symtable); + printf(__elfN(bad_symtable)); return ENOENT; } COPYOUT(ef->symtab + symnum, &sym, sizeof(sym)); if (sym.st_name == 0) { - printf(elf_bad_symtable); + printf(__elfN(bad_symtable)); return ENOENT; } @@ -688,7 +688,7 @@ * the image in-place, because this is done by kern_linker later on. */ static void -elf_reloc_ptr(struct preloaded_file *mp, elf_file_t ef, +__elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef, void *p, void *val, size_t len) { Elf_Addr off = (Elf_Addr)p - ef->off, word; ==== //depot/projects/hammer/sys/i386/include/elf.h#2 (text+ko) ==== @@ -34,8 +34,12 @@ */ #include <sys/elf32.h> /* Definitions common to all 32 bit architectures. */ +#include <sys/elf64.h> /* Definitions common to all 64 bit architectures. */ +#ifndef __ELF_WORD_SIZE #define __ELF_WORD_SIZE 32 /* Used by <sys/elf_generic.h> */ +#endif + #include <sys/elf_generic.h> #define ELF_ARCH EM_386 @@ -58,6 +62,11 @@ } a_un; } Elf32_Auxinfo; +/* Fake for x86-64 loader support */ +typedef struct { + int fake; +} Elf64_Auxinfo; + __ElfType(Auxinfo); /* Values for a_type. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304052139.h35Ld5qe021901>