|
|
1.1 ! root 1: #include <sys/ptrace.h> ! 2: /* Core file format: The core file is written in such a way that gdb ! 3: can understand it and provide useful information to the user (under ! 4: linux we use the 'trad-core' bfd). There are quite a number of ! 5: obstacles to being able to view the contents of the floating point ! 6: registers, and until these are solved you will not be able to view the ! 7: contents of them. Actually, you can read in the core file and look at ! 8: the contents of the user struct to find out what the floating point ! 9: registers contain. ! 10: The actual file contents are as follows: ! 11: UPAGE: 1 page consisting of a user struct that tells gdb what is present ! 12: in the file. Directly after this is a copy of the task_struct, which ! 13: is currently not used by gdb, but it may come in useful at some point. ! 14: All of the registers are stored as part of the upage. The upage should ! 15: always be only one page. ! 16: DATA: The data area is stored. We use current->end_text to ! 17: current->brk to pick up all of the user variables, plus any memory ! 18: that may have been malloced. No attempt is made to determine if a page ! 19: is demand-zero or if a page is totally unused, we just cover the entire ! 20: range. All of the addresses are rounded in such a way that an integral ! 21: number of pages is written. ! 22: STACK: We need the stack information in order to get a meaningful ! 23: backtrace. We need to write the data from (esp) to ! 24: current->start_stack, so we round each of these off in order to be able ! 25: to write an integer number of pages. ! 26: The minimum core file size is 3 pages, or 12288 bytes. ! 27: */ ! 28: ! 29: struct user_i387_struct { ! 30: long cwd; ! 31: long swd; ! 32: long twd; ! 33: long fip; ! 34: long fcs; ! 35: long foo; ! 36: long fos; ! 37: long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */ ! 38: }; ! 39: ! 40: /* When the kernel dumps core, it starts by dumping the user struct - ! 41: this will be used by gdb to figure out where the data and stack segments ! 42: are within the file, and what virtual addresses to use. */ ! 43: struct user{ ! 44: /* We start with the registers, to mimic the way that "memory" is returned ! 45: from the ptrace(3,...) function. */ ! 46: struct pt_regs regs; /* Where the registers are actually stored */ ! 47: /* ptrace does not yet supply these. Someday.... */ ! 48: int u_fpvalid; /* True if math co-processor being used. */ ! 49: /* for this mess. Not yet used. */ ! 50: struct user_i387_struct i387; /* Math Co-processor registers. */ ! 51: /* The rest of this junk is to help gdb figure out what goes where */ ! 52: unsigned long int u_tsize; /* Text segment size (pages). */ ! 53: unsigned long int u_dsize; /* Data segment size (pages). */ ! 54: unsigned long int u_ssize; /* Stack segment size (pages). */ ! 55: unsigned long start_code; /* Starting virtual address of text. */ ! 56: unsigned long start_stack; /* Starting virtual address of stack area. ! 57: This is actually the bottom of the stack, ! 58: the top of the stack is always found in the ! 59: esp register. */ ! 60: long int signal; /* Signal that caused the core dump. */ ! 61: char * u_comm; /* User command that was responsible */ ! 62: struct pt_regs * u_ar0; /* Used by gdb to help find the values for */ ! 63: /* the registers. */ ! 64: struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */ ! 65: }; ! 66: #define NBPG 4096 ! 67: #define UPAGES 1 ! 68: #define HOST_TEXT_START_ADDR (u.start_code) ! 69: #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.