Could you send me a compiled ofwboot?

        -Otto

On Fri, Nov 11, 2011 at 04:51:24PM +0100, Martin Pieuchot wrote:

> On 05/11/11(Sat) 07:59, Otto Moerbeek wrote:
> > On Sat, Nov 05, 2011 at 09:50:33AM +0900, Joel Rees wrote:
> > 
> > > > 
> > > > Did some tests.
> > > > 
> > > > Results so far: booting ofwboot and kernel from HFS+ is indeed busted
> > > > 
> > > > 4.1 ofwboot + 5.0 bsd.rd DOES boot
> > > > 
> > > > 4.2 - 5.0 ofwboot do not work
> > > > 
> > > > Loading ofwboot itself does work, only loading the kernel fails.
> 
> diff below rewrites the parsing of the arguments taken from the Open
> Firmware and fixes the issue for me, can you confirm you can boot an
> OpenBSD kernel located on you HFS partition with it? 
> 
> 0 > boot hd:,ofwboot bsd.rd
> 
> 
> Even with this diff, it is not yet possible to boot an OpenBSD kernel
> from a HFS partition if you already have a valid OpenBSD partition, but
> I've an other diff for that.
> 
> Martin
> 
> 
> Index: ofdev.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/macppc/stand/ofdev.c,v
> retrieving revision 1.18
> diff -u -p -r1.18 ofdev.c
> --- ofdev.c   10 Apr 2011 09:58:19 -0000      1.18
> +++ ofdev.c   11 Nov 2011 15:45:40 -0000
> @@ -49,25 +49,42 @@
>  
>  extern char bootdev[];
>  
> +char opened_name[256];
> +
>  /*
>   * this function is passed [device specifier]:[kernel]
>   * however a device specifier may contain a ':'
>   */
> -char namebuf[256];
> -static char *
> -filename(char *str)
> +static int
> +parsename(char *str, int *ppart, char **file)
>  {
>       char *cp;
> -     char savec;
> +     int aliases;
> +     size_t len;
>  
>       cp = strrchr(str, ':');
>       if (cp == NULL)
> -             return NULL;
> +             return 1;
> +
> +     *cp++ = 0;
> +
> +     if ((aliases = OF_finddevice("/aliases")) == -1 ||
> +         OF_getprop(aliases, str, opened_name, sizeof opened_name) < 0)
> +             strlcpy(opened_name, str, sizeof opened_name);
> +
> +     len = strlcat(opened_name, ":", sizeof opened_name);
> +     if (len >= sizeof opened_name)
> +             return 1;
> +
> +     if (*cp != '/')
> +             strlcat(opened_name, "/", sizeof opened_name);
> +
> +     if (strlcat(opened_name, cp, sizeof opened_name) >= sizeof opened_name)
> +             return 1;
>  
> -     savec = *cp;
> -     *cp = 0;
> -     strlcpy(namebuf, cp+1, sizeof namebuf);
> -     return namebuf;
> +     *file = opened_name + len + 1;
> +
> +     return 0;
>  }
>  
>  static int
> @@ -144,8 +161,6 @@ static struct of_dev ofdev = {
>       -1,
>  };
>  
> -char opened_name[256];
> -
>  static u_long
>  get_long(p)
>       const void *p;
> @@ -280,7 +295,6 @@ search_label(devp, off, buf, lp, off0)
>  int
>  devopen(struct open_file *of, const char *name, char **file)
>  {
> -     char *cp;
>       char fname[256];
>       char buf[DEV_BSIZE];
>       struct disklabel label;
> @@ -294,18 +308,8 @@ devopen(struct open_file *of, const char
>               return EPERM;
>  
>       strlcpy(fname, name, sizeof fname);
> -     cp = filename(fname);
> -     if (cp == NULL)
> +     if (parsename(fname, &part, file))
>               return ENOENT;
> -     strlcpy(buf, cp, sizeof buf);
> -     strlcpy(opened_name, fname, sizeof opened_name);
> -
> -     strlcat(opened_name, ":", sizeof opened_name);
> -     if (*buf != '/')
> -             strlcat(opened_name, "/", sizeof opened_name);
> -
> -     strlcat(opened_name, buf, sizeof opened_name);
> -     *file = opened_name + strlen(fname) + 1;
>  
>       if ((handle = OF_finddevice(fname)) == -1)
>               return ENOENT;

Reply via email to