PERFORCE change 28263 for review
Peter Wemm
peter at FreeBSD.org
Sat Apr 5 14:44:32 PST 2003
http://perforce.freebsd.org/chv.cgi?CH=28263
Change 28263 by peter at 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) {
More information about the p4-projects
mailing list