|
|
1.1 ! root 1: /* Interface to bare machine for GDB running as kernel debugger. ! 2: Copyright (C) 1986 Free Software Foundation, Inc. ! 3: ! 4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY ! 5: WARRANTY. No author or distributor accepts responsibility to anyone ! 6: for the consequences of using it or for whether it serves any ! 7: particular purpose or works at all, unless he says so in writing. ! 8: Refer to the GDB General Public License for full details. ! 9: ! 10: Everyone is granted permission to copy, modify and redistribute GDB, ! 11: but only under the conditions described in the GDB General Public ! 12: License. A copy of this license is supposed to have been given to you ! 13: along with GDB so you can know your rights and responsibilities. It ! 14: should be in a file named COPYING. Among other things, the copyright ! 15: notice and this notice must be preserved on all copies. ! 16: ! 17: In other words, go ahead and share GDB, but don't try to stop ! 18: anyone else from sharing it farther. Help stamp out software hoarding! ! 19: */ ! 20: ! 21: #include <stdio.h> ! 22: #include <sys/ioctl.h> ! 23: #include <signal.h> ! 24: #include <errno.h> ! 25: #include <sys/types.h> ! 26: #include <sys/stat.h> ! 27: ! 28: #if defined (SIGTSTP) && defined (SIGIO) ! 29: #include <sys/time.h> ! 30: #include <sys/resource.h> ! 31: #endif /* SIGTSTP and SIGIO defined (must be 4.2) */ ! 32: ! 33: #include "defs.h" ! 34: #include "initialize.h" ! 35: #include "param.h" ! 36: #include "symtab.h" ! 37: #include "frame.h" ! 38: #include "inferior.h" ! 39: #include "wait.h" ! 40: ! 41: START_FILE ! 42: ! 43: /* Random system calls, mostly no-ops to prevent link problems */ ! 44: ! 45: ioctl (desc, code, arg) ! 46: {} ! 47: ! 48: int (* signal ()) () ! 49: {} ! 50: ! 51: kill () ! 52: {} ! 53: ! 54: getpid () ! 55: { ! 56: return 0; ! 57: } ! 58: ! 59: sigsetmask () ! 60: {} ! 61: ! 62: chdir () ! 63: {} ! 64: ! 65: char * ! 66: getwd (buf) ! 67: char *buf; ! 68: { ! 69: buf[0] = '/'; ! 70: buf[1] = 0; ! 71: return buf; ! 72: } ! 73: ! 74: /* Used to check for existence of .gdbinit. Say no. */ ! 75: ! 76: access () ! 77: { ! 78: return -1; ! 79: } ! 80: ! 81: exit () ! 82: { ! 83: error ("Fatal error; restarting."); ! 84: } ! 85: ! 86: /* Reading "files". The contents of some files are written into kdb's ! 87: data area before it is run. These files are used to contain the ! 88: symbol table for kdb to load, and the source files (in case the ! 89: kdb user wants to print them). The symbols are stored in a file ! 90: named "kdb-symbols" in a.out format (except that all the text and ! 91: data have been stripped to save room). ! 92: ! 93: The files are stored in the following format: ! 94: int number of bytes of data for this file, including these four. ! 95: char[] name of the file, ending with a null. ! 96: padding to multiple of 4 boundary. ! 97: char[] file contents. The length can be deduced from what was ! 98: specified before. There is no terminating null here. ! 99: ! 100: If the int at the front is zero, it means there are no more files. ! 101: ! 102: Opening a file in kdb returns a nonzero value to indicate success, ! 103: but the value does not matter. Only one file can be open, and only ! 104: for reading. All the primitives for input from the file know ! 105: which file is open and ignore what is specified for the descriptor ! 106: or for the stdio stream. ! 107: ! 108: Input with fgetc can be done either on the file that is open ! 109: or on stdin (which reads from the terminal through tty_input () */ ! 110: ! 111: /* Address of data for the files stored in format described above. */ ! 112: char *files_start; ! 113: ! 114: /* The file stream currently open: */ ! 115: ! 116: char *sourcebeg; /* beginning of contents */ ! 117: int sourcesize; /* size of contents */ ! 118: char *sourceptr; /* current read pointer */ ! 119: int sourceleft; /* number of bytes to eof */ ! 120: ! 121: /* "descriptor" for the file now open. ! 122: Incremented at each close. ! 123: If specified descriptor does not match this, ! 124: it means the program is trying to use a closed descriptor. ! 125: We report an error for that. */ ! 126: ! 127: int sourcedesc; ! 128: ! 129: open (filename, modes) ! 130: char *filename; ! 131: int modes; ! 132: { ! 133: register char *next; ! 134: extern int errno; ! 135: ! 136: if (modes) ! 137: { ! 138: errno = EROFS; ! 139: return -1; ! 140: } ! 141: ! 142: if (sourceptr) ! 143: { ! 144: errno = EMFILE; ! 145: return -1; ! 146: } ! 147: ! 148: for (next - files_start; * (int *) next; ! 149: next += * (int *) next) ! 150: { ! 151: if (!strcmp (next + 4, filename)) ! 152: { ! 153: sourcebeg = next + 4 + strlen (next + 4) + 1; ! 154: sourcebeg = (char *) (((int) sourcebeg + 3) & (-4)); ! 155: sourceptr = sourcebeg; ! 156: sourcesize = next + * (int *) next - sourceptr; ! 157: sourceleft = sourcesize; ! 158: return sourcedesc; ! 159: } ! 160: } ! 161: return 0; ! 162: } ! 163: ! 164: close (desc) ! 165: int desc; ! 166: { ! 167: sourceptr = 0; ! 168: sourcedesc++; ! 169: /* Don't let sourcedesc get big enough to be confused with stdin. */ ! 170: if (sourcedesc == 100) ! 171: sourcedesc = 5; ! 172: } ! 173: ! 174: FILE * ! 175: fopen (filename, modes) ! 176: char *filename; ! 177: char *modes; ! 178: { ! 179: return (FILE *) open (filename, *modes == 'w'); ! 180: } ! 181: ! 182: FILE * ! 183: fdopen (desc) ! 184: int desc; ! 185: { ! 186: return (FILE *) desc; ! 187: } ! 188: ! 189: fclose (desc) ! 190: int desc; ! 191: { ! 192: close (desc); ! 193: } ! 194: ! 195: fstat (desc, statbuf) ! 196: struct stat *statbuf; ! 197: { ! 198: extern int errno; ! 199: ! 200: if (desc != sourcedesc) ! 201: { ! 202: errno = EBADF; ! 203: return -1; ! 204: } ! 205: statbuf->st_size = sourcesize; ! 206: } ! 207: ! 208: myread (desc, destptr, size, filename) ! 209: int desc; ! 210: char *destptr; ! 211: int size; ! 212: char *filename; ! 213: { ! 214: int len = min (sourceleft, size); ! 215: extern int errno; ! 216: ! 217: if (desc != sourcedesc) ! 218: { ! 219: errno = EBADF; ! 220: return -1; ! 221: } ! 222: ! 223: bcopy (sourceptr, destptr, len); ! 224: sourceleft -= len; ! 225: return len; ! 226: } ! 227: ! 228: int ! 229: fread (bufp, numelts, eltsize, stream) ! 230: { ! 231: register int elts = min (numelts, sourceleft / eltsize); ! 232: register int len = elts * eltsize; ! 233: extern int errno; ! 234: ! 235: if (stream != sourcedesc) ! 236: { ! 237: errno = EBADF; ! 238: return -1; ! 239: } ! 240: ! 241: bcopy (sourceptr, bufp, len); ! 242: sourceleft -= len; ! 243: return elts; ! 244: } ! 245: ! 246: int ! 247: fgetc (desc) ! 248: int desc; ! 249: { ! 250: extern int errno; ! 251: ! 252: if (desc == (int) stdin) ! 253: return tty_input (); ! 254: ! 255: if (desc != sourcedesc) ! 256: { ! 257: errno = EBADF; ! 258: return -1; ! 259: } ! 260: ! 261: if (sourceleft-- <= 0) ! 262: return EOF; ! 263: return *sourceptr++; ! 264: } ! 265: ! 266: lseek (desc, pos) ! 267: int desc; ! 268: int pos; ! 269: { ! 270: extern int errno; ! 271: ! 272: if (desc != sourcedesc) ! 273: { ! 274: errno = EBADF; ! 275: return -1; ! 276: } ! 277: ! 278: if (pos < 0 || pos > sourcesize) ! 279: { ! 280: errno = EINVAL; ! 281: return -1; ! 282: } ! 283: ! 284: sourceptr = sourcebeg + pos; ! 285: sourceleft = sourcesize - pos; ! 286: } ! 287: ! 288: /* Output in kdb can go only to the terminal, so the stream ! 289: specified may be ignored. */ ! 290: ! 291: printf (a1, a2, a3, a4, a5, a6, a7, a8, a9) ! 292: { ! 293: char buffer[1024]; ! 294: sprintf (buffer, a1, a2, a3, a4, a5, a6, a7, a8, a9); ! 295: display_string (buffer); ! 296: } ! 297: ! 298: fprintf (ign, a1, a2, a3, a4, a5, a6, a7, a8, a9) ! 299: { ! 300: char buffer[1024]; ! 301: sprintf (buffer, a1, a2, a3, a4, a5, a6, a7, a8, a9); ! 302: display_string (buffer); ! 303: } ! 304: ! 305: fwrite (buf, numelts, size, stream) ! 306: register char *buf; ! 307: int numelts, size; ! 308: { ! 309: register int i = numelts * size; ! 310: while (i-- > 0) ! 311: fputc (*buf++, stream); ! 312: } ! 313: ! 314: fputc (c, ign) ! 315: { ! 316: char buf[2]; ! 317: buf[0] = c; ! 318: buf[1] = 0; ! 319: display_string (buf); ! 320: } ! 321: ! 322: /* sprintf refers to this, but loading this from the ! 323: library would cause fflush to be loaded from it too. ! 324: In fact there should be no need to call this (I hope). */ ! 325: ! 326: _flsbuf () ! 327: { ! 328: error ("_flsbuf was actually called."); ! 329: } ! 330: ! 331: fflush (ign) ! 332: { ! 333: } ! 334: ! 335: /* Entries into core and inflow, needed only to make things link ok. */ ! 336: ! 337: exec_file_command () ! 338: {} ! 339: ! 340: core_file_command () ! 341: {} ! 342: ! 343: char * ! 344: get_exec_file (err) ! 345: int err; ! 346: { ! 347: /* Makes one printout look reasonable; value does not matter otherwise. */ ! 348: return "run"; ! 349: } ! 350: ! 351: have_core_file_p () ! 352: { ! 353: return 0; ! 354: } ! 355: ! 356: kill_command () ! 357: { ! 358: inferior_pid = 0; ! 359: } ! 360: ! 361: terminal_inferior () ! 362: {} ! 363: ! 364: terminal_ours () ! 365: {} ! 366: ! 367: terminal_init_inferior () ! 368: {} ! 369: ! 370: write_inferior_register () ! 371: {} ! 372: ! 373: read_inferior_register () ! 374: {} ! 375: ! 376: read_memory (memaddr, myaddr, len) ! 377: CORE_ADDR memaddr; ! 378: char *myaddr; ! 379: int len; ! 380: { ! 381: bcopy (memaddr, myaddr, len); ! 382: } ! 383: ! 384: /* Always return 0 indicating success. */ ! 385: ! 386: write_memory (memaddr, myaddr, len) ! 387: CORE_ADDR memaddr; ! 388: char *myaddr; ! 389: int len; ! 390: { ! 391: bcopy (myaddr, memaddr, len); ! 392: return 0; ! 393: } ! 394: ! 395: static REGISTER_TYPE saved_regs[NUM_REGS]; ! 396: ! 397: REGISTER_TYPE ! 398: read_register (regno) ! 399: int regno; ! 400: { ! 401: if (regno < 0 || regno >= NUM_REGS) ! 402: error ("Register number %d out of range.", regno); ! 403: return saved_regs[regno]; ! 404: } ! 405: ! 406: void ! 407: write_register (regno, value) ! 408: int regno; ! 409: REGISTER_TYPE value; ! 410: { ! 411: if (regno < 0 || regno >= NUM_REGS) ! 412: error ("Register number %d out of range.", regno); ! 413: saved_regs[regno] = value; ! 414: } ! 415: ! 416: /* System calls needed in relation to running the "inferior". */ ! 417: ! 418: vfork () ! 419: { ! 420: /* Just appear to "succeed". Say the inferior's pid is 1. */ ! 421: return 1; ! 422: } ! 423: ! 424: /* These are called by code that normally runs in the inferior ! 425: that has just been forked. That code never runs, when standalone, ! 426: and these definitions are so it will link without errors. */ ! 427: ! 428: ptrace () ! 429: {} ! 430: ! 431: setpgrp () ! 432: {} ! 433: ! 434: execle () ! 435: {} ! 436: ! 437: _exit () ! 438: {} ! 439: ! 440: /* Malloc calls these. */ ! 441: ! 442: malloc_warning (str) ! 443: char *str; ! 444: { ! 445: printf ("\n%s.\n\n", str); ! 446: } ! 447: ! 448: char *next_free; ! 449: char *memory_limit; ! 450: ! 451: char * ! 452: sbrk (amount) ! 453: int amount; ! 454: { ! 455: if (next_free + amount > memory_limit) ! 456: return (char *) -1; ! 457: next_free += amount; ! 458: return next_free - amount; ! 459: } ! 460: ! 461: /* Various ways malloc might ask where end of memory is. */ ! 462: ! 463: char * ! 464: ulimit () ! 465: { ! 466: return memory_limit; ! 467: } ! 468: ! 469: int ! 470: vlimit () ! 471: { ! 472: return memory_limit - next_free; ! 473: } ! 474: ! 475: getrlimit (addr) ! 476: struct rlimit *addr; ! 477: { ! 478: addr->rlim_cur = memory_limit - next_free; ! 479: } ! 480: ! 481: /* Context switching to and from program being debugged. */ ! 482: ! 483: /* GDB calls here to run the user program. ! 484: The frame pointer for this function is saved in ! 485: gdb_stack by save_frame_pointer; then we restore ! 486: all of the user program's registers, including PC and PS. */ ! 487: ! 488: static int fault_code; ! 489: static REGISTER_TYPE gdb_stack; ! 490: ! 491: resume () ! 492: { ! 493: REGISTER_TYPE restore[NUM_REGS]; ! 494: ! 495: PUSH_FRAME_PTR; ! 496: save_frame_pointer (); ! 497: ! 498: bcopy (saved_regs, restore, sizeof restore); ! 499: POP_REGISTERS; ! 500: /* Control does not drop through here! */ ! 501: } ! 502: ! 503: save_frame_pointer (val) ! 504: CORE_ADDR val; ! 505: { ! 506: gdb_stack = val; ! 507: } ! 508: ! 509: /* Fault handlers call here, running in the user program stack. ! 510: They must first push a fault code, ! 511: old PC, old PS, and any other info about the fault. ! 512: The exact format is machine-dependent and is known only ! 513: in the definition of PUSH_REGISTERS. */ ! 514: ! 515: fault () ! 516: { ! 517: /* Transfer all registers and fault code to the stack ! 518: in canonical order: registers in order of GDB register number, ! 519: followed by fault code. */ ! 520: PUSH_REGISTERS; ! 521: ! 522: /* Transfer them to saved_regs and fault_code. */ ! 523: save_registers (); ! 524: ! 525: restore_gdb (); ! 526: /* Control does not reach here */ ! 527: } ! 528: ! 529: restore_gdb () ! 530: { ! 531: CORE_ADDR new_fp = gdb_stack; ! 532: /* Switch to GDB's stack */ ! 533: POP_FRAME_PTR; ! 534: /* Return from the function `resume'. */ ! 535: } ! 536: ! 537: /* Assuming register contents and fault code have been pushed on the stack as ! 538: arguments to this function, copy them into the standard place ! 539: for the program's registers while GDB is running. */ ! 540: ! 541: save_registers (firstreg) ! 542: int firstreg; ! 543: { ! 544: bcopy (&firstreg, saved_regs, sizeof saved_regs); ! 545: fault_code = (&firstreg)[NUM_REGS]; ! 546: } ! 547: ! 548: /* Store into the structure such as `wait' would return ! 549: the information on why the program faulted, ! 550: converted into a machine-independent signal number. */ ! 551: ! 552: static int fault_table[] = FAULT_TABLE; ! 553: ! 554: int ! 555: wait (w) ! 556: WAITTYPE *w; ! 557: { ! 558: WSETSTOP (*w, fault_table[fault_code / FAULT_CODE_UNITS]); ! 559: return inferior_pid; ! 560: } ! 561: ! 562: /* Allocate a big space in which files for kdb to read will be stored. ! 563: Whatever is left is where malloc can allocate storage. ! 564: ! 565: Initialize it, so that there will be space in the executable file ! 566: for it. Then the files can be put into kdb by writing them into ! 567: kdb's executable file. */ ! 568: ! 569: /* The default size is as much space as we expect to be available ! 570: for kdb to use! */ ! 571: ! 572: #ifndef HEAP_SIZE ! 573: #define HEAP_SIZE 400000 ! 574: #endif ! 575: ! 576: char heap[HEAP_SIZE] = {0}; ! 577: ! 578: #ifndef STACK_SIZE ! 579: #define STACK_SIZE 100000 ! 580: #endif ! 581: ! 582: int kdb_stack_beg[STACK_SIZE / sizeof (int)]; ! 583: int kdb_stack_end; ! 584: ! 585: static ! 586: initialize () ! 587: { ! 588: register char *next; ! 589: ! 590: /* Find start of data on files. */ ! 591: ! 592: files_start = heap; ! 593: ! 594: /* Find the end of the data on files. */ ! 595: ! 596: for (next - files_start; * (int *) next; ! 597: next += * (int *) next) ! 598: {} ! 599: ! 600: /* That is where free storage starts for sbrk to give out. */ ! 601: next_free = next; ! 602: ! 603: memory_limit = heap + sizeof heap; ! 604: } ! 605: ! 606: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.