linux-arc-low.cc revision 1.1.1.2 1 1.1 christos /* Target dependent code for the remote server for GNU/Linux ARC.
2 1.1 christos
3 1.1.1.2 christos Copyright 2020-2024 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "regdef.h"
21 1.1 christos #include "linux-low.h"
22 1.1 christos #include "tdesc.h"
23 1.1 christos #include "arch/arc.h"
24 1.1 christos
25 1.1 christos #include <linux/elf.h>
26 1.1 christos #include <arpa/inet.h>
27 1.1 christos
28 1.1 christos /* Linux starting with 4.12 supports NT_ARC_V2 note type, which adds R30,
29 1.1 christos R58 and R59 registers. */
30 1.1 christos #ifdef NT_ARC_V2
31 1.1 christos #define ARC_HAS_V2_REGSET
32 1.1 christos #endif
33 1.1 christos
34 1.1 christos /* The encoding of the instruction "TRAP_S 1" (endianness agnostic). */
35 1.1 christos #define TRAP_S_1_OPCODE 0x783e
36 1.1 christos #define TRAP_S_1_SIZE 2
37 1.1 christos
38 1.1 christos /* Using a mere "uint16_t arc_linux_traps_s = TRAP_S_1_OPCODE" would
39 1.1 christos work as well, because the endianness will end up correctly when
40 1.1 christos the code is compiled for the same endianness as the target (see
41 1.1 christos the notes for "low_breakpoint_at" in this file). However, this
42 1.1 christos illustrates how the __BIG_ENDIAN__ macro can be used to make
43 1.1 christos easy-to-understand codes. */
44 1.1 christos #if defined(__BIG_ENDIAN__)
45 1.1 christos /* 0x78, 0x3e. */
46 1.1 christos static gdb_byte arc_linux_trap_s[TRAP_S_1_SIZE]
47 1.1 christos = {TRAP_S_1_OPCODE >> 8, TRAP_S_1_OPCODE & 0xFF};
48 1.1 christos #else
49 1.1 christos /* 0x3e, 0x78. */
50 1.1 christos static gdb_byte arc_linux_trap_s[TRAP_S_1_SIZE]
51 1.1 christos = {TRAP_S_1_OPCODE && 0xFF, TRAP_S_1_OPCODE >> 8};
52 1.1 christos #endif
53 1.1 christos
54 1.1 christos /* Linux target op definitions for the ARC architecture.
55 1.1 christos Note for future: in case of adding the protected method low_get_next_pcs(),
56 1.1 christos the public method supports_software_single_step() should be added to return
57 1.1 christos "true". */
58 1.1 christos
59 1.1 christos class arc_target : public linux_process_target
60 1.1 christos {
61 1.1 christos public:
62 1.1 christos
63 1.1 christos const regs_info *get_regs_info () override;
64 1.1 christos
65 1.1 christos const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
66 1.1 christos
67 1.1 christos protected:
68 1.1 christos
69 1.1 christos void low_arch_setup () override;
70 1.1 christos
71 1.1 christos bool low_cannot_fetch_register (int regno) override;
72 1.1 christos
73 1.1 christos bool low_cannot_store_register (int regno) override;
74 1.1 christos
75 1.1 christos bool low_supports_breakpoints () override;
76 1.1 christos
77 1.1 christos CORE_ADDR low_get_pc (regcache *regcache) override;
78 1.1 christos
79 1.1 christos void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
80 1.1 christos
81 1.1 christos bool low_breakpoint_at (CORE_ADDR where) override;
82 1.1 christos };
83 1.1 christos
84 1.1 christos /* The singleton target ops object. */
85 1.1 christos
86 1.1 christos static arc_target the_arc_target;
87 1.1 christos
88 1.1 christos bool
89 1.1 christos arc_target::low_supports_breakpoints ()
90 1.1 christos {
91 1.1 christos return true;
92 1.1 christos }
93 1.1 christos
94 1.1 christos CORE_ADDR
95 1.1 christos arc_target::low_get_pc (regcache *regcache)
96 1.1 christos {
97 1.1 christos return linux_get_pc_32bit (regcache);
98 1.1 christos }
99 1.1 christos
100 1.1 christos void
101 1.1 christos arc_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
102 1.1 christos {
103 1.1 christos linux_set_pc_32bit (regcache, pc);
104 1.1 christos }
105 1.1 christos
106 1.1 christos static const struct target_desc *
107 1.1 christos arc_linux_read_description (void)
108 1.1 christos {
109 1.1 christos #ifdef __ARC700__
110 1.1 christos arc_arch_features features (4, ARC_ISA_ARCV1);
111 1.1 christos #else
112 1.1 christos arc_arch_features features (4, ARC_ISA_ARCV2);
113 1.1 christos #endif
114 1.1 christos target_desc_up tdesc = arc_create_target_description (features);
115 1.1 christos
116 1.1 christos static const char *expedite_regs[] = { "sp", "status32", nullptr };
117 1.1 christos init_target_desc (tdesc.get (), expedite_regs);
118 1.1 christos
119 1.1 christos return tdesc.release ();
120 1.1 christos }
121 1.1 christos
122 1.1 christos void
123 1.1 christos arc_target::low_arch_setup ()
124 1.1 christos {
125 1.1 christos current_process ()->tdesc = arc_linux_read_description ();
126 1.1 christos }
127 1.1 christos
128 1.1 christos bool
129 1.1 christos arc_target::low_cannot_fetch_register (int regno)
130 1.1 christos {
131 1.1 christos return (regno >= current_process ()->tdesc->reg_defs.size ());
132 1.1 christos }
133 1.1 christos
134 1.1 christos bool
135 1.1 christos arc_target::low_cannot_store_register (int regno)
136 1.1 christos {
137 1.1 christos return (regno >= current_process ()->tdesc->reg_defs.size ());
138 1.1 christos }
139 1.1 christos
140 1.1 christos /* This works for both endianness. Below you see an illustration of how
141 1.1 christos the "trap_s 1" instruction encoded for both endianness in the memory
142 1.1 christos will end up as the TRAP_S_1_OPCODE constant:
143 1.1 christos
144 1.1 christos BE: 0x78 0x3e --> at INSN addr: 0x78 0x3e --> INSN = 0x783e
145 1.1 christos LE: 0x3e 0x78 --> at INSN addr: 0x3e 0x78 --> INSN = 0x783e
146 1.1 christos
147 1.1 christos One can employ "memcmp()" for comparing the arrays too. */
148 1.1 christos
149 1.1 christos bool
150 1.1 christos arc_target::low_breakpoint_at (CORE_ADDR where)
151 1.1 christos {
152 1.1 christos uint16_t insn;
153 1.1 christos
154 1.1 christos /* "the_target" global variable is the current object at hand. */
155 1.1 christos this->read_memory (where, (gdb_byte *) &insn, TRAP_S_1_SIZE);
156 1.1 christos return (insn == TRAP_S_1_OPCODE);
157 1.1 christos }
158 1.1 christos
159 1.1 christos /* PTRACE_GETREGSET/NT_PRSTATUS and PTRACE_SETREGSET/NT_PRSTATUS work with
160 1.1 christos regsets in a struct, "user_regs_struct", defined in the
161 1.1 christos linux/arch/arc/include/uapi/asm/ptrace.h header. This code supports
162 1.1 christos ARC Linux ABI v3 and v4. */
163 1.1 christos
164 1.1 christos /* Populate a ptrace NT_PRSTATUS regset from a regcache.
165 1.1 christos
166 1.1 christos This appears to be a unique approach to populating the buffer, but
167 1.1 christos being name, rather than offset based, it is robust to future API
168 1.1 christos changes, as there is no need to create a regmap of registers in the
169 1.1 christos user_regs_struct. */
170 1.1 christos
171 1.1 christos static void
172 1.1 christos arc_fill_gregset (struct regcache *regcache, void *buf)
173 1.1 christos {
174 1.1 christos struct user_regs_struct *regbuf = (struct user_regs_struct *) buf;
175 1.1 christos
176 1.1 christos /* Core registers. */
177 1.1 christos collect_register_by_name (regcache, "r0", &(regbuf->scratch.r0));
178 1.1 christos collect_register_by_name (regcache, "r1", &(regbuf->scratch.r1));
179 1.1 christos collect_register_by_name (regcache, "r2", &(regbuf->scratch.r2));
180 1.1 christos collect_register_by_name (regcache, "r3", &(regbuf->scratch.r3));
181 1.1 christos collect_register_by_name (regcache, "r4", &(regbuf->scratch.r4));
182 1.1 christos collect_register_by_name (regcache, "r5", &(regbuf->scratch.r5));
183 1.1 christos collect_register_by_name (regcache, "r6", &(regbuf->scratch.r6));
184 1.1 christos collect_register_by_name (regcache, "r7", &(regbuf->scratch.r7));
185 1.1 christos collect_register_by_name (regcache, "r8", &(regbuf->scratch.r8));
186 1.1 christos collect_register_by_name (regcache, "r9", &(regbuf->scratch.r9));
187 1.1 christos collect_register_by_name (regcache, "r10", &(regbuf->scratch.r10));
188 1.1 christos collect_register_by_name (regcache, "r11", &(regbuf->scratch.r11));
189 1.1 christos collect_register_by_name (regcache, "r12", &(regbuf->scratch.r12));
190 1.1 christos collect_register_by_name (regcache, "r13", &(regbuf->callee.r13));
191 1.1 christos collect_register_by_name (regcache, "r14", &(regbuf->callee.r14));
192 1.1 christos collect_register_by_name (regcache, "r15", &(regbuf->callee.r15));
193 1.1 christos collect_register_by_name (regcache, "r16", &(regbuf->callee.r16));
194 1.1 christos collect_register_by_name (regcache, "r17", &(regbuf->callee.r17));
195 1.1 christos collect_register_by_name (regcache, "r18", &(regbuf->callee.r18));
196 1.1 christos collect_register_by_name (regcache, "r19", &(regbuf->callee.r19));
197 1.1 christos collect_register_by_name (regcache, "r20", &(regbuf->callee.r20));
198 1.1 christos collect_register_by_name (regcache, "r21", &(regbuf->callee.r21));
199 1.1 christos collect_register_by_name (regcache, "r22", &(regbuf->callee.r22));
200 1.1 christos collect_register_by_name (regcache, "r23", &(regbuf->callee.r23));
201 1.1 christos collect_register_by_name (regcache, "r24", &(regbuf->callee.r24));
202 1.1 christos collect_register_by_name (regcache, "r25", &(regbuf->callee.r25));
203 1.1 christos collect_register_by_name (regcache, "gp", &(regbuf->scratch.gp));
204 1.1 christos collect_register_by_name (regcache, "fp", &(regbuf->scratch.fp));
205 1.1 christos collect_register_by_name (regcache, "sp", &(regbuf->scratch.sp));
206 1.1 christos collect_register_by_name (regcache, "blink", &(regbuf->scratch.blink));
207 1.1 christos
208 1.1 christos /* Loop registers. */
209 1.1 christos collect_register_by_name (regcache, "lp_count", &(regbuf->scratch.lp_count));
210 1.1 christos collect_register_by_name (regcache, "lp_start", &(regbuf->scratch.lp_start));
211 1.1 christos collect_register_by_name (regcache, "lp_end", &(regbuf->scratch.lp_end));
212 1.1 christos
213 1.1 christos /* The current "pc" value must be written to "eret" (exception return
214 1.1 christos address) register, because that is the address that the kernel code
215 1.1 christos will jump back to after a breakpoint exception has been raised.
216 1.1 christos The "pc_stop" value is ignored by the genregs_set() in
217 1.1 christos linux/arch/arc/kernel/ptrace.c. */
218 1.1 christos collect_register_by_name (regcache, "pc", &(regbuf->scratch.ret));
219 1.1 christos
220 1.1 christos /* Currently ARC Linux ptrace doesn't allow writes to status32 because
221 1.1 christos some of its bits are kernel mode-only and shoudn't be writable from
222 1.1 christos user-space. Writing status32 from debugger could be useful, though,
223 1.1.1.2 christos so ability to write non-privileged bits will be added to kernel
224 1.1 christos sooner or later. */
225 1.1 christos
226 1.1 christos /* BTA. */
227 1.1 christos collect_register_by_name (regcache, "bta", &(regbuf->scratch.bta));
228 1.1 christos }
229 1.1 christos
230 1.1 christos /* Populate a regcache from a ptrace NT_PRSTATUS regset. */
231 1.1 christos
232 1.1 christos static void
233 1.1 christos arc_store_gregset (struct regcache *regcache, const void *buf)
234 1.1 christos {
235 1.1 christos const struct user_regs_struct *regbuf = (const struct user_regs_struct *) buf;
236 1.1 christos
237 1.1 christos /* Core registers. */
238 1.1 christos supply_register_by_name (regcache, "r0", &(regbuf->scratch.r0));
239 1.1 christos supply_register_by_name (regcache, "r1", &(regbuf->scratch.r1));
240 1.1 christos supply_register_by_name (regcache, "r2", &(regbuf->scratch.r2));
241 1.1 christos supply_register_by_name (regcache, "r3", &(regbuf->scratch.r3));
242 1.1 christos supply_register_by_name (regcache, "r4", &(regbuf->scratch.r4));
243 1.1 christos supply_register_by_name (regcache, "r5", &(regbuf->scratch.r5));
244 1.1 christos supply_register_by_name (regcache, "r6", &(regbuf->scratch.r6));
245 1.1 christos supply_register_by_name (regcache, "r7", &(regbuf->scratch.r7));
246 1.1 christos supply_register_by_name (regcache, "r8", &(regbuf->scratch.r8));
247 1.1 christos supply_register_by_name (regcache, "r9", &(regbuf->scratch.r9));
248 1.1 christos supply_register_by_name (regcache, "r10", &(regbuf->scratch.r10));
249 1.1 christos supply_register_by_name (regcache, "r11", &(regbuf->scratch.r11));
250 1.1 christos supply_register_by_name (regcache, "r12", &(regbuf->scratch.r12));
251 1.1 christos supply_register_by_name (regcache, "r13", &(regbuf->callee.r13));
252 1.1 christos supply_register_by_name (regcache, "r14", &(regbuf->callee.r14));
253 1.1 christos supply_register_by_name (regcache, "r15", &(regbuf->callee.r15));
254 1.1 christos supply_register_by_name (regcache, "r16", &(regbuf->callee.r16));
255 1.1 christos supply_register_by_name (regcache, "r17", &(regbuf->callee.r17));
256 1.1 christos supply_register_by_name (regcache, "r18", &(regbuf->callee.r18));
257 1.1 christos supply_register_by_name (regcache, "r19", &(regbuf->callee.r19));
258 1.1 christos supply_register_by_name (regcache, "r20", &(regbuf->callee.r20));
259 1.1 christos supply_register_by_name (regcache, "r21", &(regbuf->callee.r21));
260 1.1 christos supply_register_by_name (regcache, "r22", &(regbuf->callee.r22));
261 1.1 christos supply_register_by_name (regcache, "r23", &(regbuf->callee.r23));
262 1.1 christos supply_register_by_name (regcache, "r24", &(regbuf->callee.r24));
263 1.1 christos supply_register_by_name (regcache, "r25", &(regbuf->callee.r25));
264 1.1 christos supply_register_by_name (regcache, "gp", &(regbuf->scratch.gp));
265 1.1 christos supply_register_by_name (regcache, "fp", &(regbuf->scratch.fp));
266 1.1 christos supply_register_by_name (regcache, "sp", &(regbuf->scratch.sp));
267 1.1 christos supply_register_by_name (regcache, "blink", &(regbuf->scratch.blink));
268 1.1 christos
269 1.1 christos /* Loop registers. */
270 1.1 christos supply_register_by_name (regcache, "lp_count", &(regbuf->scratch.lp_count));
271 1.1 christos supply_register_by_name (regcache, "lp_start", &(regbuf->scratch.lp_start));
272 1.1 christos supply_register_by_name (regcache, "lp_end", &(regbuf->scratch.lp_end));
273 1.1 christos
274 1.1 christos /* The genregs_get() in linux/arch/arc/kernel/ptrace.c populates the
275 1.1 christos pseudo register "stop_pc" with the "efa" (exception fault address)
276 1.1 christos register. This was deemed necessary, because the breakpoint
277 1.1 christos instruction, "trap_s 1", is a committing one; i.e. the "eret"
278 1.1 christos (exception return address) register will be pointing to the next
279 1.1 christos instruction, while "efa" points to the address that raised the
280 1.1 christos breakpoint. */
281 1.1 christos supply_register_by_name (regcache, "pc", &(regbuf->stop_pc));
282 1.1 christos unsigned long pcl = regbuf->stop_pc & ~3L;
283 1.1 christos supply_register_by_name (regcache, "pcl", &pcl);
284 1.1 christos
285 1.1 christos /* Other auxilliary registers. */
286 1.1 christos supply_register_by_name (regcache, "status32", &(regbuf->scratch.status32));
287 1.1 christos
288 1.1 christos /* BTA. */
289 1.1 christos supply_register_by_name (regcache, "bta", &(regbuf->scratch.bta));
290 1.1 christos }
291 1.1 christos
292 1.1 christos #ifdef ARC_HAS_V2_REGSET
293 1.1 christos
294 1.1 christos /* Look through a regcache's TDESC for a register named NAME.
295 1.1 christos If found, return true; false, otherwise. */
296 1.1 christos
297 1.1 christos static bool
298 1.1 christos is_reg_name_available_p (const struct target_desc *tdesc,
299 1.1 christos const char *name)
300 1.1 christos {
301 1.1 christos for (const gdb::reg ® : tdesc->reg_defs)
302 1.1 christos if (strcmp (name, reg.name) == 0)
303 1.1 christos return true;
304 1.1 christos return false;
305 1.1 christos }
306 1.1 christos
307 1.1 christos /* Copy registers from regcache to user_regs_arcv2. */
308 1.1 christos
309 1.1 christos static void
310 1.1 christos arc_fill_v2_regset (struct regcache *regcache, void *buf)
311 1.1 christos {
312 1.1 christos struct user_regs_arcv2 *regbuf = (struct user_regs_arcv2 *) buf;
313 1.1 christos
314 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r30"))
315 1.1 christos collect_register_by_name (regcache, "r30", &(regbuf->r30));
316 1.1 christos
317 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r58"))
318 1.1 christos collect_register_by_name (regcache, "r58", &(regbuf->r58));
319 1.1 christos
320 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r59"))
321 1.1 christos collect_register_by_name (regcache, "r59", &(regbuf->r59));
322 1.1 christos }
323 1.1 christos
324 1.1 christos /* Copy registers from user_regs_arcv2 to regcache. */
325 1.1 christos
326 1.1 christos static void
327 1.1 christos arc_store_v2_regset (struct regcache *regcache, const void *buf)
328 1.1 christos {
329 1.1 christos struct user_regs_arcv2 *regbuf = (struct user_regs_arcv2 *) buf;
330 1.1 christos
331 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r30"))
332 1.1 christos supply_register_by_name (regcache, "r30", &(regbuf->r30));
333 1.1 christos
334 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r58"))
335 1.1 christos supply_register_by_name (regcache, "r58", &(regbuf->r58));
336 1.1 christos
337 1.1 christos if (is_reg_name_available_p (regcache->tdesc, "r59"))
338 1.1 christos supply_register_by_name (regcache, "r59", &(regbuf->r59));
339 1.1 christos }
340 1.1 christos
341 1.1 christos #endif
342 1.1 christos
343 1.1 christos /* Fetch the thread-local storage pointer for libthread_db. Note that
344 1.1 christos this function is not called from GDB, but is called from libthread_db.
345 1.1 christos
346 1.1 christos This is the same function as for other architectures, for example in
347 1.1 christos linux-arm-low.c. */
348 1.1 christos
349 1.1 christos ps_err_e
350 1.1 christos ps_get_thread_area (struct ps_prochandle *ph, lwpid_t lwpid,
351 1.1 christos int idx, void **base)
352 1.1 christos {
353 1.1 christos if (ptrace (PTRACE_GET_THREAD_AREA, lwpid, nullptr, base) != 0)
354 1.1 christos return PS_ERR;
355 1.1 christos
356 1.1 christos /* IDX is the bias from the thread pointer to the beginning of the
357 1.1 christos thread descriptor. It has to be subtracted due to implementation
358 1.1 christos quirks in libthread_db. */
359 1.1 christos *base = (void *) ((char *) *base - idx);
360 1.1 christos
361 1.1 christos return PS_OK;
362 1.1 christos }
363 1.1 christos
364 1.1 christos static struct regset_info arc_regsets[] =
365 1.1 christos {
366 1.1 christos { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
367 1.1 christos sizeof (struct user_regs_struct), GENERAL_REGS,
368 1.1 christos arc_fill_gregset, arc_store_gregset
369 1.1 christos },
370 1.1 christos #ifdef ARC_HAS_V2_REGSET
371 1.1 christos { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARC_V2,
372 1.1 christos sizeof (struct user_regs_arcv2), GENERAL_REGS,
373 1.1 christos arc_fill_v2_regset, arc_store_v2_regset
374 1.1 christos },
375 1.1 christos #endif
376 1.1 christos NULL_REGSET
377 1.1 christos };
378 1.1 christos
379 1.1 christos static struct regsets_info arc_regsets_info =
380 1.1 christos {
381 1.1 christos arc_regsets, /* regsets */
382 1.1 christos 0, /* num_regsets */
383 1.1 christos nullptr, /* disabled regsets */
384 1.1 christos };
385 1.1 christos
386 1.1 christos static struct regs_info arc_regs_info =
387 1.1 christos {
388 1.1 christos nullptr, /* regset_bitmap */
389 1.1 christos nullptr, /* usrregs */
390 1.1 christos &arc_regsets_info
391 1.1 christos };
392 1.1 christos
393 1.1 christos const regs_info *
394 1.1 christos arc_target::get_regs_info ()
395 1.1 christos {
396 1.1 christos return &arc_regs_info;
397 1.1 christos }
398 1.1 christos
399 1.1 christos /* One of the methods necessary for Z0 packet support. */
400 1.1 christos
401 1.1 christos const gdb_byte *
402 1.1 christos arc_target::sw_breakpoint_from_kind (int kind, int *size)
403 1.1 christos {
404 1.1 christos gdb_assert (kind == TRAP_S_1_SIZE);
405 1.1 christos *size = kind;
406 1.1 christos return arc_linux_trap_s;
407 1.1 christos }
408 1.1 christos
409 1.1 christos /* The linux target ops object. */
410 1.1 christos
411 1.1 christos linux_process_target *the_linux_target = &the_arc_target;
412 1.1 christos
413 1.1 christos void
414 1.1 christos initialize_low_arch (void)
415 1.1 christos {
416 1.1 christos initialize_regsets_info (&arc_regsets_info);
417 1.1 christos }
418