Skip site navigation (1)Skip section navigation (2)
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>