From db1d3e1b9706b64e129855a0e12eba74ca16befa Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Sun, 21 Nov 2004 03:09:39 +0000 Subject: [PATCH] * linux-m68k-low.c (m68k_num_gregs): Define. (m68k_fill_gregset, m68k_store_gregset, m68k_fill_fpregset) (m68k_store_fpregset, target_regsets) [HAVE_LINUX_REGSETS]: New. (m68k_breakpoint, m68k_breakpoint_len, m68k_get_pc, m68k_set_pc) (m68k_breakpoint_at): New. Add to the_low_target. * configure.srv (m68*-*-linux*): Set srv_linux_regsets and srv_linux_thread_db to yes. --- gdb/gdbserver/ChangeLog | 11 ++++ gdb/gdbserver/configure.srv | 2 + gdb/gdbserver/linux-m68k-low.c | 97 +++++++++++++++++++++++++++++++++- 3 files changed, 109 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 834391633e..c98b951803 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,14 @@ +2004-11-21 Andreas Schwab + + * linux-m68k-low.c (m68k_num_gregs): Define. + (m68k_fill_gregset, m68k_store_gregset, m68k_fill_fpregset) + (m68k_store_fpregset, target_regsets) [HAVE_LINUX_REGSETS]: New. + (m68k_breakpoint, m68k_breakpoint_len, m68k_get_pc, m68k_set_pc) + (m68k_breakpoint_at): New. Add to the_low_target. + + * configure.srv (m68*-*-linux*): Set srv_linux_regsets and + srv_linux_thread_db to yes. + 2004-10-20 Joel Brobecker * linux-x86-64-low.c (ARCH_SET_GS): Add definition if missing. diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 251dd6b5dd..991cb05db9 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -36,6 +36,8 @@ case "${target}" in m68*-*-linux*) srv_regobj=reg-m68k.o srv_tgtobj="linux-low.o linux-m68k-low.o" srv_linux_usrregs=yes + srv_linux_regsets=yes + srv_linux_thread_db=yes ;; mips*-*-linux*) srv_regobj=reg-mips.o srv_tgtobj="linux-low.o linux-mips-low.o" diff --git a/gdb/gdbserver/linux-m68k-low.c b/gdb/gdbserver/linux-m68k-low.c index b49a8c9e28..c81df93e03 100644 --- a/gdb/gdbserver/linux-m68k-low.c +++ b/gdb/gdbserver/linux-m68k-low.c @@ -1,5 +1,5 @@ /* GNU/Linux/m68k specific low level interface, for the remote server for GDB. - Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003 + Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -27,6 +27,7 @@ #endif #define m68k_num_regs 29 +#define m68k_num_gregs 18 /* This table must line up with REGISTER_NAMES in tm-m68k.h */ static int m68k_regmap[] = @@ -64,9 +65,103 @@ m68k_cannot_fetch_register (int regno) return (regno >= m68k_num_regs); } +#ifdef HAVE_LINUX_REGSETS +#include +#include + +static void +m68k_fill_gregset (void *buf) +{ + int i; + + for (i = 0; i < m68k_num_gregs; i++) + collect_register (i, (char *) buf + m68k_regmap[i]); +} + +static void +m68k_store_gregset (const void *buf) +{ + int i; + + for (i = 0; i < m68k_num_gregs; i++) + supply_register (i, (const char *) buf + m68k_regmap[i]); +} + +static void +m68k_fill_fpregset (void *buf) +{ + int i; + + for (i = m68k_num_gregs; i < m68k_num_regs; i++) + collect_register (i, ((char *) buf + + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs]))); +} + +static void +m68k_store_fpregset (const void *buf) +{ + int i; + + for (i = m68k_num_gregs; i < m68k_num_regs; i++) + supply_register (i, ((const char *) buf + + (m68k_regmap[i] - m68k_regmap[m68k_num_gregs]))); +} + + +struct regset_info target_regsets[] = { + { PTRACE_GETREGS, PTRACE_SETREGS, sizeof (elf_gregset_t), + GENERAL_REGS, + m68k_fill_gregset, m68k_store_gregset }, + { PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof (elf_fpregset_t), + FP_REGS, + m68k_fill_fpregset, m68k_store_fpregset }, + { 0, 0, -1, -1, NULL, NULL } +}; + +#endif /* HAVE_LINUX_REGSETS */ + +static const char m68k_breakpoint[] = { 0x4E, 0x4F }; +#define m68k_breakpoint_len 2 + +static CORE_ADDR +m68k_get_pc () +{ + unsigned long pc; + + collect_register_by_name ("pc", &pc); + return pc; +} + +static void +m68k_set_pc (CORE_ADDR value) +{ + unsigned long newpc = value; + + supply_register_by_name ("pc", &newpc); +} + +static int +m68k_breakpoint_at (CORE_ADDR pc) +{ + unsigned char c[2]; + + read_inferior_memory (pc, c, 2); + if (c[0] == 0x4E && c[1] == 0x4F) + return 1; + + return 0; +} + struct linux_target_ops the_low_target = { m68k_num_regs, m68k_regmap, m68k_cannot_fetch_register, m68k_cannot_store_register, + m68k_get_pc, + m68k_set_pc, + m68k_breakpoint, + m68k_breakpoint_len, + NULL, + 2, + m68k_breakpoint_at, }; -- 2.34.1