j
: Next unread message k
: Previous unread message j a
: Jump to all threads
j l
: Jump to MailingList overview
Author: mcayland Date: Wed Aug 7 23:22:47 2013 New Revision: 1199 URL: http://tracker.coreboot.org/trac/openbios/changeset/1199
Log: SPARC32: fix up old-style romvec parameters
Fixing up the generation of bootpath in r1167 exposed a bug since the romvec parameters were set depending upon hard-coded values of certain aliases in bootpath. As aliases are now expanded beforehand, the code to set the old-style parameters was no longer being called.
Rework the code to set these parameters based upon device name instead, and while we're there change the code to use the my-* words to get their information rather than string parsing.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk
Modified: trunk/openbios-devel/arch/sparc32/boot.c
Modified: trunk/openbios-devel/arch/sparc32/boot.c ============================================================================== --- trunk/openbios-devel/arch/sparc32/boot.c Sat Jul 27 15:17:49 2013 (r1198) +++ trunk/openbios-devel/arch/sparc32/boot.c Wed Aug 7 23:22:47 2013 (r1199) @@ -23,9 +23,9 @@ void go(void) { ucell address, type, size; - int image_retval = 0, proplen, unit, part; + int image_retval = 0, proplen, target, device; phandle_t chosen; - char *prop, *id, bootid; + char *prop, *id, *name; static char bootpathbuf[128], bootargsbuf[128], buf[128];
/* Get the entry point and the type (see forth/debugging/client.fs) */ @@ -53,40 +53,51 @@ bootpath = pop_fstr_copy(); printk("bootpath: %s\n", bootpath);
- if (!strncmp(bootpathbuf, "cd", 2) || !strncmp(bootpathbuf, "disk", 4)) { + /* Now do some work to get hold of the target, partition etc. */ + push_str(bootpathbuf); + feval("open-dev"); + feval("ihandle>boot-device-handle drop to my-self"); + push_str("name"); + fword("get-my-property"); + POP(); + name = pop_fstr_copy(); + + if (!strncmp(name, "sd", 2)) { + + /* + Old-style SunOS disk paths are given in the form: + + sd(c,t,d):s + + where: + c = controller (Nth controller in system, usually 0) + t = target (my-unit phys.hi) + d = device/LUN (my-unit phys.lo) + s = slice/partition (my-args) + */
/* 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"); + /* Get the target, device and slice */ + fword("my-unit"); + target = POP(); + device = POP(); + + fword("my-args"); 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 (!strncmp(bootpathbuf, "disk", 4)) { - bootid = 'd'; - } else { - bootid = 'b'; - } + snprintf(buf, sizeof(buf), "sd(0,%d,%d):%c", target, device, id[0]);
- snprintf(buf, sizeof(buf), "sd(0,%d,%d):%c", unit, part, bootid); + obp_arg.boot_dev_unit = target; + obp_arg.dev_partition = id[0] - 'a';
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 (!strncmp(bootpathbuf, "floppy", 6)) { + } else if (!strncmp(name, "SUNW,fdtwo", 10)) { obp_arg.boot_dev_ctrl = 0; obp_arg.boot_dev_unit = 0; @@ -99,7 +110,7 @@ obp_arg.argv[0] = buf; obp_arg.argv[1] = bootargsbuf;
- } else if (!strncmp(bootpathbuf, "net", 3)) { + } else if (!strncmp(name, "le", 2)) {
obp_arg.boot_dev_ctrl = 0; obp_arg.boot_dev_unit = 0;