From owner-p4-projects@FreeBSD.ORG Sat Apr 5 14:44:32 2003 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9CE6137B404; Sat, 5 Apr 2003 14:44:31 -0800 (PST) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3BB6D37B401 for ; Sat, 5 Apr 2003 14:44:31 -0800 (PST) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id BF81A43F85 for ; Sat, 5 Apr 2003 14:44:30 -0800 (PST) (envelope-from peter@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.6/8.12.6) with ESMTP id h35MiU0U032255 for ; Sat, 5 Apr 2003 14:44:30 -0800 (PST) (envelope-from peter@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.6/8.12.6/Submit) id h35MiUwF032252 for perforce@freebsd.org; Sat, 5 Apr 2003 14:44:30 -0800 (PST) Date: Sat, 5 Apr 2003 14:44:30 -0800 (PST) Message-Id: <200304052244.h35MiUwF032252@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to peter@freebsd.org using -f From: Peter Wemm To: Perforce Change Reviews Subject: PERFORCE change 28263 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 05 Apr 2003 22:44:32 -0000 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) {