Annotation of sys/arch/mvmeppc/dev/bugio.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bugio.c,v 1.7 2004/11/15 11:01:35 miod Exp $ */
2:
3: /*
4: * bug routines -- assumes that the necessary sections of memory
5: * are preserved.
6: */
7: #include <sys/param.h>
8: #include <sys/systm.h>
9: #include <sys/types.h>
10:
11: #include <machine/bugio.h>
12: #include <machine/cpu.h>
13:
14: int bugenvsz(void);
15:
16: /*
17: * BUG register preserving
18: */
19:
20: register_t sprg0, sprg1, sprg2, sprg3;
21: register_t bugsprg3;
22:
23: #define BUGCTXT(msr) \
24: do { \
25: msr = ppc_mfmsr(); \
26: sprg0 = ppc_mfsprg0(); \
27: sprg1 = ppc_mfsprg1(); \
28: sprg2 = ppc_mfsprg2(); \
29: sprg3 = ppc_mfsprg3(); \
30: ppc_mtsprg3(bugsprg3); \
31: ppc_mtmsr(((msr | PSL_IP) & ~(PSL_EE | PSL_IR | PSL_DR))); \
32: } while (0)
33:
34: #define OSCTXT(msr) \
35: do { \
36: bugsprg3 = ppc_mfsprg3(); \
37: ppc_mtsprg0(sprg0); \
38: ppc_mtsprg1(sprg1); \
39: ppc_mtsprg2(sprg2); \
40: ppc_mtsprg3(sprg3); \
41: ppc_mtmsr(msr); \
42: } while (0)
43:
44: /* Invoke the BUG */
45: #define MVMEPROM_CALL(x) \
46: __asm__ __volatile__ ("addi %r10,%r0," __STRING(x)); \
47: __asm__ __volatile__ ("sc");
48:
49: void
50: buginit()
51: {
52: bugsprg3 = ppc_mfsprg3();
53: }
54:
55:
56: /* BUG - query board routines */
57: void
58: mvmeprom_brdid(id)
59: struct mvmeprom_brdid *id;
60: {
61: unsigned long msr;
62:
63: BUGCTXT(msr);
64: MVMEPROM_CALL(MVMEPROM_BRD_ID);
65: asm volatile ("mr %0, 3": "=r" (id):);
66: OSCTXT(msr);
67: }
68:
69: /* returns 0 if no characters ready to read */
70: int
71: mvmeprom_getchar()
72: {
73: int ret;
74: unsigned long msr;
75:
76: BUGCTXT(msr);
77: MVMEPROM_CALL(MVMEPROM_INCHR);
78: asm volatile ("mr %0, 3" : "=r" (ret));
79: OSCTXT(msr);
80: return ret;
81: }
82:
83: /* returns 0 if no characters ready to read */
84: int
85: mvmeprom_instat()
86: {
87: int ret;
88: unsigned long msr;
89:
90: BUGCTXT(msr);
91: MVMEPROM_CALL(MVMEPROM_INSTAT);
92: asm volatile ("mr %0, 3" : "=r" (ret));
93: OSCTXT(msr);
94: return (!(ret & 0x4));
95: }
96:
97: void
98: mvmeprom_outln(start, end)
99: char *start, *end;
100: {
101: unsigned long msr;
102:
103: BUGCTXT(msr);
104: asm volatile ("mr 3, %0": : "r" (start));
105: asm volatile ("mr 4, %0": : "r" (end));
106: MVMEPROM_CALL(MVMEPROM_OUTLN);
107: OSCTXT(msr);
108: }
109:
110: void
111: mvmeprom_outstr(start, end)
112: char *start, *end;
113: {
114: unsigned long msr;
115:
116: BUGCTXT(msr);
117: asm volatile ("mr 3, %0": : "r" (start));
118: asm volatile ("mr 4, %0": : "r" (end));
119: MVMEPROM_CALL(MVMEPROM_OUTSTR);
120: OSCTXT(msr);
121: }
122:
123: void
124: mvmeprom_outchar(c)
125: int c;
126: {
127: unsigned long msr;
128:
129: BUGCTXT(msr);
130: asm volatile ("mr 3, %0" :: "r" (c));
131: MVMEPROM_CALL(MVMEPROM_OUTCHR);
132: OSCTXT(msr);
133: }
134:
135: /* BUG - return to bug routine */
136: void
137: mvmeprom_return()
138: {
139: unsigned long msr;
140:
141: BUGCTXT(msr);
142: MVMEPROM_CALL(MVMEPROM_RETURN);
143: OSCTXT(msr);
144: /*NOTREACHED*/
145: }
146:
147:
148: void
149: mvmeprom_rtc_rd(ptime)
150: struct mvmeprom_time *ptime;
151: {
152: unsigned long msr;
153:
154: BUGCTXT(msr);
155: asm volatile ("mr 3, %0": : "r" (ptime));
156: MVMEPROM_CALL(MVMEPROM_RTC_RD);
157: OSCTXT(msr);
158: }
159:
160: int
161: bugenvsz(void)
162: {
163: register int ret;
164: char tmp[1];
165: void *ptr = tmp;
166: unsigned long msr;
167:
168: BUGCTXT(msr);
169: asm volatile ("mr 3, %0": : "r" (ptr));
170: asm volatile ("li 5, 0x1");
171: asm volatile ("li 5, 0x0"); /* get size */
172: MVMEPROM_CALL(MVMEPROM_ENVIRON);
173: asm volatile ("mr %0, 3" : "=r" (ret));
174: OSCTXT(msr);
175:
176: return(ret);
177: }
178:
179: struct bugenviron bugenviron;
180: int bugenv_init = 0;
181: char bugenv_buf[1024];
182:
183: #ifdef BUG_DEBUG
184: void bug_printenv(void);
185:
186: void
187: bug_printenv(void)
188: {
189: printf("Startup Mode: %c\n", bugenviron.s.s_mode);
190: printf("Startup Menu: %c\n", bugenviron.s.s_menu);
191: printf("Remote Start: %c\n", bugenviron.s.s_remotestart);
192: printf("Probe Devs: %c\n", bugenviron.s.s_probe);
193: printf("Negate Sysfail: %c\n", bugenviron.s.s_negsysfail);
194: printf("Reset SCSI Bus: %c\n", bugenviron.s.s_resetscsi);
195: printf("Ignore CFNA Block: %c\n", bugenviron.s.s_nocfblk);
196: printf("SCSI sync method: %c\n", bugenviron.s.s_scsisync);
197:
198: printf("Auto Boot Enable: %c\n", bugenviron.b.b_enable);
199: printf("Auto Boot on power-up Only: %c\n", bugenviron.b.b_poweruponly);
200: printf("Auto Boot CLUN: %02x\n", bugenviron.b.b_clun);
201: printf("Auto Boot DLUN: %02x\n", bugenviron.b.b_dlun);
202: printf("Auto Boot Delay: %02x\n", bugenviron.b.b_delay);
203: printf("Auto Boot String: %s\n", bugenviron.b.b_string);
204:
205: printf("ROM Boot Enable: %c\n", bugenviron.r.r_enable);
206: printf("ROM Boot on power-up Only: %c\n", bugenviron.r.r_poweruponly);
207: printf("ROM Boot Scan VME bus: %c\n", bugenviron.r.r_bootvme);
208: printf("ROM Boot Delay: %02x\n", bugenviron.r.r_delay);
209: printf("ROM Boot Start: %08x\n", bugenviron.r.r_start);
210: printf("ROM Boot End: %08x\n", bugenviron.r.r_end);
211:
212: printf("Net Boot Enable: %c\n", bugenviron.n.n_enable);
213: printf("Net Boot on power-up Only: %c\n", bugenviron.n.n_poweruponly);
214: printf("Net Boot CLUN: %02x\n", bugenviron.n.n_clun);
215: printf("Net Boot DLUN: %02x\n", bugenviron.n.n_dlun);
216: printf("Net Boot Delay: %02x\n", bugenviron.n.n_delay);
217: printf("Net Boot CFG param pointer: %08x\n", bugenviron.n.n_param);
218:
219: printf("Memory Size Enable: %c\n", bugenviron.m.m_sizeenable);
220: printf("Memory Start: %08x\n", bugenviron.m.m_start);
221: printf("Memory End: %08x\n", bugenviron.m.m_end);
222:
223: Debugger();
224: }
225: #else
226: #define bug_printenv()
227: #endif
228:
229: struct bugenviron *
230: mvmeprom_envrd(void)
231: {
232: register int ret;
233: char *ptr, *dptr, *ptr_end;
234: int env_size = 0;
235: int pkt_typ, pkt_len;
236: unsigned long msr;
237:
238: env_size = bugenvsz();
239: bzero(&bugenviron, sizeof(struct bugenviron));
240: bzero(&bugenv_buf[0], 1024);
241: ptr = bugenv_buf;
242:
243: if (ptr != NULL) {
244:
245: BUGCTXT(msr);
246: asm volatile ("mr 3, %0": : "r" (ptr));
247: asm volatile ("mr 4, %0": : "r" (env_size));
248: asm volatile ("li 5, 0x2");
249: MVMEPROM_CALL(MVMEPROM_ENVIRON);
250: asm volatile ("mr %0, 3" : "=r" (ret));
251: OSCTXT(msr);
252:
253: if (ret)
254: return NULL;
255:
256: ptr_end = ptr + env_size;
257: while (ptr <= ptr_end) {
258: pkt_typ = *ptr++;
259: pkt_len = *ptr++;
260: dptr = ptr;
261: switch (pkt_typ) {
262: case BUG_ENV_END:
263: bugenv_init = 1; /* we have read the env */
264: bug_printenv();
265: return(&bugenviron);
266: break;
267: case BUG_STARTUP_PARAM:
268: /* All chars. We can use bcopy. */
269: bcopy(dptr, &bugenviron.s.s_mode, pkt_len);
270: break;
271: case BUG_AUTOBOOT_INFO:
272: /* All chars. We can use bcopy. */
273: bcopy(dptr, &bugenviron.b.b_enable, pkt_len);
274: break;
275: case BUG_ROMBOOT_INFO:
276: /* This data stream has integer info that
277: * may not be word aligned. We can't use
278: * bcopy for the whole struct in this
279: * instance. */
280: bcopy(dptr, &bugenviron.r.r_enable, 4);
281: dptr+=4;
282: bcopy(dptr, &bugenviron.r.r_start, 4);
283: dptr+=4;
284: bcopy(dptr, &bugenviron.r.r_end, 4);
285: break;
286: case BUG_NETBOOT_INFO:
287: /* This data stream has integer info that
288: * may not be word aligned. We can't use
289: * bcopy for the whole struct in this
290: * instance. */
291: bcopy(dptr, &bugenviron.n.n_enable, 5);
292: dptr+=5;
293: bcopy(dptr, &bugenviron.n.n_param, 4);
294: break;
295: case BUG_MEMORY_INFO:
296: bugenviron.m.m_sizeenable = *dptr++;
297: bcopy(dptr, &bugenviron.m.m_start, 4);
298: dptr+=4;
299: bcopy(dptr, &bugenviron.m.m_end, 4);
300: break;
301: }
302: ptr += pkt_len;
303: }
304: }
305: return NULL;
306: }
CVSweb