summaryrefslogtreecommitdiff
path: root/gdb/gdbserver
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-11-24 09:29:43 +0000
committerYao Qi <yao.qi@linaro.org>2017-11-24 09:29:43 +0000
commit506fe5f4996738f25b7c26f126a84b231429ba95 (patch)
treef2fac3f4ca6c8ced4d56577f75022d6c0cba0b03 /gdb/gdbserver
parent6d2cd6b2084d980a4baf5b4bdce8499c2295a672 (diff)
Change tic6x target descriptions
This patch changes tic6x target descriptions to be more flexible. Rebuild tic6x-uclinux GDBserver with my x86 g++, and the unit test passes. gdb: 2017-11-24 Yao Qi <yao.qi@linaro.org> * arch/tic6x.c: New file. * arch/tic6x.h: New file. * features/Makefile (FEATURE_XMLFILES): Add tic6x-c6xp.xml, tic6x-core.xml and tic6x-gp.xml. * features/tic6x-c6xp.c: Generated. * features/tic6x-core.c: Generated. * features/tic6x-gp.c: Generated. * target-descriptions.c (maint_print_c_tdesc_cmd): Match "tic6x-". gdb/gdbserver: 2017-11-24 Yao Qi <yao.qi@linaro.org> * configure.srv: Set $srv_regobj for tic6x-linux. * linux-tic6x-low.c: Include "arch/tic6x.h" and "tdesc.h". (tic6x_read_description): Move some code to tic6x_arch_setup. (tic6x_tdesc_test): New function. (initialize_low_arch): Call selftests::register_test.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r--gdb/gdbserver/ChangeLog8
-rw-r--r--gdb/gdbserver/configure.srv14
-rw-r--r--gdb/gdbserver/linux-tic6x-low.c107
3 files changed, 87 insertions, 42 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index b53fe30173..03d4ad7628 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,11 @@
+2017-11-24 Yao Qi <yao.qi@linaro.org>
+
+ * configure.srv: Set $srv_regobj for tic6x-linux.
+ * linux-tic6x-low.c: Include "arch/tic6x.h" and "tdesc.h".
+ (tic6x_read_description): Move some code to tic6x_arch_setup.
+ (tic6x_tdesc_test): New function.
+ (initialize_low_arch): Call selftests::register_test.
+
2017-11-22 Yao Qi <yao.qi@linaro.org>
* remote-utils.c (prepare_resume_reply): Use memcpy.
diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv
index 82c3dc237c..f5fa5e6a46 100644
--- a/gdb/gdbserver/configure.srv
+++ b/gdb/gdbserver/configure.srv
@@ -356,16 +356,18 @@ case "${target}" in
spu*-*-*) srv_regobj=reg-spu.o
srv_tgtobj="spu-low.o fork-child.o fork-inferior.o"
;;
- tic6x-*-uclinux) srv_regobj="tic6x-c64xp-linux.o"
- srv_regobj="${srv_regobj} tic6x-c64x-linux.o"
- srv_regobj="${srv_regobj} tic6x-c62x-linux.o"
- srv_xmlfiles="tic6x-c64xp-linux.xml"
- srv_xmlfiles="${srv_xmlfiles} tic6x-c64x-linux.xml"
- srv_xmlfiles="${srv_xmlfiles} tic6x-c62x-linux.xml"
+ tic6x-*-uclinux) if $development; then
+ srv_regobj="tic6x-c64xp-linux.o"
+ srv_regobj="${srv_regobj} tic6x-c64x-linux.o"
+ srv_regobj="${srv_regobj} tic6x-c62x-linux.o"
+ else
+ srv_regobj=""
+ fi
srv_xmlfiles="${srv_xmlfiles} tic6x-core.xml"
srv_xmlfiles="${srv_xmlfiles} tic6x-gp.xml"
srv_xmlfiles="${srv_xmlfiles} tic6x-c6xp.xml"
srv_tgtobj="$srv_linux_obj linux-tic6x-low.o"
+ srv_tgtobj="${srv_tgtobj} arch/tic6x.o"
srv_linux_regsets=yes
srv_linux_usrregs=yes
srv_linux_thread_db=yes
diff --git a/gdb/gdbserver/linux-tic6x-low.c b/gdb/gdbserver/linux-tic6x-low.c
index 6dda52e8eb..7b6750a85d 100644
--- a/gdb/gdbserver/linux-tic6x-low.c
+++ b/gdb/gdbserver/linux-tic6x-low.c
@@ -21,6 +21,8 @@
#include "server.h"
#include "linux-low.h"
+#include "arch/tic6x.h"
+#include "tdesc.h"
#include "nat/gdb_ptrace.h"
#include <endian.h>
@@ -189,45 +191,21 @@ static struct usrregs_info tic6x_usrregs_info =
};
static const struct target_desc *
-tic6x_read_description (void)
+tic6x_read_description (enum c6x_feature feature)
{
- register unsigned int csr asm ("B2");
- unsigned int cpuid;
- const struct target_desc *tdesc;
+ static target_desc *tdescs[C6X_LAST] = { };
+ struct target_desc **tdesc = &tdescs[feature];
- /* Determine the CPU we're running on to find the register order. */
- __asm__ ("MVC .S2 CSR,%0" : "=r" (csr) :);
- cpuid = csr >> 24;
- switch (cpuid)
+ if (*tdesc == NULL)
{
- case 0x00: /* C62x */
- case 0x02: /* C67x */
- tic6x_regmap = tic6x_regmap_c62x;
- tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
- tdesc = tdesc_tic6x_c62x_linux;
- break;
- case 0x03: /* C67x+ */
- tic6x_regmap = tic6x_regmap_c64x;
- tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
- tdesc = tdesc_tic6x_c64x_linux;
- break;
- case 0x0c: /* C64x */
- tic6x_regmap = tic6x_regmap_c64x;
- tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
- tdesc = tdesc_tic6x_c64x_linux;
- break;
- case 0x10: /* C64x+ */
- case 0x14: /* C674x */
- case 0x15: /* C66x */
- tic6x_regmap = tic6x_regmap_c64xp;
- tic6x_breakpoint = 0x56454314; /* illegal opcode */
- tdesc = tdesc_tic6x_c64xp_linux;
- break;
- default:
- error ("Unknown CPU ID 0x%02x", cpuid);
+ *tdesc = tic6x_create_target_description (feature);
+ init_target_desc (*tdesc);
+
+ static const char *expedite_regs[] = { "A15", "PC", NULL };
+ (*tdesc)->expedite_regs = expedite_regs;
}
- tic6x_usrregs_info.regmap = tic6x_regmap;
- return tdesc;
+
+ return *tdesc;
}
static int
@@ -341,7 +319,44 @@ static struct regset_info tic6x_regsets[] = {
static void
tic6x_arch_setup (void)
{
- current_process ()->tdesc = tic6x_read_description ();
+ register unsigned int csr asm ("B2");
+ unsigned int cpuid;
+ enum c6x_feature feature = C6X_CORE;
+
+ /* Determine the CPU we're running on to find the register order. */
+ __asm__ ("MVC .S2 CSR,%0" : "=r" (csr) :);
+ cpuid = csr >> 24;
+ switch (cpuid)
+ {
+ case 0x00: /* C62x */
+ case 0x02: /* C67x */
+ tic6x_regmap = tic6x_regmap_c62x;
+ tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
+ feature = C6X_CORE;
+ break;
+ case 0x03: /* C67x+ */
+ tic6x_regmap = tic6x_regmap_c64x;
+ tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
+ feature = C6X_GP;
+ break;
+ case 0x0c: /* C64x */
+ tic6x_regmap = tic6x_regmap_c64x;
+ tic6x_breakpoint = 0x0000a122; /* BNOP .S2 0,5 */
+ feature = C6X_GP;
+ break;
+ case 0x10: /* C64x+ */
+ case 0x14: /* C674x */
+ case 0x15: /* C66x */
+ tic6x_regmap = tic6x_regmap_c64xp;
+ tic6x_breakpoint = 0x56454314; /* illegal opcode */
+ feature = C6X_C6XP;
+ break;
+ default:
+ error ("Unknown CPU ID 0x%02x", cpuid);
+ }
+ tic6x_usrregs_info.regmap = tic6x_regmap;
+
+ current_process ()->tdesc = tic6x_read_description (feature);
}
/* Support for hardware single step. */
@@ -410,13 +425,33 @@ struct linux_target_ops the_low_target = {
tic6x_supports_hardware_single_step,
};
+#if GDB_SELF_TEST
+#include "common/selftest.h"
+
+namespace selftests {
+namespace tdesc {
+static void
+tic6x_tdesc_test ()
+{
+ SELF_CHECK (*tdesc_tic6x_c62x_linux == *tic6x_read_description (C6X_CORE));
+ SELF_CHECK (*tdesc_tic6x_c64x_linux == *tic6x_read_description (C6X_GP));
+ SELF_CHECK (*tdesc_tic6x_c64xp_linux == *tic6x_read_description (C6X_C6XP));
+}
+}
+}
+#endif
+
void
initialize_low_arch (void)
{
+#if GDB_SELF_TEST
/* Initialize the Linux target descriptions. */
init_registers_tic6x_c64xp_linux ();
init_registers_tic6x_c64x_linux ();
init_registers_tic6x_c62x_linux ();
+ selftests::register_test ("tic6x-tdesc", selftests::tdesc::tic6x_tdesc_test);
+#endif
+
initialize_regsets_info (&tic6x_regsets_info);
}