Fully synchronize sys/boot from FreeBSD-5.x, but add / to the module path
[dragonfly.git] / sys / boot / i386 / libi386 / elf32_freebsd.c
similarity index 67%
rename from sys/boot/i386/libi386/elf_freebsd.c
rename to sys/boot/i386/libi386/elf32_freebsd.c
index fa983e7..5de036f 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/boot/i386/libi386/elf_freebsd.c,v 1.7.2.2 2000/12/28 13:12:40 ps Exp $
- * $DragonFly: src/sys/boot/i386/libi386/Attic/elf_freebsd.c,v 1.2 2003/06/17 04:28:18 dillon Exp $
+ * $FreeBSD: src/sys/boot/i386/libi386/elf32_freebsd.c,v 1.13 2003/08/25 23:28:31 obrien Exp $
+ * $DragonFly: src/sys/boot/i386/libi386/Attic/elf32_freebsd.c,v 1.1 2003/11/10 06:08:36 dillon Exp $
  */
 
 #include <sys/param.h>
 #include <sys/exec.h>
-#include <sys/reboot.h>
 #include <sys/linker.h>
 #include <string.h>
 #include <machine/bootinfo.h>
@@ -40,9 +39,9 @@
 #include "libi386.h"
 #include "btxv86.h"
 
-static int     elf_exec(struct loaded_module *amp);
+static int     elf32_exec(struct preloaded_file *amp);
 
-struct module_format i386_elf = { elf_loadmodule, elf_exec };
+struct file_format i386_elf = { elf32_loadfile, elf32_exec };
 
 /*
  * There is an a.out kernel and one or more a.out modules loaded.  
@@ -50,41 +49,28 @@ struct module_format i386_elf = { elf_loadmodule, elf_exec };
  * preparations as are required, and do so.
  */
 static int
-elf_exec(struct loaded_module *mp)
+elf32_exec(struct preloaded_file *fp)
 {
-    struct module_metadata     *md;
+    struct file_metadata       *md;
     Elf_Ehdr                   *ehdr;
-    vm_offset_t                        entry, bootinfop;
+    vm_offset_t                        entry, bootinfop, modulep, kernend;
     int                                boothowto, err, bootdev;
-    struct bootinfo            *bi;
-    vm_offset_t                        ssym, esym;
 
-    if ((md = mod_findmetadata(mp, MODINFOMD_ELFHDR)) == NULL)
+    if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL)
        return(EFTYPE);                 /* XXX actually EFUCKUP */
     ehdr = (Elf_Ehdr *)&(md->md_data);
 
-    if ((err = bi_load(mp->m_args, &boothowto, &bootdev, &bootinfop)) != 0)
+    err = bi_load32(fp->f_args, &boothowto, &bootdev, &bootinfop, &modulep, &kernend);
+    if (err != 0)
        return(err);
     entry = ehdr->e_entry & 0xffffff;
 
-    ssym = esym = 0;
-    if ((md = mod_findmetadata(mp, MODINFOMD_SSYM)) != NULL)
-       ssym = *((vm_offset_t *)&(md->md_data));
-    if ((md = mod_findmetadata(mp, MODINFOMD_ESYM)) != NULL)
-       esym = *((vm_offset_t *)&(md->md_data));
-    if (ssym == 0 || esym == 0)
-       ssym = esym = 0;                /* sanity */
-    bi = (struct bootinfo *)PTOV(bootinfop);
-    bi->bi_symtab = ssym;      /* XXX this is only the primary kernel symtab */
-    bi->bi_esymtab = esym;
-
-
 #ifdef DEBUG
     printf("Start @ 0x%lx ...\n", entry);
 #endif
 
     dev_cleanup();
-    __exec((void *)entry, boothowto, bootdev, 0, 0, 0, bootinfop);
+    __exec((void *)entry, boothowto, bootdev, 0, 0, 0, bootinfop, modulep, kernend);
 
     panic("exec returned");
 }