C++-ify prologue-value's pv_area
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
1 /* Common target dependent code for GDB on ARM systems.
2
3 Copyright (C) 1988-2017 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
22 #include <ctype.h> /* XXX for isupper (). */
23
24 #include "frame.h"
25 #include "inferior.h"
26 #include "infrun.h"
27 #include "gdbcmd.h"
28 #include "gdbcore.h"
29 #include "dis-asm.h" /* For register styles. */
30 #include "disasm.h"
31 #include "regcache.h"
32 #include "reggroups.h"
33 #include "doublest.h"
34 #include "value.h"
35 #include "arch-utils.h"
36 #include "osabi.h"
37 #include "frame-unwind.h"
38 #include "frame-base.h"
39 #include "trad-frame.h"
40 #include "objfiles.h"
41 #include "dwarf2-frame.h"
42 #include "gdbtypes.h"
43 #include "prologue-value.h"
44 #include "remote.h"
45 #include "target-descriptions.h"
46 #include "user-regs.h"
47 #include "observer.h"
48
49 #include "arch/arm.h"
50 #include "arch/arm-get-next-pcs.h"
51 #include "arm-tdep.h"
52 #include "gdb/sim-arm.h"
53
54 #include "elf-bfd.h"
55 #include "coff/internal.h"
56 #include "elf/arm.h"
57
58 #include "vec.h"
59
60 #include "record.h"
61 #include "record-full.h"
62 #include <algorithm>
63
64 #include "features/arm/arm-with-m.c"
65 #include "features/arm/arm-with-m-fpa-layout.c"
66 #include "features/arm/arm-with-m-vfp-d16.c"
67 #include "features/arm/arm-with-iwmmxt.c"
68 #include "features/arm/arm-with-vfpv2.c"
69 #include "features/arm/arm-with-vfpv3.c"
70 #include "features/arm/arm-with-neon.c"
71
72 #if GDB_SELF_TEST
73 #include "selftest.h"
74 #endif
75
76 static int arm_debug;
77
78 /* Macros for setting and testing a bit in a minimal symbol that marks
79 it as Thumb function. The MSB of the minimal symbol's "info" field
80 is used for this purpose.
81
82 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
83 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
84
85 #define MSYMBOL_SET_SPECIAL(msym) \
86 MSYMBOL_TARGET_FLAG_1 (msym) = 1
87
88 #define MSYMBOL_IS_SPECIAL(msym) \
89 MSYMBOL_TARGET_FLAG_1 (msym)
90
91 /* Per-objfile data used for mapping symbols. */
92 static const struct objfile_data *arm_objfile_data_key;
93
94 struct arm_mapping_symbol
95 {
96 bfd_vma value;
97 char type;
98 };
99 typedef struct arm_mapping_symbol arm_mapping_symbol_s;
100 DEF_VEC_O(arm_mapping_symbol_s);
101
102 struct arm_per_objfile
103 {
104 VEC(arm_mapping_symbol_s) **section_maps;
105 };
106
107 /* The list of available "set arm ..." and "show arm ..." commands. */
108 static struct cmd_list_element *setarmcmdlist = NULL;
109 static struct cmd_list_element *showarmcmdlist = NULL;
110
111 /* The type of floating-point to use. Keep this in sync with enum
112 arm_float_model, and the help string in _initialize_arm_tdep. */
113 static const char *const fp_model_strings[] =
114 {
115 "auto",
116 "softfpa",
117 "fpa",
118 "softvfp",
119 "vfp",
120 NULL
121 };
122
123 /* A variable that can be configured by the user. */
124 static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
125 static const char *current_fp_model = "auto";
126
127 /* The ABI to use. Keep this in sync with arm_abi_kind. */
128 static const char *const arm_abi_strings[] =
129 {
130 "auto",
131 "APCS",
132 "AAPCS",
133 NULL
134 };
135
136 /* A variable that can be configured by the user. */
137 static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
138 static const char *arm_abi_string = "auto";
139
140 /* The execution mode to assume. */
141 static const char *const arm_mode_strings[] =
142 {
143 "auto",
144 "arm",
145 "thumb",
146 NULL
147 };
148
149 static const char *arm_fallback_mode_string = "auto";
150 static const char *arm_force_mode_string = "auto";
151
152 /* The standard register names, and all the valid aliases for them. Note
153 that `fp', `sp' and `pc' are not added in this alias list, because they
154 have been added as builtin user registers in
155 std-regs.c:_initialize_frame_reg. */
156 static const struct
157 {
158 const char *name;
159 int regnum;
160 } arm_register_aliases[] = {
161 /* Basic register numbers. */
162 { "r0", 0 },
163 { "r1", 1 },
164 { "r2", 2 },
165 { "r3", 3 },
166 { "r4", 4 },
167 { "r5", 5 },
168 { "r6", 6 },
169 { "r7", 7 },
170 { "r8", 8 },
171 { "r9", 9 },
172 { "r10", 10 },
173 { "r11", 11 },
174 { "r12", 12 },
175 { "r13", 13 },
176 { "r14", 14 },
177 { "r15", 15 },
178 /* Synonyms (argument and variable registers). */
179 { "a1", 0 },
180 { "a2", 1 },
181 { "a3", 2 },
182 { "a4", 3 },
183 { "v1", 4 },
184 { "v2", 5 },
185 { "v3", 6 },
186 { "v4", 7 },
187 { "v5", 8 },
188 { "v6", 9 },
189 { "v7", 10 },
190 { "v8", 11 },
191 /* Other platform-specific names for r9. */
192 { "sb", 9 },
193 { "tr", 9 },
194 /* Special names. */
195 { "ip", 12 },
196 { "lr", 14 },
197 /* Names used by GCC (not listed in the ARM EABI). */
198 { "sl", 10 },
199 /* A special name from the older ATPCS. */
200 { "wr", 7 },
201 };
202
203 static const char *const arm_register_names[] =
204 {"r0", "r1", "r2", "r3", /* 0 1 2 3 */
205 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
206 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
207 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
208 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
209 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
210 "fps", "cpsr" }; /* 24 25 */
211
212 /* Holds the current set of options to be passed to the disassembler. */
213 static char *arm_disassembler_options;
214
215 /* Valid register name styles. */
216 static const char **valid_disassembly_styles;
217
218 /* Disassembly style to use. Default to "std" register names. */
219 static const char *disassembly_style;
220
221 /* This is used to keep the bfd arch_info in sync with the disassembly
222 style. */
223 static void set_disassembly_style_sfunc(char *, int,
224 struct cmd_list_element *);
225 static void show_disassembly_style_sfunc (struct ui_file *, int,
226 struct cmd_list_element *,
227 const char *);
228
229 static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
230 struct regcache *regcache,
231 int regnum, gdb_byte *buf);
232 static void arm_neon_quad_write (struct gdbarch *gdbarch,
233 struct regcache *regcache,
234 int regnum, const gdb_byte *buf);
235
236 static CORE_ADDR
237 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
238
239
240 /* get_next_pcs operations. */
241 static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
242 arm_get_next_pcs_read_memory_unsigned_integer,
243 arm_get_next_pcs_syscall_next_pc,
244 arm_get_next_pcs_addr_bits_remove,
245 arm_get_next_pcs_is_thumb,
246 NULL,
247 };
248
249 struct arm_prologue_cache
250 {
251 /* The stack pointer at the time this frame was created; i.e. the
252 caller's stack pointer when this function was called. It is used
253 to identify this frame. */
254 CORE_ADDR prev_sp;
255
256 /* The frame base for this frame is just prev_sp - frame size.
257 FRAMESIZE is the distance from the frame pointer to the
258 initial stack pointer. */
259
260 int framesize;
261
262 /* The register used to hold the frame pointer for this frame. */
263 int framereg;
264
265 /* Saved register offsets. */
266 struct trad_frame_saved_reg *saved_regs;
267 };
268
269 static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
270 CORE_ADDR prologue_start,
271 CORE_ADDR prologue_end,
272 struct arm_prologue_cache *cache);
273
274 /* Architecture version for displaced stepping. This effects the behaviour of
275 certain instructions, and really should not be hard-wired. */
276
277 #define DISPLACED_STEPPING_ARCH_VERSION 5
278
279 /* Set to true if the 32-bit mode is in use. */
280
281 int arm_apcs_32 = 1;
282
283 /* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
284
285 int
286 arm_psr_thumb_bit (struct gdbarch *gdbarch)
287 {
288 if (gdbarch_tdep (gdbarch)->is_m)
289 return XPSR_T;
290 else
291 return CPSR_T;
292 }
293
294 /* Determine if the processor is currently executing in Thumb mode. */
295
296 int
297 arm_is_thumb (struct regcache *regcache)
298 {
299 ULONGEST cpsr;
300 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regcache));
301
302 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
303
304 return (cpsr & t_bit) != 0;
305 }
306
307 /* Determine if FRAME is executing in Thumb mode. */
308
309 int
310 arm_frame_is_thumb (struct frame_info *frame)
311 {
312 CORE_ADDR cpsr;
313 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
314
315 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
316 directly (from a signal frame or dummy frame) or by interpreting
317 the saved LR (from a prologue or DWARF frame). So consult it and
318 trust the unwinders. */
319 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
320
321 return (cpsr & t_bit) != 0;
322 }
323
324 /* Callback for VEC_lower_bound. */
325
326 static inline int
327 arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
328 const struct arm_mapping_symbol *rhs)
329 {
330 return lhs->value < rhs->value;
331 }
332
333 /* Search for the mapping symbol covering MEMADDR. If one is found,
334 return its type. Otherwise, return 0. If START is non-NULL,
335 set *START to the location of the mapping symbol. */
336
337 static char
338 arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
339 {
340 struct obj_section *sec;
341
342 /* If there are mapping symbols, consult them. */
343 sec = find_pc_section (memaddr);
344 if (sec != NULL)
345 {
346 struct arm_per_objfile *data;
347 VEC(arm_mapping_symbol_s) *map;
348 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
349 0 };
350 unsigned int idx;
351
352 data = (struct arm_per_objfile *) objfile_data (sec->objfile,
353 arm_objfile_data_key);
354 if (data != NULL)
355 {
356 map = data->section_maps[sec->the_bfd_section->index];
357 if (!VEC_empty (arm_mapping_symbol_s, map))
358 {
359 struct arm_mapping_symbol *map_sym;
360
361 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
362 arm_compare_mapping_symbols);
363
364 /* VEC_lower_bound finds the earliest ordered insertion
365 point. If the following symbol starts at this exact
366 address, we use that; otherwise, the preceding
367 mapping symbol covers this address. */
368 if (idx < VEC_length (arm_mapping_symbol_s, map))
369 {
370 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
371 if (map_sym->value == map_key.value)
372 {
373 if (start)
374 *start = map_sym->value + obj_section_addr (sec);
375 return map_sym->type;
376 }
377 }
378
379 if (idx > 0)
380 {
381 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
382 if (start)
383 *start = map_sym->value + obj_section_addr (sec);
384 return map_sym->type;
385 }
386 }
387 }
388 }
389
390 return 0;
391 }
392
393 /* Determine if the program counter specified in MEMADDR is in a Thumb
394 function. This function should be called for addresses unrelated to
395 any executing frame; otherwise, prefer arm_frame_is_thumb. */
396
397 int
398 arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
399 {
400 struct bound_minimal_symbol sym;
401 char type;
402 struct displaced_step_closure* dsc
403 = get_displaced_step_closure_by_addr(memaddr);
404
405 /* If checking the mode of displaced instruction in copy area, the mode
406 should be determined by instruction on the original address. */
407 if (dsc)
408 {
409 if (debug_displaced)
410 fprintf_unfiltered (gdb_stdlog,
411 "displaced: check mode of %.8lx instead of %.8lx\n",
412 (unsigned long) dsc->insn_addr,
413 (unsigned long) memaddr);
414 memaddr = dsc->insn_addr;
415 }
416
417 /* If bit 0 of the address is set, assume this is a Thumb address. */
418 if (IS_THUMB_ADDR (memaddr))
419 return 1;
420
421 /* If the user wants to override the symbol table, let him. */
422 if (strcmp (arm_force_mode_string, "arm") == 0)
423 return 0;
424 if (strcmp (arm_force_mode_string, "thumb") == 0)
425 return 1;
426
427 /* ARM v6-M and v7-M are always in Thumb mode. */
428 if (gdbarch_tdep (gdbarch)->is_m)
429 return 1;
430
431 /* If there are mapping symbols, consult them. */
432 type = arm_find_mapping_symbol (memaddr, NULL);
433 if (type)
434 return type == 't';
435
436 /* Thumb functions have a "special" bit set in minimal symbols. */
437 sym = lookup_minimal_symbol_by_pc (memaddr);
438 if (sym.minsym)
439 return (MSYMBOL_IS_SPECIAL (sym.minsym));
440
441 /* If the user wants to override the fallback mode, let them. */
442 if (strcmp (arm_fallback_mode_string, "arm") == 0)
443 return 0;
444 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
445 return 1;
446
447 /* If we couldn't find any symbol, but we're talking to a running
448 target, then trust the current value of $cpsr. This lets
449 "display/i $pc" always show the correct mode (though if there is
450 a symbol table we will not reach here, so it still may not be
451 displayed in the mode it will be executed). */
452 if (target_has_registers)
453 return arm_frame_is_thumb (get_current_frame ());
454
455 /* Otherwise we're out of luck; we assume ARM. */
456 return 0;
457 }
458
459 /* Determine if the address specified equals any of these magic return
460 values, called EXC_RETURN, defined by the ARM v6-M and v7-M
461 architectures.
462
463 From ARMv6-M Reference Manual B1.5.8
464 Table B1-5 Exception return behavior
465
466 EXC_RETURN Return To Return Stack
467 0xFFFFFFF1 Handler mode Main
468 0xFFFFFFF9 Thread mode Main
469 0xFFFFFFFD Thread mode Process
470
471 From ARMv7-M Reference Manual B1.5.8
472 Table B1-8 EXC_RETURN definition of exception return behavior, no FP
473
474 EXC_RETURN Return To Return Stack
475 0xFFFFFFF1 Handler mode Main
476 0xFFFFFFF9 Thread mode Main
477 0xFFFFFFFD Thread mode Process
478
479 Table B1-9 EXC_RETURN definition of exception return behavior, with
480 FP
481
482 EXC_RETURN Return To Return Stack Frame Type
483 0xFFFFFFE1 Handler mode Main Extended
484 0xFFFFFFE9 Thread mode Main Extended
485 0xFFFFFFED Thread mode Process Extended
486 0xFFFFFFF1 Handler mode Main Basic
487 0xFFFFFFF9 Thread mode Main Basic
488 0xFFFFFFFD Thread mode Process Basic
489
490 For more details see "B1.5.8 Exception return behavior"
491 in both ARMv6-M and ARMv7-M Architecture Reference Manuals. */
492
493 static int
494 arm_m_addr_is_magic (CORE_ADDR addr)
495 {
496 switch (addr)
497 {
498 /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
499 the exception return behavior. */
500 case 0xffffffe1:
501 case 0xffffffe9:
502 case 0xffffffed:
503 case 0xfffffff1:
504 case 0xfffffff9:
505 case 0xfffffffd:
506 /* Address is magic. */
507 return 1;
508
509 default:
510 /* Address is not magic. */
511 return 0;
512 }
513 }
514
515 /* Remove useless bits from addresses in a running program. */
516 static CORE_ADDR
517 arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
518 {
519 /* On M-profile devices, do not strip the low bit from EXC_RETURN
520 (the magic exception return address). */
521 if (gdbarch_tdep (gdbarch)->is_m
522 && arm_m_addr_is_magic (val))
523 return val;
524
525 if (arm_apcs_32)
526 return UNMAKE_THUMB_ADDR (val);
527 else
528 return (val & 0x03fffffc);
529 }
530
531 /* Return 1 if PC is the start of a compiler helper function which
532 can be safely ignored during prologue skipping. IS_THUMB is true
533 if the function is known to be a Thumb function due to the way it
534 is being called. */
535 static int
536 skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
537 {
538 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
539 struct bound_minimal_symbol msym;
540
541 msym = lookup_minimal_symbol_by_pc (pc);
542 if (msym.minsym != NULL
543 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
544 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
545 {
546 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
547
548 /* The GNU linker's Thumb call stub to foo is named
549 __foo_from_thumb. */
550 if (strstr (name, "_from_thumb") != NULL)
551 name += 2;
552
553 /* On soft-float targets, __truncdfsf2 is called to convert promoted
554 arguments to their argument types in non-prototyped
555 functions. */
556 if (startswith (name, "__truncdfsf2"))
557 return 1;
558 if (startswith (name, "__aeabi_d2f"))
559 return 1;
560
561 /* Internal functions related to thread-local storage. */
562 if (startswith (name, "__tls_get_addr"))
563 return 1;
564 if (startswith (name, "__aeabi_read_tp"))
565 return 1;
566 }
567 else
568 {
569 /* If we run against a stripped glibc, we may be unable to identify
570 special functions by name. Check for one important case,
571 __aeabi_read_tp, by comparing the *code* against the default
572 implementation (this is hand-written ARM assembler in glibc). */
573
574 if (!is_thumb
575 && read_code_unsigned_integer (pc, 4, byte_order_for_code)
576 == 0xe3e00a0f /* mov r0, #0xffff0fff */
577 && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
578 == 0xe240f01f) /* sub pc, r0, #31 */
579 return 1;
580 }
581
582 return 0;
583 }
584
585 /* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
586 the first 16-bit of instruction, and INSN2 is the second 16-bit of
587 instruction. */
588 #define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
589 ((bits ((insn1), 0, 3) << 12) \
590 | (bits ((insn1), 10, 10) << 11) \
591 | (bits ((insn2), 12, 14) << 8) \
592 | bits ((insn2), 0, 7))
593
594 /* Extract the immediate from instruction movw/movt of encoding A. INSN is
595 the 32-bit instruction. */
596 #define EXTRACT_MOVW_MOVT_IMM_A(insn) \
597 ((bits ((insn), 16, 19) << 12) \
598 | bits ((insn), 0, 11))
599
600 /* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
601
602 static unsigned int
603 thumb_expand_immediate (unsigned int imm)
604 {
605 unsigned int count = imm >> 7;
606
607 if (count < 8)
608 switch (count / 2)
609 {
610 case 0:
611 return imm & 0xff;
612 case 1:
613 return (imm & 0xff) | ((imm & 0xff) << 16);
614 case 2:
615 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
616 case 3:
617 return (imm & 0xff) | ((imm & 0xff) << 8)
618 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
619 }
620
621 return (0x80 | (imm & 0x7f)) << (32 - count);
622 }
623
624 /* Return 1 if the 16-bit Thumb instruction INSN restores SP in
625 epilogue, 0 otherwise. */
626
627 static int
628 thumb_instruction_restores_sp (unsigned short insn)
629 {
630 return (insn == 0x46bd /* mov sp, r7 */
631 || (insn & 0xff80) == 0xb000 /* add sp, imm */
632 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
633 }
634
635 /* Analyze a Thumb prologue, looking for a recognizable stack frame
636 and frame pointer. Scan until we encounter a store that could
637 clobber the stack frame unexpectedly, or an unknown instruction.
638 Return the last address which is definitely safe to skip for an
639 initial breakpoint. */
640
641 static CORE_ADDR
642 thumb_analyze_prologue (struct gdbarch *gdbarch,
643 CORE_ADDR start, CORE_ADDR limit,
644 struct arm_prologue_cache *cache)
645 {
646 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
647 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
648 int i;
649 pv_t regs[16];
650 CORE_ADDR offset;
651 CORE_ADDR unrecognized_pc = 0;
652
653 for (i = 0; i < 16; i++)
654 regs[i] = pv_register (i, 0);
655 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
656
657 while (start < limit)
658 {
659 unsigned short insn;
660
661 insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
662
663 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
664 {
665 int regno;
666 int mask;
667
668 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
669 break;
670
671 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
672 whether to save LR (R14). */
673 mask = (insn & 0xff) | ((insn & 0x100) << 6);
674
675 /* Calculate offsets of saved R0-R7 and LR. */
676 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
677 if (mask & (1 << regno))
678 {
679 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
680 -4);
681 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
682 }
683 }
684 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
685 {
686 offset = (insn & 0x7f) << 2; /* get scaled offset */
687 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
688 -offset);
689 }
690 else if (thumb_instruction_restores_sp (insn))
691 {
692 /* Don't scan past the epilogue. */
693 break;
694 }
695 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
696 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
697 (insn & 0xff) << 2);
698 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
699 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
700 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
701 bits (insn, 6, 8));
702 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
703 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
704 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
705 bits (insn, 0, 7));
706 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
707 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
708 && pv_is_constant (regs[bits (insn, 3, 5)]))
709 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
710 regs[bits (insn, 6, 8)]);
711 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
712 && pv_is_constant (regs[bits (insn, 3, 6)]))
713 {
714 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
715 int rm = bits (insn, 3, 6);
716 regs[rd] = pv_add (regs[rd], regs[rm]);
717 }
718 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
719 {
720 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
721 int src_reg = (insn & 0x78) >> 3;
722 regs[dst_reg] = regs[src_reg];
723 }
724 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
725 {
726 /* Handle stores to the stack. Normally pushes are used,
727 but with GCC -mtpcs-frame, there may be other stores
728 in the prologue to create the frame. */
729 int regno = (insn >> 8) & 0x7;
730 pv_t addr;
731
732 offset = (insn & 0xff) << 2;
733 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
734
735 if (stack.store_would_trash (addr))
736 break;
737
738 stack.store (addr, 4, regs[regno]);
739 }
740 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
741 {
742 int rd = bits (insn, 0, 2);
743 int rn = bits (insn, 3, 5);
744 pv_t addr;
745
746 offset = bits (insn, 6, 10) << 2;
747 addr = pv_add_constant (regs[rn], offset);
748
749 if (stack.store_would_trash (addr))
750 break;
751
752 stack.store (addr, 4, regs[rd]);
753 }
754 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
755 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
756 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
757 /* Ignore stores of argument registers to the stack. */
758 ;
759 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
760 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
761 /* Ignore block loads from the stack, potentially copying
762 parameters from memory. */
763 ;
764 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
765 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
766 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
767 /* Similarly ignore single loads from the stack. */
768 ;
769 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
770 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
771 /* Skip register copies, i.e. saves to another register
772 instead of the stack. */
773 ;
774 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
775 /* Recognize constant loads; even with small stacks these are necessary
776 on Thumb. */
777 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
778 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
779 {
780 /* Constant pool loads, for the same reason. */
781 unsigned int constant;
782 CORE_ADDR loc;
783
784 loc = start + 4 + bits (insn, 0, 7) * 4;
785 constant = read_memory_unsigned_integer (loc, 4, byte_order);
786 regs[bits (insn, 8, 10)] = pv_constant (constant);
787 }
788 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
789 {
790 unsigned short inst2;
791
792 inst2 = read_code_unsigned_integer (start + 2, 2,
793 byte_order_for_code);
794
795 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
796 {
797 /* BL, BLX. Allow some special function calls when
798 skipping the prologue; GCC generates these before
799 storing arguments to the stack. */
800 CORE_ADDR nextpc;
801 int j1, j2, imm1, imm2;
802
803 imm1 = sbits (insn, 0, 10);
804 imm2 = bits (inst2, 0, 10);
805 j1 = bit (inst2, 13);
806 j2 = bit (inst2, 11);
807
808 offset = ((imm1 << 12) + (imm2 << 1));
809 offset ^= ((!j2) << 22) | ((!j1) << 23);
810
811 nextpc = start + 4 + offset;
812 /* For BLX make sure to clear the low bits. */
813 if (bit (inst2, 12) == 0)
814 nextpc = nextpc & 0xfffffffc;
815
816 if (!skip_prologue_function (gdbarch, nextpc,
817 bit (inst2, 12) != 0))
818 break;
819 }
820
821 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
822 { registers } */
823 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
824 {
825 pv_t addr = regs[bits (insn, 0, 3)];
826 int regno;
827
828 if (stack.store_would_trash (addr))
829 break;
830
831 /* Calculate offsets of saved registers. */
832 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
833 if (inst2 & (1 << regno))
834 {
835 addr = pv_add_constant (addr, -4);
836 stack.store (addr, 4, regs[regno]);
837 }
838
839 if (insn & 0x0020)
840 regs[bits (insn, 0, 3)] = addr;
841 }
842
843 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
844 [Rn, #+/-imm]{!} */
845 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
846 {
847 int regno1 = bits (inst2, 12, 15);
848 int regno2 = bits (inst2, 8, 11);
849 pv_t addr = regs[bits (insn, 0, 3)];
850
851 offset = inst2 & 0xff;
852 if (insn & 0x0080)
853 addr = pv_add_constant (addr, offset);
854 else
855 addr = pv_add_constant (addr, -offset);
856
857 if (stack.store_would_trash (addr))
858 break;
859
860 stack.store (addr, 4, regs[regno1]);
861 stack.store (pv_add_constant (addr, 4),
862 4, regs[regno2]);
863
864 if (insn & 0x0020)
865 regs[bits (insn, 0, 3)] = addr;
866 }
867
868 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
869 && (inst2 & 0x0c00) == 0x0c00
870 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
871 {
872 int regno = bits (inst2, 12, 15);
873 pv_t addr = regs[bits (insn, 0, 3)];
874
875 offset = inst2 & 0xff;
876 if (inst2 & 0x0200)
877 addr = pv_add_constant (addr, offset);
878 else
879 addr = pv_add_constant (addr, -offset);
880
881 if (stack.store_would_trash (addr))
882 break;
883
884 stack.store (addr, 4, regs[regno]);
885
886 if (inst2 & 0x0100)
887 regs[bits (insn, 0, 3)] = addr;
888 }
889
890 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
891 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
892 {
893 int regno = bits (inst2, 12, 15);
894 pv_t addr;
895
896 offset = inst2 & 0xfff;
897 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
898
899 if (stack.store_would_trash (addr))
900 break;
901
902 stack.store (addr, 4, regs[regno]);
903 }
904
905 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
906 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
907 /* Ignore stores of argument registers to the stack. */
908 ;
909
910 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
911 && (inst2 & 0x0d00) == 0x0c00
912 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
913 /* Ignore stores of argument registers to the stack. */
914 ;
915
916 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
917 { registers } */
918 && (inst2 & 0x8000) == 0x0000
919 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
920 /* Ignore block loads from the stack, potentially copying
921 parameters from memory. */
922 ;
923
924 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
925 [Rn, #+/-imm] */
926 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
927 /* Similarly ignore dual loads from the stack. */
928 ;
929
930 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
931 && (inst2 & 0x0d00) == 0x0c00
932 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
933 /* Similarly ignore single loads from the stack. */
934 ;
935
936 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
937 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
938 /* Similarly ignore single loads from the stack. */
939 ;
940
941 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
942 && (inst2 & 0x8000) == 0x0000)
943 {
944 unsigned int imm = ((bits (insn, 10, 10) << 11)
945 | (bits (inst2, 12, 14) << 8)
946 | bits (inst2, 0, 7));
947
948 regs[bits (inst2, 8, 11)]
949 = pv_add_constant (regs[bits (insn, 0, 3)],
950 thumb_expand_immediate (imm));
951 }
952
953 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
954 && (inst2 & 0x8000) == 0x0000)
955 {
956 unsigned int imm = ((bits (insn, 10, 10) << 11)
957 | (bits (inst2, 12, 14) << 8)
958 | bits (inst2, 0, 7));
959
960 regs[bits (inst2, 8, 11)]
961 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
962 }
963
964 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
965 && (inst2 & 0x8000) == 0x0000)
966 {
967 unsigned int imm = ((bits (insn, 10, 10) << 11)
968 | (bits (inst2, 12, 14) << 8)
969 | bits (inst2, 0, 7));
970
971 regs[bits (inst2, 8, 11)]
972 = pv_add_constant (regs[bits (insn, 0, 3)],
973 - (CORE_ADDR) thumb_expand_immediate (imm));
974 }
975
976 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
977 && (inst2 & 0x8000) == 0x0000)
978 {
979 unsigned int imm = ((bits (insn, 10, 10) << 11)
980 | (bits (inst2, 12, 14) << 8)
981 | bits (inst2, 0, 7));
982
983 regs[bits (inst2, 8, 11)]
984 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
985 }
986
987 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
988 {
989 unsigned int imm = ((bits (insn, 10, 10) << 11)
990 | (bits (inst2, 12, 14) << 8)
991 | bits (inst2, 0, 7));
992
993 regs[bits (inst2, 8, 11)]
994 = pv_constant (thumb_expand_immediate (imm));
995 }
996
997 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
998 {
999 unsigned int imm
1000 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
1001
1002 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1003 }
1004
1005 else if (insn == 0xea5f /* mov.w Rd,Rm */
1006 && (inst2 & 0xf0f0) == 0)
1007 {
1008 int dst_reg = (inst2 & 0x0f00) >> 8;
1009 int src_reg = inst2 & 0xf;
1010 regs[dst_reg] = regs[src_reg];
1011 }
1012
1013 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1014 {
1015 /* Constant pool loads. */
1016 unsigned int constant;
1017 CORE_ADDR loc;
1018
1019 offset = bits (inst2, 0, 11);
1020 if (insn & 0x0080)
1021 loc = start + 4 + offset;
1022 else
1023 loc = start + 4 - offset;
1024
1025 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1026 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1027 }
1028
1029 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1030 {
1031 /* Constant pool loads. */
1032 unsigned int constant;
1033 CORE_ADDR loc;
1034
1035 offset = bits (inst2, 0, 7) << 2;
1036 if (insn & 0x0080)
1037 loc = start + 4 + offset;
1038 else
1039 loc = start + 4 - offset;
1040
1041 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1042 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1043
1044 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1045 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1046 }
1047
1048 else if (thumb2_instruction_changes_pc (insn, inst2))
1049 {
1050 /* Don't scan past anything that might change control flow. */
1051 break;
1052 }
1053 else
1054 {
1055 /* The optimizer might shove anything into the prologue,
1056 so we just skip what we don't recognize. */
1057 unrecognized_pc = start;
1058 }
1059
1060 start += 2;
1061 }
1062 else if (thumb_instruction_changes_pc (insn))
1063 {
1064 /* Don't scan past anything that might change control flow. */
1065 break;
1066 }
1067 else
1068 {
1069 /* The optimizer might shove anything into the prologue,
1070 so we just skip what we don't recognize. */
1071 unrecognized_pc = start;
1072 }
1073
1074 start += 2;
1075 }
1076
1077 if (arm_debug)
1078 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1079 paddress (gdbarch, start));
1080
1081 if (unrecognized_pc == 0)
1082 unrecognized_pc = start;
1083
1084 if (cache == NULL)
1085 return unrecognized_pc;
1086
1087 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1088 {
1089 /* Frame pointer is fp. Frame size is constant. */
1090 cache->framereg = ARM_FP_REGNUM;
1091 cache->framesize = -regs[ARM_FP_REGNUM].k;
1092 }
1093 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1094 {
1095 /* Frame pointer is r7. Frame size is constant. */
1096 cache->framereg = THUMB_FP_REGNUM;
1097 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1098 }
1099 else
1100 {
1101 /* Try the stack pointer... this is a bit desperate. */
1102 cache->framereg = ARM_SP_REGNUM;
1103 cache->framesize = -regs[ARM_SP_REGNUM].k;
1104 }
1105
1106 for (i = 0; i < 16; i++)
1107 if (stack.find_reg (gdbarch, i, &offset))
1108 cache->saved_regs[i].addr = offset;
1109
1110 return unrecognized_pc;
1111 }
1112
1113
1114 /* Try to analyze the instructions starting from PC, which load symbol
1115 __stack_chk_guard. Return the address of instruction after loading this
1116 symbol, set the dest register number to *BASEREG, and set the size of
1117 instructions for loading symbol in OFFSET. Return 0 if instructions are
1118 not recognized. */
1119
1120 static CORE_ADDR
1121 arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1122 unsigned int *destreg, int *offset)
1123 {
1124 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1125 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1126 unsigned int low, high, address;
1127
1128 address = 0;
1129 if (is_thumb)
1130 {
1131 unsigned short insn1
1132 = read_code_unsigned_integer (pc, 2, byte_order_for_code);
1133
1134 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1135 {
1136 *destreg = bits (insn1, 8, 10);
1137 *offset = 2;
1138 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1139 address = read_memory_unsigned_integer (address, 4,
1140 byte_order_for_code);
1141 }
1142 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1143 {
1144 unsigned short insn2
1145 = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
1146
1147 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1148
1149 insn1
1150 = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
1151 insn2
1152 = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
1153
1154 /* movt Rd, #const */
1155 if ((insn1 & 0xfbc0) == 0xf2c0)
1156 {
1157 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1158 *destreg = bits (insn2, 8, 11);
1159 *offset = 8;
1160 address = (high << 16 | low);
1161 }
1162 }
1163 }
1164 else
1165 {
1166 unsigned int insn
1167 = read_code_unsigned_integer (pc, 4, byte_order_for_code);
1168
1169 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
1170 {
1171 address = bits (insn, 0, 11) + pc + 8;
1172 address = read_memory_unsigned_integer (address, 4,
1173 byte_order_for_code);
1174
1175 *destreg = bits (insn, 12, 15);
1176 *offset = 4;
1177 }
1178 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1179 {
1180 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1181
1182 insn
1183 = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
1184
1185 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1186 {
1187 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1188 *destreg = bits (insn, 12, 15);
1189 *offset = 8;
1190 address = (high << 16 | low);
1191 }
1192 }
1193 }
1194
1195 return address;
1196 }
1197
1198 /* Try to skip a sequence of instructions used for stack protector. If PC
1199 points to the first instruction of this sequence, return the address of
1200 first instruction after this sequence, otherwise, return original PC.
1201
1202 On arm, this sequence of instructions is composed of mainly three steps,
1203 Step 1: load symbol __stack_chk_guard,
1204 Step 2: load from address of __stack_chk_guard,
1205 Step 3: store it to somewhere else.
1206
1207 Usually, instructions on step 2 and step 3 are the same on various ARM
1208 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1209 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1210 instructions in step 1 vary from different ARM architectures. On ARMv7,
1211 they are,
1212
1213 movw Rn, #:lower16:__stack_chk_guard
1214 movt Rn, #:upper16:__stack_chk_guard
1215
1216 On ARMv5t, it is,
1217
1218 ldr Rn, .Label
1219 ....
1220 .Lable:
1221 .word __stack_chk_guard
1222
1223 Since ldr/str is a very popular instruction, we can't use them as
1224 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1225 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1226 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1227
1228 static CORE_ADDR
1229 arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1230 {
1231 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1232 unsigned int basereg;
1233 struct bound_minimal_symbol stack_chk_guard;
1234 int offset;
1235 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1236 CORE_ADDR addr;
1237
1238 /* Try to parse the instructions in Step 1. */
1239 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1240 &basereg, &offset);
1241 if (!addr)
1242 return pc;
1243
1244 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
1245 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1246 Otherwise, this sequence cannot be for stack protector. */
1247 if (stack_chk_guard.minsym == NULL
1248 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
1249 return pc;
1250
1251 if (is_thumb)
1252 {
1253 unsigned int destreg;
1254 unsigned short insn
1255 = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
1256
1257 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1258 if ((insn & 0xf800) != 0x6800)
1259 return pc;
1260 if (bits (insn, 3, 5) != basereg)
1261 return pc;
1262 destreg = bits (insn, 0, 2);
1263
1264 insn = read_code_unsigned_integer (pc + offset + 2, 2,
1265 byte_order_for_code);
1266 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1267 if ((insn & 0xf800) != 0x6000)
1268 return pc;
1269 if (destreg != bits (insn, 0, 2))
1270 return pc;
1271 }
1272 else
1273 {
1274 unsigned int destreg;
1275 unsigned int insn
1276 = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
1277
1278 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1279 if ((insn & 0x0e500000) != 0x04100000)
1280 return pc;
1281 if (bits (insn, 16, 19) != basereg)
1282 return pc;
1283 destreg = bits (insn, 12, 15);
1284 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1285 insn = read_code_unsigned_integer (pc + offset + 4,
1286 4, byte_order_for_code);
1287 if ((insn & 0x0e500000) != 0x04000000)
1288 return pc;
1289 if (bits (insn, 12, 15) != destreg)
1290 return pc;
1291 }
1292 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1293 on arm. */
1294 if (is_thumb)
1295 return pc + offset + 4;
1296 else
1297 return pc + offset + 8;
1298 }
1299
1300 /* Advance the PC across any function entry prologue instructions to
1301 reach some "real" code.
1302
1303 The APCS (ARM Procedure Call Standard) defines the following
1304 prologue:
1305
1306 mov ip, sp
1307 [stmfd sp!, {a1,a2,a3,a4}]
1308 stmfd sp!, {...,fp,ip,lr,pc}
1309 [stfe f7, [sp, #-12]!]
1310 [stfe f6, [sp, #-12]!]
1311 [stfe f5, [sp, #-12]!]
1312 [stfe f4, [sp, #-12]!]
1313 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
1314
1315 static CORE_ADDR
1316 arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1317 {
1318 CORE_ADDR func_addr, limit_pc;
1319
1320 /* See if we can determine the end of the prologue via the symbol table.
1321 If so, then return either PC, or the PC after the prologue, whichever
1322 is greater. */
1323 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
1324 {
1325 CORE_ADDR post_prologue_pc
1326 = skip_prologue_using_sal (gdbarch, func_addr);
1327 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
1328
1329 if (post_prologue_pc)
1330 post_prologue_pc
1331 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1332
1333
1334 /* GCC always emits a line note before the prologue and another
1335 one after, even if the two are at the same address or on the
1336 same line. Take advantage of this so that we do not need to
1337 know every instruction that might appear in the prologue. We
1338 will have producer information for most binaries; if it is
1339 missing (e.g. for -gstabs), assuming the GNU tools. */
1340 if (post_prologue_pc
1341 && (cust == NULL
1342 || COMPUNIT_PRODUCER (cust) == NULL
1343 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1344 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
1345 return post_prologue_pc;
1346
1347 if (post_prologue_pc != 0)
1348 {
1349 CORE_ADDR analyzed_limit;
1350
1351 /* For non-GCC compilers, make sure the entire line is an
1352 acceptable prologue; GDB will round this function's
1353 return value up to the end of the following line so we
1354 can not skip just part of a line (and we do not want to).
1355
1356 RealView does not treat the prologue specially, but does
1357 associate prologue code with the opening brace; so this
1358 lets us skip the first line if we think it is the opening
1359 brace. */
1360 if (arm_pc_is_thumb (gdbarch, func_addr))
1361 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1362 post_prologue_pc, NULL);
1363 else
1364 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1365 post_prologue_pc, NULL);
1366
1367 if (analyzed_limit != post_prologue_pc)
1368 return func_addr;
1369
1370 return post_prologue_pc;
1371 }
1372 }
1373
1374 /* Can't determine prologue from the symbol table, need to examine
1375 instructions. */
1376
1377 /* Find an upper limit on the function prologue using the debug
1378 information. If the debug information could not be used to provide
1379 that bound, then use an arbitrary large number as the upper bound. */
1380 /* Like arm_scan_prologue, stop no later than pc + 64. */
1381 limit_pc = skip_prologue_using_sal (gdbarch, pc);
1382 if (limit_pc == 0)
1383 limit_pc = pc + 64; /* Magic. */
1384
1385
1386 /* Check if this is Thumb code. */
1387 if (arm_pc_is_thumb (gdbarch, pc))
1388 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
1389 else
1390 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
1391 }
1392
1393 /* *INDENT-OFF* */
1394 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1395 This function decodes a Thumb function prologue to determine:
1396 1) the size of the stack frame
1397 2) which registers are saved on it
1398 3) the offsets of saved regs
1399 4) the offset from the stack pointer to the frame pointer
1400
1401 A typical Thumb function prologue would create this stack frame
1402 (offsets relative to FP)
1403 old SP -> 24 stack parameters
1404 20 LR
1405 16 R7
1406 R7 -> 0 local variables (16 bytes)
1407 SP -> -12 additional stack space (12 bytes)
1408 The frame size would thus be 36 bytes, and the frame offset would be
1409 12 bytes. The frame register is R7.
1410
1411 The comments for thumb_skip_prolog() describe the algorithm we use
1412 to detect the end of the prolog. */
1413 /* *INDENT-ON* */
1414
1415 static void
1416 thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
1417 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
1418 {
1419 CORE_ADDR prologue_start;
1420 CORE_ADDR prologue_end;
1421
1422 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1423 &prologue_end))
1424 {
1425 /* See comment in arm_scan_prologue for an explanation of
1426 this heuristics. */
1427 if (prologue_end > prologue_start + 64)
1428 {
1429 prologue_end = prologue_start + 64;
1430 }
1431 }
1432 else
1433 /* We're in the boondocks: we have no idea where the start of the
1434 function is. */
1435 return;
1436
1437 prologue_end = std::min (prologue_end, prev_pc);
1438
1439 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
1440 }
1441
1442 /* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1443 otherwise. */
1444
1445 static int
1446 arm_instruction_restores_sp (unsigned int insn)
1447 {
1448 if (bits (insn, 28, 31) != INST_NV)
1449 {
1450 if ((insn & 0x0df0f000) == 0x0080d000
1451 /* ADD SP (register or immediate). */
1452 || (insn & 0x0df0f000) == 0x0040d000
1453 /* SUB SP (register or immediate). */
1454 || (insn & 0x0ffffff0) == 0x01a0d000
1455 /* MOV SP. */
1456 || (insn & 0x0fff0000) == 0x08bd0000
1457 /* POP (LDMIA). */
1458 || (insn & 0x0fff0000) == 0x049d0000)
1459 /* POP of a single register. */
1460 return 1;
1461 }
1462
1463 return 0;
1464 }
1465
1466 /* Analyze an ARM mode prologue starting at PROLOGUE_START and
1467 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1468 fill it in. Return the first address not recognized as a prologue
1469 instruction.
1470
1471 We recognize all the instructions typically found in ARM prologues,
1472 plus harmless instructions which can be skipped (either for analysis
1473 purposes, or a more restrictive set that can be skipped when finding
1474 the end of the prologue). */
1475
1476 static CORE_ADDR
1477 arm_analyze_prologue (struct gdbarch *gdbarch,
1478 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1479 struct arm_prologue_cache *cache)
1480 {
1481 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1482 int regno;
1483 CORE_ADDR offset, current_pc;
1484 pv_t regs[ARM_FPS_REGNUM];
1485 CORE_ADDR unrecognized_pc = 0;
1486
1487 /* Search the prologue looking for instructions that set up the
1488 frame pointer, adjust the stack pointer, and save registers.
1489
1490 Be careful, however, and if it doesn't look like a prologue,
1491 don't try to scan it. If, for instance, a frameless function
1492 begins with stmfd sp!, then we will tell ourselves there is
1493 a frame, which will confuse stack traceback, as well as "finish"
1494 and other operations that rely on a knowledge of the stack
1495 traceback. */
1496
1497 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1498 regs[regno] = pv_register (regno, 0);
1499 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1500
1501 for (current_pc = prologue_start;
1502 current_pc < prologue_end;
1503 current_pc += 4)
1504 {
1505 unsigned int insn
1506 = read_code_unsigned_integer (current_pc, 4, byte_order_for_code);
1507
1508 if (insn == 0xe1a0c00d) /* mov ip, sp */
1509 {
1510 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
1511 continue;
1512 }
1513 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1514 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1515 {
1516 unsigned imm = insn & 0xff; /* immediate value */
1517 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
1518 int rd = bits (insn, 12, 15);
1519 imm = (imm >> rot) | (imm << (32 - rot));
1520 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
1521 continue;
1522 }
1523 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1524 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1525 {
1526 unsigned imm = insn & 0xff; /* immediate value */
1527 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
1528 int rd = bits (insn, 12, 15);
1529 imm = (imm >> rot) | (imm << (32 - rot));
1530 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
1531 continue;
1532 }
1533 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1534 [sp, #-4]! */
1535 {
1536 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1537 break;
1538 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
1539 stack.store (regs[ARM_SP_REGNUM], 4,
1540 regs[bits (insn, 12, 15)]);
1541 continue;
1542 }
1543 else if ((insn & 0xffff0000) == 0xe92d0000)
1544 /* stmfd sp!, {..., fp, ip, lr, pc}
1545 or
1546 stmfd sp!, {a1, a2, a3, a4} */
1547 {
1548 int mask = insn & 0xffff;
1549
1550 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1551 break;
1552
1553 /* Calculate offsets of saved registers. */
1554 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
1555 if (mask & (1 << regno))
1556 {
1557 regs[ARM_SP_REGNUM]
1558 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
1559 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
1560 }
1561 }
1562 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1563 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
1564 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
1565 {
1566 /* No need to add this to saved_regs -- it's just an arg reg. */
1567 continue;
1568 }
1569 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1570 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
1571 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
1572 {
1573 /* No need to add this to saved_regs -- it's just an arg reg. */
1574 continue;
1575 }
1576 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1577 { registers } */
1578 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1579 {
1580 /* No need to add this to saved_regs -- it's just arg regs. */
1581 continue;
1582 }
1583 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1584 {
1585 unsigned imm = insn & 0xff; /* immediate value */
1586 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
1587 imm = (imm >> rot) | (imm << (32 - rot));
1588 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
1589 }
1590 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1591 {
1592 unsigned imm = insn & 0xff; /* immediate value */
1593 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
1594 imm = (imm >> rot) | (imm << (32 - rot));
1595 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
1596 }
1597 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1598 [sp, -#c]! */
1599 && gdbarch_tdep (gdbarch)->have_fpa_registers)
1600 {
1601 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1602 break;
1603
1604 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1605 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
1606 stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
1607 }
1608 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1609 [sp!] */
1610 && gdbarch_tdep (gdbarch)->have_fpa_registers)
1611 {
1612 int n_saved_fp_regs;
1613 unsigned int fp_start_reg, fp_bound_reg;
1614
1615 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1616 break;
1617
1618 if ((insn & 0x800) == 0x800) /* N0 is set */
1619 {
1620 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1621 n_saved_fp_regs = 3;
1622 else
1623 n_saved_fp_regs = 1;
1624 }
1625 else
1626 {
1627 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1628 n_saved_fp_regs = 2;
1629 else
1630 n_saved_fp_regs = 4;
1631 }
1632
1633 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
1634 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1635 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
1636 {
1637 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1638 stack.store (regs[ARM_SP_REGNUM], 12,
1639 regs[fp_start_reg++]);
1640 }
1641 }
1642 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1643 {
1644 /* Allow some special function calls when skipping the
1645 prologue; GCC generates these before storing arguments to
1646 the stack. */
1647 CORE_ADDR dest = BranchDest (current_pc, insn);
1648
1649 if (skip_prologue_function (gdbarch, dest, 0))
1650 continue;
1651 else
1652 break;
1653 }
1654 else if ((insn & 0xf0000000) != 0xe0000000)
1655 break; /* Condition not true, exit early. */
1656 else if (arm_instruction_changes_pc (insn))
1657 /* Don't scan past anything that might change control flow. */
1658 break;
1659 else if (arm_instruction_restores_sp (insn))
1660 {
1661 /* Don't scan past the epilogue. */
1662 break;
1663 }
1664 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1665 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1666 /* Ignore block loads from the stack, potentially copying
1667 parameters from memory. */
1668 continue;
1669 else if ((insn & 0xfc500000) == 0xe4100000
1670 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1671 /* Similarly ignore single loads from the stack. */
1672 continue;
1673 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1674 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1675 register instead of the stack. */
1676 continue;
1677 else
1678 {
1679 /* The optimizer might shove anything into the prologue, if
1680 we build up cache (cache != NULL) from scanning prologue,
1681 we just skip what we don't recognize and scan further to
1682 make cache as complete as possible. However, if we skip
1683 prologue, we'll stop immediately on unrecognized
1684 instruction. */
1685 unrecognized_pc = current_pc;
1686 if (cache != NULL)
1687 continue;
1688 else
1689 break;
1690 }
1691 }
1692
1693 if (unrecognized_pc == 0)
1694 unrecognized_pc = current_pc;
1695
1696 if (cache)
1697 {
1698 int framereg, framesize;
1699
1700 /* The frame size is just the distance from the frame register
1701 to the original stack pointer. */
1702 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1703 {
1704 /* Frame pointer is fp. */
1705 framereg = ARM_FP_REGNUM;
1706 framesize = -regs[ARM_FP_REGNUM].k;
1707 }
1708 else
1709 {
1710 /* Try the stack pointer... this is a bit desperate. */
1711 framereg = ARM_SP_REGNUM;
1712 framesize = -regs[ARM_SP_REGNUM].k;
1713 }
1714
1715 cache->framereg = framereg;
1716 cache->framesize = framesize;
1717
1718 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1719 if (stack.find_reg (gdbarch, regno, &offset))
1720 cache->saved_regs[regno].addr = offset;
1721 }
1722
1723 if (arm_debug)
1724 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1725 paddress (gdbarch, unrecognized_pc));
1726
1727 return unrecognized_pc;
1728 }
1729
1730 static void
1731 arm_scan_prologue (struct frame_info *this_frame,
1732 struct arm_prologue_cache *cache)
1733 {
1734 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1735 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1736 CORE_ADDR prologue_start, prologue_end;
1737 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1738 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
1739
1740 /* Assume there is no frame until proven otherwise. */
1741 cache->framereg = ARM_SP_REGNUM;
1742 cache->framesize = 0;
1743
1744 /* Check for Thumb prologue. */
1745 if (arm_frame_is_thumb (this_frame))
1746 {
1747 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1748 return;
1749 }
1750
1751 /* Find the function prologue. If we can't find the function in
1752 the symbol table, peek in the stack frame to find the PC. */
1753 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1754 &prologue_end))
1755 {
1756 /* One way to find the end of the prologue (which works well
1757 for unoptimized code) is to do the following:
1758
1759 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1760
1761 if (sal.line == 0)
1762 prologue_end = prev_pc;
1763 else if (sal.end < prologue_end)
1764 prologue_end = sal.end;
1765
1766 This mechanism is very accurate so long as the optimizer
1767 doesn't move any instructions from the function body into the
1768 prologue. If this happens, sal.end will be the last
1769 instruction in the first hunk of prologue code just before
1770 the first instruction that the scheduler has moved from
1771 the body to the prologue.
1772
1773 In order to make sure that we scan all of the prologue
1774 instructions, we use a slightly less accurate mechanism which
1775 may scan more than necessary. To help compensate for this
1776 lack of accuracy, the prologue scanning loop below contains
1777 several clauses which'll cause the loop to terminate early if
1778 an implausible prologue instruction is encountered.
1779
1780 The expression
1781
1782 prologue_start + 64
1783
1784 is a suitable endpoint since it accounts for the largest
1785 possible prologue plus up to five instructions inserted by
1786 the scheduler. */
1787
1788 if (prologue_end > prologue_start + 64)
1789 {
1790 prologue_end = prologue_start + 64; /* See above. */
1791 }
1792 }
1793 else
1794 {
1795 /* We have no symbol information. Our only option is to assume this
1796 function has a standard stack frame and the normal frame register.
1797 Then, we can find the value of our frame pointer on entrance to
1798 the callee (or at the present moment if this is the innermost frame).
1799 The value stored there should be the address of the stmfd + 8. */
1800 CORE_ADDR frame_loc;
1801 ULONGEST return_value;
1802
1803 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1804 if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
1805 &return_value))
1806 return;
1807 else
1808 {
1809 prologue_start = gdbarch_addr_bits_remove
1810 (gdbarch, return_value) - 8;
1811 prologue_end = prologue_start + 64; /* See above. */
1812 }
1813 }
1814
1815 if (prev_pc < prologue_end)
1816 prologue_end = prev_pc;
1817
1818 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
1819 }
1820
1821 static struct arm_prologue_cache *
1822 arm_make_prologue_cache (struct frame_info *this_frame)
1823 {
1824 int reg;
1825 struct arm_prologue_cache *cache;
1826 CORE_ADDR unwound_fp;
1827
1828 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
1829 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
1830
1831 arm_scan_prologue (this_frame, cache);
1832
1833 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
1834 if (unwound_fp == 0)
1835 return cache;
1836
1837 cache->prev_sp = unwound_fp + cache->framesize;
1838
1839 /* Calculate actual addresses of saved registers using offsets
1840 determined by arm_scan_prologue. */
1841 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
1842 if (trad_frame_addr_p (cache->saved_regs, reg))
1843 cache->saved_regs[reg].addr += cache->prev_sp;
1844
1845 return cache;
1846 }
1847
1848 /* Implementation of the stop_reason hook for arm_prologue frames. */
1849
1850 static enum unwind_stop_reason
1851 arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1852 void **this_cache)
1853 {
1854 struct arm_prologue_cache *cache;
1855 CORE_ADDR pc;
1856
1857 if (*this_cache == NULL)
1858 *this_cache = arm_make_prologue_cache (this_frame);
1859 cache = (struct arm_prologue_cache *) *this_cache;
1860
1861 /* This is meant to halt the backtrace at "_start". */
1862 pc = get_frame_pc (this_frame);
1863 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1864 return UNWIND_OUTERMOST;
1865
1866 /* If we've hit a wall, stop. */
1867 if (cache->prev_sp == 0)
1868 return UNWIND_OUTERMOST;
1869
1870 return UNWIND_NO_REASON;
1871 }
1872
1873 /* Our frame ID for a normal frame is the current function's starting PC
1874 and the caller's SP when we were called. */
1875
1876 static void
1877 arm_prologue_this_id (struct frame_info *this_frame,
1878 void **this_cache,
1879 struct frame_id *this_id)
1880 {
1881 struct arm_prologue_cache *cache;
1882 struct frame_id id;
1883 CORE_ADDR pc, func;
1884
1885 if (*this_cache == NULL)
1886 *this_cache = arm_make_prologue_cache (this_frame);
1887 cache = (struct arm_prologue_cache *) *this_cache;
1888
1889 /* Use function start address as part of the frame ID. If we cannot
1890 identify the start address (due to missing symbol information),
1891 fall back to just using the current PC. */
1892 pc = get_frame_pc (this_frame);
1893 func = get_frame_func (this_frame);
1894 if (!func)
1895 func = pc;
1896
1897 id = frame_id_build (cache->prev_sp, func);
1898 *this_id = id;
1899 }
1900
1901 static struct value *
1902 arm_prologue_prev_register (struct frame_info *this_frame,
1903 void **this_cache,
1904 int prev_regnum)
1905 {
1906 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1907 struct arm_prologue_cache *cache;
1908
1909 if (*this_cache == NULL)
1910 *this_cache = arm_make_prologue_cache (this_frame);
1911 cache = (struct arm_prologue_cache *) *this_cache;
1912
1913 /* If we are asked to unwind the PC, then we need to return the LR
1914 instead. The prologue may save PC, but it will point into this
1915 frame's prologue, not the next frame's resume location. Also
1916 strip the saved T bit. A valid LR may have the low bit set, but
1917 a valid PC never does. */
1918 if (prev_regnum == ARM_PC_REGNUM)
1919 {
1920 CORE_ADDR lr;
1921
1922 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1923 return frame_unwind_got_constant (this_frame, prev_regnum,
1924 arm_addr_bits_remove (gdbarch, lr));
1925 }
1926
1927 /* SP is generally not saved to the stack, but this frame is
1928 identified by the next frame's stack pointer at the time of the call.
1929 The value was already reconstructed into PREV_SP. */
1930 if (prev_regnum == ARM_SP_REGNUM)
1931 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
1932
1933 /* The CPSR may have been changed by the call instruction and by the
1934 called function. The only bit we can reconstruct is the T bit,
1935 by checking the low bit of LR as of the call. This is a reliable
1936 indicator of Thumb-ness except for some ARM v4T pre-interworking
1937 Thumb code, which could get away with a clear low bit as long as
1938 the called function did not use bx. Guess that all other
1939 bits are unchanged; the condition flags are presumably lost,
1940 but the processor status is likely valid. */
1941 if (prev_regnum == ARM_PS_REGNUM)
1942 {
1943 CORE_ADDR lr, cpsr;
1944 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
1945
1946 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1947 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1948 if (IS_THUMB_ADDR (lr))
1949 cpsr |= t_bit;
1950 else
1951 cpsr &= ~t_bit;
1952 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1953 }
1954
1955 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1956 prev_regnum);
1957 }
1958
1959 struct frame_unwind arm_prologue_unwind = {
1960 NORMAL_FRAME,
1961 arm_prologue_unwind_stop_reason,
1962 arm_prologue_this_id,
1963 arm_prologue_prev_register,
1964 NULL,
1965 default_frame_sniffer
1966 };
1967
1968 /* Maintain a list of ARM exception table entries per objfile, similar to the
1969 list of mapping symbols. We only cache entries for standard ARM-defined
1970 personality routines; the cache will contain only the frame unwinding
1971 instructions associated with the entry (not the descriptors). */
1972
1973 static const struct objfile_data *arm_exidx_data_key;
1974
1975 struct arm_exidx_entry
1976 {
1977 bfd_vma addr;
1978 gdb_byte *entry;
1979 };
1980 typedef struct arm_exidx_entry arm_exidx_entry_s;
1981 DEF_VEC_O(arm_exidx_entry_s);
1982
1983 struct arm_exidx_data
1984 {
1985 VEC(arm_exidx_entry_s) **section_maps;
1986 };
1987
1988 static void
1989 arm_exidx_data_free (struct objfile *objfile, void *arg)
1990 {
1991 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
1992 unsigned int i;
1993
1994 for (i = 0; i < objfile->obfd->section_count; i++)
1995 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
1996 }
1997
1998 static inline int
1999 arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
2000 const struct arm_exidx_entry *rhs)
2001 {
2002 return lhs->addr < rhs->addr;
2003 }
2004
2005 static struct obj_section *
2006 arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2007 {
2008 struct obj_section *osect;
2009
2010 ALL_OBJFILE_OSECTIONS (objfile, osect)
2011 if (bfd_get_section_flags (objfile->obfd,
2012 osect->the_bfd_section) & SEC_ALLOC)
2013 {
2014 bfd_vma start, size;
2015 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
2016 size = bfd_get_section_size (osect->the_bfd_section);
2017
2018 if (start <= vma && vma < start + size)
2019 return osect;
2020 }
2021
2022 return NULL;
2023 }
2024
2025 /* Parse contents of exception table and exception index sections
2026 of OBJFILE, and fill in the exception table entry cache.
2027
2028 For each entry that refers to a standard ARM-defined personality
2029 routine, extract the frame unwinding instructions (from either
2030 the index or the table section). The unwinding instructions
2031 are normalized by:
2032 - extracting them from the rest of the table data
2033 - converting to host endianness
2034 - appending the implicit 0xb0 ("Finish") code
2035
2036 The extracted and normalized instructions are stored for later
2037 retrieval by the arm_find_exidx_entry routine. */
2038
2039 static void
2040 arm_exidx_new_objfile (struct objfile *objfile)
2041 {
2042 struct cleanup *cleanups;
2043 struct arm_exidx_data *data;
2044 asection *exidx, *extab;
2045 bfd_vma exidx_vma = 0, extab_vma = 0;
2046 bfd_size_type exidx_size = 0, extab_size = 0;
2047 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2048 LONGEST i;
2049
2050 /* If we've already touched this file, do nothing. */
2051 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2052 return;
2053 cleanups = make_cleanup (null_cleanup, NULL);
2054
2055 /* Read contents of exception table and index. */
2056 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
2057 if (exidx)
2058 {
2059 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2060 exidx_size = bfd_get_section_size (exidx);
2061 exidx_data = (gdb_byte *) xmalloc (exidx_size);
2062 make_cleanup (xfree, exidx_data);
2063
2064 if (!bfd_get_section_contents (objfile->obfd, exidx,
2065 exidx_data, 0, exidx_size))
2066 {
2067 do_cleanups (cleanups);
2068 return;
2069 }
2070 }
2071
2072 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2073 if (extab)
2074 {
2075 extab_vma = bfd_section_vma (objfile->obfd, extab);
2076 extab_size = bfd_get_section_size (extab);
2077 extab_data = (gdb_byte *) xmalloc (extab_size);
2078 make_cleanup (xfree, extab_data);
2079
2080 if (!bfd_get_section_contents (objfile->obfd, extab,
2081 extab_data, 0, extab_size))
2082 {
2083 do_cleanups (cleanups);
2084 return;
2085 }
2086 }
2087
2088 /* Allocate exception table data structure. */
2089 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2090 set_objfile_data (objfile, arm_exidx_data_key, data);
2091 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2092 objfile->obfd->section_count,
2093 VEC(arm_exidx_entry_s) *);
2094
2095 /* Fill in exception table. */
2096 for (i = 0; i < exidx_size / 8; i++)
2097 {
2098 struct arm_exidx_entry new_exidx_entry;
2099 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2100 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2101 bfd_vma addr = 0, word = 0;
2102 int n_bytes = 0, n_words = 0;
2103 struct obj_section *sec;
2104 gdb_byte *entry = NULL;
2105
2106 /* Extract address of start of function. */
2107 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2108 idx += exidx_vma + i * 8;
2109
2110 /* Find section containing function and compute section offset. */
2111 sec = arm_obj_section_from_vma (objfile, idx);
2112 if (sec == NULL)
2113 continue;
2114 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2115
2116 /* Determine address of exception table entry. */
2117 if (val == 1)
2118 {
2119 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2120 }
2121 else if ((val & 0xff000000) == 0x80000000)
2122 {
2123 /* Exception table entry embedded in .ARM.exidx
2124 -- must be short form. */
2125 word = val;
2126 n_bytes = 3;
2127 }
2128 else if (!(val & 0x80000000))
2129 {
2130 /* Exception table entry in .ARM.extab. */
2131 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2132 addr += exidx_vma + i * 8 + 4;
2133
2134 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2135 {
2136 word = bfd_h_get_32 (objfile->obfd,
2137 extab_data + addr - extab_vma);
2138 addr += 4;
2139
2140 if ((word & 0xff000000) == 0x80000000)
2141 {
2142 /* Short form. */
2143 n_bytes = 3;
2144 }
2145 else if ((word & 0xff000000) == 0x81000000
2146 || (word & 0xff000000) == 0x82000000)
2147 {
2148 /* Long form. */
2149 n_bytes = 2;
2150 n_words = ((word >> 16) & 0xff);
2151 }
2152 else if (!(word & 0x80000000))
2153 {
2154 bfd_vma pers;
2155 struct obj_section *pers_sec;
2156 int gnu_personality = 0;
2157
2158 /* Custom personality routine. */
2159 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2160 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2161
2162 /* Check whether we've got one of the variants of the
2163 GNU personality routines. */
2164 pers_sec = arm_obj_section_from_vma (objfile, pers);
2165 if (pers_sec)
2166 {
2167 static const char *personality[] =
2168 {
2169 "__gcc_personality_v0",
2170 "__gxx_personality_v0",
2171 "__gcj_personality_v0",
2172 "__gnu_objc_personality_v0",
2173 NULL
2174 };
2175
2176 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2177 int k;
2178
2179 for (k = 0; personality[k]; k++)
2180 if (lookup_minimal_symbol_by_pc_name
2181 (pc, personality[k], objfile))
2182 {
2183 gnu_personality = 1;
2184 break;
2185 }
2186 }
2187
2188 /* If so, the next word contains a word count in the high
2189 byte, followed by the same unwind instructions as the
2190 pre-defined forms. */
2191 if (gnu_personality
2192 && addr + 4 <= extab_vma + extab_size)
2193 {
2194 word = bfd_h_get_32 (objfile->obfd,
2195 extab_data + addr - extab_vma);
2196 addr += 4;
2197 n_bytes = 3;
2198 n_words = ((word >> 24) & 0xff);
2199 }
2200 }
2201 }
2202 }
2203
2204 /* Sanity check address. */
2205 if (n_words)
2206 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2207 n_words = n_bytes = 0;
2208
2209 /* The unwind instructions reside in WORD (only the N_BYTES least
2210 significant bytes are valid), followed by N_WORDS words in the
2211 extab section starting at ADDR. */
2212 if (n_bytes || n_words)
2213 {
2214 gdb_byte *p = entry
2215 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2216 n_bytes + n_words * 4 + 1);
2217
2218 while (n_bytes--)
2219 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2220
2221 while (n_words--)
2222 {
2223 word = bfd_h_get_32 (objfile->obfd,
2224 extab_data + addr - extab_vma);
2225 addr += 4;
2226
2227 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2228 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2229 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2230 *p++ = (gdb_byte) (word & 0xff);
2231 }
2232
2233 /* Implied "Finish" to terminate the list. */
2234 *p++ = 0xb0;
2235 }
2236
2237 /* Push entry onto vector. They are guaranteed to always
2238 appear in order of increasing addresses. */
2239 new_exidx_entry.addr = idx;
2240 new_exidx_entry.entry = entry;
2241 VEC_safe_push (arm_exidx_entry_s,
2242 data->section_maps[sec->the_bfd_section->index],
2243 &new_exidx_entry);
2244 }
2245
2246 do_cleanups (cleanups);
2247 }
2248
2249 /* Search for the exception table entry covering MEMADDR. If one is found,
2250 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2251 set *START to the start of the region covered by this entry. */
2252
2253 static gdb_byte *
2254 arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2255 {
2256 struct obj_section *sec;
2257
2258 sec = find_pc_section (memaddr);
2259 if (sec != NULL)
2260 {
2261 struct arm_exidx_data *data;
2262 VEC(arm_exidx_entry_s) *map;
2263 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2264 unsigned int idx;
2265
2266 data = ((struct arm_exidx_data *)
2267 objfile_data (sec->objfile, arm_exidx_data_key));
2268 if (data != NULL)
2269 {
2270 map = data->section_maps[sec->the_bfd_section->index];
2271 if (!VEC_empty (arm_exidx_entry_s, map))
2272 {
2273 struct arm_exidx_entry *map_sym;
2274
2275 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2276 arm_compare_exidx_entries);
2277
2278 /* VEC_lower_bound finds the earliest ordered insertion
2279 point. If the following symbol starts at this exact
2280 address, we use that; otherwise, the preceding
2281 exception table entry covers this address. */
2282 if (idx < VEC_length (arm_exidx_entry_s, map))
2283 {
2284 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2285 if (map_sym->addr == map_key.addr)
2286 {
2287 if (start)
2288 *start = map_sym->addr + obj_section_addr (sec);
2289 return map_sym->entry;
2290 }
2291 }
2292
2293 if (idx > 0)
2294 {
2295 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2296 if (start)
2297 *start = map_sym->addr + obj_section_addr (sec);
2298 return map_sym->entry;
2299 }
2300 }
2301 }
2302 }
2303
2304 return NULL;
2305 }
2306
2307 /* Given the current frame THIS_FRAME, and its associated frame unwinding
2308 instruction list from the ARM exception table entry ENTRY, allocate and
2309 return a prologue cache structure describing how to unwind this frame.
2310
2311 Return NULL if the unwinding instruction list contains a "spare",
2312 "reserved" or "refuse to unwind" instruction as defined in section
2313 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2314 for the ARM Architecture" document. */
2315
2316 static struct arm_prologue_cache *
2317 arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2318 {
2319 CORE_ADDR vsp = 0;
2320 int vsp_valid = 0;
2321
2322 struct arm_prologue_cache *cache;
2323 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2324 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2325
2326 for (;;)
2327 {
2328 gdb_byte insn;
2329
2330 /* Whenever we reload SP, we actually have to retrieve its
2331 actual value in the current frame. */
2332 if (!vsp_valid)
2333 {
2334 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2335 {
2336 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2337 vsp = get_frame_register_unsigned (this_frame, reg);
2338 }
2339 else
2340 {
2341 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2342 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2343 }
2344
2345 vsp_valid = 1;
2346 }
2347
2348 /* Decode next unwind instruction. */
2349 insn = *entry++;
2350
2351 if ((insn & 0xc0) == 0)
2352 {
2353 int offset = insn & 0x3f;
2354 vsp += (offset << 2) + 4;
2355 }
2356 else if ((insn & 0xc0) == 0x40)
2357 {
2358 int offset = insn & 0x3f;
2359 vsp -= (offset << 2) + 4;
2360 }
2361 else if ((insn & 0xf0) == 0x80)
2362 {
2363 int mask = ((insn & 0xf) << 8) | *entry++;
2364 int i;
2365
2366 /* The special case of an all-zero mask identifies
2367 "Refuse to unwind". We return NULL to fall back
2368 to the prologue analyzer. */
2369 if (mask == 0)
2370 return NULL;
2371
2372 /* Pop registers r4..r15 under mask. */
2373 for (i = 0; i < 12; i++)
2374 if (mask & (1 << i))
2375 {
2376 cache->saved_regs[4 + i].addr = vsp;
2377 vsp += 4;
2378 }
2379
2380 /* Special-case popping SP -- we need to reload vsp. */
2381 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2382 vsp_valid = 0;
2383 }
2384 else if ((insn & 0xf0) == 0x90)
2385 {
2386 int reg = insn & 0xf;
2387
2388 /* Reserved cases. */
2389 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2390 return NULL;
2391
2392 /* Set SP from another register and mark VSP for reload. */
2393 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2394 vsp_valid = 0;
2395 }
2396 else if ((insn & 0xf0) == 0xa0)
2397 {
2398 int count = insn & 0x7;
2399 int pop_lr = (insn & 0x8) != 0;
2400 int i;
2401
2402 /* Pop r4..r[4+count]. */
2403 for (i = 0; i <= count; i++)
2404 {
2405 cache->saved_regs[4 + i].addr = vsp;
2406 vsp += 4;
2407 }
2408
2409 /* If indicated by flag, pop LR as well. */
2410 if (pop_lr)
2411 {
2412 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2413 vsp += 4;
2414 }
2415 }
2416 else if (insn == 0xb0)
2417 {
2418 /* We could only have updated PC by popping into it; if so, it
2419 will show up as address. Otherwise, copy LR into PC. */
2420 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2421 cache->saved_regs[ARM_PC_REGNUM]
2422 = cache->saved_regs[ARM_LR_REGNUM];
2423
2424 /* We're done. */
2425 break;
2426 }
2427 else if (insn == 0xb1)
2428 {
2429 int mask = *entry++;
2430 int i;
2431
2432 /* All-zero mask and mask >= 16 is "spare". */
2433 if (mask == 0 || mask >= 16)
2434 return NULL;
2435
2436 /* Pop r0..r3 under mask. */
2437 for (i = 0; i < 4; i++)
2438 if (mask & (1 << i))
2439 {
2440 cache->saved_regs[i].addr = vsp;
2441 vsp += 4;
2442 }
2443 }
2444 else if (insn == 0xb2)
2445 {
2446 ULONGEST offset = 0;
2447 unsigned shift = 0;
2448
2449 do
2450 {
2451 offset |= (*entry & 0x7f) << shift;
2452 shift += 7;
2453 }
2454 while (*entry++ & 0x80);
2455
2456 vsp += 0x204 + (offset << 2);
2457 }
2458 else if (insn == 0xb3)
2459 {
2460 int start = *entry >> 4;
2461 int count = (*entry++) & 0xf;
2462 int i;
2463
2464 /* Only registers D0..D15 are valid here. */
2465 if (start + count >= 16)
2466 return NULL;
2467
2468 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2469 for (i = 0; i <= count; i++)
2470 {
2471 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2472 vsp += 8;
2473 }
2474
2475 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2476 vsp += 4;
2477 }
2478 else if ((insn & 0xf8) == 0xb8)
2479 {
2480 int count = insn & 0x7;
2481 int i;
2482
2483 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2484 for (i = 0; i <= count; i++)
2485 {
2486 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2487 vsp += 8;
2488 }
2489
2490 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2491 vsp += 4;
2492 }
2493 else if (insn == 0xc6)
2494 {
2495 int start = *entry >> 4;
2496 int count = (*entry++) & 0xf;
2497 int i;
2498
2499 /* Only registers WR0..WR15 are valid. */
2500 if (start + count >= 16)
2501 return NULL;
2502
2503 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2504 for (i = 0; i <= count; i++)
2505 {
2506 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2507 vsp += 8;
2508 }
2509 }
2510 else if (insn == 0xc7)
2511 {
2512 int mask = *entry++;
2513 int i;
2514
2515 /* All-zero mask and mask >= 16 is "spare". */
2516 if (mask == 0 || mask >= 16)
2517 return NULL;
2518
2519 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2520 for (i = 0; i < 4; i++)
2521 if (mask & (1 << i))
2522 {
2523 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2524 vsp += 4;
2525 }
2526 }
2527 else if ((insn & 0xf8) == 0xc0)
2528 {
2529 int count = insn & 0x7;
2530 int i;
2531
2532 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2533 for (i = 0; i <= count; i++)
2534 {
2535 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2536 vsp += 8;
2537 }
2538 }
2539 else if (insn == 0xc8)
2540 {
2541 int start = *entry >> 4;
2542 int count = (*entry++) & 0xf;
2543 int i;
2544
2545 /* Only registers D0..D31 are valid. */
2546 if (start + count >= 16)
2547 return NULL;
2548
2549 /* Pop VFP double-precision registers
2550 D[16+start]..D[16+start+count]. */
2551 for (i = 0; i <= count; i++)
2552 {
2553 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2554 vsp += 8;
2555 }
2556 }
2557 else if (insn == 0xc9)
2558 {
2559 int start = *entry >> 4;
2560 int count = (*entry++) & 0xf;
2561 int i;
2562
2563 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2564 for (i = 0; i <= count; i++)
2565 {
2566 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2567 vsp += 8;
2568 }
2569 }
2570 else if ((insn & 0xf8) == 0xd0)
2571 {
2572 int count = insn & 0x7;
2573 int i;
2574
2575 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2576 for (i = 0; i <= count; i++)
2577 {
2578 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2579 vsp += 8;
2580 }
2581 }
2582 else
2583 {
2584 /* Everything else is "spare". */
2585 return NULL;
2586 }
2587 }
2588
2589 /* If we restore SP from a register, assume this was the frame register.
2590 Otherwise just fall back to SP as frame register. */
2591 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2592 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2593 else
2594 cache->framereg = ARM_SP_REGNUM;
2595
2596 /* Determine offset to previous frame. */
2597 cache->framesize
2598 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2599
2600 /* We already got the previous SP. */
2601 cache->prev_sp = vsp;
2602
2603 return cache;
2604 }
2605
2606 /* Unwinding via ARM exception table entries. Note that the sniffer
2607 already computes a filled-in prologue cache, which is then used
2608 with the same arm_prologue_this_id and arm_prologue_prev_register
2609 routines also used for prologue-parsing based unwinding. */
2610
2611 static int
2612 arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2613 struct frame_info *this_frame,
2614 void **this_prologue_cache)
2615 {
2616 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2617 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2618 CORE_ADDR addr_in_block, exidx_region, func_start;
2619 struct arm_prologue_cache *cache;
2620 gdb_byte *entry;
2621
2622 /* See if we have an ARM exception table entry covering this address. */
2623 addr_in_block = get_frame_address_in_block (this_frame);
2624 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2625 if (!entry)
2626 return 0;
2627
2628 /* The ARM exception table does not describe unwind information
2629 for arbitrary PC values, but is guaranteed to be correct only
2630 at call sites. We have to decide here whether we want to use
2631 ARM exception table information for this frame, or fall back
2632 to using prologue parsing. (Note that if we have DWARF CFI,
2633 this sniffer isn't even called -- CFI is always preferred.)
2634
2635 Before we make this decision, however, we check whether we
2636 actually have *symbol* information for the current frame.
2637 If not, prologue parsing would not work anyway, so we might
2638 as well use the exception table and hope for the best. */
2639 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2640 {
2641 int exc_valid = 0;
2642
2643 /* If the next frame is "normal", we are at a call site in this
2644 frame, so exception information is guaranteed to be valid. */
2645 if (get_next_frame (this_frame)
2646 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2647 exc_valid = 1;
2648
2649 /* We also assume exception information is valid if we're currently
2650 blocked in a system call. The system library is supposed to
2651 ensure this, so that e.g. pthread cancellation works. */
2652 if (arm_frame_is_thumb (this_frame))
2653 {
2654 ULONGEST insn;
2655
2656 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 2,
2657 2, byte_order_for_code, &insn)
2658 && (insn & 0xff00) == 0xdf00 /* svc */)
2659 exc_valid = 1;
2660 }
2661 else
2662 {
2663 ULONGEST insn;
2664
2665 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 4,
2666 4, byte_order_for_code, &insn)
2667 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2668 exc_valid = 1;
2669 }
2670
2671 /* Bail out if we don't know that exception information is valid. */
2672 if (!exc_valid)
2673 return 0;
2674
2675 /* The ARM exception index does not mark the *end* of the region
2676 covered by the entry, and some functions will not have any entry.
2677 To correctly recognize the end of the covered region, the linker
2678 should have inserted dummy records with a CANTUNWIND marker.
2679
2680 Unfortunately, current versions of GNU ld do not reliably do
2681 this, and thus we may have found an incorrect entry above.
2682 As a (temporary) sanity check, we only use the entry if it
2683 lies *within* the bounds of the function. Note that this check
2684 might reject perfectly valid entries that just happen to cover
2685 multiple functions; therefore this check ought to be removed
2686 once the linker is fixed. */
2687 if (func_start > exidx_region)
2688 return 0;
2689 }
2690
2691 /* Decode the list of unwinding instructions into a prologue cache.
2692 Note that this may fail due to e.g. a "refuse to unwind" code. */
2693 cache = arm_exidx_fill_cache (this_frame, entry);
2694 if (!cache)
2695 return 0;
2696
2697 *this_prologue_cache = cache;
2698 return 1;
2699 }
2700
2701 struct frame_unwind arm_exidx_unwind = {
2702 NORMAL_FRAME,
2703 default_frame_unwind_stop_reason,
2704 arm_prologue_this_id,
2705 arm_prologue_prev_register,
2706 NULL,
2707 arm_exidx_unwind_sniffer
2708 };
2709
2710 static struct arm_prologue_cache *
2711 arm_make_epilogue_frame_cache (struct frame_info *this_frame)
2712 {
2713 struct arm_prologue_cache *cache;
2714 int reg;
2715
2716 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2717 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2718
2719 /* Still rely on the offset calculated from prologue. */
2720 arm_scan_prologue (this_frame, cache);
2721
2722 /* Since we are in epilogue, the SP has been restored. */
2723 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
2724
2725 /* Calculate actual addresses of saved registers using offsets
2726 determined by arm_scan_prologue. */
2727 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2728 if (trad_frame_addr_p (cache->saved_regs, reg))
2729 cache->saved_regs[reg].addr += cache->prev_sp;
2730
2731 return cache;
2732 }
2733
2734 /* Implementation of function hook 'this_id' in
2735 'struct frame_uwnind' for epilogue unwinder. */
2736
2737 static void
2738 arm_epilogue_frame_this_id (struct frame_info *this_frame,
2739 void **this_cache,
2740 struct frame_id *this_id)
2741 {
2742 struct arm_prologue_cache *cache;
2743 CORE_ADDR pc, func;
2744
2745 if (*this_cache == NULL)
2746 *this_cache = arm_make_epilogue_frame_cache (this_frame);
2747 cache = (struct arm_prologue_cache *) *this_cache;
2748
2749 /* Use function start address as part of the frame ID. If we cannot
2750 identify the start address (due to missing symbol information),
2751 fall back to just using the current PC. */
2752 pc = get_frame_pc (this_frame);
2753 func = get_frame_func (this_frame);
2754 if (func == 0)
2755 func = pc;
2756
2757 (*this_id) = frame_id_build (cache->prev_sp, pc);
2758 }
2759
2760 /* Implementation of function hook 'prev_register' in
2761 'struct frame_uwnind' for epilogue unwinder. */
2762
2763 static struct value *
2764 arm_epilogue_frame_prev_register (struct frame_info *this_frame,
2765 void **this_cache, int regnum)
2766 {
2767 if (*this_cache == NULL)
2768 *this_cache = arm_make_epilogue_frame_cache (this_frame);
2769
2770 return arm_prologue_prev_register (this_frame, this_cache, regnum);
2771 }
2772
2773 static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
2774 CORE_ADDR pc);
2775 static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
2776 CORE_ADDR pc);
2777
2778 /* Implementation of function hook 'sniffer' in
2779 'struct frame_uwnind' for epilogue unwinder. */
2780
2781 static int
2782 arm_epilogue_frame_sniffer (const struct frame_unwind *self,
2783 struct frame_info *this_frame,
2784 void **this_prologue_cache)
2785 {
2786 if (frame_relative_level (this_frame) == 0)
2787 {
2788 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2789 CORE_ADDR pc = get_frame_pc (this_frame);
2790
2791 if (arm_frame_is_thumb (this_frame))
2792 return thumb_stack_frame_destroyed_p (gdbarch, pc);
2793 else
2794 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
2795 }
2796 else
2797 return 0;
2798 }
2799
2800 /* Frame unwinder from epilogue. */
2801
2802 static const struct frame_unwind arm_epilogue_frame_unwind =
2803 {
2804 NORMAL_FRAME,
2805 default_frame_unwind_stop_reason,
2806 arm_epilogue_frame_this_id,
2807 arm_epilogue_frame_prev_register,
2808 NULL,
2809 arm_epilogue_frame_sniffer,
2810 };
2811
2812 /* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2813 trampoline, return the target PC. Otherwise return 0.
2814
2815 void call0a (char c, short s, int i, long l) {}
2816
2817 int main (void)
2818 {
2819 (*pointer_to_call0a) (c, s, i, l);
2820 }
2821
2822 Instead of calling a stub library function _call_via_xx (xx is
2823 the register name), GCC may inline the trampoline in the object
2824 file as below (register r2 has the address of call0a).
2825
2826 .global main
2827 .type main, %function
2828 ...
2829 bl .L1
2830 ...
2831 .size main, .-main
2832
2833 .L1:
2834 bx r2
2835
2836 The trampoline 'bx r2' doesn't belong to main. */
2837
2838 static CORE_ADDR
2839 arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2840 {
2841 /* The heuristics of recognizing such trampoline is that FRAME is
2842 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2843 if (arm_frame_is_thumb (frame))
2844 {
2845 gdb_byte buf[2];
2846
2847 if (target_read_memory (pc, buf, 2) == 0)
2848 {
2849 struct gdbarch *gdbarch = get_frame_arch (frame);
2850 enum bfd_endian byte_order_for_code
2851 = gdbarch_byte_order_for_code (gdbarch);
2852 uint16_t insn
2853 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2854
2855 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2856 {
2857 CORE_ADDR dest
2858 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2859
2860 /* Clear the LSB so that gdb core sets step-resume
2861 breakpoint at the right address. */
2862 return UNMAKE_THUMB_ADDR (dest);
2863 }
2864 }
2865 }
2866
2867 return 0;
2868 }
2869
2870 static struct arm_prologue_cache *
2871 arm_make_stub_cache (struct frame_info *this_frame)
2872 {
2873 struct arm_prologue_cache *cache;
2874
2875 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2876 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2877
2878 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
2879
2880 return cache;
2881 }
2882
2883 /* Our frame ID for a stub frame is the current SP and LR. */
2884
2885 static void
2886 arm_stub_this_id (struct frame_info *this_frame,
2887 void **this_cache,
2888 struct frame_id *this_id)
2889 {
2890 struct arm_prologue_cache *cache;
2891
2892 if (*this_cache == NULL)
2893 *this_cache = arm_make_stub_cache (this_frame);
2894 cache = (struct arm_prologue_cache *) *this_cache;
2895
2896 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
2897 }
2898
2899 static int
2900 arm_stub_unwind_sniffer (const struct frame_unwind *self,
2901 struct frame_info *this_frame,
2902 void **this_prologue_cache)
2903 {
2904 CORE_ADDR addr_in_block;
2905 gdb_byte dummy[4];
2906 CORE_ADDR pc, start_addr;
2907 const char *name;
2908
2909 addr_in_block = get_frame_address_in_block (this_frame);
2910 pc = get_frame_pc (this_frame);
2911 if (in_plt_section (addr_in_block)
2912 /* We also use the stub winder if the target memory is unreadable
2913 to avoid having the prologue unwinder trying to read it. */
2914 || target_read_memory (pc, dummy, 4) != 0)
2915 return 1;
2916
2917 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2918 && arm_skip_bx_reg (this_frame, pc) != 0)
2919 return 1;
2920
2921 return 0;
2922 }
2923
2924 struct frame_unwind arm_stub_unwind = {
2925 NORMAL_FRAME,
2926 default_frame_unwind_stop_reason,
2927 arm_stub_this_id,
2928 arm_prologue_prev_register,
2929 NULL,
2930 arm_stub_unwind_sniffer
2931 };
2932
2933 /* Put here the code to store, into CACHE->saved_regs, the addresses
2934 of the saved registers of frame described by THIS_FRAME. CACHE is
2935 returned. */
2936
2937 static struct arm_prologue_cache *
2938 arm_m_exception_cache (struct frame_info *this_frame)
2939 {
2940 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2941 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2942 struct arm_prologue_cache *cache;
2943 CORE_ADDR unwound_sp;
2944 LONGEST xpsr;
2945
2946 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2947 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2948
2949 unwound_sp = get_frame_register_unsigned (this_frame,
2950 ARM_SP_REGNUM);
2951
2952 /* The hardware saves eight 32-bit words, comprising xPSR,
2953 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2954 "B1.5.6 Exception entry behavior" in
2955 "ARMv7-M Architecture Reference Manual". */
2956 cache->saved_regs[0].addr = unwound_sp;
2957 cache->saved_regs[1].addr = unwound_sp + 4;
2958 cache->saved_regs[2].addr = unwound_sp + 8;
2959 cache->saved_regs[3].addr = unwound_sp + 12;
2960 cache->saved_regs[12].addr = unwound_sp + 16;
2961 cache->saved_regs[14].addr = unwound_sp + 20;
2962 cache->saved_regs[15].addr = unwound_sp + 24;
2963 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2964
2965 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2966 aligner between the top of the 32-byte stack frame and the
2967 previous context's stack pointer. */
2968 cache->prev_sp = unwound_sp + 32;
2969 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2970 && (xpsr & (1 << 9)) != 0)
2971 cache->prev_sp += 4;
2972
2973 return cache;
2974 }
2975
2976 /* Implementation of function hook 'this_id' in
2977 'struct frame_uwnind'. */
2978
2979 static void
2980 arm_m_exception_this_id (struct frame_info *this_frame,
2981 void **this_cache,
2982 struct frame_id *this_id)
2983 {
2984 struct arm_prologue_cache *cache;
2985
2986 if (*this_cache == NULL)
2987 *this_cache = arm_m_exception_cache (this_frame);
2988 cache = (struct arm_prologue_cache *) *this_cache;
2989
2990 /* Our frame ID for a stub frame is the current SP and LR. */
2991 *this_id = frame_id_build (cache->prev_sp,
2992 get_frame_pc (this_frame));
2993 }
2994
2995 /* Implementation of function hook 'prev_register' in
2996 'struct frame_uwnind'. */
2997
2998 static struct value *
2999 arm_m_exception_prev_register (struct frame_info *this_frame,
3000 void **this_cache,
3001 int prev_regnum)
3002 {
3003 struct arm_prologue_cache *cache;
3004
3005 if (*this_cache == NULL)
3006 *this_cache = arm_m_exception_cache (this_frame);
3007 cache = (struct arm_prologue_cache *) *this_cache;
3008
3009 /* The value was already reconstructed into PREV_SP. */
3010 if (prev_regnum == ARM_SP_REGNUM)
3011 return frame_unwind_got_constant (this_frame, prev_regnum,
3012 cache->prev_sp);
3013
3014 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3015 prev_regnum);
3016 }
3017
3018 /* Implementation of function hook 'sniffer' in
3019 'struct frame_uwnind'. */
3020
3021 static int
3022 arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3023 struct frame_info *this_frame,
3024 void **this_prologue_cache)
3025 {
3026 CORE_ADDR this_pc = get_frame_pc (this_frame);
3027
3028 /* No need to check is_m; this sniffer is only registered for
3029 M-profile architectures. */
3030
3031 /* Check if exception frame returns to a magic PC value. */
3032 return arm_m_addr_is_magic (this_pc);
3033 }
3034
3035 /* Frame unwinder for M-profile exceptions. */
3036
3037 struct frame_unwind arm_m_exception_unwind =
3038 {
3039 SIGTRAMP_FRAME,
3040 default_frame_unwind_stop_reason,
3041 arm_m_exception_this_id,
3042 arm_m_exception_prev_register,
3043 NULL,
3044 arm_m_exception_unwind_sniffer
3045 };
3046
3047 static CORE_ADDR
3048 arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
3049 {
3050 struct arm_prologue_cache *cache;
3051
3052 if (*this_cache == NULL)
3053 *this_cache = arm_make_prologue_cache (this_frame);
3054 cache = (struct arm_prologue_cache *) *this_cache;
3055
3056 return cache->prev_sp - cache->framesize;
3057 }
3058
3059 struct frame_base arm_normal_base = {
3060 &arm_prologue_unwind,
3061 arm_normal_frame_base,
3062 arm_normal_frame_base,
3063 arm_normal_frame_base
3064 };
3065
3066 /* Assuming THIS_FRAME is a dummy, return the frame ID of that
3067 dummy frame. The frame ID's base needs to match the TOS value
3068 saved by save_dummy_frame_tos() and returned from
3069 arm_push_dummy_call, and the PC needs to match the dummy frame's
3070 breakpoint. */
3071
3072 static struct frame_id
3073 arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
3074 {
3075 return frame_id_build (get_frame_register_unsigned (this_frame,
3076 ARM_SP_REGNUM),
3077 get_frame_pc (this_frame));
3078 }
3079
3080 /* Given THIS_FRAME, find the previous frame's resume PC (which will
3081 be used to construct the previous frame's ID, after looking up the
3082 containing function). */
3083
3084 static CORE_ADDR
3085 arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
3086 {
3087 CORE_ADDR pc;
3088 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
3089 return arm_addr_bits_remove (gdbarch, pc);
3090 }
3091
3092 static CORE_ADDR
3093 arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
3094 {
3095 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
3096 }
3097
3098 static struct value *
3099 arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
3100 int regnum)
3101 {
3102 struct gdbarch * gdbarch = get_frame_arch (this_frame);
3103 CORE_ADDR lr, cpsr;
3104 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
3105
3106 switch (regnum)
3107 {
3108 case ARM_PC_REGNUM:
3109 /* The PC is normally copied from the return column, which
3110 describes saves of LR. However, that version may have an
3111 extra bit set to indicate Thumb state. The bit is not
3112 part of the PC. */
3113 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3114 return frame_unwind_got_constant (this_frame, regnum,
3115 arm_addr_bits_remove (gdbarch, lr));
3116
3117 case ARM_PS_REGNUM:
3118 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
3119 cpsr = get_frame_register_unsigned (this_frame, regnum);
3120 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3121 if (IS_THUMB_ADDR (lr))
3122 cpsr |= t_bit;
3123 else
3124 cpsr &= ~t_bit;
3125 return frame_unwind_got_constant (this_frame, regnum, cpsr);
3126
3127 default:
3128 internal_error (__FILE__, __LINE__,
3129 _("Unexpected register %d"), regnum);
3130 }
3131 }
3132
3133 static void
3134 arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3135 struct dwarf2_frame_state_reg *reg,
3136 struct frame_info *this_frame)
3137 {
3138 switch (regnum)
3139 {
3140 case ARM_PC_REGNUM:
3141 case ARM_PS_REGNUM:
3142 reg->how = DWARF2_FRAME_REG_FN;
3143 reg->loc.fn = arm_dwarf2_prev_register;
3144 break;
3145 case ARM_SP_REGNUM:
3146 reg->how = DWARF2_FRAME_REG_CFA;
3147 break;
3148 }
3149 }
3150
3151 /* Implement the stack_frame_destroyed_p gdbarch method. */
3152
3153 static int
3154 thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3155 {
3156 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3157 unsigned int insn, insn2;
3158 int found_return = 0, found_stack_adjust = 0;
3159 CORE_ADDR func_start, func_end;
3160 CORE_ADDR scan_pc;
3161 gdb_byte buf[4];
3162
3163 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3164 return 0;
3165
3166 /* The epilogue is a sequence of instructions along the following lines:
3167
3168 - add stack frame size to SP or FP
3169 - [if frame pointer used] restore SP from FP
3170 - restore registers from SP [may include PC]
3171 - a return-type instruction [if PC wasn't already restored]
3172
3173 In a first pass, we scan forward from the current PC and verify the
3174 instructions we find as compatible with this sequence, ending in a
3175 return instruction.
3176
3177 However, this is not sufficient to distinguish indirect function calls
3178 within a function from indirect tail calls in the epilogue in some cases.
3179 Therefore, if we didn't already find any SP-changing instruction during
3180 forward scan, we add a backward scanning heuristic to ensure we actually
3181 are in the epilogue. */
3182
3183 scan_pc = pc;
3184 while (scan_pc < func_end && !found_return)
3185 {
3186 if (target_read_memory (scan_pc, buf, 2))
3187 break;
3188
3189 scan_pc += 2;
3190 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3191
3192 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3193 found_return = 1;
3194 else if (insn == 0x46f7) /* mov pc, lr */
3195 found_return = 1;
3196 else if (thumb_instruction_restores_sp (insn))
3197 {
3198 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
3199 found_return = 1;
3200 }
3201 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
3202 {
3203 if (target_read_memory (scan_pc, buf, 2))
3204 break;
3205
3206 scan_pc += 2;
3207 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3208
3209 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3210 {
3211 if (insn2 & 0x8000) /* <registers> include PC. */
3212 found_return = 1;
3213 }
3214 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3215 && (insn2 & 0x0fff) == 0x0b04)
3216 {
3217 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3218 found_return = 1;
3219 }
3220 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3221 && (insn2 & 0x0e00) == 0x0a00)
3222 ;
3223 else
3224 break;
3225 }
3226 else
3227 break;
3228 }
3229
3230 if (!found_return)
3231 return 0;
3232
3233 /* Since any instruction in the epilogue sequence, with the possible
3234 exception of return itself, updates the stack pointer, we need to
3235 scan backwards for at most one instruction. Try either a 16-bit or
3236 a 32-bit instruction. This is just a heuristic, so we do not worry
3237 too much about false positives. */
3238
3239 if (pc - 4 < func_start)
3240 return 0;
3241 if (target_read_memory (pc - 4, buf, 4))
3242 return 0;
3243
3244 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3245 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3246
3247 if (thumb_instruction_restores_sp (insn2))
3248 found_stack_adjust = 1;
3249 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3250 found_stack_adjust = 1;
3251 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3252 && (insn2 & 0x0fff) == 0x0b04)
3253 found_stack_adjust = 1;
3254 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3255 && (insn2 & 0x0e00) == 0x0a00)
3256 found_stack_adjust = 1;
3257
3258 return found_stack_adjust;
3259 }
3260
3261 static int
3262 arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
3263 {
3264 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3265 unsigned int insn;
3266 int found_return;
3267 CORE_ADDR func_start, func_end;
3268
3269 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3270 return 0;
3271
3272 /* We are in the epilogue if the previous instruction was a stack
3273 adjustment and the next instruction is a possible return (bx, mov
3274 pc, or pop). We could have to scan backwards to find the stack
3275 adjustment, or forwards to find the return, but this is a decent
3276 approximation. First scan forwards. */
3277
3278 found_return = 0;
3279 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3280 if (bits (insn, 28, 31) != INST_NV)
3281 {
3282 if ((insn & 0x0ffffff0) == 0x012fff10)
3283 /* BX. */
3284 found_return = 1;
3285 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3286 /* MOV PC. */
3287 found_return = 1;
3288 else if ((insn & 0x0fff0000) == 0x08bd0000
3289 && (insn & 0x0000c000) != 0)
3290 /* POP (LDMIA), including PC or LR. */
3291 found_return = 1;
3292 }
3293
3294 if (!found_return)
3295 return 0;
3296
3297 /* Scan backwards. This is just a heuristic, so do not worry about
3298 false positives from mode changes. */
3299
3300 if (pc < func_start + 4)
3301 return 0;
3302
3303 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
3304 if (arm_instruction_restores_sp (insn))
3305 return 1;
3306
3307 return 0;
3308 }
3309
3310 /* Implement the stack_frame_destroyed_p gdbarch method. */
3311
3312 static int
3313 arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3314 {
3315 if (arm_pc_is_thumb (gdbarch, pc))
3316 return thumb_stack_frame_destroyed_p (gdbarch, pc);
3317 else
3318 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3319 }
3320
3321 /* When arguments must be pushed onto the stack, they go on in reverse
3322 order. The code below implements a FILO (stack) to do this. */
3323
3324 struct stack_item
3325 {
3326 int len;
3327 struct stack_item *prev;
3328 gdb_byte *data;
3329 };
3330
3331 static struct stack_item *
3332 push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
3333 {
3334 struct stack_item *si;
3335 si = XNEW (struct stack_item);
3336 si->data = (gdb_byte *) xmalloc (len);
3337 si->len = len;
3338 si->prev = prev;
3339 memcpy (si->data, contents, len);
3340 return si;
3341 }
3342
3343 static struct stack_item *
3344 pop_stack_item (struct stack_item *si)
3345 {
3346 struct stack_item *dead = si;
3347 si = si->prev;
3348 xfree (dead->data);
3349 xfree (dead);
3350 return si;
3351 }
3352
3353
3354 /* Return the alignment (in bytes) of the given type. */
3355
3356 static int
3357 arm_type_align (struct type *t)
3358 {
3359 int n;
3360 int align;
3361 int falign;
3362
3363 t = check_typedef (t);
3364 switch (TYPE_CODE (t))
3365 {
3366 default:
3367 /* Should never happen. */
3368 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3369 return 4;
3370
3371 case TYPE_CODE_PTR:
3372 case TYPE_CODE_ENUM:
3373 case TYPE_CODE_INT:
3374 case TYPE_CODE_FLT:
3375 case TYPE_CODE_SET:
3376 case TYPE_CODE_RANGE:
3377 case TYPE_CODE_REF:
3378 case TYPE_CODE_RVALUE_REF:
3379 case TYPE_CODE_CHAR:
3380 case TYPE_CODE_BOOL:
3381 return TYPE_LENGTH (t);
3382
3383 case TYPE_CODE_ARRAY:
3384 if (TYPE_VECTOR (t))
3385 {
3386 /* Use the natural alignment for vector types (the same for
3387 scalar type), but the maximum alignment is 64-bit. */
3388 if (TYPE_LENGTH (t) > 8)
3389 return 8;
3390 else
3391 return TYPE_LENGTH (t);
3392 }
3393 else
3394 return arm_type_align (TYPE_TARGET_TYPE (t));
3395 case TYPE_CODE_COMPLEX:
3396 return arm_type_align (TYPE_TARGET_TYPE (t));
3397
3398 case TYPE_CODE_STRUCT:
3399 case TYPE_CODE_UNION:
3400 align = 1;
3401 for (n = 0; n < TYPE_NFIELDS (t); n++)
3402 {
3403 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3404 if (falign > align)
3405 align = falign;
3406 }
3407 return align;
3408 }
3409 }
3410
3411 /* Possible base types for a candidate for passing and returning in
3412 VFP registers. */
3413
3414 enum arm_vfp_cprc_base_type
3415 {
3416 VFP_CPRC_UNKNOWN,
3417 VFP_CPRC_SINGLE,
3418 VFP_CPRC_DOUBLE,
3419 VFP_CPRC_VEC64,
3420 VFP_CPRC_VEC128
3421 };
3422
3423 /* The length of one element of base type B. */
3424
3425 static unsigned
3426 arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3427 {
3428 switch (b)
3429 {
3430 case VFP_CPRC_SINGLE:
3431 return 4;
3432 case VFP_CPRC_DOUBLE:
3433 return 8;
3434 case VFP_CPRC_VEC64:
3435 return 8;
3436 case VFP_CPRC_VEC128:
3437 return 16;
3438 default:
3439 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3440 (int) b);
3441 }
3442 }
3443
3444 /* The character ('s', 'd' or 'q') for the type of VFP register used
3445 for passing base type B. */
3446
3447 static int
3448 arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3449 {
3450 switch (b)
3451 {
3452 case VFP_CPRC_SINGLE:
3453 return 's';
3454 case VFP_CPRC_DOUBLE:
3455 return 'd';
3456 case VFP_CPRC_VEC64:
3457 return 'd';
3458 case VFP_CPRC_VEC128:
3459 return 'q';
3460 default:
3461 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3462 (int) b);
3463 }
3464 }
3465
3466 /* Determine whether T may be part of a candidate for passing and
3467 returning in VFP registers, ignoring the limit on the total number
3468 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3469 classification of the first valid component found; if it is not
3470 VFP_CPRC_UNKNOWN, all components must have the same classification
3471 as *BASE_TYPE. If it is found that T contains a type not permitted
3472 for passing and returning in VFP registers, a type differently
3473 classified from *BASE_TYPE, or two types differently classified
3474 from each other, return -1, otherwise return the total number of
3475 base-type elements found (possibly 0 in an empty structure or
3476 array). Vector types are not currently supported, matching the
3477 generic AAPCS support. */
3478
3479 static int
3480 arm_vfp_cprc_sub_candidate (struct type *t,
3481 enum arm_vfp_cprc_base_type *base_type)
3482 {
3483 t = check_typedef (t);
3484 switch (TYPE_CODE (t))
3485 {
3486 case TYPE_CODE_FLT:
3487 switch (TYPE_LENGTH (t))
3488 {
3489 case 4:
3490 if (*base_type == VFP_CPRC_UNKNOWN)
3491 *base_type = VFP_CPRC_SINGLE;
3492 else if (*base_type != VFP_CPRC_SINGLE)
3493 return -1;
3494 return 1;
3495
3496 case 8:
3497 if (*base_type == VFP_CPRC_UNKNOWN)
3498 *base_type = VFP_CPRC_DOUBLE;
3499 else if (*base_type != VFP_CPRC_DOUBLE)
3500 return -1;
3501 return 1;
3502
3503 default:
3504 return -1;
3505 }
3506 break;
3507
3508 case TYPE_CODE_COMPLEX:
3509 /* Arguments of complex T where T is one of the types float or
3510 double get treated as if they are implemented as:
3511
3512 struct complexT
3513 {
3514 T real;
3515 T imag;
3516 };
3517
3518 */
3519 switch (TYPE_LENGTH (t))
3520 {
3521 case 8:
3522 if (*base_type == VFP_CPRC_UNKNOWN)
3523 *base_type = VFP_CPRC_SINGLE;
3524 else if (*base_type != VFP_CPRC_SINGLE)
3525 return -1;
3526 return 2;
3527
3528 case 16:
3529 if (*base_type == VFP_CPRC_UNKNOWN)
3530 *base_type = VFP_CPRC_DOUBLE;
3531 else if (*base_type != VFP_CPRC_DOUBLE)
3532 return -1;
3533 return 2;
3534
3535 default:
3536 return -1;
3537 }
3538 break;
3539
3540 case TYPE_CODE_ARRAY:
3541 {
3542 if (TYPE_VECTOR (t))
3543 {
3544 /* A 64-bit or 128-bit containerized vector type are VFP
3545 CPRCs. */
3546 switch (TYPE_LENGTH (t))
3547 {
3548 case 8:
3549 if (*base_type == VFP_CPRC_UNKNOWN)
3550 *base_type = VFP_CPRC_VEC64;
3551 return 1;
3552 case 16:
3553 if (*base_type == VFP_CPRC_UNKNOWN)
3554 *base_type = VFP_CPRC_VEC128;
3555 return 1;
3556 default:
3557 return -1;
3558 }
3559 }
3560 else
3561 {
3562 int count;
3563 unsigned unitlen;
3564
3565 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3566 base_type);
3567 if (count == -1)
3568 return -1;
3569 if (TYPE_LENGTH (t) == 0)
3570 {
3571 gdb_assert (count == 0);
3572 return 0;
3573 }
3574 else if (count == 0)
3575 return -1;
3576 unitlen = arm_vfp_cprc_unit_length (*base_type);
3577 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3578 return TYPE_LENGTH (t) / unitlen;
3579 }
3580 }
3581 break;
3582
3583 case TYPE_CODE_STRUCT:
3584 {
3585 int count = 0;
3586 unsigned unitlen;
3587 int i;
3588 for (i = 0; i < TYPE_NFIELDS (t); i++)
3589 {
3590 int sub_count = 0;
3591
3592 if (!field_is_static (&TYPE_FIELD (t, i)))
3593 sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3594 base_type);
3595 if (sub_count == -1)
3596 return -1;
3597 count += sub_count;
3598 }
3599 if (TYPE_LENGTH (t) == 0)
3600 {
3601 gdb_assert (count == 0);
3602 return 0;
3603 }
3604 else if (count == 0)
3605 return -1;
3606 unitlen = arm_vfp_cprc_unit_length (*base_type);
3607 if (TYPE_LENGTH (t) != unitlen * count)
3608 return -1;
3609 return count;
3610 }
3611
3612 case TYPE_CODE_UNION:
3613 {
3614 int count = 0;
3615 unsigned unitlen;
3616 int i;
3617 for (i = 0; i < TYPE_NFIELDS (t); i++)
3618 {
3619 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3620 base_type);
3621 if (sub_count == -1)
3622 return -1;
3623 count = (count > sub_count ? count : sub_count);
3624 }
3625 if (TYPE_LENGTH (t) == 0)
3626 {
3627 gdb_assert (count == 0);
3628 return 0;
3629 }
3630 else if (count == 0)
3631 return -1;
3632 unitlen = arm_vfp_cprc_unit_length (*base_type);
3633 if (TYPE_LENGTH (t) != unitlen * count)
3634 return -1;
3635 return count;
3636 }
3637
3638 default:
3639 break;
3640 }
3641
3642 return -1;
3643 }
3644
3645 /* Determine whether T is a VFP co-processor register candidate (CPRC)
3646 if passed to or returned from a non-variadic function with the VFP
3647 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3648 *BASE_TYPE to the base type for T and *COUNT to the number of
3649 elements of that base type before returning. */
3650
3651 static int
3652 arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3653 int *count)
3654 {
3655 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3656 int c = arm_vfp_cprc_sub_candidate (t, &b);
3657 if (c <= 0 || c > 4)
3658 return 0;
3659 *base_type = b;
3660 *count = c;
3661 return 1;
3662 }
3663
3664 /* Return 1 if the VFP ABI should be used for passing arguments to and
3665 returning values from a function of type FUNC_TYPE, 0
3666 otherwise. */
3667
3668 static int
3669 arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3670 {
3671 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3672 /* Variadic functions always use the base ABI. Assume that functions
3673 without debug info are not variadic. */
3674 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3675 return 0;
3676 /* The VFP ABI is only supported as a variant of AAPCS. */
3677 if (tdep->arm_abi != ARM_ABI_AAPCS)
3678 return 0;
3679 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3680 }
3681
3682 /* We currently only support passing parameters in integer registers, which
3683 conforms with GCC's default model, and VFP argument passing following
3684 the VFP variant of AAPCS. Several other variants exist and
3685 we should probably support some of them based on the selected ABI. */
3686
3687 static CORE_ADDR
3688 arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
3689 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3690 struct value **args, CORE_ADDR sp, int struct_return,
3691 CORE_ADDR struct_addr)
3692 {
3693 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3694 int argnum;
3695 int argreg;
3696 int nstack;
3697 struct stack_item *si = NULL;
3698 int use_vfp_abi;
3699 struct type *ftype;
3700 unsigned vfp_regs_free = (1 << 16) - 1;
3701
3702 /* Determine the type of this function and whether the VFP ABI
3703 applies. */
3704 ftype = check_typedef (value_type (function));
3705 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3706 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3707 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
3708
3709 /* Set the return address. For the ARM, the return breakpoint is
3710 always at BP_ADDR. */
3711 if (arm_pc_is_thumb (gdbarch, bp_addr))
3712 bp_addr |= 1;
3713 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
3714
3715 /* Walk through the list of args and determine how large a temporary
3716 stack is required. Need to take care here as structs may be
3717 passed on the stack, and we have to push them. */
3718 nstack = 0;
3719
3720 argreg = ARM_A1_REGNUM;
3721 nstack = 0;
3722
3723 /* The struct_return pointer occupies the first parameter
3724 passing register. */
3725 if (struct_return)
3726 {
3727 if (arm_debug)
3728 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
3729 gdbarch_register_name (gdbarch, argreg),
3730 paddress (gdbarch, struct_addr));
3731 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3732 argreg++;
3733 }
3734
3735 for (argnum = 0; argnum < nargs; argnum++)
3736 {
3737 int len;
3738 struct type *arg_type;
3739 struct type *target_type;
3740 enum type_code typecode;
3741 const bfd_byte *val;
3742 int align;
3743 enum arm_vfp_cprc_base_type vfp_base_type;
3744 int vfp_base_count;
3745 int may_use_core_reg = 1;
3746
3747 arg_type = check_typedef (value_type (args[argnum]));
3748 len = TYPE_LENGTH (arg_type);
3749 target_type = TYPE_TARGET_TYPE (arg_type);
3750 typecode = TYPE_CODE (arg_type);
3751 val = value_contents (args[argnum]);
3752
3753 align = arm_type_align (arg_type);
3754 /* Round alignment up to a whole number of words. */
3755 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3756 /* Different ABIs have different maximum alignments. */
3757 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3758 {
3759 /* The APCS ABI only requires word alignment. */
3760 align = INT_REGISTER_SIZE;
3761 }
3762 else
3763 {
3764 /* The AAPCS requires at most doubleword alignment. */
3765 if (align > INT_REGISTER_SIZE * 2)
3766 align = INT_REGISTER_SIZE * 2;
3767 }
3768
3769 if (use_vfp_abi
3770 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3771 &vfp_base_count))
3772 {
3773 int regno;
3774 int unit_length;
3775 int shift;
3776 unsigned mask;
3777
3778 /* Because this is a CPRC it cannot go in a core register or
3779 cause a core register to be skipped for alignment.
3780 Either it goes in VFP registers and the rest of this loop
3781 iteration is skipped for this argument, or it goes on the
3782 stack (and the stack alignment code is correct for this
3783 case). */
3784 may_use_core_reg = 0;
3785
3786 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3787 shift = unit_length / 4;
3788 mask = (1 << (shift * vfp_base_count)) - 1;
3789 for (regno = 0; regno < 16; regno += shift)
3790 if (((vfp_regs_free >> regno) & mask) == mask)
3791 break;
3792
3793 if (regno < 16)
3794 {
3795 int reg_char;
3796 int reg_scaled;
3797 int i;
3798
3799 vfp_regs_free &= ~(mask << regno);
3800 reg_scaled = regno / shift;
3801 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3802 for (i = 0; i < vfp_base_count; i++)
3803 {
3804 char name_buf[4];
3805 int regnum;
3806 if (reg_char == 'q')
3807 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
3808 val + i * unit_length);
3809 else
3810 {
3811 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3812 reg_char, reg_scaled + i);
3813 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3814 strlen (name_buf));
3815 regcache_cooked_write (regcache, regnum,
3816 val + i * unit_length);
3817 }
3818 }
3819 continue;
3820 }
3821 else
3822 {
3823 /* This CPRC could not go in VFP registers, so all VFP
3824 registers are now marked as used. */
3825 vfp_regs_free = 0;
3826 }
3827 }
3828
3829 /* Push stack padding for dowubleword alignment. */
3830 if (nstack & (align - 1))
3831 {
3832 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3833 nstack += INT_REGISTER_SIZE;
3834 }
3835
3836 /* Doubleword aligned quantities must go in even register pairs. */
3837 if (may_use_core_reg
3838 && argreg <= ARM_LAST_ARG_REGNUM
3839 && align > INT_REGISTER_SIZE
3840 && argreg & 1)
3841 argreg++;
3842
3843 /* If the argument is a pointer to a function, and it is a
3844 Thumb function, create a LOCAL copy of the value and set
3845 the THUMB bit in it. */
3846 if (TYPE_CODE_PTR == typecode
3847 && target_type != NULL
3848 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
3849 {
3850 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
3851 if (arm_pc_is_thumb (gdbarch, regval))
3852 {
3853 bfd_byte *copy = (bfd_byte *) alloca (len);
3854 store_unsigned_integer (copy, len, byte_order,
3855 MAKE_THUMB_ADDR (regval));
3856 val = copy;
3857 }
3858 }
3859
3860 /* Copy the argument to general registers or the stack in
3861 register-sized pieces. Large arguments are split between
3862 registers and stack. */
3863 while (len > 0)
3864 {
3865 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
3866 CORE_ADDR regval
3867 = extract_unsigned_integer (val, partial_len, byte_order);
3868
3869 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
3870 {
3871 /* The argument is being passed in a general purpose
3872 register. */
3873 if (byte_order == BFD_ENDIAN_BIG)
3874 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
3875 if (arm_debug)
3876 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
3877 argnum,
3878 gdbarch_register_name
3879 (gdbarch, argreg),
3880 phex (regval, INT_REGISTER_SIZE));
3881 regcache_cooked_write_unsigned (regcache, argreg, regval);
3882 argreg++;
3883 }
3884 else
3885 {
3886 gdb_byte buf[INT_REGISTER_SIZE];
3887
3888 memset (buf, 0, sizeof (buf));
3889 store_unsigned_integer (buf, partial_len, byte_order, regval);
3890
3891 /* Push the arguments onto the stack. */
3892 if (arm_debug)
3893 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3894 argnum, nstack);
3895 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
3896 nstack += INT_REGISTER_SIZE;
3897 }
3898
3899 len -= partial_len;
3900 val += partial_len;
3901 }
3902 }
3903 /* If we have an odd number of words to push, then decrement the stack
3904 by one word now, so first stack argument will be dword aligned. */
3905 if (nstack & 4)
3906 sp -= 4;
3907
3908 while (si)
3909 {
3910 sp -= si->len;
3911 write_memory (sp, si->data, si->len);
3912 si = pop_stack_item (si);
3913 }
3914
3915 /* Finally, update teh SP register. */
3916 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3917
3918 return sp;
3919 }
3920
3921
3922 /* Always align the frame to an 8-byte boundary. This is required on
3923 some platforms and harmless on the rest. */
3924
3925 static CORE_ADDR
3926 arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3927 {
3928 /* Align the stack to eight bytes. */
3929 return sp & ~ (CORE_ADDR) 7;
3930 }
3931
3932 static void
3933 print_fpu_flags (struct ui_file *file, int flags)
3934 {
3935 if (flags & (1 << 0))
3936 fputs_filtered ("IVO ", file);
3937 if (flags & (1 << 1))
3938 fputs_filtered ("DVZ ", file);
3939 if (flags & (1 << 2))
3940 fputs_filtered ("OFL ", file);
3941 if (flags & (1 << 3))
3942 fputs_filtered ("UFL ", file);
3943 if (flags & (1 << 4))
3944 fputs_filtered ("INX ", file);
3945 fputc_filtered ('\n', file);
3946 }
3947
3948 /* Print interesting information about the floating point processor
3949 (if present) or emulator. */
3950 static void
3951 arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
3952 struct frame_info *frame, const char *args)
3953 {
3954 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
3955 int type;
3956
3957 type = (status >> 24) & 127;
3958 if (status & (1 << 31))
3959 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
3960 else
3961 fprintf_filtered (file, _("Software FPU type %d\n"), type);
3962 /* i18n: [floating point unit] mask */
3963 fputs_filtered (_("mask: "), file);
3964 print_fpu_flags (file, status >> 16);
3965 /* i18n: [floating point unit] flags */
3966 fputs_filtered (_("flags: "), file);
3967 print_fpu_flags (file, status);
3968 }
3969
3970 /* Construct the ARM extended floating point type. */
3971 static struct type *
3972 arm_ext_type (struct gdbarch *gdbarch)
3973 {
3974 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3975
3976 if (!tdep->arm_ext_type)
3977 tdep->arm_ext_type
3978 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
3979 floatformats_arm_ext);
3980
3981 return tdep->arm_ext_type;
3982 }
3983
3984 static struct type *
3985 arm_neon_double_type (struct gdbarch *gdbarch)
3986 {
3987 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3988
3989 if (tdep->neon_double_type == NULL)
3990 {
3991 struct type *t, *elem;
3992
3993 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3994 TYPE_CODE_UNION);
3995 elem = builtin_type (gdbarch)->builtin_uint8;
3996 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3997 elem = builtin_type (gdbarch)->builtin_uint16;
3998 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3999 elem = builtin_type (gdbarch)->builtin_uint32;
4000 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
4001 elem = builtin_type (gdbarch)->builtin_uint64;
4002 append_composite_type_field (t, "u64", elem);
4003 elem = builtin_type (gdbarch)->builtin_float;
4004 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
4005 elem = builtin_type (gdbarch)->builtin_double;
4006 append_composite_type_field (t, "f64", elem);
4007
4008 TYPE_VECTOR (t) = 1;
4009 TYPE_NAME (t) = "neon_d";
4010 tdep->neon_double_type = t;
4011 }
4012
4013 return tdep->neon_double_type;
4014 }
4015
4016 /* FIXME: The vector types are not correctly ordered on big-endian
4017 targets. Just as s0 is the low bits of d0, d0[0] is also the low
4018 bits of d0 - regardless of what unit size is being held in d0. So
4019 the offset of the first uint8 in d0 is 7, but the offset of the
4020 first float is 4. This code works as-is for little-endian
4021 targets. */
4022
4023 static struct type *
4024 arm_neon_quad_type (struct gdbarch *gdbarch)
4025 {
4026 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4027
4028 if (tdep->neon_quad_type == NULL)
4029 {
4030 struct type *t, *elem;
4031
4032 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
4033 TYPE_CODE_UNION);
4034 elem = builtin_type (gdbarch)->builtin_uint8;
4035 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
4036 elem = builtin_type (gdbarch)->builtin_uint16;
4037 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
4038 elem = builtin_type (gdbarch)->builtin_uint32;
4039 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
4040 elem = builtin_type (gdbarch)->builtin_uint64;
4041 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
4042 elem = builtin_type (gdbarch)->builtin_float;
4043 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
4044 elem = builtin_type (gdbarch)->builtin_double;
4045 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
4046
4047 TYPE_VECTOR (t) = 1;
4048 TYPE_NAME (t) = "neon_q";
4049 tdep->neon_quad_type = t;
4050 }
4051
4052 return tdep->neon_quad_type;
4053 }
4054
4055 /* Return the GDB type object for the "standard" data type of data in
4056 register N. */
4057
4058 static struct type *
4059 arm_register_type (struct gdbarch *gdbarch, int regnum)
4060 {
4061 int num_regs = gdbarch_num_regs (gdbarch);
4062
4063 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
4064 && regnum >= num_regs && regnum < num_regs + 32)
4065 return builtin_type (gdbarch)->builtin_float;
4066
4067 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
4068 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
4069 return arm_neon_quad_type (gdbarch);
4070
4071 /* If the target description has register information, we are only
4072 in this function so that we can override the types of
4073 double-precision registers for NEON. */
4074 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
4075 {
4076 struct type *t = tdesc_register_type (gdbarch, regnum);
4077
4078 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
4079 && TYPE_CODE (t) == TYPE_CODE_FLT
4080 && gdbarch_tdep (gdbarch)->have_neon)
4081 return arm_neon_double_type (gdbarch);
4082 else
4083 return t;
4084 }
4085
4086 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
4087 {
4088 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
4089 return builtin_type (gdbarch)->builtin_void;
4090
4091 return arm_ext_type (gdbarch);
4092 }
4093 else if (regnum == ARM_SP_REGNUM)
4094 return builtin_type (gdbarch)->builtin_data_ptr;
4095 else if (regnum == ARM_PC_REGNUM)
4096 return builtin_type (gdbarch)->builtin_func_ptr;
4097 else if (regnum >= ARRAY_SIZE (arm_register_names))
4098 /* These registers are only supported on targets which supply
4099 an XML description. */
4100 return builtin_type (gdbarch)->builtin_int0;
4101 else
4102 return builtin_type (gdbarch)->builtin_uint32;
4103 }
4104
4105 /* Map a DWARF register REGNUM onto the appropriate GDB register
4106 number. */
4107
4108 static int
4109 arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
4110 {
4111 /* Core integer regs. */
4112 if (reg >= 0 && reg <= 15)
4113 return reg;
4114
4115 /* Legacy FPA encoding. These were once used in a way which
4116 overlapped with VFP register numbering, so their use is
4117 discouraged, but GDB doesn't support the ARM toolchain
4118 which used them for VFP. */
4119 if (reg >= 16 && reg <= 23)
4120 return ARM_F0_REGNUM + reg - 16;
4121
4122 /* New assignments for the FPA registers. */
4123 if (reg >= 96 && reg <= 103)
4124 return ARM_F0_REGNUM + reg - 96;
4125
4126 /* WMMX register assignments. */
4127 if (reg >= 104 && reg <= 111)
4128 return ARM_WCGR0_REGNUM + reg - 104;
4129
4130 if (reg >= 112 && reg <= 127)
4131 return ARM_WR0_REGNUM + reg - 112;
4132
4133 if (reg >= 192 && reg <= 199)
4134 return ARM_WC0_REGNUM + reg - 192;
4135
4136 /* VFP v2 registers. A double precision value is actually
4137 in d1 rather than s2, but the ABI only defines numbering
4138 for the single precision registers. This will "just work"
4139 in GDB for little endian targets (we'll read eight bytes,
4140 starting in s0 and then progressing to s1), but will be
4141 reversed on big endian targets with VFP. This won't
4142 be a problem for the new Neon quad registers; you're supposed
4143 to use DW_OP_piece for those. */
4144 if (reg >= 64 && reg <= 95)
4145 {
4146 char name_buf[4];
4147
4148 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
4149 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4150 strlen (name_buf));
4151 }
4152
4153 /* VFP v3 / Neon registers. This range is also used for VFP v2
4154 registers, except that it now describes d0 instead of s0. */
4155 if (reg >= 256 && reg <= 287)
4156 {
4157 char name_buf[4];
4158
4159 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
4160 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4161 strlen (name_buf));
4162 }
4163
4164 return -1;
4165 }
4166
4167 /* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4168 static int
4169 arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
4170 {
4171 int reg = regnum;
4172 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
4173
4174 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4175 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4176
4177 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4178 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4179
4180 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4181 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4182
4183 if (reg < NUM_GREGS)
4184 return SIM_ARM_R0_REGNUM + reg;
4185 reg -= NUM_GREGS;
4186
4187 if (reg < NUM_FREGS)
4188 return SIM_ARM_FP0_REGNUM + reg;
4189 reg -= NUM_FREGS;
4190
4191 if (reg < NUM_SREGS)
4192 return SIM_ARM_FPS_REGNUM + reg;
4193 reg -= NUM_SREGS;
4194
4195 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
4196 }
4197
4198 /* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4199 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4200 NULL if an error occurs. BUF is freed. */
4201
4202 static gdb_byte *
4203 extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4204 int old_len, int new_len)
4205 {
4206 gdb_byte *new_buf;
4207 int bytes_to_read = new_len - old_len;
4208
4209 new_buf = (gdb_byte *) xmalloc (new_len);
4210 memcpy (new_buf + bytes_to_read, buf, old_len);
4211 xfree (buf);
4212 if (target_read_code (endaddr - new_len, new_buf, bytes_to_read) != 0)
4213 {
4214 xfree (new_buf);
4215 return NULL;
4216 }
4217 return new_buf;
4218 }
4219
4220 /* An IT block is at most the 2-byte IT instruction followed by
4221 four 4-byte instructions. The furthest back we must search to
4222 find an IT block that affects the current instruction is thus
4223 2 + 3 * 4 == 14 bytes. */
4224 #define MAX_IT_BLOCK_PREFIX 14
4225
4226 /* Use a quick scan if there are more than this many bytes of
4227 code. */
4228 #define IT_SCAN_THRESHOLD 32
4229
4230 /* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4231 A breakpoint in an IT block may not be hit, depending on the
4232 condition flags. */
4233 static CORE_ADDR
4234 arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
4235 {
4236 gdb_byte *buf;
4237 char map_type;
4238 CORE_ADDR boundary, func_start;
4239 int buf_len;
4240 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4241 int i, any, last_it, last_it_count;
4242
4243 /* If we are using BKPT breakpoints, none of this is necessary. */
4244 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4245 return bpaddr;
4246
4247 /* ARM mode does not have this problem. */
4248 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4249 return bpaddr;
4250
4251 /* We are setting a breakpoint in Thumb code that could potentially
4252 contain an IT block. The first step is to find how much Thumb
4253 code there is; we do not need to read outside of known Thumb
4254 sequences. */
4255 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4256 if (map_type == 0)
4257 /* Thumb-2 code must have mapping symbols to have a chance. */
4258 return bpaddr;
4259
4260 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
4261
4262 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4263 && func_start > boundary)
4264 boundary = func_start;
4265
4266 /* Search for a candidate IT instruction. We have to do some fancy
4267 footwork to distinguish a real IT instruction from the second
4268 half of a 32-bit instruction, but there is no need for that if
4269 there's no candidate. */
4270 buf_len = std::min (bpaddr - boundary, (CORE_ADDR) MAX_IT_BLOCK_PREFIX);
4271 if (buf_len == 0)
4272 /* No room for an IT instruction. */
4273 return bpaddr;
4274
4275 buf = (gdb_byte *) xmalloc (buf_len);
4276 if (target_read_code (bpaddr - buf_len, buf, buf_len) != 0)
4277 return bpaddr;
4278 any = 0;
4279 for (i = 0; i < buf_len; i += 2)
4280 {
4281 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4282 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4283 {
4284 any = 1;
4285 break;
4286 }
4287 }
4288
4289 if (any == 0)
4290 {
4291 xfree (buf);
4292 return bpaddr;
4293 }
4294
4295 /* OK, the code bytes before this instruction contain at least one
4296 halfword which resembles an IT instruction. We know that it's
4297 Thumb code, but there are still two possibilities. Either the
4298 halfword really is an IT instruction, or it is the second half of
4299 a 32-bit Thumb instruction. The only way we can tell is to
4300 scan forwards from a known instruction boundary. */
4301 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4302 {
4303 int definite;
4304
4305 /* There's a lot of code before this instruction. Start with an
4306 optimistic search; it's easy to recognize halfwords that can
4307 not be the start of a 32-bit instruction, and use that to
4308 lock on to the instruction boundaries. */
4309 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4310 if (buf == NULL)
4311 return bpaddr;
4312 buf_len = IT_SCAN_THRESHOLD;
4313
4314 definite = 0;
4315 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4316 {
4317 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4318 if (thumb_insn_size (inst1) == 2)
4319 {
4320 definite = 1;
4321 break;
4322 }
4323 }
4324
4325 /* At this point, if DEFINITE, BUF[I] is the first place we
4326 are sure that we know the instruction boundaries, and it is far
4327 enough from BPADDR that we could not miss an IT instruction
4328 affecting BPADDR. If ! DEFINITE, give up - start from a
4329 known boundary. */
4330 if (! definite)
4331 {
4332 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4333 bpaddr - boundary);
4334 if (buf == NULL)
4335 return bpaddr;
4336 buf_len = bpaddr - boundary;
4337 i = 0;
4338 }
4339 }
4340 else
4341 {
4342 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4343 if (buf == NULL)
4344 return bpaddr;
4345 buf_len = bpaddr - boundary;
4346 i = 0;
4347 }
4348
4349 /* Scan forwards. Find the last IT instruction before BPADDR. */
4350 last_it = -1;
4351 last_it_count = 0;
4352 while (i < buf_len)
4353 {
4354 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4355 last_it_count--;
4356 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4357 {
4358 last_it = i;
4359 if (inst1 & 0x0001)
4360 last_it_count = 4;
4361 else if (inst1 & 0x0002)
4362 last_it_count = 3;
4363 else if (inst1 & 0x0004)
4364 last_it_count = 2;
4365 else
4366 last_it_count = 1;
4367 }
4368 i += thumb_insn_size (inst1);
4369 }
4370
4371 xfree (buf);
4372
4373 if (last_it == -1)
4374 /* There wasn't really an IT instruction after all. */
4375 return bpaddr;
4376
4377 if (last_it_count < 1)
4378 /* It was too far away. */
4379 return bpaddr;
4380
4381 /* This really is a trouble spot. Move the breakpoint to the IT
4382 instruction. */
4383 return bpaddr - buf_len + last_it;
4384 }
4385
4386 /* ARM displaced stepping support.
4387
4388 Generally ARM displaced stepping works as follows:
4389
4390 1. When an instruction is to be single-stepped, it is first decoded by
4391 arm_process_displaced_insn. Depending on the type of instruction, it is
4392 then copied to a scratch location, possibly in a modified form. The
4393 copy_* set of functions performs such modification, as necessary. A
4394 breakpoint is placed after the modified instruction in the scratch space
4395 to return control to GDB. Note in particular that instructions which
4396 modify the PC will no longer do so after modification.
4397
4398 2. The instruction is single-stepped, by setting the PC to the scratch
4399 location address, and resuming. Control returns to GDB when the
4400 breakpoint is hit.
4401
4402 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4403 function used for the current instruction. This function's job is to
4404 put the CPU/memory state back to what it would have been if the
4405 instruction had been executed unmodified in its original location. */
4406
4407 /* NOP instruction (mov r0, r0). */
4408 #define ARM_NOP 0xe1a00000
4409 #define THUMB_NOP 0x4600
4410
4411 /* Helper for register reads for displaced stepping. In particular, this
4412 returns the PC as it would be seen by the instruction at its original
4413 location. */
4414
4415 ULONGEST
4416 displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4417 int regno)
4418 {
4419 ULONGEST ret;
4420 CORE_ADDR from = dsc->insn_addr;
4421
4422 if (regno == ARM_PC_REGNUM)
4423 {
4424 /* Compute pipeline offset:
4425 - When executing an ARM instruction, PC reads as the address of the
4426 current instruction plus 8.
4427 - When executing a Thumb instruction, PC reads as the address of the
4428 current instruction plus 4. */
4429
4430 if (!dsc->is_thumb)
4431 from += 8;
4432 else
4433 from += 4;
4434
4435 if (debug_displaced)
4436 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4437 (unsigned long) from);
4438 return (ULONGEST) from;
4439 }
4440 else
4441 {
4442 regcache_cooked_read_unsigned (regs, regno, &ret);
4443 if (debug_displaced)
4444 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4445 regno, (unsigned long) ret);
4446 return ret;
4447 }
4448 }
4449
4450 static int
4451 displaced_in_arm_mode (struct regcache *regs)
4452 {
4453 ULONGEST ps;
4454 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
4455
4456 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4457
4458 return (ps & t_bit) == 0;
4459 }
4460
4461 /* Write to the PC as from a branch instruction. */
4462
4463 static void
4464 branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4465 ULONGEST val)
4466 {
4467 if (!dsc->is_thumb)
4468 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4469 architecture versions < 6. */
4470 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4471 val & ~(ULONGEST) 0x3);
4472 else
4473 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4474 val & ~(ULONGEST) 0x1);
4475 }
4476
4477 /* Write to the PC as from a branch-exchange instruction. */
4478
4479 static void
4480 bx_write_pc (struct regcache *regs, ULONGEST val)
4481 {
4482 ULONGEST ps;
4483 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
4484
4485 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4486
4487 if ((val & 1) == 1)
4488 {
4489 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
4490 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4491 }
4492 else if ((val & 2) == 0)
4493 {
4494 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
4495 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
4496 }
4497 else
4498 {
4499 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4500 mode, align dest to 4 bytes). */
4501 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
4502 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
4503 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
4504 }
4505 }
4506
4507 /* Write to the PC as if from a load instruction. */
4508
4509 static void
4510 load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4511 ULONGEST val)
4512 {
4513 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4514 bx_write_pc (regs, val);
4515 else
4516 branch_write_pc (regs, dsc, val);
4517 }
4518
4519 /* Write to the PC as if from an ALU instruction. */
4520
4521 static void
4522 alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4523 ULONGEST val)
4524 {
4525 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
4526 bx_write_pc (regs, val);
4527 else
4528 branch_write_pc (regs, dsc, val);
4529 }
4530
4531 /* Helper for writing to registers for displaced stepping. Writing to the PC
4532 has a varying effects depending on the instruction which does the write:
4533 this is controlled by the WRITE_PC argument. */
4534
4535 void
4536 displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4537 int regno, ULONGEST val, enum pc_write_style write_pc)
4538 {
4539 if (regno == ARM_PC_REGNUM)
4540 {
4541 if (debug_displaced)
4542 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4543 (unsigned long) val);
4544 switch (write_pc)
4545 {
4546 case BRANCH_WRITE_PC:
4547 branch_write_pc (regs, dsc, val);
4548 break;
4549
4550 case BX_WRITE_PC:
4551 bx_write_pc (regs, val);
4552 break;
4553
4554 case LOAD_WRITE_PC:
4555 load_write_pc (regs, dsc, val);
4556 break;
4557
4558 case ALU_WRITE_PC:
4559 alu_write_pc (regs, dsc, val);
4560 break;
4561
4562 case CANNOT_WRITE_PC:
4563 warning (_("Instruction wrote to PC in an unexpected way when "
4564 "single-stepping"));
4565 break;
4566
4567 default:
4568 internal_error (__FILE__, __LINE__,
4569 _("Invalid argument to displaced_write_reg"));
4570 }
4571
4572 dsc->wrote_to_pc = 1;
4573 }
4574 else
4575 {
4576 if (debug_displaced)
4577 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4578 regno, (unsigned long) val);
4579 regcache_cooked_write_unsigned (regs, regno, val);
4580 }
4581 }
4582
4583 /* This function is used to concisely determine if an instruction INSN
4584 references PC. Register fields of interest in INSN should have the
4585 corresponding fields of BITMASK set to 0b1111. The function
4586 returns return 1 if any of these fields in INSN reference the PC
4587 (also 0b1111, r15), else it returns 0. */
4588
4589 static int
4590 insn_references_pc (uint32_t insn, uint32_t bitmask)
4591 {
4592 uint32_t lowbit = 1;
4593
4594 while (bitmask != 0)
4595 {
4596 uint32_t mask;
4597
4598 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4599 ;
4600
4601 if (!lowbit)
4602 break;
4603
4604 mask = lowbit * 0xf;
4605
4606 if ((insn & mask) == mask)
4607 return 1;
4608
4609 bitmask &= ~mask;
4610 }
4611
4612 return 0;
4613 }
4614
4615 /* The simplest copy function. Many instructions have the same effect no
4616 matter what address they are executed at: in those cases, use this. */
4617
4618 static int
4619 arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
4620 const char *iname, struct displaced_step_closure *dsc)
4621 {
4622 if (debug_displaced)
4623 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4624 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4625 iname);
4626
4627 dsc->modinsn[0] = insn;
4628
4629 return 0;
4630 }
4631
4632 static int
4633 thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4634 uint16_t insn2, const char *iname,
4635 struct displaced_step_closure *dsc)
4636 {
4637 if (debug_displaced)
4638 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4639 "opcode/class '%s' unmodified\n", insn1, insn2,
4640 iname);
4641
4642 dsc->modinsn[0] = insn1;
4643 dsc->modinsn[1] = insn2;
4644 dsc->numinsns = 2;
4645
4646 return 0;
4647 }
4648
4649 /* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4650 modification. */
4651 static int
4652 thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
4653 const char *iname,
4654 struct displaced_step_closure *dsc)
4655 {
4656 if (debug_displaced)
4657 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4658 "opcode/class '%s' unmodified\n", insn,
4659 iname);
4660
4661 dsc->modinsn[0] = insn;
4662
4663 return 0;
4664 }
4665
4666 /* Preload instructions with immediate offset. */
4667
4668 static void
4669 cleanup_preload (struct gdbarch *gdbarch,
4670 struct regcache *regs, struct displaced_step_closure *dsc)
4671 {
4672 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4673 if (!dsc->u.preload.immed)
4674 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4675 }
4676
4677 static void
4678 install_preload (struct gdbarch *gdbarch, struct regcache *regs,
4679 struct displaced_step_closure *dsc, unsigned int rn)
4680 {
4681 ULONGEST rn_val;
4682 /* Preload instructions:
4683
4684 {pli/pld} [rn, #+/-imm]
4685 ->
4686 {pli/pld} [r0, #+/-imm]. */
4687
4688 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4689 rn_val = displaced_read_reg (regs, dsc, rn);
4690 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4691 dsc->u.preload.immed = 1;
4692
4693 dsc->cleanup = &cleanup_preload;
4694 }
4695
4696 static int
4697 arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
4698 struct displaced_step_closure *dsc)
4699 {
4700 unsigned int rn = bits (insn, 16, 19);
4701
4702 if (!insn_references_pc (insn, 0x000f0000ul))
4703 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
4704
4705 if (debug_displaced)
4706 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4707 (unsigned long) insn);
4708
4709 dsc->modinsn[0] = insn & 0xfff0ffff;
4710
4711 install_preload (gdbarch, regs, dsc, rn);
4712
4713 return 0;
4714 }
4715
4716 static int
4717 thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
4718 struct regcache *regs, struct displaced_step_closure *dsc)
4719 {
4720 unsigned int rn = bits (insn1, 0, 3);
4721 unsigned int u_bit = bit (insn1, 7);
4722 int imm12 = bits (insn2, 0, 11);
4723 ULONGEST pc_val;
4724
4725 if (rn != ARM_PC_REGNUM)
4726 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4727
4728 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4729 PLD (literal) Encoding T1. */
4730 if (debug_displaced)
4731 fprintf_unfiltered (gdb_stdlog,
4732 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4733 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4734 imm12);
4735
4736 if (!u_bit)
4737 imm12 = -1 * imm12;
4738
4739 /* Rewrite instruction {pli/pld} PC imm12 into:
4740 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4741
4742 {pli/pld} [r0, r1]
4743
4744 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4745
4746 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4747 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4748
4749 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4750
4751 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4752 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4753 dsc->u.preload.immed = 0;
4754
4755 /* {pli/pld} [r0, r1] */
4756 dsc->modinsn[0] = insn1 & 0xfff0;
4757 dsc->modinsn[1] = 0xf001;
4758 dsc->numinsns = 2;
4759
4760 dsc->cleanup = &cleanup_preload;
4761 return 0;
4762 }
4763
4764 /* Preload instructions with register offset. */
4765
4766 static void
4767 install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
4768 struct displaced_step_closure *dsc, unsigned int rn,
4769 unsigned int rm)
4770 {
4771 ULONGEST rn_val, rm_val;
4772
4773 /* Preload register-offset instructions:
4774
4775 {pli/pld} [rn, rm {, shift}]
4776 ->
4777 {pli/pld} [r0, r1 {, shift}]. */
4778
4779 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4780 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4781 rn_val = displaced_read_reg (regs, dsc, rn);
4782 rm_val = displaced_read_reg (regs, dsc, rm);
4783 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4784 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
4785 dsc->u.preload.immed = 0;
4786
4787 dsc->cleanup = &cleanup_preload;
4788 }
4789
4790 static int
4791 arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4792 struct regcache *regs,
4793 struct displaced_step_closure *dsc)
4794 {
4795 unsigned int rn = bits (insn, 16, 19);
4796 unsigned int rm = bits (insn, 0, 3);
4797
4798
4799 if (!insn_references_pc (insn, 0x000f000ful))
4800 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4801
4802 if (debug_displaced)
4803 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4804 (unsigned long) insn);
4805
4806 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
4807
4808 install_preload_reg (gdbarch, regs, dsc, rn, rm);
4809 return 0;
4810 }
4811
4812 /* Copy/cleanup coprocessor load and store instructions. */
4813
4814 static void
4815 cleanup_copro_load_store (struct gdbarch *gdbarch,
4816 struct regcache *regs,
4817 struct displaced_step_closure *dsc)
4818 {
4819 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
4820
4821 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4822
4823 if (dsc->u.ldst.writeback)
4824 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4825 }
4826
4827 static void
4828 install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
4829 struct displaced_step_closure *dsc,
4830 int writeback, unsigned int rn)
4831 {
4832 ULONGEST rn_val;
4833
4834 /* Coprocessor load/store instructions:
4835
4836 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4837 ->
4838 {stc/stc2} [r0, #+/-imm].
4839
4840 ldc/ldc2 are handled identically. */
4841
4842 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4843 rn_val = displaced_read_reg (regs, dsc, rn);
4844 /* PC should be 4-byte aligned. */
4845 rn_val = rn_val & 0xfffffffc;
4846 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4847
4848 dsc->u.ldst.writeback = writeback;
4849 dsc->u.ldst.rn = rn;
4850
4851 dsc->cleanup = &cleanup_copro_load_store;
4852 }
4853
4854 static int
4855 arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4856 struct regcache *regs,
4857 struct displaced_step_closure *dsc)
4858 {
4859 unsigned int rn = bits (insn, 16, 19);
4860
4861 if (!insn_references_pc (insn, 0x000f0000ul))
4862 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4863
4864 if (debug_displaced)
4865 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4866 "load/store insn %.8lx\n", (unsigned long) insn);
4867
4868 dsc->modinsn[0] = insn & 0xfff0ffff;
4869
4870 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
4871
4872 return 0;
4873 }
4874
4875 static int
4876 thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4877 uint16_t insn2, struct regcache *regs,
4878 struct displaced_step_closure *dsc)
4879 {
4880 unsigned int rn = bits (insn1, 0, 3);
4881
4882 if (rn != ARM_PC_REGNUM)
4883 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4884 "copro load/store", dsc);
4885
4886 if (debug_displaced)
4887 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4888 "load/store insn %.4x%.4x\n", insn1, insn2);
4889
4890 dsc->modinsn[0] = insn1 & 0xfff0;
4891 dsc->modinsn[1] = insn2;
4892 dsc->numinsns = 2;
4893
4894 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4895 doesn't support writeback, so pass 0. */
4896 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4897
4898 return 0;
4899 }
4900
4901 /* Clean up branch instructions (actually perform the branch, by setting
4902 PC). */
4903
4904 static void
4905 cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
4906 struct displaced_step_closure *dsc)
4907 {
4908 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
4909 int branch_taken = condition_true (dsc->u.branch.cond, status);
4910 enum pc_write_style write_pc = dsc->u.branch.exchange
4911 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4912
4913 if (!branch_taken)
4914 return;
4915
4916 if (dsc->u.branch.link)
4917 {
4918 /* The value of LR should be the next insn of current one. In order
4919 not to confuse logic hanlding later insn `bx lr', if current insn mode
4920 is Thumb, the bit 0 of LR value should be set to 1. */
4921 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4922
4923 if (dsc->is_thumb)
4924 next_insn_addr |= 0x1;
4925
4926 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4927 CANNOT_WRITE_PC);
4928 }
4929
4930 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
4931 }
4932
4933 /* Copy B/BL/BLX instructions with immediate destinations. */
4934
4935 static void
4936 install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
4937 struct displaced_step_closure *dsc,
4938 unsigned int cond, int exchange, int link, long offset)
4939 {
4940 /* Implement "BL<cond> <label>" as:
4941
4942 Preparation: cond <- instruction condition
4943 Insn: mov r0, r0 (nop)
4944 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4945
4946 B<cond> similar, but don't set r14 in cleanup. */
4947
4948 dsc->u.branch.cond = cond;
4949 dsc->u.branch.link = link;
4950 dsc->u.branch.exchange = exchange;
4951
4952 dsc->u.branch.dest = dsc->insn_addr;
4953 if (link && exchange)
4954 /* For BLX, offset is computed from the Align (PC, 4). */
4955 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4956
4957 if (dsc->is_thumb)
4958 dsc->u.branch.dest += 4 + offset;
4959 else
4960 dsc->u.branch.dest += 8 + offset;
4961
4962 dsc->cleanup = &cleanup_branch;
4963 }
4964 static int
4965 arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
4966 struct regcache *regs, struct displaced_step_closure *dsc)
4967 {
4968 unsigned int cond = bits (insn, 28, 31);
4969 int exchange = (cond == 0xf);
4970 int link = exchange || bit (insn, 24);
4971 long offset;
4972
4973 if (debug_displaced)
4974 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4975 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4976 (unsigned long) insn);
4977 if (exchange)
4978 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4979 then arrange the switch into Thumb mode. */
4980 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4981 else
4982 offset = bits (insn, 0, 23) << 2;
4983
4984 if (bit (offset, 25))
4985 offset = offset | ~0x3ffffff;
4986
4987 dsc->modinsn[0] = ARM_NOP;
4988
4989 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4990 return 0;
4991 }
4992
4993 static int
4994 thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4995 uint16_t insn2, struct regcache *regs,
4996 struct displaced_step_closure *dsc)
4997 {
4998 int link = bit (insn2, 14);
4999 int exchange = link && !bit (insn2, 12);
5000 int cond = INST_AL;
5001 long offset = 0;
5002 int j1 = bit (insn2, 13);
5003 int j2 = bit (insn2, 11);
5004 int s = sbits (insn1, 10, 10);
5005 int i1 = !(j1 ^ bit (insn1, 10));
5006 int i2 = !(j2 ^ bit (insn1, 10));
5007
5008 if (!link && !exchange) /* B */
5009 {
5010 offset = (bits (insn2, 0, 10) << 1);
5011 if (bit (insn2, 12)) /* Encoding T4 */
5012 {
5013 offset |= (bits (insn1, 0, 9) << 12)
5014 | (i2 << 22)
5015 | (i1 << 23)
5016 | (s << 24);
5017 cond = INST_AL;
5018 }
5019 else /* Encoding T3 */
5020 {
5021 offset |= (bits (insn1, 0, 5) << 12)
5022 | (j1 << 18)
5023 | (j2 << 19)
5024 | (s << 20);
5025 cond = bits (insn1, 6, 9);
5026 }
5027 }
5028 else
5029 {
5030 offset = (bits (insn1, 0, 9) << 12);
5031 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
5032 offset |= exchange ?
5033 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
5034 }
5035
5036 if (debug_displaced)
5037 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
5038 "%.4x %.4x with offset %.8lx\n",
5039 link ? (exchange) ? "blx" : "bl" : "b",
5040 insn1, insn2, offset);
5041
5042 dsc->modinsn[0] = THUMB_NOP;
5043
5044 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
5045 return 0;
5046 }
5047
5048 /* Copy B Thumb instructions. */
5049 static int
5050 thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
5051 struct displaced_step_closure *dsc)
5052 {
5053 unsigned int cond = 0;
5054 int offset = 0;
5055 unsigned short bit_12_15 = bits (insn, 12, 15);
5056 CORE_ADDR from = dsc->insn_addr;
5057
5058 if (bit_12_15 == 0xd)
5059 {
5060 /* offset = SignExtend (imm8:0, 32) */
5061 offset = sbits ((insn << 1), 0, 8);
5062 cond = bits (insn, 8, 11);
5063 }
5064 else if (bit_12_15 == 0xe) /* Encoding T2 */
5065 {
5066 offset = sbits ((insn << 1), 0, 11);
5067 cond = INST_AL;
5068 }
5069
5070 if (debug_displaced)
5071 fprintf_unfiltered (gdb_stdlog,
5072 "displaced: copying b immediate insn %.4x "
5073 "with offset %d\n", insn, offset);
5074
5075 dsc->u.branch.cond = cond;
5076 dsc->u.branch.link = 0;
5077 dsc->u.branch.exchange = 0;
5078 dsc->u.branch.dest = from + 4 + offset;
5079
5080 dsc->modinsn[0] = THUMB_NOP;
5081
5082 dsc->cleanup = &cleanup_branch;
5083
5084 return 0;
5085 }
5086
5087 /* Copy BX/BLX with register-specified destinations. */
5088
5089 static void
5090 install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
5091 struct displaced_step_closure *dsc, int link,
5092 unsigned int cond, unsigned int rm)
5093 {
5094 /* Implement {BX,BLX}<cond> <reg>" as:
5095
5096 Preparation: cond <- instruction condition
5097 Insn: mov r0, r0 (nop)
5098 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5099
5100 Don't set r14 in cleanup for BX. */
5101
5102 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
5103
5104 dsc->u.branch.cond = cond;
5105 dsc->u.branch.link = link;
5106
5107 dsc->u.branch.exchange = 1;
5108
5109 dsc->cleanup = &cleanup_branch;
5110 }
5111
5112 static int
5113 arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
5114 struct regcache *regs, struct displaced_step_closure *dsc)
5115 {
5116 unsigned int cond = bits (insn, 28, 31);
5117 /* BX: x12xxx1x
5118 BLX: x12xxx3x. */
5119 int link = bit (insn, 5);
5120 unsigned int rm = bits (insn, 0, 3);
5121
5122 if (debug_displaced)
5123 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5124 (unsigned long) insn);
5125
5126 dsc->modinsn[0] = ARM_NOP;
5127
5128 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
5129 return 0;
5130 }
5131
5132 static int
5133 thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5134 struct regcache *regs,
5135 struct displaced_step_closure *dsc)
5136 {
5137 int link = bit (insn, 7);
5138 unsigned int rm = bits (insn, 3, 6);
5139
5140 if (debug_displaced)
5141 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5142 (unsigned short) insn);
5143
5144 dsc->modinsn[0] = THUMB_NOP;
5145
5146 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5147
5148 return 0;
5149 }
5150
5151
5152 /* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
5153
5154 static void
5155 cleanup_alu_imm (struct gdbarch *gdbarch,
5156 struct regcache *regs, struct displaced_step_closure *dsc)
5157 {
5158 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
5159 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5160 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5161 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5162 }
5163
5164 static int
5165 arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5166 struct displaced_step_closure *dsc)
5167 {
5168 unsigned int rn = bits (insn, 16, 19);
5169 unsigned int rd = bits (insn, 12, 15);
5170 unsigned int op = bits (insn, 21, 24);
5171 int is_mov = (op == 0xd);
5172 ULONGEST rd_val, rn_val;
5173
5174 if (!insn_references_pc (insn, 0x000ff000ul))
5175 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
5176
5177 if (debug_displaced)
5178 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5179 "%.8lx\n", is_mov ? "move" : "ALU",
5180 (unsigned long) insn);
5181
5182 /* Instruction is of form:
5183
5184 <op><cond> rd, [rn,] #imm
5185
5186 Rewrite as:
5187
5188 Preparation: tmp1, tmp2 <- r0, r1;
5189 r0, r1 <- rd, rn
5190 Insn: <op><cond> r0, r1, #imm
5191 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5192 */
5193
5194 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5195 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5196 rn_val = displaced_read_reg (regs, dsc, rn);
5197 rd_val = displaced_read_reg (regs, dsc, rd);
5198 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5199 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5200 dsc->rd = rd;
5201
5202 if (is_mov)
5203 dsc->modinsn[0] = insn & 0xfff00fff;
5204 else
5205 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5206
5207 dsc->cleanup = &cleanup_alu_imm;
5208
5209 return 0;
5210 }
5211
5212 static int
5213 thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5214 uint16_t insn2, struct regcache *regs,
5215 struct displaced_step_closure *dsc)
5216 {
5217 unsigned int op = bits (insn1, 5, 8);
5218 unsigned int rn, rm, rd;
5219 ULONGEST rd_val, rn_val;
5220
5221 rn = bits (insn1, 0, 3); /* Rn */
5222 rm = bits (insn2, 0, 3); /* Rm */
5223 rd = bits (insn2, 8, 11); /* Rd */
5224
5225 /* This routine is only called for instruction MOV. */
5226 gdb_assert (op == 0x2 && rn == 0xf);
5227
5228 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5229 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5230
5231 if (debug_displaced)
5232 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5233 "ALU", insn1, insn2);
5234
5235 /* Instruction is of form:
5236
5237 <op><cond> rd, [rn,] #imm
5238
5239 Rewrite as:
5240
5241 Preparation: tmp1, tmp2 <- r0, r1;
5242 r0, r1 <- rd, rn
5243 Insn: <op><cond> r0, r1, #imm
5244 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5245 */
5246
5247 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5248 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5249 rn_val = displaced_read_reg (regs, dsc, rn);
5250 rd_val = displaced_read_reg (regs, dsc, rd);
5251 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5252 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5253 dsc->rd = rd;
5254
5255 dsc->modinsn[0] = insn1;
5256 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5257 dsc->numinsns = 2;
5258
5259 dsc->cleanup = &cleanup_alu_imm;
5260
5261 return 0;
5262 }
5263
5264 /* Copy/cleanup arithmetic/logic insns with register RHS. */
5265
5266 static void
5267 cleanup_alu_reg (struct gdbarch *gdbarch,
5268 struct regcache *regs, struct displaced_step_closure *dsc)
5269 {
5270 ULONGEST rd_val;
5271 int i;
5272
5273 rd_val = displaced_read_reg (regs, dsc, 0);
5274
5275 for (i = 0; i < 3; i++)
5276 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5277
5278 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5279 }
5280
5281 static void
5282 install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
5283 struct displaced_step_closure *dsc,
5284 unsigned int rd, unsigned int rn, unsigned int rm)
5285 {
5286 ULONGEST rd_val, rn_val, rm_val;
5287
5288 /* Instruction is of form:
5289
5290 <op><cond> rd, [rn,] rm [, <shift>]
5291
5292 Rewrite as:
5293
5294 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5295 r0, r1, r2 <- rd, rn, rm
5296 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
5297 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5298 */
5299
5300 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5301 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5302 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5303 rd_val = displaced_read_reg (regs, dsc, rd);
5304 rn_val = displaced_read_reg (regs, dsc, rn);
5305 rm_val = displaced_read_reg (regs, dsc, rm);
5306 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5307 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5308 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5309 dsc->rd = rd;
5310
5311 dsc->cleanup = &cleanup_alu_reg;
5312 }
5313
5314 static int
5315 arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5316 struct displaced_step_closure *dsc)
5317 {
5318 unsigned int op = bits (insn, 21, 24);
5319 int is_mov = (op == 0xd);
5320
5321 if (!insn_references_pc (insn, 0x000ff00ful))
5322 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5323
5324 if (debug_displaced)
5325 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5326 is_mov ? "move" : "ALU", (unsigned long) insn);
5327
5328 if (is_mov)
5329 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5330 else
5331 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5332
5333 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5334 bits (insn, 0, 3));
5335 return 0;
5336 }
5337
5338 static int
5339 thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5340 struct regcache *regs,
5341 struct displaced_step_closure *dsc)
5342 {
5343 unsigned rm, rd;
5344
5345 rm = bits (insn, 3, 6);
5346 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
5347
5348 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
5349 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5350
5351 if (debug_displaced)
5352 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5353 (unsigned short) insn);
5354
5355 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
5356
5357 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
5358
5359 return 0;
5360 }
5361
5362 /* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5363
5364 static void
5365 cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
5366 struct regcache *regs,
5367 struct displaced_step_closure *dsc)
5368 {
5369 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
5370 int i;
5371
5372 for (i = 0; i < 4; i++)
5373 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5374
5375 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5376 }
5377
5378 static void
5379 install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
5380 struct displaced_step_closure *dsc,
5381 unsigned int rd, unsigned int rn, unsigned int rm,
5382 unsigned rs)
5383 {
5384 int i;
5385 ULONGEST rd_val, rn_val, rm_val, rs_val;
5386
5387 /* Instruction is of form:
5388
5389 <op><cond> rd, [rn,] rm, <shift> rs
5390
5391 Rewrite as:
5392
5393 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5394 r0, r1, r2, r3 <- rd, rn, rm, rs
5395 Insn: <op><cond> r0, r1, r2, <shift> r3
5396 Cleanup: tmp5 <- r0
5397 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5398 rd <- tmp5
5399 */
5400
5401 for (i = 0; i < 4; i++)
5402 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
5403
5404 rd_val = displaced_read_reg (regs, dsc, rd);
5405 rn_val = displaced_read_reg (regs, dsc, rn);
5406 rm_val = displaced_read_reg (regs, dsc, rm);
5407 rs_val = displaced_read_reg (regs, dsc, rs);
5408 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5409 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5410 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5411 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5412 dsc->rd = rd;
5413 dsc->cleanup = &cleanup_alu_shifted_reg;
5414 }
5415
5416 static int
5417 arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5418 struct regcache *regs,
5419 struct displaced_step_closure *dsc)
5420 {
5421 unsigned int op = bits (insn, 21, 24);
5422 int is_mov = (op == 0xd);
5423 unsigned int rd, rn, rm, rs;
5424
5425 if (!insn_references_pc (insn, 0x000fff0ful))
5426 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5427
5428 if (debug_displaced)
5429 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5430 "%.8lx\n", is_mov ? "move" : "ALU",
5431 (unsigned long) insn);
5432
5433 rn = bits (insn, 16, 19);
5434 rm = bits (insn, 0, 3);
5435 rs = bits (insn, 8, 11);
5436 rd = bits (insn, 12, 15);
5437
5438 if (is_mov)
5439 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5440 else
5441 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5442
5443 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
5444
5445 return 0;
5446 }
5447
5448 /* Clean up load instructions. */
5449
5450 static void
5451 cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
5452 struct displaced_step_closure *dsc)
5453 {
5454 ULONGEST rt_val, rt_val2 = 0, rn_val;
5455
5456 rt_val = displaced_read_reg (regs, dsc, 0);
5457 if (dsc->u.ldst.xfersize == 8)
5458 rt_val2 = displaced_read_reg (regs, dsc, 1);
5459 rn_val = displaced_read_reg (regs, dsc, 2);
5460
5461 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5462 if (dsc->u.ldst.xfersize > 4)
5463 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5464 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5465 if (!dsc->u.ldst.immed)
5466 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5467
5468 /* Handle register writeback. */
5469 if (dsc->u.ldst.writeback)
5470 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5471 /* Put result in right place. */
5472 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5473 if (dsc->u.ldst.xfersize == 8)
5474 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5475 }
5476
5477 /* Clean up store instructions. */
5478
5479 static void
5480 cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
5481 struct displaced_step_closure *dsc)
5482 {
5483 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
5484
5485 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5486 if (dsc->u.ldst.xfersize > 4)
5487 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5488 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5489 if (!dsc->u.ldst.immed)
5490 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5491 if (!dsc->u.ldst.restore_r4)
5492 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5493
5494 /* Writeback. */
5495 if (dsc->u.ldst.writeback)
5496 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5497 }
5498
5499 /* Copy "extra" load/store instructions. These are halfword/doubleword
5500 transfers, which have a different encoding to byte/word transfers. */
5501
5502 static int
5503 arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
5504 struct regcache *regs, struct displaced_step_closure *dsc)
5505 {
5506 unsigned int op1 = bits (insn, 20, 24);
5507 unsigned int op2 = bits (insn, 5, 6);
5508 unsigned int rt = bits (insn, 12, 15);
5509 unsigned int rn = bits (insn, 16, 19);
5510 unsigned int rm = bits (insn, 0, 3);
5511 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5512 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5513 int immed = (op1 & 0x4) != 0;
5514 int opcode;
5515 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
5516
5517 if (!insn_references_pc (insn, 0x000ff00ful))
5518 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
5519
5520 if (debug_displaced)
5521 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
5522 "insn %.8lx\n", unprivileged ? "unprivileged " : "",
5523 (unsigned long) insn);
5524
5525 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5526
5527 if (opcode < 0)
5528 internal_error (__FILE__, __LINE__,
5529 _("copy_extra_ld_st: instruction decode error"));
5530
5531 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5532 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5533 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5534 if (!immed)
5535 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5536
5537 rt_val = displaced_read_reg (regs, dsc, rt);
5538 if (bytesize[opcode] == 8)
5539 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5540 rn_val = displaced_read_reg (regs, dsc, rn);
5541 if (!immed)
5542 rm_val = displaced_read_reg (regs, dsc, rm);
5543
5544 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5545 if (bytesize[opcode] == 8)
5546 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5547 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5548 if (!immed)
5549 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5550
5551 dsc->rd = rt;
5552 dsc->u.ldst.xfersize = bytesize[opcode];
5553 dsc->u.ldst.rn = rn;
5554 dsc->u.ldst.immed = immed;
5555 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5556 dsc->u.ldst.restore_r4 = 0;
5557
5558 if (immed)
5559 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5560 ->
5561 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5562 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5563 else
5564 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5565 ->
5566 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5567 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5568
5569 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5570
5571 return 0;
5572 }
5573
5574 /* Copy byte/half word/word loads and stores. */
5575
5576 static void
5577 install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5578 struct displaced_step_closure *dsc, int load,
5579 int immed, int writeback, int size, int usermode,
5580 int rt, int rm, int rn)
5581 {
5582 ULONGEST rt_val, rn_val, rm_val = 0;
5583
5584 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5585 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5586 if (!immed)
5587 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5588 if (!load)
5589 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
5590
5591 rt_val = displaced_read_reg (regs, dsc, rt);
5592 rn_val = displaced_read_reg (regs, dsc, rn);
5593 if (!immed)
5594 rm_val = displaced_read_reg (regs, dsc, rm);
5595
5596 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5597 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5598 if (!immed)
5599 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5600 dsc->rd = rt;
5601 dsc->u.ldst.xfersize = size;
5602 dsc->u.ldst.rn = rn;
5603 dsc->u.ldst.immed = immed;
5604 dsc->u.ldst.writeback = writeback;
5605
5606 /* To write PC we can do:
5607
5608 Before this sequence of instructions:
5609 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5610 r2 is the Rn value got from dispalced_read_reg.
5611
5612 Insn1: push {pc} Write address of STR instruction + offset on stack
5613 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5614 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5615 = addr(Insn1) + offset - addr(Insn3) - 8
5616 = offset - 16
5617 Insn4: add r4, r4, #8 r4 = offset - 8
5618 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5619 = from + offset
5620 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
5621
5622 Otherwise we don't know what value to write for PC, since the offset is
5623 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5624 of this can be found in Section "Saving from r15" in
5625 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
5626
5627 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5628 }
5629
5630
5631 static int
5632 thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5633 uint16_t insn2, struct regcache *regs,
5634 struct displaced_step_closure *dsc, int size)
5635 {
5636 unsigned int u_bit = bit (insn1, 7);
5637 unsigned int rt = bits (insn2, 12, 15);
5638 int imm12 = bits (insn2, 0, 11);
5639 ULONGEST pc_val;
5640
5641 if (debug_displaced)
5642 fprintf_unfiltered (gdb_stdlog,
5643 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5644 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5645 imm12);
5646
5647 if (!u_bit)
5648 imm12 = -1 * imm12;
5649
5650 /* Rewrite instruction LDR Rt imm12 into:
5651
5652 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5653
5654 LDR R0, R2, R3,
5655
5656 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5657
5658
5659 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5660 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5661 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5662
5663 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5664
5665 pc_val = pc_val & 0xfffffffc;
5666
5667 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5668 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5669
5670 dsc->rd = rt;
5671
5672 dsc->u.ldst.xfersize = size;
5673 dsc->u.ldst.immed = 0;
5674 dsc->u.ldst.writeback = 0;
5675 dsc->u.ldst.restore_r4 = 0;
5676
5677 /* LDR R0, R2, R3 */
5678 dsc->modinsn[0] = 0xf852;
5679 dsc->modinsn[1] = 0x3;
5680 dsc->numinsns = 2;
5681
5682 dsc->cleanup = &cleanup_load;
5683
5684 return 0;
5685 }
5686
5687 static int
5688 thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5689 uint16_t insn2, struct regcache *regs,
5690 struct displaced_step_closure *dsc,
5691 int writeback, int immed)
5692 {
5693 unsigned int rt = bits (insn2, 12, 15);
5694 unsigned int rn = bits (insn1, 0, 3);
5695 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5696 /* In LDR (register), there is also a register Rm, which is not allowed to
5697 be PC, so we don't have to check it. */
5698
5699 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5700 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5701 dsc);
5702
5703 if (debug_displaced)
5704 fprintf_unfiltered (gdb_stdlog,
5705 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5706 rt, rn, insn1, insn2);
5707
5708 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5709 0, rt, rm, rn);
5710
5711 dsc->u.ldst.restore_r4 = 0;
5712
5713 if (immed)
5714 /* ldr[b]<cond> rt, [rn, #imm], etc.
5715 ->
5716 ldr[b]<cond> r0, [r2, #imm]. */
5717 {
5718 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5719 dsc->modinsn[1] = insn2 & 0x0fff;
5720 }
5721 else
5722 /* ldr[b]<cond> rt, [rn, rm], etc.
5723 ->
5724 ldr[b]<cond> r0, [r2, r3]. */
5725 {
5726 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5727 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5728 }
5729
5730 dsc->numinsns = 2;
5731
5732 return 0;
5733 }
5734
5735
5736 static int
5737 arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5738 struct regcache *regs,
5739 struct displaced_step_closure *dsc,
5740 int load, int size, int usermode)
5741 {
5742 int immed = !bit (insn, 25);
5743 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5744 unsigned int rt = bits (insn, 12, 15);
5745 unsigned int rn = bits (insn, 16, 19);
5746 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5747
5748 if (!insn_references_pc (insn, 0x000ff00ful))
5749 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5750
5751 if (debug_displaced)
5752 fprintf_unfiltered (gdb_stdlog,
5753 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
5754 load ? (size == 1 ? "ldrb" : "ldr")
5755 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
5756 rt, rn,
5757 (unsigned long) insn);
5758
5759 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5760 usermode, rt, rm, rn);
5761
5762 if (load || rt != ARM_PC_REGNUM)
5763 {
5764 dsc->u.ldst.restore_r4 = 0;
5765
5766 if (immed)
5767 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5768 ->
5769 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5770 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5771 else
5772 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5773 ->
5774 {ldr,str}[b]<cond> r0, [r2, r3]. */
5775 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5776 }
5777 else
5778 {
5779 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5780 dsc->u.ldst.restore_r4 = 1;
5781 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5782 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
5783 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5784 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5785 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5786
5787 /* As above. */
5788 if (immed)
5789 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5790 else
5791 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5792
5793 dsc->numinsns = 6;
5794 }
5795
5796 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5797
5798 return 0;
5799 }
5800
5801 /* Cleanup LDM instructions with fully-populated register list. This is an
5802 unfortunate corner case: it's impossible to implement correctly by modifying
5803 the instruction. The issue is as follows: we have an instruction,
5804
5805 ldm rN, {r0-r15}
5806
5807 which we must rewrite to avoid loading PC. A possible solution would be to
5808 do the load in two halves, something like (with suitable cleanup
5809 afterwards):
5810
5811 mov r8, rN
5812 ldm[id][ab] r8!, {r0-r7}
5813 str r7, <temp>
5814 ldm[id][ab] r8, {r7-r14}
5815 <bkpt>
5816
5817 but at present there's no suitable place for <temp>, since the scratch space
5818 is overwritten before the cleanup routine is called. For now, we simply
5819 emulate the instruction. */
5820
5821 static void
5822 cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
5823 struct displaced_step_closure *dsc)
5824 {
5825 int inc = dsc->u.block.increment;
5826 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5827 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5828 uint32_t regmask = dsc->u.block.regmask;
5829 int regno = inc ? 0 : 15;
5830 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5831 int exception_return = dsc->u.block.load && dsc->u.block.user
5832 && (regmask & 0x8000) != 0;
5833 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
5834 int do_transfer = condition_true (dsc->u.block.cond, status);
5835 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5836
5837 if (!do_transfer)
5838 return;
5839
5840 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5841 sensible we can do here. Complain loudly. */
5842 if (exception_return)
5843 error (_("Cannot single-step exception return"));
5844
5845 /* We don't handle any stores here for now. */
5846 gdb_assert (dsc->u.block.load != 0);
5847
5848 if (debug_displaced)
5849 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5850 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5851 dsc->u.block.increment ? "inc" : "dec",
5852 dsc->u.block.before ? "before" : "after");
5853
5854 while (regmask)
5855 {
5856 uint32_t memword;
5857
5858 if (inc)
5859 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
5860 regno++;
5861 else
5862 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5863 regno--;
5864
5865 xfer_addr += bump_before;
5866
5867 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5868 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5869
5870 xfer_addr += bump_after;
5871
5872 regmask &= ~(1 << regno);
5873 }
5874
5875 if (dsc->u.block.writeback)
5876 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5877 CANNOT_WRITE_PC);
5878 }
5879
5880 /* Clean up an STM which included the PC in the register list. */
5881
5882 static void
5883 cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
5884 struct displaced_step_closure *dsc)
5885 {
5886 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
5887 int store_executed = condition_true (dsc->u.block.cond, status);
5888 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5889 CORE_ADDR stm_insn_addr;
5890 uint32_t pc_val;
5891 long offset;
5892 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5893
5894 /* If condition code fails, there's nothing else to do. */
5895 if (!store_executed)
5896 return;
5897
5898 if (dsc->u.block.increment)
5899 {
5900 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5901
5902 if (dsc->u.block.before)
5903 pc_stored_at += 4;
5904 }
5905 else
5906 {
5907 pc_stored_at = dsc->u.block.xfer_addr;
5908
5909 if (dsc->u.block.before)
5910 pc_stored_at -= 4;
5911 }
5912
5913 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5914 stm_insn_addr = dsc->scratch_base;
5915 offset = pc_val - stm_insn_addr;
5916
5917 if (debug_displaced)
5918 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5919 "STM instruction\n", offset);
5920
5921 /* Rewrite the stored PC to the proper value for the non-displaced original
5922 instruction. */
5923 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5924 dsc->insn_addr + offset);
5925 }
5926
5927 /* Clean up an LDM which includes the PC in the register list. We clumped all
5928 the registers in the transferred list into a contiguous range r0...rX (to
5929 avoid loading PC directly and losing control of the debugged program), so we
5930 must undo that here. */
5931
5932 static void
5933 cleanup_block_load_pc (struct gdbarch *gdbarch,
5934 struct regcache *regs,
5935 struct displaced_step_closure *dsc)
5936 {
5937 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
5938 int load_executed = condition_true (dsc->u.block.cond, status);
5939 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
5940 unsigned int regs_loaded = bitcount (mask);
5941 unsigned int num_to_shuffle = regs_loaded, clobbered;
5942
5943 /* The method employed here will fail if the register list is fully populated
5944 (we need to avoid loading PC directly). */
5945 gdb_assert (num_to_shuffle < 16);
5946
5947 if (!load_executed)
5948 return;
5949
5950 clobbered = (1 << num_to_shuffle) - 1;
5951
5952 while (num_to_shuffle > 0)
5953 {
5954 if ((mask & (1 << write_reg)) != 0)
5955 {
5956 unsigned int read_reg = num_to_shuffle - 1;
5957
5958 if (read_reg != write_reg)
5959 {
5960 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
5961 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5962 if (debug_displaced)
5963 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5964 "loaded register r%d to r%d\n"), read_reg,
5965 write_reg);
5966 }
5967 else if (debug_displaced)
5968 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5969 "r%d already in the right place\n"),
5970 write_reg);
5971
5972 clobbered &= ~(1 << write_reg);
5973
5974 num_to_shuffle--;
5975 }
5976
5977 write_reg--;
5978 }
5979
5980 /* Restore any registers we scribbled over. */
5981 for (write_reg = 0; clobbered != 0; write_reg++)
5982 {
5983 if ((clobbered & (1 << write_reg)) != 0)
5984 {
5985 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5986 CANNOT_WRITE_PC);
5987 if (debug_displaced)
5988 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5989 "clobbered register r%d\n"), write_reg);
5990 clobbered &= ~(1 << write_reg);
5991 }
5992 }
5993
5994 /* Perform register writeback manually. */
5995 if (dsc->u.block.writeback)
5996 {
5997 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5998
5999 if (dsc->u.block.increment)
6000 new_rn_val += regs_loaded * 4;
6001 else
6002 new_rn_val -= regs_loaded * 4;
6003
6004 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
6005 CANNOT_WRITE_PC);
6006 }
6007 }
6008
6009 /* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
6010 in user-level code (in particular exception return, ldm rn, {...pc}^). */
6011
6012 static int
6013 arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
6014 struct regcache *regs,
6015 struct displaced_step_closure *dsc)
6016 {
6017 int load = bit (insn, 20);
6018 int user = bit (insn, 22);
6019 int increment = bit (insn, 23);
6020 int before = bit (insn, 24);
6021 int writeback = bit (insn, 21);
6022 int rn = bits (insn, 16, 19);
6023
6024 /* Block transfers which don't mention PC can be run directly
6025 out-of-line. */
6026 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
6027 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
6028
6029 if (rn == ARM_PC_REGNUM)
6030 {
6031 warning (_("displaced: Unpredictable LDM or STM with "
6032 "base register r15"));
6033 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
6034 }
6035
6036 if (debug_displaced)
6037 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6038 "%.8lx\n", (unsigned long) insn);
6039
6040 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
6041 dsc->u.block.rn = rn;
6042
6043 dsc->u.block.load = load;
6044 dsc->u.block.user = user;
6045 dsc->u.block.increment = increment;
6046 dsc->u.block.before = before;
6047 dsc->u.block.writeback = writeback;
6048 dsc->u.block.cond = bits (insn, 28, 31);
6049
6050 dsc->u.block.regmask = insn & 0xffff;
6051
6052 if (load)
6053 {
6054 if ((insn & 0xffff) == 0xffff)
6055 {
6056 /* LDM with a fully-populated register list. This case is
6057 particularly tricky. Implement for now by fully emulating the
6058 instruction (which might not behave perfectly in all cases, but
6059 these instructions should be rare enough for that not to matter
6060 too much). */
6061 dsc->modinsn[0] = ARM_NOP;
6062
6063 dsc->cleanup = &cleanup_block_load_all;
6064 }
6065 else
6066 {
6067 /* LDM of a list of registers which includes PC. Implement by
6068 rewriting the list of registers to be transferred into a
6069 contiguous chunk r0...rX before doing the transfer, then shuffling
6070 registers into the correct places in the cleanup routine. */
6071 unsigned int regmask = insn & 0xffff;
6072 unsigned int num_in_list = bitcount (regmask), new_regmask;
6073 unsigned int i;
6074
6075 for (i = 0; i < num_in_list; i++)
6076 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6077
6078 /* Writeback makes things complicated. We need to avoid clobbering
6079 the base register with one of the registers in our modified
6080 register list, but just using a different register can't work in
6081 all cases, e.g.:
6082
6083 ldm r14!, {r0-r13,pc}
6084
6085 which would need to be rewritten as:
6086
6087 ldm rN!, {r0-r14}
6088
6089 but that can't work, because there's no free register for N.
6090
6091 Solve this by turning off the writeback bit, and emulating
6092 writeback manually in the cleanup routine. */
6093
6094 if (writeback)
6095 insn &= ~(1 << 21);
6096
6097 new_regmask = (1 << num_in_list) - 1;
6098
6099 if (debug_displaced)
6100 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6101 "{..., pc}: original reg list %.4x, modified "
6102 "list %.4x\n"), rn, writeback ? "!" : "",
6103 (int) insn & 0xffff, new_regmask);
6104
6105 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6106
6107 dsc->cleanup = &cleanup_block_load_pc;
6108 }
6109 }
6110 else
6111 {
6112 /* STM of a list of registers which includes PC. Run the instruction
6113 as-is, but out of line: this will store the wrong value for the PC,
6114 so we must manually fix up the memory in the cleanup routine.
6115 Doing things this way has the advantage that we can auto-detect
6116 the offset of the PC write (which is architecture-dependent) in
6117 the cleanup routine. */
6118 dsc->modinsn[0] = insn;
6119
6120 dsc->cleanup = &cleanup_block_store_pc;
6121 }
6122
6123 return 0;
6124 }
6125
6126 static int
6127 thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6128 struct regcache *regs,
6129 struct displaced_step_closure *dsc)
6130 {
6131 int rn = bits (insn1, 0, 3);
6132 int load = bit (insn1, 4);
6133 int writeback = bit (insn1, 5);
6134
6135 /* Block transfers which don't mention PC can be run directly
6136 out-of-line. */
6137 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6138 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
6139
6140 if (rn == ARM_PC_REGNUM)
6141 {
6142 warning (_("displaced: Unpredictable LDM or STM with "
6143 "base register r15"));
6144 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6145 "unpredictable ldm/stm", dsc);
6146 }
6147
6148 if (debug_displaced)
6149 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6150 "%.4x%.4x\n", insn1, insn2);
6151
6152 /* Clear bit 13, since it should be always zero. */
6153 dsc->u.block.regmask = (insn2 & 0xdfff);
6154 dsc->u.block.rn = rn;
6155
6156 dsc->u.block.load = load;
6157 dsc->u.block.user = 0;
6158 dsc->u.block.increment = bit (insn1, 7);
6159 dsc->u.block.before = bit (insn1, 8);
6160 dsc->u.block.writeback = writeback;
6161 dsc->u.block.cond = INST_AL;
6162 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
6163
6164 if (load)
6165 {
6166 if (dsc->u.block.regmask == 0xffff)
6167 {
6168 /* This branch is impossible to happen. */
6169 gdb_assert (0);
6170 }
6171 else
6172 {
6173 unsigned int regmask = dsc->u.block.regmask;
6174 unsigned int num_in_list = bitcount (regmask), new_regmask;
6175 unsigned int i;
6176
6177 for (i = 0; i < num_in_list; i++)
6178 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6179
6180 if (writeback)
6181 insn1 &= ~(1 << 5);
6182
6183 new_regmask = (1 << num_in_list) - 1;
6184
6185 if (debug_displaced)
6186 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6187 "{..., pc}: original reg list %.4x, modified "
6188 "list %.4x\n"), rn, writeback ? "!" : "",
6189 (int) dsc->u.block.regmask, new_regmask);
6190
6191 dsc->modinsn[0] = insn1;
6192 dsc->modinsn[1] = (new_regmask & 0xffff);
6193 dsc->numinsns = 2;
6194
6195 dsc->cleanup = &cleanup_block_load_pc;
6196 }
6197 }
6198 else
6199 {
6200 dsc->modinsn[0] = insn1;
6201 dsc->modinsn[1] = insn2;
6202 dsc->numinsns = 2;
6203 dsc->cleanup = &cleanup_block_store_pc;
6204 }
6205 return 0;
6206 }
6207
6208 /* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6209 This is used to avoid a dependency on BFD's bfd_endian enum. */
6210
6211 ULONGEST
6212 arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6213 int byte_order)
6214 {
6215 return read_memory_unsigned_integer (memaddr, len,
6216 (enum bfd_endian) byte_order);
6217 }
6218
6219 /* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6220
6221 CORE_ADDR
6222 arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6223 CORE_ADDR val)
6224 {
6225 return gdbarch_addr_bits_remove (get_regcache_arch (self->regcache), val);
6226 }
6227
6228 /* Wrapper over syscall_next_pc for use in get_next_pcs. */
6229
6230 static CORE_ADDR
6231 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
6232 {
6233 return 0;
6234 }
6235
6236 /* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6237
6238 int
6239 arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6240 {
6241 return arm_is_thumb (self->regcache);
6242 }
6243
6244 /* single_step() is called just before we want to resume the inferior,
6245 if we want to single-step it but there is no hardware or kernel
6246 single-step support. We find the target of the coming instructions
6247 and breakpoint them. */
6248
6249 std::vector<CORE_ADDR>
6250 arm_software_single_step (struct regcache *regcache)
6251 {
6252 struct gdbarch *gdbarch = get_regcache_arch (regcache);
6253 struct arm_get_next_pcs next_pcs_ctx;
6254
6255 arm_get_next_pcs_ctor (&next_pcs_ctx,
6256 &arm_get_next_pcs_ops,
6257 gdbarch_byte_order (gdbarch),
6258 gdbarch_byte_order_for_code (gdbarch),
6259 0,
6260 regcache);
6261
6262 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
6263
6264 for (CORE_ADDR &pc_ref : next_pcs)
6265 pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
6266
6267 return next_pcs;
6268 }
6269
6270 /* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6271 for Linux, where some SVC instructions must be treated specially. */
6272
6273 static void
6274 cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
6275 struct displaced_step_closure *dsc)
6276 {
6277 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6278
6279 if (debug_displaced)
6280 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6281 "%.8lx\n", (unsigned long) resume_addr);
6282
6283 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6284 }
6285
6286
6287 /* Common copy routine for svc instruciton. */
6288
6289 static int
6290 install_svc (struct gdbarch *gdbarch, struct regcache *regs,
6291 struct displaced_step_closure *dsc)
6292 {
6293 /* Preparation: none.
6294 Insn: unmodified svc.
6295 Cleanup: pc <- insn_addr + insn_size. */
6296
6297 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6298 instruction. */
6299 dsc->wrote_to_pc = 1;
6300
6301 /* Allow OS-specific code to override SVC handling. */
6302 if (dsc->u.svc.copy_svc_os)
6303 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6304 else
6305 {
6306 dsc->cleanup = &cleanup_svc;
6307 return 0;
6308 }
6309 }
6310
6311 static int
6312 arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
6313 struct regcache *regs, struct displaced_step_closure *dsc)
6314 {
6315
6316 if (debug_displaced)
6317 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6318 (unsigned long) insn);
6319
6320 dsc->modinsn[0] = insn;
6321
6322 return install_svc (gdbarch, regs, dsc);
6323 }
6324
6325 static int
6326 thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
6327 struct regcache *regs, struct displaced_step_closure *dsc)
6328 {
6329
6330 if (debug_displaced)
6331 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6332 insn);
6333
6334 dsc->modinsn[0] = insn;
6335
6336 return install_svc (gdbarch, regs, dsc);
6337 }
6338
6339 /* Copy undefined instructions. */
6340
6341 static int
6342 arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
6343 struct displaced_step_closure *dsc)
6344 {
6345 if (debug_displaced)
6346 fprintf_unfiltered (gdb_stdlog,
6347 "displaced: copying undefined insn %.8lx\n",
6348 (unsigned long) insn);
6349
6350 dsc->modinsn[0] = insn;
6351
6352 return 0;
6353 }
6354
6355 static int
6356 thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6357 struct displaced_step_closure *dsc)
6358 {
6359
6360 if (debug_displaced)
6361 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6362 "%.4x %.4x\n", (unsigned short) insn1,
6363 (unsigned short) insn2);
6364
6365 dsc->modinsn[0] = insn1;
6366 dsc->modinsn[1] = insn2;
6367 dsc->numinsns = 2;
6368
6369 return 0;
6370 }
6371
6372 /* Copy unpredictable instructions. */
6373
6374 static int
6375 arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
6376 struct displaced_step_closure *dsc)
6377 {
6378 if (debug_displaced)
6379 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6380 "%.8lx\n", (unsigned long) insn);
6381
6382 dsc->modinsn[0] = insn;
6383
6384 return 0;
6385 }
6386
6387 /* The decode_* functions are instruction decoding helpers. They mostly follow
6388 the presentation in the ARM ARM. */
6389
6390 static int
6391 arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6392 struct regcache *regs,
6393 struct displaced_step_closure *dsc)
6394 {
6395 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6396 unsigned int rn = bits (insn, 16, 19);
6397
6398 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0x1) == 0x0)
6399 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
6400 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0x1) == 0x1)
6401 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
6402 else if ((op1 & 0x60) == 0x20)
6403 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
6404 else if ((op1 & 0x71) == 0x40)
6405 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6406 dsc);
6407 else if ((op1 & 0x77) == 0x41)
6408 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
6409 else if ((op1 & 0x77) == 0x45)
6410 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
6411 else if ((op1 & 0x77) == 0x51)
6412 {
6413 if (rn != 0xf)
6414 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
6415 else
6416 return arm_copy_unpred (gdbarch, insn, dsc);
6417 }
6418 else if ((op1 & 0x77) == 0x55)
6419 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
6420 else if (op1 == 0x57)
6421 switch (op2)
6422 {
6423 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6424 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6425 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6426 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6427 default: return arm_copy_unpred (gdbarch, insn, dsc);
6428 }
6429 else if ((op1 & 0x63) == 0x43)
6430 return arm_copy_unpred (gdbarch, insn, dsc);
6431 else if ((op2 & 0x1) == 0x0)
6432 switch (op1 & ~0x80)
6433 {
6434 case 0x61:
6435 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
6436 case 0x65:
6437 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
6438 case 0x71: case 0x75:
6439 /* pld/pldw reg. */
6440 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
6441 case 0x63: case 0x67: case 0x73: case 0x77:
6442 return arm_copy_unpred (gdbarch, insn, dsc);
6443 default:
6444 return arm_copy_undef (gdbarch, insn, dsc);
6445 }
6446 else
6447 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
6448 }
6449
6450 static int
6451 arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6452 struct regcache *regs,
6453 struct displaced_step_closure *dsc)
6454 {
6455 if (bit (insn, 27) == 0)
6456 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
6457 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6458 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6459 {
6460 case 0x0: case 0x2:
6461 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
6462
6463 case 0x1: case 0x3:
6464 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
6465
6466 case 0x4: case 0x5: case 0x6: case 0x7:
6467 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
6468
6469 case 0x8:
6470 switch ((insn & 0xe00000) >> 21)
6471 {
6472 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6473 /* stc/stc2. */
6474 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6475
6476 case 0x2:
6477 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
6478
6479 default:
6480 return arm_copy_undef (gdbarch, insn, dsc);
6481 }
6482
6483 case 0x9:
6484 {
6485 int rn_f = (bits (insn, 16, 19) == 0xf);
6486 switch ((insn & 0xe00000) >> 21)
6487 {
6488 case 0x1: case 0x3:
6489 /* ldc/ldc2 imm (undefined for rn == pc). */
6490 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6491 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6492
6493 case 0x2:
6494 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
6495
6496 case 0x4: case 0x5: case 0x6: case 0x7:
6497 /* ldc/ldc2 lit (undefined for rn != pc). */
6498 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6499 : arm_copy_undef (gdbarch, insn, dsc);
6500
6501 default:
6502 return arm_copy_undef (gdbarch, insn, dsc);
6503 }
6504 }
6505
6506 case 0xa:
6507 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
6508
6509 case 0xb:
6510 if (bits (insn, 16, 19) == 0xf)
6511 /* ldc/ldc2 lit. */
6512 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6513 else
6514 return arm_copy_undef (gdbarch, insn, dsc);
6515
6516 case 0xc:
6517 if (bit (insn, 4))
6518 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
6519 else
6520 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
6521
6522 case 0xd:
6523 if (bit (insn, 4))
6524 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
6525 else
6526 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
6527
6528 default:
6529 return arm_copy_undef (gdbarch, insn, dsc);
6530 }
6531 }
6532
6533 /* Decode miscellaneous instructions in dp/misc encoding space. */
6534
6535 static int
6536 arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6537 struct regcache *regs,
6538 struct displaced_step_closure *dsc)
6539 {
6540 unsigned int op2 = bits (insn, 4, 6);
6541 unsigned int op = bits (insn, 21, 22);
6542
6543 switch (op2)
6544 {
6545 case 0x0:
6546 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
6547
6548 case 0x1:
6549 if (op == 0x1) /* bx. */
6550 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
6551 else if (op == 0x3)
6552 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
6553 else
6554 return arm_copy_undef (gdbarch, insn, dsc);
6555
6556 case 0x2:
6557 if (op == 0x1)
6558 /* Not really supported. */
6559 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
6560 else
6561 return arm_copy_undef (gdbarch, insn, dsc);
6562
6563 case 0x3:
6564 if (op == 0x1)
6565 return arm_copy_bx_blx_reg (gdbarch, insn,
6566 regs, dsc); /* blx register. */
6567 else
6568 return arm_copy_undef (gdbarch, insn, dsc);
6569
6570 case 0x5:
6571 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
6572
6573 case 0x7:
6574 if (op == 0x1)
6575 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
6576 else if (op == 0x3)
6577 /* Not really supported. */
6578 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
6579
6580 default:
6581 return arm_copy_undef (gdbarch, insn, dsc);
6582 }
6583 }
6584
6585 static int
6586 arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6587 struct regcache *regs,
6588 struct displaced_step_closure *dsc)
6589 {
6590 if (bit (insn, 25))
6591 switch (bits (insn, 20, 24))
6592 {
6593 case 0x10:
6594 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
6595
6596 case 0x14:
6597 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
6598
6599 case 0x12: case 0x16:
6600 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
6601
6602 default:
6603 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
6604 }
6605 else
6606 {
6607 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6608
6609 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
6610 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
6611 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
6612 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
6613 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
6614 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
6615 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
6616 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
6617 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
6618 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
6619 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
6620 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
6621 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
6622 /* 2nd arg means "unprivileged". */
6623 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6624 dsc);
6625 }
6626
6627 /* Should be unreachable. */
6628 return 1;
6629 }
6630
6631 static int
6632 arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6633 struct regcache *regs,
6634 struct displaced_step_closure *dsc)
6635 {
6636 int a = bit (insn, 25), b = bit (insn, 4);
6637 uint32_t op1 = bits (insn, 20, 24);
6638
6639 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6640 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
6641 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
6642 else if ((!a && (op1 & 0x17) == 0x02)
6643 || (a && (op1 & 0x17) == 0x02 && !b))
6644 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
6645 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6646 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
6647 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
6648 else if ((!a && (op1 & 0x17) == 0x03)
6649 || (a && (op1 & 0x17) == 0x03 && !b))
6650 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
6651 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6652 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
6653 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
6654 else if ((!a && (op1 & 0x17) == 0x06)
6655 || (a && (op1 & 0x17) == 0x06 && !b))
6656 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
6657 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6658 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
6659 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
6660 else if ((!a && (op1 & 0x17) == 0x07)
6661 || (a && (op1 & 0x17) == 0x07 && !b))
6662 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
6663
6664 /* Should be unreachable. */
6665 return 1;
6666 }
6667
6668 static int
6669 arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
6670 struct displaced_step_closure *dsc)
6671 {
6672 switch (bits (insn, 20, 24))
6673 {
6674 case 0x00: case 0x01: case 0x02: case 0x03:
6675 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
6676
6677 case 0x04: case 0x05: case 0x06: case 0x07:
6678 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
6679
6680 case 0x08: case 0x09: case 0x0a: case 0x0b:
6681 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
6682 return arm_copy_unmodified (gdbarch, insn,
6683 "decode/pack/unpack/saturate/reverse", dsc);
6684
6685 case 0x18:
6686 if (bits (insn, 5, 7) == 0) /* op2. */
6687 {
6688 if (bits (insn, 12, 15) == 0xf)
6689 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
6690 else
6691 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
6692 }
6693 else
6694 return arm_copy_undef (gdbarch, insn, dsc);
6695
6696 case 0x1a: case 0x1b:
6697 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
6698 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
6699 else
6700 return arm_copy_undef (gdbarch, insn, dsc);
6701
6702 case 0x1c: case 0x1d:
6703 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6704 {
6705 if (bits (insn, 0, 3) == 0xf)
6706 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
6707 else
6708 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
6709 }
6710 else
6711 return arm_copy_undef (gdbarch, insn, dsc);
6712
6713 case 0x1e: case 0x1f:
6714 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
6715 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
6716 else
6717 return arm_copy_undef (gdbarch, insn, dsc);
6718 }
6719
6720 /* Should be unreachable. */
6721 return 1;
6722 }
6723
6724 static int
6725 arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
6726 struct regcache *regs,
6727 struct displaced_step_closure *dsc)
6728 {
6729 if (bit (insn, 25))
6730 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
6731 else
6732 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
6733 }
6734
6735 static int
6736 arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6737 struct regcache *regs,
6738 struct displaced_step_closure *dsc)
6739 {
6740 unsigned int opcode = bits (insn, 20, 24);
6741
6742 switch (opcode)
6743 {
6744 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
6745 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
6746
6747 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6748 case 0x12: case 0x16:
6749 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
6750
6751 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6752 case 0x13: case 0x17:
6753 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
6754
6755 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6756 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6757 /* Note: no writeback for these instructions. Bit 25 will always be
6758 zero though (via caller), so the following works OK. */
6759 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6760 }
6761
6762 /* Should be unreachable. */
6763 return 1;
6764 }
6765
6766 /* Decode shifted register instructions. */
6767
6768 static int
6769 thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6770 uint16_t insn2, struct regcache *regs,
6771 struct displaced_step_closure *dsc)
6772 {
6773 /* PC is only allowed to be used in instruction MOV. */
6774
6775 unsigned int op = bits (insn1, 5, 8);
6776 unsigned int rn = bits (insn1, 0, 3);
6777
6778 if (op == 0x2 && rn == 0xf) /* MOV */
6779 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6780 else
6781 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6782 "dp (shift reg)", dsc);
6783 }
6784
6785
6786 /* Decode extension register load/store. Exactly the same as
6787 arm_decode_ext_reg_ld_st. */
6788
6789 static int
6790 thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6791 uint16_t insn2, struct regcache *regs,
6792 struct displaced_step_closure *dsc)
6793 {
6794 unsigned int opcode = bits (insn1, 4, 8);
6795
6796 switch (opcode)
6797 {
6798 case 0x04: case 0x05:
6799 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6800 "vfp/neon vmov", dsc);
6801
6802 case 0x08: case 0x0c: /* 01x00 */
6803 case 0x0a: case 0x0e: /* 01x10 */
6804 case 0x12: case 0x16: /* 10x10 */
6805 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6806 "vfp/neon vstm/vpush", dsc);
6807
6808 case 0x09: case 0x0d: /* 01x01 */
6809 case 0x0b: case 0x0f: /* 01x11 */
6810 case 0x13: case 0x17: /* 10x11 */
6811 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6812 "vfp/neon vldm/vpop", dsc);
6813
6814 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6815 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6816 "vstr", dsc);
6817 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6818 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6819 }
6820
6821 /* Should be unreachable. */
6822 return 1;
6823 }
6824
6825 static int
6826 arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn,
6827 struct regcache *regs, struct displaced_step_closure *dsc)
6828 {
6829 unsigned int op1 = bits (insn, 20, 25);
6830 int op = bit (insn, 4);
6831 unsigned int coproc = bits (insn, 8, 11);
6832
6833 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
6834 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
6835 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6836 && (coproc & 0xe) != 0xa)
6837 /* stc/stc2. */
6838 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6839 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6840 && (coproc & 0xe) != 0xa)
6841 /* ldc/ldc2 imm/lit. */
6842 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
6843 else if ((op1 & 0x3e) == 0x00)
6844 return arm_copy_undef (gdbarch, insn, dsc);
6845 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
6846 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
6847 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
6848 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
6849 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
6850 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
6851 else if ((op1 & 0x30) == 0x20 && !op)
6852 {
6853 if ((coproc & 0xe) == 0xa)
6854 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
6855 else
6856 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
6857 }
6858 else if ((op1 & 0x30) == 0x20 && op)
6859 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
6860 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
6861 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
6862 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
6863 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
6864 else if ((op1 & 0x30) == 0x30)
6865 return arm_copy_svc (gdbarch, insn, regs, dsc);
6866 else
6867 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
6868 }
6869
6870 static int
6871 thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6872 uint16_t insn2, struct regcache *regs,
6873 struct displaced_step_closure *dsc)
6874 {
6875 unsigned int coproc = bits (insn2, 8, 11);
6876 unsigned int bit_5_8 = bits (insn1, 5, 8);
6877 unsigned int bit_9 = bit (insn1, 9);
6878 unsigned int bit_4 = bit (insn1, 4);
6879
6880 if (bit_9 == 0)
6881 {
6882 if (bit_5_8 == 2)
6883 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6884 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6885 dsc);
6886 else if (bit_5_8 == 0) /* UNDEFINED. */
6887 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6888 else
6889 {
6890 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6891 if ((coproc & 0xe) == 0xa)
6892 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6893 dsc);
6894 else /* coproc is not 101x. */
6895 {
6896 if (bit_4 == 0) /* STC/STC2. */
6897 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6898 "stc/stc2", dsc);
6899 else /* LDC/LDC2 {literal, immeidate}. */
6900 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6901 regs, dsc);
6902 }
6903 }
6904 }
6905 else
6906 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6907
6908 return 0;
6909 }
6910
6911 static void
6912 install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
6913 struct displaced_step_closure *dsc, int rd)
6914 {
6915 /* ADR Rd, #imm
6916
6917 Rewrite as:
6918
6919 Preparation: Rd <- PC
6920 Insn: ADD Rd, #imm
6921 Cleanup: Null.
6922 */
6923
6924 /* Rd <- PC */
6925 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6926 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6927 }
6928
6929 static int
6930 thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
6931 struct displaced_step_closure *dsc,
6932 int rd, unsigned int imm)
6933 {
6934
6935 /* Encoding T2: ADDS Rd, #imm */
6936 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6937
6938 install_pc_relative (gdbarch, regs, dsc, rd);
6939
6940 return 0;
6941 }
6942
6943 static int
6944 thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6945 struct regcache *regs,
6946 struct displaced_step_closure *dsc)
6947 {
6948 unsigned int rd = bits (insn, 8, 10);
6949 unsigned int imm8 = bits (insn, 0, 7);
6950
6951 if (debug_displaced)
6952 fprintf_unfiltered (gdb_stdlog,
6953 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6954 rd, imm8, insn);
6955
6956 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6957 }
6958
6959 static int
6960 thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6961 uint16_t insn2, struct regcache *regs,
6962 struct displaced_step_closure *dsc)
6963 {
6964 unsigned int rd = bits (insn2, 8, 11);
6965 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6966 extract raw immediate encoding rather than computing immediate. When
6967 generating ADD or SUB instruction, we can simply perform OR operation to
6968 set immediate into ADD. */
6969 unsigned int imm_3_8 = insn2 & 0x70ff;
6970 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6971
6972 if (debug_displaced)
6973 fprintf_unfiltered (gdb_stdlog,
6974 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6975 rd, imm_i, imm_3_8, insn1, insn2);
6976
6977 if (bit (insn1, 7)) /* Encoding T2 */
6978 {
6979 /* Encoding T3: SUB Rd, Rd, #imm */
6980 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6981 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6982 }
6983 else /* Encoding T3 */
6984 {
6985 /* Encoding T3: ADD Rd, Rd, #imm */
6986 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6987 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6988 }
6989 dsc->numinsns = 2;
6990
6991 install_pc_relative (gdbarch, regs, dsc, rd);
6992
6993 return 0;
6994 }
6995
6996 static int
6997 thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
6998 struct regcache *regs,
6999 struct displaced_step_closure *dsc)
7000 {
7001 unsigned int rt = bits (insn1, 8, 10);
7002 unsigned int pc;
7003 int imm8 = (bits (insn1, 0, 7) << 2);
7004
7005 /* LDR Rd, #imm8
7006
7007 Rwrite as:
7008
7009 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
7010
7011 Insn: LDR R0, [R2, R3];
7012 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
7013
7014 if (debug_displaced)
7015 fprintf_unfiltered (gdb_stdlog,
7016 "displaced: copying thumb ldr r%d [pc #%d]\n"
7017 , rt, imm8);
7018
7019 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
7020 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
7021 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
7022 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
7023 /* The assembler calculates the required value of the offset from the
7024 Align(PC,4) value of this instruction to the label. */
7025 pc = pc & 0xfffffffc;
7026
7027 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
7028 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
7029
7030 dsc->rd = rt;
7031 dsc->u.ldst.xfersize = 4;
7032 dsc->u.ldst.rn = 0;
7033 dsc->u.ldst.immed = 0;
7034 dsc->u.ldst.writeback = 0;
7035 dsc->u.ldst.restore_r4 = 0;
7036
7037 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
7038
7039 dsc->cleanup = &cleanup_load;
7040
7041 return 0;
7042 }
7043
7044 /* Copy Thumb cbnz/cbz insruction. */
7045
7046 static int
7047 thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
7048 struct regcache *regs,
7049 struct displaced_step_closure *dsc)
7050 {
7051 int non_zero = bit (insn1, 11);
7052 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
7053 CORE_ADDR from = dsc->insn_addr;
7054 int rn = bits (insn1, 0, 2);
7055 int rn_val = displaced_read_reg (regs, dsc, rn);
7056
7057 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
7058 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
7059 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
7060 condition is false, let it be, cleanup_branch will do nothing. */
7061 if (dsc->u.branch.cond)
7062 {
7063 dsc->u.branch.cond = INST_AL;
7064 dsc->u.branch.dest = from + 4 + imm5;
7065 }
7066 else
7067 dsc->u.branch.dest = from + 2;
7068
7069 dsc->u.branch.link = 0;
7070 dsc->u.branch.exchange = 0;
7071
7072 if (debug_displaced)
7073 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
7074 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
7075 rn, rn_val, insn1, dsc->u.branch.dest);
7076
7077 dsc->modinsn[0] = THUMB_NOP;
7078
7079 dsc->cleanup = &cleanup_branch;
7080 return 0;
7081 }
7082
7083 /* Copy Table Branch Byte/Halfword */
7084 static int
7085 thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7086 uint16_t insn2, struct regcache *regs,
7087 struct displaced_step_closure *dsc)
7088 {
7089 ULONGEST rn_val, rm_val;
7090 int is_tbh = bit (insn2, 4);
7091 CORE_ADDR halfwords = 0;
7092 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7093
7094 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7095 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7096
7097 if (is_tbh)
7098 {
7099 gdb_byte buf[2];
7100
7101 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7102 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7103 }
7104 else
7105 {
7106 gdb_byte buf[1];
7107
7108 target_read_memory (rn_val + rm_val, buf, 1);
7109 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7110 }
7111
7112 if (debug_displaced)
7113 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7114 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7115 (unsigned int) rn_val, (unsigned int) rm_val,
7116 (unsigned int) halfwords);
7117
7118 dsc->u.branch.cond = INST_AL;
7119 dsc->u.branch.link = 0;
7120 dsc->u.branch.exchange = 0;
7121 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7122
7123 dsc->cleanup = &cleanup_branch;
7124
7125 return 0;
7126 }
7127
7128 static void
7129 cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
7130 struct displaced_step_closure *dsc)
7131 {
7132 /* PC <- r7 */
7133 int val = displaced_read_reg (regs, dsc, 7);
7134 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7135
7136 /* r7 <- r8 */
7137 val = displaced_read_reg (regs, dsc, 8);
7138 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7139
7140 /* r8 <- tmp[0] */
7141 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7142
7143 }
7144
7145 static int
7146 thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
7147 struct regcache *regs,
7148 struct displaced_step_closure *dsc)
7149 {
7150 dsc->u.block.regmask = insn1 & 0x00ff;
7151
7152 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7153 to :
7154
7155 (1) register list is full, that is, r0-r7 are used.
7156 Prepare: tmp[0] <- r8
7157
7158 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7159 MOV r8, r7; Move value of r7 to r8;
7160 POP {r7}; Store PC value into r7.
7161
7162 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7163
7164 (2) register list is not full, supposing there are N registers in
7165 register list (except PC, 0 <= N <= 7).
7166 Prepare: for each i, 0 - N, tmp[i] <- ri.
7167
7168 POP {r0, r1, ...., rN};
7169
7170 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7171 from tmp[] properly.
7172 */
7173 if (debug_displaced)
7174 fprintf_unfiltered (gdb_stdlog,
7175 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7176 dsc->u.block.regmask, insn1);
7177
7178 if (dsc->u.block.regmask == 0xff)
7179 {
7180 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7181
7182 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7183 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7184 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7185
7186 dsc->numinsns = 3;
7187 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7188 }
7189 else
7190 {
7191 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
7192 unsigned int i;
7193 unsigned int new_regmask;
7194
7195 for (i = 0; i < num_in_list + 1; i++)
7196 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7197
7198 new_regmask = (1 << (num_in_list + 1)) - 1;
7199
7200 if (debug_displaced)
7201 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7202 "{..., pc}: original reg list %.4x,"
7203 " modified list %.4x\n"),
7204 (int) dsc->u.block.regmask, new_regmask);
7205
7206 dsc->u.block.regmask |= 0x8000;
7207 dsc->u.block.writeback = 0;
7208 dsc->u.block.cond = INST_AL;
7209
7210 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7211
7212 dsc->cleanup = &cleanup_block_load_pc;
7213 }
7214
7215 return 0;
7216 }
7217
7218 static void
7219 thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7220 struct regcache *regs,
7221 struct displaced_step_closure *dsc)
7222 {
7223 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7224 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7225 int err = 0;
7226
7227 /* 16-bit thumb instructions. */
7228 switch (op_bit_12_15)
7229 {
7230 /* Shift (imme), add, subtract, move and compare. */
7231 case 0: case 1: case 2: case 3:
7232 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7233 "shift/add/sub/mov/cmp",
7234 dsc);
7235 break;
7236 case 4:
7237 switch (op_bit_10_11)
7238 {
7239 case 0: /* Data-processing */
7240 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7241 "data-processing",
7242 dsc);
7243 break;
7244 case 1: /* Special data instructions and branch and exchange. */
7245 {
7246 unsigned short op = bits (insn1, 7, 9);
7247 if (op == 6 || op == 7) /* BX or BLX */
7248 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7249 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7250 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7251 else
7252 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7253 dsc);
7254 }
7255 break;
7256 default: /* LDR (literal) */
7257 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7258 }
7259 break;
7260 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7261 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7262 break;
7263 case 10:
7264 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7265 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7266 else /* Generate SP-relative address */
7267 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7268 break;
7269 case 11: /* Misc 16-bit instructions */
7270 {
7271 switch (bits (insn1, 8, 11))
7272 {
7273 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7274 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7275 break;
7276 case 12: case 13: /* POP */
7277 if (bit (insn1, 8)) /* PC is in register list. */
7278 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7279 else
7280 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7281 break;
7282 case 15: /* If-Then, and hints */
7283 if (bits (insn1, 0, 3))
7284 /* If-Then makes up to four following instructions conditional.
7285 IT instruction itself is not conditional, so handle it as a
7286 common unmodified instruction. */
7287 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7288 dsc);
7289 else
7290 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7291 break;
7292 default:
7293 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7294 }
7295 }
7296 break;
7297 case 12:
7298 if (op_bit_10_11 < 2) /* Store multiple registers */
7299 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7300 else /* Load multiple registers */
7301 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7302 break;
7303 case 13: /* Conditional branch and supervisor call */
7304 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7305 err = thumb_copy_b (gdbarch, insn1, dsc);
7306 else
7307 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7308 break;
7309 case 14: /* Unconditional branch */
7310 err = thumb_copy_b (gdbarch, insn1, dsc);
7311 break;
7312 default:
7313 err = 1;
7314 }
7315
7316 if (err)
7317 internal_error (__FILE__, __LINE__,
7318 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7319 }
7320
7321 static int
7322 decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7323 uint16_t insn1, uint16_t insn2,
7324 struct regcache *regs,
7325 struct displaced_step_closure *dsc)
7326 {
7327 int rt = bits (insn2, 12, 15);
7328 int rn = bits (insn1, 0, 3);
7329 int op1 = bits (insn1, 7, 8);
7330
7331 switch (bits (insn1, 5, 6))
7332 {
7333 case 0: /* Load byte and memory hints */
7334 if (rt == 0xf) /* PLD/PLI */
7335 {
7336 if (rn == 0xf)
7337 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7338 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7339 else
7340 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7341 "pli/pld", dsc);
7342 }
7343 else
7344 {
7345 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7346 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7347 1);
7348 else
7349 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7350 "ldrb{reg, immediate}/ldrbt",
7351 dsc);
7352 }
7353
7354 break;
7355 case 1: /* Load halfword and memory hints. */
7356 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7357 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7358 "pld/unalloc memhint", dsc);
7359 else
7360 {
7361 if (rn == 0xf)
7362 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7363 2);
7364 else
7365 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7366 "ldrh/ldrht", dsc);
7367 }
7368 break;
7369 case 2: /* Load word */
7370 {
7371 int insn2_bit_8_11 = bits (insn2, 8, 11);
7372
7373 if (rn == 0xf)
7374 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7375 else if (op1 == 0x1) /* Encoding T3 */
7376 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7377 0, 1);
7378 else /* op1 == 0x0 */
7379 {
7380 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7381 /* LDR (immediate) */
7382 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7383 dsc, bit (insn2, 8), 1);
7384 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7385 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7386 "ldrt", dsc);
7387 else
7388 /* LDR (register) */
7389 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7390 dsc, 0, 0);
7391 }
7392 break;
7393 }
7394 default:
7395 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7396 break;
7397 }
7398 return 0;
7399 }
7400
7401 static void
7402 thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7403 uint16_t insn2, struct regcache *regs,
7404 struct displaced_step_closure *dsc)
7405 {
7406 int err = 0;
7407 unsigned short op = bit (insn2, 15);
7408 unsigned int op1 = bits (insn1, 11, 12);
7409
7410 switch (op1)
7411 {
7412 case 1:
7413 {
7414 switch (bits (insn1, 9, 10))
7415 {
7416 case 0:
7417 if (bit (insn1, 6))
7418 {
7419 /* Load/store {dual, execlusive}, table branch. */
7420 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7421 && bits (insn2, 5, 7) == 0)
7422 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7423 dsc);
7424 else
7425 /* PC is not allowed to use in load/store {dual, exclusive}
7426 instructions. */
7427 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7428 "load/store dual/ex", dsc);
7429 }
7430 else /* load/store multiple */
7431 {
7432 switch (bits (insn1, 7, 8))
7433 {
7434 case 0: case 3: /* SRS, RFE */
7435 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7436 "srs/rfe", dsc);
7437 break;
7438 case 1: case 2: /* LDM/STM/PUSH/POP */
7439 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7440 break;
7441 }
7442 }
7443 break;
7444
7445 case 1:
7446 /* Data-processing (shift register). */
7447 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7448 dsc);
7449 break;
7450 default: /* Coprocessor instructions. */
7451 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7452 break;
7453 }
7454 break;
7455 }
7456 case 2: /* op1 = 2 */
7457 if (op) /* Branch and misc control. */
7458 {
7459 if (bit (insn2, 14) /* BLX/BL */
7460 || bit (insn2, 12) /* Unconditional branch */
7461 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7462 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7463 else
7464 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7465 "misc ctrl", dsc);
7466 }
7467 else
7468 {
7469 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7470 {
7471 int op = bits (insn1, 4, 8);
7472 int rn = bits (insn1, 0, 3);
7473 if ((op == 0 || op == 0xa) && rn == 0xf)
7474 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7475 regs, dsc);
7476 else
7477 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7478 "dp/pb", dsc);
7479 }
7480 else /* Data processing (modified immeidate) */
7481 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7482 "dp/mi", dsc);
7483 }
7484 break;
7485 case 3: /* op1 = 3 */
7486 switch (bits (insn1, 9, 10))
7487 {
7488 case 0:
7489 if (bit (insn1, 4))
7490 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7491 regs, dsc);
7492 else /* NEON Load/Store and Store single data item */
7493 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7494 "neon elt/struct load/store",
7495 dsc);
7496 break;
7497 case 1: /* op1 = 3, bits (9, 10) == 1 */
7498 switch (bits (insn1, 7, 8))
7499 {
7500 case 0: case 1: /* Data processing (register) */
7501 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7502 "dp(reg)", dsc);
7503 break;
7504 case 2: /* Multiply and absolute difference */
7505 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7506 "mul/mua/diff", dsc);
7507 break;
7508 case 3: /* Long multiply and divide */
7509 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7510 "lmul/lmua", dsc);
7511 break;
7512 }
7513 break;
7514 default: /* Coprocessor instructions */
7515 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7516 break;
7517 }
7518 break;
7519 default:
7520 err = 1;
7521 }
7522
7523 if (err)
7524 internal_error (__FILE__, __LINE__,
7525 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7526
7527 }
7528
7529 static void
7530 thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7531 struct regcache *regs,
7532 struct displaced_step_closure *dsc)
7533 {
7534 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7535 uint16_t insn1
7536 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7537
7538 if (debug_displaced)
7539 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7540 "at %.8lx\n", insn1, (unsigned long) from);
7541
7542 dsc->is_thumb = 1;
7543 dsc->insn_size = thumb_insn_size (insn1);
7544 if (thumb_insn_size (insn1) == 4)
7545 {
7546 uint16_t insn2
7547 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7548 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7549 }
7550 else
7551 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
7552 }
7553
7554 void
7555 arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7556 CORE_ADDR to, struct regcache *regs,
7557 struct displaced_step_closure *dsc)
7558 {
7559 int err = 0;
7560 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7561 uint32_t insn;
7562
7563 /* Most displaced instructions use a 1-instruction scratch space, so set this
7564 here and override below if/when necessary. */
7565 dsc->numinsns = 1;
7566 dsc->insn_addr = from;
7567 dsc->scratch_base = to;
7568 dsc->cleanup = NULL;
7569 dsc->wrote_to_pc = 0;
7570
7571 if (!displaced_in_arm_mode (regs))
7572 return thumb_process_displaced_insn (gdbarch, from, regs, dsc);
7573
7574 dsc->is_thumb = 0;
7575 dsc->insn_size = 4;
7576 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7577 if (debug_displaced)
7578 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7579 "at %.8lx\n", (unsigned long) insn,
7580 (unsigned long) from);
7581
7582 if ((insn & 0xf0000000) == 0xf0000000)
7583 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
7584 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7585 {
7586 case 0x0: case 0x1: case 0x2: case 0x3:
7587 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
7588 break;
7589
7590 case 0x4: case 0x5: case 0x6:
7591 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
7592 break;
7593
7594 case 0x7:
7595 err = arm_decode_media (gdbarch, insn, dsc);
7596 break;
7597
7598 case 0x8: case 0x9: case 0xa: case 0xb:
7599 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
7600 break;
7601
7602 case 0xc: case 0xd: case 0xe: case 0xf:
7603 err = arm_decode_svc_copro (gdbarch, insn, regs, dsc);
7604 break;
7605 }
7606
7607 if (err)
7608 internal_error (__FILE__, __LINE__,
7609 _("arm_process_displaced_insn: Instruction decode error"));
7610 }
7611
7612 /* Actually set up the scratch space for a displaced instruction. */
7613
7614 void
7615 arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
7616 CORE_ADDR to, struct displaced_step_closure *dsc)
7617 {
7618 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7619 unsigned int i, len, offset;
7620 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7621 int size = dsc->is_thumb? 2 : 4;
7622 const gdb_byte *bkp_insn;
7623
7624 offset = 0;
7625 /* Poke modified instruction(s). */
7626 for (i = 0; i < dsc->numinsns; i++)
7627 {
7628 if (debug_displaced)
7629 {
7630 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7631 if (size == 4)
7632 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7633 dsc->modinsn[i]);
7634 else if (size == 2)
7635 fprintf_unfiltered (gdb_stdlog, "%.4x",
7636 (unsigned short)dsc->modinsn[i]);
7637
7638 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7639 (unsigned long) to + offset);
7640
7641 }
7642 write_memory_unsigned_integer (to + offset, size,
7643 byte_order_for_code,
7644 dsc->modinsn[i]);
7645 offset += size;
7646 }
7647
7648 /* Choose the correct breakpoint instruction. */
7649 if (dsc->is_thumb)
7650 {
7651 bkp_insn = tdep->thumb_breakpoint;
7652 len = tdep->thumb_breakpoint_size;
7653 }
7654 else
7655 {
7656 bkp_insn = tdep->arm_breakpoint;
7657 len = tdep->arm_breakpoint_size;
7658 }
7659
7660 /* Put breakpoint afterwards. */
7661 write_memory (to + offset, bkp_insn, len);
7662
7663 if (debug_displaced)
7664 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7665 paddress (gdbarch, from), paddress (gdbarch, to));
7666 }
7667
7668 /* Entry point for cleaning things up after a displaced instruction has been
7669 single-stepped. */
7670
7671 void
7672 arm_displaced_step_fixup (struct gdbarch *gdbarch,
7673 struct displaced_step_closure *dsc,
7674 CORE_ADDR from, CORE_ADDR to,
7675 struct regcache *regs)
7676 {
7677 if (dsc->cleanup)
7678 dsc->cleanup (gdbarch, regs, dsc);
7679
7680 if (!dsc->wrote_to_pc)
7681 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7682 dsc->insn_addr + dsc->insn_size);
7683
7684 }
7685
7686 #include "bfd-in2.h"
7687 #include "libcoff.h"
7688
7689 static int
7690 gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7691 {
7692 gdb_disassembler *di
7693 = static_cast<gdb_disassembler *>(info->application_data);
7694 struct gdbarch *gdbarch = di->arch ();
7695
7696 if (arm_pc_is_thumb (gdbarch, memaddr))
7697 {
7698 static asymbol *asym;
7699 static combined_entry_type ce;
7700 static struct coff_symbol_struct csym;
7701 static struct bfd fake_bfd;
7702 static bfd_target fake_target;
7703
7704 if (csym.native == NULL)
7705 {
7706 /* Create a fake symbol vector containing a Thumb symbol.
7707 This is solely so that the code in print_insn_little_arm()
7708 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7709 the presence of a Thumb symbol and switch to decoding
7710 Thumb instructions. */
7711
7712 fake_target.flavour = bfd_target_coff_flavour;
7713 fake_bfd.xvec = &fake_target;
7714 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7715 csym.native = &ce;
7716 csym.symbol.the_bfd = &fake_bfd;
7717 csym.symbol.name = "fake";
7718 asym = (asymbol *) & csym;
7719 }
7720
7721 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7722 info->symbols = &asym;
7723 }
7724 else
7725 info->symbols = NULL;
7726
7727 /* GDB is able to get bfd_mach from the exe_bfd, info->mach is
7728 accurate, so mark USER_SPECIFIED_MACHINE_TYPE bit. Otherwise,
7729 opcodes/arm-dis.c:print_insn reset info->mach, and it will trigger
7730 the assert on the mismatch of info->mach and bfd_get_mach (exec_bfd)
7731 in default_print_insn. */
7732 if (exec_bfd != NULL)
7733 info->flags |= USER_SPECIFIED_MACHINE_TYPE;
7734
7735 return default_print_insn (memaddr, info);
7736 }
7737
7738 /* The following define instruction sequences that will cause ARM
7739 cpu's to take an undefined instruction trap. These are used to
7740 signal a breakpoint to GDB.
7741
7742 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7743 modes. A different instruction is required for each mode. The ARM
7744 cpu's can also be big or little endian. Thus four different
7745 instructions are needed to support all cases.
7746
7747 Note: ARMv4 defines several new instructions that will take the
7748 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7749 not in fact add the new instructions. The new undefined
7750 instructions in ARMv4 are all instructions that had no defined
7751 behaviour in earlier chips. There is no guarantee that they will
7752 raise an exception, but may be treated as NOP's. In practice, it
7753 may only safe to rely on instructions matching:
7754
7755 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7756 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
7757 C C C C 0 1 1 x x x x x x x x x x x x x x x x x x x x 1 x x x x
7758
7759 Even this may only true if the condition predicate is true. The
7760 following use a condition predicate of ALWAYS so it is always TRUE.
7761
7762 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7763 and NetBSD all use a software interrupt rather than an undefined
7764 instruction to force a trap. This can be handled by by the
7765 abi-specific code during establishment of the gdbarch vector. */
7766
7767 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7768 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7769 #define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7770 #define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7771
7772 static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7773 static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7774 static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7775 static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
7776
7777 /* Implement the breakpoint_kind_from_pc gdbarch method. */
7778
7779 static int
7780 arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
7781 {
7782 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7783 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7784
7785 if (arm_pc_is_thumb (gdbarch, *pcptr))
7786 {
7787 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
7788
7789 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7790 check whether we are replacing a 32-bit instruction. */
7791 if (tdep->thumb2_breakpoint != NULL)
7792 {
7793 gdb_byte buf[2];
7794
7795 if (target_read_memory (*pcptr, buf, 2) == 0)
7796 {
7797 unsigned short inst1;
7798
7799 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
7800 if (thumb_insn_size (inst1) == 4)
7801 return ARM_BP_KIND_THUMB2;
7802 }
7803 }
7804
7805 return ARM_BP_KIND_THUMB;
7806 }
7807 else
7808 return ARM_BP_KIND_ARM;
7809
7810 }
7811
7812 /* Implement the sw_breakpoint_from_kind gdbarch method. */
7813
7814 static const gdb_byte *
7815 arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
7816 {
7817 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7818
7819 switch (kind)
7820 {
7821 case ARM_BP_KIND_ARM:
7822 *size = tdep->arm_breakpoint_size;
7823 return tdep->arm_breakpoint;
7824 case ARM_BP_KIND_THUMB:
7825 *size = tdep->thumb_breakpoint_size;
7826 return tdep->thumb_breakpoint;
7827 case ARM_BP_KIND_THUMB2:
7828 *size = tdep->thumb2_breakpoint_size;
7829 return tdep->thumb2_breakpoint;
7830 default:
7831 gdb_assert_not_reached ("unexpected arm breakpoint kind");
7832 }
7833 }
7834
7835 /* Implement the breakpoint_kind_from_current_state gdbarch method. */
7836
7837 static int
7838 arm_breakpoint_kind_from_current_state (struct gdbarch *gdbarch,
7839 struct regcache *regcache,
7840 CORE_ADDR *pcptr)
7841 {
7842 gdb_byte buf[4];
7843
7844 /* Check the memory pointed by PC is readable. */
7845 if (target_read_memory (regcache_read_pc (regcache), buf, 4) == 0)
7846 {
7847 struct arm_get_next_pcs next_pcs_ctx;
7848
7849 arm_get_next_pcs_ctor (&next_pcs_ctx,
7850 &arm_get_next_pcs_ops,
7851 gdbarch_byte_order (gdbarch),
7852 gdbarch_byte_order_for_code (gdbarch),
7853 0,
7854 regcache);
7855
7856 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
7857
7858 /* If MEMADDR is the next instruction of current pc, do the
7859 software single step computation, and get the thumb mode by
7860 the destination address. */
7861 for (CORE_ADDR pc : next_pcs)
7862 {
7863 if (UNMAKE_THUMB_ADDR (pc) == *pcptr)
7864 {
7865 if (IS_THUMB_ADDR (pc))
7866 {
7867 *pcptr = MAKE_THUMB_ADDR (*pcptr);
7868 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7869 }
7870 else
7871 return ARM_BP_KIND_ARM;
7872 }
7873 }
7874 }
7875
7876 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7877 }
7878
7879 /* Extract from an array REGBUF containing the (raw) register state a
7880 function return value of type TYPE, and copy that, in virtual
7881 format, into VALBUF. */
7882
7883 static void
7884 arm_extract_return_value (struct type *type, struct regcache *regs,
7885 gdb_byte *valbuf)
7886 {
7887 struct gdbarch *gdbarch = get_regcache_arch (regs);
7888 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7889
7890 if (TYPE_CODE_FLT == TYPE_CODE (type))
7891 {
7892 switch (gdbarch_tdep (gdbarch)->fp_model)
7893 {
7894 case ARM_FLOAT_FPA:
7895 {
7896 /* The value is in register F0 in internal format. We need to
7897 extract the raw value and then convert it to the desired
7898 internal type. */
7899 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7900
7901 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
7902 convert_typed_floating (tmpbuf, arm_ext_type (gdbarch),
7903 valbuf, type);
7904 }
7905 break;
7906
7907 case ARM_FLOAT_SOFT_FPA:
7908 case ARM_FLOAT_SOFT_VFP:
7909 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7910 not using the VFP ABI code. */
7911 case ARM_FLOAT_VFP:
7912 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
7913 if (TYPE_LENGTH (type) > 4)
7914 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
7915 valbuf + INT_REGISTER_SIZE);
7916 break;
7917
7918 default:
7919 internal_error (__FILE__, __LINE__,
7920 _("arm_extract_return_value: "
7921 "Floating point model not supported"));
7922 break;
7923 }
7924 }
7925 else if (TYPE_CODE (type) == TYPE_CODE_INT
7926 || TYPE_CODE (type) == TYPE_CODE_CHAR
7927 || TYPE_CODE (type) == TYPE_CODE_BOOL
7928 || TYPE_CODE (type) == TYPE_CODE_PTR
7929 || TYPE_IS_REFERENCE (type)
7930 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7931 {
7932 /* If the type is a plain integer, then the access is
7933 straight-forward. Otherwise we have to play around a bit
7934 more. */
7935 int len = TYPE_LENGTH (type);
7936 int regno = ARM_A1_REGNUM;
7937 ULONGEST tmp;
7938
7939 while (len > 0)
7940 {
7941 /* By using store_unsigned_integer we avoid having to do
7942 anything special for small big-endian values. */
7943 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7944 store_unsigned_integer (valbuf,
7945 (len > INT_REGISTER_SIZE
7946 ? INT_REGISTER_SIZE : len),
7947 byte_order, tmp);
7948 len -= INT_REGISTER_SIZE;
7949 valbuf += INT_REGISTER_SIZE;
7950 }
7951 }
7952 else
7953 {
7954 /* For a structure or union the behaviour is as if the value had
7955 been stored to word-aligned memory and then loaded into
7956 registers with 32-bit load instruction(s). */
7957 int len = TYPE_LENGTH (type);
7958 int regno = ARM_A1_REGNUM;
7959 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7960
7961 while (len > 0)
7962 {
7963 regcache_cooked_read (regs, regno++, tmpbuf);
7964 memcpy (valbuf, tmpbuf,
7965 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7966 len -= INT_REGISTER_SIZE;
7967 valbuf += INT_REGISTER_SIZE;
7968 }
7969 }
7970 }
7971
7972
7973 /* Will a function return an aggregate type in memory or in a
7974 register? Return 0 if an aggregate type can be returned in a
7975 register, 1 if it must be returned in memory. */
7976
7977 static int
7978 arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7979 {
7980 enum type_code code;
7981
7982 type = check_typedef (type);
7983
7984 /* Simple, non-aggregate types (ie not including vectors and
7985 complex) are always returned in a register (or registers). */
7986 code = TYPE_CODE (type);
7987 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7988 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7989 return 0;
7990
7991 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7992 {
7993 /* Vector values should be returned using ARM registers if they
7994 are not over 16 bytes. */
7995 return (TYPE_LENGTH (type) > 16);
7996 }
7997
7998 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
7999 {
8000 /* The AAPCS says all aggregates not larger than a word are returned
8001 in a register. */
8002 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
8003 return 0;
8004
8005 return 1;
8006 }
8007 else
8008 {
8009 int nRc;
8010
8011 /* All aggregate types that won't fit in a register must be returned
8012 in memory. */
8013 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
8014 return 1;
8015
8016 /* In the ARM ABI, "integer" like aggregate types are returned in
8017 registers. For an aggregate type to be integer like, its size
8018 must be less than or equal to INT_REGISTER_SIZE and the
8019 offset of each addressable subfield must be zero. Note that bit
8020 fields are not addressable, and all addressable subfields of
8021 unions always start at offset zero.
8022
8023 This function is based on the behaviour of GCC 2.95.1.
8024 See: gcc/arm.c: arm_return_in_memory() for details.
8025
8026 Note: All versions of GCC before GCC 2.95.2 do not set up the
8027 parameters correctly for a function returning the following
8028 structure: struct { float f;}; This should be returned in memory,
8029 not a register. Richard Earnshaw sent me a patch, but I do not
8030 know of any way to detect if a function like the above has been
8031 compiled with the correct calling convention. */
8032
8033 /* Assume all other aggregate types can be returned in a register.
8034 Run a check for structures, unions and arrays. */
8035 nRc = 0;
8036
8037 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
8038 {
8039 int i;
8040 /* Need to check if this struct/union is "integer" like. For
8041 this to be true, its size must be less than or equal to
8042 INT_REGISTER_SIZE and the offset of each addressable
8043 subfield must be zero. Note that bit fields are not
8044 addressable, and unions always start at offset zero. If any
8045 of the subfields is a floating point type, the struct/union
8046 cannot be an integer type. */
8047
8048 /* For each field in the object, check:
8049 1) Is it FP? --> yes, nRc = 1;
8050 2) Is it addressable (bitpos != 0) and
8051 not packed (bitsize == 0)?
8052 --> yes, nRc = 1
8053 */
8054
8055 for (i = 0; i < TYPE_NFIELDS (type); i++)
8056 {
8057 enum type_code field_type_code;
8058
8059 field_type_code
8060 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
8061 i)));
8062
8063 /* Is it a floating point type field? */
8064 if (field_type_code == TYPE_CODE_FLT)
8065 {
8066 nRc = 1;
8067 break;
8068 }
8069
8070 /* If bitpos != 0, then we have to care about it. */
8071 if (TYPE_FIELD_BITPOS (type, i) != 0)
8072 {
8073 /* Bitfields are not addressable. If the field bitsize is
8074 zero, then the field is not packed. Hence it cannot be
8075 a bitfield or any other packed type. */
8076 if (TYPE_FIELD_BITSIZE (type, i) == 0)
8077 {
8078 nRc = 1;
8079 break;
8080 }
8081 }
8082 }
8083 }
8084
8085 return nRc;
8086 }
8087 }
8088
8089 /* Write into appropriate registers a function return value of type
8090 TYPE, given in virtual format. */
8091
8092 static void
8093 arm_store_return_value (struct type *type, struct regcache *regs,
8094 const gdb_byte *valbuf)
8095 {
8096 struct gdbarch *gdbarch = get_regcache_arch (regs);
8097 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8098
8099 if (TYPE_CODE (type) == TYPE_CODE_FLT)
8100 {
8101 gdb_byte buf[FP_REGISTER_SIZE];
8102
8103 switch (gdbarch_tdep (gdbarch)->fp_model)
8104 {
8105 case ARM_FLOAT_FPA:
8106
8107 convert_typed_floating (valbuf, type, buf, arm_ext_type (gdbarch));
8108 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
8109 break;
8110
8111 case ARM_FLOAT_SOFT_FPA:
8112 case ARM_FLOAT_SOFT_VFP:
8113 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8114 not using the VFP ABI code. */
8115 case ARM_FLOAT_VFP:
8116 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
8117 if (TYPE_LENGTH (type) > 4)
8118 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
8119 valbuf + INT_REGISTER_SIZE);
8120 break;
8121
8122 default:
8123 internal_error (__FILE__, __LINE__,
8124 _("arm_store_return_value: Floating "
8125 "point model not supported"));
8126 break;
8127 }
8128 }
8129 else if (TYPE_CODE (type) == TYPE_CODE_INT
8130 || TYPE_CODE (type) == TYPE_CODE_CHAR
8131 || TYPE_CODE (type) == TYPE_CODE_BOOL
8132 || TYPE_CODE (type) == TYPE_CODE_PTR
8133 || TYPE_IS_REFERENCE (type)
8134 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8135 {
8136 if (TYPE_LENGTH (type) <= 4)
8137 {
8138 /* Values of one word or less are zero/sign-extended and
8139 returned in r0. */
8140 bfd_byte tmpbuf[INT_REGISTER_SIZE];
8141 LONGEST val = unpack_long (type, valbuf);
8142
8143 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
8144 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8145 }
8146 else
8147 {
8148 /* Integral values greater than one word are stored in consecutive
8149 registers starting with r0. This will always be a multiple of
8150 the regiser size. */
8151 int len = TYPE_LENGTH (type);
8152 int regno = ARM_A1_REGNUM;
8153
8154 while (len > 0)
8155 {
8156 regcache_cooked_write (regs, regno++, valbuf);
8157 len -= INT_REGISTER_SIZE;
8158 valbuf += INT_REGISTER_SIZE;
8159 }
8160 }
8161 }
8162 else
8163 {
8164 /* For a structure or union the behaviour is as if the value had
8165 been stored to word-aligned memory and then loaded into
8166 registers with 32-bit load instruction(s). */
8167 int len = TYPE_LENGTH (type);
8168 int regno = ARM_A1_REGNUM;
8169 bfd_byte tmpbuf[INT_REGISTER_SIZE];
8170
8171 while (len > 0)
8172 {
8173 memcpy (tmpbuf, valbuf,
8174 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
8175 regcache_cooked_write (regs, regno++, tmpbuf);
8176 len -= INT_REGISTER_SIZE;
8177 valbuf += INT_REGISTER_SIZE;
8178 }
8179 }
8180 }
8181
8182
8183 /* Handle function return values. */
8184
8185 static enum return_value_convention
8186 arm_return_value (struct gdbarch *gdbarch, struct value *function,
8187 struct type *valtype, struct regcache *regcache,
8188 gdb_byte *readbuf, const gdb_byte *writebuf)
8189 {
8190 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8191 struct type *func_type = function ? value_type (function) : NULL;
8192 enum arm_vfp_cprc_base_type vfp_base_type;
8193 int vfp_base_count;
8194
8195 if (arm_vfp_abi_for_function (gdbarch, func_type)
8196 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8197 {
8198 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8199 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8200 int i;
8201 for (i = 0; i < vfp_base_count; i++)
8202 {
8203 if (reg_char == 'q')
8204 {
8205 if (writebuf)
8206 arm_neon_quad_write (gdbarch, regcache, i,
8207 writebuf + i * unit_length);
8208
8209 if (readbuf)
8210 arm_neon_quad_read (gdbarch, regcache, i,
8211 readbuf + i * unit_length);
8212 }
8213 else
8214 {
8215 char name_buf[4];
8216 int regnum;
8217
8218 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
8219 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8220 strlen (name_buf));
8221 if (writebuf)
8222 regcache_cooked_write (regcache, regnum,
8223 writebuf + i * unit_length);
8224 if (readbuf)
8225 regcache_cooked_read (regcache, regnum,
8226 readbuf + i * unit_length);
8227 }
8228 }
8229 return RETURN_VALUE_REGISTER_CONVENTION;
8230 }
8231
8232 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8233 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8234 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8235 {
8236 if (tdep->struct_return == pcc_struct_return
8237 || arm_return_in_memory (gdbarch, valtype))
8238 return RETURN_VALUE_STRUCT_CONVENTION;
8239 }
8240 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8241 {
8242 if (arm_return_in_memory (gdbarch, valtype))
8243 return RETURN_VALUE_STRUCT_CONVENTION;
8244 }
8245
8246 if (writebuf)
8247 arm_store_return_value (valtype, regcache, writebuf);
8248
8249 if (readbuf)
8250 arm_extract_return_value (valtype, regcache, readbuf);
8251
8252 return RETURN_VALUE_REGISTER_CONVENTION;
8253 }
8254
8255
8256 static int
8257 arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
8258 {
8259 struct gdbarch *gdbarch = get_frame_arch (frame);
8260 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8261 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8262 CORE_ADDR jb_addr;
8263 gdb_byte buf[INT_REGISTER_SIZE];
8264
8265 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
8266
8267 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
8268 INT_REGISTER_SIZE))
8269 return 0;
8270
8271 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
8272 return 1;
8273 }
8274
8275 /* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8276 return the target PC. Otherwise return 0. */
8277
8278 CORE_ADDR
8279 arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
8280 {
8281 const char *name;
8282 int namelen;
8283 CORE_ADDR start_addr;
8284
8285 /* Find the starting address and name of the function containing the PC. */
8286 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
8287 {
8288 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8289 check here. */
8290 start_addr = arm_skip_bx_reg (frame, pc);
8291 if (start_addr != 0)
8292 return start_addr;
8293
8294 return 0;
8295 }
8296
8297 /* If PC is in a Thumb call or return stub, return the address of the
8298 target PC, which is in a register. The thunk functions are called
8299 _call_via_xx, where x is the register name. The possible names
8300 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8301 functions, named __ARM_call_via_r[0-7]. */
8302 if (startswith (name, "_call_via_")
8303 || startswith (name, "__ARM_call_via_"))
8304 {
8305 /* Use the name suffix to determine which register contains the
8306 target PC. */
8307 static const char *table[15] =
8308 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8309 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8310 };
8311 int regno;
8312 int offset = strlen (name) - 2;
8313
8314 for (regno = 0; regno <= 14; regno++)
8315 if (strcmp (&name[offset], table[regno]) == 0)
8316 return get_frame_register_unsigned (frame, regno);
8317 }
8318
8319 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8320 non-interworking calls to foo. We could decode the stubs
8321 to find the target but it's easier to use the symbol table. */
8322 namelen = strlen (name);
8323 if (name[0] == '_' && name[1] == '_'
8324 && ((namelen > 2 + strlen ("_from_thumb")
8325 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
8326 || (namelen > 2 + strlen ("_from_arm")
8327 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
8328 {
8329 char *target_name;
8330 int target_len = namelen - 2;
8331 struct bound_minimal_symbol minsym;
8332 struct objfile *objfile;
8333 struct obj_section *sec;
8334
8335 if (name[namelen - 1] == 'b')
8336 target_len -= strlen ("_from_thumb");
8337 else
8338 target_len -= strlen ("_from_arm");
8339
8340 target_name = (char *) alloca (target_len + 1);
8341 memcpy (target_name, name + 2, target_len);
8342 target_name[target_len] = '\0';
8343
8344 sec = find_pc_section (pc);
8345 objfile = (sec == NULL) ? NULL : sec->objfile;
8346 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
8347 if (minsym.minsym != NULL)
8348 return BMSYMBOL_VALUE_ADDRESS (minsym);
8349 else
8350 return 0;
8351 }
8352
8353 return 0; /* not a stub */
8354 }
8355
8356 static void
8357 set_arm_command (const char *args, int from_tty)
8358 {
8359 printf_unfiltered (_("\
8360 \"set arm\" must be followed by an apporpriate subcommand.\n"));
8361 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8362 }
8363
8364 static void
8365 show_arm_command (const char *args, int from_tty)
8366 {
8367 cmd_show_list (showarmcmdlist, from_tty, "");
8368 }
8369
8370 static void
8371 arm_update_current_architecture (void)
8372 {
8373 struct gdbarch_info info;
8374
8375 /* If the current architecture is not ARM, we have nothing to do. */
8376 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
8377 return;
8378
8379 /* Update the architecture. */
8380 gdbarch_info_init (&info);
8381
8382 if (!gdbarch_update_p (info))
8383 internal_error (__FILE__, __LINE__, _("could not update architecture"));
8384 }
8385
8386 static void
8387 set_fp_model_sfunc (char *args, int from_tty,
8388 struct cmd_list_element *c)
8389 {
8390 int fp_model;
8391
8392 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8393 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8394 {
8395 arm_fp_model = (enum arm_float_model) fp_model;
8396 break;
8397 }
8398
8399 if (fp_model == ARM_FLOAT_LAST)
8400 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
8401 current_fp_model);
8402
8403 arm_update_current_architecture ();
8404 }
8405
8406 static void
8407 show_fp_model (struct ui_file *file, int from_tty,
8408 struct cmd_list_element *c, const char *value)
8409 {
8410 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
8411
8412 if (arm_fp_model == ARM_FLOAT_AUTO
8413 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
8414 fprintf_filtered (file, _("\
8415 The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8416 fp_model_strings[tdep->fp_model]);
8417 else
8418 fprintf_filtered (file, _("\
8419 The current ARM floating point model is \"%s\".\n"),
8420 fp_model_strings[arm_fp_model]);
8421 }
8422
8423 static void
8424 arm_set_abi (char *args, int from_tty,
8425 struct cmd_list_element *c)
8426 {
8427 int arm_abi;
8428
8429 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8430 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8431 {
8432 arm_abi_global = (enum arm_abi_kind) arm_abi;
8433 break;
8434 }
8435
8436 if (arm_abi == ARM_ABI_LAST)
8437 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8438 arm_abi_string);
8439
8440 arm_update_current_architecture ();
8441 }
8442
8443 static void
8444 arm_show_abi (struct ui_file *file, int from_tty,
8445 struct cmd_list_element *c, const char *value)
8446 {
8447 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
8448
8449 if (arm_abi_global == ARM_ABI_AUTO
8450 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
8451 fprintf_filtered (file, _("\
8452 The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8453 arm_abi_strings[tdep->arm_abi]);
8454 else
8455 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8456 arm_abi_string);
8457 }
8458
8459 static void
8460 arm_show_fallback_mode (struct ui_file *file, int from_tty,
8461 struct cmd_list_element *c, const char *value)
8462 {
8463 fprintf_filtered (file,
8464 _("The current execution mode assumed "
8465 "(when symbols are unavailable) is \"%s\".\n"),
8466 arm_fallback_mode_string);
8467 }
8468
8469 static void
8470 arm_show_force_mode (struct ui_file *file, int from_tty,
8471 struct cmd_list_element *c, const char *value)
8472 {
8473 fprintf_filtered (file,
8474 _("The current execution mode assumed "
8475 "(even when symbols are available) is \"%s\".\n"),
8476 arm_force_mode_string);
8477 }
8478
8479 /* If the user changes the register disassembly style used for info
8480 register and other commands, we have to also switch the style used
8481 in opcodes for disassembly output. This function is run in the "set
8482 arm disassembly" command, and does that. */
8483
8484 static void
8485 set_disassembly_style_sfunc (char *args, int from_tty,
8486 struct cmd_list_element *c)
8487 {
8488 /* Convert the short style name into the long style name (eg, reg-names-*)
8489 before calling the generic set_disassembler_options() function. */
8490 std::string long_name = std::string ("reg-names-") + disassembly_style;
8491 set_disassembler_options (&long_name[0]);
8492 }
8493
8494 static void
8495 show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
8496 struct cmd_list_element *c, const char *value)
8497 {
8498 struct gdbarch *gdbarch = get_current_arch ();
8499 char *options = get_disassembler_options (gdbarch);
8500 const char *style = "";
8501 int len = 0;
8502 const char *opt;
8503
8504 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
8505 if (CONST_STRNEQ (opt, "reg-names-"))
8506 {
8507 style = &opt[strlen ("reg-names-")];
8508 len = strcspn (style, ",");
8509 }
8510
8511 fprintf_unfiltered (file, "The disassembly style is \"%.*s\".\n", len, style);
8512 }
8513 \f
8514 /* Return the ARM register name corresponding to register I. */
8515 static const char *
8516 arm_register_name (struct gdbarch *gdbarch, int i)
8517 {
8518 const int num_regs = gdbarch_num_regs (gdbarch);
8519
8520 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8521 && i >= num_regs && i < num_regs + 32)
8522 {
8523 static const char *const vfp_pseudo_names[] = {
8524 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8525 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8526 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8527 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8528 };
8529
8530 return vfp_pseudo_names[i - num_regs];
8531 }
8532
8533 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8534 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8535 {
8536 static const char *const neon_pseudo_names[] = {
8537 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8538 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8539 };
8540
8541 return neon_pseudo_names[i - num_regs - 32];
8542 }
8543
8544 if (i >= ARRAY_SIZE (arm_register_names))
8545 /* These registers are only supported on targets which supply
8546 an XML description. */
8547 return "";
8548
8549 return arm_register_names[i];
8550 }
8551
8552 /* Test whether the coff symbol specific value corresponds to a Thumb
8553 function. */
8554
8555 static int
8556 coff_sym_is_thumb (int val)
8557 {
8558 return (val == C_THUMBEXT
8559 || val == C_THUMBSTAT
8560 || val == C_THUMBEXTFUNC
8561 || val == C_THUMBSTATFUNC
8562 || val == C_THUMBLABEL);
8563 }
8564
8565 /* arm_coff_make_msymbol_special()
8566 arm_elf_make_msymbol_special()
8567
8568 These functions test whether the COFF or ELF symbol corresponds to
8569 an address in thumb code, and set a "special" bit in a minimal
8570 symbol to indicate that it does. */
8571
8572 static void
8573 arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8574 {
8575 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
8576
8577 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
8578 == ST_BRANCH_TO_THUMB)
8579 MSYMBOL_SET_SPECIAL (msym);
8580 }
8581
8582 static void
8583 arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8584 {
8585 if (coff_sym_is_thumb (val))
8586 MSYMBOL_SET_SPECIAL (msym);
8587 }
8588
8589 static void
8590 arm_objfile_data_free (struct objfile *objfile, void *arg)
8591 {
8592 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
8593 unsigned int i;
8594
8595 for (i = 0; i < objfile->obfd->section_count; i++)
8596 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8597 }
8598
8599 static void
8600 arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8601 asymbol *sym)
8602 {
8603 const char *name = bfd_asymbol_name (sym);
8604 struct arm_per_objfile *data;
8605 VEC(arm_mapping_symbol_s) **map_p;
8606 struct arm_mapping_symbol new_map_sym;
8607
8608 gdb_assert (name[0] == '$');
8609 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8610 return;
8611
8612 data = (struct arm_per_objfile *) objfile_data (objfile,
8613 arm_objfile_data_key);
8614 if (data == NULL)
8615 {
8616 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8617 struct arm_per_objfile);
8618 set_objfile_data (objfile, arm_objfile_data_key, data);
8619 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8620 objfile->obfd->section_count,
8621 VEC(arm_mapping_symbol_s) *);
8622 }
8623 map_p = &data->section_maps[bfd_get_section (sym)->index];
8624
8625 new_map_sym.value = sym->value;
8626 new_map_sym.type = name[1];
8627
8628 /* Assume that most mapping symbols appear in order of increasing
8629 value. If they were randomly distributed, it would be faster to
8630 always push here and then sort at first use. */
8631 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8632 {
8633 struct arm_mapping_symbol *prev_map_sym;
8634
8635 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8636 if (prev_map_sym->value >= sym->value)
8637 {
8638 unsigned int idx;
8639 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8640 arm_compare_mapping_symbols);
8641 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8642 return;
8643 }
8644 }
8645
8646 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8647 }
8648
8649 static void
8650 arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
8651 {
8652 struct gdbarch *gdbarch = get_regcache_arch (regcache);
8653 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
8654
8655 /* If necessary, set the T bit. */
8656 if (arm_apcs_32)
8657 {
8658 ULONGEST val, t_bit;
8659 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
8660 t_bit = arm_psr_thumb_bit (gdbarch);
8661 if (arm_pc_is_thumb (gdbarch, pc))
8662 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8663 val | t_bit);
8664 else
8665 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8666 val & ~t_bit);
8667 }
8668 }
8669
8670 /* Read the contents of a NEON quad register, by reading from two
8671 double registers. This is used to implement the quad pseudo
8672 registers, and for argument passing in case the quad registers are
8673 missing; vectors are passed in quad registers when using the VFP
8674 ABI, even if a NEON unit is not present. REGNUM is the index of
8675 the quad register, in [0, 15]. */
8676
8677 static enum register_status
8678 arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
8679 int regnum, gdb_byte *buf)
8680 {
8681 char name_buf[4];
8682 gdb_byte reg_buf[8];
8683 int offset, double_regnum;
8684 enum register_status status;
8685
8686 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
8687 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8688 strlen (name_buf));
8689
8690 /* d0 is always the least significant half of q0. */
8691 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8692 offset = 8;
8693 else
8694 offset = 0;
8695
8696 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8697 if (status != REG_VALID)
8698 return status;
8699 memcpy (buf + offset, reg_buf, 8);
8700
8701 offset = 8 - offset;
8702 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
8703 if (status != REG_VALID)
8704 return status;
8705 memcpy (buf + offset, reg_buf, 8);
8706
8707 return REG_VALID;
8708 }
8709
8710 static enum register_status
8711 arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
8712 int regnum, gdb_byte *buf)
8713 {
8714 const int num_regs = gdbarch_num_regs (gdbarch);
8715 char name_buf[4];
8716 gdb_byte reg_buf[8];
8717 int offset, double_regnum;
8718
8719 gdb_assert (regnum >= num_regs);
8720 regnum -= num_regs;
8721
8722 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8723 /* Quad-precision register. */
8724 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
8725 else
8726 {
8727 enum register_status status;
8728
8729 /* Single-precision register. */
8730 gdb_assert (regnum < 32);
8731
8732 /* s0 is always the least significant half of d0. */
8733 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8734 offset = (regnum & 1) ? 0 : 4;
8735 else
8736 offset = (regnum & 1) ? 4 : 0;
8737
8738 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
8739 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8740 strlen (name_buf));
8741
8742 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8743 if (status == REG_VALID)
8744 memcpy (buf, reg_buf + offset, 4);
8745 return status;
8746 }
8747 }
8748
8749 /* Store the contents of BUF to a NEON quad register, by writing to
8750 two double registers. This is used to implement the quad pseudo
8751 registers, and for argument passing in case the quad registers are
8752 missing; vectors are passed in quad registers when using the VFP
8753 ABI, even if a NEON unit is not present. REGNUM is the index
8754 of the quad register, in [0, 15]. */
8755
8756 static void
8757 arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8758 int regnum, const gdb_byte *buf)
8759 {
8760 char name_buf[4];
8761 int offset, double_regnum;
8762
8763 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
8764 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8765 strlen (name_buf));
8766
8767 /* d0 is always the least significant half of q0. */
8768 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8769 offset = 8;
8770 else
8771 offset = 0;
8772
8773 regcache_raw_write (regcache, double_regnum, buf + offset);
8774 offset = 8 - offset;
8775 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
8776 }
8777
8778 static void
8779 arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8780 int regnum, const gdb_byte *buf)
8781 {
8782 const int num_regs = gdbarch_num_regs (gdbarch);
8783 char name_buf[4];
8784 gdb_byte reg_buf[8];
8785 int offset, double_regnum;
8786
8787 gdb_assert (regnum >= num_regs);
8788 regnum -= num_regs;
8789
8790 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8791 /* Quad-precision register. */
8792 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8793 else
8794 {
8795 /* Single-precision register. */
8796 gdb_assert (regnum < 32);
8797
8798 /* s0 is always the least significant half of d0. */
8799 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8800 offset = (regnum & 1) ? 0 : 4;
8801 else
8802 offset = (regnum & 1) ? 4 : 0;
8803
8804 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
8805 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8806 strlen (name_buf));
8807
8808 regcache_raw_read (regcache, double_regnum, reg_buf);
8809 memcpy (reg_buf + offset, buf, 4);
8810 regcache_raw_write (regcache, double_regnum, reg_buf);
8811 }
8812 }
8813
8814 static struct value *
8815 value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8816 {
8817 const int *reg_p = (const int *) baton;
8818 return value_of_register (*reg_p, frame);
8819 }
8820 \f
8821 static enum gdb_osabi
8822 arm_elf_osabi_sniffer (bfd *abfd)
8823 {
8824 unsigned int elfosabi;
8825 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
8826
8827 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
8828
8829 if (elfosabi == ELFOSABI_ARM)
8830 /* GNU tools use this value. Check note sections in this case,
8831 as well. */
8832 bfd_map_over_sections (abfd,
8833 generic_elf_osabi_sniff_abi_tag_sections,
8834 &osabi);
8835
8836 /* Anything else will be handled by the generic ELF sniffer. */
8837 return osabi;
8838 }
8839
8840 static int
8841 arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8842 struct reggroup *group)
8843 {
8844 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8845 this, FPS register belongs to save_regroup, restore_reggroup, and
8846 all_reggroup, of course. */
8847 if (regnum == ARM_FPS_REGNUM)
8848 return (group == float_reggroup
8849 || group == save_reggroup
8850 || group == restore_reggroup
8851 || group == all_reggroup);
8852 else
8853 return default_register_reggroup_p (gdbarch, regnum, group);
8854 }
8855
8856 \f
8857 /* For backward-compatibility we allow two 'g' packet lengths with
8858 the remote protocol depending on whether FPA registers are
8859 supplied. M-profile targets do not have FPA registers, but some
8860 stubs already exist in the wild which use a 'g' packet which
8861 supplies them albeit with dummy values. The packet format which
8862 includes FPA registers should be considered deprecated for
8863 M-profile targets. */
8864
8865 static void
8866 arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8867 {
8868 if (gdbarch_tdep (gdbarch)->is_m)
8869 {
8870 /* If we know from the executable this is an M-profile target,
8871 cater for remote targets whose register set layout is the
8872 same as the FPA layout. */
8873 register_remote_g_packet_guess (gdbarch,
8874 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
8875 (16 * INT_REGISTER_SIZE)
8876 + (8 * FP_REGISTER_SIZE)
8877 + (2 * INT_REGISTER_SIZE),
8878 tdesc_arm_with_m_fpa_layout);
8879
8880 /* The regular M-profile layout. */
8881 register_remote_g_packet_guess (gdbarch,
8882 /* r0-r12,sp,lr,pc; xpsr */
8883 (16 * INT_REGISTER_SIZE)
8884 + INT_REGISTER_SIZE,
8885 tdesc_arm_with_m);
8886
8887 /* M-profile plus M4F VFP. */
8888 register_remote_g_packet_guess (gdbarch,
8889 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8890 (16 * INT_REGISTER_SIZE)
8891 + (16 * VFP_REGISTER_SIZE)
8892 + (2 * INT_REGISTER_SIZE),
8893 tdesc_arm_with_m_vfp_d16);
8894 }
8895
8896 /* Otherwise we don't have a useful guess. */
8897 }
8898
8899 /* Implement the code_of_frame_writable gdbarch method. */
8900
8901 static int
8902 arm_code_of_frame_writable (struct gdbarch *gdbarch, struct frame_info *frame)
8903 {
8904 if (gdbarch_tdep (gdbarch)->is_m
8905 && get_frame_type (frame) == SIGTRAMP_FRAME)
8906 {
8907 /* M-profile exception frames return to some magic PCs, where
8908 isn't writable at all. */
8909 return 0;
8910 }
8911 else
8912 return 1;
8913 }
8914
8915 \f
8916 /* Initialize the current architecture based on INFO. If possible,
8917 re-use an architecture from ARCHES, which is a list of
8918 architectures already created during this debugging session.
8919
8920 Called e.g. at program startup, when reading a core file, and when
8921 reading a binary file. */
8922
8923 static struct gdbarch *
8924 arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8925 {
8926 struct gdbarch_tdep *tdep;
8927 struct gdbarch *gdbarch;
8928 struct gdbarch_list *best_arch;
8929 enum arm_abi_kind arm_abi = arm_abi_global;
8930 enum arm_float_model fp_model = arm_fp_model;
8931 struct tdesc_arch_data *tdesc_data = NULL;
8932 int i, is_m = 0;
8933 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
8934 int have_wmmx_registers = 0;
8935 int have_neon = 0;
8936 int have_fpa_registers = 1;
8937 const struct target_desc *tdesc = info.target_desc;
8938
8939 /* If we have an object to base this architecture on, try to determine
8940 its ABI. */
8941
8942 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8943 {
8944 int ei_osabi, e_flags;
8945
8946 switch (bfd_get_flavour (info.abfd))
8947 {
8948 case bfd_target_coff_flavour:
8949 /* Assume it's an old APCS-style ABI. */
8950 /* XXX WinCE? */
8951 arm_abi = ARM_ABI_APCS;
8952 break;
8953
8954 case bfd_target_elf_flavour:
8955 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8956 e_flags = elf_elfheader (info.abfd)->e_flags;
8957
8958 if (ei_osabi == ELFOSABI_ARM)
8959 {
8960 /* GNU tools used to use this value, but do not for EABI
8961 objects. There's nowhere to tag an EABI version
8962 anyway, so assume APCS. */
8963 arm_abi = ARM_ABI_APCS;
8964 }
8965 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
8966 {
8967 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8968 int attr_arch, attr_profile;
8969
8970 switch (eabi_ver)
8971 {
8972 case EF_ARM_EABI_UNKNOWN:
8973 /* Assume GNU tools. */
8974 arm_abi = ARM_ABI_APCS;
8975 break;
8976
8977 case EF_ARM_EABI_VER4:
8978 case EF_ARM_EABI_VER5:
8979 arm_abi = ARM_ABI_AAPCS;
8980 /* EABI binaries default to VFP float ordering.
8981 They may also contain build attributes that can
8982 be used to identify if the VFP argument-passing
8983 ABI is in use. */
8984 if (fp_model == ARM_FLOAT_AUTO)
8985 {
8986 #ifdef HAVE_ELF
8987 switch (bfd_elf_get_obj_attr_int (info.abfd,
8988 OBJ_ATTR_PROC,
8989 Tag_ABI_VFP_args))
8990 {
8991 case AEABI_VFP_args_base:
8992 /* "The user intended FP parameter/result
8993 passing to conform to AAPCS, base
8994 variant". */
8995 fp_model = ARM_FLOAT_SOFT_VFP;
8996 break;
8997 case AEABI_VFP_args_vfp:
8998 /* "The user intended FP parameter/result
8999 passing to conform to AAPCS, VFP
9000 variant". */
9001 fp_model = ARM_FLOAT_VFP;
9002 break;
9003 case AEABI_VFP_args_toolchain:
9004 /* "The user intended FP parameter/result
9005 passing to conform to tool chain-specific
9006 conventions" - we don't know any such
9007 conventions, so leave it as "auto". */
9008 break;
9009 case AEABI_VFP_args_compatible:
9010 /* "Code is compatible with both the base
9011 and VFP variants; the user did not permit
9012 non-variadic functions to pass FP
9013 parameters/results" - leave it as
9014 "auto". */
9015 break;
9016 default:
9017 /* Attribute value not mentioned in the
9018 November 2012 ABI, so leave it as
9019 "auto". */
9020 break;
9021 }
9022 #else
9023 fp_model = ARM_FLOAT_SOFT_VFP;
9024 #endif
9025 }
9026 break;
9027
9028 default:
9029 /* Leave it as "auto". */
9030 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
9031 break;
9032 }
9033
9034 #ifdef HAVE_ELF
9035 /* Detect M-profile programs. This only works if the
9036 executable file includes build attributes; GCC does
9037 copy them to the executable, but e.g. RealView does
9038 not. */
9039 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
9040 Tag_CPU_arch);
9041 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
9042 OBJ_ATTR_PROC,
9043 Tag_CPU_arch_profile);
9044 /* GCC specifies the profile for v6-M; RealView only
9045 specifies the profile for architectures starting with
9046 V7 (as opposed to architectures with a tag
9047 numerically greater than TAG_CPU_ARCH_V7). */
9048 if (!tdesc_has_registers (tdesc)
9049 && (attr_arch == TAG_CPU_ARCH_V6_M
9050 || attr_arch == TAG_CPU_ARCH_V6S_M
9051 || attr_profile == 'M'))
9052 is_m = 1;
9053 #endif
9054 }
9055
9056 if (fp_model == ARM_FLOAT_AUTO)
9057 {
9058 int e_flags = elf_elfheader (info.abfd)->e_flags;
9059
9060 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
9061 {
9062 case 0:
9063 /* Leave it as "auto". Strictly speaking this case
9064 means FPA, but almost nobody uses that now, and
9065 many toolchains fail to set the appropriate bits
9066 for the floating-point model they use. */
9067 break;
9068 case EF_ARM_SOFT_FLOAT:
9069 fp_model = ARM_FLOAT_SOFT_FPA;
9070 break;
9071 case EF_ARM_VFP_FLOAT:
9072 fp_model = ARM_FLOAT_VFP;
9073 break;
9074 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
9075 fp_model = ARM_FLOAT_SOFT_VFP;
9076 break;
9077 }
9078 }
9079
9080 if (e_flags & EF_ARM_BE8)
9081 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
9082
9083 break;
9084
9085 default:
9086 /* Leave it as "auto". */
9087 break;
9088 }
9089 }
9090
9091 /* Check any target description for validity. */
9092 if (tdesc_has_registers (tdesc))
9093 {
9094 /* For most registers we require GDB's default names; but also allow
9095 the numeric names for sp / lr / pc, as a convenience. */
9096 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
9097 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
9098 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
9099
9100 const struct tdesc_feature *feature;
9101 int valid_p;
9102
9103 feature = tdesc_find_feature (tdesc,
9104 "org.gnu.gdb.arm.core");
9105 if (feature == NULL)
9106 {
9107 feature = tdesc_find_feature (tdesc,
9108 "org.gnu.gdb.arm.m-profile");
9109 if (feature == NULL)
9110 return NULL;
9111 else
9112 is_m = 1;
9113 }
9114
9115 tdesc_data = tdesc_data_alloc ();
9116
9117 valid_p = 1;
9118 for (i = 0; i < ARM_SP_REGNUM; i++)
9119 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9120 arm_register_names[i]);
9121 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9122 ARM_SP_REGNUM,
9123 arm_sp_names);
9124 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9125 ARM_LR_REGNUM,
9126 arm_lr_names);
9127 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9128 ARM_PC_REGNUM,
9129 arm_pc_names);
9130 if (is_m)
9131 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9132 ARM_PS_REGNUM, "xpsr");
9133 else
9134 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9135 ARM_PS_REGNUM, "cpsr");
9136
9137 if (!valid_p)
9138 {
9139 tdesc_data_cleanup (tdesc_data);
9140 return NULL;
9141 }
9142
9143 feature = tdesc_find_feature (tdesc,
9144 "org.gnu.gdb.arm.fpa");
9145 if (feature != NULL)
9146 {
9147 valid_p = 1;
9148 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9149 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9150 arm_register_names[i]);
9151 if (!valid_p)
9152 {
9153 tdesc_data_cleanup (tdesc_data);
9154 return NULL;
9155 }
9156 }
9157 else
9158 have_fpa_registers = 0;
9159
9160 feature = tdesc_find_feature (tdesc,
9161 "org.gnu.gdb.xscale.iwmmxt");
9162 if (feature != NULL)
9163 {
9164 static const char *const iwmmxt_names[] = {
9165 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9166 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9167 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9168 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9169 };
9170
9171 valid_p = 1;
9172 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9173 valid_p
9174 &= tdesc_numbered_register (feature, tdesc_data, i,
9175 iwmmxt_names[i - ARM_WR0_REGNUM]);
9176
9177 /* Check for the control registers, but do not fail if they
9178 are missing. */
9179 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9180 tdesc_numbered_register (feature, tdesc_data, i,
9181 iwmmxt_names[i - ARM_WR0_REGNUM]);
9182
9183 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9184 valid_p
9185 &= tdesc_numbered_register (feature, tdesc_data, i,
9186 iwmmxt_names[i - ARM_WR0_REGNUM]);
9187
9188 if (!valid_p)
9189 {
9190 tdesc_data_cleanup (tdesc_data);
9191 return NULL;
9192 }
9193
9194 have_wmmx_registers = 1;
9195 }
9196
9197 /* If we have a VFP unit, check whether the single precision registers
9198 are present. If not, then we will synthesize them as pseudo
9199 registers. */
9200 feature = tdesc_find_feature (tdesc,
9201 "org.gnu.gdb.arm.vfp");
9202 if (feature != NULL)
9203 {
9204 static const char *const vfp_double_names[] = {
9205 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9206 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9207 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9208 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9209 };
9210
9211 /* Require the double precision registers. There must be either
9212 16 or 32. */
9213 valid_p = 1;
9214 for (i = 0; i < 32; i++)
9215 {
9216 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9217 ARM_D0_REGNUM + i,
9218 vfp_double_names[i]);
9219 if (!valid_p)
9220 break;
9221 }
9222 if (!valid_p && i == 16)
9223 valid_p = 1;
9224
9225 /* Also require FPSCR. */
9226 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9227 ARM_FPSCR_REGNUM, "fpscr");
9228 if (!valid_p)
9229 {
9230 tdesc_data_cleanup (tdesc_data);
9231 return NULL;
9232 }
9233
9234 if (tdesc_unnumbered_register (feature, "s0") == 0)
9235 have_vfp_pseudos = 1;
9236
9237 vfp_register_count = i;
9238
9239 /* If we have VFP, also check for NEON. The architecture allows
9240 NEON without VFP (integer vector operations only), but GDB
9241 does not support that. */
9242 feature = tdesc_find_feature (tdesc,
9243 "org.gnu.gdb.arm.neon");
9244 if (feature != NULL)
9245 {
9246 /* NEON requires 32 double-precision registers. */
9247 if (i != 32)
9248 {
9249 tdesc_data_cleanup (tdesc_data);
9250 return NULL;
9251 }
9252
9253 /* If there are quad registers defined by the stub, use
9254 their type; otherwise (normally) provide them with
9255 the default type. */
9256 if (tdesc_unnumbered_register (feature, "q0") == 0)
9257 have_neon_pseudos = 1;
9258
9259 have_neon = 1;
9260 }
9261 }
9262 }
9263
9264 /* If there is already a candidate, use it. */
9265 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9266 best_arch != NULL;
9267 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9268 {
9269 if (arm_abi != ARM_ABI_AUTO
9270 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
9271 continue;
9272
9273 if (fp_model != ARM_FLOAT_AUTO
9274 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
9275 continue;
9276
9277 /* There are various other properties in tdep that we do not
9278 need to check here: those derived from a target description,
9279 since gdbarches with a different target description are
9280 automatically disqualified. */
9281
9282 /* Do check is_m, though, since it might come from the binary. */
9283 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9284 continue;
9285
9286 /* Found a match. */
9287 break;
9288 }
9289
9290 if (best_arch != NULL)
9291 {
9292 if (tdesc_data != NULL)
9293 tdesc_data_cleanup (tdesc_data);
9294 return best_arch->gdbarch;
9295 }
9296
9297 tdep = XCNEW (struct gdbarch_tdep);
9298 gdbarch = gdbarch_alloc (&info, tdep);
9299
9300 /* Record additional information about the architecture we are defining.
9301 These are gdbarch discriminators, like the OSABI. */
9302 tdep->arm_abi = arm_abi;
9303 tdep->fp_model = fp_model;
9304 tdep->is_m = is_m;
9305 tdep->have_fpa_registers = have_fpa_registers;
9306 tdep->have_wmmx_registers = have_wmmx_registers;
9307 gdb_assert (vfp_register_count == 0
9308 || vfp_register_count == 16
9309 || vfp_register_count == 32);
9310 tdep->vfp_register_count = vfp_register_count;
9311 tdep->have_vfp_pseudos = have_vfp_pseudos;
9312 tdep->have_neon_pseudos = have_neon_pseudos;
9313 tdep->have_neon = have_neon;
9314
9315 arm_register_g_packet_guesses (gdbarch);
9316
9317 /* Breakpoints. */
9318 switch (info.byte_order_for_code)
9319 {
9320 case BFD_ENDIAN_BIG:
9321 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9322 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9323 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9324 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9325
9326 break;
9327
9328 case BFD_ENDIAN_LITTLE:
9329 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9330 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9331 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9332 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9333
9334 break;
9335
9336 default:
9337 internal_error (__FILE__, __LINE__,
9338 _("arm_gdbarch_init: bad byte order for float format"));
9339 }
9340
9341 /* On ARM targets char defaults to unsigned. */
9342 set_gdbarch_char_signed (gdbarch, 0);
9343
9344 /* wchar_t is unsigned under the AAPCS. */
9345 if (tdep->arm_abi == ARM_ABI_AAPCS)
9346 set_gdbarch_wchar_signed (gdbarch, 0);
9347 else
9348 set_gdbarch_wchar_signed (gdbarch, 1);
9349
9350 /* Note: for displaced stepping, this includes the breakpoint, and one word
9351 of additional scratch space. This setting isn't used for anything beside
9352 displaced stepping at present. */
9353 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9354
9355 /* This should be low enough for everything. */
9356 tdep->lowest_pc = 0x20;
9357 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
9358
9359 /* The default, for both APCS and AAPCS, is to return small
9360 structures in registers. */
9361 tdep->struct_return = reg_struct_return;
9362
9363 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
9364 set_gdbarch_frame_align (gdbarch, arm_frame_align);
9365
9366 if (is_m)
9367 set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
9368
9369 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9370
9371 /* Frame handling. */
9372 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
9373 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
9374 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
9375
9376 frame_base_set_default (gdbarch, &arm_normal_base);
9377
9378 /* Address manipulation. */
9379 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9380
9381 /* Advance PC across function entry code. */
9382 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9383
9384 /* Detect whether PC is at a point where the stack has been destroyed. */
9385 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
9386
9387 /* Skip trampolines. */
9388 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9389
9390 /* The stack grows downward. */
9391 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9392
9393 /* Breakpoint manipulation. */
9394 set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
9395 set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
9396 set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
9397 arm_breakpoint_kind_from_current_state);
9398
9399 /* Information about registers, etc. */
9400 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9401 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
9402 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
9403 set_gdbarch_register_type (gdbarch, arm_register_type);
9404 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
9405
9406 /* This "info float" is FPA-specific. Use the generic version if we
9407 do not have FPA. */
9408 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9409 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9410
9411 /* Internal <-> external register number maps. */
9412 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
9413 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9414
9415 set_gdbarch_register_name (gdbarch, arm_register_name);
9416
9417 /* Returning results. */
9418 set_gdbarch_return_value (gdbarch, arm_return_value);
9419
9420 /* Disassembly. */
9421 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9422
9423 /* Minsymbol frobbing. */
9424 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9425 set_gdbarch_coff_make_msymbol_special (gdbarch,
9426 arm_coff_make_msymbol_special);
9427 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
9428
9429 /* Thumb-2 IT block support. */
9430 set_gdbarch_adjust_breakpoint_address (gdbarch,
9431 arm_adjust_breakpoint_address);
9432
9433 /* Virtual tables. */
9434 set_gdbarch_vbit_in_delta (gdbarch, 1);
9435
9436 /* Hook in the ABI-specific overrides, if they have been registered. */
9437 gdbarch_init_osabi (info, gdbarch);
9438
9439 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9440
9441 /* Add some default predicates. */
9442 if (is_m)
9443 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
9444 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9445 dwarf2_append_unwinders (gdbarch);
9446 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
9447 frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
9448 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
9449
9450 /* Now we have tuned the configuration, set a few final things,
9451 based on what the OS ABI has told us. */
9452
9453 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9454 binaries are always marked. */
9455 if (tdep->arm_abi == ARM_ABI_AUTO)
9456 tdep->arm_abi = ARM_ABI_APCS;
9457
9458 /* Watchpoints are not steppable. */
9459 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9460
9461 /* We used to default to FPA for generic ARM, but almost nobody
9462 uses that now, and we now provide a way for the user to force
9463 the model. So default to the most useful variant. */
9464 if (tdep->fp_model == ARM_FLOAT_AUTO)
9465 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9466
9467 if (tdep->jb_pc >= 0)
9468 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9469
9470 /* Floating point sizes and format. */
9471 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
9472 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
9473 {
9474 set_gdbarch_double_format
9475 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9476 set_gdbarch_long_double_format
9477 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9478 }
9479 else
9480 {
9481 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9482 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
9483 }
9484
9485 if (have_vfp_pseudos)
9486 {
9487 /* NOTE: These are the only pseudo registers used by
9488 the ARM target at the moment. If more are added, a
9489 little more care in numbering will be needed. */
9490
9491 int num_pseudos = 32;
9492 if (have_neon_pseudos)
9493 num_pseudos += 16;
9494 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9495 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9496 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9497 }
9498
9499 if (tdesc_data)
9500 {
9501 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9502
9503 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
9504
9505 /* Override tdesc_register_type to adjust the types of VFP
9506 registers for NEON. */
9507 set_gdbarch_register_type (gdbarch, arm_register_type);
9508 }
9509
9510 /* Add standard register aliases. We add aliases even for those
9511 nanes which are used by the current architecture - it's simpler,
9512 and does no harm, since nothing ever lists user registers. */
9513 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9514 user_reg_add (gdbarch, arm_register_aliases[i].name,
9515 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9516
9517 set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
9518 set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
9519
9520 return gdbarch;
9521 }
9522
9523 static void
9524 arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
9525 {
9526 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9527
9528 if (tdep == NULL)
9529 return;
9530
9531 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
9532 (unsigned long) tdep->lowest_pc);
9533 }
9534
9535 #if GDB_SELF_TEST
9536 namespace selftests
9537 {
9538 static void arm_record_test (void);
9539 }
9540 #endif
9541
9542 void
9543 _initialize_arm_tdep (void)
9544 {
9545 long length;
9546 const char *setname;
9547 const char *setdesc;
9548 int i, j;
9549 char regdesc[1024], *rdptr = regdesc;
9550 size_t rest = sizeof (regdesc);
9551
9552 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
9553
9554 arm_objfile_data_key
9555 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
9556
9557 /* Add ourselves to objfile event chain. */
9558 observer_attach_new_objfile (arm_exidx_new_objfile);
9559 arm_exidx_data_key
9560 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9561
9562 /* Register an ELF OS ABI sniffer for ARM binaries. */
9563 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9564 bfd_target_elf_flavour,
9565 arm_elf_osabi_sniffer);
9566
9567 /* Initialize the standard target descriptions. */
9568 initialize_tdesc_arm_with_m ();
9569 initialize_tdesc_arm_with_m_fpa_layout ();
9570 initialize_tdesc_arm_with_m_vfp_d16 ();
9571 initialize_tdesc_arm_with_iwmmxt ();
9572 initialize_tdesc_arm_with_vfpv2 ();
9573 initialize_tdesc_arm_with_vfpv3 ();
9574 initialize_tdesc_arm_with_neon ();
9575
9576 /* Add root prefix command for all "set arm"/"show arm" commands. */
9577 add_prefix_cmd ("arm", no_class, set_arm_command,
9578 _("Various ARM-specific commands."),
9579 &setarmcmdlist, "set arm ", 0, &setlist);
9580
9581 add_prefix_cmd ("arm", no_class, show_arm_command,
9582 _("Various ARM-specific commands."),
9583 &showarmcmdlist, "show arm ", 0, &showlist);
9584
9585
9586 arm_disassembler_options = xstrdup ("reg-names-std");
9587 const disasm_options_t *disasm_options = disassembler_options_arm ();
9588 int num_disassembly_styles = 0;
9589 for (i = 0; disasm_options->name[i] != NULL; i++)
9590 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9591 num_disassembly_styles++;
9592
9593 /* Initialize the array that will be passed to add_setshow_enum_cmd(). */
9594 valid_disassembly_styles = XNEWVEC (const char *,
9595 num_disassembly_styles + 1);
9596 for (i = j = 0; disasm_options->name[i] != NULL; i++)
9597 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9598 {
9599 size_t offset = strlen ("reg-names-");
9600 const char *style = disasm_options->name[i];
9601 valid_disassembly_styles[j++] = &style[offset];
9602 length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
9603 disasm_options->description[i]);
9604 rdptr += length;
9605 rest -= length;
9606 }
9607 /* Mark the end of valid options. */
9608 valid_disassembly_styles[num_disassembly_styles] = NULL;
9609
9610 /* Create the help text. */
9611 std::string helptext = string_printf ("%s%s%s",
9612 _("The valid values are:\n"),
9613 regdesc,
9614 _("The default is \"std\"."));
9615
9616 add_setshow_enum_cmd("disassembler", no_class,
9617 valid_disassembly_styles, &disassembly_style,
9618 _("Set the disassembly style."),
9619 _("Show the disassembly style."),
9620 helptext.c_str (),
9621 set_disassembly_style_sfunc,
9622 show_disassembly_style_sfunc,
9623 &setarmcmdlist, &showarmcmdlist);
9624
9625 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9626 _("Set usage of ARM 32-bit mode."),
9627 _("Show usage of ARM 32-bit mode."),
9628 _("When off, a 26-bit PC will be used."),
9629 NULL,
9630 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9631 mode is %s. */
9632 &setarmcmdlist, &showarmcmdlist);
9633
9634 /* Add a command to allow the user to force the FPU model. */
9635 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9636 _("Set the floating point type."),
9637 _("Show the floating point type."),
9638 _("auto - Determine the FP typefrom the OS-ABI.\n\
9639 softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9640 fpa - FPA co-processor (GCC compiled).\n\
9641 softvfp - Software FP with pure-endian doubles.\n\
9642 vfp - VFP co-processor."),
9643 set_fp_model_sfunc, show_fp_model,
9644 &setarmcmdlist, &showarmcmdlist);
9645
9646 /* Add a command to allow the user to force the ABI. */
9647 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9648 _("Set the ABI."),
9649 _("Show the ABI."),
9650 NULL, arm_set_abi, arm_show_abi,
9651 &setarmcmdlist, &showarmcmdlist);
9652
9653 /* Add two commands to allow the user to force the assumed
9654 execution mode. */
9655 add_setshow_enum_cmd ("fallback-mode", class_support,
9656 arm_mode_strings, &arm_fallback_mode_string,
9657 _("Set the mode assumed when symbols are unavailable."),
9658 _("Show the mode assumed when symbols are unavailable."),
9659 NULL, NULL, arm_show_fallback_mode,
9660 &setarmcmdlist, &showarmcmdlist);
9661 add_setshow_enum_cmd ("force-mode", class_support,
9662 arm_mode_strings, &arm_force_mode_string,
9663 _("Set the mode assumed even when symbols are available."),
9664 _("Show the mode assumed even when symbols are available."),
9665 NULL, NULL, arm_show_force_mode,
9666 &setarmcmdlist, &showarmcmdlist);
9667
9668 /* Debugging flag. */
9669 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9670 _("Set ARM debugging."),
9671 _("Show ARM debugging."),
9672 _("When on, arm-specific debugging is enabled."),
9673 NULL,
9674 NULL, /* FIXME: i18n: "ARM debugging is %s. */
9675 &setdebuglist, &showdebuglist);
9676
9677 #if GDB_SELF_TEST
9678 selftests::register_test ("arm-record", selftests::arm_record_test);
9679 #endif
9680
9681 }
9682
9683 /* ARM-reversible process record data structures. */
9684
9685 #define ARM_INSN_SIZE_BYTES 4
9686 #define THUMB_INSN_SIZE_BYTES 2
9687 #define THUMB2_INSN_SIZE_BYTES 4
9688
9689
9690 /* Position of the bit within a 32-bit ARM instruction
9691 that defines whether the instruction is a load or store. */
9692 #define INSN_S_L_BIT_NUM 20
9693
9694 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9695 do \
9696 { \
9697 unsigned int reg_len = LENGTH; \
9698 if (reg_len) \
9699 { \
9700 REGS = XNEWVEC (uint32_t, reg_len); \
9701 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9702 } \
9703 } \
9704 while (0)
9705
9706 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9707 do \
9708 { \
9709 unsigned int mem_len = LENGTH; \
9710 if (mem_len) \
9711 { \
9712 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9713 memcpy(&MEMS->len, &RECORD_BUF[0], \
9714 sizeof(struct arm_mem_r) * LENGTH); \
9715 } \
9716 } \
9717 while (0)
9718
9719 /* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9720 #define INSN_RECORDED(ARM_RECORD) \
9721 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9722
9723 /* ARM memory record structure. */
9724 struct arm_mem_r
9725 {
9726 uint32_t len; /* Record length. */
9727 uint32_t addr; /* Memory address. */
9728 };
9729
9730 /* ARM instruction record contains opcode of current insn
9731 and execution state (before entry to decode_insn()),
9732 contains list of to-be-modified registers and
9733 memory blocks (on return from decode_insn()). */
9734
9735 typedef struct insn_decode_record_t
9736 {
9737 struct gdbarch *gdbarch;
9738 struct regcache *regcache;
9739 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9740 uint32_t arm_insn; /* Should accommodate thumb. */
9741 uint32_t cond; /* Condition code. */
9742 uint32_t opcode; /* Insn opcode. */
9743 uint32_t decode; /* Insn decode bits. */
9744 uint32_t mem_rec_count; /* No of mem records. */
9745 uint32_t reg_rec_count; /* No of reg records. */
9746 uint32_t *arm_regs; /* Registers to be saved for this record. */
9747 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9748 } insn_decode_record;
9749
9750
9751 /* Checks ARM SBZ and SBO mandatory fields. */
9752
9753 static int
9754 sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9755 {
9756 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9757
9758 if (!len)
9759 return 1;
9760
9761 if (!sbo)
9762 ones = ~ones;
9763
9764 while (ones)
9765 {
9766 if (!(ones & sbo))
9767 {
9768 return 0;
9769 }
9770 ones = ones >> 1;
9771 }
9772 return 1;
9773 }
9774
9775 enum arm_record_result
9776 {
9777 ARM_RECORD_SUCCESS = 0,
9778 ARM_RECORD_FAILURE = 1
9779 };
9780
9781 typedef enum
9782 {
9783 ARM_RECORD_STRH=1,
9784 ARM_RECORD_STRD
9785 } arm_record_strx_t;
9786
9787 typedef enum
9788 {
9789 ARM_RECORD=1,
9790 THUMB_RECORD,
9791 THUMB2_RECORD
9792 } record_type_t;
9793
9794
9795 static int
9796 arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9797 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9798 {
9799
9800 struct regcache *reg_cache = arm_insn_r->regcache;
9801 ULONGEST u_regval[2]= {0};
9802
9803 uint32_t reg_src1 = 0, reg_src2 = 0;
9804 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9805
9806 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9807 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
9808
9809 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9810 {
9811 /* 1) Handle misc store, immediate offset. */
9812 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9813 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9814 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9815 regcache_raw_read_unsigned (reg_cache, reg_src1,
9816 &u_regval[0]);
9817 if (ARM_PC_REGNUM == reg_src1)
9818 {
9819 /* If R15 was used as Rn, hence current PC+8. */
9820 u_regval[0] = u_regval[0] + 8;
9821 }
9822 offset_8 = (immed_high << 4) | immed_low;
9823 /* Calculate target store address. */
9824 if (14 == arm_insn_r->opcode)
9825 {
9826 tgt_mem_addr = u_regval[0] + offset_8;
9827 }
9828 else
9829 {
9830 tgt_mem_addr = u_regval[0] - offset_8;
9831 }
9832 if (ARM_RECORD_STRH == str_type)
9833 {
9834 record_buf_mem[0] = 2;
9835 record_buf_mem[1] = tgt_mem_addr;
9836 arm_insn_r->mem_rec_count = 1;
9837 }
9838 else if (ARM_RECORD_STRD == str_type)
9839 {
9840 record_buf_mem[0] = 4;
9841 record_buf_mem[1] = tgt_mem_addr;
9842 record_buf_mem[2] = 4;
9843 record_buf_mem[3] = tgt_mem_addr + 4;
9844 arm_insn_r->mem_rec_count = 2;
9845 }
9846 }
9847 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9848 {
9849 /* 2) Store, register offset. */
9850 /* Get Rm. */
9851 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9852 /* Get Rn. */
9853 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9854 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9855 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9856 if (15 == reg_src2)
9857 {
9858 /* If R15 was used as Rn, hence current PC+8. */
9859 u_regval[0] = u_regval[0] + 8;
9860 }
9861 /* Calculate target store address, Rn +/- Rm, register offset. */
9862 if (12 == arm_insn_r->opcode)
9863 {
9864 tgt_mem_addr = u_regval[0] + u_regval[1];
9865 }
9866 else
9867 {
9868 tgt_mem_addr = u_regval[1] - u_regval[0];
9869 }
9870 if (ARM_RECORD_STRH == str_type)
9871 {
9872 record_buf_mem[0] = 2;
9873 record_buf_mem[1] = tgt_mem_addr;
9874 arm_insn_r->mem_rec_count = 1;
9875 }
9876 else if (ARM_RECORD_STRD == str_type)
9877 {
9878 record_buf_mem[0] = 4;
9879 record_buf_mem[1] = tgt_mem_addr;
9880 record_buf_mem[2] = 4;
9881 record_buf_mem[3] = tgt_mem_addr + 4;
9882 arm_insn_r->mem_rec_count = 2;
9883 }
9884 }
9885 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9886 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9887 {
9888 /* 3) Store, immediate pre-indexed. */
9889 /* 5) Store, immediate post-indexed. */
9890 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9891 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9892 offset_8 = (immed_high << 4) | immed_low;
9893 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9894 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9895 /* Calculate target store address, Rn +/- Rm, register offset. */
9896 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9897 {
9898 tgt_mem_addr = u_regval[0] + offset_8;
9899 }
9900 else
9901 {
9902 tgt_mem_addr = u_regval[0] - offset_8;
9903 }
9904 if (ARM_RECORD_STRH == str_type)
9905 {
9906 record_buf_mem[0] = 2;
9907 record_buf_mem[1] = tgt_mem_addr;
9908 arm_insn_r->mem_rec_count = 1;
9909 }
9910 else if (ARM_RECORD_STRD == str_type)
9911 {
9912 record_buf_mem[0] = 4;
9913 record_buf_mem[1] = tgt_mem_addr;
9914 record_buf_mem[2] = 4;
9915 record_buf_mem[3] = tgt_mem_addr + 4;
9916 arm_insn_r->mem_rec_count = 2;
9917 }
9918 /* Record Rn also as it changes. */
9919 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9920 arm_insn_r->reg_rec_count = 1;
9921 }
9922 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9923 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9924 {
9925 /* 4) Store, register pre-indexed. */
9926 /* 6) Store, register post -indexed. */
9927 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9928 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9929 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9930 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9931 /* Calculate target store address, Rn +/- Rm, register offset. */
9932 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9933 {
9934 tgt_mem_addr = u_regval[0] + u_regval[1];
9935 }
9936 else
9937 {
9938 tgt_mem_addr = u_regval[1] - u_regval[0];
9939 }
9940 if (ARM_RECORD_STRH == str_type)
9941 {
9942 record_buf_mem[0] = 2;
9943 record_buf_mem[1] = tgt_mem_addr;
9944 arm_insn_r->mem_rec_count = 1;
9945 }
9946 else if (ARM_RECORD_STRD == str_type)
9947 {
9948 record_buf_mem[0] = 4;
9949 record_buf_mem[1] = tgt_mem_addr;
9950 record_buf_mem[2] = 4;
9951 record_buf_mem[3] = tgt_mem_addr + 4;
9952 arm_insn_r->mem_rec_count = 2;
9953 }
9954 /* Record Rn also as it changes. */
9955 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9956 arm_insn_r->reg_rec_count = 1;
9957 }
9958 return 0;
9959 }
9960
9961 /* Handling ARM extension space insns. */
9962
9963 static int
9964 arm_record_extension_space (insn_decode_record *arm_insn_r)
9965 {
9966 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
9967 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9968 uint32_t record_buf[8], record_buf_mem[8];
9969 uint32_t reg_src1 = 0;
9970 struct regcache *reg_cache = arm_insn_r->regcache;
9971 ULONGEST u_regval = 0;
9972
9973 gdb_assert (!INSN_RECORDED(arm_insn_r));
9974 /* Handle unconditional insn extension space. */
9975
9976 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9977 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9978 if (arm_insn_r->cond)
9979 {
9980 /* PLD has no affect on architectural state, it just affects
9981 the caches. */
9982 if (5 == ((opcode1 & 0xE0) >> 5))
9983 {
9984 /* BLX(1) */
9985 record_buf[0] = ARM_PS_REGNUM;
9986 record_buf[1] = ARM_LR_REGNUM;
9987 arm_insn_r->reg_rec_count = 2;
9988 }
9989 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9990 }
9991
9992
9993 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9994 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9995 {
9996 ret = -1;
9997 /* Undefined instruction on ARM V5; need to handle if later
9998 versions define it. */
9999 }
10000
10001 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
10002 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
10003 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
10004
10005 /* Handle arithmetic insn extension space. */
10006 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
10007 && !INSN_RECORDED(arm_insn_r))
10008 {
10009 /* Handle MLA(S) and MUL(S). */
10010 if (0 <= insn_op1 && 3 >= insn_op1)
10011 {
10012 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10013 record_buf[1] = ARM_PS_REGNUM;
10014 arm_insn_r->reg_rec_count = 2;
10015 }
10016 else if (4 <= insn_op1 && 15 >= insn_op1)
10017 {
10018 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
10019 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10020 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10021 record_buf[2] = ARM_PS_REGNUM;
10022 arm_insn_r->reg_rec_count = 3;
10023 }
10024 }
10025
10026 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
10027 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
10028 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
10029
10030 /* Handle control insn extension space. */
10031
10032 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
10033 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
10034 {
10035 if (!bit (arm_insn_r->arm_insn,25))
10036 {
10037 if (!bits (arm_insn_r->arm_insn, 4, 7))
10038 {
10039 if ((0 == insn_op1) || (2 == insn_op1))
10040 {
10041 /* MRS. */
10042 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10043 arm_insn_r->reg_rec_count = 1;
10044 }
10045 else if (1 == insn_op1)
10046 {
10047 /* CSPR is going to be changed. */
10048 record_buf[0] = ARM_PS_REGNUM;
10049 arm_insn_r->reg_rec_count = 1;
10050 }
10051 else if (3 == insn_op1)
10052 {
10053 /* SPSR is going to be changed. */
10054 /* We need to get SPSR value, which is yet to be done. */
10055 return -1;
10056 }
10057 }
10058 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
10059 {
10060 if (1 == insn_op1)
10061 {
10062 /* BX. */
10063 record_buf[0] = ARM_PS_REGNUM;
10064 arm_insn_r->reg_rec_count = 1;
10065 }
10066 else if (3 == insn_op1)
10067 {
10068 /* CLZ. */
10069 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10070 arm_insn_r->reg_rec_count = 1;
10071 }
10072 }
10073 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
10074 {
10075 /* BLX. */
10076 record_buf[0] = ARM_PS_REGNUM;
10077 record_buf[1] = ARM_LR_REGNUM;
10078 arm_insn_r->reg_rec_count = 2;
10079 }
10080 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
10081 {
10082 /* QADD, QSUB, QDADD, QDSUB */
10083 record_buf[0] = ARM_PS_REGNUM;
10084 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10085 arm_insn_r->reg_rec_count = 2;
10086 }
10087 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
10088 {
10089 /* BKPT. */
10090 record_buf[0] = ARM_PS_REGNUM;
10091 record_buf[1] = ARM_LR_REGNUM;
10092 arm_insn_r->reg_rec_count = 2;
10093
10094 /* Save SPSR also;how? */
10095 return -1;
10096 }
10097 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
10098 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
10099 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
10100 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
10101 )
10102 {
10103 if (0 == insn_op1 || 1 == insn_op1)
10104 {
10105 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
10106 /* We dont do optimization for SMULW<y> where we
10107 need only Rd. */
10108 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10109 record_buf[1] = ARM_PS_REGNUM;
10110 arm_insn_r->reg_rec_count = 2;
10111 }
10112 else if (2 == insn_op1)
10113 {
10114 /* SMLAL<x><y>. */
10115 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10116 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10117 arm_insn_r->reg_rec_count = 2;
10118 }
10119 else if (3 == insn_op1)
10120 {
10121 /* SMUL<x><y>. */
10122 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10123 arm_insn_r->reg_rec_count = 1;
10124 }
10125 }
10126 }
10127 else
10128 {
10129 /* MSR : immediate form. */
10130 if (1 == insn_op1)
10131 {
10132 /* CSPR is going to be changed. */
10133 record_buf[0] = ARM_PS_REGNUM;
10134 arm_insn_r->reg_rec_count = 1;
10135 }
10136 else if (3 == insn_op1)
10137 {
10138 /* SPSR is going to be changed. */
10139 /* we need to get SPSR value, which is yet to be done */
10140 return -1;
10141 }
10142 }
10143 }
10144
10145 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10146 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10147 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10148
10149 /* Handle load/store insn extension space. */
10150
10151 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10152 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10153 && !INSN_RECORDED(arm_insn_r))
10154 {
10155 /* SWP/SWPB. */
10156 if (0 == insn_op1)
10157 {
10158 /* These insn, changes register and memory as well. */
10159 /* SWP or SWPB insn. */
10160 /* Get memory address given by Rn. */
10161 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10162 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10163 /* SWP insn ?, swaps word. */
10164 if (8 == arm_insn_r->opcode)
10165 {
10166 record_buf_mem[0] = 4;
10167 }
10168 else
10169 {
10170 /* SWPB insn, swaps only byte. */
10171 record_buf_mem[0] = 1;
10172 }
10173 record_buf_mem[1] = u_regval;
10174 arm_insn_r->mem_rec_count = 1;
10175 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10176 arm_insn_r->reg_rec_count = 1;
10177 }
10178 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10179 {
10180 /* STRH. */
10181 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10182 ARM_RECORD_STRH);
10183 }
10184 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10185 {
10186 /* LDRD. */
10187 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10188 record_buf[1] = record_buf[0] + 1;
10189 arm_insn_r->reg_rec_count = 2;
10190 }
10191 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10192 {
10193 /* STRD. */
10194 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10195 ARM_RECORD_STRD);
10196 }
10197 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10198 {
10199 /* LDRH, LDRSB, LDRSH. */
10200 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10201 arm_insn_r->reg_rec_count = 1;
10202 }
10203
10204 }
10205
10206 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10207 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10208 && !INSN_RECORDED(arm_insn_r))
10209 {
10210 ret = -1;
10211 /* Handle coprocessor insn extension space. */
10212 }
10213
10214 /* To be done for ARMv5 and later; as of now we return -1. */
10215 if (-1 == ret)
10216 return ret;
10217
10218 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10219 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10220
10221 return ret;
10222 }
10223
10224 /* Handling opcode 000 insns. */
10225
10226 static int
10227 arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10228 {
10229 struct regcache *reg_cache = arm_insn_r->regcache;
10230 uint32_t record_buf[8], record_buf_mem[8];
10231 ULONGEST u_regval[2] = {0};
10232
10233 uint32_t reg_src1 = 0, reg_dest = 0;
10234 uint32_t opcode1 = 0;
10235
10236 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10237 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10238 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10239
10240 /* Data processing insn /multiply insn. */
10241 if (9 == arm_insn_r->decode
10242 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10243 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
10244 {
10245 /* Handle multiply instructions. */
10246 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10247 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10248 {
10249 /* Handle MLA and MUL. */
10250 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10251 record_buf[1] = ARM_PS_REGNUM;
10252 arm_insn_r->reg_rec_count = 2;
10253 }
10254 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10255 {
10256 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10257 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10258 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10259 record_buf[2] = ARM_PS_REGNUM;
10260 arm_insn_r->reg_rec_count = 3;
10261 }
10262 }
10263 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10264 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
10265 {
10266 /* Handle misc load insns, as 20th bit (L = 1). */
10267 /* LDR insn has a capability to do branching, if
10268 MOV LR, PC is precceded by LDR insn having Rn as R15
10269 in that case, it emulates branch and link insn, and hence we
10270 need to save CSPR and PC as well. I am not sure this is right
10271 place; as opcode = 010 LDR insn make this happen, if R15 was
10272 used. */
10273 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10274 if (15 != reg_dest)
10275 {
10276 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10277 arm_insn_r->reg_rec_count = 1;
10278 }
10279 else
10280 {
10281 record_buf[0] = reg_dest;
10282 record_buf[1] = ARM_PS_REGNUM;
10283 arm_insn_r->reg_rec_count = 2;
10284 }
10285 }
10286 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10287 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
10288 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10289 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
10290 {
10291 /* Handle MSR insn. */
10292 if (9 == arm_insn_r->opcode)
10293 {
10294 /* CSPR is going to be changed. */
10295 record_buf[0] = ARM_PS_REGNUM;
10296 arm_insn_r->reg_rec_count = 1;
10297 }
10298 else
10299 {
10300 /* SPSR is going to be changed. */
10301 /* How to read SPSR value? */
10302 return -1;
10303 }
10304 }
10305 else if (9 == arm_insn_r->decode
10306 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10307 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10308 {
10309 /* Handling SWP, SWPB. */
10310 /* These insn, changes register and memory as well. */
10311 /* SWP or SWPB insn. */
10312
10313 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10314 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10315 /* SWP insn ?, swaps word. */
10316 if (8 == arm_insn_r->opcode)
10317 {
10318 record_buf_mem[0] = 4;
10319 }
10320 else
10321 {
10322 /* SWPB insn, swaps only byte. */
10323 record_buf_mem[0] = 1;
10324 }
10325 record_buf_mem[1] = u_regval[0];
10326 arm_insn_r->mem_rec_count = 1;
10327 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10328 arm_insn_r->reg_rec_count = 1;
10329 }
10330 else if (3 == arm_insn_r->decode && 0x12 == opcode1
10331 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10332 {
10333 /* Handle BLX, branch and link/exchange. */
10334 if (9 == arm_insn_r->opcode)
10335 {
10336 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10337 and R14 stores the return address. */
10338 record_buf[0] = ARM_PS_REGNUM;
10339 record_buf[1] = ARM_LR_REGNUM;
10340 arm_insn_r->reg_rec_count = 2;
10341 }
10342 }
10343 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10344 {
10345 /* Handle enhanced software breakpoint insn, BKPT. */
10346 /* CPSR is changed to be executed in ARM state, disabling normal
10347 interrupts, entering abort mode. */
10348 /* According to high vector configuration PC is set. */
10349 /* user hit breakpoint and type reverse, in
10350 that case, we need to go back with previous CPSR and
10351 Program Counter. */
10352 record_buf[0] = ARM_PS_REGNUM;
10353 record_buf[1] = ARM_LR_REGNUM;
10354 arm_insn_r->reg_rec_count = 2;
10355
10356 /* Save SPSR also; how? */
10357 return -1;
10358 }
10359 else if (11 == arm_insn_r->decode
10360 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10361 {
10362 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
10363
10364 /* Handle str(x) insn */
10365 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10366 ARM_RECORD_STRH);
10367 }
10368 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10369 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10370 {
10371 /* Handle BX, branch and link/exchange. */
10372 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10373 record_buf[0] = ARM_PS_REGNUM;
10374 arm_insn_r->reg_rec_count = 1;
10375 }
10376 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10377 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10378 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10379 {
10380 /* Count leading zeros: CLZ. */
10381 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10382 arm_insn_r->reg_rec_count = 1;
10383 }
10384 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10385 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10386 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10387 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
10388 )
10389 {
10390 /* Handle MRS insn. */
10391 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10392 arm_insn_r->reg_rec_count = 1;
10393 }
10394 else if (arm_insn_r->opcode <= 15)
10395 {
10396 /* Normal data processing insns. */
10397 /* Out of 11 shifter operands mode, all the insn modifies destination
10398 register, which is specified by 13-16 decode. */
10399 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10400 record_buf[1] = ARM_PS_REGNUM;
10401 arm_insn_r->reg_rec_count = 2;
10402 }
10403 else
10404 {
10405 return -1;
10406 }
10407
10408 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10409 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10410 return 0;
10411 }
10412
10413 /* Handling opcode 001 insns. */
10414
10415 static int
10416 arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10417 {
10418 uint32_t record_buf[8], record_buf_mem[8];
10419
10420 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10421 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10422
10423 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10424 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10425 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10426 )
10427 {
10428 /* Handle MSR insn. */
10429 if (9 == arm_insn_r->opcode)
10430 {
10431 /* CSPR is going to be changed. */
10432 record_buf[0] = ARM_PS_REGNUM;
10433 arm_insn_r->reg_rec_count = 1;
10434 }
10435 else
10436 {
10437 /* SPSR is going to be changed. */
10438 }
10439 }
10440 else if (arm_insn_r->opcode <= 15)
10441 {
10442 /* Normal data processing insns. */
10443 /* Out of 11 shifter operands mode, all the insn modifies destination
10444 register, which is specified by 13-16 decode. */
10445 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10446 record_buf[1] = ARM_PS_REGNUM;
10447 arm_insn_r->reg_rec_count = 2;
10448 }
10449 else
10450 {
10451 return -1;
10452 }
10453
10454 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10455 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10456 return 0;
10457 }
10458
10459 static int
10460 arm_record_media (insn_decode_record *arm_insn_r)
10461 {
10462 uint32_t record_buf[8];
10463
10464 switch (bits (arm_insn_r->arm_insn, 22, 24))
10465 {
10466 case 0:
10467 /* Parallel addition and subtraction, signed */
10468 case 1:
10469 /* Parallel addition and subtraction, unsigned */
10470 case 2:
10471 case 3:
10472 /* Packing, unpacking, saturation and reversal */
10473 {
10474 int rd = bits (arm_insn_r->arm_insn, 12, 15);
10475
10476 record_buf[arm_insn_r->reg_rec_count++] = rd;
10477 }
10478 break;
10479
10480 case 4:
10481 case 5:
10482 /* Signed multiplies */
10483 {
10484 int rd = bits (arm_insn_r->arm_insn, 16, 19);
10485 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
10486
10487 record_buf[arm_insn_r->reg_rec_count++] = rd;
10488 if (op1 == 0x0)
10489 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10490 else if (op1 == 0x4)
10491 record_buf[arm_insn_r->reg_rec_count++]
10492 = bits (arm_insn_r->arm_insn, 12, 15);
10493 }
10494 break;
10495
10496 case 6:
10497 {
10498 if (bit (arm_insn_r->arm_insn, 21)
10499 && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
10500 {
10501 /* SBFX */
10502 record_buf[arm_insn_r->reg_rec_count++]
10503 = bits (arm_insn_r->arm_insn, 12, 15);
10504 }
10505 else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
10506 && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
10507 {
10508 /* USAD8 and USADA8 */
10509 record_buf[arm_insn_r->reg_rec_count++]
10510 = bits (arm_insn_r->arm_insn, 16, 19);
10511 }
10512 }
10513 break;
10514
10515 case 7:
10516 {
10517 if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
10518 && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
10519 {
10520 /* Permanently UNDEFINED */
10521 return -1;
10522 }
10523 else
10524 {
10525 /* BFC, BFI and UBFX */
10526 record_buf[arm_insn_r->reg_rec_count++]
10527 = bits (arm_insn_r->arm_insn, 12, 15);
10528 }
10529 }
10530 break;
10531
10532 default:
10533 return -1;
10534 }
10535
10536 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10537
10538 return 0;
10539 }
10540
10541 /* Handle ARM mode instructions with opcode 010. */
10542
10543 static int
10544 arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10545 {
10546 struct regcache *reg_cache = arm_insn_r->regcache;
10547
10548 uint32_t reg_base , reg_dest;
10549 uint32_t offset_12, tgt_mem_addr;
10550 uint32_t record_buf[8], record_buf_mem[8];
10551 unsigned char wback;
10552 ULONGEST u_regval;
10553
10554 /* Calculate wback. */
10555 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10556 || (bit (arm_insn_r->arm_insn, 21) == 1);
10557
10558 arm_insn_r->reg_rec_count = 0;
10559 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
10560
10561 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10562 {
10563 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10564 and LDRT. */
10565
10566 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10567 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10568
10569 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10570 preceeds a LDR instruction having R15 as reg_base, it
10571 emulates a branch and link instruction, and hence we need to save
10572 CPSR and PC as well. */
10573 if (ARM_PC_REGNUM == reg_dest)
10574 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10575
10576 /* If wback is true, also save the base register, which is going to be
10577 written to. */
10578 if (wback)
10579 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10580 }
10581 else
10582 {
10583 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10584
10585 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
10586 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10587
10588 /* Handle bit U. */
10589 if (bit (arm_insn_r->arm_insn, 23))
10590 {
10591 /* U == 1: Add the offset. */
10592 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10593 }
10594 else
10595 {
10596 /* U == 0: subtract the offset. */
10597 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10598 }
10599
10600 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10601 bytes. */
10602 if (bit (arm_insn_r->arm_insn, 22))
10603 {
10604 /* STRB and STRBT: 1 byte. */
10605 record_buf_mem[0] = 1;
10606 }
10607 else
10608 {
10609 /* STR and STRT: 4 bytes. */
10610 record_buf_mem[0] = 4;
10611 }
10612
10613 /* Handle bit P. */
10614 if (bit (arm_insn_r->arm_insn, 24))
10615 record_buf_mem[1] = tgt_mem_addr;
10616 else
10617 record_buf_mem[1] = (uint32_t) u_regval;
10618
10619 arm_insn_r->mem_rec_count = 1;
10620
10621 /* If wback is true, also save the base register, which is going to be
10622 written to. */
10623 if (wback)
10624 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10625 }
10626
10627 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10628 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10629 return 0;
10630 }
10631
10632 /* Handling opcode 011 insns. */
10633
10634 static int
10635 arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10636 {
10637 struct regcache *reg_cache = arm_insn_r->regcache;
10638
10639 uint32_t shift_imm = 0;
10640 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10641 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10642 uint32_t record_buf[8], record_buf_mem[8];
10643
10644 LONGEST s_word;
10645 ULONGEST u_regval[2];
10646
10647 if (bit (arm_insn_r->arm_insn, 4))
10648 return arm_record_media (arm_insn_r);
10649
10650 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10651 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10652
10653 /* Handle enhanced store insns and LDRD DSP insn,
10654 order begins according to addressing modes for store insns
10655 STRH insn. */
10656
10657 /* LDR or STR? */
10658 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10659 {
10660 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10661 /* LDR insn has a capability to do branching, if
10662 MOV LR, PC is precedded by LDR insn having Rn as R15
10663 in that case, it emulates branch and link insn, and hence we
10664 need to save CSPR and PC as well. */
10665 if (15 != reg_dest)
10666 {
10667 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10668 arm_insn_r->reg_rec_count = 1;
10669 }
10670 else
10671 {
10672 record_buf[0] = reg_dest;
10673 record_buf[1] = ARM_PS_REGNUM;
10674 arm_insn_r->reg_rec_count = 2;
10675 }
10676 }
10677 else
10678 {
10679 if (! bits (arm_insn_r->arm_insn, 4, 11))
10680 {
10681 /* Store insn, register offset and register pre-indexed,
10682 register post-indexed. */
10683 /* Get Rm. */
10684 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10685 /* Get Rn. */
10686 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10687 regcache_raw_read_unsigned (reg_cache, reg_src1
10688 , &u_regval[0]);
10689 regcache_raw_read_unsigned (reg_cache, reg_src2
10690 , &u_regval[1]);
10691 if (15 == reg_src2)
10692 {
10693 /* If R15 was used as Rn, hence current PC+8. */
10694 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10695 u_regval[0] = u_regval[0] + 8;
10696 }
10697 /* Calculate target store address, Rn +/- Rm, register offset. */
10698 /* U == 1. */
10699 if (bit (arm_insn_r->arm_insn, 23))
10700 {
10701 tgt_mem_addr = u_regval[0] + u_regval[1];
10702 }
10703 else
10704 {
10705 tgt_mem_addr = u_regval[1] - u_regval[0];
10706 }
10707
10708 switch (arm_insn_r->opcode)
10709 {
10710 /* STR. */
10711 case 8:
10712 case 12:
10713 /* STR. */
10714 case 9:
10715 case 13:
10716 /* STRT. */
10717 case 1:
10718 case 5:
10719 /* STR. */
10720 case 0:
10721 case 4:
10722 record_buf_mem[0] = 4;
10723 break;
10724
10725 /* STRB. */
10726 case 10:
10727 case 14:
10728 /* STRB. */
10729 case 11:
10730 case 15:
10731 /* STRBT. */
10732 case 3:
10733 case 7:
10734 /* STRB. */
10735 case 2:
10736 case 6:
10737 record_buf_mem[0] = 1;
10738 break;
10739
10740 default:
10741 gdb_assert_not_reached ("no decoding pattern found");
10742 break;
10743 }
10744 record_buf_mem[1] = tgt_mem_addr;
10745 arm_insn_r->mem_rec_count = 1;
10746
10747 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10748 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10749 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10750 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10751 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10752 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10753 )
10754 {
10755 /* Rn is going to be changed in pre-indexed mode and
10756 post-indexed mode as well. */
10757 record_buf[0] = reg_src2;
10758 arm_insn_r->reg_rec_count = 1;
10759 }
10760 }
10761 else
10762 {
10763 /* Store insn, scaled register offset; scaled pre-indexed. */
10764 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10765 /* Get Rm. */
10766 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10767 /* Get Rn. */
10768 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10769 /* Get shift_imm. */
10770 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10771 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10772 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10773 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10774 /* Offset_12 used as shift. */
10775 switch (offset_12)
10776 {
10777 case 0:
10778 /* Offset_12 used as index. */
10779 offset_12 = u_regval[0] << shift_imm;
10780 break;
10781
10782 case 1:
10783 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10784 break;
10785
10786 case 2:
10787 if (!shift_imm)
10788 {
10789 if (bit (u_regval[0], 31))
10790 {
10791 offset_12 = 0xFFFFFFFF;
10792 }
10793 else
10794 {
10795 offset_12 = 0;
10796 }
10797 }
10798 else
10799 {
10800 /* This is arithmetic shift. */
10801 offset_12 = s_word >> shift_imm;
10802 }
10803 break;
10804
10805 case 3:
10806 if (!shift_imm)
10807 {
10808 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10809 &u_regval[1]);
10810 /* Get C flag value and shift it by 31. */
10811 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10812 | (u_regval[0]) >> 1);
10813 }
10814 else
10815 {
10816 offset_12 = (u_regval[0] >> shift_imm) \
10817 | (u_regval[0] <<
10818 (sizeof(uint32_t) - shift_imm));
10819 }
10820 break;
10821
10822 default:
10823 gdb_assert_not_reached ("no decoding pattern found");
10824 break;
10825 }
10826
10827 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10828 /* bit U set. */
10829 if (bit (arm_insn_r->arm_insn, 23))
10830 {
10831 tgt_mem_addr = u_regval[1] + offset_12;
10832 }
10833 else
10834 {
10835 tgt_mem_addr = u_regval[1] - offset_12;
10836 }
10837
10838 switch (arm_insn_r->opcode)
10839 {
10840 /* STR. */
10841 case 8:
10842 case 12:
10843 /* STR. */
10844 case 9:
10845 case 13:
10846 /* STRT. */
10847 case 1:
10848 case 5:
10849 /* STR. */
10850 case 0:
10851 case 4:
10852 record_buf_mem[0] = 4;
10853 break;
10854
10855 /* STRB. */
10856 case 10:
10857 case 14:
10858 /* STRB. */
10859 case 11:
10860 case 15:
10861 /* STRBT. */
10862 case 3:
10863 case 7:
10864 /* STRB. */
10865 case 2:
10866 case 6:
10867 record_buf_mem[0] = 1;
10868 break;
10869
10870 default:
10871 gdb_assert_not_reached ("no decoding pattern found");
10872 break;
10873 }
10874 record_buf_mem[1] = tgt_mem_addr;
10875 arm_insn_r->mem_rec_count = 1;
10876
10877 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10878 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10879 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10880 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10881 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10882 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10883 )
10884 {
10885 /* Rn is going to be changed in register scaled pre-indexed
10886 mode,and scaled post indexed mode. */
10887 record_buf[0] = reg_src2;
10888 arm_insn_r->reg_rec_count = 1;
10889 }
10890 }
10891 }
10892
10893 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10894 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10895 return 0;
10896 }
10897
10898 /* Handle ARM mode instructions with opcode 100. */
10899
10900 static int
10901 arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10902 {
10903 struct regcache *reg_cache = arm_insn_r->regcache;
10904 uint32_t register_count = 0, register_bits;
10905 uint32_t reg_base, addr_mode;
10906 uint32_t record_buf[24], record_buf_mem[48];
10907 uint32_t wback;
10908 ULONGEST u_regval;
10909
10910 /* Fetch the list of registers. */
10911 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10912 arm_insn_r->reg_rec_count = 0;
10913
10914 /* Fetch the base register that contains the address we are loading data
10915 to. */
10916 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
10917
10918 /* Calculate wback. */
10919 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
10920
10921 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10922 {
10923 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
10924
10925 /* Find out which registers are going to be loaded from memory. */
10926 while (register_bits)
10927 {
10928 if (register_bits & 0x00000001)
10929 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10930 register_bits = register_bits >> 1;
10931 register_count++;
10932 }
10933
10934
10935 /* If wback is true, also save the base register, which is going to be
10936 written to. */
10937 if (wback)
10938 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10939
10940 /* Save the CPSR register. */
10941 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10942 }
10943 else
10944 {
10945 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
10946
10947 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10948
10949 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10950
10951 /* Find out how many registers are going to be stored to memory. */
10952 while (register_bits)
10953 {
10954 if (register_bits & 0x00000001)
10955 register_count++;
10956 register_bits = register_bits >> 1;
10957 }
10958
10959 switch (addr_mode)
10960 {
10961 /* STMDA (STMED): Decrement after. */
10962 case 0:
10963 record_buf_mem[1] = (uint32_t) u_regval
10964 - register_count * INT_REGISTER_SIZE + 4;
10965 break;
10966 /* STM (STMIA, STMEA): Increment after. */
10967 case 1:
10968 record_buf_mem[1] = (uint32_t) u_regval;
10969 break;
10970 /* STMDB (STMFD): Decrement before. */
10971 case 2:
10972 record_buf_mem[1] = (uint32_t) u_regval
10973 - register_count * INT_REGISTER_SIZE;
10974 break;
10975 /* STMIB (STMFA): Increment before. */
10976 case 3:
10977 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
10978 break;
10979 default:
10980 gdb_assert_not_reached ("no decoding pattern found");
10981 break;
10982 }
10983
10984 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
10985 arm_insn_r->mem_rec_count = 1;
10986
10987 /* If wback is true, also save the base register, which is going to be
10988 written to. */
10989 if (wback)
10990 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10991 }
10992
10993 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10994 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10995 return 0;
10996 }
10997
10998 /* Handling opcode 101 insns. */
10999
11000 static int
11001 arm_record_b_bl (insn_decode_record *arm_insn_r)
11002 {
11003 uint32_t record_buf[8];
11004
11005 /* Handle B, BL, BLX(1) insns. */
11006 /* B simply branches so we do nothing here. */
11007 /* Note: BLX(1) doesnt fall here but instead it falls into
11008 extension space. */
11009 if (bit (arm_insn_r->arm_insn, 24))
11010 {
11011 record_buf[0] = ARM_LR_REGNUM;
11012 arm_insn_r->reg_rec_count = 1;
11013 }
11014
11015 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11016
11017 return 0;
11018 }
11019
11020 static int
11021 arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
11022 {
11023 printf_unfiltered (_("Process record does not support instruction "
11024 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11025 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11026
11027 return -1;
11028 }
11029
11030 /* Record handler for vector data transfer instructions. */
11031
11032 static int
11033 arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
11034 {
11035 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
11036 uint32_t record_buf[4];
11037
11038 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
11039 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
11040 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
11041 bit_l = bit (arm_insn_r->arm_insn, 20);
11042 bit_c = bit (arm_insn_r->arm_insn, 8);
11043
11044 /* Handle VMOV instruction. */
11045 if (bit_l && bit_c)
11046 {
11047 record_buf[0] = reg_t;
11048 arm_insn_r->reg_rec_count = 1;
11049 }
11050 else if (bit_l && !bit_c)
11051 {
11052 /* Handle VMOV instruction. */
11053 if (bits_a == 0x00)
11054 {
11055 record_buf[0] = reg_t;
11056 arm_insn_r->reg_rec_count = 1;
11057 }
11058 /* Handle VMRS instruction. */
11059 else if (bits_a == 0x07)
11060 {
11061 if (reg_t == 15)
11062 reg_t = ARM_PS_REGNUM;
11063
11064 record_buf[0] = reg_t;
11065 arm_insn_r->reg_rec_count = 1;
11066 }
11067 }
11068 else if (!bit_l && !bit_c)
11069 {
11070 /* Handle VMOV instruction. */
11071 if (bits_a == 0x00)
11072 {
11073 record_buf[0] = ARM_D0_REGNUM + reg_v;
11074
11075 arm_insn_r->reg_rec_count = 1;
11076 }
11077 /* Handle VMSR instruction. */
11078 else if (bits_a == 0x07)
11079 {
11080 record_buf[0] = ARM_FPSCR_REGNUM;
11081 arm_insn_r->reg_rec_count = 1;
11082 }
11083 }
11084 else if (!bit_l && bit_c)
11085 {
11086 /* Handle VMOV instruction. */
11087 if (!(bits_a & 0x04))
11088 {
11089 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
11090 + ARM_D0_REGNUM;
11091 arm_insn_r->reg_rec_count = 1;
11092 }
11093 /* Handle VDUP instruction. */
11094 else
11095 {
11096 if (bit (arm_insn_r->arm_insn, 21))
11097 {
11098 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11099 record_buf[0] = reg_v + ARM_D0_REGNUM;
11100 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
11101 arm_insn_r->reg_rec_count = 2;
11102 }
11103 else
11104 {
11105 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11106 record_buf[0] = reg_v + ARM_D0_REGNUM;
11107 arm_insn_r->reg_rec_count = 1;
11108 }
11109 }
11110 }
11111
11112 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11113 return 0;
11114 }
11115
11116 /* Record handler for extension register load/store instructions. */
11117
11118 static int
11119 arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
11120 {
11121 uint32_t opcode, single_reg;
11122 uint8_t op_vldm_vstm;
11123 uint32_t record_buf[8], record_buf_mem[128];
11124 ULONGEST u_regval = 0;
11125
11126 struct regcache *reg_cache = arm_insn_r->regcache;
11127
11128 opcode = bits (arm_insn_r->arm_insn, 20, 24);
11129 single_reg = !bit (arm_insn_r->arm_insn, 8);
11130 op_vldm_vstm = opcode & 0x1b;
11131
11132 /* Handle VMOV instructions. */
11133 if ((opcode & 0x1e) == 0x04)
11134 {
11135 if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
11136 {
11137 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11138 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11139 arm_insn_r->reg_rec_count = 2;
11140 }
11141 else
11142 {
11143 uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
11144 uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
11145
11146 if (single_reg)
11147 {
11148 /* The first S register number m is REG_M:M (M is bit 5),
11149 the corresponding D register number is REG_M:M / 2, which
11150 is REG_M. */
11151 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
11152 /* The second S register number is REG_M:M + 1, the
11153 corresponding D register number is (REG_M:M + 1) / 2.
11154 IOW, if bit M is 1, the first and second S registers
11155 are mapped to different D registers, otherwise, they are
11156 in the same D register. */
11157 if (bit_m)
11158 {
11159 record_buf[arm_insn_r->reg_rec_count++]
11160 = ARM_D0_REGNUM + reg_m + 1;
11161 }
11162 }
11163 else
11164 {
11165 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
11166 arm_insn_r->reg_rec_count = 1;
11167 }
11168 }
11169 }
11170 /* Handle VSTM and VPUSH instructions. */
11171 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
11172 || op_vldm_vstm == 0x12)
11173 {
11174 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11175 uint32_t memory_index = 0;
11176
11177 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11178 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11179 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11180 imm_off32 = imm_off8 << 2;
11181 memory_count = imm_off8;
11182
11183 if (bit (arm_insn_r->arm_insn, 23))
11184 start_address = u_regval;
11185 else
11186 start_address = u_regval - imm_off32;
11187
11188 if (bit (arm_insn_r->arm_insn, 21))
11189 {
11190 record_buf[0] = reg_rn;
11191 arm_insn_r->reg_rec_count = 1;
11192 }
11193
11194 while (memory_count > 0)
11195 {
11196 if (single_reg)
11197 {
11198 record_buf_mem[memory_index] = 4;
11199 record_buf_mem[memory_index + 1] = start_address;
11200 start_address = start_address + 4;
11201 memory_index = memory_index + 2;
11202 }
11203 else
11204 {
11205 record_buf_mem[memory_index] = 4;
11206 record_buf_mem[memory_index + 1] = start_address;
11207 record_buf_mem[memory_index + 2] = 4;
11208 record_buf_mem[memory_index + 3] = start_address + 4;
11209 start_address = start_address + 8;
11210 memory_index = memory_index + 4;
11211 }
11212 memory_count--;
11213 }
11214 arm_insn_r->mem_rec_count = (memory_index >> 1);
11215 }
11216 /* Handle VLDM instructions. */
11217 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
11218 || op_vldm_vstm == 0x13)
11219 {
11220 uint32_t reg_count, reg_vd;
11221 uint32_t reg_index = 0;
11222 uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
11223
11224 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11225 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11226
11227 /* REG_VD is the first D register number. If the instruction
11228 loads memory to S registers (SINGLE_REG is TRUE), the register
11229 number is (REG_VD << 1 | bit D), so the corresponding D
11230 register number is (REG_VD << 1 | bit D) / 2 = REG_VD. */
11231 if (!single_reg)
11232 reg_vd = reg_vd | (bit_d << 4);
11233
11234 if (bit (arm_insn_r->arm_insn, 21) /* write back */)
11235 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
11236
11237 /* If the instruction loads memory to D register, REG_COUNT should
11238 be divided by 2, according to the ARM Architecture Reference
11239 Manual. If the instruction loads memory to S register, divide by
11240 2 as well because two S registers are mapped to D register. */
11241 reg_count = reg_count / 2;
11242 if (single_reg && bit_d)
11243 {
11244 /* Increase the register count if S register list starts from
11245 an odd number (bit d is one). */
11246 reg_count++;
11247 }
11248
11249 while (reg_count > 0)
11250 {
11251 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
11252 reg_count--;
11253 }
11254 arm_insn_r->reg_rec_count = reg_index;
11255 }
11256 /* VSTR Vector store register. */
11257 else if ((opcode & 0x13) == 0x10)
11258 {
11259 uint32_t start_address, reg_rn, imm_off32, imm_off8;
11260 uint32_t memory_index = 0;
11261
11262 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11263 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11264 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11265 imm_off32 = imm_off8 << 2;
11266
11267 if (bit (arm_insn_r->arm_insn, 23))
11268 start_address = u_regval + imm_off32;
11269 else
11270 start_address = u_regval - imm_off32;
11271
11272 if (single_reg)
11273 {
11274 record_buf_mem[memory_index] = 4;
11275 record_buf_mem[memory_index + 1] = start_address;
11276 arm_insn_r->mem_rec_count = 1;
11277 }
11278 else
11279 {
11280 record_buf_mem[memory_index] = 4;
11281 record_buf_mem[memory_index + 1] = start_address;
11282 record_buf_mem[memory_index + 2] = 4;
11283 record_buf_mem[memory_index + 3] = start_address + 4;
11284 arm_insn_r->mem_rec_count = 2;
11285 }
11286 }
11287 /* VLDR Vector load register. */
11288 else if ((opcode & 0x13) == 0x11)
11289 {
11290 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11291
11292 if (!single_reg)
11293 {
11294 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11295 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11296 }
11297 else
11298 {
11299 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11300 /* Record register D rather than pseudo register S. */
11301 record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
11302 }
11303 arm_insn_r->reg_rec_count = 1;
11304 }
11305
11306 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11307 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11308 return 0;
11309 }
11310
11311 /* Record handler for arm/thumb mode VFP data processing instructions. */
11312
11313 static int
11314 arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11315 {
11316 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11317 uint32_t record_buf[4];
11318 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11319 enum insn_types curr_insn_type = INSN_INV;
11320
11321 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11322 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11323 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11324 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11325 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11326 bit_d = bit (arm_insn_r->arm_insn, 22);
11327 opc1 = opc1 & 0x04;
11328
11329 /* Handle VMLA, VMLS. */
11330 if (opc1 == 0x00)
11331 {
11332 if (bit (arm_insn_r->arm_insn, 10))
11333 {
11334 if (bit (arm_insn_r->arm_insn, 6))
11335 curr_insn_type = INSN_T0;
11336 else
11337 curr_insn_type = INSN_T1;
11338 }
11339 else
11340 {
11341 if (dp_op_sz)
11342 curr_insn_type = INSN_T1;
11343 else
11344 curr_insn_type = INSN_T2;
11345 }
11346 }
11347 /* Handle VNMLA, VNMLS, VNMUL. */
11348 else if (opc1 == 0x01)
11349 {
11350 if (dp_op_sz)
11351 curr_insn_type = INSN_T1;
11352 else
11353 curr_insn_type = INSN_T2;
11354 }
11355 /* Handle VMUL. */
11356 else if (opc1 == 0x02 && !(opc3 & 0x01))
11357 {
11358 if (bit (arm_insn_r->arm_insn, 10))
11359 {
11360 if (bit (arm_insn_r->arm_insn, 6))
11361 curr_insn_type = INSN_T0;
11362 else
11363 curr_insn_type = INSN_T1;
11364 }
11365 else
11366 {
11367 if (dp_op_sz)
11368 curr_insn_type = INSN_T1;
11369 else
11370 curr_insn_type = INSN_T2;
11371 }
11372 }
11373 /* Handle VADD, VSUB. */
11374 else if (opc1 == 0x03)
11375 {
11376 if (!bit (arm_insn_r->arm_insn, 9))
11377 {
11378 if (bit (arm_insn_r->arm_insn, 6))
11379 curr_insn_type = INSN_T0;
11380 else
11381 curr_insn_type = INSN_T1;
11382 }
11383 else
11384 {
11385 if (dp_op_sz)
11386 curr_insn_type = INSN_T1;
11387 else
11388 curr_insn_type = INSN_T2;
11389 }
11390 }
11391 /* Handle VDIV. */
11392 else if (opc1 == 0x0b)
11393 {
11394 if (dp_op_sz)
11395 curr_insn_type = INSN_T1;
11396 else
11397 curr_insn_type = INSN_T2;
11398 }
11399 /* Handle all other vfp data processing instructions. */
11400 else if (opc1 == 0x0b)
11401 {
11402 /* Handle VMOV. */
11403 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11404 {
11405 if (bit (arm_insn_r->arm_insn, 4))
11406 {
11407 if (bit (arm_insn_r->arm_insn, 6))
11408 curr_insn_type = INSN_T0;
11409 else
11410 curr_insn_type = INSN_T1;
11411 }
11412 else
11413 {
11414 if (dp_op_sz)
11415 curr_insn_type = INSN_T1;
11416 else
11417 curr_insn_type = INSN_T2;
11418 }
11419 }
11420 /* Handle VNEG and VABS. */
11421 else if ((opc2 == 0x01 && opc3 == 0x01)
11422 || (opc2 == 0x00 && opc3 == 0x03))
11423 {
11424 if (!bit (arm_insn_r->arm_insn, 11))
11425 {
11426 if (bit (arm_insn_r->arm_insn, 6))
11427 curr_insn_type = INSN_T0;
11428 else
11429 curr_insn_type = INSN_T1;
11430 }
11431 else
11432 {
11433 if (dp_op_sz)
11434 curr_insn_type = INSN_T1;
11435 else
11436 curr_insn_type = INSN_T2;
11437 }
11438 }
11439 /* Handle VSQRT. */
11440 else if (opc2 == 0x01 && opc3 == 0x03)
11441 {
11442 if (dp_op_sz)
11443 curr_insn_type = INSN_T1;
11444 else
11445 curr_insn_type = INSN_T2;
11446 }
11447 /* Handle VCVT. */
11448 else if (opc2 == 0x07 && opc3 == 0x03)
11449 {
11450 if (!dp_op_sz)
11451 curr_insn_type = INSN_T1;
11452 else
11453 curr_insn_type = INSN_T2;
11454 }
11455 else if (opc3 & 0x01)
11456 {
11457 /* Handle VCVT. */
11458 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11459 {
11460 if (!bit (arm_insn_r->arm_insn, 18))
11461 curr_insn_type = INSN_T2;
11462 else
11463 {
11464 if (dp_op_sz)
11465 curr_insn_type = INSN_T1;
11466 else
11467 curr_insn_type = INSN_T2;
11468 }
11469 }
11470 /* Handle VCVT. */
11471 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11472 {
11473 if (dp_op_sz)
11474 curr_insn_type = INSN_T1;
11475 else
11476 curr_insn_type = INSN_T2;
11477 }
11478 /* Handle VCVTB, VCVTT. */
11479 else if ((opc2 & 0x0e) == 0x02)
11480 curr_insn_type = INSN_T2;
11481 /* Handle VCMP, VCMPE. */
11482 else if ((opc2 & 0x0e) == 0x04)
11483 curr_insn_type = INSN_T3;
11484 }
11485 }
11486
11487 switch (curr_insn_type)
11488 {
11489 case INSN_T0:
11490 reg_vd = reg_vd | (bit_d << 4);
11491 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11492 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11493 arm_insn_r->reg_rec_count = 2;
11494 break;
11495
11496 case INSN_T1:
11497 reg_vd = reg_vd | (bit_d << 4);
11498 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11499 arm_insn_r->reg_rec_count = 1;
11500 break;
11501
11502 case INSN_T2:
11503 reg_vd = (reg_vd << 1) | bit_d;
11504 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11505 arm_insn_r->reg_rec_count = 1;
11506 break;
11507
11508 case INSN_T3:
11509 record_buf[0] = ARM_FPSCR_REGNUM;
11510 arm_insn_r->reg_rec_count = 1;
11511 break;
11512
11513 default:
11514 gdb_assert_not_reached ("no decoding pattern found");
11515 break;
11516 }
11517
11518 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11519 return 0;
11520 }
11521
11522 /* Handling opcode 110 insns. */
11523
11524 static int
11525 arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11526 {
11527 uint32_t op1, op1_ebit, coproc;
11528
11529 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11530 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11531 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11532
11533 if ((coproc & 0x0e) == 0x0a)
11534 {
11535 /* Handle extension register ld/st instructions. */
11536 if (!(op1 & 0x20))
11537 return arm_record_exreg_ld_st_insn (arm_insn_r);
11538
11539 /* 64-bit transfers between arm core and extension registers. */
11540 if ((op1 & 0x3e) == 0x04)
11541 return arm_record_exreg_ld_st_insn (arm_insn_r);
11542 }
11543 else
11544 {
11545 /* Handle coprocessor ld/st instructions. */
11546 if (!(op1 & 0x3a))
11547 {
11548 /* Store. */
11549 if (!op1_ebit)
11550 return arm_record_unsupported_insn (arm_insn_r);
11551 else
11552 /* Load. */
11553 return arm_record_unsupported_insn (arm_insn_r);
11554 }
11555
11556 /* Move to coprocessor from two arm core registers. */
11557 if (op1 == 0x4)
11558 return arm_record_unsupported_insn (arm_insn_r);
11559
11560 /* Move to two arm core registers from coprocessor. */
11561 if (op1 == 0x5)
11562 {
11563 uint32_t reg_t[2];
11564
11565 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11566 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11567 arm_insn_r->reg_rec_count = 2;
11568
11569 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11570 return 0;
11571 }
11572 }
11573 return arm_record_unsupported_insn (arm_insn_r);
11574 }
11575
11576 /* Handling opcode 111 insns. */
11577
11578 static int
11579 arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11580 {
11581 uint32_t op, op1_sbit, op1_ebit, coproc;
11582 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11583 struct regcache *reg_cache = arm_insn_r->regcache;
11584
11585 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
11586 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11587 op1_sbit = bit (arm_insn_r->arm_insn, 24);
11588 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11589 op = bit (arm_insn_r->arm_insn, 4);
11590
11591 /* Handle arm SWI/SVC system call instructions. */
11592 if (op1_sbit)
11593 {
11594 if (tdep->arm_syscall_record != NULL)
11595 {
11596 ULONGEST svc_operand, svc_number;
11597
11598 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11599
11600 if (svc_operand) /* OABI. */
11601 svc_number = svc_operand - 0x900000;
11602 else /* EABI. */
11603 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11604
11605 return tdep->arm_syscall_record (reg_cache, svc_number);
11606 }
11607 else
11608 {
11609 printf_unfiltered (_("no syscall record support\n"));
11610 return -1;
11611 }
11612 }
11613
11614 if ((coproc & 0x0e) == 0x0a)
11615 {
11616 /* VFP data-processing instructions. */
11617 if (!op1_sbit && !op)
11618 return arm_record_vfp_data_proc_insn (arm_insn_r);
11619
11620 /* Advanced SIMD, VFP instructions. */
11621 if (!op1_sbit && op)
11622 return arm_record_vdata_transfer_insn (arm_insn_r);
11623 }
11624 else
11625 {
11626 /* Coprocessor data operations. */
11627 if (!op1_sbit && !op)
11628 return arm_record_unsupported_insn (arm_insn_r);
11629
11630 /* Move to Coprocessor from ARM core register. */
11631 if (!op1_sbit && !op1_ebit && op)
11632 return arm_record_unsupported_insn (arm_insn_r);
11633
11634 /* Move to arm core register from coprocessor. */
11635 if (!op1_sbit && op1_ebit && op)
11636 {
11637 uint32_t record_buf[1];
11638
11639 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11640 if (record_buf[0] == 15)
11641 record_buf[0] = ARM_PS_REGNUM;
11642
11643 arm_insn_r->reg_rec_count = 1;
11644 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11645 record_buf);
11646 return 0;
11647 }
11648 }
11649
11650 return arm_record_unsupported_insn (arm_insn_r);
11651 }
11652
11653 /* Handling opcode 000 insns. */
11654
11655 static int
11656 thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11657 {
11658 uint32_t record_buf[8];
11659 uint32_t reg_src1 = 0;
11660
11661 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11662
11663 record_buf[0] = ARM_PS_REGNUM;
11664 record_buf[1] = reg_src1;
11665 thumb_insn_r->reg_rec_count = 2;
11666
11667 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11668
11669 return 0;
11670 }
11671
11672
11673 /* Handling opcode 001 insns. */
11674
11675 static int
11676 thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11677 {
11678 uint32_t record_buf[8];
11679 uint32_t reg_src1 = 0;
11680
11681 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11682
11683 record_buf[0] = ARM_PS_REGNUM;
11684 record_buf[1] = reg_src1;
11685 thumb_insn_r->reg_rec_count = 2;
11686
11687 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11688
11689 return 0;
11690 }
11691
11692 /* Handling opcode 010 insns. */
11693
11694 static int
11695 thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11696 {
11697 struct regcache *reg_cache = thumb_insn_r->regcache;
11698 uint32_t record_buf[8], record_buf_mem[8];
11699
11700 uint32_t reg_src1 = 0, reg_src2 = 0;
11701 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11702
11703 ULONGEST u_regval[2] = {0};
11704
11705 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11706
11707 if (bit (thumb_insn_r->arm_insn, 12))
11708 {
11709 /* Handle load/store register offset. */
11710 uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
11711
11712 if (opB >= 4 && opB <= 7)
11713 {
11714 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11715 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11716 record_buf[0] = reg_src1;
11717 thumb_insn_r->reg_rec_count = 1;
11718 }
11719 else if (opB >= 0 && opB <= 2)
11720 {
11721 /* STR(2), STRB(2), STRH(2) . */
11722 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11723 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11724 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11725 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11726 if (0 == opB)
11727 record_buf_mem[0] = 4; /* STR (2). */
11728 else if (2 == opB)
11729 record_buf_mem[0] = 1; /* STRB (2). */
11730 else if (1 == opB)
11731 record_buf_mem[0] = 2; /* STRH (2). */
11732 record_buf_mem[1] = u_regval[0] + u_regval[1];
11733 thumb_insn_r->mem_rec_count = 1;
11734 }
11735 }
11736 else if (bit (thumb_insn_r->arm_insn, 11))
11737 {
11738 /* Handle load from literal pool. */
11739 /* LDR(3). */
11740 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11741 record_buf[0] = reg_src1;
11742 thumb_insn_r->reg_rec_count = 1;
11743 }
11744 else if (opcode1)
11745 {
11746 /* Special data instructions and branch and exchange */
11747 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11748 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11749 if ((3 == opcode2) && (!opcode3))
11750 {
11751 /* Branch with exchange. */
11752 record_buf[0] = ARM_PS_REGNUM;
11753 thumb_insn_r->reg_rec_count = 1;
11754 }
11755 else
11756 {
11757 /* Format 8; special data processing insns. */
11758 record_buf[0] = ARM_PS_REGNUM;
11759 record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
11760 | bits (thumb_insn_r->arm_insn, 0, 2));
11761 thumb_insn_r->reg_rec_count = 2;
11762 }
11763 }
11764 else
11765 {
11766 /* Format 5; data processing insns. */
11767 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11768 if (bit (thumb_insn_r->arm_insn, 7))
11769 {
11770 reg_src1 = reg_src1 + 8;
11771 }
11772 record_buf[0] = ARM_PS_REGNUM;
11773 record_buf[1] = reg_src1;
11774 thumb_insn_r->reg_rec_count = 2;
11775 }
11776
11777 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11778 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11779 record_buf_mem);
11780
11781 return 0;
11782 }
11783
11784 /* Handling opcode 001 insns. */
11785
11786 static int
11787 thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11788 {
11789 struct regcache *reg_cache = thumb_insn_r->regcache;
11790 uint32_t record_buf[8], record_buf_mem[8];
11791
11792 uint32_t reg_src1 = 0;
11793 uint32_t opcode = 0, immed_5 = 0;
11794
11795 ULONGEST u_regval = 0;
11796
11797 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11798
11799 if (opcode)
11800 {
11801 /* LDR(1). */
11802 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11803 record_buf[0] = reg_src1;
11804 thumb_insn_r->reg_rec_count = 1;
11805 }
11806 else
11807 {
11808 /* STR(1). */
11809 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11810 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11811 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11812 record_buf_mem[0] = 4;
11813 record_buf_mem[1] = u_regval + (immed_5 * 4);
11814 thumb_insn_r->mem_rec_count = 1;
11815 }
11816
11817 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11818 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11819 record_buf_mem);
11820
11821 return 0;
11822 }
11823
11824 /* Handling opcode 100 insns. */
11825
11826 static int
11827 thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11828 {
11829 struct regcache *reg_cache = thumb_insn_r->regcache;
11830 uint32_t record_buf[8], record_buf_mem[8];
11831
11832 uint32_t reg_src1 = 0;
11833 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11834
11835 ULONGEST u_regval = 0;
11836
11837 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11838
11839 if (3 == opcode)
11840 {
11841 /* LDR(4). */
11842 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11843 record_buf[0] = reg_src1;
11844 thumb_insn_r->reg_rec_count = 1;
11845 }
11846 else if (1 == opcode)
11847 {
11848 /* LDRH(1). */
11849 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11850 record_buf[0] = reg_src1;
11851 thumb_insn_r->reg_rec_count = 1;
11852 }
11853 else if (2 == opcode)
11854 {
11855 /* STR(3). */
11856 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11857 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11858 record_buf_mem[0] = 4;
11859 record_buf_mem[1] = u_regval + (immed_8 * 4);
11860 thumb_insn_r->mem_rec_count = 1;
11861 }
11862 else if (0 == opcode)
11863 {
11864 /* STRH(1). */
11865 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11866 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11867 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11868 record_buf_mem[0] = 2;
11869 record_buf_mem[1] = u_regval + (immed_5 * 2);
11870 thumb_insn_r->mem_rec_count = 1;
11871 }
11872
11873 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11874 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11875 record_buf_mem);
11876
11877 return 0;
11878 }
11879
11880 /* Handling opcode 101 insns. */
11881
11882 static int
11883 thumb_record_misc (insn_decode_record *thumb_insn_r)
11884 {
11885 struct regcache *reg_cache = thumb_insn_r->regcache;
11886
11887 uint32_t opcode = 0;
11888 uint32_t register_bits = 0, register_count = 0;
11889 uint32_t index = 0, start_address = 0;
11890 uint32_t record_buf[24], record_buf_mem[48];
11891 uint32_t reg_src1;
11892
11893 ULONGEST u_regval = 0;
11894
11895 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11896
11897 if (opcode == 0 || opcode == 1)
11898 {
11899 /* ADR and ADD (SP plus immediate) */
11900
11901 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11902 record_buf[0] = reg_src1;
11903 thumb_insn_r->reg_rec_count = 1;
11904 }
11905 else
11906 {
11907 /* Miscellaneous 16-bit instructions */
11908 uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
11909
11910 switch (opcode2)
11911 {
11912 case 6:
11913 /* SETEND and CPS */
11914 break;
11915 case 0:
11916 /* ADD/SUB (SP plus immediate) */
11917 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11918 record_buf[0] = ARM_SP_REGNUM;
11919 thumb_insn_r->reg_rec_count = 1;
11920 break;
11921 case 1: /* fall through */
11922 case 3: /* fall through */
11923 case 9: /* fall through */
11924 case 11:
11925 /* CBNZ, CBZ */
11926 break;
11927 case 2:
11928 /* SXTH, SXTB, UXTH, UXTB */
11929 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
11930 thumb_insn_r->reg_rec_count = 1;
11931 break;
11932 case 4: /* fall through */
11933 case 5:
11934 /* PUSH. */
11935 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11936 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11937 while (register_bits)
11938 {
11939 if (register_bits & 0x00000001)
11940 register_count++;
11941 register_bits = register_bits >> 1;
11942 }
11943 start_address = u_regval - \
11944 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11945 thumb_insn_r->mem_rec_count = register_count;
11946 while (register_count)
11947 {
11948 record_buf_mem[(register_count * 2) - 1] = start_address;
11949 record_buf_mem[(register_count * 2) - 2] = 4;
11950 start_address = start_address + 4;
11951 register_count--;
11952 }
11953 record_buf[0] = ARM_SP_REGNUM;
11954 thumb_insn_r->reg_rec_count = 1;
11955 break;
11956 case 10:
11957 /* REV, REV16, REVSH */
11958 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
11959 thumb_insn_r->reg_rec_count = 1;
11960 break;
11961 case 12: /* fall through */
11962 case 13:
11963 /* POP. */
11964 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11965 while (register_bits)
11966 {
11967 if (register_bits & 0x00000001)
11968 record_buf[index++] = register_count;
11969 register_bits = register_bits >> 1;
11970 register_count++;
11971 }
11972 record_buf[index++] = ARM_PS_REGNUM;
11973 record_buf[index++] = ARM_SP_REGNUM;
11974 thumb_insn_r->reg_rec_count = index;
11975 break;
11976 case 0xe:
11977 /* BKPT insn. */
11978 /* Handle enhanced software breakpoint insn, BKPT. */
11979 /* CPSR is changed to be executed in ARM state, disabling normal
11980 interrupts, entering abort mode. */
11981 /* According to high vector configuration PC is set. */
11982 /* User hits breakpoint and type reverse, in that case, we need to go back with
11983 previous CPSR and Program Counter. */
11984 record_buf[0] = ARM_PS_REGNUM;
11985 record_buf[1] = ARM_LR_REGNUM;
11986 thumb_insn_r->reg_rec_count = 2;
11987 /* We need to save SPSR value, which is not yet done. */
11988 printf_unfiltered (_("Process record does not support instruction "
11989 "0x%0x at address %s.\n"),
11990 thumb_insn_r->arm_insn,
11991 paddress (thumb_insn_r->gdbarch,
11992 thumb_insn_r->this_addr));
11993 return -1;
11994
11995 case 0xf:
11996 /* If-Then, and hints */
11997 break;
11998 default:
11999 return -1;
12000 };
12001 }
12002
12003 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12004 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12005 record_buf_mem);
12006
12007 return 0;
12008 }
12009
12010 /* Handling opcode 110 insns. */
12011
12012 static int
12013 thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
12014 {
12015 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
12016 struct regcache *reg_cache = thumb_insn_r->regcache;
12017
12018 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
12019 uint32_t reg_src1 = 0;
12020 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
12021 uint32_t index = 0, start_address = 0;
12022 uint32_t record_buf[24], record_buf_mem[48];
12023
12024 ULONGEST u_regval = 0;
12025
12026 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12027 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
12028
12029 if (1 == opcode2)
12030 {
12031
12032 /* LDMIA. */
12033 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12034 /* Get Rn. */
12035 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12036 while (register_bits)
12037 {
12038 if (register_bits & 0x00000001)
12039 record_buf[index++] = register_count;
12040 register_bits = register_bits >> 1;
12041 register_count++;
12042 }
12043 record_buf[index++] = reg_src1;
12044 thumb_insn_r->reg_rec_count = index;
12045 }
12046 else if (0 == opcode2)
12047 {
12048 /* It handles both STMIA. */
12049 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12050 /* Get Rn. */
12051 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12052 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12053 while (register_bits)
12054 {
12055 if (register_bits & 0x00000001)
12056 register_count++;
12057 register_bits = register_bits >> 1;
12058 }
12059 start_address = u_regval;
12060 thumb_insn_r->mem_rec_count = register_count;
12061 while (register_count)
12062 {
12063 record_buf_mem[(register_count * 2) - 1] = start_address;
12064 record_buf_mem[(register_count * 2) - 2] = 4;
12065 start_address = start_address + 4;
12066 register_count--;
12067 }
12068 }
12069 else if (0x1F == opcode1)
12070 {
12071 /* Handle arm syscall insn. */
12072 if (tdep->arm_syscall_record != NULL)
12073 {
12074 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
12075 ret = tdep->arm_syscall_record (reg_cache, u_regval);
12076 }
12077 else
12078 {
12079 printf_unfiltered (_("no syscall record support\n"));
12080 return -1;
12081 }
12082 }
12083
12084 /* B (1), conditional branch is automatically taken care in process_record,
12085 as PC is saved there. */
12086
12087 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12088 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12089 record_buf_mem);
12090
12091 return ret;
12092 }
12093
12094 /* Handling opcode 111 insns. */
12095
12096 static int
12097 thumb_record_branch (insn_decode_record *thumb_insn_r)
12098 {
12099 uint32_t record_buf[8];
12100 uint32_t bits_h = 0;
12101
12102 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
12103
12104 if (2 == bits_h || 3 == bits_h)
12105 {
12106 /* BL */
12107 record_buf[0] = ARM_LR_REGNUM;
12108 thumb_insn_r->reg_rec_count = 1;
12109 }
12110 else if (1 == bits_h)
12111 {
12112 /* BLX(1). */
12113 record_buf[0] = ARM_PS_REGNUM;
12114 record_buf[1] = ARM_LR_REGNUM;
12115 thumb_insn_r->reg_rec_count = 2;
12116 }
12117
12118 /* B(2) is automatically taken care in process_record, as PC is
12119 saved there. */
12120
12121 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12122
12123 return 0;
12124 }
12125
12126 /* Handler for thumb2 load/store multiple instructions. */
12127
12128 static int
12129 thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
12130 {
12131 struct regcache *reg_cache = thumb2_insn_r->regcache;
12132
12133 uint32_t reg_rn, op;
12134 uint32_t register_bits = 0, register_count = 0;
12135 uint32_t index = 0, start_address = 0;
12136 uint32_t record_buf[24], record_buf_mem[48];
12137
12138 ULONGEST u_regval = 0;
12139
12140 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12141 op = bits (thumb2_insn_r->arm_insn, 23, 24);
12142
12143 if (0 == op || 3 == op)
12144 {
12145 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12146 {
12147 /* Handle RFE instruction. */
12148 record_buf[0] = ARM_PS_REGNUM;
12149 thumb2_insn_r->reg_rec_count = 1;
12150 }
12151 else
12152 {
12153 /* Handle SRS instruction after reading banked SP. */
12154 return arm_record_unsupported_insn (thumb2_insn_r);
12155 }
12156 }
12157 else if (1 == op || 2 == op)
12158 {
12159 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12160 {
12161 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
12162 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12163 while (register_bits)
12164 {
12165 if (register_bits & 0x00000001)
12166 record_buf[index++] = register_count;
12167
12168 register_count++;
12169 register_bits = register_bits >> 1;
12170 }
12171 record_buf[index++] = reg_rn;
12172 record_buf[index++] = ARM_PS_REGNUM;
12173 thumb2_insn_r->reg_rec_count = index;
12174 }
12175 else
12176 {
12177 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
12178 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12179 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12180 while (register_bits)
12181 {
12182 if (register_bits & 0x00000001)
12183 register_count++;
12184
12185 register_bits = register_bits >> 1;
12186 }
12187
12188 if (1 == op)
12189 {
12190 /* Start address calculation for LDMDB/LDMEA. */
12191 start_address = u_regval;
12192 }
12193 else if (2 == op)
12194 {
12195 /* Start address calculation for LDMDB/LDMEA. */
12196 start_address = u_regval - register_count * 4;
12197 }
12198
12199 thumb2_insn_r->mem_rec_count = register_count;
12200 while (register_count)
12201 {
12202 record_buf_mem[register_count * 2 - 1] = start_address;
12203 record_buf_mem[register_count * 2 - 2] = 4;
12204 start_address = start_address + 4;
12205 register_count--;
12206 }
12207 record_buf[0] = reg_rn;
12208 record_buf[1] = ARM_PS_REGNUM;
12209 thumb2_insn_r->reg_rec_count = 2;
12210 }
12211 }
12212
12213 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12214 record_buf_mem);
12215 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12216 record_buf);
12217 return ARM_RECORD_SUCCESS;
12218 }
12219
12220 /* Handler for thumb2 load/store (dual/exclusive) and table branch
12221 instructions. */
12222
12223 static int
12224 thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
12225 {
12226 struct regcache *reg_cache = thumb2_insn_r->regcache;
12227
12228 uint32_t reg_rd, reg_rn, offset_imm;
12229 uint32_t reg_dest1, reg_dest2;
12230 uint32_t address, offset_addr;
12231 uint32_t record_buf[8], record_buf_mem[8];
12232 uint32_t op1, op2, op3;
12233
12234 ULONGEST u_regval[2];
12235
12236 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
12237 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
12238 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
12239
12240 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12241 {
12242 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12243 {
12244 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
12245 record_buf[0] = reg_dest1;
12246 record_buf[1] = ARM_PS_REGNUM;
12247 thumb2_insn_r->reg_rec_count = 2;
12248 }
12249
12250 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12251 {
12252 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12253 record_buf[2] = reg_dest2;
12254 thumb2_insn_r->reg_rec_count = 3;
12255 }
12256 }
12257 else
12258 {
12259 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12260 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12261
12262 if (0 == op1 && 0 == op2)
12263 {
12264 /* Handle STREX. */
12265 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12266 address = u_regval[0] + (offset_imm * 4);
12267 record_buf_mem[0] = 4;
12268 record_buf_mem[1] = address;
12269 thumb2_insn_r->mem_rec_count = 1;
12270 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12271 record_buf[0] = reg_rd;
12272 thumb2_insn_r->reg_rec_count = 1;
12273 }
12274 else if (1 == op1 && 0 == op2)
12275 {
12276 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12277 record_buf[0] = reg_rd;
12278 thumb2_insn_r->reg_rec_count = 1;
12279 address = u_regval[0];
12280 record_buf_mem[1] = address;
12281
12282 if (4 == op3)
12283 {
12284 /* Handle STREXB. */
12285 record_buf_mem[0] = 1;
12286 thumb2_insn_r->mem_rec_count = 1;
12287 }
12288 else if (5 == op3)
12289 {
12290 /* Handle STREXH. */
12291 record_buf_mem[0] = 2 ;
12292 thumb2_insn_r->mem_rec_count = 1;
12293 }
12294 else if (7 == op3)
12295 {
12296 /* Handle STREXD. */
12297 address = u_regval[0];
12298 record_buf_mem[0] = 4;
12299 record_buf_mem[2] = 4;
12300 record_buf_mem[3] = address + 4;
12301 thumb2_insn_r->mem_rec_count = 2;
12302 }
12303 }
12304 else
12305 {
12306 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12307
12308 if (bit (thumb2_insn_r->arm_insn, 24))
12309 {
12310 if (bit (thumb2_insn_r->arm_insn, 23))
12311 offset_addr = u_regval[0] + (offset_imm * 4);
12312 else
12313 offset_addr = u_regval[0] - (offset_imm * 4);
12314
12315 address = offset_addr;
12316 }
12317 else
12318 address = u_regval[0];
12319
12320 record_buf_mem[0] = 4;
12321 record_buf_mem[1] = address;
12322 record_buf_mem[2] = 4;
12323 record_buf_mem[3] = address + 4;
12324 thumb2_insn_r->mem_rec_count = 2;
12325 record_buf[0] = reg_rn;
12326 thumb2_insn_r->reg_rec_count = 1;
12327 }
12328 }
12329
12330 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12331 record_buf);
12332 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12333 record_buf_mem);
12334 return ARM_RECORD_SUCCESS;
12335 }
12336
12337 /* Handler for thumb2 data processing (shift register and modified immediate)
12338 instructions. */
12339
12340 static int
12341 thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12342 {
12343 uint32_t reg_rd, op;
12344 uint32_t record_buf[8];
12345
12346 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12347 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12348
12349 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12350 {
12351 record_buf[0] = ARM_PS_REGNUM;
12352 thumb2_insn_r->reg_rec_count = 1;
12353 }
12354 else
12355 {
12356 record_buf[0] = reg_rd;
12357 record_buf[1] = ARM_PS_REGNUM;
12358 thumb2_insn_r->reg_rec_count = 2;
12359 }
12360
12361 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12362 record_buf);
12363 return ARM_RECORD_SUCCESS;
12364 }
12365
12366 /* Generic handler for thumb2 instructions which effect destination and PS
12367 registers. */
12368
12369 static int
12370 thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12371 {
12372 uint32_t reg_rd;
12373 uint32_t record_buf[8];
12374
12375 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12376
12377 record_buf[0] = reg_rd;
12378 record_buf[1] = ARM_PS_REGNUM;
12379 thumb2_insn_r->reg_rec_count = 2;
12380
12381 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12382 record_buf);
12383 return ARM_RECORD_SUCCESS;
12384 }
12385
12386 /* Handler for thumb2 branch and miscellaneous control instructions. */
12387
12388 static int
12389 thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12390 {
12391 uint32_t op, op1, op2;
12392 uint32_t record_buf[8];
12393
12394 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12395 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12396 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12397
12398 /* Handle MSR insn. */
12399 if (!(op1 & 0x2) && 0x38 == op)
12400 {
12401 if (!(op2 & 0x3))
12402 {
12403 /* CPSR is going to be changed. */
12404 record_buf[0] = ARM_PS_REGNUM;
12405 thumb2_insn_r->reg_rec_count = 1;
12406 }
12407 else
12408 {
12409 arm_record_unsupported_insn(thumb2_insn_r);
12410 return -1;
12411 }
12412 }
12413 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12414 {
12415 /* BLX. */
12416 record_buf[0] = ARM_PS_REGNUM;
12417 record_buf[1] = ARM_LR_REGNUM;
12418 thumb2_insn_r->reg_rec_count = 2;
12419 }
12420
12421 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12422 record_buf);
12423 return ARM_RECORD_SUCCESS;
12424 }
12425
12426 /* Handler for thumb2 store single data item instructions. */
12427
12428 static int
12429 thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12430 {
12431 struct regcache *reg_cache = thumb2_insn_r->regcache;
12432
12433 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12434 uint32_t address, offset_addr;
12435 uint32_t record_buf[8], record_buf_mem[8];
12436 uint32_t op1, op2;
12437
12438 ULONGEST u_regval[2];
12439
12440 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12441 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12442 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12443 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12444
12445 if (bit (thumb2_insn_r->arm_insn, 23))
12446 {
12447 /* T2 encoding. */
12448 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12449 offset_addr = u_regval[0] + offset_imm;
12450 address = offset_addr;
12451 }
12452 else
12453 {
12454 /* T3 encoding. */
12455 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12456 {
12457 /* Handle STRB (register). */
12458 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12459 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12460 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12461 offset_addr = u_regval[1] << shift_imm;
12462 address = u_regval[0] + offset_addr;
12463 }
12464 else
12465 {
12466 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12467 if (bit (thumb2_insn_r->arm_insn, 10))
12468 {
12469 if (bit (thumb2_insn_r->arm_insn, 9))
12470 offset_addr = u_regval[0] + offset_imm;
12471 else
12472 offset_addr = u_regval[0] - offset_imm;
12473
12474 address = offset_addr;
12475 }
12476 else
12477 address = u_regval[0];
12478 }
12479 }
12480
12481 switch (op1)
12482 {
12483 /* Store byte instructions. */
12484 case 4:
12485 case 0:
12486 record_buf_mem[0] = 1;
12487 break;
12488 /* Store half word instructions. */
12489 case 1:
12490 case 5:
12491 record_buf_mem[0] = 2;
12492 break;
12493 /* Store word instructions. */
12494 case 2:
12495 case 6:
12496 record_buf_mem[0] = 4;
12497 break;
12498
12499 default:
12500 gdb_assert_not_reached ("no decoding pattern found");
12501 break;
12502 }
12503
12504 record_buf_mem[1] = address;
12505 thumb2_insn_r->mem_rec_count = 1;
12506 record_buf[0] = reg_rn;
12507 thumb2_insn_r->reg_rec_count = 1;
12508
12509 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12510 record_buf);
12511 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12512 record_buf_mem);
12513 return ARM_RECORD_SUCCESS;
12514 }
12515
12516 /* Handler for thumb2 load memory hints instructions. */
12517
12518 static int
12519 thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12520 {
12521 uint32_t record_buf[8];
12522 uint32_t reg_rt, reg_rn;
12523
12524 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12525 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12526
12527 if (ARM_PC_REGNUM != reg_rt)
12528 {
12529 record_buf[0] = reg_rt;
12530 record_buf[1] = reg_rn;
12531 record_buf[2] = ARM_PS_REGNUM;
12532 thumb2_insn_r->reg_rec_count = 3;
12533
12534 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12535 record_buf);
12536 return ARM_RECORD_SUCCESS;
12537 }
12538
12539 return ARM_RECORD_FAILURE;
12540 }
12541
12542 /* Handler for thumb2 load word instructions. */
12543
12544 static int
12545 thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12546 {
12547 uint32_t record_buf[8];
12548
12549 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12550 record_buf[1] = ARM_PS_REGNUM;
12551 thumb2_insn_r->reg_rec_count = 2;
12552
12553 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12554 record_buf);
12555 return ARM_RECORD_SUCCESS;
12556 }
12557
12558 /* Handler for thumb2 long multiply, long multiply accumulate, and
12559 divide instructions. */
12560
12561 static int
12562 thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12563 {
12564 uint32_t opcode1 = 0, opcode2 = 0;
12565 uint32_t record_buf[8];
12566
12567 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12568 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12569
12570 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12571 {
12572 /* Handle SMULL, UMULL, SMULAL. */
12573 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12574 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12575 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12576 record_buf[2] = ARM_PS_REGNUM;
12577 thumb2_insn_r->reg_rec_count = 3;
12578 }
12579 else if (1 == opcode1 || 3 == opcode2)
12580 {
12581 /* Handle SDIV and UDIV. */
12582 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12583 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12584 record_buf[2] = ARM_PS_REGNUM;
12585 thumb2_insn_r->reg_rec_count = 3;
12586 }
12587 else
12588 return ARM_RECORD_FAILURE;
12589
12590 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12591 record_buf);
12592 return ARM_RECORD_SUCCESS;
12593 }
12594
12595 /* Record handler for thumb32 coprocessor instructions. */
12596
12597 static int
12598 thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12599 {
12600 if (bit (thumb2_insn_r->arm_insn, 25))
12601 return arm_record_coproc_data_proc (thumb2_insn_r);
12602 else
12603 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12604 }
12605
12606 /* Record handler for advance SIMD structure load/store instructions. */
12607
12608 static int
12609 thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12610 {
12611 struct regcache *reg_cache = thumb2_insn_r->regcache;
12612 uint32_t l_bit, a_bit, b_bits;
12613 uint32_t record_buf[128], record_buf_mem[128];
12614 uint32_t reg_rn, reg_vd, address, f_elem;
12615 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12616 uint8_t f_ebytes;
12617
12618 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12619 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12620 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12621 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12622 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12623 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12624 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
12625 f_elem = 8 / f_ebytes;
12626
12627 if (!l_bit)
12628 {
12629 ULONGEST u_regval = 0;
12630 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12631 address = u_regval;
12632
12633 if (!a_bit)
12634 {
12635 /* Handle VST1. */
12636 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12637 {
12638 if (b_bits == 0x07)
12639 bf_regs = 1;
12640 else if (b_bits == 0x0a)
12641 bf_regs = 2;
12642 else if (b_bits == 0x06)
12643 bf_regs = 3;
12644 else if (b_bits == 0x02)
12645 bf_regs = 4;
12646 else
12647 bf_regs = 0;
12648
12649 for (index_r = 0; index_r < bf_regs; index_r++)
12650 {
12651 for (index_e = 0; index_e < f_elem; index_e++)
12652 {
12653 record_buf_mem[index_m++] = f_ebytes;
12654 record_buf_mem[index_m++] = address;
12655 address = address + f_ebytes;
12656 thumb2_insn_r->mem_rec_count += 1;
12657 }
12658 }
12659 }
12660 /* Handle VST2. */
12661 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12662 {
12663 if (b_bits == 0x09 || b_bits == 0x08)
12664 bf_regs = 1;
12665 else if (b_bits == 0x03)
12666 bf_regs = 2;
12667 else
12668 bf_regs = 0;
12669
12670 for (index_r = 0; index_r < bf_regs; index_r++)
12671 for (index_e = 0; index_e < f_elem; index_e++)
12672 {
12673 for (loop_t = 0; loop_t < 2; loop_t++)
12674 {
12675 record_buf_mem[index_m++] = f_ebytes;
12676 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12677 thumb2_insn_r->mem_rec_count += 1;
12678 }
12679 address = address + (2 * f_ebytes);
12680 }
12681 }
12682 /* Handle VST3. */
12683 else if ((b_bits & 0x0e) == 0x04)
12684 {
12685 for (index_e = 0; index_e < f_elem; index_e++)
12686 {
12687 for (loop_t = 0; loop_t < 3; loop_t++)
12688 {
12689 record_buf_mem[index_m++] = f_ebytes;
12690 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12691 thumb2_insn_r->mem_rec_count += 1;
12692 }
12693 address = address + (3 * f_ebytes);
12694 }
12695 }
12696 /* Handle VST4. */
12697 else if (!(b_bits & 0x0e))
12698 {
12699 for (index_e = 0; index_e < f_elem; index_e++)
12700 {
12701 for (loop_t = 0; loop_t < 4; loop_t++)
12702 {
12703 record_buf_mem[index_m++] = f_ebytes;
12704 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12705 thumb2_insn_r->mem_rec_count += 1;
12706 }
12707 address = address + (4 * f_ebytes);
12708 }
12709 }
12710 }
12711 else
12712 {
12713 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12714
12715 if (bft_size == 0x00)
12716 f_ebytes = 1;
12717 else if (bft_size == 0x01)
12718 f_ebytes = 2;
12719 else if (bft_size == 0x02)
12720 f_ebytes = 4;
12721 else
12722 f_ebytes = 0;
12723
12724 /* Handle VST1. */
12725 if (!(b_bits & 0x0b) || b_bits == 0x08)
12726 thumb2_insn_r->mem_rec_count = 1;
12727 /* Handle VST2. */
12728 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12729 thumb2_insn_r->mem_rec_count = 2;
12730 /* Handle VST3. */
12731 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12732 thumb2_insn_r->mem_rec_count = 3;
12733 /* Handle VST4. */
12734 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12735 thumb2_insn_r->mem_rec_count = 4;
12736
12737 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12738 {
12739 record_buf_mem[index_m] = f_ebytes;
12740 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12741 }
12742 }
12743 }
12744 else
12745 {
12746 if (!a_bit)
12747 {
12748 /* Handle VLD1. */
12749 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12750 thumb2_insn_r->reg_rec_count = 1;
12751 /* Handle VLD2. */
12752 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12753 thumb2_insn_r->reg_rec_count = 2;
12754 /* Handle VLD3. */
12755 else if ((b_bits & 0x0e) == 0x04)
12756 thumb2_insn_r->reg_rec_count = 3;
12757 /* Handle VLD4. */
12758 else if (!(b_bits & 0x0e))
12759 thumb2_insn_r->reg_rec_count = 4;
12760 }
12761 else
12762 {
12763 /* Handle VLD1. */
12764 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12765 thumb2_insn_r->reg_rec_count = 1;
12766 /* Handle VLD2. */
12767 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12768 thumb2_insn_r->reg_rec_count = 2;
12769 /* Handle VLD3. */
12770 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12771 thumb2_insn_r->reg_rec_count = 3;
12772 /* Handle VLD4. */
12773 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12774 thumb2_insn_r->reg_rec_count = 4;
12775
12776 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12777 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12778 }
12779 }
12780
12781 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12782 {
12783 record_buf[index_r] = reg_rn;
12784 thumb2_insn_r->reg_rec_count += 1;
12785 }
12786
12787 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12788 record_buf);
12789 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12790 record_buf_mem);
12791 return 0;
12792 }
12793
12794 /* Decodes thumb2 instruction type and invokes its record handler. */
12795
12796 static unsigned int
12797 thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12798 {
12799 uint32_t op, op1, op2;
12800
12801 op = bit (thumb2_insn_r->arm_insn, 15);
12802 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12803 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12804
12805 if (op1 == 0x01)
12806 {
12807 if (!(op2 & 0x64 ))
12808 {
12809 /* Load/store multiple instruction. */
12810 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12811 }
12812 else if ((op2 & 0x64) == 0x4)
12813 {
12814 /* Load/store (dual/exclusive) and table branch instruction. */
12815 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12816 }
12817 else if ((op2 & 0x60) == 0x20)
12818 {
12819 /* Data-processing (shifted register). */
12820 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12821 }
12822 else if (op2 & 0x40)
12823 {
12824 /* Co-processor instructions. */
12825 return thumb2_record_coproc_insn (thumb2_insn_r);
12826 }
12827 }
12828 else if (op1 == 0x02)
12829 {
12830 if (op)
12831 {
12832 /* Branches and miscellaneous control instructions. */
12833 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12834 }
12835 else if (op2 & 0x20)
12836 {
12837 /* Data-processing (plain binary immediate) instruction. */
12838 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12839 }
12840 else
12841 {
12842 /* Data-processing (modified immediate). */
12843 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12844 }
12845 }
12846 else if (op1 == 0x03)
12847 {
12848 if (!(op2 & 0x71 ))
12849 {
12850 /* Store single data item. */
12851 return thumb2_record_str_single_data (thumb2_insn_r);
12852 }
12853 else if (!((op2 & 0x71) ^ 0x10))
12854 {
12855 /* Advanced SIMD or structure load/store instructions. */
12856 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
12857 }
12858 else if (!((op2 & 0x67) ^ 0x01))
12859 {
12860 /* Load byte, memory hints instruction. */
12861 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12862 }
12863 else if (!((op2 & 0x67) ^ 0x03))
12864 {
12865 /* Load halfword, memory hints instruction. */
12866 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12867 }
12868 else if (!((op2 & 0x67) ^ 0x05))
12869 {
12870 /* Load word instruction. */
12871 return thumb2_record_ld_word (thumb2_insn_r);
12872 }
12873 else if (!((op2 & 0x70) ^ 0x20))
12874 {
12875 /* Data-processing (register) instruction. */
12876 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12877 }
12878 else if (!((op2 & 0x78) ^ 0x30))
12879 {
12880 /* Multiply, multiply accumulate, abs diff instruction. */
12881 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12882 }
12883 else if (!((op2 & 0x78) ^ 0x38))
12884 {
12885 /* Long multiply, long multiply accumulate, and divide. */
12886 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12887 }
12888 else if (op2 & 0x40)
12889 {
12890 /* Co-processor instructions. */
12891 return thumb2_record_coproc_insn (thumb2_insn_r);
12892 }
12893 }
12894
12895 return -1;
12896 }
12897
12898 namespace {
12899 /* Abstract memory reader. */
12900
12901 class abstract_memory_reader
12902 {
12903 public:
12904 /* Read LEN bytes of target memory at address MEMADDR, placing the
12905 results in GDB's memory at BUF. Return true on success. */
12906
12907 virtual bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) = 0;
12908 };
12909
12910 /* Instruction reader from real target. */
12911
12912 class instruction_reader : public abstract_memory_reader
12913 {
12914 public:
12915 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len)
12916 {
12917 if (target_read_memory (memaddr, buf, len))
12918 return false;
12919 else
12920 return true;
12921 }
12922 };
12923
12924 } // namespace
12925
12926 /* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12927 and positive val on fauilure. */
12928
12929 static int
12930 extract_arm_insn (abstract_memory_reader& reader,
12931 insn_decode_record *insn_record, uint32_t insn_size)
12932 {
12933 gdb_byte buf[insn_size];
12934
12935 memset (&buf[0], 0, insn_size);
12936
12937 if (!reader.read (insn_record->this_addr, buf, insn_size))
12938 return 1;
12939 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12940 insn_size,
12941 gdbarch_byte_order_for_code (insn_record->gdbarch));
12942 return 0;
12943 }
12944
12945 typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12946
12947 /* Decode arm/thumb insn depending on condition cods and opcodes; and
12948 dispatch it. */
12949
12950 static int
12951 decode_insn (abstract_memory_reader &reader, insn_decode_record *arm_record,
12952 record_type_t record_type, uint32_t insn_size)
12953 {
12954
12955 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
12956 instruction. */
12957 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
12958 {
12959 arm_record_data_proc_misc_ld_str, /* 000. */
12960 arm_record_data_proc_imm, /* 001. */
12961 arm_record_ld_st_imm_offset, /* 010. */
12962 arm_record_ld_st_reg_offset, /* 011. */
12963 arm_record_ld_st_multiple, /* 100. */
12964 arm_record_b_bl, /* 101. */
12965 arm_record_asimd_vfp_coproc, /* 110. */
12966 arm_record_coproc_data_proc /* 111. */
12967 };
12968
12969 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
12970 instruction. */
12971 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
12972 { \
12973 thumb_record_shift_add_sub, /* 000. */
12974 thumb_record_add_sub_cmp_mov, /* 001. */
12975 thumb_record_ld_st_reg_offset, /* 010. */
12976 thumb_record_ld_st_imm_offset, /* 011. */
12977 thumb_record_ld_st_stack, /* 100. */
12978 thumb_record_misc, /* 101. */
12979 thumb_record_ldm_stm_swi, /* 110. */
12980 thumb_record_branch /* 111. */
12981 };
12982
12983 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12984 uint32_t insn_id = 0;
12985
12986 if (extract_arm_insn (reader, arm_record, insn_size))
12987 {
12988 if (record_debug)
12989 {
12990 printf_unfiltered (_("Process record: error reading memory at "
12991 "addr %s len = %d.\n"),
12992 paddress (arm_record->gdbarch,
12993 arm_record->this_addr), insn_size);
12994 }
12995 return -1;
12996 }
12997 else if (ARM_RECORD == record_type)
12998 {
12999 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
13000 insn_id = bits (arm_record->arm_insn, 25, 27);
13001
13002 if (arm_record->cond == 0xf)
13003 ret = arm_record_extension_space (arm_record);
13004 else
13005 {
13006 /* If this insn has fallen into extension space
13007 then we need not decode it anymore. */
13008 ret = arm_handle_insn[insn_id] (arm_record);
13009 }
13010 if (ret != ARM_RECORD_SUCCESS)
13011 {
13012 arm_record_unsupported_insn (arm_record);
13013 ret = -1;
13014 }
13015 }
13016 else if (THUMB_RECORD == record_type)
13017 {
13018 /* As thumb does not have condition codes, we set negative. */
13019 arm_record->cond = -1;
13020 insn_id = bits (arm_record->arm_insn, 13, 15);
13021 ret = thumb_handle_insn[insn_id] (arm_record);
13022 if (ret != ARM_RECORD_SUCCESS)
13023 {
13024 arm_record_unsupported_insn (arm_record);
13025 ret = -1;
13026 }
13027 }
13028 else if (THUMB2_RECORD == record_type)
13029 {
13030 /* As thumb does not have condition codes, we set negative. */
13031 arm_record->cond = -1;
13032
13033 /* Swap first half of 32bit thumb instruction with second half. */
13034 arm_record->arm_insn
13035 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
13036
13037 ret = thumb2_record_decode_insn_handler (arm_record);
13038
13039 if (ret != ARM_RECORD_SUCCESS)
13040 {
13041 arm_record_unsupported_insn (arm_record);
13042 ret = -1;
13043 }
13044 }
13045 else
13046 {
13047 /* Throw assertion. */
13048 gdb_assert_not_reached ("not a valid instruction, could not decode");
13049 }
13050
13051 return ret;
13052 }
13053
13054 #if GDB_SELF_TEST
13055 namespace selftests {
13056
13057 /* Provide both 16-bit and 32-bit thumb instructions. */
13058
13059 class instruction_reader_thumb : public abstract_memory_reader
13060 {
13061 public:
13062 template<size_t SIZE>
13063 instruction_reader_thumb (enum bfd_endian endian,
13064 const uint16_t (&insns)[SIZE])
13065 : m_endian (endian), m_insns (insns), m_insns_size (SIZE)
13066 {}
13067
13068 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len)
13069 {
13070 SELF_CHECK (len == 4 || len == 2);
13071 SELF_CHECK (memaddr % 2 == 0);
13072 SELF_CHECK ((memaddr / 2) < m_insns_size);
13073
13074 store_unsigned_integer (buf, 2, m_endian, m_insns[memaddr / 2]);
13075 if (len == 4)
13076 {
13077 store_unsigned_integer (&buf[2], 2, m_endian,
13078 m_insns[memaddr / 2 + 1]);
13079 }
13080 return true;
13081 }
13082
13083 private:
13084 enum bfd_endian m_endian;
13085 const uint16_t *m_insns;
13086 size_t m_insns_size;
13087 };
13088
13089 static void
13090 arm_record_test (void)
13091 {
13092 struct gdbarch_info info;
13093 gdbarch_info_init (&info);
13094 info.bfd_arch_info = bfd_scan_arch ("arm");
13095
13096 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
13097
13098 SELF_CHECK (gdbarch != NULL);
13099
13100 /* 16-bit Thumb instructions. */
13101 {
13102 insn_decode_record arm_record;
13103
13104 memset (&arm_record, 0, sizeof (insn_decode_record));
13105 arm_record.gdbarch = gdbarch;
13106
13107 static const uint16_t insns[] = {
13108 /* db b2 uxtb r3, r3 */
13109 0xb2db,
13110 /* cd 58 ldr r5, [r1, r3] */
13111 0x58cd,
13112 };
13113
13114 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13115 instruction_reader_thumb reader (endian, insns);
13116 int ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13117 THUMB_INSN_SIZE_BYTES);
13118
13119 SELF_CHECK (ret == 0);
13120 SELF_CHECK (arm_record.mem_rec_count == 0);
13121 SELF_CHECK (arm_record.reg_rec_count == 1);
13122 SELF_CHECK (arm_record.arm_regs[0] == 3);
13123
13124 arm_record.this_addr += 2;
13125 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13126 THUMB_INSN_SIZE_BYTES);
13127
13128 SELF_CHECK (ret == 0);
13129 SELF_CHECK (arm_record.mem_rec_count == 0);
13130 SELF_CHECK (arm_record.reg_rec_count == 1);
13131 SELF_CHECK (arm_record.arm_regs[0] == 5);
13132 }
13133
13134 /* 32-bit Thumb-2 instructions. */
13135 {
13136 insn_decode_record arm_record;
13137
13138 memset (&arm_record, 0, sizeof (insn_decode_record));
13139 arm_record.gdbarch = gdbarch;
13140
13141 static const uint16_t insns[] = {
13142 /* 1d ee 70 7f mrc 15, 0, r7, cr13, cr0, {3} */
13143 0xee1d, 0x7f70,
13144 };
13145
13146 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13147 instruction_reader_thumb reader (endian, insns);
13148 int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
13149 THUMB2_INSN_SIZE_BYTES);
13150
13151 SELF_CHECK (ret == 0);
13152 SELF_CHECK (arm_record.mem_rec_count == 0);
13153 SELF_CHECK (arm_record.reg_rec_count == 1);
13154 SELF_CHECK (arm_record.arm_regs[0] == 7);
13155 }
13156 }
13157 } // namespace selftests
13158 #endif /* GDB_SELF_TEST */
13159
13160 /* Cleans up local record registers and memory allocations. */
13161
13162 static void
13163 deallocate_reg_mem (insn_decode_record *record)
13164 {
13165 xfree (record->arm_regs);
13166 xfree (record->arm_mems);
13167 }
13168
13169
13170 /* Parse the current instruction and record the values of the registers and
13171 memory that will be changed in current instruction to record_arch_list".
13172 Return -1 if something is wrong. */
13173
13174 int
13175 arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
13176 CORE_ADDR insn_addr)
13177 {
13178
13179 uint32_t no_of_rec = 0;
13180 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
13181 ULONGEST t_bit = 0, insn_id = 0;
13182
13183 ULONGEST u_regval = 0;
13184
13185 insn_decode_record arm_record;
13186
13187 memset (&arm_record, 0, sizeof (insn_decode_record));
13188 arm_record.regcache = regcache;
13189 arm_record.this_addr = insn_addr;
13190 arm_record.gdbarch = gdbarch;
13191
13192
13193 if (record_debug > 1)
13194 {
13195 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
13196 "addr = %s\n",
13197 paddress (gdbarch, arm_record.this_addr));
13198 }
13199
13200 instruction_reader reader;
13201 if (extract_arm_insn (reader, &arm_record, 2))
13202 {
13203 if (record_debug)
13204 {
13205 printf_unfiltered (_("Process record: error reading memory at "
13206 "addr %s len = %d.\n"),
13207 paddress (arm_record.gdbarch,
13208 arm_record.this_addr), 2);
13209 }
13210 return -1;
13211 }
13212
13213 /* Check the insn, whether it is thumb or arm one. */
13214
13215 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
13216 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
13217
13218
13219 if (!(u_regval & t_bit))
13220 {
13221 /* We are decoding arm insn. */
13222 ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
13223 }
13224 else
13225 {
13226 insn_id = bits (arm_record.arm_insn, 11, 15);
13227 /* is it thumb2 insn? */
13228 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
13229 {
13230 ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
13231 THUMB2_INSN_SIZE_BYTES);
13232 }
13233 else
13234 {
13235 /* We are decoding thumb insn. */
13236 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13237 THUMB_INSN_SIZE_BYTES);
13238 }
13239 }
13240
13241 if (0 == ret)
13242 {
13243 /* Record registers. */
13244 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
13245 if (arm_record.arm_regs)
13246 {
13247 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
13248 {
13249 if (record_full_arch_list_add_reg
13250 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
13251 ret = -1;
13252 }
13253 }
13254 /* Record memories. */
13255 if (arm_record.arm_mems)
13256 {
13257 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
13258 {
13259 if (record_full_arch_list_add_mem
13260 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
13261 arm_record.arm_mems[no_of_rec].len))
13262 ret = -1;
13263 }
13264 }
13265
13266 if (record_full_arch_list_add_end ())
13267 ret = -1;
13268 }
13269
13270
13271 deallocate_reg_mem (&arm_record);
13272
13273 return ret;
13274 }
This page took 0.573814 seconds and 4 git commands to generate.