This is the mail archive of the gdb-patches@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]

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 */


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