| /* |
| * |
| */ |
| #undef BOOTSTRAP |
| #include "config.h" |
| #include "libopenbios/bindings.h" |
| #include "libopenbios/elf_load.h" |
| #include "libopenbios/initprogram.h" |
| #include "arch/common/nvram.h" |
| #include "libc/diskio.h" |
| |
| void boot(void); |
| void *load_elf(char *spec); |
| |
| void |
| *load_elf(char *spec) |
| { |
| #if 0 |
| int fd; |
| void *entry=NULL; |
| int i, lszz_offs, elf_offs; |
| char buf[128]; // , *addr; |
| Elf_ehdr ehdr; |
| Elf_phdr *phdr; |
| size_t s; |
| |
| if( (fd=open_io(spec)) == -1 ) |
| return NULL; |
| |
| if( (elf_offs=find_elf(fd)) < 0 ) { |
| printk("----> %s is not an ELF image\n", buf ); |
| return NULL; |
| } |
| |
| if( !(phdr=elf_readhdrs(fd, 0, &ehdr)) ) { |
| printk("elf32_readhdrs failed\n"); |
| return NULL; |
| } |
| |
| (unsigned long long *)entry = ehdr.e_entry; |
| |
| lszz_offs = elf_offs; |
| for( i=0; i<ehdr.e_phnum; i++ ) { |
| s = MIN( phdr[i].p_filesz, phdr[i].p_memsz ); |
| seek_io( fd, elf_offs + phdr[i].p_offset ); |
| /* printk("filesz: %08lX memsz: %08lX p_offset: %08lX p_vaddr %08lX\n", |
| phdr[i].p_filesz, phdr[i].p_memsz, phdr[i].p_offset, |
| phdr[i].p_vaddr ); */ |
| if( phdr[i].p_vaddr != phdr[i].p_paddr ) |
| printk("WARNING: ELF segment virtual addr != physical addr\n"); |
| lszz_offs = MAX( lszz_offs, elf_offs + phdr[i].p_offset + phdr[i].p_filesz ); |
| if( !s ) |
| continue; |
| |
| printk("ELF ROM-section loaded at %08lX (size %08lX)\n", |
| (unsigned long)phdr[i].p_vaddr, (unsigned long)phdr[i].p_memsz); |
| } |
| free( phdr ); |
| return entry; |
| #else |
| return NULL; |
| #endif |
| } |
| |
| void |
| boot( void ) |
| { |
| char *path; |
| void *entry; |
| |
| /* Copy the incoming path */ |
| fword("2dup"); |
| path = pop_fstr_copy(); |
| |
| if(!path) { |
| printk("[unix] Booting default not supported.\n"); |
| return; |
| } |
| printk("[unix] Booting '%s'\n",path); |
| entry=load_elf(path); |
| if(entry) |
| printk("successfully loaded client at %llx.\n", (unsigned long long)(ucell)entry); |
| else |
| printk("failed.\n"); |
| } |
| |
| unsigned int |
| start_elf(void) |
| { |
| return 0; |
| } |
| |
| struct context * volatile __context; |
| |
| int |
| arch_init_program(void) |
| { |
| return 0; |
| } |
| |
| void forth_fw_cfg_read_file(void); |
| |
| void |
| forth_fw_cfg_read_file(void) |
| { |
| return; |
| } |