This is the mail archive of the
gdb-prs@sources.redhat.com
mailing list for the GDB project.
pending/1348: Re: [rfa] Add 32 bit (i386) support to x86-64-pc-linux-gnu
- From: Andrew Cagney <ac131313 at redhat dot com>
- To: gdb-gnats at sources dot redhat dot com
- Date: Fri, 01 Aug 2003 11:16:17 -0400
- Subject: pending/1348: Re: [rfa] Add 32 bit (i386) support to x86-64-pc-linux-gnu
- References: <3F228FEA.2010605@redhat.com>
>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: