[RFA] Take II: New target am33-linux (mn10300)

Michael Snyder msnyder@redhat.com
Tue Jun 14 03:03:00 GMT 2005


OK, let's try this again, with benefit of suggestions:


2005-04-29  Michael Snyder  <msnyder@redhat.com>

	* mn10300-linux-tdep.c: New file.
	* Makefile.in: Add rule for mn10300-linux-tdep.o.
	* configure.tgt: Add rule for am33 / mn10300-linux.
	* mn10300-tdep.h: Add E_FPCR_REGNUM, E_FS0_REGNUM, etc..

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/gdb/Makefile.in,v
retrieving revision 1.736
diff -p -r1.736 Makefile.in
*** Makefile.in	13 Jun 2005 16:15:34 -0000	1.736
--- Makefile.in	14 Jun 2005 00:14:35 -0000
*************** mips-tdep.o: mips-tdep.c $(defs_h) $(gdb
*** 2306,2311 ****
--- 2306,2313 ----
   	$(floatformat_h)
   mipsv4-nat.o: mipsv4-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) 
$(target_h) \
   	$(regcache_h) $(gregset_h)
+ mn10300-linux-tdep.o: mn10300-linux-tdep.c $(defs_h) $(gdbcore_h) \
+ 	$(gdb_string_h) $(regcache_h) $(mn10300_tdep_h)
   mn10300-tdep.o: mn10300-tdep.c $(defs_h) $(arch_utils_h) $(dis_asm_h) \
   	$(gdbtypes_h) $(regcache_h) $(gdb_string_h) $(gdb_assert_h) \
   	$(frame_h) $(frame_unwind_h) $(frame_base_h) $(trad_frame_h) \
Index: configure.tgt
===================================================================
RCS file: /cvs/src/src/gdb/configure.tgt,v
retrieving revision 1.167
diff -p -r1.167 configure.tgt
*** configure.tgt	28 May 2005 22:09:03 -0000	1.167
--- configure.tgt	14 Jun 2005 00:14:35 -0000
***************
*** 11,16 ****
--- 11,17 ----
   case "${target_cpu}" in

   alpha*)			gdb_target_cpu=alpha ;;
+ am33_2.0*)              gdb_target_cpu=mn10300 ;;
   arm*)			gdb_target_cpu=arm ;;
   avr*)			gdb_target_cpu=avr ;;
   hppa*)			gdb_target_cpu=pa ;;
*************** alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu
*** 47,52 ****
--- 48,56 ----
   alpha*-*-openbsd*)	gdb_target=nbsd ;;
   alpha*-*-*)		gdb_target=alpha ;;

+ # mn10300 / am33 liunux
+ am33_2.0*-*-linux*)	gdb_target=linux ;;
+
   arm*-wince-pe)		gdb_target=wince ;;
   arm*-*-linux*)		gdb_target=linux
   			build_gdbserver=yes
Index: mn10300-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mn10300-tdep.c,v
retrieving revision 1.122
diff -p -r1.122 mn10300-tdep.c
*** mn10300-tdep.c	18 Apr 2005 23:14:33 -0000	1.122
--- mn10300-tdep.c	14 Jun 2005 00:14:36 -0000
***************
*** 1,7 ****
   /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU 
debugger.

!    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
!    Software Foundation, Inc.

      This file is part of GDB.

--- 1,7 ----
   /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU 
debugger.

!    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
!    Free Software Foundation, Inc.

      This file is part of GDB.

*************** mn10300_gdbarch_init (struct gdbarch_inf
*** 965,970 ****
--- 965,974 ----
       case bfd_mach_am33:
         set_gdbarch_register_name (gdbarch, am33_register_name);
         tdep->am33_mode = 1;
+       /* Apparently we should only do this once.  */
+       if (!gdbarch_regset_from_core_section_p (gdbarch))
+ 	set_gdbarch_regset_from_core_section (gdbarch,
+ 					      am33_regset_from_core_section);
         break;
       default:
         internal_error (__FILE__, __LINE__,
Index: mn10300-tdep.h
===================================================================
RCS file: /cvs/src/src/gdb/mn10300-tdep.h,v
retrieving revision 1.3
diff -p -r1.3 mn10300-tdep.h
*** mn10300-tdep.h	18 Apr 2005 23:14:33 -0000	1.3
--- mn10300-tdep.h	14 Jun 2005 00:14:36 -0000
***************
*** 1,7 ****
   /* Target-dependent interface for Matsushita MN10300 for GDB, the GNU 
debugger.

!    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
!    Software Foundation, Inc.

      This file is part of GDB.

--- 1,7 ----
   /* Target-dependent interface for Matsushita MN10300 for GDB, the GNU 
debugger.

!    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
!    Free Software Foundation, Inc.

      This file is part of GDB.

*************** enum {
*** 44,53 ****
     E_E5_REGNUM = 20,
     E_E6_REGNUM = 21,
     E_E7_REGNUM = 22,
     E_MCRH_REGNUM = 26,
     E_MCRL_REGNUM = 27,
     E_MCVF_REGNUM = 28,
!   E_NUM_REGS = 32
   };

   enum movm_register_bits {
--- 44,58 ----
     E_E5_REGNUM = 20,
     E_E6_REGNUM = 21,
     E_E7_REGNUM = 22,
+   E_E8_REGNUM = 23,
+   E_E9_REGNUM = 24,
+   E_E10_REGNUM = 25,
     E_MCRH_REGNUM = 26,
     E_MCRL_REGNUM = 27,
     E_MCVF_REGNUM = 28,
!   E_FPCR_REGNUM = 29,
!   E_NUM_REGS = 32,
!   E_FS0_REGNUM = 32
   };

   enum movm_register_bits {
*************** struct gdbarch_tdep
*** 77,80 ****

   #define AM33_MODE (gdbarch_tdep (current_gdbarch)->am33_mode)

!
--- 82,88 ----

   #define AM33_MODE (gdbarch_tdep (current_gdbarch)->am33_mode)

! #include "regset.h"	/* struct regset */
! extern const struct regset *am33_regset_from_core_section (struct 
gdbarch *,
! 							   const char *,
! 							   size_t);
Index: mn10300-linux-tdep.c
===================================================================
RCS file: mn10300-linux-tdep.c
diff -N mn10300-linux-tdep.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- mn10300-linux-tdep.c	14 Jun 2005 00:16:48 -0000
***************
*** 0 ****
--- 1,469 ----
+ /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU 
debugger.
+    Copyright 2003, 2004, 2005
+    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 "gdbcore.h"
+ #include "gdb_string.h"
+ #include "regcache.h"
+ #include "mn10300-tdep.h"
+ #include "gdb_assert.h"
+
+ #include <stdlib.h>
+
+ /* Transliterated from <asm-mn10300/elf.h>...  */
+ #define ELF_NGREG 27
+ #define ELF_NFPREG 32
+
+ typedef unsigned char elf_greg_t[4];
+ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+
+ typedef unsigned char elf_fpreg_t[4];
+ typedef struct
+ {
+   elf_fpreg_t fpregs[ELF_NFPREG];
+   unsigned char fpcr[4];
+ } elf_fpregset_t;
+
+ /* elf_gregset_t register indices stolen from 
include/asm-mn10300/ptrace.h.  */
+ #define ELF_GREGSET_T_REG_INDEX_A3	0
+ #define ELF_GREGSET_T_REG_INDEX_A2	1
+ #define ELF_GREGSET_T_REG_INDEX_D3	2
+ #define	ELF_GREGSET_T_REG_INDEX_D2	3
+ #define ELF_GREGSET_T_REG_INDEX_MCVF	4
+ #define	ELF_GREGSET_T_REG_INDEX_MCRL	5
+ #define ELF_GREGSET_T_REG_INDEX_MCRH	6
+ #define	ELF_GREGSET_T_REG_INDEX_MDRQ	7
+ #define	ELF_GREGSET_T_REG_INDEX_E1	8
+ #define	ELF_GREGSET_T_REG_INDEX_E0	9
+ #define	ELF_GREGSET_T_REG_INDEX_E7	10
+ #define	ELF_GREGSET_T_REG_INDEX_E6	11
+ #define	ELF_GREGSET_T_REG_INDEX_E5	12
+ #define	ELF_GREGSET_T_REG_INDEX_E4	13
+ #define	ELF_GREGSET_T_REG_INDEX_E3	14
+ #define	ELF_GREGSET_T_REG_INDEX_E2	15
+ #define	ELF_GREGSET_T_REG_INDEX_SP	16
+ #define	ELF_GREGSET_T_REG_INDEX_LAR	17
+ #define	ELF_GREGSET_T_REG_INDEX_LIR	18
+ #define	ELF_GREGSET_T_REG_INDEX_MDR	19
+ #define	ELF_GREGSET_T_REG_INDEX_A1	20
+ #define	ELF_GREGSET_T_REG_INDEX_A0	21
+ #define	ELF_GREGSET_T_REG_INDEX_D1	22
+ #define	ELF_GREGSET_T_REG_INDEX_D0	23
+ #define ELF_GREGSET_T_REG_INDEX_ORIG_D0	24
+ #define	ELF_GREGSET_T_REG_INDEX_EPSW	25
+ #define	ELF_GREGSET_T_REG_INDEX_PC	26
+
+ /* New gdbarch API for corefile registers.
+    Given a section name and size, create a struct reg object
+    with a supply_register and a collect_register method.  */
+
+ /* Copy register value of REGNUM from regset to regcache.
+    If REGNUM is -1, do this for all gp registers in regset.  */
+
+ static void
+ am33_supply_gregset_method (const struct regset *regset,
+ 			    struct regcache *regcache,
+ 			    int regnum, const void *gregs, size_t len)
+ {
+   char zerobuf[MAX_REGISTER_SIZE];
+   elf_gregset_t *regp = gregs;
+   int i;
+
+   gdb_assert (len == sizeof (elf_gregset_t));
+
+   switch (regnum) {
+   case E_D0_REGNUM:
+     regcache_raw_supply (regcache, E_D0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D0));
+     break;
+   case E_D1_REGNUM:
+     regcache_raw_supply (regcache, E_D1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D1));
+     break;
+   case E_D2_REGNUM:
+     regcache_raw_supply (regcache, E_D2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D2));
+     break;
+   case E_D3_REGNUM:
+     regcache_raw_supply (regcache, E_D3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D3));
+     break;
+   case E_A0_REGNUM:
+     regcache_raw_supply (regcache, E_A0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A0));
+     break;
+   case E_A1_REGNUM:
+     regcache_raw_supply (regcache, E_A1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A1));
+     break;
+   case E_A2_REGNUM:
+     regcache_raw_supply (regcache, E_A2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A2));
+     break;
+   case E_A3_REGNUM:
+     regcache_raw_supply (regcache, E_A3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A3));
+     break;
+   case E_SP_REGNUM:
+     regcache_raw_supply (regcache, E_SP_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_SP));
+     break;
+   case E_PC_REGNUM:
+     regcache_raw_supply (regcache, E_PC_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_PC));
+     break;
+   case E_MDR_REGNUM:
+     regcache_raw_supply (regcache, E_MDR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDR));
+     break;
+   case E_PSW_REGNUM:
+     regcache_raw_supply (regcache, E_PSW_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_EPSW));
+     break;
+   case E_LIR_REGNUM:
+     regcache_raw_supply (regcache, E_LIR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_LIR));
+     break;
+   case E_LAR_REGNUM:
+     regcache_raw_supply (regcache, E_LAR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_LAR));
+     break;
+   case E_MDRQ_REGNUM:
+     regcache_raw_supply (regcache, E_MDRQ_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDRQ));
+     break;
+   case E_E0_REGNUM:
+     regcache_raw_supply (regcache, E_E0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E0));
+     break;
+   case E_E1_REGNUM:
+     regcache_raw_supply (regcache, E_E1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E1));
+     break;
+   case E_E2_REGNUM:
+     regcache_raw_supply (regcache, E_E2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E2));
+     break;
+   case E_E3_REGNUM:
+     regcache_raw_supply (regcache, E_E3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E3));
+     break;
+   case E_E4_REGNUM:
+     regcache_raw_supply (regcache, E_E4_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E4));
+     break;
+   case E_E5_REGNUM:
+     regcache_raw_supply (regcache, E_E5_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E5));
+     break;
+   case E_E6_REGNUM:
+     regcache_raw_supply (regcache, E_E6_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E6));
+     break;
+   case E_E7_REGNUM:
+     regcache_raw_supply (regcache, E_E7_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E7));
+     break;
+
+     /* ssp, msp, and usp are inaccessible.  */
+   case E_E8_REGNUM:
+     memset (zerobuf, 0, MAX_REGISTER_SIZE);
+     regcache_raw_supply (regcache, E_E8_REGNUM, zerobuf);
+     break;
+   case E_E9_REGNUM:
+     memset (zerobuf, 0, MAX_REGISTER_SIZE);
+     regcache_raw_supply (regcache, E_E9_REGNUM, zerobuf);
+     break;
+   case E_E10_REGNUM:
+     memset (zerobuf, 0, MAX_REGISTER_SIZE);
+     regcache_raw_supply (regcache, E_E10_REGNUM, zerobuf);
+
+     break;
+   case E_MCRH_REGNUM:
+     regcache_raw_supply (regcache, E_MCRH_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRH));
+     break;
+   case E_MCRL_REGNUM:
+     regcache_raw_supply (regcache, E_MCRL_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRL));
+     break;
+   case E_MCVF_REGNUM:
+     regcache_raw_supply (regcache, E_MCVF_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCVF));
+     break;
+   case E_FPCR_REGNUM:
+     /* FPCR is numbered among the GP regs, but handled as an FP reg.
+        Do nothing.  */
+     break;
+   case E_FPCR_REGNUM + 1:
+     /* The two unused registers beyond fpcr are inaccessible.  */
+     memset (zerobuf, 0, MAX_REGISTER_SIZE);
+     regcache_raw_supply (regcache, E_FPCR_REGNUM + 1, zerobuf);
+     break;
+   case E_FPCR_REGNUM + 2:
+     memset (zerobuf, 0, MAX_REGISTER_SIZE);
+     regcache_raw_supply (regcache, E_FPCR_REGNUM + 2, zerobuf);
+     break;
+   default:	/* An error, obviously, but should we error out?  */
+     break;
+   case -1:
+     for (i = 0; i < ELF_NGREG; i++)
+       am33_supply_gregset_method (regset, regcache, i, gregs, len);
+     break;
+   }
+   return;
+ }
+
+ /* Copy fp register value of REGNUM from regset to regcache.
+    If REGNUM is -1, do this for all fp registers in regset. */
+
+ static void
+ am33_supply_fpregset_method (const struct regset *regset,
+ 			     struct regcache *regcache,
+ 			     int regnum, const void *fpregs, size_t len)
+ {
+   elf_fpregset_t *fpregset = fpregs;
+   int i;
+
+   gdb_assert (len == sizeof (elf_fpregset_t));
+
+   if (regnum == -1)
+     {
+       for (i = 0; i < ELF_NFPREG; i++)
+ 	am33_supply_fpregset_method (regset, regcache, i, fpregs, len);
+       am33_supply_fpregset_method (regset, regcache,
+ 				   E_FPCR_REGNUM, fpregs, len);
+     }
+   else if (regnum == E_FPCR_REGNUM)
+     regcache_raw_supply (current_regcache, E_FPCR_REGNUM,
+ 			 (void *) &fpregset->fpcr);
+   else if (i >= 0 && i < ELF_NFPREG)
+     regcache_raw_supply (current_regcache, E_FS0_REGNUM + i,
+ 			 (void *) &fpregset->fpregs[i]);
+   /* else error?  */
+
+   return;
+ }
+
+ /* Copy register values from regcache to regset.  */
+
+ static void
+ am33_collect_gregset_method (const struct regset *regset,
+ 			     const struct regcache *regcache,
+ 			     int regnum, void *gregs, size_t len)
+ {
+   elf_gregset_t *regp = gregs;
+   int i;
+
+   gdb_assert (len == sizeof (elf_gregset_t));
+
+   switch (regnum) {
+   case E_D0_REGNUM:
+     regcache_raw_collect (regcache, E_D0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D0));
+     break;
+   case E_D1_REGNUM:
+     regcache_raw_collect (regcache, E_D1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D1));
+     break;
+   case E_D2_REGNUM:
+     regcache_raw_collect (regcache, E_D2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D2));
+     break;
+   case E_D3_REGNUM:
+     regcache_raw_collect (regcache, E_D3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_D3));
+     break;
+   case E_A0_REGNUM:
+     regcache_raw_collect (regcache, E_A0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A0));
+     break;
+   case E_A1_REGNUM:
+     regcache_raw_collect (regcache, E_A1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A1));
+     break;
+   case E_A2_REGNUM:
+     regcache_raw_collect (regcache, E_A2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A2));
+     break;
+   case E_A3_REGNUM:
+     regcache_raw_collect (regcache, E_A3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_A3));
+     break;
+   case E_SP_REGNUM:
+     regcache_raw_collect (regcache, E_SP_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_SP));
+     break;
+   case E_PC_REGNUM:
+     regcache_raw_collect (regcache, E_PC_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_PC));
+     break;
+   case E_MDR_REGNUM:
+     regcache_raw_collect (regcache, E_MDR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDR));
+     break;
+   case E_PSW_REGNUM:
+     regcache_raw_collect (regcache, E_PSW_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_EPSW));
+     break;
+   case E_LIR_REGNUM:
+     regcache_raw_collect (regcache, E_LIR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_LIR));
+     break;
+   case E_LAR_REGNUM:
+     regcache_raw_collect (regcache, E_LAR_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_LAR));
+     break;
+   case E_MDRQ_REGNUM:
+     regcache_raw_collect (regcache, E_MDRQ_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MDRQ));
+     break;
+   case E_E0_REGNUM:
+     regcache_raw_collect (regcache, E_E0_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E0));
+     break;
+   case E_E1_REGNUM:
+     regcache_raw_collect (regcache, E_E1_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E1));
+     break;
+   case E_E2_REGNUM:
+     regcache_raw_collect (regcache, E_E2_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E2));
+     break;
+   case E_E3_REGNUM:
+     regcache_raw_collect (regcache, E_E3_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E3));
+     break;
+   case E_E4_REGNUM:
+     regcache_raw_collect (regcache, E_E4_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E4));
+     break;
+   case E_E5_REGNUM:
+     regcache_raw_collect (regcache, E_E5_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E5));
+     break;
+   case E_E6_REGNUM:
+     regcache_raw_collect (regcache, E_E6_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E6));
+     break;
+   case E_E7_REGNUM:
+     regcache_raw_collect (regcache, E_E7_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_E7));
+     break;
+
+     /* ssp, msp, and usp are inaccessible.  */
+   case E_E8_REGNUM:
+     /* The gregset struct has noplace to put this: do nothing.  */
+     break;
+   case E_E9_REGNUM:
+     /* The gregset struct has noplace to put this: do nothing.  */
+     break;
+   case E_E10_REGNUM:
+     /* The gregset struct has noplace to put this: do nothing.  */
+     break;
+   case E_MCRH_REGNUM:
+     regcache_raw_collect (regcache, E_MCRH_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRH));
+     break;
+   case E_MCRL_REGNUM:
+     regcache_raw_collect (regcache, E_MCRL_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCRL));
+     break;
+   case E_MCVF_REGNUM:
+     regcache_raw_collect (regcache, E_MCVF_REGNUM,
+ 			 (void *) (regp + ELF_GREGSET_T_REG_INDEX_MCVF));
+     break;
+   case E_FPCR_REGNUM:
+     /* FPCR is numbered among the GP regs, but handled as an FP reg.
+        Do nothing.  */
+     break;
+   case E_FPCR_REGNUM + 1:
+     /* The gregset struct has noplace to put this: do nothing.  */
+     break;
+   case E_FPCR_REGNUM + 2:
+     /* The gregset struct has noplace to put this: do nothing.  */
+     break;
+   default:	/* An error, obviously, but should we error out?  */
+     break;
+   case -1:
+     for (i = 0; i < ELF_NGREG; i++)
+       am33_collect_gregset_method (regset, regcache, i, gregs, len);
+     break;
+   }
+   return;
+ }
+
+ /* Copy fp register values from regcache to regset.  */
+
+ static void
+ am33_collect_fpregset_method (const struct regset *regset,
+ 			      const struct regcache *regcache,
+ 			      int regnum, void *fpregs, size_t len)
+ {
+   elf_fpregset_t *fpregset = fpregs;
+   int i;
+
+   gdb_assert (len == sizeof (elf_fpregset_t));
+
+   if (regnum == -1)
+     {
+       for (i = 0; i < ELF_NFPREG; i++)
+ 	am33_collect_fpregset_method (regset, regcache, i, fpregs, len);
+       am33_collect_fpregset_method (regset, regcache,
+ 				    E_FPCR_REGNUM, fpregs, len);
+     }
+   else if (regnum == E_FPCR_REGNUM)
+     regcache_raw_collect (current_regcache, E_FPCR_REGNUM,
+ 			  (void *) &fpregset->fpcr);
+   else if (i >= 0 && i < ELF_NFPREG)
+     regcache_raw_collect (current_regcache, E_FS0_REGNUM + i,
+ 			  (void *) &fpregset->fpregs[i]);
+   /* else error?  */
+
+   return;
+ }
+
+ /* Create a struct regset from a corefile register section.  */
+
+ const struct regset *
+ am33_regset_from_core_section (struct gdbarch *gdbarch,
+ 			       const char *sect_name,
+ 			       size_t sect_size)
+ {
+   /* We will call regset_alloc, and pass the names of the supply and
+      collect methods.  */
+
+   if (sect_size == sizeof (elf_fpregset_t))
+     return regset_alloc (gdbarch,
+ 			 am33_supply_fpregset_method,
+ 			 am33_collect_fpregset_method);
+   else
+     return regset_alloc (gdbarch,
+ 			 am33_supply_gregset_method,
+ 			 am33_collect_gregset_method);
+ }
+
+ void
+ _initialize_mn10300_linux_tdep (void)
+ {
+   /* Doesn't require any initialization.  */
+ }
+



More information about the Gdb-patches mailing list