diff options
Diffstat (limited to 'qemu/roms/openbios/arch/ppc/pearpc/main.c')
-rw-r--r-- | qemu/roms/openbios/arch/ppc/pearpc/main.c | 145 |
1 files changed, 0 insertions, 145 deletions
diff --git a/qemu/roms/openbios/arch/ppc/pearpc/main.c b/qemu/roms/openbios/arch/ppc/pearpc/main.c deleted file mode 100644 index 085494e56..000000000 --- a/qemu/roms/openbios/arch/ppc/pearpc/main.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Creation Date: <2004/08/28 18:38:22 greg> - * Time-stamp: <2004/08/28 18:38:22 greg> - * - * <main.c> - * - * Copyright (C) 2004 Greg Watson - * - * Based on MOL specific code which is - * Copyright (C) 2002, 2003, 2004 Samuel Rydh (samuel@ibrium.se) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation - * - */ - - -#include "config.h" -#include "libopenbios/bindings.h" -#include "libopenbios/elfload.h" -#include "arch/common/nvram.h" -#include "libc/diskio.h" -#include "libc/vsprintf.h" -#include "pearpc/pearpc.h" -#include "libopenbios/ofmem.h" - -static void -transfer_control_to_elf( unsigned long entry ) -{ - extern void call_elf( unsigned long entry ); - printk("Starting ELF image at 0x%08lX\n", entry); - call_elf( 0x400000 ); - //call_elf( entry ); - - fatal_error("call_elf returned unexpectedly\n"); -} - -static int -load_elf_rom( unsigned long *entry, int fd ) -{ - int i, lszz_offs, elf_offs; - char buf[128], *addr; - Elf_ehdr ehdr; - Elf_phdr *phdr; - size_t s; - - printk("Loading '%s'\n", get_file_path(fd)); - - /* the ELF-image (usually) starts at offset 0x4000 */ - if( (elf_offs=find_elf(fd)) < 0 ) { - printk("----> %s is not an ELF image\n", buf ); - exit(1); - } - if( !(phdr=elf_readhdrs(fd, elf_offs, &ehdr)) ) - fatal_error("elf_readhdrs failed\n"); - - *entry = ehdr.e_entry; - - /* load segments. Compressed ROM-image assumed to be located immediately - * after the last segment */ - lszz_offs = elf_offs; - for( i=0; i<ehdr.e_phnum; i++ ) { - /* p_memsz, p_flags */ - 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; - if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 ) - fatal_error("Claim failed!\n"); - - addr = (char*)phdr[i].p_vaddr; - if( read_io(fd, addr, s) != s ) - fatal_error("read failed\n"); - -#if 0 - /* patch CODE segment */ - if( *entry >= phdr[i].p_vaddr && *entry < phdr[i].p_vaddr + s ) { - patch_newworld_rom( (char*)phdr[i].p_vaddr, s ); - newworld_timer_hack( (char*)phdr[i].p_vaddr, s ); - } -#endif - flush_icache_range( addr, addr+s ); - - /*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 lszz_offs; -} - - -static void -encode_bootpath( const char *spec, const char *args ) -{ - phandle_t chosen_ph = find_dev("/chosen"); - set_property( chosen_ph, "bootpath", spec, strlen(spec)+1 ); - set_property( chosen_ph, "bootargs", args, strlen(args)+1 ); -} - -/************************************************************************/ -/* pearpc booting */ -/************************************************************************/ - -static void -pearpc_startup( void ) -{ - const char *paths[] = { "hd:0,\\zImage.chrp", NULL }; - const char *args[] = { "root=/dev/hda2 console=ttyS0,115200", NULL }; - unsigned long entry; - int i, fd; - - for( i=0; paths[i]; i++ ) { - if( (fd=open_io(paths[i])) == -1 ) - continue; - (void) load_elf_rom( &entry, fd ); - close_io( fd ); - encode_bootpath( paths[i], args[i] ); - - update_nvram(); - transfer_control_to_elf( entry ); - /* won't come here */ - } - printk("*** Boot failure! No secondary bootloader specified ***\n"); -} - - -/************************************************************************/ -/* entry */ -/************************************************************************/ - -void -boot( void ) -{ - fword("update-chosen"); - pearpc_startup(); -} |