summaryrefslogtreecommitdiffstats
path: root/sys/boot/ofw
diff options
context:
space:
mode:
authorbenno <benno@FreeBSD.org>2002-07-10 12:13:16 +0000
committerbenno <benno@FreeBSD.org>2002-07-10 12:13:16 +0000
commit80bd743152032a69abfede51ebcf19172fa80457 (patch)
treeedaa406b29d70fe65005d510350b4db195f82a8e /sys/boot/ofw
parentc04f2a4cddd9c20c6ade603b2184d9589561ed90 (diff)
downloadFreeBSD-src-80bd743152032a69abfede51ebcf19172fa80457.zip
FreeBSD-src-80bd743152032a69abfede51ebcf19172fa80457.tar.gz
Add support for passing metadata.
Diffstat (limited to 'sys/boot/ofw')
-rw-r--r--sys/boot/ofw/libofw/elf_freebsd.c60
1 files changed, 16 insertions, 44 deletions
diff --git a/sys/boot/ofw/libofw/elf_freebsd.c b/sys/boot/ofw/libofw/elf_freebsd.c
index 99f7c53..e82a28d 100644
--- a/sys/boot/ofw/libofw/elf_freebsd.c
+++ b/sys/boot/ofw/libofw/elf_freebsd.c
@@ -29,9 +29,7 @@
#include <sys/param.h>
#include <sys/linker.h>
-#if 0
-#include <machine/bootinfo.h>
-#endif
+#include <machine/metadata.h>
#include <machine/elf.h>
#include <stand.h>
@@ -65,51 +63,25 @@ ofw_elf_loadfile(char *filename, vm_offset_t dest,
int
ofw_elf_exec(struct preloaded_file *fp)
{
- struct file_metadata *md;
- Elf_Ehdr *ehdr;
- vm_offset_t entry, bootinfop;
- int boothowto, err, bootdev;
-#if 0
- struct bootinfo *bi;
-#endif
- vm_offset_t ssym, esym;
-
- if ((md = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
- return(EFTYPE); /* XXX actually EFUCKUP */
+ struct file_metadata *fmp;
+ vm_offset_t mdp;
+ Elf_Ehdr *e;
+ int error;
+
+ if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
+ return(EFTYPE);
}
- ehdr = (Elf_Ehdr *)&(md->md_data);
-
-#if 0
- if ((err = bi_load(fp->f_args, &boothowto, &bootdev, &bootinfop)) != 0)
- return(err);
-#endif
- entry = ehdr->e_entry & 0xffffff;
-
- ssym = esym = 0;
- if ((md = file_findmetadata(fp, MODINFOMD_SSYM)) != NULL)
- ssym = *((vm_offset_t *)&(md->md_data));
- if ((md = file_findmetadata(fp, MODINFOMD_ESYM)) != NULL)
- esym = *((vm_offset_t *)&(md->md_data));
- if (ssym == 0 || esym == 0)
- ssym = esym = 0; /* sanity */
-#if 0
- bi = (struct bootinfo *)PTOV(bootinfop);
- bi->bi_symtab = ssym;
- bi->bi_esymtab = esym;
-#endif
-
-/*
-#ifdef DEBUG
-*/
- printf("Start @ 0x%lx ...\n", entry);
-/*
-#endif
-*/
+ e = (Elf_Ehdr *)&fmp->md_data;
+
+ if ((error = md_load(fp->f_args, &mdp)) != 0)
+ return (error);
+
+ printf("Kernel entry at 0x%lx ...\n", e->e_entry);
dev_cleanup();
ofw_release_heap();
-/* OF_chain(0, 0, entry, bootinfop, sizeof(struct bootinfo));*/
- OF_chain((void *)reloc, end - (char *)reloc, (void *)entry, NULL, 0);
+ OF_chain((void *)reloc, end - (char *)reloc, (void *)e->e_entry,
+ (void *)mdp, sizeof(mdp));
panic("exec returned");
}
OpenPOWER on IntegriCloud