aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbserver/lynx-ppc-low.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2010-09-01 18:57:12 +0000
committerJoel Brobecker <brobecker@gnat.com>2010-09-01 18:57:12 +0000
commit8ed54b31b39a8a3ed6a540c9c4019c19932adfdb (patch)
tree71cd2a1365abdf65d3e141a086389d7042862a6b /gdb/gdbserver/lynx-ppc-low.c
parentbb0116a433af6f2a1bb99b628a863be46446cea0 (diff)
downloadgdb-8ed54b31b39a8a3ed6a540c9c4019c19932adfdb.zip
gdb-8ed54b31b39a8a3ed6a540c9c4019c19932adfdb.tar.gz
gdb-8ed54b31b39a8a3ed6a540c9c4019c19932adfdb.tar.bz2
gdbserver support for powerpc-lynxos (4.x)
This patch adds support for powerpc-lynxos. gdbserver/ChangeLog: * gdbserver/lynx-low.c, gdbserver/lynx-low.h, gdbserver/lynx-ppc-low.c: New files. * Makefile.in (lynx_low_h): New variable. (lynx-low.o, lynx-ppc-low.o): New rules. * configure.ac: On LynxOS, link with -lnetinet. * configure.srv: Add handling of powerpc-*-lynxos* targets. * configure: regenerate.
Diffstat (limited to 'gdb/gdbserver/lynx-ppc-low.c')
-rw-r--r--gdb/gdbserver/lynx-ppc-low.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/gdb/gdbserver/lynx-ppc-low.c b/gdb/gdbserver/lynx-ppc-low.c
new file mode 100644
index 0000000..9caa8ac
--- /dev/null
+++ b/gdb/gdbserver/lynx-ppc-low.c
@@ -0,0 +1,186 @@
+/* Copyright (C) 2009, 2010 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 3 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, see <http://www.gnu.org/licenses/>. */
+
+#include "server.h"
+#include "lynx-low.h"
+
+#include <stdint.h>
+#include <stddef.h>
+#include <limits.h>
+#include <ptrace.h>
+
+/* The following two typedefs are defined in a .h file which is not
+ in the standard include path (/sys/include/family/ppc/ucontext.h),
+ so we just duplicate them here. */
+
+/* General register context */
+typedef struct usr_econtext_s
+{
+ uint32_t uec_iregs[32];
+ uint32_t uec_inum;
+ uint32_t uec_srr0;
+ uint32_t uec_srr1;
+ uint32_t uec_lr;
+ uint32_t uec_ctr;
+ uint32_t uec_cr;
+ uint32_t uec_xer;
+ uint32_t uec_dar;
+ uint32_t uec_mq;
+ uint32_t uec_msr;
+ uint32_t uec_sregs[16];
+ uint32_t uec_ss_count;
+ uint32_t uec_ss_addr1;
+ uint32_t uec_ss_addr2;
+ uint32_t uec_ss_code1;
+ uint32_t uec_ss_code2;
+} usr_econtext_t;
+
+/* Floating point register context */
+typedef struct usr_fcontext_s
+{
+ uint64_t ufc_freg[32];
+ uint32_t ufc_fpscr[2];
+} usr_fcontext_t;
+
+/* Index of for various registers inside the regcache. */
+#define R0_REGNUM 0
+#define F0_REGNUM 32
+#define PC_REGNUM 64
+#define MSR_REGNUM 65
+#define CR_REGNUM 66
+#define LR_REGNUM 67
+#define CTR_REGNUM 68
+#define XER_REGNUM 69
+#define FPSCR_REGNUM 70
+
+/* Defined in auto-generated file powerpc-32.c. */
+extern void init_registers_powerpc_32 (void);
+
+/* The fill_function for the general-purpose register set. */
+
+static void
+lynx_ppc_fill_gregset (struct regcache *regcache, char *buf)
+{
+ int i;
+
+ /* r0 - r31 */
+ for (i = 0; i < 32; i++)
+ collect_register (regcache, R0_REGNUM + i,
+ buf + offsetof (usr_econtext_t, uec_iregs[i]));
+
+ /* The other registers provided in the GP register context. */
+ collect_register (regcache, PC_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_srr0));
+ collect_register (regcache, MSR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_srr1));
+ collect_register (regcache, CR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_cr));
+ collect_register (regcache, LR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_lr));
+ collect_register (regcache, CTR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_ctr));
+ collect_register (regcache, XER_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_xer));
+}
+
+/* The store_function for the general-purpose register set. */
+
+static void
+lynx_ppc_store_gregset (struct regcache *regcache, const char *buf)
+{
+ int i;
+
+ /* r0 - r31 */
+ for (i = 0; i < 32; i++)
+ supply_register (regcache, R0_REGNUM + i,
+ buf + offsetof (usr_econtext_t, uec_iregs[i]));
+
+ /* The other registers provided in the GP register context. */
+ supply_register (regcache, PC_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_srr0));
+ supply_register (regcache, MSR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_srr1));
+ supply_register (regcache, CR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_cr));
+ supply_register (regcache, LR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_lr));
+ supply_register (regcache, CTR_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_ctr));
+ supply_register (regcache, XER_REGNUM,
+ buf + offsetof (usr_econtext_t, uec_xer));
+}
+
+/* The fill_function for the floating-point register set. */
+
+static void
+lynx_ppc_fill_fpregset (struct regcache *regcache, char *buf)
+{
+ int i;
+
+ /* f0 - f31 */
+ for (i = 0; i < 32; i++)
+ collect_register (regcache, F0_REGNUM + i,
+ buf + offsetof (usr_fcontext_t, ufc_freg[i]));
+
+ /* fpscr */
+ collect_register (regcache, FPSCR_REGNUM,
+ buf + offsetof (usr_fcontext_t, ufc_fpscr));
+}
+
+/* The store_function for the floating-point register set. */
+
+static void
+lynx_ppc_store_fpregset (struct regcache *regcache, const char *buf)
+{
+ int i;
+
+ /* f0 - f31 */
+ for (i = 0; i < 32; i++)
+ supply_register (regcache, F0_REGNUM + i,
+ buf + offsetof (usr_fcontext_t, ufc_freg[i]));
+
+ /* fpscr */
+ supply_register (regcache, FPSCR_REGNUM,
+ buf + offsetof (usr_fcontext_t, ufc_fpscr));
+}
+
+/* Implements the lynx_target_ops.arch_setup routine. */
+
+static void
+lynx_ppc_arch_setup (void)
+{
+ init_registers_powerpc_32 ();
+}
+
+/* Description of all the powerpc-lynx register sets. */
+
+struct lynx_regset_info lynx_target_regsets[] = {
+ /* General Purpose Registers. */
+ {PTRACE_GETREGS, PTRACE_SETREGS, sizeof(usr_econtext_t),
+ lynx_ppc_fill_gregset, lynx_ppc_store_gregset},
+ /* Floating Point Registers. */
+ { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof(usr_fcontext_t),
+ lynx_ppc_fill_fpregset, lynx_ppc_store_fpregset },
+ /* End of list marker. */
+ {0, 0, -1, NULL, NULL }
+};
+
+/* The lynx_target_ops vector for powerpc-lynxos. */
+
+struct lynx_target_ops the_low_target = {
+ lynx_ppc_arch_setup,
+};