[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     ! 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