gdb/gdbserver/linux-bfin-low.c - gdb

Global variables defined

Functions defined

Macros defined

Source code

  1. /* GNU/Linux/BFIN specific low level interface, for the remote server for GDB.

  2.    Copyright (C) 2005-2015 Free Software Foundation, Inc.

  3.    Contributed by Analog Devices, Inc.

  4.    This file is part of GDB.

  5.    This program is free software; you can redistribute it and/or modify
  6.    it under the terms of the GNU General Public License as published by
  7.    the Free Software Foundation; either version 3 of the License, or
  8.    (at your option) any later version.

  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.

  13.    You should have received a copy of the GNU General Public License
  14.    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

  15. #include "server.h"
  16. #include "linux-low.h"
  17. #include <asm/ptrace.h>

  18. /* Defined in auto-generated file reg-bfin.c.  */
  19. void init_registers_bfin (void);
  20. extern const struct target_desc *tdesc_bfin;

  21. static int bfin_regmap[] =
  22. {
  23.   PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7,
  24.   PT_P0, PT_P1, PT_P2, PT_P3, PT_P4, PT_P5, PT_USP, PT_FP,
  25.   PT_I0, PT_I1, PT_I2, PT_I3, PT_M0, PT_M1, PT_M2, PT_M3,
  26.   PT_B0, PT_B1, PT_B2, PT_B3, PT_L0, PT_L1, PT_L2, PT_L3,
  27.   PT_A0X, PT_A0W, PT_A1X, PT_A1W, PT_ASTAT, PT_RETS,
  28.   PT_LC0, PT_LT0, PT_LB0, PT_LC1, PT_LT1, PT_LB1,
  29.   -1 /* PT_CYCLES */, -1 /* PT_CYCLES2 */,
  30.   -1 /* PT_USP */, PT_SEQSTAT, PT_SYSCFG, PT_PC, PT_RETX, PT_RETN, PT_RETE,
  31.   PT_PC,
  32. };

  33. #define bfin_num_regs ARRAY_SIZE (bfin_regmap)

  34. static int
  35. bfin_cannot_store_register (int regno)
  36. {
  37.   return (regno >= bfin_num_regs);
  38. }

  39. static int
  40. bfin_cannot_fetch_register (int regno)
  41. {
  42.   return (regno >= bfin_num_regs);
  43. }

  44. static CORE_ADDR
  45. bfin_get_pc (struct regcache *regcache)
  46. {
  47.   unsigned long pc;

  48.   collect_register_by_name (regcache, "pc", &pc);

  49.   return pc;
  50. }

  51. static void
  52. bfin_set_pc (struct regcache *regcache, CORE_ADDR pc)
  53. {
  54.   unsigned long newpc = pc;

  55.   supply_register_by_name (regcache, "pc", &newpc);
  56. }

  57. #define bfin_breakpoint_len 2
  58. static const unsigned char bfin_breakpoint[bfin_breakpoint_len] = {0xa1, 0x00};

  59. static int
  60. bfin_breakpoint_at (CORE_ADDR where)
  61. {
  62.   unsigned char insn[bfin_breakpoint_len];

  63.   read_inferior_memory(where, insn, bfin_breakpoint_len);
  64.   if (insn[0] == bfin_breakpoint[0]
  65.       && insn[1] == bfin_breakpoint[1])
  66.     return 1;

  67.   /* If necessary, recognize more trap instructions here.  GDB only uses the
  68.      one.  */
  69.   return 0;
  70. }

  71. static void
  72. bfin_arch_setup (void)
  73. {
  74.   current_process ()->tdesc = tdesc_bfin;
  75. }

  76. static struct usrregs_info bfin_usrregs_info =
  77.   {
  78.     bfin_num_regs,
  79.     bfin_regmap,
  80.   };

  81. static struct regs_info regs_info =
  82.   {
  83.     NULL, /* regset_bitmap */
  84.     &bfin_usrregs_info,
  85.   };

  86. static const struct regs_info *
  87. bfin_regs_info (void)
  88. {
  89.   return &regs_info;
  90. }

  91. struct linux_target_ops the_low_target = {
  92.   bfin_arch_setup,
  93.   bfin_regs_info,
  94.   bfin_cannot_fetch_register,
  95.   bfin_cannot_store_register,
  96.   NULL, /* fetch_register */
  97.   bfin_get_pc,
  98.   bfin_set_pc,
  99.   bfin_breakpoint,
  100.   bfin_breakpoint_len,
  101.   NULL, /* breakpoint_reinsert_addr */
  102.   2,
  103.   bfin_breakpoint_at,
  104. };


  105. void
  106. initialize_low_arch (void)
  107. {
  108.   init_registers_bfin ();
  109. }