This is the mail archive of the gdb-prs@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

pending/1348: Re: [rfa] Add 32 bit (i386) support to x86-64-pc-linux-gnu


>Number:         1348
>Category:       pending
>Synopsis:       Re: [rfa] Add 32 bit (i386) support to x86-64-pc-linux-gnu
>Confidential:   yes
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          change-request
>Submitter-Id:   unknown
>Arrival-Date:   Thu Aug 21 20:48:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     
>Release:        
>Organization:
>Environment:
>Description:
 This is a multi-part message in MIME format.
 --------------010605000708010801080708
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 > Hello,
 > 
 > This patch gets 32 (i386) debugging working with an x86-64-pc-linux-gnu configured GDB.
 > 
 > I should note that there are several ways of doing this.  The attached uses the technique of modifying x86-64 linux nat/tdep files so that they can supply values to either a 32 or 64 bit formatted register cache.
 > 
 > I know of two problems:
 > 
 > - corefiles
 > I noticed a combination of problems: i386 linux core file support is in i386-linux-nat.c so isn't linked into x86-64; x86-64-linux-tdep does include core file support but it fails to "do the right thing" with 32 bit core files (it should either reject  it, or handle it completly).
 > 
 > - threads
 > The 64 bit libthread db gets loaded, it doesn't recognize the 32 bit libthread db target.  The glibc maintainers know about this problem.
 > 
 > BTW, it also fixes a problem with the old code, the original map table included "CS" and "SS" but x86-64-pc-linux-gnu doesn't.
 > 
 > Thoughts?  6.0?
 
 Attached is an update.  It now also fixes x86-64 part of the core-file 
 problem.  The x86-64 code will only load an x86-64 corefile.
 
 I'll follow up with a separate patch that lets x86-64 GDB load i386 core 
 files.
 
 thoughts?
 Andrew
 
 
 --------------010605000708010801080708
 Content-Type: text/plain;
  name="diffs"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="diffs"
 
 2003-07-31  Andrew Cagney  <cagney@redhat.com>
 
 	* x86-64-tdep.h (enum x86_64_regnums): Replace #define of
 	X86_64_RAX_REGNUM, X86_64_RDX_REGNUM, X86_64_RDI_REGNUM,
 	X86_64_RBP_REGNUM, X86_64_RSP_REGNUM, X86_64_RIP_REGNUM,
 	X86_64_EFLAGS_REGNUM, X86_64_ST0_REGNUM, X86_64_XMM0_REGNUM,
 	X86_64_XMM1_REGNUM.
 	* x86-64-linux-tdep.h (x86_64_linux_greg_offset): Declare.
 	(x86_64_linux_supply_gregset): Add "sizeof_gregs" param.
 	(x86_64_linux_fill_gregset): Add "sizeof_gregs" param.
 	* x86-64-linux-tdep.c: Include "gdb_assert.h" and
 	"i386-linux-tdep.h".
 	(enum user_regs): Replace user reg #defines, add USER_ORIG_RAX,
 	USER_FS_BASE and USER_GS_BASE.
 	(struct regnum_map, struct regnum_to_user): Define.
 	(x86_64_linux_greg_offset): New function.
 	(user_to_gdb_regmap): Delete.
 	(x86_64_linux_supply_gregset, x86_64_linux_fill_gregset): Use
 	x86_64_linux_greg_offset.
 	(x86_64_core_sniffer): New function
 	(x86_64_core_fns): Set the sniffer to x86_64_core_sniffer.
 	(fetch_core_registers): Pass "core_reg_size" to the supply
 	functions.
 	* i386-tdep.h (i386_regnums): Replace I386_EAX_REGNUM,
 	I386_EDX_REGNUM, I386_ESP_REGNUM, I386_EBP_REGNUM,
 	I386_EIP_REGNUM, I386_EFLAGS_REGNUM, I386_ST0_REGNUM.
 	* x86-64-linux-nat.c (GETREGS_SUPPLIES): Delete macro.
 	(fetch_inferior_registers): Use x86_64_linux_greg_offset.
 	(store_inferior_registers): Ditto.
 	* Makefile.in (x86-64-linux-tdep.o): Update dependencies.
 
 Index: Makefile.in
 ===================================================================
 RCS file: /cvs/src/src/gdb/Makefile.in,v
 retrieving revision 1.421
 diff -u -r1.421 Makefile.in
 --- Makefile.in	22 Jul 2003 15:41:59 -0000	1.421
 +++ Makefile.in	1 Aug 2003 15:12:10 -0000
 @@ -2377,7 +2377,8 @@
  	$(regcache_h) $(gdb_assert_h) $(gdb_string_h) $(gregset_h) \
  	$(x86_64_tdep_h) $(gdb_proc_service_h)
  x86-64-linux-tdep.o: x86-64-linux-tdep.c $(defs_h) $(inferior_h) $(gdbcore_h) \
 -	$(regcache_h) $(osabi_h) $(gdb_string_h) $(x86_64_tdep_h) 
 +	$(regcache_h) $(osabi_h) $(gdb_string_h) $(gdb_assert_h) \
 +	$(x86_64_tdep_h) $(x86_64_linux_tdep_h) $(i386_linux_tdep_h)
  x86-64-tdep.o: x86-64-tdep.c $(defs_h) \
  	$(inferior_h) $(gdbcore_h) $(arch_utils_h) $(block_h) \
  	$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
 Index: i386-tdep.h
 ===================================================================
 RCS file: /cvs/src/src/gdb/i386-tdep.h,v
 retrieving revision 1.24
 diff -u -r1.24 i386-tdep.h
 --- i386-tdep.h	31 May 2003 16:08:05 -0000	1.24
 +++ i386-tdep.h	1 Aug 2003 15:12:10 -0000
 @@ -142,15 +142,53 @@
  #define FDS_REGNUM FOSEG_REGNUM
  #define FDOFF_REGNUM FOOFF_REGNUM
  
 -/* Register numbers of various important registers.  */
 +/* Register numbers for the fixed i386 registers.  */
  
 -#define I386_EAX_REGNUM		0 /* %eax */
 -#define I386_EDX_REGNUM		2 /* %edx */
 -#define I386_ESP_REGNUM		4 /* %esp */
 -#define I386_EBP_REGNUM		5 /* %ebp */
 -#define I386_EIP_REGNUM		8 /* %eip */
 -#define I386_EFLAGS_REGNUM	9 /* %eflags */
 -#define I386_ST0_REGNUM		16 /* %st(0) */
 +enum i386_regnums
 +{
 +  I386_EAX_REGNUM,
 +  I386_ECX_REGNUM,
 +  I386_EDX_REGNUM,
 +  I386_EBX_REGNUM,
 +  I386_ESP_REGNUM,
 +  I386_EBP_REGNUM,
 +  I386_ESI_REGNUM,
 +  I386_EDI_REGNUM,
 +  I386_EIP_REGNUM,
 +  I386_EFLAGS_REGNUM,
 +  I386_CS_REGNUM,
 +  I386_SS_REGNUM,
 +  I386_DS_REGNUM,
 +  I386_ES_REGNUM,
 +  I386_FS_REGNUM,
 +  I386_GS_REGNUM,
 +  I386_ST0_REGNUM,
 +  I386_ST1_REGNUM,
 +  I386_ST2_REGNUM,
 +  I386_ST3_REGNUM,
 +  I386_ST4_REGNUM,
 +  I386_ST5_REGNUM,
 +  I386_ST6_REGNUM,
 +  I386_ST7_REGNUM,
 +  I386_FCTRL_REGNUM,
 +  I386_FSTAT_REGNUM,
 +  I386_FTAG_REGNUM,
 +  I386_FISEG_REGNUM,
 +  I386_FIOFF_REGNUM,
 +  I386_FOSEG_REGNUM,
 +  I386_FOOFF_REGNUM,
 +  I386_FOP_REGNUM,
 +  I386_XMM0_REGNUM,
 +  I386_XMM1_REGNUM,
 +  I386_XMM2_REGNUM,
 +  I386_XMM3_REGNUM,
 +  I386_XMM4_REGNUM,
 +  I386_XMM5_REGNUM,
 +  I386_XMM6_REGNUM,
 +  I386_XMM7_REGNUM,
 +  I386_MXCSR_REGNUM,
 +  I386_ORIG_EAX_REGNUM
 +};
  
  #define I386_NUM_GREGS	16
  #define I386_NUM_FREGS	16
 Index: x86-64-linux-nat.c
 ===================================================================
 RCS file: /cvs/src/src/gdb/x86-64-linux-nat.c,v
 retrieving revision 1.25
 diff -u -r1.25 x86-64-linux-nat.c
 --- x86-64-linux-nat.c	17 Jul 2003 12:49:52 -0000	1.25
 +++ x86-64-linux-nat.c	1 Aug 2003 15:12:10 -0000
 @@ -53,12 +53,8 @@
  /* Which ptrace request retrieves which registers?
     These apply to the corresponding SET requests as well.  */
  
 -#define GETREGS_SUPPLIES(regno) \
 -  (0 <= (regno) && (regno) < X86_64_NUM_GREGS)
 -
  #define GETFPREGS_SUPPLIES(regno) \
    (FP0_REGNUM <= (regno) && (regno) <= MXCSR_REGNUM)
 -
  
  /* Transfering the general-purpose registers between GDB, inferiors
     and core files.  */
 @@ -190,7 +186,7 @@
        return;
      }
  
 -  if (GETREGS_SUPPLIES (regno))
 +  if (x86_64_linux_greg_offset (regno) >= 0)
      {
        fetch_regs (tid);
        return;
 @@ -227,7 +223,7 @@
        return;
      }
  
 -  if (GETREGS_SUPPLIES (regno))
 +  if (x86_64_linux_greg_offset (regno) >= 0)
      {
        store_regs (tid, regno);
        return;
 Index: x86-64-linux-tdep.c
 ===================================================================
 RCS file: /cvs/src/src/gdb/x86-64-linux-tdep.c,v
 retrieving revision 1.20
 diff -u -r1.20 x86-64-linux-tdep.c
 --- x86-64-linux-tdep.c	15 Jul 2003 11:33:59 -0000	1.20
 +++ x86-64-linux-tdep.c	1 Aug 2003 15:12:10 -0000
 @@ -28,50 +28,173 @@
  #include "osabi.h"
  
  #include "gdb_string.h"
 +#include "gdb_assert.h"
  
  #include "x86-64-tdep.h"
  #include "x86-64-linux-tdep.h"
 +#include "i386-linux-tdep.h"	/* For I386_LINUX_ORIG_EAX_REGNUM.  */
  
  /* Register indexes to 'struct user' come from <sys/reg.h>.  */
  
 -#define USER_R15    0
 -#define USER_R14    1
 -#define USER_R13    2
 -#define USER_R12    3
 -#define USER_RBP    4
 -#define USER_RBX    5
 -#define USER_R11    6
 -#define USER_R10    7
 -#define USER_R9     8
 -#define USER_R8     9
 -#define USER_RAX    10
 -#define USER_RCX    11
 -#define USER_RDX    12
 -#define USER_RSI    13
 -#define USER_RDI    14
 -#define USER_RIP    16
 -#define USER_CS     17
 -#define USER_EFLAGS 18
 -#define USER_RSP    19
 -#define USER_SS     20
 -#define USER_DS     23
 -#define USER_ES     24
 -#define USER_FS     25
 -#define USER_GS     26
 -
 -/* Mapping between the general-purpose registers in `struct user'
 -   format and GDB's register array layout.  */
 -
 -static int user_to_gdb_regmap[] =
 -{
 -  USER_RAX, USER_RBX, USER_RCX, USER_RDX,
 -  USER_RSI, USER_RDI, USER_RBP, USER_RSP,
 -  USER_R8, USER_R9, USER_R10, USER_R11,
 -  USER_R12, USER_R13, USER_R14, USER_R15,
 -  USER_RIP, USER_EFLAGS, USER_CS, USER_SS,
 -  USER_DS, USER_ES, USER_FS, USER_GS
 +enum user_regs
 +{
 +  USER_R15,
 +  USER_R14,
 +  USER_R13,
 +  USER_R12,
 +  USER_RBP,
 +  USER_RBX,
 +  USER_R11,
 +  USER_R10,
 +  USER_R9,
 +  USER_R8,
 +  USER_RAX,
 +  USER_RCX,
 +  USER_RDX,
 +  USER_RSI,
 +  USER_RDI,
 +  USER_ORIG_RAX,
 +  USER_RIP,
 +  USER_CS,
 +  USER_EFLAGS,
 +  USER_RSP,
 +  USER_SS,
 +  USER_FS_BASE,
 +  USER_GS_BASE,
 +  USER_DS,
 +  USER_ES,
 +  USER_FS,
 +  USER_GS,
 +  USER_MAX
 +};
 +
 +/* Map from GDB's i386/x86-64 REGNUM indexed general-purpose registers
 +   to a `struct user' array of registers..  */
 +
 +struct regnum_map
 +{
 +  int regnum;
 +  int user;
 +};
 +
 +struct regnum_to_user
 +{
 +  long nr;
 +  const struct regnum_map *map;
  };
  
 +long
 +x86_64_linux_greg_offset (int regnum)
 +{
 +  const static struct regnum_map i386_regnum_map[] =
 +  {
 +    { I386_EAX_REGNUM, USER_RAX },
 +    { I386_ECX_REGNUM, USER_RCX },
 +    { I386_EDX_REGNUM, USER_RDX },
 +    { I386_EBX_REGNUM, USER_RBX },
 +    { I386_ESP_REGNUM, USER_RSP },
 +    { I386_EBP_REGNUM, USER_RBP },
 +    { I386_ESI_REGNUM, USER_RSI },
 +    { I386_EDI_REGNUM, USER_RDI },
 +    { I386_EIP_REGNUM, USER_RIP },
 +    { I386_EFLAGS_REGNUM, USER_EFLAGS },
 +    { I386_CS_REGNUM, USER_CS },
 +    { I386_SS_REGNUM, USER_SS },
 +    { I386_DS_REGNUM, USER_DS },
 +    { I386_ES_REGNUM, USER_ES },
 +    { I386_FS_REGNUM, USER_FS },
 +    { I386_GS_REGNUM, USER_GS },
 +    { I386_ST0_REGNUM, -1 },
 +    { I386_ST1_REGNUM, -1 },
 +    { I386_ST2_REGNUM, -1 },
 +    { I386_ST3_REGNUM, -1 },
 +    { I386_ST4_REGNUM, -1 },
 +    { I386_ST5_REGNUM, -1 },
 +    { I386_ST6_REGNUM, -1 },
 +    { I386_ST7_REGNUM, -1 },
 +    { I386_FCTRL_REGNUM, -1 },
 +    { I386_FSTAT_REGNUM, -1 },
 +    { I386_FTAG_REGNUM, -1 },
 +    { I386_FISEG_REGNUM, -1 },
 +    { I386_FIOFF_REGNUM, -1 },
 +    { I386_FOSEG_REGNUM, -1 },
 +    { I386_FOOFF_REGNUM, -1 },
 +    { I386_FOP_REGNUM, -1 },
 +    { I386_XMM0_REGNUM, -1 },
 +    { I386_XMM1_REGNUM, -1 },
 +    { I386_XMM2_REGNUM, -1 },
 +    { I386_XMM3_REGNUM, -1 },
 +    { I386_XMM4_REGNUM, -1 },
 +    { I386_XMM5_REGNUM, -1 },
 +    { I386_XMM6_REGNUM, -1 },
 +    { I386_XMM7_REGNUM, -1 },
 +    { I386_MXCSR_REGNUM, -1 },
 +    { I386_LINUX_ORIG_EAX_REGNUM, USER_ORIG_RAX },
 +  };
 +  const static struct regnum_to_user i386_regnum_to_user =
 +  {
 +    ARRAY_SIZE (i386_regnum_map), i386_regnum_map
 +  };
 +  const static struct regnum_map x86_64_regnum_map[] =
 +  {
 +    { X86_64_RAX_REGNUM, USER_RAX },
 +    { X86_64_RBX_REGNUM, USER_RBX },
 +    { X86_64_RCX_REGNUM, USER_RCX },
 +    { X86_64_RDX_REGNUM, USER_RDX },
 +    { X86_64_RSI_REGNUM, USER_RSI },
 +    { X86_64_RDI_REGNUM, USER_RDI },
 +    { X86_64_RBP_REGNUM, USER_RBP },
 +    { X86_64_RSP_REGNUM, USER_RSP },
 +    { X86_64_R8_REGNUM, USER_R8 },
 +    { X86_64_R9_REGNUM, USER_R9 },
 +    { X86_64_R10_REGNUM, USER_R10 },
 +    { X86_64_R11_REGNUM, USER_R11 },
 +    { X86_64_R12_REGNUM, USER_R12 },
 +    { X86_64_R13_REGNUM, USER_R13 },
 +    { X86_64_R14_REGNUM, USER_R14 },
 +    { X86_64_R15_REGNUM, USER_R15 },
 +    { X86_64_RIP_REGNUM, USER_RIP },
 +    { X86_64_EFLAGS_REGNUM, USER_EFLAGS },
 +    /* { X86_64_CS_REGNUM, USER_CS }, */
 +    /* { X86_64_SS_REGNUM, USER_SS }, */
 +    { X86_64_DS_REGNUM, USER_DS },
 +    { X86_64_ES_REGNUM, USER_ES },
 +    { X86_64_FS_REGNUM, USER_FS },
 +    { X86_64_GS_REGNUM, USER_GS },
 +  };
 +  const static struct regnum_to_user x86_64_regnum_to_user =
 +  {
 +    ARRAY_SIZE (x86_64_regnum_map), x86_64_regnum_map
 +  };
 +  const struct regnum_to_user *regnum_to_user;
 +
 +  gdb_assert (TARGET_ARCHITECTURE->arch == bfd_arch_i386);
 +  switch (TARGET_ARCHITECTURE->mach)
 +    {
 +    case bfd_mach_i386_i386:
 +    case bfd_mach_i386_i386_intel_syntax:
 +      regnum_to_user = &i386_regnum_to_user;
 +      break;
 +    case bfd_mach_x86_64:
 +    case bfd_mach_x86_64_intel_syntax:
 +      regnum_to_user = &x86_64_regnum_to_user;
 +      break;
 +    case bfd_mach_i386_i8086:
 +      /* Better suggestion?  */
 +      return -1;
 +    default:
 +      internal_error (__FILE__, __LINE__, "bad_switch");
 +    }
 +  if (regnum < 0)
 +    return USER_MAX * 8;
 +  if (regnum >= regnum_to_user->nr)
 +    return -1;
 +  gdb_assert (regnum_to_user->map[regnum].regnum == regnum);
 +  if (regnum_to_user->map[regnum].user < 0)
 +    return -1;
 +  return regnum_to_user->map[regnum].user * 8;
 +}
 +
  /* Fill GDB's register array with the general-purpose register values
     in *GREGSETP.  */
  
 @@ -79,9 +202,15 @@
  x86_64_linux_supply_gregset (char *regp)
  {
    int i;
 +  char buf[MAX_REGISTER_SIZE];
 +  int bad = 0;
  
 -  for (i = 0; i < X86_64_NUM_GREGS; i++)
 -    supply_register (i, regp + (user_to_gdb_regmap[i] * 8));
 +  for (i = 0; i < NUM_REGS; i++)
 +    {
 +      long offset = x86_64_linux_greg_offset (i);
 +      if (offset >= 0)
 +	supply_register (i, regp + offset);
 +    }
  }
  
  /* Fill register REGNO (if it is a general-purpose register) in
 @@ -93,9 +222,20 @@
  {
    int i;
  
 -  for (i = 0; i < X86_64_NUM_GREGS; i++)
 +  for (i = 0; i < NUM_REGS; i++)
      if (regno == -1 || regno == i)
 -      regcache_collect (i, regp + (user_to_gdb_regmap[i] * 8));
 +      {
 +	long offset = x86_64_linux_greg_offset (i);
 +	if (offset >= 0)
 +	  {
 +	    char buf[MAX_REGISTER_SIZE];
 +	    memset (buf, 0, sizeof buf);
 +	    /* Assume little endian - LHS of buffer is the correct
 +               place to put the collected bytes.  */
 +	    regcache_collect (i, buf);
 +	    memcpy (regp + offset, buf, 8);
 +	  }
 +    }
  }
  
  /* The register sets used in GNU/Linux ELF core-dumps are identical to
 @@ -111,7 +251,7 @@
    switch (which)
      {
      case 0:  /* Integer registers.  */
 -      if (core_reg_size != 216)
 +      if (x86_64_linux_greg_offset (-1) > core_reg_size)
  	warning ("Wrong size register set in core file.");
        else
  	x86_64_linux_supply_gregset (core_reg_sect);
 @@ -132,11 +272,23 @@
      }
  }
  
 +static int
 +x86_64_core_sniffer (struct core_fns *our_fns, bfd *abfd)
 +{
 +  int result;
 +
 +  result = ((bfd_get_flavour (abfd) == our_fns -> core_flavour)
 +	    && bfd_get_arch (abfd) == bfd_arch_i386
 +	    && (bfd_get_mach (abfd) == bfd_mach_x86_64
 +		|| bfd_get_mach (abfd) == bfd_mach_x86_64_intel_syntax));
 +  return (result);
 +}
 +
  static struct core_fns x86_64_core_fns = 
  {
    bfd_target_elf_flavour,		/* core_flavour */
    default_check_format,			/* check_format */
 -  default_core_sniffer,			/* core_sniffer */
 +  x86_64_core_sniffer,			/* core_sniffer */
    fetch_core_registers,			/* core_read_registers */
    NULL					/* next */
  };
 Index: x86-64-linux-tdep.h
 ===================================================================
 RCS file: /cvs/src/src/gdb/x86-64-linux-tdep.h,v
 retrieving revision 1.1
 diff -u -r1.1 x86-64-linux-tdep.h
 --- x86-64-linux-tdep.h	15 Jul 2003 12:34:08 -0000	1.1
 +++ x86-64-linux-tdep.h	1 Aug 2003 15:12:10 -0000
 @@ -36,4 +36,10 @@
  
  void x86_64_linux_fill_gregset (char *regp, int regno);
  
 +/* Given a GDB REGNUM, return the byte offset in the target's GREGs
 +   buffer, or -1 if there is no corresponding GREGSET / FPREGSET
 +   entry.  Given a -ve REGNUM, returns the GREG's upper bound.  */
 +
 +extern long x86_64_linux_greg_offset (int regnum);
 +
  #endif /* x86-64-linux-tdep.h */
 Index: x86-64-tdep.h
 ===================================================================
 RCS file: /cvs/src/src/gdb/x86-64-tdep.h,v
 retrieving revision 1.16
 diff -u -r1.16 x86-64-tdep.h
 --- x86-64-tdep.h	9 Jul 2003 22:10:58 -0000	1.16
 +++ x86-64-tdep.h	1 Aug 2003 15:12:10 -0000
 @@ -30,18 +30,66 @@
  
  #include "i386-tdep.h"
  
 -/* Register numbers of various important registers.  */
 +/* Register numbers of x86-64 registers.  */
  
 -#define X86_64_RAX_REGNUM	0 /* %rax */
 -#define X86_64_RDX_REGNUM	3 /* %rdx */
 -#define X86_64_RDI_REGNUM	5 /* %rdi */
 -#define X86_64_RBP_REGNUM	6 /* %rbp */
 -#define X86_64_RSP_REGNUM	7 /* %rsp */
 -#define X86_64_RIP_REGNUM	16 /* %rip */
 -#define X86_64_EFLAGS_REGNUM	17 /* %eflags */
 -#define X86_64_ST0_REGNUM	22 /* %st0 */
 -#define X86_64_XMM0_REGNUM	38 /* %xmm0 */
 -#define X86_64_XMM1_REGNUM	39 /* %xmm1 */
 +enum x86_64_regnums
 +{
 +  X86_64_RAX_REGNUM,
 +  X86_64_RBX_REGNUM,
 +  X86_64_RCX_REGNUM,
 +  X86_64_RDX_REGNUM,
 +  X86_64_RSI_REGNUM,
 +  X86_64_RDI_REGNUM,
 +  X86_64_RBP_REGNUM,
 +  X86_64_RSP_REGNUM,
 +  X86_64_R8_REGNUM,
 +  X86_64_R9_REGNUM,
 +  X86_64_R10_REGNUM,
 +  X86_64_R11_REGNUM,
 +  X86_64_R12_REGNUM,
 +  X86_64_R13_REGNUM,
 +  X86_64_R14_REGNUM,
 +  X86_64_R15_REGNUM,
 +  X86_64_RIP_REGNUM,
 +  X86_64_EFLAGS_REGNUM,
 +  X86_64_DS_REGNUM,
 +  X86_64_ES_REGNUM,
 +  X86_64_FS_REGNUM,
 +  X86_64_GS_REGNUM,
 +  X86_64_ST0_REGNUM,
 +  X86_64_ST1_REGNUM,
 +  X86_64_ST2_REGNUM,
 +  X86_64_ST3_REGNUM,
 +  X86_64_ST4_REGNUM,
 +  X86_64_ST5_REGNUM,
 +  X86_64_ST6_REGNUM,
 +  X86_64_ST7_REGNUM,
 +  X86_64_FCTRL_REGNUM,
 +  X86_64_FSTAT_REGNUM,
 +  X86_64_FTAG_REGNUM,
 +  X86_64_FISEG_REGNUM,
 +  X86_64_FIOFF_REGNUM,
 +  X86_64_FOSEG_REGNUM,
 +  X86_64_FOOFF_REGNUM,
 +  X86_64_FOP_REGNUM,
 +  X86_64_XMM0_REGNUM,
 +  X86_64_XMM1_REGNUM,
 +  X86_64_XMM2_REGNUM,
 +  X86_64_XMM3_REGNUM,
 +  X86_64_XMM4_REGNUM,
 +  X86_64_XMM5_REGNUM,
 +  X86_64_XMM6_REGNUM,
 +  X86_64_XMM7_REGNUM,
 +  X86_64_XMM8_REGNUM,
 +  X86_64_XMM9_REGNUM,
 +  X86_64_XMM10_REGNUM,
 +  X86_64_XMM11_REGNUM,
 +  X86_64_XMM12_REGNUM,
 +  X86_64_XMM13_REGNUM,
 +  X86_64_XMM14_REGNUM,
 +  X86_64_XMM15_REGNUM,
 +  X86_64_MXCSR_REGNUM
 +};
  
  /* Number of general purpose registers.  */
  #define X86_64_NUM_GREGS	22
 
 --------------010605000708010801080708--
 
 
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]