Annotation of sys/arch/sparc64/stand/ofwboot/Locore.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: Locore.c,v 1.7 2007/01/16 14:39:57 tsi Exp $ */
! 2: /* $NetBSD: Locore.c,v 1.1 2000/08/20 14:58:36 mrg Exp $ */
! 3:
! 4: /*
! 5: * Copyright (C) 1995, 1996 Wolfgang Solfrank.
! 6: * Copyright (C) 1995, 1996 TooLs GmbH.
! 7: * All rights reserved.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. All advertising materials mentioning features or use of this software
! 18: * must display the following acknowledgement:
! 19: * This product includes software developed by TooLs GmbH.
! 20: * 4. The name of TooLs GmbH may not be used to endorse or promote products
! 21: * derived from this software without specific prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
! 24: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 25: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 26: * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
! 27: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! 28: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
! 29: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
! 30: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
! 31: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
! 32: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 33: */
! 34:
! 35: #include <lib/libsa/stand.h>
! 36: #include "openfirm.h"
! 37:
! 38: #include <machine/cpu.h>
! 39:
! 40: static vaddr_t OF_claim_virt(vaddr_t vaddr, int len);
! 41: static vaddr_t OF_alloc_virt(int len, int align);
! 42: static int OF_free_virt(vaddr_t vaddr, int len);
! 43: static vaddr_t OF_map_phys(paddr_t paddr, off_t size, vaddr_t vaddr, int mode);
! 44: static paddr_t OF_alloc_phys(int len, int align);
! 45: static int OF_free_phys(paddr_t paddr, int len);
! 46:
! 47: extern int openfirmware(void *);
! 48:
! 49: void setup(void);
! 50:
! 51: #if 0
! 52: #ifdef XCOFF_GLUE
! 53: asm (".text; .globl _entry; _entry: .long _start,0,0");
! 54: #endif
! 55:
! 56: __dead void
! 57: _start(vpd, res, openfirm, arg, argl)
! 58: void *vpd;
! 59: int res;
! 60: int (*openfirm)(void *);
! 61: char *arg;
! 62: int argl;
! 63: {
! 64: extern char etext[];
! 65:
! 66: #ifdef FIRMWORKSBUGS
! 67: syncicache((void *)RELOC, etext - (char *)RELOC);
! 68: #endif
! 69: openfirmware = openfirm; /* Save entry to Open Firmware */
! 70: setup();
! 71: main(arg, argl);
! 72: exit();
! 73: }
! 74: #endif
! 75:
! 76: __dead void
! 77: _rtt()
! 78: {
! 79: struct {
! 80: cell_t name;
! 81: cell_t nargs;
! 82: cell_t nreturns;
! 83: } args;
! 84:
! 85: args.name = ADR2CELL("exit");
! 86: args.nargs = 0;
! 87: args.nreturns = 0;
! 88: openfirmware(&args);
! 89: while (1); /* just in case */
! 90: }
! 91:
! 92: void
! 93: OF_enter()
! 94: {
! 95: struct {
! 96: cell_t name;
! 97: cell_t nargs;
! 98: cell_t nreturns;
! 99: } args;
! 100:
! 101: args.name = ADR2CELL("enter");
! 102: args.nargs = 0;
! 103: args.nreturns = 0;
! 104: openfirmware(&args);
! 105: }
! 106:
! 107: int
! 108: OF_finddevice(name)
! 109: char *name;
! 110: {
! 111: struct {
! 112: cell_t name;
! 113: cell_t nargs;
! 114: cell_t nreturns;
! 115: cell_t device;
! 116: cell_t phandle;
! 117: } args;
! 118:
! 119: args.name = ADR2CELL("finddevice");
! 120: args.nargs = 1;
! 121: args.nreturns = 1;
! 122: args.device = ADR2CELL(name);
! 123: if (openfirmware(&args) == -1)
! 124: return -1;
! 125: return args.phandle;
! 126: }
! 127:
! 128: int
! 129: OF_instance_to_package(ihandle)
! 130: int ihandle;
! 131: {
! 132: struct {
! 133: cell_t name;
! 134: cell_t nargs;
! 135: cell_t nreturns;
! 136: cell_t ihandle;
! 137: cell_t phandle;
! 138: } args;
! 139:
! 140: args.name = ADR2CELL("instance-to-package");
! 141: args.nargs = 1;
! 142: args.nreturns = 1;
! 143: args.ihandle = HDL2CELL(ihandle);
! 144: if (openfirmware(&args) == -1)
! 145: return -1;
! 146: return args.phandle;
! 147: }
! 148:
! 149: int
! 150: OF_getprop(handle, prop, buf, buflen)
! 151: int handle;
! 152: char *prop;
! 153: void *buf;
! 154: int buflen;
! 155: {
! 156: struct {
! 157: cell_t name;
! 158: cell_t nargs;
! 159: cell_t nreturns;
! 160: cell_t phandle;
! 161: cell_t prop;
! 162: cell_t buf;
! 163: cell_t buflen;
! 164: cell_t size;
! 165: } args;
! 166:
! 167: args.name = ADR2CELL("getprop");
! 168: args.nargs = 4;
! 169: args.nreturns = 1;
! 170: args.phandle = HDL2CELL(handle);
! 171: args.prop = ADR2CELL(prop);
! 172: args.buf = ADR2CELL(buf);
! 173: args.buflen = buflen;
! 174: if (openfirmware(&args) == -1)
! 175: return -1;
! 176: return args.size;
! 177: }
! 178:
! 179: #ifdef __notyet__ /* Has a bug on FirePower */
! 180: int
! 181: OF_setprop(handle, prop, buf, len)
! 182: u_int handle;
! 183: char *prop;
! 184: void *buf;
! 185: int len;
! 186: {
! 187: struct {
! 188: cell_t name;
! 189: cell_t nargs;
! 190: cell_t nreturns;
! 191: cell_t phandle;
! 192: cell_t prop;
! 193: cell_t buf;
! 194: cell_t len;
! 195: cell_t size;
! 196: } args;
! 197:
! 198: args.name = ADR2CELL("setprop");
! 199: args.nargs = 4;
! 200: args.nreturns = 1;
! 201: args.phandle = HDL2CELL(handle);
! 202: args.prop = ADR2CELL(prop);
! 203: args.buf = ADR2CELL(buf);
! 204: args.len = len;
! 205: if (openfirmware(&args) == -1)
! 206: return -1;
! 207: return args.size;
! 208: }
! 209: #endif
! 210:
! 211: int
! 212: OF_open(dname)
! 213: char *dname;
! 214: {
! 215: struct {
! 216: cell_t name;
! 217: cell_t nargs;
! 218: cell_t nreturns;
! 219: cell_t dname;
! 220: cell_t handle;
! 221: } args;
! 222:
! 223: args.name = ADR2CELL("open");
! 224: args.nargs = 1;
! 225: args.nreturns = 1;
! 226: args.dname = ADR2CELL(dname);
! 227: if (openfirmware(&args) == -1 ||
! 228: args.handle == 0)
! 229: return -1;
! 230: return args.handle;
! 231: }
! 232:
! 233: void
! 234: OF_close(handle)
! 235: int handle;
! 236: {
! 237: struct {
! 238: cell_t name;
! 239: cell_t nargs;
! 240: cell_t nreturns;
! 241: cell_t handle;
! 242: } args;
! 243:
! 244: args.name = ADR2CELL("close");
! 245: args.nargs = 1;
! 246: args.nreturns = 1;
! 247: args.handle = HDL2CELL(handle);
! 248: openfirmware(&args);
! 249: }
! 250:
! 251: int
! 252: OF_write(handle, addr, len)
! 253: int handle;
! 254: void *addr;
! 255: int len;
! 256: {
! 257: struct {
! 258: cell_t name;
! 259: cell_t nargs;
! 260: cell_t nreturns;
! 261: cell_t ihandle;
! 262: cell_t addr;
! 263: cell_t len;
! 264: cell_t actual;
! 265: } args;
! 266:
! 267: args.name = ADR2CELL("write");
! 268: args.nargs = 3;
! 269: args.nreturns = 1;
! 270: args.ihandle = HDL2CELL(handle);
! 271: args.addr = ADR2CELL(addr);
! 272: args.len = len;
! 273: if (openfirmware(&args) == -1)
! 274: return -1;
! 275: return args.actual;
! 276: }
! 277:
! 278: int
! 279: OF_read(handle, addr, len)
! 280: int handle;
! 281: void *addr;
! 282: int len;
! 283: {
! 284: struct {
! 285: cell_t name;
! 286: cell_t nargs;
! 287: cell_t nreturns;
! 288: cell_t ihandle;
! 289: cell_t addr;
! 290: cell_t len;
! 291: cell_t actual;
! 292: } args;
! 293:
! 294: args.name = ADR2CELL("read");
! 295: args.nargs = 3;
! 296: args.nreturns = 1;
! 297: args.ihandle = HDL2CELL(handle);
! 298: args.addr = ADR2CELL(addr);
! 299: args.len = len;
! 300: if (openfirmware(&args) == -1) {
! 301: return -1;
! 302: }
! 303: return args.actual;
! 304: }
! 305:
! 306: int
! 307: OF_seek(handle, pos)
! 308: int handle;
! 309: u_quad_t pos;
! 310: {
! 311: struct {
! 312: cell_t name;
! 313: cell_t nargs;
! 314: cell_t nreturns;
! 315: cell_t handle;
! 316: cell_t poshi;
! 317: cell_t poslo;
! 318: cell_t status;
! 319: } args;
! 320:
! 321: args.name = ADR2CELL("seek");
! 322: args.nargs = 3;
! 323: args.nreturns = 1;
! 324: args.handle = HDL2CELL(handle);
! 325: args.poshi = HDQ2CELL_HI(pos);
! 326: args.poslo = HDQ2CELL_LO(pos);
! 327: if (openfirmware(&args) == -1) {
! 328: return -1;
! 329: }
! 330: return args.status;
! 331: }
! 332:
! 333: void
! 334: OF_release(virt, size)
! 335: void *virt;
! 336: u_int size;
! 337: {
! 338: struct {
! 339: cell_t name;
! 340: cell_t nargs;
! 341: cell_t nreturns;
! 342: cell_t virt;
! 343: cell_t size;
! 344: } args;
! 345:
! 346: args.name = ADR2CELL("release");
! 347: args.nargs = 2;
! 348: args.nreturns = 0;
! 349: args.virt = ADR2CELL(virt);
! 350: args.size = size;
! 351: openfirmware(&args);
! 352: }
! 353:
! 354: int
! 355: OF_milliseconds()
! 356: {
! 357: struct {
! 358: cell_t name;
! 359: cell_t nargs;
! 360: cell_t nreturns;
! 361: cell_t ms;
! 362: } args;
! 363:
! 364: args.name = ADR2CELL("milliseconds");
! 365: args.nargs = 0;
! 366: args.nreturns = 1;
! 367: openfirmware(&args);
! 368: return args.ms;
! 369: }
! 370:
! 371: void
! 372: OF_chain(virt, size, entry, arg, len)
! 373: void *virt;
! 374: u_int size;
! 375: void (*entry)();
! 376: void *arg;
! 377: u_int len;
! 378: {
! 379: extern int64_t romp;
! 380: extern int debug;
! 381: struct {
! 382: cell_t name;
! 383: cell_t nargs;
! 384: cell_t nreturns;
! 385: cell_t virt;
! 386: cell_t size;
! 387: cell_t entry;
! 388: cell_t arg;
! 389: cell_t len;
! 390: } args;
! 391:
! 392: args.name = ADR2CELL("chain");
! 393: args.nargs = 5;
! 394: args.nreturns = 0;
! 395: args.virt = ADR2CELL(virt);
! 396: args.size = size;
! 397: args.entry = ADR2CELL(entry);
! 398: args.arg = ADR2CELL(arg);
! 399: args.len = len;
! 400: openfirmware(&args);
! 401: if (debug) {
! 402: printf("OF_chain: prom returned!\n");
! 403:
! 404: /* OK, firmware failed us. Try calling prog directly */
! 405: printf("Calling entry(0, %p, %x, %lx, %lx)\n", arg, len,
! 406: (unsigned long)romp, (unsigned long)romp);
! 407: }
! 408: entry(0, arg, len, (unsigned long)romp, (unsigned long)romp);
! 409: panic("OF_chain: kernel returned!");
! 410: __asm("ta 2" : :);
! 411: }
! 412:
! 413: static u_int stdin;
! 414: static u_int stdout;
! 415: static u_int mmuh = -1;
! 416: static u_int memh = -1;
! 417:
! 418: void
! 419: setup()
! 420: {
! 421: u_int chosen;
! 422:
! 423: if ((chosen = OF_finddevice("/chosen")) == -1)
! 424: _rtt();
! 425: if (OF_getprop(chosen, "stdin", &stdin, sizeof(stdin)) != sizeof(stdin)
! 426: || OF_getprop(chosen, "stdout", &stdout, sizeof(stdout)) != sizeof(stdout)
! 427: || OF_getprop(chosen, "mmu", &mmuh, sizeof(mmuh)) != sizeof(mmuh)
! 428: || OF_getprop(chosen, "memory", &memh, sizeof(memh)) != sizeof(memh))
! 429: _rtt();
! 430: }
! 431:
! 432: /*
! 433: * The following need either the handle to memory or the handle to the MMU.
! 434: */
! 435:
! 436: /*
! 437: * Grab some address space from the prom
! 438: *
! 439: * Only works while the prom is actively mapping us.
! 440: */
! 441: static vaddr_t
! 442: OF_claim_virt(vaddr, len)
! 443: vaddr_t vaddr;
! 444: int len;
! 445: {
! 446: struct {
! 447: cell_t name;
! 448: cell_t nargs;
! 449: cell_t nreturns;
! 450: cell_t method;
! 451: cell_t ihandle;
! 452: cell_t align;
! 453: cell_t len;
! 454: cell_t vaddr;
! 455: cell_t status;
! 456: cell_t retaddr;
! 457: } args;
! 458:
! 459: #ifdef __notyet
! 460: if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
! 461: printf("OF_claim_virt: cannot get mmuh\r\n");
! 462: return -1LL;
! 463: }
! 464: #endif
! 465: args.name = ADR2CELL("call-method");
! 466: args.nargs = 5;
! 467: args.nreturns = 2;
! 468: args.method = ADR2CELL("claim");
! 469: args.ihandle = HDL2CELL(mmuh);
! 470: args.align = 0;
! 471: args.len = len;
! 472: args.vaddr = ADR2CELL(vaddr);
! 473: if (openfirmware(&args) != 0)
! 474: return -1LL;
! 475: return (vaddr_t)args.retaddr;
! 476: }
! 477:
! 478: /*
! 479: * Request some address space from the prom
! 480: *
! 481: * Only works while the prom is actively mapping us.
! 482: */
! 483: static vaddr_t
! 484: OF_alloc_virt(len, align)
! 485: int len;
! 486: int align;
! 487: {
! 488: int retaddr=-1;
! 489: struct {
! 490: cell_t name;
! 491: cell_t nargs;
! 492: cell_t nreturns;
! 493: cell_t method;
! 494: cell_t ihandle;
! 495: cell_t align;
! 496: cell_t len;
! 497: cell_t status;
! 498: cell_t retaddr;
! 499: } args;
! 500:
! 501: #ifdef __notyet
! 502: if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
! 503: printf("OF_alloc_virt: cannot get mmuh\r\n");
! 504: return -1LL;
! 505: }
! 506: #endif
! 507: args.name = ADR2CELL("call-method");
! 508: args.nargs = 4;
! 509: args.nreturns = 2;
! 510: args.method = ADR2CELL("claim");
! 511: args.ihandle = HDL2CELL(mmuh);
! 512: args.align = align;
! 513: args.len = len;
! 514: args.retaddr = ADR2CELL(&retaddr);
! 515: if (openfirmware(&args) != 0)
! 516: return -1LL;
! 517: return (vaddr_t)args.retaddr;
! 518: }
! 519:
! 520: /*
! 521: * Release some address space to the prom
! 522: *
! 523: * Only works while the prom is actively mapping us.
! 524: */
! 525: static int
! 526: OF_free_virt(vaddr, len)
! 527: vaddr_t vaddr;
! 528: int len;
! 529: {
! 530: struct {
! 531: cell_t name;
! 532: cell_t nargs;
! 533: cell_t nreturns;
! 534: cell_t method;
! 535: cell_t ihandle;
! 536: cell_t len;
! 537: cell_t vaddr;
! 538: } args;
! 539:
! 540: #ifdef __notyet
! 541: if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
! 542: printf("OF_free_virt: cannot get mmuh\r\n");
! 543: return -1;
! 544: }
! 545: #endif
! 546: args.name = ADR2CELL("call-method");
! 547: args.nargs = 4;
! 548: args.nreturns = 0;
! 549: args.method = ADR2CELL("release");
! 550: args.ihandle = HDL2CELL(mmuh);
! 551: args.vaddr = ADR2CELL(vaddr);
! 552: args.len = len;
! 553: return openfirmware(&args);
! 554: }
! 555:
! 556:
! 557: /*
! 558: * Have prom map in some memory
! 559: *
! 560: * Only works while the prom is actively mapping us.
! 561: */
! 562: static vaddr_t
! 563: OF_map_phys(paddr, size, vaddr, mode)
! 564: paddr_t paddr;
! 565: off_t size;
! 566: vaddr_t vaddr;
! 567: int mode;
! 568: {
! 569: struct {
! 570: cell_t name;
! 571: cell_t nargs;
! 572: cell_t nreturns;
! 573: cell_t method;
! 574: cell_t ihandle;
! 575: cell_t mode;
! 576: cell_t size;
! 577: cell_t vaddr;
! 578: cell_t paddr_hi;
! 579: cell_t paddr_lo;
! 580: cell_t status;
! 581: cell_t retaddr;
! 582: } args;
! 583:
! 584: #ifdef __notyet
! 585: if (mmuh == -1 && ((mmuh = get_mmu_handle()) == -1)) {
! 586: printf("OF_map_phys: cannot get mmuh\r\n");
! 587: return 0LL;
! 588: }
! 589: #endif
! 590: args.name = ADR2CELL("call-method");
! 591: args.nargs = 7;
! 592: args.nreturns = 1;
! 593: args.method = ADR2CELL("map");
! 594: args.ihandle = HDL2CELL(mmuh);
! 595: args.mode = mode;
! 596: args.size = size;
! 597: args.vaddr = ADR2CELL(vaddr);
! 598: args.paddr_hi = HDQ2CELL_HI(paddr);
! 599: args.paddr_lo = HDQ2CELL_LO(paddr);
! 600:
! 601: if (openfirmware(&args) == -1)
! 602: return -1;
! 603: if (args.status)
! 604: return -1;
! 605: return (vaddr_t)args.retaddr;
! 606: }
! 607:
! 608:
! 609: /*
! 610: * Request some RAM from the prom
! 611: *
! 612: * Only works while the prom is actively mapping us.
! 613: */
! 614: static paddr_t
! 615: OF_alloc_phys(len, align)
! 616: int len;
! 617: int align;
! 618: {
! 619: struct {
! 620: cell_t name;
! 621: cell_t nargs;
! 622: cell_t nreturns;
! 623: cell_t method;
! 624: cell_t ihandle;
! 625: cell_t align;
! 626: cell_t len;
! 627: cell_t status;
! 628: cell_t phys_hi;
! 629: cell_t phys_lo;
! 630: } args;
! 631:
! 632: #ifdef __notyet
! 633: if (memh == -1 && ((memh = get_memory_handle()) == -1)) {
! 634: printf("OF_alloc_phys: cannot get memh\r\n");
! 635: return -1LL;
! 636: }
! 637: #endif
! 638: args.name = ADR2CELL("call-method");
! 639: args.nargs = 4;
! 640: args.nreturns = 3;
! 641: args.method = ADR2CELL("claim");
! 642: args.ihandle = HDL2CELL(memh);
! 643: args.align = align;
! 644: args.len = len;
! 645: if (openfirmware(&args) != 0)
! 646: return -1LL;
! 647: return (paddr_t)CELL2HDQ(args.phys_hi, args.phys_lo);
! 648: }
! 649:
! 650:
! 651: /*
! 652: * Free some RAM to prom
! 653: *
! 654: * Only works while the prom is actively mapping us.
! 655: */
! 656: static int
! 657: OF_free_phys(phys, len)
! 658: paddr_t phys;
! 659: int len;
! 660: {
! 661: struct {
! 662: cell_t name;
! 663: cell_t nargs;
! 664: cell_t nreturns;
! 665: cell_t method;
! 666: cell_t ihandle;
! 667: cell_t len;
! 668: cell_t phys_hi;
! 669: cell_t phys_lo;
! 670: } args;
! 671:
! 672: #ifdef __notyet
! 673: if (memh == -1 && ((memh = get_memory_handle()) == -1)) {
! 674: printf("OF_free_phys: cannot get memh\r\n");
! 675: return -1;
! 676: }
! 677: #endif
! 678: args.name = ADR2CELL("call-method");
! 679: args.nargs = 5;
! 680: args.nreturns = 0;
! 681: args.method = ADR2CELL("release");
! 682: args.ihandle = HDL2CELL(memh);
! 683: args.len = len;
! 684: args.phys_hi = HDQ2CELL_HI(phys);
! 685: args.phys_lo = HDQ2CELL_LO(phys);
! 686: return openfirmware(&args);
! 687: }
! 688:
! 689:
! 690: /*
! 691: * Claim virtual memory -- does not map it in.
! 692: */
! 693:
! 694: void *
! 695: OF_claim(virt, size, align)
! 696: void *virt;
! 697: u_int size;
! 698: u_int align;
! 699: {
! 700: #define SUNVMOF
! 701: #ifndef SUNVMOF
! 702: struct {
! 703: cell_t name;
! 704: cell_t nargs;
! 705: cell_t nreturns;
! 706: cell_t virt;
! 707: cell_t size;
! 708: cell_t align;
! 709: cell_t baseaddr;
! 710: } args;
! 711:
! 712:
! 713: args.name = ADR2CELL("claim");
! 714: args.nargs = 3;
! 715: args.nreturns = 1;
! 716: args.virt = virt;
! 717: args.size = size;
! 718: args.align = align;
! 719: if (openfirmware(&args) == -1)
! 720: return (void *)-1;
! 721: return (void *)args.baseaddr;
! 722: #else
! 723: /*
! 724: * Sun Ultra machines run the firmware with VM enabled,
! 725: * so you need to handle allocating and mapping both
! 726: * virtual and physical memory. Ugh.
! 727: */
! 728:
! 729: paddr_t paddr;
! 730: void * newvirt = NULL;
! 731:
! 732: if (virt == NULL) {
! 733: virt = (void *)OF_alloc_virt(size, align);
! 734: if (virt == (void *)-1LL) {
! 735: printf("OF_alloc_virt(%d,%d) failed w/%x\n",
! 736: size, align, virt);
! 737: return virt;
! 738: }
! 739: } else {
! 740: newvirt = (void *)OF_claim_virt((vaddr_t)virt, size);
! 741: if (newvirt == (void *)-1LL) {
! 742: printf("OF_claim_virt(%x,%d) failed w/%x\n",
! 743: virt, size, newvirt);
! 744: return newvirt;
! 745: }
! 746: virt = newvirt;
! 747: }
! 748: if ((paddr = OF_alloc_phys(size, align)) == (paddr_t)-1LL) {
! 749: printf("OF_alloc_phys(%d,%d) failed\n", size, align);
! 750: OF_free_virt((vaddr_t)virt, size);
! 751: return (void *)-1LL;
! 752: }
! 753: if (OF_map_phys(paddr, size, (vaddr_t)virt, -1) == -1) {
! 754: printf("OF_map_phys(%x,%d,%x,%d) failed\n",
! 755: paddr, size, virt, -1);
! 756: OF_free_phys((paddr_t)paddr, size);
! 757: OF_free_virt((vaddr_t)virt, size);
! 758: return (void *)-1LL;
! 759: }
! 760: return virt;
! 761: #endif
! 762: }
! 763:
! 764:
! 765: void
! 766: putchar(c)
! 767: int c;
! 768: {
! 769: char ch = c;
! 770:
! 771: if (c == '\n')
! 772: putchar('\r');
! 773: OF_write(stdout, &ch, 1);
! 774: }
! 775:
! 776: int
! 777: getchar()
! 778: {
! 779: unsigned char ch = '\0';
! 780: int l;
! 781:
! 782: while ((l = OF_read(stdin, &ch, 1)) != 1)
! 783: if (l != -2 && l != 0)
! 784: return -1;
! 785: return ch;
! 786: }
CVSweb