/* GNU/Linux/CRIS specific low level interface, for the remote server for GDB.
- Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
- 2007 Free Software Foundation, Inc.
+ Copyright (C) 1995-2019 Free Software Foundation, Inc.
This file is part of GDB.
#include "server.h"
#include "linux-low.h"
-#include <sys/ptrace.h>
+#include "nat/gdb_ptrace.h"
+
+/* Defined in auto-generated file reg-cris.c. */
+void init_registers_cris (void);
+extern const struct target_desc *tdesc_cris;
/* CRISv10 */
#define cris_num_regs 32
-1, 17*4, -1, 16*4,
-1, -1, -1, 18*4,
-1, 17*4, -1, -1
-
+
};
static int
{
if (cris_regmap[regno] == -1)
return 1;
-
+
return (regno >= cris_num_regs);
}
return (regno >= cris_num_regs);
}
-extern int debug_threads;
+static const unsigned short cris_breakpoint = 0xe938;
+#define cris_breakpoint_len 2
-static CORE_ADDR
-cris_get_pc (void)
-{
- unsigned long pc;
- collect_register_by_name ("pc", &pc);
- if (debug_threads)
- fprintf (stderr, "stop pc is %08lx\n", pc);
- return pc;
-}
+/* Implementation of linux_target_ops method "sw_breakpoint_from_kind". */
-static void
-cris_set_pc (CORE_ADDR pc)
+static const gdb_byte *
+cris_sw_breakpoint_from_kind (int kind, int *size)
{
- unsigned long newpc = pc;
- supply_register_by_name ("pc", &newpc);
+ *size = cris_breakpoint_len;
+ return (const gdb_byte *) &cris_breakpoint;
}
-static const unsigned short cris_breakpoint = 0xe938;
-#define cris_breakpoint_len 2
-
static int
cris_breakpoint_at (CORE_ADDR where)
{
return 0;
}
-/* We only place breakpoints in empty marker functions, and thread locking
- is outside of the function. So rather than importing software single-step,
- we can just run until exit. */
-static CORE_ADDR
-cris_reinsert_addr (void)
+static void
+cris_arch_setup (void)
+{
+ current_process ()->tdesc = tdesc_cris;
+}
+
+static struct usrregs_info cris_usrregs_info =
+ {
+ cris_num_regs,
+ cris_regmap,
+ };
+
+static struct regs_info regs_info =
+ {
+ NULL, /* regset_bitmap */
+ &cris_usrregs_info,
+ };
+
+static const struct regs_info *
+cris_regs_info (void)
{
- unsigned long pc;
- collect_register_by_name ("srp", &pc);
- return pc;
+ return ®s_info;
}
struct linux_target_ops the_low_target = {
- cris_num_regs,
- cris_regmap,
+ cris_arch_setup,
+ cris_regs_info,
cris_cannot_fetch_register,
cris_cannot_store_register,
- cris_get_pc,
- cris_set_pc,
- (const unsigned char *) &cris_breakpoint,
- cris_breakpoint_len,
- cris_reinsert_addr,
+ NULL, /* fetch_register */
+ linux_get_pc_32bit,
+ linux_set_pc_32bit,
+ NULL, /* breakpoint_kind_from_pc */
+ cris_sw_breakpoint_from_kind,
+ NULL, /* get_next_pcs */
0,
cris_breakpoint_at,
- 0,
- 0,
- 0,
- 0,
};
+
+void
+initialize_low_arch (void)
+{
+ init_registers_cris ();
+}