GDBserver
linux-bfin-low.c
Go to the documentation of this file.
1 /* GNU/Linux/BFIN specific low level interface, for the remote server for GDB.
2 
3  Copyright (C) 2005-2015 Free Software Foundation, Inc.
4 
5  Contributed by Analog Devices, Inc.
6 
7  This file is part of GDB.
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 
22 #include "server.h"
23 #include "linux-low.h"
24 #include <asm/ptrace.h>
25 
26 /* Defined in auto-generated file reg-bfin.c. */
27 void init_registers_bfin (void);
28 extern const struct target_desc *tdesc_bfin;
29 
30 static int bfin_regmap[] =
31 {
32  PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7,
33  PT_P0, PT_P1, PT_P2, PT_P3, PT_P4, PT_P5, PT_USP, PT_FP,
34  PT_I0, PT_I1, PT_I2, PT_I3, PT_M0, PT_M1, PT_M2, PT_M3,
35  PT_B0, PT_B1, PT_B2, PT_B3, PT_L0, PT_L1, PT_L2, PT_L3,
36  PT_A0X, PT_A0W, PT_A1X, PT_A1W, PT_ASTAT, PT_RETS,
37  PT_LC0, PT_LT0, PT_LB0, PT_LC1, PT_LT1, PT_LB1,
38  -1 /* PT_CYCLES */, -1 /* PT_CYCLES2 */,
39  -1 /* PT_USP */, PT_SEQSTAT, PT_SYSCFG, PT_PC, PT_RETX, PT_RETN, PT_RETE,
40  PT_PC,
41 };
42 
43 #define bfin_num_regs ARRAY_SIZE (bfin_regmap)
44 
45 static int
47 {
48  return (regno >= bfin_num_regs);
49 }
50 
51 static int
53 {
54  return (regno >= bfin_num_regs);
55 }
56 
57 static CORE_ADDR
59 {
60  unsigned long pc;
61 
62  collect_register_by_name (regcache, "pc", &pc);
63 
64  return pc;
65 }
66 
67 static void
69 {
70  unsigned long newpc = pc;
71 
72  supply_register_by_name (regcache, "pc", &newpc);
73 }
74 
75 #define bfin_breakpoint_len 2
76 static const unsigned char bfin_breakpoint[bfin_breakpoint_len] = {0xa1, 0x00};
77 
78 static int
80 {
81  unsigned char insn[bfin_breakpoint_len];
82 
84  if (insn[0] == bfin_breakpoint[0]
85  && insn[1] == bfin_breakpoint[1])
86  return 1;
87 
88  /* If necessary, recognize more trap instructions here. GDB only uses the
89  one. */
90  return 0;
91 }
92 
93 static void
95 {
97 }
98 
99 static struct usrregs_info bfin_usrregs_info =
100  {
102  bfin_regmap,
103  };
104 
105 static struct regs_info regs_info =
106  {
107  NULL, /* regset_bitmap */
109  };
110 
111 static const struct regs_info *
113 {
114  return &regs_info;
115 }
116 
117 struct linux_target_ops the_low_target = {
122  NULL, /* fetch_register */
123  bfin_get_pc,
124  bfin_set_pc,
127  NULL, /* breakpoint_reinsert_addr */
128  2,
130 };
131 
132 
133 void
135 {
137 }
static void bfin_set_pc(struct regcache *regcache, CORE_ADDR pc)
bfd_vma CORE_ADDR
Definition: common-types.h:41
void supply_register_by_name(struct regcache *regcache, const char *name, const void *buf)
Definition: regcache.c:405
#define bfin_num_regs
static void bfin_arch_setup(void)
const struct target_desc * tdesc
Definition: inferiors.h:69
static struct usrregs_info bfin_usrregs_info
void collect_register_by_name(struct regcache *regcache, const char *name, void *buf)
Definition: regcache.c:430
int read_inferior_memory(CORE_ADDR memaddr, unsigned char *myaddr, int len)
Definition: target.c:43
static int bfin_cannot_fetch_register(int regno)
static const unsigned char bfin_breakpoint[bfin_breakpoint_len]
struct process_info * current_process(void)
Definition: inferiors.c:356
static CORE_ADDR bfin_get_pc(struct regcache *regcache)
const struct target_desc * tdesc_bfin
static int bfin_regmap[]
static const struct regs_info * bfin_regs_info(void)
static int bfin_breakpoint_at(CORE_ADDR where)
void init_registers_bfin(void)
void initialize_low_arch(void)
static int bfin_cannot_store_register(int regno)
static struct regs_info regs_info
#define bfin_breakpoint_len