6 #include "libopenbios/bindings.h"
7 #include "libopenbios/elf_load.h"
8 #include "arch/common/nvram.h"
9 #include "libc/diskio.h"
12 void *load_elf(char *spec
);
20 int i
, lszz_offs
, elf_offs
;
21 char buf
[128]; // , *addr;
26 if( (fd
=open_io(spec
)) == -1 )
29 if( (elf_offs
=find_elf(fd
)) < 0 ) {
30 printk("----> %s is not an ELF image\n", buf
);
34 if( !(phdr
=elf_readhdrs(fd
, 0, &ehdr
)) ) {
35 printk("elf32_readhdrs failed\n");
39 (unsigned long long *)entry
= ehdr
.e_entry
;
42 for( i
=0; i
<ehdr
.e_phnum
; i
++ ) {
43 s
= MIN( phdr
[i
].p_filesz
, phdr
[i
].p_memsz
);
44 seek_io( fd
, elf_offs
+ phdr
[i
].p_offset
);
45 /* printk("filesz: %08lX memsz: %08lX p_offset: %08lX p_vaddr %08lX\n",
46 phdr[i].p_filesz, phdr[i].p_memsz, phdr[i].p_offset,
48 if( phdr
[i
].p_vaddr
!= phdr
[i
].p_paddr
)
49 printk("WARNING: ELF segment virtual addr != physical addr\n");
50 lszz_offs
= MAX( lszz_offs
, elf_offs
+ phdr
[i
].p_offset
+ phdr
[i
].p_filesz
);
54 printk("ELF ROM-section loaded at %08lX (size %08lX)\n",
55 (unsigned long)phdr
[i
].p_vaddr
, (unsigned long)phdr
[i
].p_memsz
);
70 /* Copy the incoming path */
72 path
= pop_fstr_copy();
75 printk("[unix] Booting default not supported.\n");
78 printk("[unix] Booting '%s'\n",path
);
81 printk("successfully loaded client at %llx.\n", (unsigned long long)(ucell
)entry
);