Annotation of sys/arch/mvme88k/dev/bugio.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: bugio.c,v 1.17 2006/05/02 21:43:08 miod Exp $ */
! 2: /* Copyright (c) 1998 Steve Murphree, Jr. */
! 3:
! 4: #include <sys/param.h>
! 5: #include <sys/systm.h>
! 6:
! 7: #include <machine/asm_macro.h>
! 8: #include <machine/bugio.h>
! 9: #include <machine/prom.h>
! 10:
! 11: register_t ossr0, ossr1, ossr2, ossr3;
! 12: register_t bugsr3;
! 13:
! 14: unsigned long bugvec[2], sysbugvec[2];
! 15:
! 16: void bug_vector(void);
! 17: void sysbug_vector(void);
! 18:
! 19: #ifdef MULTIPROCESSOR
! 20: #include <sys/lock.h>
! 21: __cpu_simple_lock_t bug_lock = __SIMPLELOCK_UNLOCKED;
! 22: #define BUG_LOCK() __cpu_simple_lock(&bug_lock)
! 23: #define BUG_UNLOCK() __cpu_simple_unlock(&bug_lock)
! 24: #else
! 25: #define BUG_LOCK() do { } while (0)
! 26: #define BUG_UNLOCK() do { } while (0)
! 27: #endif
! 28:
! 29: #define MVMEPROM_CALL(x) \
! 30: __asm__ __volatile__ ("or r9,r0," __STRING(x)); \
! 31: __asm__ __volatile__ ("tb0 0,r0,496" ::: \
! 32: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", \
! 33: "r9", "r10", "r11", "r12", "r13")
! 34:
! 35: void
! 36: bug_vector()
! 37: {
! 38: unsigned long *vbr;
! 39:
! 40: __asm__ __volatile__ ("ldcr %0, cr7" : "=r" (vbr));
! 41: vbr[2 * MVMEPROM_VECTOR + 0] = bugvec[0];
! 42: vbr[2 * MVMEPROM_VECTOR + 1] = bugvec[1];
! 43: }
! 44:
! 45: void
! 46: sysbug_vector()
! 47: {
! 48: unsigned long *vbr;
! 49:
! 50: __asm__ __volatile__ ("ldcr %0, cr7" : "=r" (vbr));
! 51: vbr[2 * MVMEPROM_VECTOR + 0] = sysbugvec[0];
! 52: vbr[2 * MVMEPROM_VECTOR + 1] = sysbugvec[1];
! 53: }
! 54:
! 55: #define BUGCTXT() \
! 56: { \
! 57: BUG_LOCK(); \
! 58: disable_interrupt(psr); /* paranoia */ \
! 59: bug_vector(); \
! 60: __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (ossr0)); \
! 61: __asm__ __volatile__ ("ldcr %0, cr18" : "=r" (ossr1)); \
! 62: __asm__ __volatile__ ("ldcr %0, cr19" : "=r" (ossr2)); \
! 63: __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (ossr3)); \
! 64: \
! 65: __asm__ __volatile__ ("stcr %0, cr20" :: "r"(bugsr3)); \
! 66: }
! 67:
! 68: #define OSCTXT() \
! 69: { \
! 70: __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (bugsr3)); \
! 71: \
! 72: __asm__ __volatile__ ("stcr %0, cr17" :: "r"(ossr0)); \
! 73: __asm__ __volatile__ ("stcr %0, cr18" :: "r"(ossr1)); \
! 74: __asm__ __volatile__ ("stcr %0, cr19" :: "r"(ossr2)); \
! 75: __asm__ __volatile__ ("stcr %0, cr20" :: "r"(ossr3)); \
! 76: sysbug_vector(); \
! 77: set_psr(psr); \
! 78: BUG_UNLOCK(); \
! 79: }
! 80:
! 81: void
! 82: bugpcrlf(void)
! 83: {
! 84: u_int psr;
! 85:
! 86: BUGCTXT();
! 87: MVMEPROM_CALL(MVMEPROM_OUTCRLF);
! 88: OSCTXT();
! 89: }
! 90:
! 91: void
! 92: buginit()
! 93: {
! 94: __asm__ __volatile__ ("ldcr %0, cr20" : "=r" (bugsr3));
! 95: }
! 96:
! 97: char
! 98: buginchr(void)
! 99: {
! 100: u_int psr;
! 101: int ret;
! 102:
! 103: BUGCTXT();
! 104: MVMEPROM_CALL(MVMEPROM_INCHR);
! 105: __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret));
! 106: OSCTXT();
! 107: return ((char)ret & 0xff);
! 108: }
! 109:
! 110: void
! 111: bugoutchr(int c)
! 112: {
! 113: u_int psr;
! 114:
! 115: BUGCTXT();
! 116: __asm__ __volatile__ ("or r2,r0,%0" : : "r" (c));
! 117: MVMEPROM_CALL(MVMEPROM_OUTCHR);
! 118: OSCTXT();
! 119: }
! 120:
! 121: void
! 122: bugreturn(void)
! 123: {
! 124: u_int psr;
! 125:
! 126: BUGCTXT();
! 127: MVMEPROM_CALL(MVMEPROM_EXIT);
! 128: OSCTXT();
! 129: }
! 130:
! 131: void
! 132: bugbrdid(struct mvmeprom_brdid *id)
! 133: {
! 134: u_int psr;
! 135: struct mvmeprom_brdid *ptr;
! 136:
! 137: BUGCTXT();
! 138: MVMEPROM_CALL(MVMEPROM_GETBRDID);
! 139: __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ptr));
! 140: OSCTXT();
! 141:
! 142: bcopy(ptr, id, sizeof(struct mvmeprom_brdid));
! 143: }
! 144:
! 145: void
! 146: bugdiskrd(struct mvmeprom_dskio *dio)
! 147: {
! 148: u_int psr;
! 149:
! 150: BUGCTXT();
! 151: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (dio));
! 152: MVMEPROM_CALL(MVMEPROM_DSKRD);
! 153: OSCTXT();
! 154: }
! 155:
! 156: #ifdef MULTIPROCESSOR
! 157:
! 158: /*
! 159: * Ask the BUG to start a particular cpu at our provided address.
! 160: */
! 161: int
! 162: spin_cpu(cpuid_t cpu, vaddr_t address)
! 163: {
! 164: u_int psr;
! 165: int ret;
! 166:
! 167: BUGCTXT();
! 168: __asm__ __volatile__ ("or r2, r0, %0" : : "r" (cpu));
! 169: __asm__ __volatile__ ("or r3, r0, %0" : : "r" (address));
! 170: MVMEPROM_CALL(MVMEPROM_FORKMPU);
! 171: __asm__ __volatile__ ("or %0,r0,r2" : "=r" (ret));
! 172: OSCTXT();
! 173:
! 174: return (ret);
! 175: }
! 176:
! 177: #endif /* MULTIPROCESSOR */
CVSweb