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