gdbserver/linux-low: turn 'sw_breakpoint_from_kind' into a method
[deliverable/binutils-gdb.git] / gdbserver / linux-nios2-low.cc
CommitLineData
68f5f838
SL
1/* GNU/Linux/Nios II specific low level interface, for the remote server for
2 GDB.
b811d2c2 3 Copyright (C) 2008-2020 Free Software Foundation, Inc.
68f5f838
SL
4
5 Contributed by Mentor Graphics, 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"
21e94bd9 24#include "elf/common.h"
5826e159 25#include "nat/gdb_ptrace.h"
68f5f838
SL
26#include <endian.h>
27#include "gdb_proc_service.h"
28#include <asm/ptrace.h>
29
30#ifndef PTRACE_GET_THREAD_AREA
31#define PTRACE_GET_THREAD_AREA 25
32#endif
33
ef0478f6
TBA
34/* Linux target op definitions for the NIOS II architecture. */
35
36class nios2_target : public linux_process_target
37{
38public:
39
aa8d21c9
TBA
40 const regs_info *get_regs_info () override;
41
3ca4edb6
TBA
42 const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
43
797bcff5
TBA
44protected:
45
46 void low_arch_setup () override;
daca57a7
TBA
47
48 bool low_cannot_fetch_register (int regno) override;
49
50 bool low_cannot_store_register (int regno) override;
bf9ae9d8
TBA
51
52 bool low_supports_breakpoints () override;
53
54 CORE_ADDR low_get_pc (regcache *regcache) override;
55
56 void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
ef0478f6
TBA
57};
58
59/* The singleton target ops object. */
60
61static nios2_target the_nios2_target;
62
bf9ae9d8
TBA
63bool
64nios2_target::low_supports_breakpoints ()
65{
66 return true;
67}
68
69CORE_ADDR
70nios2_target::low_get_pc (regcache *regcache)
71{
72 return linux_get_pc_32bit (regcache);
73}
74
75void
76nios2_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
77{
78 linux_set_pc_32bit (regcache, pc);
79}
80
68f5f838
SL
81/* The following definition must agree with the number of registers
82 defined in "struct user_regs" in GLIBC
21e94bd9 83 (sysdeps/unix/sysv/linux/nios2/sys/user.h), and also with
68f5f838
SL
84 NIOS2_NUM_REGS in GDB proper. */
85
86#define nios2_num_regs 49
87
88/* Defined in auto-generated file nios2-linux.c. */
89
90void init_registers_nios2_linux (void);
3aee8918 91extern const struct target_desc *tdesc_nios2_linux;
68f5f838
SL
92
93/* This union is used to convert between int and byte buffer
94 representations of register contents. */
95
96union nios2_register
97{
98 unsigned char buf[4];
99 int reg32;
100};
101
102/* Return the ptrace ``address'' of register REGNO. */
103
104static int nios2_regmap[] = {
105 -1, 1, 2, 3, 4, 5, 6, 7,
106 8, 9, 10, 11, 12, 13, 14, 15,
107 16, 17, 18, 19, 20, 21, 22, 23,
108 24, 25, 26, 27, 28, 29, 30, 31,
109 32, 33, 34, 35, 36, 37, 38, 39,
110 40, 41, 42, 43, 44, 45, 46, 47,
111 48,
112 0
113};
114
797bcff5 115/* Implement the low_arch_setup linux target ops method. */
68f5f838 116
797bcff5
TBA
117void
118nios2_target::low_arch_setup ()
68f5f838 119{
3aee8918 120 current_process ()->tdesc = tdesc_nios2_linux;
68f5f838
SL
121}
122
daca57a7 123/* Implement the low_cannot_fetch_register linux target ops method. */
68f5f838 124
daca57a7
TBA
125bool
126nios2_target::low_cannot_fetch_register (int regno)
68f5f838 127{
daca57a7 128 return (nios2_regmap[regno] == -1);
68f5f838
SL
129}
130
daca57a7 131/* Implement the low_cannot_store_register linux target ops method. */
68f5f838 132
daca57a7
TBA
133bool
134nios2_target::low_cannot_store_register (int regno)
68f5f838 135{
daca57a7 136 return (nios2_regmap[regno] == -1);
68f5f838
SL
137}
138
af60a1ef
SL
139/* Breakpoint support. Also see comments on nios2_breakpoint_from_pc
140 in nios2-tdep.c. */
141
142#if defined(__nios2_arch__) && __nios2_arch__ == 2
143#define NIOS2_BREAKPOINT 0xb7fd0020
144#define CDX_BREAKPOINT 0xd7c9
145#else
146#define NIOS2_BREAKPOINT 0x003b6ffa
147#endif
68f5f838 148
dd373349
AT
149/* We only register the 4-byte breakpoint, even on R2 targets which also
150 support 2-byte breakpoints. Since there is no supports_z_point_type
151 function provided, gdbserver never inserts software breakpoints itself
152 and instead relies on GDB to insert the breakpoint of the correct length
153 via a memory write. */
af60a1ef 154static const unsigned int nios2_breakpoint = NIOS2_BREAKPOINT;
68f5f838
SL
155#define nios2_breakpoint_len 4
156
3ca4edb6 157/* Implementation of target ops method "sw_breakpoint_from_kind". */
dd373349 158
3ca4edb6
TBA
159const gdb_byte *
160nios2_target::sw_breakpoint_from_kind (int kind, int *size)
dd373349
AT
161{
162 *size = nios2_breakpoint_len;
163 return (const gdb_byte *) &nios2_breakpoint;
164}
165
68f5f838
SL
166/* Implement the breakpoint_at linux_target_ops method. */
167
168static int
169nios2_breakpoint_at (CORE_ADDR where)
170{
171 unsigned int insn;
172
af60a1ef
SL
173 /* For R2, first check for the 2-byte CDX trap.n breakpoint encoding. */
174#if defined(__nios2_arch__) && __nios2_arch__ == 2
52405d85 175 the_target->read_memory (where, (unsigned char *) &insn, 2);
af60a1ef
SL
176 if (insn == CDX_BREAKPOINT)
177 return 1;
178#endif
179
52405d85 180 the_target->read_memory (where, (unsigned char *) &insn, 4);
68f5f838
SL
181 if (insn == nios2_breakpoint)
182 return 1;
183 return 0;
184}
185
186/* Fetch the thread-local storage pointer for libthread_db. */
187
188ps_err_e
754653a7 189ps_get_thread_area (struct ps_prochandle *ph,
68f5f838
SL
190 lwpid_t lwpid, int idx, void **base)
191{
192 if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, NULL, base) != 0)
193 return PS_ERR;
194
195 /* IDX is the bias from the thread pointer to the beginning of the
196 thread descriptor. It has to be subtracted due to implementation
197 quirks in libthread_db. */
198 *base = (void *) ((char *) *base - idx);
199
200 return PS_OK;
201}
202
68f5f838
SL
203/* Helper functions to collect/supply a single register REGNO. */
204
205static void
206nios2_collect_register (struct regcache *regcache, int regno,
207 union nios2_register *reg)
208{
209 union nios2_register tmp_reg;
210
211 collect_register (regcache, regno, &tmp_reg.reg32);
212 reg->reg32 = tmp_reg.reg32;
213}
214
215static void
216nios2_supply_register (struct regcache *regcache, int regno,
217 const union nios2_register *reg)
218{
219 supply_register (regcache, regno, reg->buf);
220}
221
222/* We have only a single register set on Nios II. */
223
224static void
225nios2_fill_gregset (struct regcache *regcache, void *buf)
226{
b1c51e36 227 union nios2_register *regset = (union nios2_register *) buf;
68f5f838
SL
228 int i;
229
230 for (i = 1; i < nios2_num_regs; i++)
231 nios2_collect_register (regcache, i, regset + i);
232}
233
234static void
235nios2_store_gregset (struct regcache *regcache, const void *buf)
236{
b1c51e36 237 const union nios2_register *regset = (union nios2_register *) buf;
68f5f838
SL
238 int i;
239
240 for (i = 0; i < nios2_num_regs; i++)
241 nios2_supply_register (regcache, i, regset + i);
242}
68f5f838 243
3aee8918 244static struct regset_info nios2_regsets[] =
68f5f838 245{
21e94bd9
SL
246 { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
247 nios2_num_regs * 4, GENERAL_REGS,
68f5f838 248 nios2_fill_gregset, nios2_store_gregset },
50bc912a 249 NULL_REGSET
68f5f838
SL
250};
251
3aee8918
PA
252static struct regsets_info nios2_regsets_info =
253 {
254 nios2_regsets, /* regsets */
255 0, /* num_regsets */
256 NULL, /* disabled_regsets */
257 };
258
259static struct usrregs_info nios2_usrregs_info =
260 {
261 nios2_num_regs,
262 nios2_regmap,
263 };
264
aa8d21c9 265static struct regs_info myregs_info =
3aee8918
PA
266 {
267 NULL, /* regset_bitmap */
268 &nios2_usrregs_info,
269 &nios2_regsets_info
270 };
271
aa8d21c9
TBA
272const regs_info *
273nios2_target::get_regs_info ()
3aee8918 274{
aa8d21c9 275 return &myregs_info;
3aee8918
PA
276}
277
68f5f838
SL
278struct linux_target_ops the_low_target =
279{
fa5308bd 280 NULL, /* get_next_pcs */
68f5f838
SL
281 0,
282 nios2_breakpoint_at,
283};
3aee8918 284
ef0478f6
TBA
285/* The linux target ops object. */
286
287linux_process_target *the_linux_target = &the_nios2_target;
288
3aee8918
PA
289void
290initialize_low_arch (void)
291{
292 init_registers_nios2_linux ();
293
294 initialize_regsets_info (&nios2_regsets_info);
295}
This page took 0.548522 seconds and 4 git commands to generate.