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