Date: Sat, 5 Apr 2003 14:44:30 -0800 (PST) From: Peter Wemm <peter@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 28263 for review Message-ID: <200304052244.h35MiUwF032252@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=28263 Change 28263 by peter@peter_overcee on 2003/04/05 14:44:07 Deal with the Joy of 64 bit stuff on a 32 bit platform Affected files ... .. //depot/projects/hammer/sys/boot/common/bootstrap.h#3 edit .. //depot/projects/hammer/sys/boot/common/load_elf.c#5 edit Differences ... ==== //depot/projects/hammer/sys/boot/common/bootstrap.h#3 (text+ko) ==== @@ -210,7 +210,7 @@ struct file_format { /* Load function must return EFTYPE if it can't handle the module supplied */ - int (* l_load)(char *filename, vm_offset_t dest, struct preloaded_file **result); + int (* l_load)(char *filename, u_int64_t dest, struct preloaded_file **result); /* Only a loader that will load a kernel (first module) should have an exec handler */ int (* l_exec)(struct preloaded_file *mp); }; @@ -231,11 +231,8 @@ /* MI module loaders */ -int aout_loadfile(char *filename, vm_offset_t dest, struct preloaded_file **result); -vm_offset_t aout_findsym(char *name, struct preloaded_file *fp); - #ifdef __elfN -int __elfN(loadfile)(char *filename, vm_offset_t dest, struct preloaded_file **result); +int __elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result); #endif /* ==== //depot/projects/hammer/sys/boot/common/load_elf.c#5 (text+ko) ==== @@ -59,10 +59,10 @@ caddr_t firstpage; size_t firstlen; int kernel; - vm_offset_t off; + u_int64_t off; } *elf_file_t; -static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef, vm_offset_t loadaddr); +static int __elfN(loadimage)(struct preloaded_file *mp, elf_file_t ef, u_int64_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 __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef, @@ -80,7 +80,7 @@ * will be saved in (result). */ int -__elfN(loadfile)(char *filename, vm_offset_t dest, struct preloaded_file **result) +__elfN(loadfile)(char *filename, u_int64_t dest, struct preloaded_file **result) { struct preloaded_file *fp, *kfp; struct elf_file ef; @@ -162,7 +162,7 @@ /* * Calculate destination address based on kernel entrypoint */ - dest = (vm_offset_t) ehdr->e_entry; + dest = ehdr->e_entry; if (dest == 0) { printf(__XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n"); err = EPERM; @@ -191,7 +191,7 @@ #ifdef ELF_VERBOSE if (ef.kernel) - printf("%s entry at %p\n", filename, (void *) dest); + printf("%s entry at 0x%jx\n", filename, (uintmax_t)dest); #else printf("%s ", filename); #endif @@ -224,7 +224,7 @@ * the Elf header, load the image at (off) */ static int -__elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, vm_offset_t off) +__elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off) { int i; u_int j; @@ -240,6 +240,7 @@ vm_offset_t dest; vm_offset_t ssym, esym; Elf_Dyn *dp; + Elf_Addr adp; int ndp; int symstrindex; int symtabindex; @@ -253,7 +254,11 @@ ehdr = ef->ehdr; if (ef->kernel) { #ifdef __i386__ +#if __ELF_WORD_SIZE == 64 + off = - (off & 0xffffffffff000000u);/* x86_64 relocates after locore */ +#else off = - (off & 0xff000000u); /* i386 relocates after locore */ +#endif #else off = 0; /* alpha is direct mapped for kernels */ #endif @@ -461,9 +466,8 @@ for (i = 0; i < ehdr->e_phnum; i++) { if (phdr[i].p_type == PT_DYNAMIC) { php = phdr + i; - dp = (Elf_Dyn *)(php->p_vaddr); - file_addmetadata(fp, MODINFOMD_DYNAMIC, sizeof(dp), &dp); - dp = NULL; + adp = php->p_vaddr; + file_addmetadata(fp, MODINFOMD_DYNAMIC, sizeof(adp), &adp); break; } } @@ -485,19 +489,19 @@ break; switch (dp[i].d_tag) { case DT_HASH: - ef->hashtab = (Elf_Hashelt*)(dp[i].d_un.d_ptr + off); + ef->hashtab = (Elf_Hashelt*)(uintptr_t)(dp[i].d_un.d_ptr + off); break; case DT_STRTAB: - ef->strtab = (char *)(dp[i].d_un.d_ptr + off); + ef->strtab = (char *)(uintptr_t)(dp[i].d_un.d_ptr + off); break; case DT_STRSZ: ef->strsz = dp[i].d_un.d_val; break; case DT_SYMTAB: - ef->symtab = (Elf_Sym*)(dp[i].d_un.d_ptr + off); + ef->symtab = (Elf_Sym*)(uintptr_t)(dp[i].d_un.d_ptr + off); break; case DT_RELA: - ef->rela = (Elf_Rela *)(dp[i].d_un.d_ptr + off); + ef->rela = (Elf_Rela *)(uintptr_t)(dp[i].d_un.d_ptr + off); break; case DT_RELASZ: ef->relasz = dp[i].d_un.d_val; @@ -565,15 +569,16 @@ struct mod_depend *mdepend; struct mod_version mver; Elf_Sym sym; - char *s, *v, **p, **p_stop; + char *s, **p, **p_stop; int modcnt, minfolen; + Elf_Addr v; if (__elfN(lookup_symbol)(fp, ef, "__start_set_modmetadata_set", &sym) != 0) return ENOENT; - p = (char **)(sym.st_value + ef->off); + p = (char **)(uintptr_t)(sym.st_value + ef->off); if (__elfN(lookup_symbol)(fp, ef, "__stop_set_modmetadata_set", &sym) != 0) return ENOENT; - p_stop = (char **)(sym.st_value + ef->off); + p_stop = (char **)(uintptr_t)(sym.st_value + ef->off); modcnt = 0; while (p < p_stop) {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200304052244.h35MiUwF032252>