[OpenBIOS] [commit] r828 - in trunk/openbios-devel: arch/ppc/qemu arch/sparc32 arch/sparc64 arch/x86 forth/admin forth/debugging include/libopenbios libopenbios

Artyom Tarasenko atar4qemu at googlemail.com
Tue Aug 3 23:03:25 CEST 2010


2010/8/3 Blue Swirl <blauwirbel at gmail.com>:
> On Sun, Aug 1, 2010 at 3:13 PM, repository service <svn at openbios.org> wrote:
>> Author: mcayland
>> Date: Sun Aug  1 17:13:48 2010
>> New Revision: 828
>> URL: http://tracker.coreboot.org/trac/openbios/changeset/828
>>
>> Log:
>> Rework the OpenBIOS internals so that boot, load and init-program now all use the unified libopenbios loader code with improved
>> IEEE-1275 spec compliance.
>>
>> This patch implements the following:
>>
>> 1) Fix bootpath/bootargs handling so that default values are read from NVRAM, and allow multiple space-separated values to be
>> specified.
>> 2) With correct bootargs handling in place, move the ELF loader over to the new libopenbios unified loaders.
>> 3) Remove all the loader code from all architecture directories sine we don't need it anymore.
>> 4) Simplify the boot word so it invokes platform-specific code where required, then calls load and go as per the specification.
>>
>> Tested on all my available images for SPARC32, SPARC64 and PPC, and compile-tested on x86.
>
> This actually breaks NetBSD. For example 5.0.1 should work like this (r827):
> Configuration device id QEMU version 1 machine id 32
> UUID: 00000000-0000-0000-0000-000000000000
> CPUs: 1 x FMI,MB86904
> Welcome to OpenBIOS v1.0 built on Aug 2 2010 20:59
>  Type 'help' for detailed information
> [sparc] Booting file 'cdrom' with parameters ''
> Trying cdrom (/iommu/sbus/espdma/esp/sd at 2,0)
> Not a bootable ELF image
> Not a Linux kernel image
> Not a bootable a.out image
> Trying cdrom:d (/iommu/sbus/espdma/esp/sd at 2,0:d)

Is this correct? In the OBP  cdrom is an alias to the slice d (of the
sd at 6,0, but it's less important).

> Not a bootable ELF image
> Not a Linux kernel image
> Loading a.out image...
> Loaded 65536 bytes
> entry point is 0x4000
>
> Jumping to entry point 00004000 for type 00000005...
> switching to new context:
>>> NetBSD/sparc Secondary Boot, Revision 1.15
>>> (builds at b8.netbsd.org, Thu Jul 30 00:08:01 UTC 2009)
> Booting netbsd
> 1724008+846700+210280=0x2b7208
> OBP version 3, revision 2.25 (plugin rev 2)
> Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
>    2006, 2007, 2008, 2009
>    The NetBSD Foundation, Inc.  All rights reserved.
> Copyright (c) 1982, 1986, 1989, 1991, 1993
>    The Regents of the University of California.  All rights reserved.
>
> NetBSD 5.0.1 (INSTALL) #0: Thu Jul 30 00:20:16 UTC 2009
>        builds at b8.netbsd.org:/home/builds/ab/netbsd-5-0-1-RELEASE/sparc/200907292356Z-obj/home/builds/ab/netbsd-5-0-1-RELEASE/src/sys/arch/sparc/compile/INSTALL
> total memory = 127 MB
> avail memory = 121 MB
> bootpath: /iommu0/sbus0/espdma0/esp0/sd at 2,0:d
> mainbus0 (root): SUNW,SPARCstation-5: hostid 80000000
> cpu0 at mainbus0: MB86907 @ 170 MHz, L64804 FPU
> cpu0: 16K instruction (32 b/l), 8K data (16 b/l), 512K external (32
> b/l): cache enabled
> obio0 at mainbus0
> clock0 at obio0 slot 0 offset 0x200000: mk48t08
> timer0 at obio0 slot 0 offset 0xd00000: delay constant 1, frequency = 2000000 Hz
> zs0 at obio0 slot 0 offset 0x100000 level 12 softpri 6
> zstty0 at zs0 channel 0 (console i/o)
> zstty1 at zs0 channel 1
> zs1 at obio0 slot 0 offset 0x0 level 12 softpri 6
> kbd0 at zs1 channel 0: baud rate 76800
> ms0 at zs1 channel 1: baud rate 76800
> slavioconfig at obio0 slot 0 offset 0x800000 not configured
> fdc0 at obio0 slot 0 offset 0x400000 level 11: no drives attached
> auxreg0 at obio0 slot 0 offset 0x900000
> power0 at obio0 slot 0 offset 0x910000 level 2
> iommu0 at mainbus0 addr 0x10000000: version 0x5/0x0, page-size 4096, range 64MB
> sbus0 at iommu0: clock = 21.250 MHz
> tcx0 at sbus0 slot 3 offset 0x800000 level 5 (ipl 9): SUNW,tcx, 1024 x
> 768, id 0, rev 0, sense 0
> tcx0: attached to /dev/fb0
> dma0 at sbus0 slot 5 offset 0x8400000: DMA rev 2
> esp0 at dma0 slot 5 offset 0x8800000 level 4: ESP200, 40MHz, SCSI ID 7
> scsibus0 at esp0: 8 targets, 8 luns per target
> ledma0 at sbus0 slot 5 offset 0x8400010: DMA rev 2
> le0 at ledma0 slot 5 offset 0x8c00000 level 6: address 52:54:00:12:34:56
> le0: 8 receive buffers, 2 transmit buffers
> SUNW,CS4231 at sbus0 slot 4 offset 0xc000000 level 5 (ipl 9) not configured
> power-management at sbus0 slot 4 offset 0xa000000 not configured
> scsibus0: waiting 2 seconds for devices to settle...
> cd0 at scsibus0 target 2 lun 0: <QEMU, QEMU CD-ROM, 0.12> cdrom removable
> root on md0a dumps on md0b
> root file system type: ffs
> WARNING: clock gained 369 days
> WARNING: CHECK AND RESET THE DATE!
> Welcome to the NetBSD/sparc microroot setup utility.
>
> We've just completed the first stage of a two-stage procedure to load a
> fully functional NetBSD installation environment on your machine.  In the
> second stage which is to follow now, a set of additional installation
> utilities must be load from your NetBSD/sparc installation medium.
>
> This procedure supports one of the following media:
>
> 1) cdrom
> 2) tape
> 3) floppy
>
> But with r828, I get:
> Configuration device id QEMU version 1 machine id 32
> UUID: 00000000-0000-0000-0000-000000000000
> CPUs: 1 x FMI,MB86904
> Welcome to OpenBIOS v1.0 built on Aug 2 2010 20:59
>  Type 'help' for detailed information
>
> Trying cdrom...
> Not a bootable ELF image
> Not a bootable a.out image
> No valid state has been set by load or init-program
>
> 0 > boot cdrom:d
> Not a bootable ELF image
> Loading a.out image...
> Loaded 65536 bytes
> entry point is 0x4000
>
> Jumping to entry point 00004000 for type 00000005...
> switching to new context:
>>> NetBSD/sparc Secondary Boot, Revision 1.15
>>> (builds at b8.netbsd.org, Thu Jul 30 00:08:01 UTC 2009)
> Booting netbsd
> 1724008+846700+210280=0x2b7208
> OBP version 3, revision 2.25 (plugin rev 2)
> Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
>    2006, 2007, 2008, 2009
>    The NetBSD Foundation, Inc.  All rights reserved.
> Copyright (c) 1982, 1986, 1989, 1991, 1993
>    The Regents of the University of California.  All rights reserved.
>
> NetBSD 5.0.1 (INSTALL) #0: Thu Jul 30 00:20:16 UTC 2009
>        builds at b8.netbsd.org:/home/builds/ab/netbsd-5-0-1-RELEASE/sparc/200907292356Z-obj/home/builds/ab/netbsd-5-0-1-RELEASE/src/sys/arch/sparc/compile/INSTALL
> total memory = 127 MB
> avail memory = 121 MB
> bootpath:
> data fault: pc=0xf01651c8 addr=0x0 sfsr=126<PERR=0,LVL=1,AT=1,FT=1,FAV,OW>
> panic: kernel fault
> halted
>
> halt, power off
>
> There are two regressions: cdrom:d is not used and bootpath pointer
> seems to point to nowhere when NetBSD tries to use it.
>
> I don't see pathres-resolve-aliases being used, maybe that's a part of
> the problem.
>
>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk>
>>
>> Modified:
>>   trunk/openbios-devel/arch/ppc/qemu/init.c
>>   trunk/openbios-devel/arch/ppc/qemu/main.c
>>   trunk/openbios-devel/arch/sparc32/boot.c
>>   trunk/openbios-devel/arch/sparc32/boot.h
>>   trunk/openbios-devel/arch/sparc32/openbios.c
>>   trunk/openbios-devel/arch/sparc64/boot.c
>>   trunk/openbios-devel/arch/sparc64/linux_load.c
>>   trunk/openbios-devel/arch/sparc64/openbios.c
>>   trunk/openbios-devel/arch/x86/boot.c
>>   trunk/openbios-devel/forth/admin/userboot.fs
>>   trunk/openbios-devel/forth/debugging/client.fs
>>   trunk/openbios-devel/include/libopenbios/elf_load.h
>>   trunk/openbios-devel/include/libopenbios/sys_info.h
>>   trunk/openbios-devel/libopenbios/elf_load.c
>>   trunk/openbios-devel/libopenbios/load.c
>>
>> Modified: trunk/openbios-devel/arch/ppc/qemu/init.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/ppc/qemu/init.c   Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/ppc/qemu/init.c   Sun Aug  1 17:13:48 2010        (r828)
>> @@ -527,7 +527,7 @@
>>        uint64_t ram_size;
>>         const struct cpudef *cpu;
>>         char buf[64], qemu_uuid[16];
>> -        const char *stdin_path, *stdout_path;
>> +        const char *stdin_path, *stdout_path, *boot_path;
>>         uint32_t temp = 0;
>>
>>     ofmem_t *ofmem = ofmem_arch_get_private();
>> @@ -721,14 +721,17 @@
>>        uint16_t boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
>>        switch (boot_device) {
>>                case 'c':
>> -                       push_str("hd:");
>> +                       boot_path = "hd";
>>                        break;
>>                default:
>>                case 'd':
>> -                       push_str("cd:");
>> +                       boot_path = "cd";
>>                        break;
>>        }
>>
>> +       /* Setup default boot devices */
>> +       snprintf(buf, sizeof(buf), "%s:,\\\\:tbxi %s:,\\ppc\\bootinfo.txt", boot_path, boot_path);
>> +       push_str(buf);
>>        fword("encode-string");
>>        push_str("boot-device");
>>        fword("property");
>> @@ -737,16 +740,6 @@
>>         push_str("/chosen");
>>         fword("find-device");
>>
>> -       /* bootpath/bootargs should be set to NVRAM default */
>> -       fword("boot-device");
>> -       fword("encode-string");
>> -       push_str("bootpath");
>> -       fword("property");
>> -       fword("boot-args");
>> -       fword("encode-string");
>> -       push_str("bootargs");
>> -       fword("property");
>> -
>>         push_str(stdin_path);
>>         fword("open-dev");
>>         fword("encode-int");
>>
>> Modified: trunk/openbios-devel/arch/ppc/qemu/main.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/ppc/qemu/main.c   Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/ppc/qemu/main.c   Sun Aug  1 17:13:48 2010        (r828)
>> @@ -39,16 +39,9 @@
>>  #define ELF_DPRINTF(fmt, args...) SUBSYS_DPRINTF("ELF", fmt, ##args)
>>  #define NEWWORLD_DPRINTF(fmt, args...) SUBSYS_DPRINTF("NEWWORLD", fmt, ##args)
>>
>> -static void
>> -load(const char *path, const char *param)
>> -{
>> -       char buffer[1024];
>> -       if (param)
>> -               sprintf(buffer, "load %s %s", path, param);
>> -       else
>> -               sprintf(buffer, "load %s", path);
>> -       feval(buffer);
>> -}
>> +struct sys_info sys_info;
>> +void *elf_boot_notes = NULL;
>> +
>>
>>  static char *
>>  get_device( const char *path )
>> @@ -115,6 +108,7 @@
>>        return filename;
>>  }
>>
>> +
>>  static void
>>  encode_bootpath( const char *spec, const char *args )
>>  {
>> @@ -123,6 +117,9 @@
>>        char *filename, *directory;
>>        int partition;
>>
>> +       if (spec)
>> +               return;
>> +
>>        filename = get_filename(spec, &directory);
>>        partition = get_partition(spec);
>>        if (partition == -1)
>> @@ -138,28 +135,6 @@
>>                set_property( chosen_ph, "bootargs", args, strlen(args)+1 );
>>  }
>>
>> -/************************************************************************/
>> -/*     qemu booting                                                    */
>> -/************************************************************************/
>> -static void
>> -try_path(const char *device, const char* filename, const char *param)
>> -{
>> -    char path[1024];
>> -
>> -    if (filename)
>> -        snprintf(path, sizeof(path), "%s%s", device, filename);
>> -    else
>> -        snprintf(path, sizeof(path), "%s", device);
>> -
>> -    ELF_DPRINTF("Trying %s %s\n", path, param);
>> -
>> -    load(path, param);
>> -    update_nvram();
>> -    ELF_DPRINTF("Transfering control to %s %s\n",
>> -                path, param);
>> -    feval("go");
>> -}
>> -
>>  #define OLDWORLD_BOOTCODE_BASEADDR     (0x3f4000)
>>
>>  static void
>> @@ -203,46 +178,6 @@
>>         return;
>>  }
>>
>> -static void
>> -newworld_boot( void )
>> -{
>> -        static const char * const chrp_path[] = { "\\\\:tbxi",
>> -                                                 "ppc\\bootinfo.txt",
>> -                                                 NULL
>> -                                                 };
>> -        char *path = pop_fstr_copy(), *param;
>> -       int i;
>> -
>> -       param = strchr(path, ' ');
>> -       if (param) {
>> -               *param = 0;
>> -               param++;
>> -       }
>> -
>> -        if (!path) {
>> -            NEWWORLD_DPRINTF("Entering boot, no path\n");
>> -
>> -            /* No path specified, so grab defaults from /chosen */
>> -            push_str("bootpath");
>> -           push_str("/chosen");
>> -            fword("(find-dev)");
>> -            POP();
>> -            fword("get-package-property");
>> -            POP();
>> -            path = pop_fstr_copy();
>> -
>> -            for (i = 0; chrp_path[i]; i++)
>> -               try_path(path, chrp_path[i], param);
>> -
>> -        } else {
>> -            NEWWORLD_DPRINTF("Entering boot, path %s\n", path);
>> -           try_path(path, NULL, param);
>> -            for (i = 0; chrp_path[i]; i++)
>> -               try_path(path, chrp_path[i], param);
>> -        }
>> -       printk("*** Boot failure! No secondary bootloader specified ***\n");
>> -}
>> -
>>  static void check_preloaded_kernel(void)
>>  {
>>     unsigned long kernel_image, kernel_size;
>> @@ -281,8 +216,10 @@
>>        if (boot_device == 'm') {
>>                check_preloaded_kernel();
>>        }
>> +
>>        if (boot_device == 'c') {
>>                oldworld_boot();
>>        }
>> -       newworld_boot();
>> +
>> +       update_nvram();
>>  }
>>
>> Modified: trunk/openbios-devel/arch/sparc32/boot.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc32/boot.c    Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc32/boot.c    Sun Aug  1 17:13:48 2010        (r828)
>> @@ -9,10 +9,6 @@
>>  #include "libc/diskio.h"
>>  #include "libc/vsprintf.h"
>>  #include "libopenbios/sys_info.h"
>> -#include "libopenbios/elf_load.h"
>> -#include "libopenbios/aout_load.h"
>> -#include "libopenbios/fcode_load.h"
>> -#include "libopenbios/forth_load.h"
>>  #include "openprom.h"
>>  #include "boot.h"
>>  #include "context.h"
>> @@ -22,76 +18,16 @@
>>  uint32_t qemu_cmdline;
>>  uint32_t cmdline_size;
>>  char boot_device;
>> -static const void *romvec;
>> -
>> -static int try_path(const char *path, char *param)
>> -{
>> -       void *boot_notes = NULL;
>> -       ucell valid;
>> -       ihandle_t dev;
>> -
>> -        push_str(path);
>> -        fword("pathres-resolve-aliases");
>> -        bootpath = pop_fstr_copy();
>> -        printk("Trying %s (%s)\n", path, bootpath);
>> -
>> -       /* Open device used by this path */
>> -       dev = open_dev(path);
>> -
>> -#ifdef CONFIG_LOADER_ELF
>> -       /* ELF Boot loader */
>> -       elf_load(&sys_info, path, param, &boot_notes);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       /* Linux loader (not using Forth) */
>> -       linux_load(&sys_info, path, param);
>> -
>> -#ifdef CONFIG_LOADER_AOUT
>> -       /* a.out loader */
>> -       aout_load(&sys_info, dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FCODE
>> -       /* Fcode loader */
>> -       fcode_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FORTH
>> -       /* Forth loader */
>> -       forth_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       close_dev(dev);
>> -
>> -       return 0;
>> -
>> -
>> -start_image:
>> -       go();
>> -       return -1;
>> -}
>> -
>> +void *elf_boot_notes = NULL;
>> +const void *romvec;
>>
>>  void go(void)
>>  {
>>        ucell address, type, size;
>> -       int image_retval = 0;
>> +       int image_retval = 0, proplen, unit, part;
>> +       phandle_t chosen;
>> +       char *prop, *id, bootid;
>> +       static char bootpathbuf[128], bootargsbuf[128], buf[128];
>>
>>        /* Get the entry point and the type (see forth/debugging/client.fs) */
>>        feval("saved-program-state >sps.entry @");
>> @@ -101,6 +37,80 @@
>>        feval("saved-program-state >sps.file-size @");
>>        size = POP();
>>
>> +       /* SPARC32 is slightly unusual in that before invoking any loaders, a romvec array
>> +          needs to be set up to pass certain parameters using a C struct. Hence this section
>> +          extracts the relevant boot information and places it in obp_arg. */
>> +
>> +       /* Get the name of the selected boot device, along with the device and unit number */
>> +       chosen = find_dev("/chosen");
>> +       prop = get_property(chosen, "bootpath", &proplen);
>> +       strncpy(bootpathbuf, prop, proplen);
>> +       prop = get_property(chosen, "bootargs", &proplen);
>> +       strncpy(bootargsbuf, prop, proplen);
>> +
>> +       /* Set bootpath pointer used in romvec table to the bootpath */
>> +       bootpath = bootpathbuf;
>> +
>> +       if (!strcmp(bootpathbuf, "cdrom") || !strcmp(bootpathbuf, "disk")) {
>> +
>> +               /* Controller currently always 0 */
>> +               obp_arg.boot_dev_ctrl = 0;
>> +
>> +               /* Grab the device and unit number string (in form unit,partition) */
>> +               push_str(bootpathbuf);
>> +               feval("pathres-resolve-aliases ascii @ right-split 2drop");
>> +               id = pop_fstr_copy();
>> +
>> +               /* A bit hacky, but we have no atoi() function */
>> +               unit = id[0] - '0';
>> +               part = id[2] - '0';
>> +
>> +               obp_arg.boot_dev_unit = unit;
>> +               obp_arg.dev_partition = part;
>> +
>> +               /* Generate the "oldpath"
>> +                  FIXME: hardcoding this looks almost definitely wrong.
>> +                  With sd(0,2,0):b we get to see the solaris kernel though */
>> +               if (!strcmp(bootpathbuf, "disk"))
>> +                       bootid = 'd';
>> +               else
>> +                       bootid = 'b';
>> +
>> +               snprintf(buf, sizeof(buf), "sd(0,%d,%d):%c", unit, part, bootid);
>> +
>> +               obp_arg.boot_dev[0] = buf[0];
>> +               obp_arg.boot_dev[1] = buf[1];
>> +               obp_arg.argv[0] = buf;
>> +               obp_arg.argv[1] = bootargsbuf;
>> +
>> +       } else if (!strcmp(bootpathbuf, "floppy")) {
>> +
>> +               obp_arg.boot_dev_ctrl = 0;
>> +               obp_arg.boot_dev_unit = 0;
>> +               obp_arg.dev_partition = 0;
>> +
>> +               strcpy(buf, "fd()");
>> +
>> +               obp_arg.boot_dev[0] = buf[0];
>> +               obp_arg.boot_dev[1] = buf[1];
>> +               obp_arg.argv[0] = buf;
>> +               obp_arg.argv[1] = bootargsbuf;
>> +
>> +       } else if (!strcmp(bootpathbuf, "net")) {
>> +
>> +               obp_arg.boot_dev_ctrl = 0;
>> +               obp_arg.boot_dev_unit = 0;
>> +               obp_arg.dev_partition = 0;
>> +
>> +               strcpy(buf, "le()");
>> +
>> +               obp_arg.boot_dev[0] = buf[0];
>> +               obp_arg.boot_dev[1] = buf[1];
>> +               obp_arg.argv[0] = buf;
>> +               obp_arg.argv[1] = bootargsbuf;
>> +
>> +       }
>> +
>>        printk("\nJumping to entry point " FMT_ucellx " for type " FMT_ucellx "...\n", address, type);
>>
>>        switch (type) {
>> @@ -149,89 +159,9 @@
>>
>>  void boot(void)
>>  {
>> -        char *path = pop_fstr_copy(), *param, altpath[256];
>> -        const char *oldpath = path;
>> -        int unit = 0;
>> -       int result;
>> -
>> -       if(!path) {
>> -               /* No path specified, so grab defaults from firmware */
>> -               switch (boot_device) {
>> -               case 'a':
>> -                       path = strdup("/obio/SUNW,fdtwo");
>> -                       oldpath = "fd()";
>> -                       break;
>> -               case 'c':
>> -                       path = strdup("disk");
>> -                       oldpath = "sd(0,0,0):d";
>> -                       break;
>> -               default:
>> -               case 'd':
>> -                       path = strdup("cdrom");
>> -                       // FIXME: hardcoding this looks almost definitely wrong.
>> -                       // With sd(0,2,0):b we get to see the solaris kernel though
>> -                       //oldpath = "sd(0,2,0):d";
>> -                       oldpath = "sd(0,2,0):b";
>> -                       unit = 2;
>> -                       break;
>> -               case 'n':
>> -                       path = strdup("net");
>> -                       oldpath = "le()";
>> -                       break;
>> -               }
>> -       }
>> -
>> -        obp_arg.boot_dev_ctrl = 0;
>> -        obp_arg.boot_dev_unit = unit;
>> -        obp_arg.dev_partition = 0;
>> -        obp_arg.boot_dev[0] = oldpath[0];
>> -        obp_arg.boot_dev[1] = oldpath[1];
>> -        obp_arg.argv[0] = oldpath;
>> -        obp_arg.argv[1] = (void *)(long)qemu_cmdline;
>> -
>> -       param = strchr(path, ' ');
>> -       if(param) {
>> -               *param = '\0';
>> -               param++;
>> -       } else if (cmdline_size) {
>> -            param = (char *)qemu_cmdline;
>> -        } else {
>> -            push_str("boot-args");
>> -            push_str("/options");
>> -            fword("(find-dev)");
>> -            POP();
>> -            fword("get-package-property");
>> -            POP();
>> -            param = pop_fstr_copy();
>> -            obp_arg.argv[1] = param;
>> -        }
>> -
>> -        romvec = init_openprom();
>> -
>> +       /* Boot preloaded kernel */
>>         if (kernel_size) {
>>             printk("[sparc] Kernel already loaded\n");
>>             start_elf(kernel_image, (unsigned long)romvec);
>>         }
>> -
>> -       printk("[sparc] Booting file '%s' ", path);
>> -       if (param)
>> -               printk("with parameters '%s'\n", param);
>> -       else
>> -               printk("without parameters.\n");
>> -
>> -        result = try_path(path, param);
>> -       if (!result) {
>> -               push_str(path);
>> -               PUSH(':');
>> -               fword("left-split");
>> -               snprintf(altpath, sizeof(altpath), "%s:d", pop_fstr_copy());
>> -               POP();
>> -               POP();
>> -
>> -               try_path(altpath, param);
>> -       }
>> -
>> -       printk("Unsupported image format\n");
>> -
>> -       free(path);
>>  }
>>
>> Modified: trunk/openbios-devel/arch/sparc32/boot.h
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc32/boot.h    Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc32/boot.h    Sun Aug  1 17:13:48 2010        (r828)
>> @@ -30,6 +30,7 @@
>>
>>  // romvec.c
>>  extern struct linux_arguments_v0 obp_arg;
>> +extern const void *romvec;
>>
>>  // openbios.c
>>  extern int qemu_machine_type;
>>
>> Modified: trunk/openbios-devel/arch/sparc32/openbios.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc32/openbios.c        Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc32/openbios.c        Sun Aug  1 17:13:48 2010        (r828)
>> @@ -133,6 +133,9 @@
>>  static void
>>  arch_init( void )
>>  {
>> +       static char cmdline[128];
>> +       int size;
>> +
>>        openbios_init();
>>        modules_init();
>>         ob_init_mmu();
>> @@ -151,23 +154,57 @@
>>  #endif
>>        device_end();
>>
>> -       /* Set up other properties */
>> -        push_str("/chosen");
>> -        fword("find-device");
>> +       kernel_size = fw_cfg_read_i32(FW_CFG_KERNEL_SIZE);
>> +       if (kernel_size)
>> +               kernel_image = fw_cfg_read_i32(FW_CFG_KERNEL_ADDR);
>> +
>> +       size = fw_cfg_read_i32(FW_CFG_CMDLINE_SIZE);
>> +       if (size) {
>> +               fw_cfg_read(FW_CFG_CMDLINE_DATA, cmdline, size);
>> +       }
>> +       cmdline[size] = '\0';
>> +       qemu_cmdline = (uint32_t)cmdline;
>> +
>> +       boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
>> +
>> +       /* Initialiase openprom romvec */
>> +        romvec = init_openprom();
>> +
>> +       /* Setup nvram variables */
>> +       push_str("/options");
>> +       fword("find-device");
>> +
>> +       switch (boot_device) {
>> +       case 'a':
>> +               push_str("floppy");
>> +               break;
>> +       case 'c':
>> +               push_str("disk");
>> +               break;
>> +       default:
>> +       case 'd':
>> +               push_str("cdrom");
>> +               break;
>> +       case 'n':
>> +               push_str("net");
>> +               break;
>> +       }
>>
>> -       /* bootpath/bootargs should be set to NVRAM default */
>> -       fword("boot-device");
>>        fword("encode-string");
>> -       push_str("bootpath");
>> +       push_str("boot-device");
>>        fword("property");
>> -       fword("boot-args");
>> +
>> +       push_str("");
>>        fword("encode-string");
>> -       push_str("bootargs");
>> +       push_str("boot-file");
>>        fword("property");
>>
>> -       boot_device = fw_cfg_read_i16(FW_CFG_BOOT_DEVICE);
>> +       /* Set up other properties */
>> +        push_str("/chosen");
>> +        fword("find-device");
>>
>>        bind_func("platform-boot", boot );
>> +       bind_func("(go)", go );
>>  }
>>
>>  int openbios(void)
>>
>> Modified: trunk/openbios-devel/arch/sparc64/boot.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc64/boot.c    Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc64/boot.c    Sun Aug  1 17:13:48 2010        (r828)
>> @@ -8,10 +8,6 @@
>>  #include "libc/diskio.h"
>>  #include "libc/vsprintf.h"
>>  #include "libopenbios/sys_info.h"
>> -#include "libopenbios/elf_load.h"
>> -#include "libopenbios/aout_load.h"
>> -#include "libopenbios/fcode_load.h"
>> -#include "libopenbios/forth_load.h"
>>  #include "boot.h"
>>
>>  uint64_t kernel_image;
>> @@ -19,68 +15,10 @@
>>  uint64_t qemu_cmdline;
>>  uint64_t cmdline_size;
>>  char boot_device;
>> -void *boot_notes = NULL;
>> +void *elf_boot_notes = NULL;
>>  extern int sparc64_of_client_interface( int *params );
>>
>>
>> -static int try_path(const char *path, char *param)
>> -{
>> -       ucell valid;
>> -       ihandle_t dev;
>> -
>> -       /* Open device used by this path */
>> -       dev = open_dev(path);
>> -
>> -#ifdef CONFIG_LOADER_ELF
>> -       /* ELF Boot loader */
>> -       elf_load(&sys_info, path, param, &boot_notes);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       /* Linux loader (not using Forth) */
>> -       linux_load(&sys_info, path, param);
>> -
>> -#ifdef CONFIG_LOADER_AOUT
>> -       /* a.out loader */
>> -       aout_load(&sys_info, dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FCODE
>> -       /* Fcode loader */
>> -       fcode_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FORTH
>> -       /* Forth loader */
>> -       forth_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       close_dev(dev);
>> -
>> -       return 0;
>> -
>> -
>> -start_image:
>> -       go();
>> -       return -1;
>> -}
>> -
>> -
>>  void go(void)
>>  {
>>        ucell address, type, size;
>> @@ -99,7 +37,7 @@
>>        switch (type) {
>>                case 0x0:
>>                        /* Start ELF boot image */
>> -                       image_retval = start_elf(address, (uint64_t)&boot_notes);
>> +                       image_retval = start_elf(address, (uint64_t)&elf_boot_notes);
>>                        break;
>>
>>                case 0x1:
>> @@ -136,19 +74,23 @@
>>
>>  void boot(void)
>>  {
>> -       char *path=pop_fstr_copy(), *param;
>> -        char altpath[256];
>> -       int result;
>> +       char *path, *param;
>>
>> +       /* Copy the incoming path */
>> +       fword("2dup");
>> +       path = pop_fstr_copy();
>> +
>> +       /* Boot preloaded kernel */
>>         if (kernel_size) {
>>             void (*entry)(unsigned long p1, unsigned long p2, unsigned long p3,
>> -                          unsigned long p4, unsigned long p5);;
>> +                          unsigned long p4, unsigned long p5);
>>
>>             printk("[sparc64] Kernel already loaded\n");
>>             entry = (void *) (unsigned long)kernel_image;
>>             entry(0, 0, 0, 0, (unsigned long)&sparc64_of_client_interface);
>>         }
>>
>> +       /* Invoke Linux directly -- probably not supported */
>>        if(!path) {
>>             /* No path specified, so grab defaults from /chosen */
>>             push_str("bootpath");
>> @@ -175,20 +117,9 @@
>>             POP();
>>             param = pop_fstr_copy();
>>         }
>> -
>> -       printk("[sparc64] Booting file '%s' ", path);
>> -       if (param)
>> -               printk("with parameters '%s'\n", param);
>> -       else
>> -               printk("without parameters.\n");
>> -
>> -       result = try_path(path, param);
>> -       if (!result) {
>> -               snprintf(altpath, sizeof(altpath), "%s:f", path);
>> -               try_path(altpath, param);
>> -       }
>> -
>> -       printk("Unsupported image format\n");
>> +
>> +       /* Invoke platform-specific Linux loader */
>> +       linux_load(&sys_info, path, param);
>>
>>        free(path);
>>  }
>>
>> Modified: trunk/openbios-devel/arch/sparc64/linux_load.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc64/linux_load.c      Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc64/linux_load.c      Sun Aug  1 17:13:48 2010        (r828)
>> @@ -618,6 +618,12 @@
>>        return LOADER_NOT_SUPPORT;
>>     }
>>
>> +    debug("[sparc64] Booting kernel '%s' ", file);
>> +    if (cmdline)
>> +        debug("with parameters '%s'\n", cmdline);
>> +    else
>> +        debug("without parameters.\n");
>> +
>>     params = phys_to_virt(LINUX_PARAM_LOC);
>>     init_linux_params(params, &hdr);
>>     set_memory_size(params, info);
>>
>> Modified: trunk/openbios-devel/arch/sparc64/openbios.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/sparc64/openbios.c        Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/sparc64/openbios.c        Sun Aug  1 17:13:48 2010        (r828)
>> @@ -374,7 +374,6 @@
>>  {
>>     uint32_t size = 0;
>>     const struct cpudef *cpu;
>> -    const char *bootpath;
>>     char buf[256];
>>     uint32_t temp;
>>     uint64_t ram_size;
>> @@ -492,34 +491,15 @@
>>     push_str("boot-device");
>>     fword("property");
>>
>> -    /* Set up other properties */
>> -    push_str("/chosen");
>> -    fword("find-device");
>> -
>> -    if (boot_device == 'c')
>> -        bootpath = "disk:a";
>> -    else
>> -        bootpath = "cdrom:a";
>> -    push_str(bootpath);
>> -    fword("encode-string");
>> -    push_str("bootpath");
>> -    fword("property");
>> -
>> -    /* bootpath/bootargs should be set to NVRAM default */
>> -    fword("boot-device");
>> -    fword("encode-string");
>> -    push_str("bootpath");
>> -    fword("property");
>> -    fword("boot-args");
>> -    fword("encode-string");
>> -    push_str("bootargs");
>> -    fword("property");
>> -
>>     push_str(obio_cmdline);
>>     fword("encode-string");
>> -    push_str("bootargs");
>> +    push_str("boot-file");
>>     fword("property");
>>
>> +    /* Set up other properties */
>> +    push_str("/chosen");
>> +    fword("find-device");
>> +
>>     if (fw_cfg_read_i16(FW_CFG_NOGRAPHIC)) {
>>         stdin_path = stdout_path = "ttya";
>>     } else {
>>
>> Modified: trunk/openbios-devel/arch/x86/boot.c
>> ==============================================================================
>> --- trunk/openbios-devel/arch/x86/boot.c        Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/arch/x86/boot.c        Sun Aug  1 17:13:48 2010        (r828)
>> @@ -12,71 +12,9 @@
>>  #include "arch/common/nvram.h"
>>  #include "libc/diskio.h"
>>  #include "libopenbios/sys_info.h"
>> -#include "libopenbios/elf_load.h"
>> -#include "libopenbios/aout_load.h"
>> -#include "libopenbios/fcode_load.h"
>> -#include "libopenbios/forth_load.h"
>>  #include "boot.h"
>>
>> -void *boot_notes = NULL;
>> -
>> -static int try_path(const char *path, char *param)
>> -{
>> -       ucell valid;
>> -       ihandle_t dev;
>> -
>> -       /* Open device used by this path */
>> -       dev = open_dev(path);
>> -
>> -#ifdef CONFIG_LOADER_ELF
>> -       /* ELF Boot loader */
>> -       elf_load(&sys_info, path, param, &boot_notes);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       /* Linux loader (not using Forth) */
>> -       linux_load(&sys_info, path, param);
>> -
>> -#ifdef CONFIG_LOADER_AOUT
>> -       /* a.out loader */
>> -       aout_load(&sys_info, dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FCODE
>> -       /* Fcode loader */
>> -       fcode_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -#ifdef CONFIG_LOADER_FORTH
>> -       /* Forth loader */
>> -       forth_load(dev);
>> -       feval("state-valid @");
>> -       valid = POP();
>> -       if (valid)
>> -               goto start_image;
>> -#endif
>> -
>> -       close_dev(dev);
>> -
>> -       return 0;
>> -
>> -
>> -start_image:
>> -       go();
>> -       return -1;
>> -}
>> -
>> +void *elf_boot_notes = NULL;
>>
>>  void go(void)
>>  {
>> @@ -133,24 +71,6 @@
>>
>>  void boot(void)
>>  {
>> -       char *path=pop_fstr_copy(), *param;
>> -
>> -       if(!path) {
>> -               printk("[x86] Booting default not supported.\n");
>> -               return;
>> -       }
>> -
>> -       param = strchr(path, ' ');
>> -       if(param) {
>> -               *param = '\0';
>> -               param++;
>> -       }
>> -
>> -       printk("[x86] Booting file '%s' with parameters '%s'\n",path, param);
>> -
>> -       try_path(path, param);
>> -
>> -       printk("Unsupported image format\n");
>> -
>> -       free(path);
>> +       /* No platform-specific boot code */
>> +       return;
>>  }
>>
>> Modified: trunk/openbios-devel/forth/admin/userboot.fs
>> ==============================================================================
>> --- trunk/openbios-devel/forth/admin/userboot.fs        Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/forth/admin/userboot.fs        Sun Aug  1 17:13:48 2010        (r828)
>> @@ -1,16 +1,15 @@
>>  \ 7.4.3.5 User commands for booting
>>
>> -: boot    ( "{param-text}<cr>" -- )
>> -  (encode-bootpath)
>> +: boot         ( "{param-text}<cr>" -- )
>> +  (encode-bootpath)    \ Setup bootpath/bootargs
>>   s" platform-boot" $find if
>> -    execute
>> -  else
>> -    2drop
>> -    cr ." Booting " type cr
>> -    ."   ... not supported on this system." cr
>> +    execute            \ Execute platform-specific boot code
>>   then
>> +  $load                        \ load and go
>> +  go
>>  ;
>>
>> +
>>  \ : diagnostic-mode?    ( -- diag? )
>>  \   ;
>>
>>
>> Modified: trunk/openbios-devel/forth/debugging/client.fs
>> ==============================================================================
>> --- trunk/openbios-devel/forth/debugging/client.fs      Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/forth/debugging/client.fs      Sun Aug  1 17:13:48 2010        (r828)
>> @@ -58,24 +58,55 @@
>>  : (encode-bootpath) ( "{params}<cr>" -- bootpath-str bootpath-len)
>>   \ Parse the current input buffer of a load/boot command and set both
>>   \ the bootargs and bootpath properties as appropriate.
>> -  bl parse dup if
>> -    2dup encode-string
>> -    " /chosen" (find-dev) if
>> -      " bootpath" rot (property)
>> -    then
>> -  then
>> -  linefeed parse dup if
>> -    encode-string
>> -    " /chosen" (find-dev) if
>> -      " bootargs" rot (property)
>> -    then
>> -  else
>> +  cr
>> +
>> +  \ bootpath
>> +  bl parse dup 0= if
>> +
>> +    \ None specified. As per IEEE-1275 specification, search through each value
>> +    \ in boot-device and use the first that returns a valid ihandle on open.
>> +    s" boot-device" $find drop execute
>> +    bl left-split
>> +    begin
>> +      dup
>> +    while
>> +      2dup s" Trying " type type s" ..." type cr
>> +      2dup open-dev ?dup if
>> +        close-dev
>> +       2swap drop 0    \ Fake end of string so we exit loop
>> +      else
>> +        2drop
>> +        bl left-split
>> +      then
>> +    repeat
>>     2drop
>> +  else
>> +    0 0 2swap          \ Fake (empty) parse string
>> +  then
>> +
>> +  \ Set the bootpath property
>> +  2dup encode-string
>> +  " /chosen" (find-dev) if
>> +    " bootpath" rot (property)
>> +  then
>> +
>> +  \ bootargs
>> +  linefeed parse dup 0= if
>> +    \ None specified, use default from nvram
>> +    2drop s" boot-file" $find drop execute
>>   then
>> +
>> +  \ Set the bootargs property
>> +  encode-string
>> +  " /chosen" (find-dev) if
>> +    " bootargs" rot (property)
>> +  then
>> +
>> +  \ Remove the remaining string
>> +  2swap 2drop
>>  ;
>>
>> -: load    ( "{params}<cr>" -- )
>> -  (encode-bootpath)
>> +: $load ( devstr len )
>>   open-dev ( ihandle )
>>   dup 0= if
>>     drop
>> @@ -89,6 +120,11 @@
>>   init-program
>>   ;
>>
>> +: load    ( "{params}<cr>" -- )
>> +  (encode-bootpath)
>> +  $load
>> +;
>> +
>>  : dir ( "{paths}<cr>" -- )
>>   linefeed parse
>>   split-path-device
>>
>> Modified: trunk/openbios-devel/include/libopenbios/elf_load.h
>> ==============================================================================
>> --- trunk/openbios-devel/include/libopenbios/elf_load.h Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/include/libopenbios/elf_load.h Sun Aug  1 17:13:48 2010        (r828)
>> @@ -21,7 +21,7 @@
>>  #include "asm/elf.h"
>>  #include "libopenbios/sys_info.h"
>>
>> -extern int             elf_load(struct sys_info *info, const char *filename, const char *cmdline, void **boot_notes);
>> +extern int             elf_load(struct sys_info *info, ihandle_t dev, const char *cmdline, void **boot_notes);
>>  extern void            elf_init_program(void);
>>  extern int             is_elf(Elf_ehdr *ehdr);
>>  extern int             find_elf(Elf_ehdr *ehdr);
>>
>> Modified: trunk/openbios-devel/include/libopenbios/sys_info.h
>> ==============================================================================
>> --- trunk/openbios-devel/include/libopenbios/sys_info.h Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/include/libopenbios/sys_info.h Sun Aug  1 17:13:48 2010        (r828)
>> @@ -22,6 +22,7 @@
>>     unsigned long *dict_end;
>>  };
>>
>> +extern void *elf_boot_notes;
>>  extern struct sys_info sys_info;
>>
>>  void collect_elfboot_info(struct sys_info *info);
>>
>> Modified: trunk/openbios-devel/libopenbios/elf_load.c
>> ==============================================================================
>> --- trunk/openbios-devel/libopenbios/elf_load.c Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/libopenbios/elf_load.c Sun Aug  1 17:13:48 2010        (r828)
>> @@ -368,7 +368,7 @@
>>  }
>>
>>  int
>> -elf_load(struct sys_info *info, const char *filename, const char *cmdline, void **boot_notes)
>> +elf_load(struct sys_info *info, ihandle_t dev, const char *cmdline, void **boot_notes)
>>  {
>>     Elf_ehdr ehdr;
>>     Elf_phdr *phdr = NULL;
>> @@ -382,7 +382,7 @@
>>     /* Mark the saved-program-state as invalid */
>>     feval("0 state-valid !");
>>
>> -    fd = open_io(filename);
>> +    fd = open_ih(dev);
>>     if (!fd)
>>        goto out;
>>
>>
>> Modified: trunk/openbios-devel/libopenbios/load.c
>> ==============================================================================
>> --- trunk/openbios-devel/libopenbios/load.c     Sun Aug  1 16:37:04 2010        (r827)
>> +++ trunk/openbios-devel/libopenbios/load.c     Sun Aug  1 17:13:48 2010        (r828)
>> @@ -20,6 +20,10 @@
>>  #include "libopenbios/sys_info.h"
>>  #include "libopenbios/load.h"
>>
>> +#ifdef CONFIG_LOADER_ELF
>> +#include "libopenbios/elf_load.h"
>> +#endif
>> +
>>  #ifdef CONFIG_LOADER_AOUT
>>  #include "libopenbios/aout_load.h"
>>  #endif
>> @@ -38,6 +42,21 @@
>>  void load(ihandle_t dev)
>>  {
>>        /* Invoke the loaders on the specified device */
>> +       char *param;
>> +
>> +#ifdef CONFIG_LOADER_ELF
>> +
>> +       /* Grab the boot arguments */
>> +       push_str("bootargs");
>> +       push_str("/chosen");
>> +       fword("(find-dev)");
>> +       POP();
>> +       fword("get-package-property");
>> +       POP();
>> +       param = pop_fstr_copy();
>> +
>> +       elf_load(&sys_info, dev, param, &elf_boot_notes);
>> +#endif
>>
>>  #ifdef CONFIG_LOADER_AOUT
>>        aout_load(&sys_info, dev);
>>
>> --
>> OpenBIOS                 http://openbios.org/
>> Mailinglist:  http://lists.openbios.org/mailman/listinfo
>> Free your System - May the Forth be with you
>>
>
> --
> OpenBIOS                 http://openbios.org/
> Mailinglist:  http://lists.openbios.org/mailman/listinfo
> Free your System - May the Forth be with you



-- 
Regards,
Artyom Tarasenko

solaris/sparc under qemu blog: http://tyom.blogspot.com/



More information about the OpenBIOS mailing list