[BACK]Return to Locore.c CVS log [TXT][DIR] Up to [local] / sys / arch / sparc64 / stand / ofwboot

Annotation of sys/arch/sparc64/stand/ofwboot/Locore.c, Revision 1.1.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