2011-02-21 Hui Zhu <teawater@gmail.com>
[deliverable/binutils-gdb.git] / gdb / i386-tdep.h
index d1366b68b250c653fba2ce3627bd8fbf7ae64ac1..bb2f2c73884b9f9b50e1cb06f39eeee8026f964d 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for the i386.
 
-   Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, 2008
+   Copyright (C) 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -53,6 +53,20 @@ enum struct_return
   reg_struct_return            /* Return "short" structures in registers.  */
 };
 
+/* Register classes as defined in the AMD x86-64 psABI.  */
+
+enum amd64_reg_class
+{
+  AMD64_INTEGER,
+  AMD64_SSE,
+  AMD64_SSEUP,
+  AMD64_X87,
+  AMD64_X87UP,
+  AMD64_COMPLEX_X87,
+  AMD64_NO_CLASS,
+  AMD64_MEMORY
+};
+
 /* i386 architecture specific information.  */
 struct gdbarch_tdep
 {
@@ -62,22 +76,110 @@ struct gdbarch_tdep
   int gregset_num_regs;
   size_t sizeof_gregset;
 
+  /* The general-purpose registers used to pass integers when making
+     function calls.  This only applies to amd64, as all parameters
+     are passed through the stack on x86.  */
+  int call_dummy_num_integer_regs;
+  int *call_dummy_integer_regs;
+
+  /* Used on amd64 only.  Classify TYPE according to calling conventions,
+     and store the result in CLASS.  */
+  void (*classify) (struct type *type, enum amd64_reg_class class[2]);
+
+  /* Used on amd64 only.  Non-zero if the first few MEMORY arguments
+     should be passed by pointer.
+
+     More precisely, MEMORY arguments are passed through the stack.
+     But certain architectures require that their address be passed
+     by register as well, if there are still some integer registers
+     available for argument passing.  */
+  int memory_args_by_pointer;
+
+  /* Used on amd64 only.
+
+     If non-zero, then the callers of a function are expected to reserve
+     some space in the stack just before the area where the PC is saved
+     so that the callee may save the integer-parameter registers there.
+     The amount of space is dependent on the list of registers used for
+     integer parameter passing (see component call_dummy_num_integer_regs
+     above).  */
+  int integer_param_regs_saved_in_caller_frame;
+
   /* Floating-point registers.  */
   struct regset *fpregset;
   size_t sizeof_fpregset;
 
+  /* XSAVE extended state.  */
+  struct regset *xstateregset;
+
   /* Register number for %st(0).  The register numbers for the other
      registers follow from this one.  Set this to -1 to indicate the
      absence of an FPU.  */
   int st0_regnum;
 
+  /* Number of MMX registers.  */
+  int num_mmx_regs;
+
   /* Register number for %mm0.  Set this to -1 to indicate the absence
      of MMX support.  */
   int mm0_regnum;
 
+  /* Number of pseudo YMM registers.  */
+  int num_ymm_regs;
+
+  /* Register number for %ymm0.  Set this to -1 to indicate the absence
+     of pseudo YMM register support.  */
+  int ymm0_regnum;
+
+  /* Number of byte registers.  */
+  int num_byte_regs;
+
+  /* Register pseudo number for %al.  */
+  int al_regnum;
+
+  /* Number of pseudo word registers.  */
+  int num_word_regs;
+
+  /* Register number for %ax.  */
+  int ax_regnum;
+
+  /* Number of pseudo dword registers.  */
+  int num_dword_regs;
+
+  /* Register number for %eax.  Set this to -1 to indicate the absence
+     of pseudo dword register support.  */
+  int eax_regnum;
+
+  /* Number of core registers.  */
+  int num_core_regs;
+
   /* Number of SSE registers.  */
   int num_xmm_regs;
 
+  /* Bits of the extended control register 0 (the XFEATURE_ENABLED_MASK
+     register), excluding the x87 bit, which are supported by this GDB.  */
+
+  uint64_t xcr0;
+
+  /* Offset of XCR0 in XSAVE extended state.  */
+  int xsave_xcr0_offset;
+
+  /* Register names.  */
+  const char **register_names;
+
+  /* Register number for %ymm0h.  Set this to -1 to indicate the absence
+     of upper YMM register support.  */
+  int ymm0h_regnum;
+
+  /* Upper YMM register names.  Only used for tdesc_numbered_register.  */
+  const char **ymmh_register_names;
+
+  /* Target description.  */
+  const struct target_desc *tdesc;
+
+  /* Register group function.  */
+  const void *register_reggroup_p;
+
   /* Offset of saved PC in jmp_buf.  */
   int jb_pc_offset;
 
@@ -105,7 +207,19 @@ struct gdbarch_tdep
 
   /* ISA-specific data types.  */
   struct type *i386_mmx_type;
-  struct type *i386_sse_type;
+  struct type *i386_ymm_type;
+  struct type *i387_ext_type;
+
+  /* Process record/replay target.  */
+  /* The map for registers because the AMD64's registers order
+     in GDB is not same as I386 instructions.  */
+  const int *record_regmap;
+  /* Parse intx80 args.  */
+  int (*i386_intx80_record) (struct regcache *regcache);
+  /* Parse sysenter args.  */
+  int (*i386_sysenter_record) (struct regcache *regcache);
+  /* Parse syscall args.  */
+  int (*i386_syscall_record) (struct regcache *regcache);
 };
 
 /* Floating-point registers.  */
@@ -139,41 +253,88 @@ enum i386_regnum
   I386_ES_REGNUM,              /* %es */
   I386_FS_REGNUM,              /* %fs */
   I386_GS_REGNUM,              /* %gs */
-  I386_ST0_REGNUM              /* %st(0) */
+  I386_ST0_REGNUM,             /* %st(0) */
+  I386_MXCSR_REGNUM = 40,      /* %mxcsr */ 
+  I386_YMM0H_REGNUM,           /* %ymm0h */
+  I386_YMM7H_REGNUM = I386_YMM0H_REGNUM + 7
+};
+
+/* Register numbers of RECORD_REGMAP.  */
+
+enum record_i386_regnum
+{
+  X86_RECORD_REAX_REGNUM,
+  X86_RECORD_RECX_REGNUM,
+  X86_RECORD_REDX_REGNUM,
+  X86_RECORD_REBX_REGNUM,
+  X86_RECORD_RESP_REGNUM,
+  X86_RECORD_REBP_REGNUM,
+  X86_RECORD_RESI_REGNUM,
+  X86_RECORD_REDI_REGNUM,
+  X86_RECORD_R8_REGNUM,
+  X86_RECORD_R9_REGNUM,
+  X86_RECORD_R10_REGNUM,
+  X86_RECORD_R11_REGNUM,
+  X86_RECORD_R12_REGNUM,
+  X86_RECORD_R13_REGNUM,
+  X86_RECORD_R14_REGNUM,
+  X86_RECORD_R15_REGNUM,
+  X86_RECORD_REIP_REGNUM,
+  X86_RECORD_EFLAGS_REGNUM,
+  X86_RECORD_CS_REGNUM,
+  X86_RECORD_SS_REGNUM,
+  X86_RECORD_DS_REGNUM,
+  X86_RECORD_ES_REGNUM,
+  X86_RECORD_FS_REGNUM,
+  X86_RECORD_GS_REGNUM,
 };
 
 #define I386_NUM_GREGS 16
-#define I386_NUM_FREGS 16
 #define I386_NUM_XREGS  9
 
-#define I386_SSE_NUM_REGS      (I386_NUM_GREGS + I386_NUM_FREGS \
-                                + I386_NUM_XREGS)
+#define I386_SSE_NUM_REGS      (I386_MXCSR_REGNUM + 1)
+#define I386_AVX_NUM_REGS      (I386_YMM7H_REGNUM + 1)
 
 /* Size of the largest register.  */
 #define I386_MAX_REGISTER_SIZE 16
 
 /* Types for i386-specific registers.  */
-extern struct type *i386_eflags_type;
-extern struct type *i386_mxcsr_type;
+extern struct type *i387_ext_type (struct gdbarch *gdbarch);
+
+/* Checks of different pseudo-registers.  */
+extern int i386_byte_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_word_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_dword_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_xmm_regnum_p (struct gdbarch *gdbarch, int regnum);
+extern int i386_ymm_regnum_p (struct gdbarch *gdbarch, int regnum);
 
-extern struct type *i386_mmx_type (struct gdbarch *gdbarch);
-extern struct type *i386_sse_type (struct gdbarch *gdbarch);
+extern const char *i386_pseudo_register_name (struct gdbarch *gdbarch,
+                                             int regnum);
+
+extern void i386_pseudo_register_read (struct gdbarch *gdbarch,
+                                      struct regcache *regcache,
+                                      int regnum, gdb_byte *buf);
+extern void i386_pseudo_register_write (struct gdbarch *gdbarch,
+                                       struct regcache *regcache,
+                                       int regnum, const gdb_byte *buf);
 
 /* Segment selectors.  */
 #define I386_SEL_RPL   0x0003  /* Requester's Privilege Level mask.  */
-#define I386_SEL_UPL   0x0003  /* User Privilige Level. */
-#define I386_SEL_KPL   0x0000  /* Kernel Privilige Level. */
+#define I386_SEL_UPL   0x0003  /* User Privilige Level.  */
+#define I386_SEL_KPL   0x0000  /* Kernel Privilige Level.  */
 
 /* The length of the longest i386 instruction (according to
    include/asm-i386/kprobes.h in Linux 2.6.  */
 #define I386_MAX_INSN_LEN (16)
 
 /* Functions exported from i386-tdep.c.  */
-extern CORE_ADDR i386_pe_skip_trampoline_code (CORE_ADDR pc, char *name);
-extern CORE_ADDR i386_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc);
+extern CORE_ADDR i386_pe_skip_trampoline_code (struct frame_info *frame,
+                                              CORE_ADDR pc, char *name);
+extern CORE_ADDR i386_skip_main_prologue (struct gdbarch *gdbarch,
+                                         CORE_ADDR pc);
 
-/* Return the name of register REGNUM.  */
-extern char const *i386_register_name (struct gdbarch * gdbarch, int regnum);
+/* Return whether the THIS_FRAME corresponds to a sigtramp routine.  */
+extern int i386_sigtramp_p (struct frame_info *this_frame);
 
 /* Return non-zero if REGNUM is a member of the specified group.  */
 extern int i386_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
@@ -201,6 +362,9 @@ extern const struct regset *
                                 const char *sect_name, size_t sect_size);
 
 
+extern struct displaced_step_closure *i386_displaced_step_copy_insn
+  (struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to,
+   struct regcache *regs);
 extern void i386_displaced_step_fixup (struct gdbarch *gdbarch,
                                       struct displaced_step_closure *closure,
                                       CORE_ADDR from, CORE_ADDR to,
@@ -211,6 +375,9 @@ extern void i386_elf_init_abi (struct gdbarch_info, struct gdbarch *);
 
 /* Initialize a SVR4 architecture variant.  */
 extern void i386_svr4_init_abi (struct gdbarch_info, struct gdbarch *);
+
+extern int i386_process_record (struct gdbarch *gdbarch,
+                                struct regcache *regcache, CORE_ADDR addr);
 \f
 
 /* Functions and variables exported from i386bsd-tdep.c.  */
This page took 0.027721 seconds and 4 git commands to generate.