Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _ASM_X86_USER_32_H
0003 #define _ASM_X86_USER_32_H
0004 
0005 #include <asm/page.h>
0006 /* Core file format: The core file is written in such a way that gdb
0007    can understand it and provide useful information to the user (under
0008    linux we use the 'trad-core' bfd).  There are quite a number of
0009    obstacles to being able to view the contents of the floating point
0010    registers, and until these are solved you will not be able to view the
0011    contents of them.  Actually, you can read in the core file and look at
0012    the contents of the user struct to find out what the floating point
0013    registers contain.
0014    The actual file contents are as follows:
0015    UPAGE: 1 page consisting of a user struct that tells gdb what is present
0016    in the file.  Directly after this is a copy of the task_struct, which
0017    is currently not used by gdb, but it may come in useful at some point.
0018    All of the registers are stored as part of the upage.  The upage should
0019    always be only one page.
0020    DATA: The data area is stored.  We use current->end_text to
0021    current->brk to pick up all of the user variables, plus any memory
0022    that may have been malloced.  No attempt is made to determine if a page
0023    is demand-zero or if a page is totally unused, we just cover the entire
0024    range.  All of the addresses are rounded in such a way that an integral
0025    number of pages is written.
0026    STACK: We need the stack information in order to get a meaningful
0027    backtrace.  We need to write the data from (esp) to
0028    current->start_stack, so we round each of these off in order to be able
0029    to write an integer number of pages.
0030    The minimum core file size is 3 pages, or 12288 bytes.
0031 */
0032 
0033 /*
0034  * Pentium III FXSR, SSE support
0035  *  Gareth Hughes <gareth@valinux.com>, May 2000
0036  *
0037  * Provide support for the GDB 5.0+ PTRACE_{GET|SET}FPXREGS requests for
0038  * interacting with the FXSR-format floating point environment.  Floating
0039  * point data can be accessed in the regular format in the usual manner,
0040  * and both the standard and SIMD floating point data can be accessed via
0041  * the new ptrace requests.  In either case, changes to the FPU environment
0042  * will be reflected in the task's state as expected.
0043  */
0044 
0045 struct user_i387_struct {
0046     long    cwd;
0047     long    swd;
0048     long    twd;
0049     long    fip;
0050     long    fcs;
0051     long    foo;
0052     long    fos;
0053     long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
0054 };
0055 
0056 struct user_fxsr_struct {
0057     unsigned short  cwd;
0058     unsigned short  swd;
0059     unsigned short  twd;
0060     unsigned short  fop;
0061     long    fip;
0062     long    fcs;
0063     long    foo;
0064     long    fos;
0065     long    mxcsr;
0066     long    reserved;
0067     long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
0068     long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
0069     long    padding[56];
0070 };
0071 
0072 /*
0073  * This is the old layout of "struct pt_regs", and
0074  * is still the layout used by user mode (the new
0075  * pt_regs doesn't have all registers as the kernel
0076  * doesn't use the extra segment registers)
0077  */
0078 struct user_regs_struct {
0079     unsigned long   bx;
0080     unsigned long   cx;
0081     unsigned long   dx;
0082     unsigned long   si;
0083     unsigned long   di;
0084     unsigned long   bp;
0085     unsigned long   ax;
0086     unsigned long   ds;
0087     unsigned long   es;
0088     unsigned long   fs;
0089     unsigned long   gs;
0090     unsigned long   orig_ax;
0091     unsigned long   ip;
0092     unsigned long   cs;
0093     unsigned long   flags;
0094     unsigned long   sp;
0095     unsigned long   ss;
0096 };
0097 
0098 /* When the kernel dumps core, it starts by dumping the user struct -
0099    this will be used by gdb to figure out where the data and stack segments
0100    are within the file, and what virtual addresses to use. */
0101 struct user{
0102 /* We start with the registers, to mimic the way that "memory" is returned
0103    from the ptrace(3,...) function.  */
0104   struct user_regs_struct regs; /* Where the registers are actually stored */
0105 /* ptrace does not yet supply these.  Someday.... */
0106   int u_fpvalid;        /* True if math co-processor being used. */
0107                 /* for this mess. Not yet used. */
0108   struct user_i387_struct i387; /* Math Co-processor registers. */
0109 /* The rest of this junk is to help gdb figure out what goes where */
0110   unsigned long int u_tsize;    /* Text segment size (pages). */
0111   unsigned long int u_dsize;    /* Data segment size (pages). */
0112   unsigned long int u_ssize;    /* Stack segment size (pages). */
0113   unsigned long start_code;     /* Starting virtual address of text. */
0114   unsigned long start_stack;    /* Starting virtual address of stack area.
0115                    This is actually the bottom of the stack,
0116                    the top of the stack is always found in the
0117                    esp register.  */
0118   long int signal;          /* Signal that caused the core dump. */
0119   int reserved;         /* No longer used */
0120   unsigned long u_ar0;      /* Used by gdb to help find the values for */
0121                 /* the registers. */
0122   struct user_i387_struct *u_fpstate;   /* Math Co-processor pointer. */
0123   unsigned long magic;      /* To uniquely identify a core file */
0124   char u_comm[32];      /* User command that was responsible */
0125   int u_debugreg[8];
0126 };
0127 
0128 #endif /* _ASM_X86_USER_32_H */