gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / mips-linux-tdep.c
1 /* Target-dependent code for GNU/Linux on MIPS processors.
2
3 Copyright (C) 2001-2020 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "gdbcore.h"
22 #include "target.h"
23 #include "solib-svr4.h"
24 #include "osabi.h"
25 #include "mips-tdep.h"
26 #include "frame.h"
27 #include "regcache.h"
28 #include "trad-frame.h"
29 #include "tramp-frame.h"
30 #include "gdbtypes.h"
31 #include "objfiles.h"
32 #include "solib.h"
33 #include "solist.h"
34 #include "symtab.h"
35 #include "target-descriptions.h"
36 #include "regset.h"
37 #include "mips-linux-tdep.h"
38 #include "glibc-tdep.h"
39 #include "linux-tdep.h"
40 #include "xml-syscall.h"
41 #include "gdbsupport/gdb_signals.h"
42
43 #include "features/mips-linux.c"
44 #include "features/mips-dsp-linux.c"
45 #include "features/mips64-linux.c"
46 #include "features/mips64-dsp-linux.c"
47
48 static struct target_so_ops mips_svr4_so_ops;
49
50 /* This enum represents the signals' numbers on the MIPS
51 architecture. It just contains the signal definitions which are
52 different from the generic implementation.
53
54 It is derived from the file <arch/mips/include/uapi/asm/signal.h>,
55 from the Linux kernel tree. */
56
57 enum
58 {
59 MIPS_LINUX_SIGEMT = 7,
60 MIPS_LINUX_SIGBUS = 10,
61 MIPS_LINUX_SIGSYS = 12,
62 MIPS_LINUX_SIGUSR1 = 16,
63 MIPS_LINUX_SIGUSR2 = 17,
64 MIPS_LINUX_SIGCHLD = 18,
65 MIPS_LINUX_SIGCLD = MIPS_LINUX_SIGCHLD,
66 MIPS_LINUX_SIGPWR = 19,
67 MIPS_LINUX_SIGWINCH = 20,
68 MIPS_LINUX_SIGURG = 21,
69 MIPS_LINUX_SIGIO = 22,
70 MIPS_LINUX_SIGPOLL = MIPS_LINUX_SIGIO,
71 MIPS_LINUX_SIGSTOP = 23,
72 MIPS_LINUX_SIGTSTP = 24,
73 MIPS_LINUX_SIGCONT = 25,
74 MIPS_LINUX_SIGTTIN = 26,
75 MIPS_LINUX_SIGTTOU = 27,
76 MIPS_LINUX_SIGVTALRM = 28,
77 MIPS_LINUX_SIGPROF = 29,
78 MIPS_LINUX_SIGXCPU = 30,
79 MIPS_LINUX_SIGXFSZ = 31,
80
81 MIPS_LINUX_SIGRTMIN = 32,
82 MIPS_LINUX_SIGRT64 = 64,
83 MIPS_LINUX_SIGRTMAX = 127,
84 };
85
86 /* Figure out where the longjmp will land.
87 We expect the first arg to be a pointer to the jmp_buf structure
88 from which we extract the pc (MIPS_LINUX_JB_PC) that we will land
89 at. The pc is copied into PC. This routine returns 1 on
90 success. */
91
92 #define MIPS_LINUX_JB_ELEMENT_SIZE 4
93 #define MIPS_LINUX_JB_PC 0
94
95 static int
96 mips_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
97 {
98 CORE_ADDR jb_addr;
99 struct gdbarch *gdbarch = get_frame_arch (frame);
100 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
101 gdb_byte buf[gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT];
102
103 jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
104
105 if (target_read_memory ((jb_addr
106 + MIPS_LINUX_JB_PC * MIPS_LINUX_JB_ELEMENT_SIZE),
107 buf, gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT))
108 return 0;
109
110 *pc = extract_unsigned_integer (buf,
111 gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT,
112 byte_order);
113
114 return 1;
115 }
116
117 /* Transform the bits comprising a 32-bit register to the right size
118 for regcache_raw_supply(). This is needed when mips_isa_regsize()
119 is 8. */
120
121 static void
122 supply_32bit_reg (struct regcache *regcache, int regnum, const void *addr)
123 {
124 regcache->raw_supply_integer (regnum, (const gdb_byte *) addr, 4, true);
125 }
126
127 /* Unpack an elf_gregset_t into GDB's register cache. */
128
129 void
130 mips_supply_gregset (struct regcache *regcache,
131 const mips_elf_gregset_t *gregsetp)
132 {
133 int regi;
134 const mips_elf_greg_t *regp = *gregsetp;
135 struct gdbarch *gdbarch = regcache->arch ();
136
137 for (regi = EF_REG0 + 1; regi <= EF_REG31; regi++)
138 supply_32bit_reg (regcache, regi - EF_REG0, regp + regi);
139
140 if (mips_linux_restart_reg_p (gdbarch))
141 supply_32bit_reg (regcache, MIPS_RESTART_REGNUM, regp + EF_REG0);
142
143 supply_32bit_reg (regcache, mips_regnum (gdbarch)->lo, regp + EF_LO);
144 supply_32bit_reg (regcache, mips_regnum (gdbarch)->hi, regp + EF_HI);
145
146 supply_32bit_reg (regcache, mips_regnum (gdbarch)->pc,
147 regp + EF_CP0_EPC);
148 supply_32bit_reg (regcache, mips_regnum (gdbarch)->badvaddr,
149 regp + EF_CP0_BADVADDR);
150 supply_32bit_reg (regcache, MIPS_PS_REGNUM, regp + EF_CP0_STATUS);
151 supply_32bit_reg (regcache, mips_regnum (gdbarch)->cause,
152 regp + EF_CP0_CAUSE);
153
154 /* Fill the inaccessible zero register with zero. */
155 regcache->raw_supply_zeroed (MIPS_ZERO_REGNUM);
156 }
157
158 static void
159 mips_supply_gregset_wrapper (const struct regset *regset,
160 struct regcache *regcache,
161 int regnum, const void *gregs, size_t len)
162 {
163 gdb_assert (len >= sizeof (mips_elf_gregset_t));
164
165 mips_supply_gregset (regcache, (const mips_elf_gregset_t *)gregs);
166 }
167
168 /* Pack our registers (or one register) into an elf_gregset_t. */
169
170 void
171 mips_fill_gregset (const struct regcache *regcache,
172 mips_elf_gregset_t *gregsetp, int regno)
173 {
174 struct gdbarch *gdbarch = regcache->arch ();
175 int regaddr, regi;
176 mips_elf_greg_t *regp = *gregsetp;
177 void *dst;
178
179 if (regno == -1)
180 {
181 memset (regp, 0, sizeof (mips_elf_gregset_t));
182 for (regi = 1; regi < 32; regi++)
183 mips_fill_gregset (regcache, gregsetp, regi);
184 mips_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->lo);
185 mips_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->hi);
186 mips_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->pc);
187 mips_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->badvaddr);
188 mips_fill_gregset (regcache, gregsetp, MIPS_PS_REGNUM);
189 mips_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->cause);
190 mips_fill_gregset (regcache, gregsetp, MIPS_RESTART_REGNUM);
191 return;
192 }
193
194 if (regno > 0 && regno < 32)
195 {
196 dst = regp + regno + EF_REG0;
197 regcache->raw_collect (regno, dst);
198 return;
199 }
200
201 if (regno == mips_regnum (gdbarch)->lo)
202 regaddr = EF_LO;
203 else if (regno == mips_regnum (gdbarch)->hi)
204 regaddr = EF_HI;
205 else if (regno == mips_regnum (gdbarch)->pc)
206 regaddr = EF_CP0_EPC;
207 else if (regno == mips_regnum (gdbarch)->badvaddr)
208 regaddr = EF_CP0_BADVADDR;
209 else if (regno == MIPS_PS_REGNUM)
210 regaddr = EF_CP0_STATUS;
211 else if (regno == mips_regnum (gdbarch)->cause)
212 regaddr = EF_CP0_CAUSE;
213 else if (mips_linux_restart_reg_p (gdbarch)
214 && regno == MIPS_RESTART_REGNUM)
215 regaddr = EF_REG0;
216 else
217 regaddr = -1;
218
219 if (regaddr != -1)
220 {
221 dst = regp + regaddr;
222 regcache->raw_collect (regno, dst);
223 }
224 }
225
226 static void
227 mips_fill_gregset_wrapper (const struct regset *regset,
228 const struct regcache *regcache,
229 int regnum, void *gregs, size_t len)
230 {
231 gdb_assert (len >= sizeof (mips_elf_gregset_t));
232
233 mips_fill_gregset (regcache, (mips_elf_gregset_t *)gregs, regnum);
234 }
235
236 /* Support for 64-bit ABIs. */
237
238 /* Figure out where the longjmp will land.
239 We expect the first arg to be a pointer to the jmp_buf structure
240 from which we extract the pc (MIPS_LINUX_JB_PC) that we will land
241 at. The pc is copied into PC. This routine returns 1 on
242 success. */
243
244 /* Details about jmp_buf. */
245
246 #define MIPS64_LINUX_JB_PC 0
247
248 static int
249 mips64_linux_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
250 {
251 CORE_ADDR jb_addr;
252 struct gdbarch *gdbarch = get_frame_arch (frame);
253 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
254 gdb_byte *buf
255 = (gdb_byte *) alloca (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
256 int element_size = gdbarch_ptr_bit (gdbarch) == 32 ? 4 : 8;
257
258 jb_addr = get_frame_register_unsigned (frame, MIPS_A0_REGNUM);
259
260 if (target_read_memory (jb_addr + MIPS64_LINUX_JB_PC * element_size,
261 buf,
262 gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT))
263 return 0;
264
265 *pc = extract_unsigned_integer (buf,
266 gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT,
267 byte_order);
268
269 return 1;
270 }
271
272 /* Register set support functions. These operate on standard 64-bit
273 regsets, but work whether the target is 32-bit or 64-bit. A 32-bit
274 target will still use the 64-bit format for PTRACE_GETREGS. */
275
276 /* Supply a 64-bit register. */
277
278 static void
279 supply_64bit_reg (struct regcache *regcache, int regnum,
280 const gdb_byte *buf)
281 {
282 struct gdbarch *gdbarch = regcache->arch ();
283 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG
284 && register_size (gdbarch, regnum) == 4)
285 regcache->raw_supply (regnum, buf + 4);
286 else
287 regcache->raw_supply (regnum, buf);
288 }
289
290 /* Unpack a 64-bit elf_gregset_t into GDB's register cache. */
291
292 void
293 mips64_supply_gregset (struct regcache *regcache,
294 const mips64_elf_gregset_t *gregsetp)
295 {
296 int regi;
297 const mips64_elf_greg_t *regp = *gregsetp;
298 struct gdbarch *gdbarch = regcache->arch ();
299
300 for (regi = MIPS64_EF_REG0 + 1; regi <= MIPS64_EF_REG31; regi++)
301 supply_64bit_reg (regcache, regi - MIPS64_EF_REG0,
302 (const gdb_byte *) (regp + regi));
303
304 if (mips_linux_restart_reg_p (gdbarch))
305 supply_64bit_reg (regcache, MIPS_RESTART_REGNUM,
306 (const gdb_byte *) (regp + MIPS64_EF_REG0));
307
308 supply_64bit_reg (regcache, mips_regnum (gdbarch)->lo,
309 (const gdb_byte *) (regp + MIPS64_EF_LO));
310 supply_64bit_reg (regcache, mips_regnum (gdbarch)->hi,
311 (const gdb_byte *) (regp + MIPS64_EF_HI));
312
313 supply_64bit_reg (regcache, mips_regnum (gdbarch)->pc,
314 (const gdb_byte *) (regp + MIPS64_EF_CP0_EPC));
315 supply_64bit_reg (regcache, mips_regnum (gdbarch)->badvaddr,
316 (const gdb_byte *) (regp + MIPS64_EF_CP0_BADVADDR));
317 supply_64bit_reg (regcache, MIPS_PS_REGNUM,
318 (const gdb_byte *) (regp + MIPS64_EF_CP0_STATUS));
319 supply_64bit_reg (regcache, mips_regnum (gdbarch)->cause,
320 (const gdb_byte *) (regp + MIPS64_EF_CP0_CAUSE));
321
322 /* Fill the inaccessible zero register with zero. */
323 regcache->raw_supply_zeroed (MIPS_ZERO_REGNUM);
324 }
325
326 static void
327 mips64_supply_gregset_wrapper (const struct regset *regset,
328 struct regcache *regcache,
329 int regnum, const void *gregs, size_t len)
330 {
331 gdb_assert (len >= sizeof (mips64_elf_gregset_t));
332
333 mips64_supply_gregset (regcache, (const mips64_elf_gregset_t *)gregs);
334 }
335
336 /* Pack our registers (or one register) into a 64-bit elf_gregset_t. */
337
338 void
339 mips64_fill_gregset (const struct regcache *regcache,
340 mips64_elf_gregset_t *gregsetp, int regno)
341 {
342 struct gdbarch *gdbarch = regcache->arch ();
343 int regaddr, regi;
344 mips64_elf_greg_t *regp = *gregsetp;
345 void *dst;
346
347 if (regno == -1)
348 {
349 memset (regp, 0, sizeof (mips64_elf_gregset_t));
350 for (regi = 1; regi < 32; regi++)
351 mips64_fill_gregset (regcache, gregsetp, regi);
352 mips64_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->lo);
353 mips64_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->hi);
354 mips64_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->pc);
355 mips64_fill_gregset (regcache, gregsetp,
356 mips_regnum (gdbarch)->badvaddr);
357 mips64_fill_gregset (regcache, gregsetp, MIPS_PS_REGNUM);
358 mips64_fill_gregset (regcache, gregsetp, mips_regnum (gdbarch)->cause);
359 mips64_fill_gregset (regcache, gregsetp, MIPS_RESTART_REGNUM);
360 return;
361 }
362
363 if (regno > 0 && regno < 32)
364 regaddr = regno + MIPS64_EF_REG0;
365 else if (regno == mips_regnum (gdbarch)->lo)
366 regaddr = MIPS64_EF_LO;
367 else if (regno == mips_regnum (gdbarch)->hi)
368 regaddr = MIPS64_EF_HI;
369 else if (regno == mips_regnum (gdbarch)->pc)
370 regaddr = MIPS64_EF_CP0_EPC;
371 else if (regno == mips_regnum (gdbarch)->badvaddr)
372 regaddr = MIPS64_EF_CP0_BADVADDR;
373 else if (regno == MIPS_PS_REGNUM)
374 regaddr = MIPS64_EF_CP0_STATUS;
375 else if (regno == mips_regnum (gdbarch)->cause)
376 regaddr = MIPS64_EF_CP0_CAUSE;
377 else if (mips_linux_restart_reg_p (gdbarch)
378 && regno == MIPS_RESTART_REGNUM)
379 regaddr = MIPS64_EF_REG0;
380 else
381 regaddr = -1;
382
383 if (regaddr != -1)
384 {
385 dst = regp + regaddr;
386 regcache->raw_collect_integer (regno, (gdb_byte *) dst, 8, true);
387 }
388 }
389
390 static void
391 mips64_fill_gregset_wrapper (const struct regset *regset,
392 const struct regcache *regcache,
393 int regnum, void *gregs, size_t len)
394 {
395 gdb_assert (len >= sizeof (mips64_elf_gregset_t));
396
397 mips64_fill_gregset (regcache, (mips64_elf_gregset_t *)gregs, regnum);
398 }
399
400 /* Likewise, unpack an elf_fpregset_t. Linux only uses even-numbered
401 FPR slots in the Status.FR=0 mode, storing even-odd FPR pairs as the
402 SDC1 instruction would. When run on MIPS I architecture processors
403 all FPR slots used to be used, unusually, holding the respective FPRs
404 in the first 4 bytes, but that was corrected for consistency, with
405 `linux-mips.org' (LMO) commit 42533948caac ("Major pile of FP emulator
406 changes."), the fix corrected with LMO commit 849fa7a50dff ("R3k FPU
407 ptrace() handling fixes."), and then broken and fixed over and over
408 again, until last time fixed with commit 80cbfad79096 ("MIPS: Correct
409 MIPS I FP context layout"). */
410
411 void
412 mips64_supply_fpregset (struct regcache *regcache,
413 const mips64_elf_fpregset_t *fpregsetp)
414 {
415 struct gdbarch *gdbarch = regcache->arch ();
416 int regi;
417
418 if (register_size (gdbarch, gdbarch_fp0_regnum (gdbarch)) == 4)
419 for (regi = 0; regi < 32; regi++)
420 {
421 const gdb_byte *reg_ptr
422 = (const gdb_byte *) (*fpregsetp + (regi & ~1));
423 if ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) != (regi & 1))
424 reg_ptr += 4;
425 regcache->raw_supply (gdbarch_fp0_regnum (gdbarch) + regi, reg_ptr);
426 }
427 else
428 for (regi = 0; regi < 32; regi++)
429 regcache->raw_supply (gdbarch_fp0_regnum (gdbarch) + regi,
430 (const char *) (*fpregsetp + regi));
431
432 supply_32bit_reg (regcache, mips_regnum (gdbarch)->fp_control_status,
433 (const gdb_byte *) (*fpregsetp + 32));
434
435 /* The ABI doesn't tell us how to supply FCRIR, and core dumps don't
436 include it - but the result of PTRACE_GETFPREGS does. The best we
437 can do is to assume that its value is present. */
438 supply_32bit_reg (regcache,
439 mips_regnum (gdbarch)->fp_implementation_revision,
440 (const gdb_byte *) (*fpregsetp + 32) + 4);
441 }
442
443 static void
444 mips64_supply_fpregset_wrapper (const struct regset *regset,
445 struct regcache *regcache,
446 int regnum, const void *gregs, size_t len)
447 {
448 gdb_assert (len >= sizeof (mips64_elf_fpregset_t));
449
450 mips64_supply_fpregset (regcache, (const mips64_elf_fpregset_t *)gregs);
451 }
452
453 /* Likewise, pack one or all floating point registers into an
454 elf_fpregset_t. See `mips_supply_fpregset' for an explanation
455 of the layout. */
456
457 void
458 mips64_fill_fpregset (const struct regcache *regcache,
459 mips64_elf_fpregset_t *fpregsetp, int regno)
460 {
461 struct gdbarch *gdbarch = regcache->arch ();
462 gdb_byte *to;
463
464 if ((regno >= gdbarch_fp0_regnum (gdbarch))
465 && (regno < gdbarch_fp0_regnum (gdbarch) + 32))
466 {
467 if (register_size (gdbarch, regno) == 4)
468 {
469 int regi = regno - gdbarch_fp0_regnum (gdbarch);
470
471 to = (gdb_byte *) (*fpregsetp + (regi & ~1));
472 if ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) != (regi & 1))
473 to += 4;
474 regcache->raw_collect (regno, to);
475 }
476 else
477 {
478 to = (gdb_byte *) (*fpregsetp + regno
479 - gdbarch_fp0_regnum (gdbarch));
480 regcache->raw_collect (regno, to);
481 }
482 }
483 else if (regno == mips_regnum (gdbarch)->fp_control_status)
484 {
485 to = (gdb_byte *) (*fpregsetp + 32);
486 regcache->raw_collect_integer (regno, to, 4, true);
487 }
488 else if (regno == mips_regnum (gdbarch)->fp_implementation_revision)
489 {
490 to = (gdb_byte *) (*fpregsetp + 32) + 4;
491 regcache->raw_collect_integer (regno, to, 4, true);
492 }
493 else if (regno == -1)
494 {
495 int regi;
496
497 for (regi = 0; regi < 32; regi++)
498 mips64_fill_fpregset (regcache, fpregsetp,
499 gdbarch_fp0_regnum (gdbarch) + regi);
500 mips64_fill_fpregset (regcache, fpregsetp,
501 mips_regnum (gdbarch)->fp_control_status);
502 mips64_fill_fpregset (regcache, fpregsetp,
503 mips_regnum (gdbarch)->fp_implementation_revision);
504 }
505 }
506
507 static void
508 mips64_fill_fpregset_wrapper (const struct regset *regset,
509 const struct regcache *regcache,
510 int regnum, void *gregs, size_t len)
511 {
512 gdb_assert (len >= sizeof (mips64_elf_fpregset_t));
513
514 mips64_fill_fpregset (regcache, (mips64_elf_fpregset_t *)gregs, regnum);
515 }
516
517 static const struct regset mips_linux_gregset =
518 {
519 NULL, mips_supply_gregset_wrapper, mips_fill_gregset_wrapper
520 };
521
522 static const struct regset mips64_linux_gregset =
523 {
524 NULL, mips64_supply_gregset_wrapper, mips64_fill_gregset_wrapper
525 };
526
527 static const struct regset mips64_linux_fpregset =
528 {
529 NULL, mips64_supply_fpregset_wrapper, mips64_fill_fpregset_wrapper
530 };
531
532 static void
533 mips_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
534 iterate_over_regset_sections_cb *cb,
535 void *cb_data,
536 const struct regcache *regcache)
537 {
538 if (register_size (gdbarch, MIPS_ZERO_REGNUM) == 4)
539 {
540 cb (".reg", sizeof (mips_elf_gregset_t), sizeof (mips_elf_gregset_t),
541 &mips_linux_gregset, NULL, cb_data);
542 cb (".reg2", sizeof (mips64_elf_fpregset_t),
543 sizeof (mips64_elf_fpregset_t), &mips64_linux_fpregset,
544 NULL, cb_data);
545 }
546 else
547 {
548 cb (".reg", sizeof (mips64_elf_gregset_t), sizeof (mips64_elf_gregset_t),
549 &mips64_linux_gregset, NULL, cb_data);
550 cb (".reg2", sizeof (mips64_elf_fpregset_t),
551 sizeof (mips64_elf_fpregset_t), &mips64_linux_fpregset,
552 NULL, cb_data);
553 }
554 }
555
556 static const struct target_desc *
557 mips_linux_core_read_description (struct gdbarch *gdbarch,
558 struct target_ops *target,
559 bfd *abfd)
560 {
561 asection *section = bfd_get_section_by_name (abfd, ".reg");
562 if (! section)
563 return NULL;
564
565 switch (bfd_section_size (section))
566 {
567 case sizeof (mips_elf_gregset_t):
568 return mips_tdesc_gp32;
569
570 case sizeof (mips64_elf_gregset_t):
571 return mips_tdesc_gp64;
572
573 default:
574 return NULL;
575 }
576 }
577
578
579 /* Check the code at PC for a dynamic linker lazy resolution stub.
580 GNU ld for MIPS has put lazy resolution stubs into a ".MIPS.stubs"
581 section uniformly since version 2.15. If the pc is in that section,
582 then we are in such a stub. Before that ".stub" was used in 32-bit
583 ELF binaries, however we do not bother checking for that since we
584 have never had and that case should be extremely rare these days.
585 Instead we pattern-match on the code generated by GNU ld. They look
586 like this:
587
588 lw t9,0x8010(gp)
589 addu t7,ra
590 jalr t9,ra
591 addiu t8,zero,INDEX
592
593 (with the appropriate doubleword instructions for N64). As any lazy
594 resolution stubs in microMIPS binaries will always be in a
595 ".MIPS.stubs" section we only ever verify standard MIPS patterns. */
596
597 static int
598 mips_linux_in_dynsym_stub (CORE_ADDR pc)
599 {
600 gdb_byte buf[28], *p;
601 ULONGEST insn, insn1;
602 int n64 = (mips_abi (target_gdbarch ()) == MIPS_ABI_N64);
603 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
604
605 if (in_mips_stubs_section (pc))
606 return 1;
607
608 read_memory (pc - 12, buf, 28);
609
610 if (n64)
611 {
612 /* ld t9,0x8010(gp) */
613 insn1 = 0xdf998010;
614 }
615 else
616 {
617 /* lw t9,0x8010(gp) */
618 insn1 = 0x8f998010;
619 }
620
621 p = buf + 12;
622 while (p >= buf)
623 {
624 insn = extract_unsigned_integer (p, 4, byte_order);
625 if (insn == insn1)
626 break;
627 p -= 4;
628 }
629 if (p < buf)
630 return 0;
631
632 insn = extract_unsigned_integer (p + 4, 4, byte_order);
633 if (n64)
634 {
635 /* 'daddu t7,ra' or 'or t7, ra, zero'*/
636 if (insn != 0x03e0782d && insn != 0x03e07825)
637 return 0;
638 }
639 else
640 {
641 /* 'addu t7,ra' or 'or t7, ra, zero'*/
642 if (insn != 0x03e07821 && insn != 0x03e07825)
643 return 0;
644 }
645
646 insn = extract_unsigned_integer (p + 8, 4, byte_order);
647 /* jalr t9,ra */
648 if (insn != 0x0320f809)
649 return 0;
650
651 insn = extract_unsigned_integer (p + 12, 4, byte_order);
652 if (n64)
653 {
654 /* daddiu t8,zero,0 */
655 if ((insn & 0xffff0000) != 0x64180000)
656 return 0;
657 }
658 else
659 {
660 /* addiu t8,zero,0 */
661 if ((insn & 0xffff0000) != 0x24180000)
662 return 0;
663 }
664
665 return 1;
666 }
667
668 /* Return non-zero iff PC belongs to the dynamic linker resolution
669 code, a PLT entry, or a lazy binding stub. */
670
671 static int
672 mips_linux_in_dynsym_resolve_code (CORE_ADDR pc)
673 {
674 /* Check whether PC is in the dynamic linker. This also checks
675 whether it is in the .plt section, used by non-PIC executables. */
676 if (svr4_in_dynsym_resolve_code (pc))
677 return 1;
678
679 /* Likewise for the stubs. They live in the .MIPS.stubs section these
680 days, so we check if the PC is within, than fall back to a pattern
681 match. */
682 if (mips_linux_in_dynsym_stub (pc))
683 return 1;
684
685 return 0;
686 }
687
688 /* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c,
689 and glibc_skip_solib_resolver in glibc-tdep.c. The normal glibc
690 implementation of this triggers at "fixup" from the same objfile as
691 "_dl_runtime_resolve"; MIPS GNU/Linux can trigger at
692 "__dl_runtime_resolve" directly. An unresolved lazy binding
693 stub will point to _dl_runtime_resolve, which will first call
694 __dl_runtime_resolve, and then pass control to the resolved
695 function. */
696
697 static CORE_ADDR
698 mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
699 {
700 struct bound_minimal_symbol resolver;
701
702 resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
703
704 if (resolver.minsym && BMSYMBOL_VALUE_ADDRESS (resolver) == pc)
705 return frame_unwind_caller_pc (get_current_frame ());
706
707 return glibc_skip_solib_resolver (gdbarch, pc);
708 }
709
710 /* Signal trampoline support. There are four supported layouts for a
711 signal frame: o32 sigframe, o32 rt_sigframe, n32 rt_sigframe, and
712 n64 rt_sigframe. We handle them all independently; not the most
713 efficient way, but simplest. First, declare all the unwinders. */
714
715 static void mips_linux_o32_sigframe_init (const struct tramp_frame *self,
716 struct frame_info *this_frame,
717 struct trad_frame_cache *this_cache,
718 CORE_ADDR func);
719
720 static void mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
721 struct frame_info *this_frame,
722 struct trad_frame_cache *this_cache,
723 CORE_ADDR func);
724
725 static int mips_linux_sigframe_validate (const struct tramp_frame *self,
726 struct frame_info *this_frame,
727 CORE_ADDR *pc);
728
729 static int micromips_linux_sigframe_validate (const struct tramp_frame *self,
730 struct frame_info *this_frame,
731 CORE_ADDR *pc);
732
733 #define MIPS_NR_LINUX 4000
734 #define MIPS_NR_N64_LINUX 5000
735 #define MIPS_NR_N32_LINUX 6000
736
737 #define MIPS_NR_sigreturn MIPS_NR_LINUX + 119
738 #define MIPS_NR_rt_sigreturn MIPS_NR_LINUX + 193
739 #define MIPS_NR_N64_rt_sigreturn MIPS_NR_N64_LINUX + 211
740 #define MIPS_NR_N32_rt_sigreturn MIPS_NR_N32_LINUX + 211
741
742 #define MIPS_INST_LI_V0_SIGRETURN 0x24020000 + MIPS_NR_sigreturn
743 #define MIPS_INST_LI_V0_RT_SIGRETURN 0x24020000 + MIPS_NR_rt_sigreturn
744 #define MIPS_INST_LI_V0_N64_RT_SIGRETURN 0x24020000 + MIPS_NR_N64_rt_sigreturn
745 #define MIPS_INST_LI_V0_N32_RT_SIGRETURN 0x24020000 + MIPS_NR_N32_rt_sigreturn
746 #define MIPS_INST_SYSCALL 0x0000000c
747
748 #define MICROMIPS_INST_LI_V0 0x3040
749 #define MICROMIPS_INST_POOL32A 0x0000
750 #define MICROMIPS_INST_SYSCALL 0x8b7c
751
752 static const struct tramp_frame mips_linux_o32_sigframe = {
753 SIGTRAMP_FRAME,
754 4,
755 {
756 { MIPS_INST_LI_V0_SIGRETURN, ULONGEST_MAX },
757 { MIPS_INST_SYSCALL, ULONGEST_MAX },
758 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
759 },
760 mips_linux_o32_sigframe_init,
761 mips_linux_sigframe_validate
762 };
763
764 static const struct tramp_frame mips_linux_o32_rt_sigframe = {
765 SIGTRAMP_FRAME,
766 4,
767 {
768 { MIPS_INST_LI_V0_RT_SIGRETURN, ULONGEST_MAX },
769 { MIPS_INST_SYSCALL, ULONGEST_MAX },
770 { TRAMP_SENTINEL_INSN, ULONGEST_MAX } },
771 mips_linux_o32_sigframe_init,
772 mips_linux_sigframe_validate
773 };
774
775 static const struct tramp_frame mips_linux_n32_rt_sigframe = {
776 SIGTRAMP_FRAME,
777 4,
778 {
779 { MIPS_INST_LI_V0_N32_RT_SIGRETURN, ULONGEST_MAX },
780 { MIPS_INST_SYSCALL, ULONGEST_MAX },
781 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
782 },
783 mips_linux_n32n64_sigframe_init,
784 mips_linux_sigframe_validate
785 };
786
787 static const struct tramp_frame mips_linux_n64_rt_sigframe = {
788 SIGTRAMP_FRAME,
789 4,
790 {
791 { MIPS_INST_LI_V0_N64_RT_SIGRETURN, ULONGEST_MAX },
792 { MIPS_INST_SYSCALL, ULONGEST_MAX },
793 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
794 },
795 mips_linux_n32n64_sigframe_init,
796 mips_linux_sigframe_validate
797 };
798
799 static const struct tramp_frame micromips_linux_o32_sigframe = {
800 SIGTRAMP_FRAME,
801 2,
802 {
803 { MICROMIPS_INST_LI_V0, ULONGEST_MAX },
804 { MIPS_NR_sigreturn, ULONGEST_MAX },
805 { MICROMIPS_INST_POOL32A, ULONGEST_MAX },
806 { MICROMIPS_INST_SYSCALL, ULONGEST_MAX },
807 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
808 },
809 mips_linux_o32_sigframe_init,
810 micromips_linux_sigframe_validate
811 };
812
813 static const struct tramp_frame micromips_linux_o32_rt_sigframe = {
814 SIGTRAMP_FRAME,
815 2,
816 {
817 { MICROMIPS_INST_LI_V0, ULONGEST_MAX },
818 { MIPS_NR_rt_sigreturn, ULONGEST_MAX },
819 { MICROMIPS_INST_POOL32A, ULONGEST_MAX },
820 { MICROMIPS_INST_SYSCALL, ULONGEST_MAX },
821 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
822 },
823 mips_linux_o32_sigframe_init,
824 micromips_linux_sigframe_validate
825 };
826
827 static const struct tramp_frame micromips_linux_n32_rt_sigframe = {
828 SIGTRAMP_FRAME,
829 2,
830 {
831 { MICROMIPS_INST_LI_V0, ULONGEST_MAX },
832 { MIPS_NR_N32_rt_sigreturn, ULONGEST_MAX },
833 { MICROMIPS_INST_POOL32A, ULONGEST_MAX },
834 { MICROMIPS_INST_SYSCALL, ULONGEST_MAX },
835 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
836 },
837 mips_linux_n32n64_sigframe_init,
838 micromips_linux_sigframe_validate
839 };
840
841 static const struct tramp_frame micromips_linux_n64_rt_sigframe = {
842 SIGTRAMP_FRAME,
843 2,
844 {
845 { MICROMIPS_INST_LI_V0, ULONGEST_MAX },
846 { MIPS_NR_N64_rt_sigreturn, ULONGEST_MAX },
847 { MICROMIPS_INST_POOL32A, ULONGEST_MAX },
848 { MICROMIPS_INST_SYSCALL, ULONGEST_MAX },
849 { TRAMP_SENTINEL_INSN, ULONGEST_MAX }
850 },
851 mips_linux_n32n64_sigframe_init,
852 micromips_linux_sigframe_validate
853 };
854
855 /* *INDENT-OFF* */
856 /* The unwinder for o32 signal frames. The legacy structures look
857 like this:
858
859 struct sigframe {
860 u32 sf_ass[4]; [argument save space for o32]
861 u32 sf_code[2]; [signal trampoline or fill]
862 struct sigcontext sf_sc;
863 sigset_t sf_mask;
864 };
865
866 Pre-2.6.12 sigcontext:
867
868 struct sigcontext {
869 unsigned int sc_regmask; [Unused]
870 unsigned int sc_status;
871 unsigned long long sc_pc;
872 unsigned long long sc_regs[32];
873 unsigned long long sc_fpregs[32];
874 unsigned int sc_ownedfp;
875 unsigned int sc_fpc_csr;
876 unsigned int sc_fpc_eir; [Unused]
877 unsigned int sc_used_math;
878 unsigned int sc_ssflags; [Unused]
879 [Alignment hole of four bytes]
880 unsigned long long sc_mdhi;
881 unsigned long long sc_mdlo;
882
883 unsigned int sc_cause; [Unused]
884 unsigned int sc_badvaddr; [Unused]
885
886 unsigned long sc_sigset[4]; [kernel's sigset_t]
887 };
888
889 Post-2.6.12 sigcontext (SmartMIPS/DSP support added):
890
891 struct sigcontext {
892 unsigned int sc_regmask; [Unused]
893 unsigned int sc_status; [Unused]
894 unsigned long long sc_pc;
895 unsigned long long sc_regs[32];
896 unsigned long long sc_fpregs[32];
897 unsigned int sc_acx;
898 unsigned int sc_fpc_csr;
899 unsigned int sc_fpc_eir; [Unused]
900 unsigned int sc_used_math;
901 unsigned int sc_dsp;
902 [Alignment hole of four bytes]
903 unsigned long long sc_mdhi;
904 unsigned long long sc_mdlo;
905 unsigned long sc_hi1;
906 unsigned long sc_lo1;
907 unsigned long sc_hi2;
908 unsigned long sc_lo2;
909 unsigned long sc_hi3;
910 unsigned long sc_lo3;
911 };
912
913 The RT signal frames look like this:
914
915 struct rt_sigframe {
916 u32 rs_ass[4]; [argument save space for o32]
917 u32 rs_code[2] [signal trampoline or fill]
918 struct siginfo rs_info;
919 struct ucontext rs_uc;
920 };
921
922 struct ucontext {
923 unsigned long uc_flags;
924 struct ucontext *uc_link;
925 stack_t uc_stack;
926 [Alignment hole of four bytes]
927 struct sigcontext uc_mcontext;
928 sigset_t uc_sigmask;
929 }; */
930 /* *INDENT-ON* */
931
932 #define SIGFRAME_SIGCONTEXT_OFFSET (6 * 4)
933
934 #define RTSIGFRAME_SIGINFO_SIZE 128
935 #define STACK_T_SIZE (3 * 4)
936 #define UCONTEXT_SIGCONTEXT_OFFSET (2 * 4 + STACK_T_SIZE + 4)
937 #define RTSIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
938 + RTSIGFRAME_SIGINFO_SIZE \
939 + UCONTEXT_SIGCONTEXT_OFFSET)
940
941 #define SIGCONTEXT_PC (1 * 8)
942 #define SIGCONTEXT_REGS (2 * 8)
943 #define SIGCONTEXT_FPREGS (34 * 8)
944 #define SIGCONTEXT_FPCSR (66 * 8 + 4)
945 #define SIGCONTEXT_DSPCTL (68 * 8 + 0)
946 #define SIGCONTEXT_HI (69 * 8)
947 #define SIGCONTEXT_LO (70 * 8)
948 #define SIGCONTEXT_CAUSE (71 * 8 + 0)
949 #define SIGCONTEXT_BADVADDR (71 * 8 + 4)
950 #define SIGCONTEXT_HI1 (71 * 8 + 0)
951 #define SIGCONTEXT_LO1 (71 * 8 + 4)
952 #define SIGCONTEXT_HI2 (72 * 8 + 0)
953 #define SIGCONTEXT_LO2 (72 * 8 + 4)
954 #define SIGCONTEXT_HI3 (73 * 8 + 0)
955 #define SIGCONTEXT_LO3 (73 * 8 + 4)
956
957 #define SIGCONTEXT_REG_SIZE 8
958
959 static void
960 mips_linux_o32_sigframe_init (const struct tramp_frame *self,
961 struct frame_info *this_frame,
962 struct trad_frame_cache *this_cache,
963 CORE_ADDR func)
964 {
965 struct gdbarch *gdbarch = get_frame_arch (this_frame);
966 int ireg;
967 CORE_ADDR frame_sp = get_frame_sp (this_frame);
968 CORE_ADDR sigcontext_base;
969 const struct mips_regnum *regs = mips_regnum (gdbarch);
970 CORE_ADDR regs_base;
971
972 if (self == &mips_linux_o32_sigframe
973 || self == &micromips_linux_o32_sigframe)
974 sigcontext_base = frame_sp + SIGFRAME_SIGCONTEXT_OFFSET;
975 else
976 sigcontext_base = frame_sp + RTSIGFRAME_SIGCONTEXT_OFFSET;
977
978 /* I'm not proud of this hack. Eventually we will have the
979 infrastructure to indicate the size of saved registers on a
980 per-frame basis, but right now we don't; the kernel saves eight
981 bytes but we only want four. Use regs_base to access any
982 64-bit fields. */
983 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
984 regs_base = sigcontext_base + 4;
985 else
986 regs_base = sigcontext_base;
987
988 if (mips_linux_restart_reg_p (gdbarch))
989 trad_frame_set_reg_addr (this_cache,
990 (MIPS_RESTART_REGNUM
991 + gdbarch_num_regs (gdbarch)),
992 regs_base + SIGCONTEXT_REGS);
993
994 for (ireg = 1; ireg < 32; ireg++)
995 trad_frame_set_reg_addr (this_cache,
996 (ireg + MIPS_ZERO_REGNUM
997 + gdbarch_num_regs (gdbarch)),
998 (regs_base + SIGCONTEXT_REGS
999 + ireg * SIGCONTEXT_REG_SIZE));
1000
1001 for (ireg = 0; ireg < 32; ireg++)
1002 if ((gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) != (ireg & 1))
1003 trad_frame_set_reg_addr (this_cache,
1004 ireg + regs->fp0 + gdbarch_num_regs (gdbarch),
1005 (sigcontext_base + SIGCONTEXT_FPREGS + 4
1006 + (ireg & ~1) * SIGCONTEXT_REG_SIZE));
1007 else
1008 trad_frame_set_reg_addr (this_cache,
1009 ireg + regs->fp0 + gdbarch_num_regs (gdbarch),
1010 (sigcontext_base + SIGCONTEXT_FPREGS
1011 + (ireg & ~1) * SIGCONTEXT_REG_SIZE));
1012
1013 trad_frame_set_reg_addr (this_cache,
1014 regs->pc + gdbarch_num_regs (gdbarch),
1015 regs_base + SIGCONTEXT_PC);
1016
1017 trad_frame_set_reg_addr (this_cache,
1018 (regs->fp_control_status
1019 + gdbarch_num_regs (gdbarch)),
1020 sigcontext_base + SIGCONTEXT_FPCSR);
1021
1022 if (regs->dspctl != -1)
1023 trad_frame_set_reg_addr (this_cache,
1024 regs->dspctl + gdbarch_num_regs (gdbarch),
1025 sigcontext_base + SIGCONTEXT_DSPCTL);
1026
1027 trad_frame_set_reg_addr (this_cache,
1028 regs->hi + gdbarch_num_regs (gdbarch),
1029 regs_base + SIGCONTEXT_HI);
1030 trad_frame_set_reg_addr (this_cache,
1031 regs->lo + gdbarch_num_regs (gdbarch),
1032 regs_base + SIGCONTEXT_LO);
1033
1034 if (regs->dspacc != -1)
1035 {
1036 trad_frame_set_reg_addr (this_cache,
1037 regs->dspacc + 0 + gdbarch_num_regs (gdbarch),
1038 sigcontext_base + SIGCONTEXT_HI1);
1039 trad_frame_set_reg_addr (this_cache,
1040 regs->dspacc + 1 + gdbarch_num_regs (gdbarch),
1041 sigcontext_base + SIGCONTEXT_LO1);
1042 trad_frame_set_reg_addr (this_cache,
1043 regs->dspacc + 2 + gdbarch_num_regs (gdbarch),
1044 sigcontext_base + SIGCONTEXT_HI2);
1045 trad_frame_set_reg_addr (this_cache,
1046 regs->dspacc + 3 + gdbarch_num_regs (gdbarch),
1047 sigcontext_base + SIGCONTEXT_LO2);
1048 trad_frame_set_reg_addr (this_cache,
1049 regs->dspacc + 4 + gdbarch_num_regs (gdbarch),
1050 sigcontext_base + SIGCONTEXT_HI3);
1051 trad_frame_set_reg_addr (this_cache,
1052 regs->dspacc + 5 + gdbarch_num_regs (gdbarch),
1053 sigcontext_base + SIGCONTEXT_LO3);
1054 }
1055 else
1056 {
1057 trad_frame_set_reg_addr (this_cache,
1058 regs->cause + gdbarch_num_regs (gdbarch),
1059 sigcontext_base + SIGCONTEXT_CAUSE);
1060 trad_frame_set_reg_addr (this_cache,
1061 regs->badvaddr + gdbarch_num_regs (gdbarch),
1062 sigcontext_base + SIGCONTEXT_BADVADDR);
1063 }
1064
1065 /* Choice of the bottom of the sigframe is somewhat arbitrary. */
1066 trad_frame_set_id (this_cache, frame_id_build (frame_sp, func));
1067 }
1068
1069 /* *INDENT-OFF* */
1070 /* For N32/N64 things look different. There is no non-rt signal frame.
1071
1072 struct rt_sigframe_n32 {
1073 u32 rs_ass[4]; [ argument save space for o32 ]
1074 u32 rs_code[2]; [ signal trampoline or fill ]
1075 struct siginfo rs_info;
1076 struct ucontextn32 rs_uc;
1077 };
1078
1079 struct ucontextn32 {
1080 u32 uc_flags;
1081 s32 uc_link;
1082 stack32_t uc_stack;
1083 struct sigcontext uc_mcontext;
1084 sigset_t uc_sigmask; [ mask last for extensibility ]
1085 };
1086
1087 struct rt_sigframe {
1088 u32 rs_ass[4]; [ argument save space for o32 ]
1089 u32 rs_code[2]; [ signal trampoline ]
1090 struct siginfo rs_info;
1091 struct ucontext rs_uc;
1092 };
1093
1094 struct ucontext {
1095 unsigned long uc_flags;
1096 struct ucontext *uc_link;
1097 stack_t uc_stack;
1098 struct sigcontext uc_mcontext;
1099 sigset_t uc_sigmask; [ mask last for extensibility ]
1100 };
1101
1102 And the sigcontext is different (this is for both n32 and n64):
1103
1104 struct sigcontext {
1105 unsigned long long sc_regs[32];
1106 unsigned long long sc_fpregs[32];
1107 unsigned long long sc_mdhi;
1108 unsigned long long sc_hi1;
1109 unsigned long long sc_hi2;
1110 unsigned long long sc_hi3;
1111 unsigned long long sc_mdlo;
1112 unsigned long long sc_lo1;
1113 unsigned long long sc_lo2;
1114 unsigned long long sc_lo3;
1115 unsigned long long sc_pc;
1116 unsigned int sc_fpc_csr;
1117 unsigned int sc_used_math;
1118 unsigned int sc_dsp;
1119 unsigned int sc_reserved;
1120 };
1121
1122 That is the post-2.6.12 definition of the 64-bit sigcontext; before
1123 then, there were no hi1-hi3 or lo1-lo3. Cause and badvaddr were
1124 included too. */
1125 /* *INDENT-ON* */
1126
1127 #define N32_STACK_T_SIZE STACK_T_SIZE
1128 #define N64_STACK_T_SIZE (2 * 8 + 4)
1129 #define N32_UCONTEXT_SIGCONTEXT_OFFSET (2 * 4 + N32_STACK_T_SIZE + 4)
1130 #define N64_UCONTEXT_SIGCONTEXT_OFFSET (2 * 8 + N64_STACK_T_SIZE + 4)
1131 #define N32_SIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
1132 + RTSIGFRAME_SIGINFO_SIZE \
1133 + N32_UCONTEXT_SIGCONTEXT_OFFSET)
1134 #define N64_SIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
1135 + RTSIGFRAME_SIGINFO_SIZE \
1136 + N64_UCONTEXT_SIGCONTEXT_OFFSET)
1137
1138 #define N64_SIGCONTEXT_REGS (0 * 8)
1139 #define N64_SIGCONTEXT_FPREGS (32 * 8)
1140 #define N64_SIGCONTEXT_HI (64 * 8)
1141 #define N64_SIGCONTEXT_HI1 (65 * 8)
1142 #define N64_SIGCONTEXT_HI2 (66 * 8)
1143 #define N64_SIGCONTEXT_HI3 (67 * 8)
1144 #define N64_SIGCONTEXT_LO (68 * 8)
1145 #define N64_SIGCONTEXT_LO1 (69 * 8)
1146 #define N64_SIGCONTEXT_LO2 (70 * 8)
1147 #define N64_SIGCONTEXT_LO3 (71 * 8)
1148 #define N64_SIGCONTEXT_PC (72 * 8)
1149 #define N64_SIGCONTEXT_FPCSR (73 * 8 + 0)
1150 #define N64_SIGCONTEXT_DSPCTL (74 * 8 + 0)
1151
1152 #define N64_SIGCONTEXT_REG_SIZE 8
1153
1154 static void
1155 mips_linux_n32n64_sigframe_init (const struct tramp_frame *self,
1156 struct frame_info *this_frame,
1157 struct trad_frame_cache *this_cache,
1158 CORE_ADDR func)
1159 {
1160 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1161 int ireg;
1162 CORE_ADDR frame_sp = get_frame_sp (this_frame);
1163 CORE_ADDR sigcontext_base;
1164 const struct mips_regnum *regs = mips_regnum (gdbarch);
1165
1166 if (self == &mips_linux_n32_rt_sigframe
1167 || self == &micromips_linux_n32_rt_sigframe)
1168 sigcontext_base = frame_sp + N32_SIGFRAME_SIGCONTEXT_OFFSET;
1169 else
1170 sigcontext_base = frame_sp + N64_SIGFRAME_SIGCONTEXT_OFFSET;
1171
1172 if (mips_linux_restart_reg_p (gdbarch))
1173 trad_frame_set_reg_addr (this_cache,
1174 (MIPS_RESTART_REGNUM
1175 + gdbarch_num_regs (gdbarch)),
1176 sigcontext_base + N64_SIGCONTEXT_REGS);
1177
1178 for (ireg = 1; ireg < 32; ireg++)
1179 trad_frame_set_reg_addr (this_cache,
1180 (ireg + MIPS_ZERO_REGNUM
1181 + gdbarch_num_regs (gdbarch)),
1182 (sigcontext_base + N64_SIGCONTEXT_REGS
1183 + ireg * N64_SIGCONTEXT_REG_SIZE));
1184
1185 for (ireg = 0; ireg < 32; ireg++)
1186 trad_frame_set_reg_addr (this_cache,
1187 ireg + regs->fp0 + gdbarch_num_regs (gdbarch),
1188 (sigcontext_base + N64_SIGCONTEXT_FPREGS
1189 + ireg * N64_SIGCONTEXT_REG_SIZE));
1190
1191 trad_frame_set_reg_addr (this_cache,
1192 regs->pc + gdbarch_num_regs (gdbarch),
1193 sigcontext_base + N64_SIGCONTEXT_PC);
1194
1195 trad_frame_set_reg_addr (this_cache,
1196 (regs->fp_control_status
1197 + gdbarch_num_regs (gdbarch)),
1198 sigcontext_base + N64_SIGCONTEXT_FPCSR);
1199
1200 trad_frame_set_reg_addr (this_cache,
1201 regs->hi + gdbarch_num_regs (gdbarch),
1202 sigcontext_base + N64_SIGCONTEXT_HI);
1203 trad_frame_set_reg_addr (this_cache,
1204 regs->lo + gdbarch_num_regs (gdbarch),
1205 sigcontext_base + N64_SIGCONTEXT_LO);
1206
1207 if (regs->dspacc != -1)
1208 {
1209 trad_frame_set_reg_addr (this_cache,
1210 regs->dspacc + 0 + gdbarch_num_regs (gdbarch),
1211 sigcontext_base + N64_SIGCONTEXT_HI1);
1212 trad_frame_set_reg_addr (this_cache,
1213 regs->dspacc + 1 + gdbarch_num_regs (gdbarch),
1214 sigcontext_base + N64_SIGCONTEXT_LO1);
1215 trad_frame_set_reg_addr (this_cache,
1216 regs->dspacc + 2 + gdbarch_num_regs (gdbarch),
1217 sigcontext_base + N64_SIGCONTEXT_HI2);
1218 trad_frame_set_reg_addr (this_cache,
1219 regs->dspacc + 3 + gdbarch_num_regs (gdbarch),
1220 sigcontext_base + N64_SIGCONTEXT_LO2);
1221 trad_frame_set_reg_addr (this_cache,
1222 regs->dspacc + 4 + gdbarch_num_regs (gdbarch),
1223 sigcontext_base + N64_SIGCONTEXT_HI3);
1224 trad_frame_set_reg_addr (this_cache,
1225 regs->dspacc + 5 + gdbarch_num_regs (gdbarch),
1226 sigcontext_base + N64_SIGCONTEXT_LO3);
1227 }
1228 if (regs->dspctl != -1)
1229 trad_frame_set_reg_addr (this_cache,
1230 regs->dspctl + gdbarch_num_regs (gdbarch),
1231 sigcontext_base + N64_SIGCONTEXT_DSPCTL);
1232
1233 /* Choice of the bottom of the sigframe is somewhat arbitrary. */
1234 trad_frame_set_id (this_cache, frame_id_build (frame_sp, func));
1235 }
1236
1237 /* Implement struct tramp_frame's "validate" method for standard MIPS code. */
1238
1239 static int
1240 mips_linux_sigframe_validate (const struct tramp_frame *self,
1241 struct frame_info *this_frame,
1242 CORE_ADDR *pc)
1243 {
1244 return mips_pc_is_mips (*pc);
1245 }
1246
1247 /* Implement struct tramp_frame's "validate" method for microMIPS code. */
1248
1249 static int
1250 micromips_linux_sigframe_validate (const struct tramp_frame *self,
1251 struct frame_info *this_frame,
1252 CORE_ADDR *pc)
1253 {
1254 if (mips_pc_is_micromips (get_frame_arch (this_frame), *pc))
1255 {
1256 *pc = mips_unmake_compact_addr (*pc);
1257 return 1;
1258 }
1259 else
1260 return 0;
1261 }
1262
1263 /* Implement the "write_pc" gdbarch method. */
1264
1265 static void
1266 mips_linux_write_pc (struct regcache *regcache, CORE_ADDR pc)
1267 {
1268 struct gdbarch *gdbarch = regcache->arch ();
1269
1270 mips_write_pc (regcache, pc);
1271
1272 /* Clear the syscall restart flag. */
1273 if (mips_linux_restart_reg_p (gdbarch))
1274 regcache_cooked_write_unsigned (regcache, MIPS_RESTART_REGNUM, 0);
1275 }
1276
1277 /* Return 1 if MIPS_RESTART_REGNUM is usable. */
1278
1279 int
1280 mips_linux_restart_reg_p (struct gdbarch *gdbarch)
1281 {
1282 /* If we do not have a target description with registers, then
1283 MIPS_RESTART_REGNUM will not be included in the register set. */
1284 if (!tdesc_has_registers (gdbarch_target_desc (gdbarch)))
1285 return 0;
1286
1287 /* If we do, then MIPS_RESTART_REGNUM is safe to check; it will
1288 either be GPR-sized or missing. */
1289 return register_size (gdbarch, MIPS_RESTART_REGNUM) > 0;
1290 }
1291
1292 /* When FRAME is at a syscall instruction, return the PC of the next
1293 instruction to be executed. */
1294
1295 static CORE_ADDR
1296 mips_linux_syscall_next_pc (struct frame_info *frame)
1297 {
1298 CORE_ADDR pc = get_frame_pc (frame);
1299 ULONGEST v0 = get_frame_register_unsigned (frame, MIPS_V0_REGNUM);
1300
1301 /* If we are about to make a sigreturn syscall, use the unwinder to
1302 decode the signal frame. */
1303 if (v0 == MIPS_NR_sigreturn
1304 || v0 == MIPS_NR_rt_sigreturn
1305 || v0 == MIPS_NR_N64_rt_sigreturn
1306 || v0 == MIPS_NR_N32_rt_sigreturn)
1307 return frame_unwind_caller_pc (get_current_frame ());
1308
1309 return pc + 4;
1310 }
1311
1312 /* Return the current system call's number present in the
1313 v0 register. When the function fails, it returns -1. */
1314
1315 static LONGEST
1316 mips_linux_get_syscall_number (struct gdbarch *gdbarch,
1317 thread_info *thread)
1318 {
1319 struct regcache *regcache = get_thread_regcache (thread);
1320 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1321 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1322 int regsize = register_size (gdbarch, MIPS_V0_REGNUM);
1323 /* The content of a register */
1324 gdb_byte buf[8];
1325 /* The result */
1326 LONGEST ret;
1327
1328 /* Make sure we're in a known ABI */
1329 gdb_assert (tdep->mips_abi == MIPS_ABI_O32
1330 || tdep->mips_abi == MIPS_ABI_N32
1331 || tdep->mips_abi == MIPS_ABI_N64);
1332
1333 gdb_assert (regsize <= sizeof (buf));
1334
1335 /* Getting the system call number from the register.
1336 syscall number is in v0 or $2. */
1337 regcache->cooked_read (MIPS_V0_REGNUM, buf);
1338
1339 ret = extract_signed_integer (buf, regsize, byte_order);
1340
1341 return ret;
1342 }
1343
1344 /* Implementation of `gdbarch_gdb_signal_to_target', as defined in
1345 gdbarch.h. */
1346
1347 static int
1348 mips_gdb_signal_to_target (struct gdbarch *gdbarch,
1349 enum gdb_signal signal)
1350 {
1351 switch (signal)
1352 {
1353 case GDB_SIGNAL_EMT:
1354 return MIPS_LINUX_SIGEMT;
1355
1356 case GDB_SIGNAL_BUS:
1357 return MIPS_LINUX_SIGBUS;
1358
1359 case GDB_SIGNAL_SYS:
1360 return MIPS_LINUX_SIGSYS;
1361
1362 case GDB_SIGNAL_USR1:
1363 return MIPS_LINUX_SIGUSR1;
1364
1365 case GDB_SIGNAL_USR2:
1366 return MIPS_LINUX_SIGUSR2;
1367
1368 case GDB_SIGNAL_CHLD:
1369 return MIPS_LINUX_SIGCHLD;
1370
1371 case GDB_SIGNAL_PWR:
1372 return MIPS_LINUX_SIGPWR;
1373
1374 case GDB_SIGNAL_WINCH:
1375 return MIPS_LINUX_SIGWINCH;
1376
1377 case GDB_SIGNAL_URG:
1378 return MIPS_LINUX_SIGURG;
1379
1380 case GDB_SIGNAL_IO:
1381 return MIPS_LINUX_SIGIO;
1382
1383 case GDB_SIGNAL_POLL:
1384 return MIPS_LINUX_SIGPOLL;
1385
1386 case GDB_SIGNAL_STOP:
1387 return MIPS_LINUX_SIGSTOP;
1388
1389 case GDB_SIGNAL_TSTP:
1390 return MIPS_LINUX_SIGTSTP;
1391
1392 case GDB_SIGNAL_CONT:
1393 return MIPS_LINUX_SIGCONT;
1394
1395 case GDB_SIGNAL_TTIN:
1396 return MIPS_LINUX_SIGTTIN;
1397
1398 case GDB_SIGNAL_TTOU:
1399 return MIPS_LINUX_SIGTTOU;
1400
1401 case GDB_SIGNAL_VTALRM:
1402 return MIPS_LINUX_SIGVTALRM;
1403
1404 case GDB_SIGNAL_PROF:
1405 return MIPS_LINUX_SIGPROF;
1406
1407 case GDB_SIGNAL_XCPU:
1408 return MIPS_LINUX_SIGXCPU;
1409
1410 case GDB_SIGNAL_XFSZ:
1411 return MIPS_LINUX_SIGXFSZ;
1412
1413 /* GDB_SIGNAL_REALTIME_32 is not continuous in <gdb/signals.def>,
1414 therefore we have to handle it here. */
1415 case GDB_SIGNAL_REALTIME_32:
1416 return MIPS_LINUX_SIGRTMIN;
1417 }
1418
1419 if (signal >= GDB_SIGNAL_REALTIME_33
1420 && signal <= GDB_SIGNAL_REALTIME_63)
1421 {
1422 int offset = signal - GDB_SIGNAL_REALTIME_33;
1423
1424 return MIPS_LINUX_SIGRTMIN + 1 + offset;
1425 }
1426 else if (signal >= GDB_SIGNAL_REALTIME_64
1427 && signal <= GDB_SIGNAL_REALTIME_127)
1428 {
1429 int offset = signal - GDB_SIGNAL_REALTIME_64;
1430
1431 return MIPS_LINUX_SIGRT64 + offset;
1432 }
1433
1434 return linux_gdb_signal_to_target (gdbarch, signal);
1435 }
1436
1437 /* Translate signals based on MIPS signal values.
1438 Adapted from gdb/gdbsupport/signals.c. */
1439
1440 static enum gdb_signal
1441 mips_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
1442 {
1443 switch (signal)
1444 {
1445 case MIPS_LINUX_SIGEMT:
1446 return GDB_SIGNAL_EMT;
1447
1448 case MIPS_LINUX_SIGBUS:
1449 return GDB_SIGNAL_BUS;
1450
1451 case MIPS_LINUX_SIGSYS:
1452 return GDB_SIGNAL_SYS;
1453
1454 case MIPS_LINUX_SIGUSR1:
1455 return GDB_SIGNAL_USR1;
1456
1457 case MIPS_LINUX_SIGUSR2:
1458 return GDB_SIGNAL_USR2;
1459
1460 case MIPS_LINUX_SIGCHLD:
1461 return GDB_SIGNAL_CHLD;
1462
1463 case MIPS_LINUX_SIGPWR:
1464 return GDB_SIGNAL_PWR;
1465
1466 case MIPS_LINUX_SIGWINCH:
1467 return GDB_SIGNAL_WINCH;
1468
1469 case MIPS_LINUX_SIGURG:
1470 return GDB_SIGNAL_URG;
1471
1472 /* No way to differentiate between SIGIO and SIGPOLL.
1473 Therefore, we just handle the first one. */
1474 case MIPS_LINUX_SIGIO:
1475 return GDB_SIGNAL_IO;
1476
1477 case MIPS_LINUX_SIGSTOP:
1478 return GDB_SIGNAL_STOP;
1479
1480 case MIPS_LINUX_SIGTSTP:
1481 return GDB_SIGNAL_TSTP;
1482
1483 case MIPS_LINUX_SIGCONT:
1484 return GDB_SIGNAL_CONT;
1485
1486 case MIPS_LINUX_SIGTTIN:
1487 return GDB_SIGNAL_TTIN;
1488
1489 case MIPS_LINUX_SIGTTOU:
1490 return GDB_SIGNAL_TTOU;
1491
1492 case MIPS_LINUX_SIGVTALRM:
1493 return GDB_SIGNAL_VTALRM;
1494
1495 case MIPS_LINUX_SIGPROF:
1496 return GDB_SIGNAL_PROF;
1497
1498 case MIPS_LINUX_SIGXCPU:
1499 return GDB_SIGNAL_XCPU;
1500
1501 case MIPS_LINUX_SIGXFSZ:
1502 return GDB_SIGNAL_XFSZ;
1503 }
1504
1505 if (signal >= MIPS_LINUX_SIGRTMIN && signal <= MIPS_LINUX_SIGRTMAX)
1506 {
1507 /* GDB_SIGNAL_REALTIME values are not contiguous, map parts of
1508 the MIPS block to the respective GDB_SIGNAL_REALTIME blocks. */
1509 int offset = signal - MIPS_LINUX_SIGRTMIN;
1510
1511 if (offset == 0)
1512 return GDB_SIGNAL_REALTIME_32;
1513 else if (offset < 32)
1514 return (enum gdb_signal) (offset - 1
1515 + (int) GDB_SIGNAL_REALTIME_33);
1516 else
1517 return (enum gdb_signal) (offset - 32
1518 + (int) GDB_SIGNAL_REALTIME_64);
1519 }
1520
1521 return linux_gdb_signal_from_target (gdbarch, signal);
1522 }
1523
1524 /* Initialize one of the GNU/Linux OS ABIs. */
1525
1526 static void
1527 mips_linux_init_abi (struct gdbarch_info info,
1528 struct gdbarch *gdbarch)
1529 {
1530 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1531 enum mips_abi abi = mips_abi (gdbarch);
1532 struct tdesc_arch_data *tdesc_data = info.tdesc_data;
1533
1534 linux_init_abi (info, gdbarch);
1535
1536 /* Get the syscall number from the arch's register. */
1537 set_gdbarch_get_syscall_number (gdbarch, mips_linux_get_syscall_number);
1538
1539 switch (abi)
1540 {
1541 case MIPS_ABI_O32:
1542 set_gdbarch_get_longjmp_target (gdbarch,
1543 mips_linux_get_longjmp_target);
1544 set_solib_svr4_fetch_link_map_offsets
1545 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
1546 tramp_frame_prepend_unwinder (gdbarch, &micromips_linux_o32_sigframe);
1547 tramp_frame_prepend_unwinder (gdbarch,
1548 &micromips_linux_o32_rt_sigframe);
1549 tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_sigframe);
1550 tramp_frame_prepend_unwinder (gdbarch, &mips_linux_o32_rt_sigframe);
1551 set_xml_syscall_file_name (gdbarch, "syscalls/mips-o32-linux.xml");
1552 break;
1553 case MIPS_ABI_N32:
1554 set_gdbarch_get_longjmp_target (gdbarch,
1555 mips_linux_get_longjmp_target);
1556 set_solib_svr4_fetch_link_map_offsets
1557 (gdbarch, svr4_ilp32_fetch_link_map_offsets);
1558 set_gdbarch_long_double_bit (gdbarch, 128);
1559 /* These floatformats should probably be renamed. MIPS uses
1560 the same 128-bit IEEE floating point format that IA-64 uses,
1561 except that the quiet/signalling NaN bit is reversed (GDB
1562 does not distinguish between quiet and signalling NaNs). */
1563 set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
1564 tramp_frame_prepend_unwinder (gdbarch,
1565 &micromips_linux_n32_rt_sigframe);
1566 tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n32_rt_sigframe);
1567 set_xml_syscall_file_name (gdbarch, "syscalls/mips-n32-linux.xml");
1568 break;
1569 case MIPS_ABI_N64:
1570 set_gdbarch_get_longjmp_target (gdbarch,
1571 mips64_linux_get_longjmp_target);
1572 set_solib_svr4_fetch_link_map_offsets
1573 (gdbarch, svr4_lp64_fetch_link_map_offsets);
1574 set_gdbarch_long_double_bit (gdbarch, 128);
1575 /* These floatformats should probably be renamed. MIPS uses
1576 the same 128-bit IEEE floating point format that IA-64 uses,
1577 except that the quiet/signalling NaN bit is reversed (GDB
1578 does not distinguish between quiet and signalling NaNs). */
1579 set_gdbarch_long_double_format (gdbarch, floatformats_ia64_quad);
1580 tramp_frame_prepend_unwinder (gdbarch,
1581 &micromips_linux_n64_rt_sigframe);
1582 tramp_frame_prepend_unwinder (gdbarch, &mips_linux_n64_rt_sigframe);
1583 set_xml_syscall_file_name (gdbarch, "syscalls/mips-n64-linux.xml");
1584 break;
1585 default:
1586 break;
1587 }
1588
1589 set_gdbarch_skip_solib_resolver (gdbarch, mips_linux_skip_resolver);
1590
1591 set_gdbarch_software_single_step (gdbarch, mips_software_single_step);
1592
1593 /* Enable TLS support. */
1594 set_gdbarch_fetch_tls_load_module_address (gdbarch,
1595 svr4_fetch_objfile_link_map);
1596
1597 /* Initialize this lazily, to avoid an initialization order
1598 dependency on solib-svr4.c's _initialize routine. */
1599 if (mips_svr4_so_ops.in_dynsym_resolve_code == NULL)
1600 {
1601 mips_svr4_so_ops = svr4_so_ops;
1602 mips_svr4_so_ops.in_dynsym_resolve_code
1603 = mips_linux_in_dynsym_resolve_code;
1604 }
1605 set_solib_ops (gdbarch, &mips_svr4_so_ops);
1606
1607 set_gdbarch_write_pc (gdbarch, mips_linux_write_pc);
1608
1609 set_gdbarch_core_read_description (gdbarch,
1610 mips_linux_core_read_description);
1611
1612 set_gdbarch_iterate_over_regset_sections
1613 (gdbarch, mips_linux_iterate_over_regset_sections);
1614
1615 set_gdbarch_gdb_signal_from_target (gdbarch,
1616 mips_gdb_signal_from_target);
1617
1618 set_gdbarch_gdb_signal_to_target (gdbarch,
1619 mips_gdb_signal_to_target);
1620
1621 tdep->syscall_next_pc = mips_linux_syscall_next_pc;
1622
1623 if (tdesc_data)
1624 {
1625 const struct tdesc_feature *feature;
1626
1627 /* If we have target-described registers, then we can safely
1628 reserve a number for MIPS_RESTART_REGNUM (whether it is
1629 described or not). */
1630 gdb_assert (gdbarch_num_regs (gdbarch) <= MIPS_RESTART_REGNUM);
1631 set_gdbarch_num_regs (gdbarch, MIPS_RESTART_REGNUM + 1);
1632 set_gdbarch_num_pseudo_regs (gdbarch, MIPS_RESTART_REGNUM + 1);
1633
1634 /* If it's present, then assign it to the reserved number. */
1635 feature = tdesc_find_feature (info.target_desc,
1636 "org.gnu.gdb.mips.linux");
1637 if (feature != NULL)
1638 tdesc_numbered_register (feature, tdesc_data, MIPS_RESTART_REGNUM,
1639 "restart");
1640 }
1641 }
1642
1643 void _initialize_mips_linux_tdep ();
1644 void
1645 _initialize_mips_linux_tdep ()
1646 {
1647 const struct bfd_arch_info *arch_info;
1648
1649 for (arch_info = bfd_lookup_arch (bfd_arch_mips, 0);
1650 arch_info != NULL;
1651 arch_info = arch_info->next)
1652 {
1653 gdbarch_register_osabi (bfd_arch_mips, arch_info->mach,
1654 GDB_OSABI_LINUX,
1655 mips_linux_init_abi);
1656 }
1657
1658 /* Initialize the standard target descriptions. */
1659 initialize_tdesc_mips_linux ();
1660 initialize_tdesc_mips_dsp_linux ();
1661 initialize_tdesc_mips64_linux ();
1662 initialize_tdesc_mips64_dsp_linux ();
1663 }
This page took 0.065568 seconds and 4 git commands to generate.