[BACK]Return to prom.c CVS log [TXT][DIR] Up to [local] / sys / arch / aviion / aviion

Annotation of sys/arch/aviion/aviion/prom.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: prom.c,v 1.2 2006/05/20 11:57:02 miod Exp $   */
                      2:
                      3: /*
                      4:  * Copyright (c) 2006, Miodrag Vallat.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     18:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     19:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     20:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     21:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     22:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     23:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     24:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     25:  * POSSIBILITY OF SUCH DAMAGE.
                     26:  */
                     27:
                     28: #include <sys/param.h>
                     29: #include <sys/systm.h>
                     30:
                     31: #include <machine/asm_macro.h>
                     32: #include <machine/prom.h>
                     33:
                     34: register_t prom_vbr;                                   /* set in locore.S */
                     35:
                     36: /*
                     37:  * No locking is necessary, since we will only use the SCM routines
                     38:  * during startup, before any secondary CPU is started.
                     39:  */
                     40:
                     41: #define        SCM_DECL \
                     42:        register_t psr; \
                     43:        register_t ossr0, ossr1, ossr2, ossr3
                     44:
                     45: #define        SCM_CALL(x) \
                     46:        __asm__ __volatile__ ("or r9, r0, " __STRING(x));               \
                     47:        __asm__ __volatile__ ("tb0 0, r0, 496" :::                      \
                     48:            "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",             \
                     49:            "r9", "r10", "r11", "r12", "r13")
                     50:
                     51: #define        SCM_VBR() \
                     52:        __asm__ __volatile__ ("stcr %0, cr7" : : "r" (prom_vbr))
                     53:
                     54: #define        SCM_CONTEXT() \
                     55:        __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (ossr0)); \
                     56:        __asm__ __volatile__ ("ldcr %0, cr18" : "=r" (ossr1)); \
                     57:        __asm__ __volatile__ ("ldcr %0, cr19" : "=r" (ossr2)); \
                     58:        __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (ossr3))
                     59:
                     60: #define        OS_VBR() \
                     61:        __asm__ __volatile__ ("stcr r0, cr7")
                     62:
                     63: #define        OS_CONTEXT() \
                     64:        __asm__ __volatile__ ("stcr %0, cr17" : : "r" (ossr0)); \
                     65:        __asm__ __volatile__ ("stcr %0, cr18" : : "r" (ossr1)); \
                     66:        __asm__ __volatile__ ("stcr %0, cr19" : : "r" (ossr2)); \
                     67:        __asm__ __volatile__ ("stcr %0, cr20" : : "r" (ossr3))
                     68:
                     69: /* ==== */
                     70:
                     71: int
                     72: scm_cpuconfig(struct scm_cpuconfig *scc)
                     73: {
                     74:        SCM_DECL;
                     75:        int ret;
                     76:
                     77:        disable_interrupt(psr);
                     78:        SCM_CONTEXT();
                     79:        SCM_VBR();
                     80:        __asm__ __volatile__ ("or r2, r0, %0" : : "r" (scc));
                     81:        SCM_CALL(SCM_CPUCONFIG);
                     82:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
                     83:        OS_CONTEXT();
                     84:        OS_VBR();
                     85:        set_psr(psr);
                     86:
                     87:        return (ret);
                     88: }
                     89:
                     90: u_int
                     91: scm_cpuid()
                     92: {
                     93:        SCM_DECL;
                     94:        u_int ret;
                     95:
                     96:        disable_interrupt(psr);
                     97:        SCM_CONTEXT();
                     98:        SCM_VBR();
                     99:        SCM_CALL(SCM_CPUID);
                    100:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
                    101:        OS_CONTEXT();
                    102:        OS_VBR();
                    103:        set_psr(psr);
                    104:
                    105:        return (ret);
                    106: }
                    107:
                    108: int
                    109: scm_getc(void)
                    110: {
                    111:        SCM_DECL;
                    112:        u_int ret;
                    113:
                    114:        disable_interrupt(psr);
                    115:        SCM_CONTEXT();
                    116:        SCM_VBR();
                    117:        SCM_CALL(SCM_CHAR);
                    118:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
                    119:        OS_CONTEXT();
                    120:        OS_VBR();
                    121:        set_psr(psr);
                    122:
                    123:        return (ret & 0xff);
                    124: }
                    125:
                    126: void
                    127: scm_getenaddr(u_char *ea)
                    128: {
                    129:        SCM_DECL;
                    130:        char *addr;
                    131:
                    132:        disable_interrupt(psr);
                    133:        SCM_CONTEXT();
                    134:        SCM_VBR();
                    135:        SCM_CALL(SCM_COMMID);
                    136:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (addr));
                    137:        OS_CONTEXT();
                    138:        OS_VBR();
                    139:        set_psr(psr);
                    140:
                    141:        bcopy(addr, ea, 6);
                    142: }
                    143:
                    144: __dead void
                    145: scm_halt()
                    146: {
                    147:        SCM_DECL;
                    148:
                    149:        disable_interrupt(psr);
                    150:        SCM_CONTEXT();
                    151:        SCM_VBR();
                    152:        SCM_CALL(SCM_HALT);
                    153:        OS_CONTEXT();
                    154:        OS_VBR();
                    155:        set_psr(psr);
                    156:        for (;;) ;
                    157: }
                    158:
                    159: u_int
                    160: scm_memsize(int which)
                    161: {
                    162:        SCM_DECL;
                    163:        u_int msize;
                    164:
                    165:        disable_interrupt(psr);
                    166:        SCM_CONTEXT();
                    167:        SCM_VBR();
                    168:        __asm__ __volatile__ ("or r2, r0, %0" : : "r" (which));
                    169:        SCM_CALL(SCM_MSIZE);
                    170:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (msize));
                    171:        OS_CONTEXT();
                    172:        OS_VBR();
                    173:        set_psr(psr);
                    174:
                    175:        return (msize);
                    176: }
                    177:
                    178: /*
                    179:  * Does not accept parameters beyond a string because this would need extra
                    180:  * register constraints.
                    181:  */
                    182: void
                    183: scm_printf(const char *msg)
                    184: {
                    185:        SCM_DECL;
                    186:
                    187:        disable_interrupt(psr);
                    188:        SCM_CONTEXT();
                    189:        SCM_VBR();
                    190:        __asm__ __volatile__ ("or r2, r0, %0" : : "r" (msg));
                    191:        SCM_CALL(SCM_PTLINE);
                    192:        OS_CONTEXT();
                    193:        OS_VBR();
                    194:        set_psr(psr);
                    195: }
                    196:
                    197: u_int
                    198: scm_promver()
                    199: {
                    200:        SCM_DECL;
                    201:        u_int ret;
                    202:
                    203:        disable_interrupt(psr);
                    204:        SCM_CONTEXT();
                    205:        SCM_VBR();
                    206:        SCM_CALL(SCM_REVNUM);
                    207:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
                    208:        OS_CONTEXT();
                    209:        OS_VBR();
                    210:        set_psr(psr);
                    211:
                    212:        return (ret);
                    213: }
                    214:
                    215: void
                    216: scm_putc(int c)
                    217: {
                    218:        SCM_DECL;
                    219:
                    220:        disable_interrupt(psr);
                    221:        SCM_CONTEXT();
                    222:        SCM_VBR();
                    223:        __asm__ __volatile__ ("or r2, r0, %0" : : "r" (c));
                    224:        SCM_CALL(SCM_OCHAR);
                    225:        OS_CONTEXT();
                    226:        OS_VBR();
                    227:        set_psr(psr);
                    228: }
                    229:
                    230: void
                    231: scm_putcrlf()
                    232: {
                    233:        SCM_DECL;
                    234:
                    235:        disable_interrupt(psr);
                    236:        SCM_CONTEXT();
                    237:        SCM_VBR();
                    238:        SCM_CALL(SCM_OCRLF);
                    239:        OS_CONTEXT();
                    240:        OS_VBR();
                    241:        set_psr(psr);
                    242: }
                    243:
                    244: __dead void
                    245: scm_reboot(const char *cmdline)
                    246: {
                    247:        SCM_DECL;
                    248:
                    249:        disable_interrupt(psr);
                    250:        SCM_CONTEXT();
                    251:        SCM_VBR();
                    252:        __asm__ __volatile__ ("or r2, r0, %0" : : "r" (cmdline));
                    253:        SCM_CALL(SCM_REBOOT);
                    254:        OS_CONTEXT();
                    255:        OS_VBR();
                    256:        set_psr(psr);
                    257:        for (;;) ;
                    258: }
                    259:
                    260: u_int
                    261: scm_sysid()
                    262: {
                    263:        SCM_DECL;
                    264:        u_int ret;
                    265:
                    266:        disable_interrupt(psr);
                    267:        SCM_CONTEXT();
                    268:        SCM_VBR();
                    269:        SCM_CALL(SCM_SYSID);
                    270:        __asm__ __volatile__ ("or %0, r0, r2" : "=r" (ret));
                    271:        OS_CONTEXT();
                    272:        OS_VBR();
                    273:        set_psr(psr);
                    274:
                    275:        return (ret);
                    276: }

CVSweb