Annotation of qemu/roms/openbios/arch/ppc/pearpc/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *   Creation Date: <2004/08/28 18:38:22 greg>
                      3:  *   Time-stamp: <2004/08/28 18:38:22 greg>
                      4:  *
                      5:  *     <main.c>
                      6:  *
                      7:  *   Copyright (C) 2004 Greg Watson
                      8:  *
                      9:  *   Based on MOL specific code which is
                     10:  *   Copyright (C) 2002, 2003, 2004 Samuel Rydh ([email protected])
                     11:  *
                     12:  *   This program is free software; you can redistribute it and/or
                     13:  *   modify it under the terms of the GNU General Public License
                     14:  *   as published by the Free Software Foundation
                     15:  *
                     16:  */
                     17: 
                     18: 
                     19: #include "config.h"
                     20: #include "libopenbios/bindings.h"
                     21: #include "libopenbios/elfload.h"
                     22: #include "arch/common/nvram.h"
                     23: #include "libc/diskio.h"
                     24: #include "libc/vsprintf.h"
                     25: #include "pearpc/pearpc.h"
                     26: #include "libopenbios/ofmem.h"
                     27: 
                     28: static void
                     29: transfer_control_to_elf( unsigned long entry )
                     30: {
                     31:        extern void call_elf( unsigned long entry );
                     32:        printk("Starting ELF image at 0x%08lX\n", entry);
                     33:        call_elf( 0x400000 );
                     34:        //call_elf( entry );
                     35: 
                     36:        fatal_error("call_elf returned unexpectedly\n");
                     37: }
                     38: 
                     39: static int
                     40: load_elf_rom( unsigned long *entry, int fd )
                     41: {
                     42:        int i, lszz_offs, elf_offs;
                     43:        char buf[128], *addr;
                     44:        Elf_ehdr ehdr;
                     45:        Elf_phdr *phdr;
                     46:        size_t s;
                     47: 
                     48:        printk("Loading '%s'\n", get_file_path(fd));
                     49: 
                     50:        /* the ELF-image (usually) starts at offset 0x4000 */
                     51:        if( (elf_offs=find_elf(fd)) < 0 ) {
                     52:                printk("----> %s is not an ELF image\n", buf );
                     53:                exit(1);
                     54:        }
                     55:        if( !(phdr=elf_readhdrs(fd, elf_offs, &ehdr)) )
                     56:                fatal_error("elf_readhdrs failed\n");
                     57: 
                     58:        *entry = ehdr.e_entry;
                     59: 
                     60:        /* load segments. Compressed ROM-image assumed to be located immediately
                     61:         * after the last segment */
                     62:        lszz_offs = elf_offs;
                     63:        for( i=0; i<ehdr.e_phnum; i++ ) {
                     64:                /* p_memsz, p_flags */
                     65:                s = MIN( phdr[i].p_filesz, phdr[i].p_memsz );
                     66:                seek_io( fd, elf_offs + phdr[i].p_offset );
                     67: 
                     68:                /* printk("filesz: %08lX memsz: %08lX p_offset: %08lX p_vaddr %08lX\n",
                     69:                   phdr[i].p_filesz, phdr[i].p_memsz, phdr[i].p_offset,
                     70:                   phdr[i].p_vaddr ); */
                     71: 
                     72:                if( phdr[i].p_vaddr != phdr[i].p_paddr )
                     73:                        printk("WARNING: ELF segment virtual addr != physical addr\n");
                     74:                lszz_offs = MAX( lszz_offs, elf_offs + phdr[i].p_offset + phdr[i].p_filesz );
                     75:                if( !s )
                     76:                        continue;
                     77:                if( ofmem_claim( phdr[i].p_vaddr, phdr[i].p_memsz, 0 ) == -1 )
                     78:                        fatal_error("Claim failed!\n");
                     79: 
                     80:                addr = (char*)phdr[i].p_vaddr;
                     81:                if( read_io(fd, addr, s) != s )
                     82:                        fatal_error("read failed\n");
                     83: 
                     84: #if 0
                     85:                /* patch CODE segment */
                     86:                if( *entry >= phdr[i].p_vaddr && *entry < phdr[i].p_vaddr + s ) {
                     87:                        patch_newworld_rom( (char*)phdr[i].p_vaddr, s );
                     88:                        newworld_timer_hack( (char*)phdr[i].p_vaddr, s );
                     89:                }
                     90: #endif
                     91:                flush_icache_range( addr, addr+s );
                     92: 
                     93:                /*printk("ELF ROM-section loaded at %08lX (size %08lX)\n",
                     94:                   (unsigned long)phdr[i].p_vaddr, (unsigned long)phdr[i].p_memsz );*/
                     95:        }
                     96:        free( phdr );
                     97:        return lszz_offs;
                     98: }
                     99: 
                    100: 
                    101: static void
                    102: encode_bootpath( const char *spec, const char *args )
                    103: {
                    104:        phandle_t chosen_ph = find_dev("/chosen");
                    105:        set_property( chosen_ph, "bootpath", spec, strlen(spec)+1 );
                    106:        set_property( chosen_ph, "bootargs", args, strlen(args)+1 );
                    107: }
                    108: 
                    109: /************************************************************************/
                    110: /*     pearpc booting                                                  */
                    111: /************************************************************************/
                    112: 
                    113: static void
                    114: pearpc_startup( void )
                    115: {
                    116:        const char *paths[] = { "hd:0,\\zImage.chrp", NULL };
                    117:        const char *args[] = { "root=/dev/hda2 console=ttyS0,115200", NULL };
                    118:        unsigned long entry;
                    119:        int i, fd;
                    120: 
                    121:        for( i=0; paths[i]; i++ ) {
                    122:                if( (fd=open_io(paths[i])) == -1 )
                    123:                        continue;
                    124:                (void) load_elf_rom( &entry, fd );
                    125:                close_io( fd );
                    126:                encode_bootpath( paths[i], args[i] );
                    127: 
                    128:                update_nvram();
                    129:                transfer_control_to_elf( entry );
                    130:                /* won't come here */
                    131:        }
                    132:        printk("*** Boot failure! No secondary bootloader specified ***\n");
                    133: }
                    134: 
                    135: 
                    136: /************************************************************************/
                    137: /*     entry                                                           */
                    138: /************************************************************************/
                    139: 
                    140: void
                    141: boot( void )
                    142: {
                    143:        fword("update-chosen");
                    144:        pearpc_startup();
                    145: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.