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, 1 Nov 2004, Andrew Cagney wrote:

> The only thing really blocking this patch is ``deprecation''.  And there, the
> same patch minus the TM file would be acceptable (such a GDB would even build
> and to a point work) (notice how test results are not one of the acceptance
> criteria ;-).
> 
> Joseph, can you submit an up-to-date patch _minus_ the TM file I'll approve
> it?  By getting that committed we can get the bulk of the patch off the table.
> Then we can follow up with smaller patches addressing each of the remaining
> problems.  First with the missing multi-arch macros, and second with any
> concerns with *-nat files.

Here is a patch reformatted as requested and without the 
DEPRECATED_TM_FILE setting.

-- 
Joseph S. Myers
joseph@codesourcery.com

2004-11-01  Joseph S. Myers  <joseph@codesourcery.com>

	* Makefile.in (ALLDEPFILES): Add amd64-sol2-tdep.c.
	(amd64-sol2-tdep.o): Add dependencies.
	* amd64-sol2-tdep.c, config/i386/sol2-64.mh,
	config/i386/sol2-64.mt: New files.
	* i386-sol2-nat.c (amd64_sol2_gregset64_reg_offset,
	amd64_sol2_gregset32_reg_offset, _initialize_amd64_sol2_nat): New.
	(supply_gregset): Correct order of arguments to
	amd64_supply_native_gregset.
	(fill_gregset): Correct order of arguments to
	amd64_collect_native_gregset.
	* 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-31 10:13:00.000000000 +0000
+++ gdb-new/Makefile.in	2004-10-31 20:17:27.000000000 +0000
@@ -1360,6 +1360,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 \
@@ -1694,6 +1695,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) \
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-11-01 16:54:02.000000000 +0000
@@ -0,0 +1,125 @@
+/* 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/sol2-64.mh gdb-new/config/i386/sol2-64.mh
--- gdb/config/i386/sol2-64.mh	1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/config/i386/sol2-64.mh	2004-10-31 20:18:47.000000000 +0000
@@ -0,0 +1,4 @@
+# Host: Solaris x86_64
+NATDEPFILES= fork-child.o amd64-nat.o i386v4-nat.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/sol2-64.mt gdb-new/config/i386/sol2-64.mt
--- gdb/config/i386/sol2-64.mt	1970-01-01 00:00:00.000000000 +0000
+++ gdb-new/config/i386/sol2-64.mt	2004-11-01 16:50:18.000000000 +0000
@@ -0,0 +1,3 @@
+# 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
diff -rupN gdb/configure.host gdb-new/configure.host
--- gdb/configure.host	2004-10-24 00:03:16.000000000 +0000
+++ gdb-new/configure.host	2004-10-31 20:19:23.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=sol2-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-31 20:19:23.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-24 00:03:16.000000000 +0000
+++ gdb-new/configure.tgt	2004-10-31 20:19:23.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=sol2-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	2004-10-31 20:05:01.000000000 +0000
+++ gdb-new/i386-sol2-nat.c	2004-11-01 16:54:02.000000000 +0000
@@ -46,10 +46,62 @@
 #include "amd64-nat.h"
 #include "amd64-tdep.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_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 */
+};
+
 void
 supply_gregset (prgregset_t *gregs)
 {
-  amd64_supply_native_gregset (current_regcache, -1, gregs);
+  amd64_supply_native_gregset (current_regcache, gregs, -1);
 }
 
 void
@@ -61,7 +113,7 @@ supply_fpregset (prfpregset_t *fpregs)
 void
 fill_gregset (prgregset_t *gregs, int regnum)
 {
-  amd64_collect_native_gregset (current_regcache, regnum, gregs);
+  amd64_collect_native_gregset (current_regcache, gregs, regnum);
 }
 
 void
@@ -75,3 +127,19 @@ fill_fpregset (prfpregset_t *fpregs, int
 /* For 32-bit Solaris x86, we use the Unix SVR4 code in i386v4-nat.c.  */
 
 #endif
+
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern void _initialize_amd64_sol2_nat (void);
+
+void
+_initialize_amd64_sol2_nat (void)
+{
+#if defined (PR_MODEL_NATIVE) && (PR_MODEL_NATIVE == PR_MODEL_LP64)
+  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
+}


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