Annotation of sys/arch/mvme88k/dev/bugio.c, Revision 1.1.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