Fix "map" OpenFirmware call. It does not return a value according to the
authorkettenis <kettenis@openbsd.org>
Mon, 17 Oct 2022 18:55:20 +0000 (18:55 +0000)
committerkettenis <kettenis@openbsd.org>
Mon, 17 Oct 2022 18:55:20 +0000 (18:55 +0000)
IEEE 1275 specification.  This should fix booting on machines that would
fail with something like:

OF_map_phys(3fe44000,8192,fed58000,-1) failed
no space for symbol table
Program terminated

Based on a diff provided by Harald Gutch (hgutch@netbsd).  Also see
NetBSD PR#56829.

There were (and still are) some questions about whether this diff breaks
the blade1.5k. However the failure in question might have been hardware
related and subsequent testing of the equivalent kernel diff (which
was just committed) was successful.  So committing this in the hope it
sticks to ease testing.

ok miod@

sys/arch/sparc64/stand/ofwboot/Locore.c

index d43e296..f8fcf5e 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: Locore.c,v 1.16 2018/12/31 11:44:57 claudio Exp $     */
+/*     $OpenBSD: Locore.c,v 1.17 2022/10/17 18:55:20 kettenis Exp $    */
 /*     $NetBSD: Locore.c,v 1.1 2000/08/20 14:58:36 mrg Exp $   */
 
 /*
@@ -46,7 +46,7 @@
 static vaddr_t OF_claim_virt(vaddr_t vaddr, int len);
 static vaddr_t OF_alloc_virt(int len, int align);
 static int OF_free_virt(vaddr_t vaddr, int len);
-static vaddr_t OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode);
+static int OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode);
 static paddr_t OF_alloc_phys(int len, int align);
 static int OF_free_phys(paddr_t paddr, int len);
 
@@ -438,7 +438,7 @@ OF_free_virt(vaddr_t vaddr, int len)
  *
  * Only works while the prom is actively mapping us.
  */
-static vaddr_t
+static int
 OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode)
 {
        struct {
@@ -452,13 +452,11 @@ OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode)
                cell_t vaddr;
                cell_t paddr_hi;
                cell_t paddr_lo;
-               cell_t status;
-               cell_t retaddr;
        } args;
 
        args.name = ADR2CELL("call-method");
        args.nargs = 7;
-       args.nreturns = 1;
+       args.nreturns = 0;
        args.method = ADR2CELL("map");
        args.ihandle = HDL2CELL(mmuh);
        args.mode = mode;
@@ -466,12 +464,7 @@ OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode)
        args.vaddr = ADR2CELL(vaddr);
        args.paddr_hi = HDQ2CELL_HI(paddr);
        args.paddr_lo = HDQ2CELL_LO(paddr);
-
-       if (openfirmware(&args) == -1)
-               return -1;
-       if (args.status)
-               return -1;
-       return (vaddr_t)args.retaddr;
+       return openfirmware(&args);
 }