This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: Patch to support AMD64 Solaris 10
On Mon, 25 Oct 2004, Mark Kettenis wrote:
> Thanks for your contribution. The code looks pretty good to me, but
> here are a few comments.
This revised patch tries to take account of those comments.
> The configuration is based on the existing IA32 Solaris support.
>
> Fair enough, although it's not necessarily the best example.
The configuration remains based on that one.
> This sounds pretty much like the situation for Solaris SPARC. I think
> the way this is solved in sparc-sol2-tdep.c is pretty elegant, but I
> may be biased ;-). The defined(__arch64__) should be dropped though,
> since there is no need to support Linux and IA-32/AMD64. For
> consistency with SPARC I'd suggest nameing the file i386-sol2-nat.c.
It is now following sparc-sol2-nat.c - for that purpose I split
i386v4-nat.c into two files, one defining the functions under different
names so they can be used in this way and one defining the existing
functions as wrappers for those names.
> Comparison with Solaris SPARC makes me believe that using
> gregset_t/fpregset_t in amd64-sol2-nat.c isn't right and that you
> should use prgregset_t/prfpregset_t instead.
I haven't made any changes in this area; i386v4-nat.c / i386v4-regset.c,
now used from this file, use gregset_t/fpregset_t themselves.
> Again, for consistency with Solaris SPARC, could you name the makefile
> fragments sol2-64.m[th] instead of sol64.m[th]?
Now named i386sol2-65.m[th] given the existing naming of the IA32 Solaris
fragments.
--
Joseph S. Myers
joseph@codesourcery.com
2004-10-26 Joseph S. Myers <joseph@codesourcery.com>
* Makefile.in (ALLDEPFILES): Add i386-sol2-nat.c, i386v4-regset.c
and amd64-sol2-tdep.c.
(i386v4_regset_h): New
(amd64-sol2-tdep.o, i386-sol2-nat.o, i386v4-regset.o): Add
dependencies.
(i386v4-nat.o): Update dependencies.
* i386-sol2-nat.c, i386v4-regset.h, amd64-sol2-tdep.c,
config/i386/i386sol2-64.mh, config/i386/i386sol2-64.mt: New files.
* i386v4-regset.c: Copy i386v4-nat.c with functions under
different names.
* i384v4-nat.c: Use functions from i386v4-regset.c
* configu/i386/i386v4.mh, config/i386/i386v42mp.mh,
config/i386/ncr3000.mh: Use i386v4-regset.o as well as
i386v4-nat.o.
* configure.host (i[34567]86-*-solaris2.1[0-9]*): Add new case.
* configure.tgt (i[34567]86-*-solaris2.1[0-9]*): Likewise.
* configure.in (*-*-solaris2.[[6789]]): Add *-*-solaris2.1[[0-9]]
for definition of NEW_PROC_API.
* configure: Regenerate.
diff -rupN gdb/Makefile.in gdb-new/Makefile.in
--- gdb/Makefile.in 2004-10-16 09:40:55.000000000 +0000
+++ gdb-new/Makefile.in 2004-10-26 19:01:42.000000000 +0000
@@ -701,6 +701,7 @@ gnu_nat_h = gnu-nat.h
gregset_h = gregset.h
hppa_tdep_h = hppa-tdep.h
i386bsd_nat_h = i386bsd-nat.h
+i386v4_regset_h = i386v4-regset.h
i386_linux_tdep_h = i386-linux-tdep.h
i386_tdep_h = i386-tdep.h
i387_tdep_h = i387-tdep.h
@@ -1358,6 +1359,7 @@ ALLDEPFILES = \
amd64nbsd-nat.c amd64nbsd-tdep.c \
amd64obsd-nat.c amd64obsd-tdep.c \
amd64-linux-nat.c amd64-linux-tdep.c \
+ amd64-sol2-tdep.c \
arm-linux-nat.c arm-linux-tdep.c arm-tdep.c \
armnbsd-nat.c armnbsd-tdep.c \
avr-tdep.c \
@@ -1374,6 +1376,7 @@ ALLDEPFILES = \
hppa-linux-tdep.c hppa-linux-nat.c \
hppabsd-nat.c hppabsd-tdep.c \
i386-tdep.c i386v-nat.c i386-linux-nat.c \
+ i386-sol2-nat.c i386v4-regset.c \
i386v4-nat.c i386ly-tdep.c i386-cygwin-tdep.c \
i386bsd-nat.c i386bsd-tdep.c i386fbsd-nat.c i386fbsd-tdep.c \
i386nbsd-nat.c i386nbsd-tdep.c i386obsd-nat.c i386obsd-tdep.c \
@@ -1690,6 +1693,9 @@ amd64obsd-tdep.o: amd64obsd-tdep.c $(def
$(symtab_h) $(objfiles_h) $(osabi_h) $(regset_h) $(target_h) \
$(gdb_assert_h) $(gdb_string_h) $(amd64_tdep_h) $(i387_tdep_h) \
$(solib_svr4_h)
+amd64-sol2-tdep.o: amd64-sol2-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
+ $(regcache_h) $(osabi_h) $(symtab_h) $(gdb_string_h) $(amd64_tdep_h) \
+ $(solib_svr4_h)
amd64-tdep.o: amd64-tdep.c $(defs_h) $(arch_utils_h) $(block_h) \
$(dummy_frame_h) $(frame_h) $(frame_base_h) $(frame_unwind_h) \
$(inferior_h) $(gdbcmd_h) $(gdbcore_h) $(objfiles_h) $(regcache_h) \
@@ -2032,6 +2038,9 @@ i386obsd-tdep.o: i386obsd-tdep.c $(defs_
$(gdbcore_h) $(regcache_h) $(regset_h) $(symtab_h) $(objfiles_h) \
$(osabi_h) $(target_h) $(gdb_assert_h) $(gdb_string_h) \
$(i386_tdep_h) $(i387_tdep_h) $(solib_svr4_h)
+i386-sol2-nat.o: i386-sol2-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) \
+ $(regcache_h) $(osabi_h) $(symtab_h) $(gdb_string_h) $(amd64_tdep_h) \
+ $(gregset_h) $(amd64_nat_h)
i386-sol2-tdep.o: i386-sol2-tdep.c $(defs_h) $(value_h) $(osabi_h) \
$(gdb_string_h) $(i386_tdep_h) $(solib_svr4_h)
i386-stub.o: i386-stub.c
@@ -2043,7 +2052,10 @@ i386-tdep.o: i386-tdep.c $(defs_h) $(arc
$(value_h) $(dis_asm_h) $(gdb_assert_h) $(gdb_string_h) \
$(i386_tdep_h) $(i387_tdep_h)
i386v4-nat.o: i386v4-nat.c $(defs_h) $(value_h) $(inferior_h) $(regcache_h) \
- $(i386_tdep_h) $(i387_tdep_h) $(gregset_h)
+ $(i386_tdep_h) $(i387_tdep_h) $(gregset_h) $(i386v4_regset_h)
+i386v4-regset.o: i386v4-regset.c $(defs_h) $(value_h) $(inferior_h) \
+ $(regcache_h) $(i386_tdep_h) $(i387_tdep_h) $(gregset_h) \
+ $(i386v4_regset_h)
i386v-nat.o: i386v-nat.c $(defs_h) $(frame_h) $(inferior_h) $(language_h) \
$(gdbcore_h) $(gdb_stat_h) $(floatformat_h) $(target_h) \
$(i386_tdep_h)
diff -rupN gdb/amd64-sol2-tdep.c gdb-new/amd64-sol2-tdep.c
--- gdb/amd64-sol2-tdep.c 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/amd64-sol2-tdep.c 2004-10-26 18:43:26.000000000 +0000
@@ -0,0 +1,126 @@
+/* Target-dependent code for AMD64 Solaris.
+
+ Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Contributed by Joseph Myers, CodeSourcery, LLC.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include "defs.h"
+#include "frame.h"
+#include "gdbcore.h"
+#include "regcache.h"
+#include "osabi.h"
+#include "symtab.h"
+
+#include "gdb_string.h"
+
+#include "amd64-tdep.h"
+#include "solib-svr4.h"
+
+/* Mapping between the general-purpose registers in gregset_t format
+ and GDB's register cache layout. */
+
+/* From <sys/regset.h>. */
+static int amd64_sol2_gregset_reg_offset[] =
+{
+ 14 * 8, /* %rax */
+ 11 * 8, /* %rbx */
+ 13 * 8, /* %rcx */
+ 12 * 8, /* %rdx */
+ 9 * 8, /* %rsi */
+ 8 * 8, /* %rdi */
+ 10 * 8, /* %rbp */
+ 20 * 8, /* %rsp */
+ 7 * 8, /* %r8 ... */
+ 6 * 8,
+ 5 * 8,
+ 4 * 8,
+ 3 * 8,
+ 2 * 8,
+ 1 * 8,
+ 0 * 8, /* ... %r15 */
+ 17 * 8, /* %rip */
+ 16 * 8, /* %eflags */
+ 18 * 8, /* %cs */
+ 21 * 8, /* %ss */
+ 25 * 8, /* %ds */
+ 24 * 8, /* %es */
+ 22 * 8, /* %fs */
+ 23 * 8 /* %gs */
+};
+
+
+/* Return whether the frame preceding NEXT_FRAME corresponds to a
+ Solaris sigtramp routine. */
+
+static int
+amd64_sol2_sigtramp_p (struct frame_info *next_frame)
+{
+ CORE_ADDR pc = frame_pc_unwind (next_frame);
+ char *name;
+
+ find_pc_partial_function (pc, &name, NULL, NULL);
+ return (name && (strcmp ("sigacthandler", name) == 0
+ || strcmp (name, "ucbsigvechandler") == 0));
+}
+
+/* Solaris doesn't have a 'struct sigcontext', but it does have a
+ 'mcontext_t' that contains the saved set of machine registers. */
+
+static CORE_ADDR
+amd64_sol2_mcontext_addr (struct frame_info *next_frame)
+{
+ CORE_ADDR sp, ucontext_addr;
+
+ sp = frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
+ ucontext_addr = get_frame_memory_unsigned (next_frame, sp + 8, 8);
+
+ return ucontext_addr + 72;
+}
+
+static void
+amd64_sol2_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+ tdep->gregset_reg_offset = amd64_sol2_gregset_reg_offset;
+ tdep->gregset_num_regs = ARRAY_SIZE (amd64_sol2_gregset_reg_offset);
+ tdep->sizeof_gregset = 28 * 8;
+
+ amd64_init_abi (info, gdbarch);
+
+ tdep->sigtramp_p = amd64_sol2_sigtramp_p;
+ tdep->sigcontext_addr = amd64_sol2_mcontext_addr;
+ tdep->sc_reg_offset = tdep->gregset_reg_offset;
+ tdep->sc_num_regs = tdep->gregset_num_regs;
+
+ /* Solaris uses SVR4-style shared libraries. */
+ set_solib_svr4_fetch_link_map_offsets
+ (gdbarch, svr4_lp64_fetch_link_map_offsets);
+}
+
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern void _initialize_amd64_sol2_tdep (void);
+
+void
+_initialize_amd64_sol2_tdep (void)
+{
+ gdbarch_register_osabi (bfd_arch_i386, bfd_mach_x86_64,
+ GDB_OSABI_SOLARIS, amd64_sol2_init_abi);
+}
diff -rupN gdb/config/i386/i386sol2-64.mh gdb-new/config/i386/i386sol2-64.mh
--- gdb/config/i386/i386sol2-64.mh 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/config/i386/i386sol2-64.mh 2004-10-26 19:19:28.000000000 +0000
@@ -0,0 +1,4 @@
+# Host: Solaris x86_64
+NATDEPFILES= fork-child.o amd64-nat.o i386v4-regset.o i386-sol2-nat.o \
+ procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o gcore.o
+NAT_FILE= nm-i386sol2.h
diff -rupN gdb/config/i386/i386sol2-64.mt gdb-new/config/i386/i386sol2-64.mt
--- gdb/config/i386/i386sol2-64.mt 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/config/i386/i386sol2-64.mt 2004-10-22 14:54:21.000000000 +0000
@@ -0,0 +1,4 @@
+# Target: Solaris x86_64
+TDEPFILES= i386-tdep.o i387-tdep.o amd64-tdep.o amd64-sol2-tdep.o \
+ i386-sol2-tdep.o corelow.o solib.o solib-svr4.o
+DEPRECATED_TM_FILE= tm-i386sol2.h
diff -rupN gdb/config/i386/i386v4.mh gdb-new/config/i386/i386v4.mh
--- gdb/config/i386/i386v4.mh 2004-08-06 08:05:24.000000000 +0000
+++ gdb-new/config/i386/i386v4.mh 2004-10-26 18:42:18.000000000 +0000
@@ -1,6 +1,6 @@
# Host: Intel 386 running SVR4
NAT_FILE= nm-i386v4.h
-NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o \
- solib.o solib-svr4.o solib-legacy.o \
+NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-regset.o \
+ i386v4-nat.o solib.o solib-svr4.o solib-legacy.o \
procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o
diff -rupN gdb/config/i386/i386v42mp.mh gdb-new/config/i386/i386v42mp.mh
--- gdb/config/i386/i386v42mp.mh 2004-08-06 08:05:24.000000000 +0000
+++ gdb-new/config/i386/i386v42mp.mh 2004-10-26 18:42:43.000000000 +0000
@@ -11,6 +11,6 @@ NAT_FILE= nm-i386v42mp.h
# consequence, make considers subsequent tab-indented lines to be
# some sort of error.
NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o \
- gcore.o solib.o solib-svr4.o solib-legacy.o procfs.o proc-api.o \
- proc-events.o proc-flags.o proc-why.o uw-thread.o
+ i386v4-regset.o gcore.o solib.o solib-svr4.o solib-legacy.o procfs.o \
+ proc-api.o proc-events.o proc-flags.o proc-why.o uw-thread.o
diff -rupN gdb/config/i386/ncr3000.mh gdb-new/config/i386/ncr3000.mh
--- gdb/config/i386/ncr3000.mh 2004-08-06 08:05:24.000000000 +0000
+++ gdb-new/config/i386/ncr3000.mh 2004-10-26 18:43:05.000000000 +0000
@@ -1,5 +1,6 @@
# Host: NCR 3000 (Intel 386 running SVR4)
NAT_FILE= nm-i386v4.h
-NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o procfs.o \
- proc-api.o proc-events.o proc-flags.o proc-why.o
+NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o \
+ i386v4-regset.o procfs.o proc-api.o proc-events.o proc-flags.o \
+ proc-why.o
diff -rupN gdb/configure.host gdb-new/configure.host
--- gdb/configure.host 2004-09-02 08:31:47.000000000 +0000
+++ gdb-new/configure.host 2004-10-26 19:14:27.000000000 +0000
@@ -77,6 +77,7 @@ i[34567]86-*-openbsd*) gdb_host=obsd ;;
i[34567]86-*-sco3.2v5*) gdb_host=i386sco5 ;;
i[34567]86-*-sco3.2v4*) gdb_host=i386sco4 ;;
i[34567]86-*-sco*) gdb_host=i386sco ;;
+i[34567]86-*-solaris2.1[0-9]*) gdb_host=i386sol2-64 ;;
i[34567]86-*-solaris*) gdb_host=i386sol2 ;;
i[34567]86-*-sysv4.2*) gdb_host=i386v42mp ;;
i[34567]86-*-sysv4*) gdb_host=i386v4 ;;
diff -rupN gdb/configure.in gdb-new/configure.in
--- gdb/configure.in 2004-10-11 08:48:32.000000000 +0000
+++ gdb-new/configure.in 2004-10-22 14:54:21.000000000 +0000
@@ -725,7 +725,7 @@ if test "${target}" = "${host}"; then
*-*-unixware* | *-*-sysv4.2* | *-*-sysv5* | *-*-interix* )
AC_DEFINE(NEW_PROC_API)
;;
- *-*-solaris2.[[6789]])
+ *-*-solaris2.[[6789]] | *-*-solaris2.1[[0-9]])
AC_DEFINE(NEW_PROC_API)
;;
mips-sgi-irix5*)
diff -rupN gdb/configure.tgt gdb-new/configure.tgt
--- gdb/configure.tgt 2004-10-04 07:44:59.000000000 +0000
+++ gdb-new/configure.tgt 2004-10-26 19:14:37.000000000 +0000
@@ -89,6 +89,7 @@ i[34567]86-*-netbsd* | i[34567]86-*-knet
i[34567]86-*-openbsd*) gdb_target=obsd ;;
i[34567]86-*-nto*) gdb_target=nto ;;
i[34567]86-*-lynxos*) gdb_target=i386lynx ;;
+i[34567]86-*-solaris2.1[0-9]*) gdb_target=i386sol2-64 ;;
i[34567]86-*-solaris*) gdb_target=i386sol2 ;;
i[34567]86-*-linux*) gdb_target=linux
build_gdbserver=yes
diff -rupN gdb/i386-sol2-nat.c gdb-new/i386-sol2-nat.c
--- gdb/i386-sol2-nat.c 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/i386-sol2-nat.c 2004-10-26 18:56:24.000000000 +0000
@@ -0,0 +1,173 @@
+/* Native-dependent code for AMD64 Solaris.
+
+ Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+ Contributed by Joseph Myers, CodeSourcery, LLC.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include "defs.h"
+#include "inferior.h"
+#include "gdbcore.h"
+#include "regcache.h"
+#include "osabi.h"
+#include "symtab.h"
+
+#include "gdb_string.h"
+
+#include <sys/regset.h>
+#include "gregset.h"
+
+#ifdef __x86_64__
+
+#include "amd64-tdep.h"
+#include "amd64-nat.h"
+
+#define i386_sol2_supply_gregset(gregsetp) \
+ amd64_supply_native_gregset (current_regcache, gregsetp, -1)
+#define i386_sol2_fill_gregset(grepsetp, regnum) \
+ amd64_collect_native_gregset (current_regcache, gregsetp, regnum)
+#define i386_sol2_supply_fpregset(fpregsetp) \
+ amd64_supply_fxsave (current_regcache, -1, fpregsetp)
+#define i386_sol2_fill_fpregset(fpregsetp, regnum) \
+ amd64_collect_fxsave (current_regcache, regnum, fpregsetp)
+
+#else
+
+#define i386_sol2_supply_gregset(gregsetp) \
+ i386v4_supply_native_gregset (gregsetp)
+#define i386_sol2_fill_gregset(grepsetp, regnum) \
+ i386v4_collect_native_gregset (gregsetp, regnum)
+#define i386_sol2_supply_fpregset(fpregsetp) \
+ i386v4_supply_fsave (fpregsetp)
+#define i386_sol2_fill_fpregset(fpregsetp, regnum) \
+ i386v4_collect_fsave (fpregsetp, regnum)
+
+#endif
+
+/* Mapping between the general-purpose registers in gregset_t format
+ and GDB's register cache layout. */
+
+/* From <sys/regset.h>. */
+static int amd64_sol2_gregset64_reg_offset[] =
+{
+ 14 * 8, /* %rax */
+ 11 * 8, /* %rbx */
+ 13 * 8, /* %rcx */
+ 12 * 8, /* %rdx */
+ 9 * 8, /* %rsi */
+ 8 * 8, /* %rdi */
+ 10 * 8, /* %rbp */
+ 20 * 8, /* %rsp */
+ 7 * 8, /* %r8 ... */
+ 6 * 8,
+ 5 * 8,
+ 4 * 8,
+ 3 * 8,
+ 2 * 8,
+ 1 * 8,
+ 0 * 8, /* ... %r15 */
+ 17 * 8, /* %rip */
+ 16 * 8, /* %eflags */
+ 18 * 8, /* %cs */
+ 21 * 8, /* %ss */
+ 25 * 8, /* %ds */
+ 24 * 8, /* %es */
+ 22 * 8, /* %fs */
+ 23 * 8 /* %gs */
+};
+
+/* 32-bit registers are provided by Solaris in 64-bit format, so just
+ give a subset of the list above. */
+static int amd64_sol2_gregset32_reg_offset[] =
+{
+ 14 * 8, /* %eax */
+ 13 * 8, /* %ecx */
+ 12 * 8, /* %edx */
+ 11 * 8, /* %ebx */
+ 20 * 8, /* %esp */
+ 10 * 8, /* %ebp */
+ 9 * 8, /* %esi */
+ 8 * 8, /* %edi */
+ 17 * 8, /* %eip */
+ 16 * 8, /* %eflags */
+ 18 * 8, /* %cs */
+ 21 * 8, /* %ss */
+ 25 * 8, /* %ds */
+ 24 * 8, /* %es */
+ 22 * 8, /* %fs */
+ 23 * 8 /* %gs */
+};
+
+
+/* Transfering the general-purpose registers between GDB, inferiors
+ and core files. */
+
+/* Fill GDB's register cache with the general-purpose register values
+ in *GREGSETP. */
+
+void
+supply_gregset (gregset_t *gregsetp)
+{
+ i386_sol2_supply_gregset (gregsetp);
+}
+
+/* Fill register REGNUM (if it is a general-purpose register) in
+ *GREGSETP with the value in GDB's register cache. If REGNUM is -1,
+ do this for all registers. */
+
+void
+fill_gregset (gregset_t *gregsetp, int regnum)
+{
+ i386_sol2_fill_gregset (gregsetp, regnum);
+}
+
+/* Transfering floating-point registers between GDB, inferiors and cores. */
+
+/* Fill GDB's register cache with the floating-point and SSE register
+ values in *FPREGSETP. */
+
+void
+supply_fpregset (fpregset_t *fpregsetp)
+{
+ i386_sol2_supply_fpregset (fpregsetp);
+}
+
+/* Fill register REGNUM (if it is a floating-point or SSE register) in
+ *FPREGSETP with the value in GDB's register cache. If REGNUM is
+ -1, do this for all registers. */
+
+void
+fill_fpregset (fpregset_t *fpregsetp, int regnum)
+{
+ i386_sol2_fill_fpregset (fpregsetp, regnum);
+}
+
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern void _initialize_amd64_sol2_nat (void);
+
+void
+_initialize_amd64_sol2_nat (void)
+{
+#ifdef __x86_64__
+ amd64_native_gregset32_reg_offset = amd64_sol2_gregset32_reg_offset;
+ amd64_native_gregset32_num_regs = ARRAY_SIZE (amd64_sol2_gregset32_reg_offset);
+ amd64_native_gregset64_reg_offset = amd64_sol2_gregset64_reg_offset;
+ amd64_native_gregset64_num_regs = ARRAY_SIZE (amd64_sol2_gregset64_reg_offset);
+#endif
+}
diff -rupN gdb/i386v4-nat.c gdb-new/i386v4-nat.c
--- gdb/i386v4-nat.c 2004-07-02 14:24:09.000000000 +0000
+++ gdb-new/i386v4-nat.c 2004-10-26 18:59:05.000000000 +0000
@@ -32,6 +32,7 @@
#include "i386-tdep.h"
#include "i387-tdep.h"
+#include "i386v4-regset.h"
#ifdef HAVE_SYS_PROCFS_H
@@ -89,27 +90,13 @@
#ifdef HAVE_GREGSET_T
-/* Mapping between the general-purpose registers in `/proc'
- format and GDB's register array layout. */
-static int regmap[] =
-{
- EAX, ECX, EDX, EBX,
- UESP, EBP, ESI, EDI,
- EIP, EFL, CS, SS,
- DS, ES, FS, GS
-};
-
/* Fill GDB's register array with the general-purpose register values
in *GREGSETP. */
void
supply_gregset (gregset_t *gregsetp)
{
- greg_t *regp = (greg_t *) gregsetp;
- int regnum;
-
- for (regnum = 0; regnum < I386_NUM_GREGS; regnum++)
- regcache_raw_supply (current_regcache, regnum, regp + regmap[regnum]);
+ i386v4_supply_native_gregset (gregsetp);
}
/* Fill register REGNUM (if it is a general-purpose register) in
@@ -119,12 +106,7 @@ supply_gregset (gregset_t *gregsetp)
void
fill_gregset (gregset_t *gregsetp, int regnum)
{
- greg_t *regp = (greg_t *) gregsetp;
- int i;
-
- for (i = 0; i < I386_NUM_GREGS; i++)
- if (regnum == -1 || regnum == i)
- regcache_raw_collect (current_regcache, i, regp + regmap[i]);
+ i386v4_collect_native_gregset (gregsetp, regnum);
}
#endif /* HAVE_GREGSET_T */
@@ -137,10 +119,7 @@ fill_gregset (gregset_t *gregsetp, int r
void
supply_fpregset (fpregset_t *fpregsetp)
{
- if (FP0_REGNUM == 0)
- return;
-
- i387_supply_fsave (current_regcache, -1, fpregsetp);
+ i386v4_supply_fsave (fpregsetp);
}
/* Fill register REGNO (if it is a floating-point register) in
@@ -150,10 +129,7 @@ supply_fpregset (fpregset_t *fpregsetp)
void
fill_fpregset (fpregset_t *fpregsetp, int regno)
{
- if (FP0_REGNUM == 0)
- return;
-
- i387_fill_fsave ((char *) fpregsetp, regno);
+ i386v4_collect_fsave (fpregsetp, regno);
}
#endif /* HAVE_FPREGSET_T */
diff -rupN gdb/i386v4-regset.c gdb-new/i386v4-regset.c
--- gdb/i386v4-regset.c 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/i386v4-regset.c 2004-10-26 19:00:21.000000000 +0000
@@ -0,0 +1,162 @@
+/* Native-dependent code for Unix SVR4 running on i386's.
+
+ Copyright 1988, 1989, 1991, 1992, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2004
+ Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include "defs.h"
+#include "value.h"
+#include "inferior.h"
+#include "regcache.h"
+
+#ifdef HAVE_SYS_REG_H
+#include <sys/reg.h>
+#endif
+
+#include "i386-tdep.h"
+#include "i387-tdep.h"
+#include "i386v4-regset.h"
+
+#ifdef HAVE_SYS_PROCFS_H
+
+#include <sys/procfs.h>
+
+/* Prototypes for supply_gregset etc. */
+#include "gregset.h"
+
+/* The `/proc' interface divides the target machine's register set up
+ into two different sets, the general purpose register set (gregset)
+ and the floating-point register set (fpregset). For each set,
+ there is an ioctl to get the current register set and another ioctl
+ to set the current values.
+
+ The actual structure passed through the ioctl interface is, of
+ course, naturally machine dependent, and is different for each set
+ of registers. For the i386 for example, the general-purpose
+ register set is typically defined by:
+
+ typedef int gregset_t[19]; (in <sys/regset.h>)
+
+ #define GS 0 (in <sys/reg.h>)
+ #define FS 1
+ ...
+ #define UESP 17
+ #define SS 18
+
+ and the floating-point set by:
+
+ typedef struct fpregset {
+ union {
+ struct fpchip_state // fp extension state //
+ {
+ int state[27]; // 287/387 saved state //
+ int status; // status word saved at //
+ // exception //
+ } fpchip_state;
+ struct fp_emul_space // for emulators //
+ {
+ char fp_emul[246];
+ char fp_epad[2];
+ } fp_emul_space;
+ int f_fpregs[62]; // union of the above //
+ } fp_reg_set;
+ long f_wregs[33]; // saved weitek state //
+ } fpregset_t;
+
+ Incidentally fpchip_state contains the FPU state in the same format
+ as used by the "fsave" instruction, and that's the only thing we
+ support here. I don't know how the emulator stores it state. The
+ Weitek stuff definitely isn't supported.
+
+ The routines defined here, provide the packing and unpacking of
+ gregset_t and fpregset_t formatted data. */
+
+#ifdef HAVE_GREGSET_T
+
+/* Mapping between the general-purpose registers in `/proc'
+ format and GDB's register array layout. */
+static int regmap[] =
+{
+ EAX, ECX, EDX, EBX,
+ UESP, EBP, ESI, EDI,
+ EIP, EFL, CS, SS,
+ DS, ES, FS, GS
+};
+
+/* Fill GDB's register array with the general-purpose register values
+ in *GREGSETP. */
+
+void
+i386v4_supply_native_gregset (gregset_t *gregsetp)
+{
+ greg_t *regp = (greg_t *) gregsetp;
+ int regnum;
+
+ for (regnum = 0; regnum < I386_NUM_GREGS; regnum++)
+ regcache_raw_supply (current_regcache, regnum, regp + regmap[regnum]);
+}
+
+/* Fill register REGNUM (if it is a general-purpose register) in
+ *GREGSETPS with the value in GDB's register array. If REGNUM is -1,
+ do this for all registers. */
+
+void
+i386v4_collect_native_gregset (gregset_t *gregsetp, int regnum)
+{
+ greg_t *regp = (greg_t *) gregsetp;
+ int i;
+
+ for (i = 0; i < I386_NUM_GREGS; i++)
+ if (regnum == -1 || regnum == i)
+ regcache_raw_collect (current_regcache, i, regp + regmap[i]);
+}
+
+#endif /* HAVE_GREGSET_T */
+
+#ifdef HAVE_FPREGSET_T
+
+/* Fill GDB's register array with the floating-point register values in
+ *FPREGSETP. */
+
+void
+i386v4_supply_fsave (fpregset_t *fpregsetp)
+{
+ if (FP0_REGNUM == 0)
+ return;
+
+ i387_supply_fsave (current_regcache, -1, fpregsetp);
+}
+
+/* Fill register REGNO (if it is a floating-point register) in
+ *FPREGSETP with the value in GDB's register array. If REGNO is -1,
+ do this for all registers. */
+
+void
+i386v4_collect_fsave (fpregset_t *fpregsetp, int regno)
+{
+ if (FP0_REGNUM == 0)
+ return;
+
+ i387_fill_fsave ((char *) fpregsetp, regno);
+}
+
+#endif /* HAVE_FPREGSET_T */
+
+#endif /* HAVE_SYS_PROCFS_H */
diff -rupN gdb/i386v4-regset.h gdb-new/i386v4-regset.h
--- gdb/i386v4-regset.h 1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/i386v4-regset.h 2004-10-26 19:05:21.000000000 +0000
@@ -0,0 +1,53 @@
+/* Native-dependent code for Unix SVR4 running on i386's.
+
+ Copyright 1988, 1989, 1991, 1992, 1996, 1997, 1998, 1999, 2000,
+ 2001, 2002, 2004
+ Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef I386V4_REGSET_H
+#define I386V4_REGSET_H
+
+#include "defs.h"
+
+#ifdef HAVE_SYS_REG_H
+#include <sys/reg.h>
+#endif
+
+#ifdef HAVE_SYS_PROCFS_H
+
+#include <sys/procfs.h>
+
+#ifdef HAVE_GREGSET_T
+
+extern void i386v4_supply_native_gregset (gregset_t *);
+extern void i386v4_collect_native_gregset (gregset_t *, int);
+
+#endif /* HAVE_GREGSET_T */
+
+#ifdef HAVE_FPREGSET_T
+
+extern void i386v4_supply_fsave (fpregset_t *);
+extern void i386v4_collect_fsave (fpregset_t *, int);
+
+#endif /* HAVE_FPREGSET_T */
+
+#endif /* HAVE_SYS_PROCFS_H */
+
+#endif /* i386v4-regset.h */