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]

PATCH: A low-level target operations struct for gdbserver/Linux


Have you ever felt that your ChangeLog entries were too chatty?  I should
learn to summarize better.

This patch has no functional change.  It moves a bunch of
functions/variables with magic names (that the linux-*-low.c modules had to
provide in order to link) into pointers in a `struct linux_target_ops'. 
Committed after extensive proofreading and a couple of cross builds.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer

2002-04-09  Daniel Jacobowitz  <drow@mvista.com>

	* linux-low.h: Remove obsolete prototypes.
	(struct linux_target_ops): New.
	(extern the_low_target): New.
	* linux-low.c (num_regs, regmap): Remove declarations.
	(register_addr): Use the_low_target explicitly.
	(fetch_register): Likewise.
	(usr_fetch_inferior_registers): Likewise.
	(usr_store_inferior_registers): Likewise.
	* linux-arm-low.c (num_regs): Remove.
	(arm_num_regs): Define.
	(arm_regmap): Renamed from regmap, made static.
	(arm_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(arm_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-i386-low.c (num_regs): Remove.
	(i386_num_regs): Define.
	(i386_regmap): Renamed from regmap, made static.
	(i386_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(i386_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-ia64-low.c (num_regs): Remove.
	(ia64_num_regs): Define.
	(ia64_regmap): Renamed from regmap, made static.
	(ia64_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(ia64_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-m68k-low.c (num_regs): Remove.
	(m68k_num_regs): Define.
	(m68k_regmap): Renamed from regmap, made static.
	(m68k_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(m68k_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-mips-low.c (num_regs): Remove.
	(mips_num_regs): Define.
	(mips_regmap): Renamed from regmap, made static.
	(mips_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(mips_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-ppc-low.c (num_regs): Remove.
	(ppc_num_regs): Define.
	(ppc_regmap): Renamed from regmap, made static.
	(ppc_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(ppc_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-s390-low.c (num_regs): Remove.
	(s390_num_regs): Define.
	(s390_regmap): Renamed from regmap, made static.
	(s390_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(s390_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-sh-low.c (num_regs): Remove.
	(sh_num_regs): Define.
	(sh_regmap): Renamed from regmap, made static.
	(sh_cannot_fetch_register): Renamed from cannot_fetch_register,
	made static.
	(sh_cannot_store_register): Renamed from cannot_store_register,
	made static.
	(the_low_target): New.
	* linux-x86-64-low.c (x86_64_regmap): Renamed from regmap.
	(the_low_target): New.

Index: linux-arm-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-arm-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-arm-low.c
--- linux-arm-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-arm-low.c	9 Apr 2002 22:27:14 -0000
@@ -26,22 +26,28 @@
 #include <sys/reg.h>
 #endif
 
-int num_regs = 16;
+#define arm_num_regs 16
 
-int regmap[] = {
+static int arm_regmap[] = {
   0, 4, 8, 12, 16, 20, 24, 28,
   32, 36, 40, 44, 48, 52, 56, 60,
 };
 
-int
-cannot_store_register (int regno)
+static int
+arm_cannot_store_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= arm_num_regs);
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+arm_cannot_fetch_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= arm_num_regs);
 }
 
+struct linux_target_ops the_low_target = {
+  arm_num_regs,
+  arm_regmap,
+  arm_cannot_fetch_register,
+  arm_cannot_store_register,
+};
Index: linux-i386-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-i386-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-i386-low.c
--- linux-i386-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-i386-low.c	9 Apr 2002 22:27:14 -0000
@@ -29,13 +29,13 @@
 
 /* This module only supports access to the general purpose registers.  */
 
-int num_regs = 16;
+#define i386_num_regs 16
 
 /* This stuff comes from i386-linux-nat.c.  */
 
 /* Mapping between the general-purpose registers in `struct user'
    format and GDB's register array layout.  */
-int regmap[] = 
+static int i386_regmap[] = 
 {
   EAX * 4, ECX * 4, EDX * 4, EBX * 4,
   UESP * 4, EBP * 4, ESI * 4, EDI * 4,
@@ -43,16 +43,16 @@ int regmap[] = 
   DS * 4, ES * 4, FS * 4, GS * 4
 };
 
-int
-cannot_store_register (int regno)
+static int
+i386_cannot_store_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= i386_num_regs);
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+i386_cannot_fetch_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= i386_num_regs);
 }
 
 
@@ -65,8 +65,8 @@ i386_fill_gregset (void *buf)
 {
   int i;
 
-  for (i = 0; i < num_regs; i++)
-    collect_register (i, ((char *) buf) + regmap[i]);
+  for (i = 0; i < i386_num_regs; i++)
+    collect_register (i, ((char *) buf) + i386_regmap[i]);
 
   collect_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
 }
@@ -76,8 +76,8 @@ i386_store_gregset (void *buf)
 {
   int i;
 
-  for (i = 0; i < num_regs; i++)
-    supply_register (i, ((char *) buf) + regmap[i]);
+  for (i = 0; i < i386_num_regs; i++)
+    supply_register (i, ((char *) buf) + i386_regmap[i]);
 
   supply_register_by_name ("orig_eax", ((char *) buf) + ORIG_EAX * 4);
 }
@@ -121,3 +121,9 @@ struct regset_info target_regsets[] = {
 
 #endif /* HAVE_LINUX_REGSETS */
 
+struct linux_target_ops the_low_target = {
+  i386_num_regs,
+  i386_regmap,
+  i386_cannot_fetch_register,
+  i386_cannot_store_register,
+};
Index: linux-ia64-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-ia64-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-ia64-low.c
--- linux-ia64-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-ia64-low.c	9 Apr 2002 22:27:14 -0000
@@ -26,11 +26,11 @@
 #include <sys/reg.h>
 #endif
 
-int num_regs = 590;
+#define ia64_num_regs 590
 
 #include <asm/ptrace_offsets.h>
 
-int regmap[] =
+static int ia64_regmap[] =
   {
     /* general registers */
     -1,		/* gr0 not available; i.e, it's always zero */
@@ -283,15 +283,21 @@ int regmap[] =
     -1, -1, -1, -1, -1, -1, -1, -1,
   };
 
-int
-cannot_store_register (int regno)
+static int
+ia64_cannot_store_register (int regno)
 {
   return 0;
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+ia64_cannot_fetch_register (int regno)
 {
   return 0;
 }
 
+struct linux_target_ops the_low_target = {
+  ia64_num_regs,
+  ia64_regmap,
+  ia64_cannot_fetch_register,
+  ia64_cannot_store_register,
+};
Index: linux-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.c,v
retrieving revision 1.11
diff -u -p -r1.11 linux-low.c
--- linux-low.c	9 Apr 2002 21:16:16 -0000	1.11
+++ linux-low.c	9 Apr 2002 22:27:14 -0000
@@ -44,11 +44,6 @@ static int use_regsets_p = 1;
 
 extern int errno;
 
-#ifdef HAVE_LINUX_USRREGS
-extern int num_regs;
-extern int regmap[];
-#endif
-
 static int inferior_pid;
 
 /* Start an inferior process and returns its pid.
@@ -175,10 +170,10 @@ register_addr (int regnum)
 {
   int addr;
 
-  if (regnum < 0 || regnum >= num_regs)
+  if (regnum < 0 || regnum >= the_low_target.num_regs)
     error ("Invalid register number %d.", regnum);
 
-  addr = regmap[regnum];
+  addr = the_low_target.regmap[regnum];
   if (addr == -1)
     addr = 0;
 
@@ -192,9 +187,9 @@ fetch_register (int regno)
   CORE_ADDR regaddr;
   register int i;
 
-  if (regno >= num_regs)
+  if (regno >= the_low_target.num_regs)
     return;
-  if (cannot_fetch_register (regno))
+  if ((*the_low_target.cannot_fetch_register) (regno))
     return;
 
   regaddr = register_addr (regno);
@@ -225,7 +220,7 @@ static void
 usr_fetch_inferior_registers (int regno)
 {
   if (regno == -1 || regno == 0)
-    for (regno = 0; regno < num_regs; regno++)
+    for (regno = 0; regno < the_low_target.num_regs; regno++)
       fetch_register (regno);
   else
     fetch_register (regno);
@@ -242,10 +237,10 @@ usr_store_inferior_registers (int regno)
 
   if (regno >= 0)
     {
-      if (regno >= num_regs)
+      if (regno >= the_low_target.num_regs)
 	return;
 
-      if (cannot_store_register (regno))
+      if ((*the_low_target.cannot_store_register) (regno))
 	return;
 
       regaddr = register_addr (regno);
@@ -272,7 +267,7 @@ usr_store_inferior_registers (int regno)
 	}
     }
   else
-    for (regno = 0; regno < num_regs; regno++)
+    for (regno = 0; regno < the_low_target.num_regs; regno++)
       store_inferior_registers (regno);
 }
 #endif /* HAVE_LINUX_USRREGS */
Index: linux-low.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-low.h,v
retrieving revision 1.2
diff -u -p -r1.2 linux-low.h
--- linux-low.h	9 Apr 2002 21:11:35 -0000	1.2
+++ linux-low.h	9 Apr 2002 22:27:14 -0000
@@ -18,13 +18,6 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#ifdef HAVE_LINUX_USRREGS
-extern int regmap[];
-extern int num_regs;
-int cannot_fetch_register (int regno);
-int cannot_store_register (int regno);
-#endif
-
 #ifdef HAVE_LINUX_REGSETS
 typedef void (*regset_func) (void *);
 struct regset_info
@@ -35,3 +28,13 @@ struct regset_info
 };
 extern struct regset_info target_regsets[];
 #endif
+
+struct linux_target_ops
+{
+  int num_regs;
+  int *regmap;
+  int (*cannot_fetch_register) (int);
+  int (*cannot_store_register) (int);
+};
+
+extern struct linux_target_ops the_low_target;
Index: linux-m68k-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-m68k-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-m68k-low.c
--- linux-m68k-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-m68k-low.c	9 Apr 2002 22:27:14 -0000
@@ -26,10 +26,10 @@
 #include <sys/reg.h>
 #endif
 
-int num_regs = 31;
+#define m68k_num_regs 31
 
 /* This table must line up with REGISTER_NAMES in tm-m68k.h */
-int regmap[] =
+static int m68k_regmap[] =
 {
 #ifdef PT_D0
   PT_D0 * 4, PT_D1 * 4, PT_D2 * 4, PT_D3 * 4,
@@ -52,14 +52,21 @@ int regmap[] =
 #endif
 };
 
-int
-cannot_store_register (int regno)
+static int
+m68k_cannot_store_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= m68k_num_regs);
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+m68k_cannot_fetch_register (int regno)
 {
-  return (regno >= num_regs);
+  return (regno >= m68k_num_regs);
 }
+
+struct linux_target_ops the_low_target = {
+  m68k_num_regs,
+  m68k_regmap,
+  m68k_cannot_fetch_register,
+  m68k_cannot_store_register,
+};
Index: linux-mips-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-mips-low.c,v
retrieving revision 1.4
diff -u -p -r1.4 linux-mips-low.c
--- linux-mips-low.c	27 Feb 2002 07:07:39 -0000	1.4
+++ linux-mips-low.c	9 Apr 2002 22:27:14 -0000
@@ -26,14 +26,14 @@
 #include <sys/reg.h>
 #endif
 
-int num_regs = 90;
+#define mips_num_regs 90
 
 #include <asm/ptrace.h>
 
 /* Return the ptrace ``address'' of register REGNO. */
 
 /* Matches mips_generic32_regs */
-int regmap[] = {
+static int mips_regmap[] = {
   0,  1,  2,  3,  4,  5,  6,  7,
   8,  9,  10, 11, 12, 13, 14, 15,
   16, 17, 18, 19, 20, 21, 22, 23,
@@ -63,10 +63,10 @@ int regmap[] = {
    ZERO_REGNUM.  We also can not set BADVADDR, CAUSE, or FCRIR via
    ptrace().  */
 
-int
-cannot_fetch_register (int regno)
+static int
+mips_cannot_fetch_register (int regno)
 {
-  if (regmap[regno] == -1)
+  if (mips_regmap[regno] == -1)
     return 1;
 
   if (find_regno ("zero") == regno)
@@ -75,10 +75,10 @@ cannot_fetch_register (int regno)
   return 0;
 }
 
-int
-cannot_store_register (int regno)
+static int
+mips_cannot_store_register (int regno)
 {
-  if (regmap[regno] == -1)
+  if (mips_regmap[regno] == -1)
     return 1;
 
   if (find_regno ("zero") == regno)
@@ -95,3 +95,10 @@ cannot_store_register (int regno)
 
   return 0;
 }
+
+struct linux_target_ops the_low_target = {
+  mips_num_regs,
+  mips_regmap,
+  mips_cannot_fetch_register,
+  mips_cannot_store_register,
+};
Index: linux-ppc-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-ppc-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-ppc-low.c
--- linux-ppc-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-ppc-low.c	9 Apr 2002 22:27:14 -0000
@@ -25,10 +25,10 @@
 
 #include <asm/ptrace.h>
 
-int num_regs = 71;
+#define ppc_num_regs 71
 
 /* Currently, don't check/send MQ.  */
-int regmap[] =
+static int ppc_regmap[] =
  {PT_R0 * 4,     PT_R1 * 4,     PT_R2 * 4,     PT_R3 * 4,
   PT_R4 * 4,     PT_R5 * 4,     PT_R6 * 4,     PT_R7 * 4,
   PT_R8 * 4,     PT_R9 * 4,     PT_R10 * 4,    PT_R11 * 4,
@@ -48,15 +48,21 @@ int regmap[] =
   PT_NIP * 4,    PT_MSR * 4,    PT_CCR * 4,    PT_LNK * 4,
   PT_CTR * 4,    PT_XER * 4,    -1, };
 
-int
-cannot_store_register (int regno)
+static int
+ppc_cannot_store_register (int regno)
 {
   return 0;
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+ppc_cannot_fetch_register (int regno)
 {
   return 0;
 }
 
+struct linux_target_ops the_low_target = {
+  ppc_num_regs,
+  ppc_regmap,
+  ppc_cannot_fetch_register,
+  ppc_cannot_store_register,
+};
Index: linux-s390-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-s390-low.c,v
retrieving revision 1.1
diff -u -p -r1.1 linux-s390-low.c
--- linux-s390-low.c	28 Feb 2002 16:58:14 -0000	1.1
+++ linux-s390-low.c	9 Apr 2002 22:27:14 -0000
@@ -27,9 +27,9 @@
 
 #include <asm/ptrace.h>
 
-int num_regs = 67;
+#define s390_num_regs 67
 
-int regmap[] = {
+static int s390_regmap[] = {
   PT_PSWMASK, PT_PSWADDR,
 
   PT_GPR0, PT_GPR1, PT_GPR2, PT_GPR3,
@@ -62,20 +62,27 @@ int regmap[] = {
 #endif
 };
 
-int
-cannot_fetch_register (int regno)
+static int
+s390_cannot_fetch_register (int regno)
 {
-  if (regmap[regno] == -1)
+  if (s390_regmap[regno] == -1)
     return 1;
 
   return 0;
 }
 
-int
-cannot_store_register (int regno)
+static int
+s390_cannot_store_register (int regno)
 {
-  if (regmap[regno] == -1)
+  if (s390_regmap[regno] == -1)
     return 1;
 
   return 0;
 }
+
+struct linux_target_ops the_low_target = {
+  s390_num_regs,
+  s390_regmap,
+  s390_cannot_fetch_register,
+  s390_cannot_store_register,
+};
Index: linux-sh-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-sh-low.c,v
retrieving revision 1.2
diff -u -p -r1.2 linux-sh-low.c
--- linux-sh-low.c	27 Feb 2002 07:07:39 -0000	1.2
+++ linux-sh-low.c	9 Apr 2002 22:27:14 -0000
@@ -28,10 +28,10 @@
 
 #include <asm/ptrace.h>
 
-int num_regs = 41;
+#define sh_num_regs 41
 
 /* Currently, don't check/send MQ.  */
-int regmap[] = {
+static int sh_regmap[] = {
  0,	4,	8,	12,	16,	20,	24,	28,
  32,	36,	40,	44,	48,	52,	56,	60,
 
@@ -45,15 +45,21 @@ int regmap[] = {
  REG_FPREG0+48,  REG_FPREG0+52,  REG_FPREG0+56,  REG_FPREG0+60,
 };
 
-int
-cannot_store_register (int regno)
+static int
+sh_cannot_store_register (int regno)
 {
   return 0;
 }
 
-int
-cannot_fetch_register (int regno)
+static int
+sh_cannot_fetch_register (int regno)
 {
   return 0;
 }
 
+struct linux_target_ops the_low_target = {
+  sh_num_regs,
+  sh_regmap,
+  sh_cannot_fetch_register,
+  sh_cannot_store_register,
+};
Index: linux-x86-64-low.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbserver/linux-x86-64-low.c,v
retrieving revision 1.3
diff -u -p -r1.3 linux-x86-64-low.c
--- linux-x86-64-low.c	27 Mar 2002 10:21:28 -0000	1.3
+++ linux-x86-64-low.c	9 Apr 2002 22:27:14 -0000
@@ -30,7 +30,7 @@
 
 #define	X86_64_NUM_GREGS 22
 
-static int regmap[X86_64_NUM_GREGS] = {
+static int x86_64_regmap[X86_64_NUM_GREGS] = {
   RAX, RBX, RCX, RDX,
   RSI, RDI, RBP, RSP,
   R8, R9, R10, R11,
@@ -45,7 +45,7 @@ x86_64_fill_gregset (void *buf)
   int i;
 
   for (i = 0; i < X86_64_NUM_GREGS; i++)
-    collect_register (i, ((char *) buf) + regmap[i]);
+    collect_register (i, ((char *) buf) + x86_64_regmap[i]);
 }
 
 static void
@@ -54,7 +54,7 @@ x86_64_store_gregset (void *buf)
   int i;
 
   for (i = 0; i < X86_64_NUM_GREGS; i++)
-    supply_register (i, ((char *) buf) + regmap[i]);
+    supply_register (i, ((char *) buf) + x86_64_regmap[i]);
 }
 
 static void
@@ -69,11 +69,17 @@ x86_64_store_fpregset (void *buf)
   i387_fxsave_to_cache (buf);
 }
 
-
 struct regset_info target_regsets[] = {
   { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t),
     x86_64_fill_gregset, x86_64_store_gregset },
   { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t),
     x86_64_fill_fpregset, x86_64_store_fpregset },
   { 0, 0, -1, NULL, NULL }
+};
+
+struct linux_target_ops the_low_target = {
+  -1,
+  NULL,
+  NULL,
+  NULL,
 };


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