|
|
1.1 ! root 1: /* ! 2: ! 3: Copyright 1990,1991,1992 Eric R. Smith. All rights reserved. ! 4: ! 5: */ ! 6: ! 7: ! 8: ! 9: /* MiNT debugging output routines */ ! 10: ! 11: /* also, ksprintf is put here, for lack of any better place to put it */ ! 12: ! 13: ! 14: ! 15: #include "mint.h" ! 16: ! 17: #include <stdarg.h> ! 18: ! 19: ! 20: ! 21: static void VDEBUGOUT P_((char *, va_list)); ! 22: ! 23: ! 24: ! 25: /* ! 26: ! 27: * ksprintf implements a very crude sprintf() function that provides only ! 28: ! 29: * what MiNT needs... ! 30: ! 31: * ! 32: ! 33: * NOTE: this sprintf probably doesn't conform to any standard at ! 34: ! 35: * all. It's only use in life is that it won't overflow fixed ! 36: ! 37: * size buffers (i.e. it won't try to write more than SPRINTF_MAX ! 38: ! 39: * characters into a string) ! 40: ! 41: */ ! 42: ! 43: ! 44: ! 45: static int ! 46: ! 47: PUTC(p, c, cnt, width) ! 48: ! 49: char *p; ! 50: ! 51: int c; ! 52: ! 53: int *cnt; ! 54: ! 55: int width; ! 56: ! 57: { ! 58: ! 59: int put = 1; ! 60: ! 61: ! 62: ! 63: if (*cnt <= 0) return 0; ! 64: ! 65: *p++ = c; ! 66: ! 67: *cnt -= 1; ! 68: ! 69: while (*cnt > 0 && --width > 0) { ! 70: ! 71: *p++ = ' '; ! 72: ! 73: *cnt -= 1; ! 74: ! 75: put++; ! 76: ! 77: } ! 78: ! 79: return put; ! 80: ! 81: } ! 82: ! 83: ! 84: ! 85: static int ! 86: ! 87: PUTS(p, s, cnt, width) ! 88: ! 89: char *p, *s; ! 90: ! 91: int *cnt; ! 92: ! 93: int width; ! 94: ! 95: { ! 96: ! 97: int put = 0; ! 98: ! 99: ! 100: ! 101: while (*cnt > 0 && *s) { ! 102: ! 103: *p++ = *s++; ! 104: ! 105: put++; ! 106: ! 107: *cnt -= 1; ! 108: ! 109: width--; ! 110: ! 111: } ! 112: ! 113: while (width-- > 0 && *cnt > 0) { ! 114: ! 115: *p++ = ' '; ! 116: ! 117: put++; ! 118: ! 119: *cnt -= 1; ! 120: ! 121: } ! 122: ! 123: return put; ! 124: ! 125: } ! 126: ! 127: ! 128: ! 129: static int ! 130: ! 131: PUTL(p, u, base, cnt, width, fill_char) ! 132: ! 133: char *p; ! 134: ! 135: unsigned long u; ! 136: ! 137: int base; ! 138: ! 139: int *cnt; ! 140: ! 141: int width; ! 142: ! 143: int fill_char; ! 144: ! 145: { ! 146: ! 147: int put = 0; ! 148: ! 149: static char obuf[32]; ! 150: ! 151: char *t; ! 152: ! 153: ! 154: ! 155: t = obuf; ! 156: ! 157: ! 158: ! 159: do { ! 160: ! 161: *t++ = "0123456789abcdef"[u % base]; ! 162: ! 163: u /= base; ! 164: ! 165: width--; ! 166: ! 167: } while (u > 0); ! 168: ! 169: ! 170: ! 171: while (width-- > 0 && *cnt > 0) { ! 172: ! 173: *p++ = fill_char; ! 174: ! 175: put++; ! 176: ! 177: *cnt -= 1; ! 178: ! 179: } ! 180: ! 181: while (*cnt > 0 && t != obuf) { ! 182: ! 183: *p++ = *--t; ! 184: ! 185: put++; ! 186: ! 187: *cnt -= 1; ! 188: ! 189: } ! 190: ! 191: return put; ! 192: ! 193: } ! 194: ! 195: ! 196: ! 197: int ! 198: ! 199: vksprintf(buf, fmt, args) ! 200: ! 201: char *buf; ! 202: ! 203: const char *fmt; ! 204: ! 205: va_list args; ! 206: ! 207: { ! 208: ! 209: char *p = buf, c, fill_char; ! 210: ! 211: char *s_arg; ! 212: ! 213: int i_arg; ! 214: ! 215: long l_arg; ! 216: ! 217: int cnt; ! 218: ! 219: int width, long_flag; ! 220: ! 221: ! 222: ! 223: cnt = SPRINTF_MAX - 1; ! 224: ! 225: while( (c = *fmt++) != 0 ) { ! 226: ! 227: if (c != '%') { ! 228: ! 229: p += PUTC(p, c, &cnt, 1); ! 230: ! 231: continue; ! 232: ! 233: } ! 234: ! 235: c = *fmt++; ! 236: ! 237: width = 0; ! 238: ! 239: long_flag = 0; ! 240: ! 241: fill_char = ' '; ! 242: ! 243: if (c == '0') fill_char = '0'; ! 244: ! 245: while (c && isdigit(c)) { ! 246: ! 247: width = 10*width + (c-'0'); ! 248: ! 249: c = *fmt++; ! 250: ! 251: } ! 252: ! 253: if (c == 'l' || c == 'L') { ! 254: ! 255: long_flag = 1; ! 256: ! 257: c = *fmt++; ! 258: ! 259: } ! 260: ! 261: if (!c) break; ! 262: ! 263: ! 264: ! 265: switch (c) { ! 266: ! 267: case '%': ! 268: ! 269: p += PUTC(p, c, &cnt, width); ! 270: ! 271: break; ! 272: ! 273: case 'c': ! 274: ! 275: i_arg = va_arg(args, int); ! 276: ! 277: p += PUTC(p, i_arg, &cnt, width); ! 278: ! 279: break; ! 280: ! 281: case 's': ! 282: ! 283: s_arg = va_arg(args, char *); ! 284: ! 285: p += PUTS(p, s_arg, &cnt, width); ! 286: ! 287: break; ! 288: ! 289: case 'd': ! 290: ! 291: if (long_flag) { ! 292: ! 293: l_arg = va_arg(args, long); ! 294: ! 295: } else { ! 296: ! 297: l_arg = va_arg(args, int); ! 298: ! 299: } ! 300: ! 301: if (l_arg < 0) { ! 302: ! 303: p += PUTC(p, '-', &cnt, 1); ! 304: ! 305: width--; ! 306: ! 307: l_arg = -l_arg; ! 308: ! 309: } ! 310: ! 311: p += PUTL(p, l_arg, 10, &cnt, width, fill_char); ! 312: ! 313: break; ! 314: ! 315: case 'o': ! 316: ! 317: if (long_flag) { ! 318: ! 319: l_arg = va_arg(args, long); ! 320: ! 321: } else { ! 322: ! 323: l_arg = va_arg(args, unsigned int); ! 324: ! 325: } ! 326: ! 327: p += PUTL(p, l_arg, 8, &cnt, width, fill_char); ! 328: ! 329: break; ! 330: ! 331: case 'x': ! 332: ! 333: if (long_flag) { ! 334: ! 335: l_arg = va_arg(args, long); ! 336: ! 337: } else { ! 338: ! 339: l_arg = va_arg(args, unsigned int); ! 340: ! 341: } ! 342: ! 343: p += PUTL(p, l_arg, 16, &cnt, width, fill_char); ! 344: ! 345: break; ! 346: ! 347: case 'u': ! 348: ! 349: if (long_flag) { ! 350: ! 351: l_arg = va_arg(args, long); ! 352: ! 353: } else { ! 354: ! 355: l_arg = va_arg(args, unsigned int); ! 356: ! 357: } ! 358: ! 359: p += PUTL(p, l_arg, 10, &cnt, width, fill_char); ! 360: ! 361: break; ! 362: ! 363: ! 364: ! 365: } ! 366: ! 367: } ! 368: ! 369: *p = 0; ! 370: ! 371: return (p - buf); ! 372: ! 373: } ! 374: ! 375: ! 376: ! 377: int ! 378: ! 379: ksprintf(buf, fmt) ! 380: ! 381: char *buf; ! 382: ! 383: const char *fmt; ! 384: ! 385: { ! 386: ! 387: va_list args; ! 388: ! 389: int foo; ! 390: ! 391: ! 392: ! 393: va_start(args, fmt); ! 394: ! 395: foo = vksprintf(buf, fmt, args); ! 396: ! 397: va_end(args); ! 398: ! 399: return foo; ! 400: ! 401: } ! 402: ! 403: ! 404: ! 405: int debug_level = 0; /* how much debugging info should we print? */ ! 406: ! 407: int out_device = 2; /* BIOS device to write errors to */ ! 408: ! 409: ! 410: ! 411: /* ! 412: ! 413: * out_next[i] is the out_device value to use when the current ! 414: ! 415: * device is i and the user hits F3. ! 416: ! 417: * Cycle is CON -> PRN -> AUX -> MIDI -> 6 -> 7 -> 8 -> 9 -> CON ! 418: ! 419: * (Note: BIOS devices 6-8 exist on Mega STe and TT, 9 on TT.) ! 420: ! 421: * ! 422: ! 423: * out_device and this table are exported to bios.c and used here in HALT(). ! 424: ! 425: */ ! 426: ! 427: ! 428: ! 429: /* 0 1 2 3 4 5 6 7 8 9 */ ! 430: ! 431: char out_next[] = { 1, 3, 0, 6, 0, 0, 7, 8, 9, 2 }; ! 432: ! 433: ! 434: ! 435: void ! 436: ! 437: debug_ws(s) ! 438: ! 439: char *s; ! 440: ! 441: { ! 442: ! 443: while (*s) { ! 444: ! 445: (void)Bconout(out_device, *s); ! 446: ! 447: if (*s == '\n' && out_device != 0 && Bconstat(out_device)) { ! 448: ! 449: (void)Bconin(out_device); ! 450: ! 451: while (!Bconstat(out_device)) ; ! 452: ! 453: (void)Bconin(out_device); ! 454: ! 455: } ! 456: ! 457: s++; ! 458: ! 459: } ! 460: ! 461: } ! 462: ! 463: ! 464: ! 465: static void ! 466: ! 467: VDEBUGOUT(s, args) ! 468: ! 469: char *s; ! 470: ! 471: va_list args; ! 472: ! 473: { ! 474: ! 475: char buf[SPRINTF_MAX]; ! 476: ! 477: ! 478: ! 479: ksprintf(buf, "pid %d (%s): ", curproc->pid, curproc->name); ! 480: ! 481: debug_ws(buf); ! 482: ! 483: vksprintf(buf, s, args); ! 484: ! 485: debug_ws(buf); ! 486: ! 487: debug_ws("\r\n"); ! 488: ! 489: } ! 490: ! 491: ! 492: ! 493: void TRACE(s) ! 494: ! 495: char *s; ! 496: ! 497: { ! 498: ! 499: va_list args; ! 500: ! 501: ! 502: ! 503: if (debug_level > 1) { ! 504: ! 505: va_start(args, s); ! 506: ! 507: VDEBUGOUT(s, args); ! 508: ! 509: va_end(args); ! 510: ! 511: } ! 512: ! 513: } ! 514: ! 515: ! 516: ! 517: void DEBUG(s) ! 518: ! 519: char *s; ! 520: ! 521: { ! 522: ! 523: va_list args; ! 524: ! 525: ! 526: ! 527: if (debug_level) { ! 528: ! 529: va_start(args, s); ! 530: ! 531: VDEBUGOUT(s, args); ! 532: ! 533: va_end(args); ! 534: ! 535: } ! 536: ! 537: } ! 538: ! 539: ! 540: ! 541: void ALERT(s) ! 542: ! 543: char *s; ! 544: ! 545: { ! 546: ! 547: va_list args; ! 548: ! 549: ! 550: ! 551: va_start(args, s); ! 552: ! 553: VDEBUGOUT(s, args); ! 554: ! 555: va_end(args); ! 556: ! 557: } ! 558: ! 559: ! 560: ! 561: EXITING ! 562: ! 563: void FATAL(s) ! 564: ! 565: char *s; ! 566: ! 567: { ! 568: ! 569: va_list args; ! 570: ! 571: ! 572: ! 573: va_start(args, s); ! 574: ! 575: VDEBUGOUT(s, args); ! 576: ! 577: va_end(args); ! 578: ! 579: HALT(); ! 580: ! 581: } ! 582: ! 583: ! 584: ! 585: ! 586: ! 587: EXITING ! 588: ! 589: void HALT() ! 590: ! 591: { ! 592: ! 593: long r; ! 594: ! 595: extern long tosssp; /* in main.c */ ! 596: ! 597: ! 598: ! 599: restr_intr(); /* restore interrupts to normal */ ! 600: ! 601: debug_ws("Fatal MiNT error: adjust debug level and hit a key...\r\n"); ! 602: ! 603: sys_q[READY_Q] = 0; /* prevent context switches */ ! 604: ! 605: ! 606: ! 607: for(;;) { ! 608: ! 609: r = Bconin(2) & 0x00ff0000; ! 610: ! 611: if (r == 0x3b0000) ! 612: ! 613: debug_level++; ! 614: ! 615: else if (r == 0x3c0000) ! 616: ! 617: --debug_level; ! 618: ! 619: else if (r == 0x3d0000) /* F3: cycle to next device */ ! 620: ! 621: out_device = out_next[out_device]; ! 622: ! 623: else if (r == 0x3e0000) ! 624: ! 625: out_device = 2; /* F4: reset to console */ ! 626: ! 627: else if (r == 0x3f0000) ! 628: ! 629: DUMPMEM(core); /* F5: dump memory */ ! 630: ! 631: else if (r == 0x400000) ! 632: ! 633: DUMPPROC(); ! 634: ! 635: else ! 636: ! 637: break; ! 638: ! 639: } ! 640: ! 641: for(;;) { ! 642: ! 643: debug_ws("System halted. Press 'x' to exit, or else reboot\r\n"); ! 644: ! 645: r = Bconin(2); ! 646: ! 647: ! 648: ! 649: if ( (r & 0x0ff) == 'x' ) { ! 650: ! 651: close_filesys(); ! 652: ! 653: (void)Super(tosssp); ! 654: ! 655: zeroexit(); ! 656: ! 657: } ! 658: ! 659: } ! 660: ! 661: } ! 662: ! 663: ! 664: ! 665: /* some key definitions */ ! 666: ! 667: #define CTRLALT 0xc ! 668: ! 669: #define DEL 0x53 /* scan code of delete key */ ! 670: ! 671: #define UNDO 0x61 /* scan code of undo key */ ! 672: ! 673: ! 674: ! 675: void ! 676: ! 677: do_func_key(scan) ! 678: ! 679: int scan; ! 680: ! 681: { ! 682: ! 683: extern struct tty con_tty; ! 684: ! 685: ! 686: ! 687: switch (scan) { ! 688: ! 689: case DEL: ! 690: ! 691: reboot(); ! 692: ! 693: break; ! 694: ! 695: case UNDO: ! 696: ! 697: killgroup(con_tty.pgrp, SIGQUIT); ! 698: ! 699: break; ! 700: ! 701: case 0x3b: /* F1 */ ! 702: ! 703: debug_level++; ! 704: ! 705: break; ! 706: ! 707: case 0x3c: /* F2 */ ! 708: ! 709: if (debug_level > 0) ! 710: ! 711: --debug_level; ! 712: ! 713: break; ! 714: ! 715: case 0x3d: /* F3 */ ! 716: ! 717: out_device = out_next[out_device]; ! 718: ! 719: break; ! 720: ! 721: case 0x3e: /* F4 */ ! 722: ! 723: out_device = 2; ! 724: ! 725: break; ! 726: ! 727: case 0x3f: /* F5 */ ! 728: ! 729: DUMPMEM(core); ! 730: ! 731: break; ! 732: ! 733: case 0x40: /* F6 */ ! 734: ! 735: DUMPPROC(); ! 736: ! 737: break; ! 738: ! 739: } ! 740: ! 741: } ! 742: ! 743: ! 744:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.