cpu,opcodes,gas: use %r0 and %r6 instead of %a and %ctf in eBPF disassembler
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
CommitLineData
ed9a39eb 1/* Common target dependent code for GDB on ARM systems.
0fd88904 2
42a4f53d 3 Copyright (C) 1988-2019 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
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.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 19
0baeab03
PA
20#include "defs.h"
21
4de283e4 22#include <ctype.h> /* XXX for isupper (). */
34e8f22d 23
4de283e4
TT
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 "target-float.h"
34#include "value.h"
d55e5aa6 35#include "arch-utils.h"
4de283e4
TT
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 "observable.h"
48
d55e5aa6 49#include "arch/arm.h"
4de283e4 50#include "arch/arm-get-next-pcs.h"
34e8f22d 51#include "arm-tdep.h"
4de283e4
TT
52#include "gdb/sim-arm.h"
53
d55e5aa6 54#include "elf-bfd.h"
4de283e4 55#include "coff/internal.h"
d55e5aa6 56#include "elf/arm.h"
4de283e4 57
268a13a5 58#include "gdbsupport/vec.h"
4de283e4
TT
59
60#include "record.h"
61#include "record-full.h"
62#include <algorithm>
63
64#include "features/arm/arm-with-m.c"
0a69eedb
YQ
65#include "features/arm/arm-with-m-fpa-layout.c"
66#include "features/arm/arm-with-m-vfp-d16.c"
4de283e4 67#include "features/arm/arm-with-iwmmxt.c"
0a69eedb
YQ
68#include "features/arm/arm-with-vfpv2.c"
69#include "features/arm/arm-with-vfpv3.c"
4de283e4 70#include "features/arm/arm-with-neon.c"
9779414d 71
b121eeb9 72#if GDB_SELF_TEST
268a13a5 73#include "gdbsupport/selftest.h"
b121eeb9
YQ
74#endif
75
6529d2dd
AC
76static int arm_debug;
77
082fc60d
RE
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
f594e5e9 80 is used for this purpose.
082fc60d
RE
81
82 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
f594e5e9 83 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
082fc60d 84
0963b4bd 85#define MSYMBOL_SET_SPECIAL(msym) \
b887350f 86 MSYMBOL_TARGET_FLAG_1 (msym) = 1
082fc60d
RE
87
88#define MSYMBOL_IS_SPECIAL(msym) \
b887350f 89 MSYMBOL_TARGET_FLAG_1 (msym)
082fc60d 90
60c5725c
DJ
91struct arm_mapping_symbol
92{
93 bfd_vma value;
94 char type;
54cc7474
SM
95
96 bool operator< (const arm_mapping_symbol &other) const
97 { return this->value < other.value; }
60c5725c 98};
54cc7474
SM
99
100typedef std::vector<arm_mapping_symbol> arm_mapping_symbol_vec;
60c5725c
DJ
101
102struct arm_per_objfile
103{
54cc7474 104 explicit arm_per_objfile (size_t num_sections)
4838e44c
SM
105 : section_maps (new arm_mapping_symbol_vec[num_sections]),
106 section_maps_sorted (new bool[num_sections] ())
54cc7474
SM
107 {}
108
109 DISABLE_COPY_AND_ASSIGN (arm_per_objfile);
110
111 /* Information about mapping symbols ($a, $d, $t) in the objfile.
112
113 The format is an array of vectors of arm_mapping_symbols, there is one
114 vector for each section of the objfile (the array is index by BFD section
115 index).
116
117 For each section, the vector of arm_mapping_symbol is sorted by
118 symbol value (address). */
119 std::unique_ptr<arm_mapping_symbol_vec[]> section_maps;
4838e44c
SM
120
121 /* For each corresponding element of section_maps above, is this vector
122 sorted. */
123 std::unique_ptr<bool[]> section_maps_sorted;
60c5725c
DJ
124};
125
1b7f24cd
TT
126/* Per-objfile data used for mapping symbols. */
127static objfile_key<arm_per_objfile> arm_objfile_data_key;
128
afd7eef0
RE
129/* The list of available "set arm ..." and "show arm ..." commands. */
130static struct cmd_list_element *setarmcmdlist = NULL;
131static struct cmd_list_element *showarmcmdlist = NULL;
132
fd50bc42
RE
133/* The type of floating-point to use. Keep this in sync with enum
134 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 135static const char *const fp_model_strings[] =
fd50bc42
RE
136{
137 "auto",
138 "softfpa",
139 "fpa",
140 "softvfp",
28e97307
DJ
141 "vfp",
142 NULL
fd50bc42
RE
143};
144
145/* A variable that can be configured by the user. */
146static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
147static const char *current_fp_model = "auto";
148
28e97307 149/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 150static const char *const arm_abi_strings[] =
28e97307
DJ
151{
152 "auto",
153 "APCS",
154 "AAPCS",
155 NULL
156};
157
158/* A variable that can be configured by the user. */
159static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
160static const char *arm_abi_string = "auto";
161
0428b8f5 162/* The execution mode to assume. */
40478521 163static const char *const arm_mode_strings[] =
0428b8f5
DJ
164 {
165 "auto",
166 "arm",
68770265
MGD
167 "thumb",
168 NULL
0428b8f5
DJ
169 };
170
171static const char *arm_fallback_mode_string = "auto";
172static const char *arm_force_mode_string = "auto";
173
f32bf4a4
YQ
174/* The standard register names, and all the valid aliases for them. Note
175 that `fp', `sp' and `pc' are not added in this alias list, because they
176 have been added as builtin user registers in
177 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
178static const struct
179{
180 const char *name;
181 int regnum;
182} arm_register_aliases[] = {
183 /* Basic register numbers. */
184 { "r0", 0 },
185 { "r1", 1 },
186 { "r2", 2 },
187 { "r3", 3 },
188 { "r4", 4 },
189 { "r5", 5 },
190 { "r6", 6 },
191 { "r7", 7 },
192 { "r8", 8 },
193 { "r9", 9 },
194 { "r10", 10 },
195 { "r11", 11 },
196 { "r12", 12 },
197 { "r13", 13 },
198 { "r14", 14 },
199 { "r15", 15 },
200 /* Synonyms (argument and variable registers). */
201 { "a1", 0 },
202 { "a2", 1 },
203 { "a3", 2 },
204 { "a4", 3 },
205 { "v1", 4 },
206 { "v2", 5 },
207 { "v3", 6 },
208 { "v4", 7 },
209 { "v5", 8 },
210 { "v6", 9 },
211 { "v7", 10 },
212 { "v8", 11 },
213 /* Other platform-specific names for r9. */
214 { "sb", 9 },
215 { "tr", 9 },
216 /* Special names. */
217 { "ip", 12 },
123dc839 218 { "lr", 14 },
123dc839
DJ
219 /* Names used by GCC (not listed in the ARM EABI). */
220 { "sl", 10 },
123dc839
DJ
221 /* A special name from the older ATPCS. */
222 { "wr", 7 },
223};
bc90b915 224
123dc839 225static const char *const arm_register_names[] =
da59e081
JM
226{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
227 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
228 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
229 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
230 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
231 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 232 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 233
65b48a81
PB
234/* Holds the current set of options to be passed to the disassembler. */
235static char *arm_disassembler_options;
236
afd7eef0
RE
237/* Valid register name styles. */
238static const char **valid_disassembly_styles;
ed9a39eb 239
afd7eef0
RE
240/* Disassembly style to use. Default to "std" register names. */
241static const char *disassembly_style;
96baa820 242
ed9a39eb 243/* This is used to keep the bfd arch_info in sync with the disassembly
afd7eef0 244 style. */
eb4c3f4a 245static void set_disassembly_style_sfunc (const char *, int,
ed9a39eb 246 struct cmd_list_element *);
65b48a81
PB
247static void show_disassembly_style_sfunc (struct ui_file *, int,
248 struct cmd_list_element *,
249 const char *);
ed9a39eb 250
05d1431c 251static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
849d0ba8 252 readable_regcache *regcache,
05d1431c 253 int regnum, gdb_byte *buf);
58d6951d
DJ
254static void arm_neon_quad_write (struct gdbarch *gdbarch,
255 struct regcache *regcache,
256 int regnum, const gdb_byte *buf);
257
e7cf25a8 258static CORE_ADDR
553cb527 259 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
e7cf25a8
YQ
260
261
d9311bfa
AT
262/* get_next_pcs operations. */
263static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
264 arm_get_next_pcs_read_memory_unsigned_integer,
265 arm_get_next_pcs_syscall_next_pc,
266 arm_get_next_pcs_addr_bits_remove,
ed443b61
YQ
267 arm_get_next_pcs_is_thumb,
268 NULL,
d9311bfa
AT
269};
270
9b8d791a 271struct arm_prologue_cache
c3b4394c 272{
eb5492fa
DJ
273 /* The stack pointer at the time this frame was created; i.e. the
274 caller's stack pointer when this function was called. It is used
275 to identify this frame. */
276 CORE_ADDR prev_sp;
277
4be43953
DJ
278 /* The frame base for this frame is just prev_sp - frame size.
279 FRAMESIZE is the distance from the frame pointer to the
280 initial stack pointer. */
eb5492fa 281
c3b4394c 282 int framesize;
eb5492fa
DJ
283
284 /* The register used to hold the frame pointer for this frame. */
c3b4394c 285 int framereg;
eb5492fa
DJ
286
287 /* Saved register offsets. */
288 struct trad_frame_saved_reg *saved_regs;
c3b4394c 289};
ed9a39eb 290
0d39a070
DJ
291static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
292 CORE_ADDR prologue_start,
293 CORE_ADDR prologue_end,
294 struct arm_prologue_cache *cache);
295
cca44b1b
JB
296/* Architecture version for displaced stepping. This effects the behaviour of
297 certain instructions, and really should not be hard-wired. */
298
299#define DISPLACED_STEPPING_ARCH_VERSION 5
300
94c30b78 301/* Set to true if the 32-bit mode is in use. */
c906108c
SS
302
303int arm_apcs_32 = 1;
304
9779414d
DJ
305/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
306
478fd957 307int
9779414d
DJ
308arm_psr_thumb_bit (struct gdbarch *gdbarch)
309{
310 if (gdbarch_tdep (gdbarch)->is_m)
311 return XPSR_T;
312 else
313 return CPSR_T;
314}
315
d0e59a68
AT
316/* Determine if the processor is currently executing in Thumb mode. */
317
318int
319arm_is_thumb (struct regcache *regcache)
320{
321 ULONGEST cpsr;
ac7936df 322 ULONGEST t_bit = arm_psr_thumb_bit (regcache->arch ());
d0e59a68
AT
323
324 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
325
326 return (cpsr & t_bit) != 0;
327}
328
b39cc962
DJ
329/* Determine if FRAME is executing in Thumb mode. */
330
25b41d01 331int
b39cc962
DJ
332arm_frame_is_thumb (struct frame_info *frame)
333{
334 CORE_ADDR cpsr;
9779414d 335 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
336
337 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
338 directly (from a signal frame or dummy frame) or by interpreting
339 the saved LR (from a prologue or DWARF frame). So consult it and
340 trust the unwinders. */
341 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
342
9779414d 343 return (cpsr & t_bit) != 0;
b39cc962
DJ
344}
345
f9d67f43
DJ
346/* Search for the mapping symbol covering MEMADDR. If one is found,
347 return its type. Otherwise, return 0. If START is non-NULL,
348 set *START to the location of the mapping symbol. */
c906108c 349
f9d67f43
DJ
350static char
351arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 352{
60c5725c 353 struct obj_section *sec;
0428b8f5 354
60c5725c
DJ
355 /* If there are mapping symbols, consult them. */
356 sec = find_pc_section (memaddr);
357 if (sec != NULL)
358 {
1b7f24cd 359 arm_per_objfile *data = arm_objfile_data_key.get (sec->objfile);
60c5725c
DJ
360 if (data != NULL)
361 {
4838e44c
SM
362 unsigned int section_idx = sec->the_bfd_section->index;
363 arm_mapping_symbol_vec &map
364 = data->section_maps[section_idx];
365
366 /* Sort the vector on first use. */
367 if (!data->section_maps_sorted[section_idx])
368 {
369 std::sort (map.begin (), map.end ());
370 data->section_maps_sorted[section_idx] = true;
371 }
372
54cc7474
SM
373 struct arm_mapping_symbol map_key
374 = { memaddr - obj_section_addr (sec), 0 };
54cc7474
SM
375 arm_mapping_symbol_vec::const_iterator it
376 = std::lower_bound (map.begin (), map.end (), map_key);
377
378 /* std::lower_bound finds the earliest ordered insertion
379 point. If the symbol at this position starts at this exact
380 address, we use that; otherwise, the preceding
381 mapping symbol covers this address. */
382 if (it < map.end ())
60c5725c 383 {
54cc7474 384 if (it->value == map_key.value)
60c5725c 385 {
f9d67f43 386 if (start)
54cc7474
SM
387 *start = it->value + obj_section_addr (sec);
388 return it->type;
60c5725c
DJ
389 }
390 }
54cc7474
SM
391
392 if (it > map.begin ())
393 {
394 arm_mapping_symbol_vec::const_iterator prev_it
395 = it - 1;
396
397 if (start)
398 *start = prev_it->value + obj_section_addr (sec);
399 return prev_it->type;
400 }
60c5725c
DJ
401 }
402 }
403
f9d67f43
DJ
404 return 0;
405}
406
407/* Determine if the program counter specified in MEMADDR is in a Thumb
408 function. This function should be called for addresses unrelated to
409 any executing frame; otherwise, prefer arm_frame_is_thumb. */
410
e3039479 411int
9779414d 412arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 413{
7cbd4a93 414 struct bound_minimal_symbol sym;
f9d67f43 415 char type;
cfba9872
SM
416 arm_displaced_step_closure *dsc
417 = ((arm_displaced_step_closure * )
418 get_displaced_step_closure_by_addr (memaddr));
a42244db
YQ
419
420 /* If checking the mode of displaced instruction in copy area, the mode
421 should be determined by instruction on the original address. */
422 if (dsc)
423 {
424 if (debug_displaced)
425 fprintf_unfiltered (gdb_stdlog,
426 "displaced: check mode of %.8lx instead of %.8lx\n",
427 (unsigned long) dsc->insn_addr,
428 (unsigned long) memaddr);
429 memaddr = dsc->insn_addr;
430 }
f9d67f43
DJ
431
432 /* If bit 0 of the address is set, assume this is a Thumb address. */
433 if (IS_THUMB_ADDR (memaddr))
434 return 1;
435
436 /* If the user wants to override the symbol table, let him. */
437 if (strcmp (arm_force_mode_string, "arm") == 0)
438 return 0;
439 if (strcmp (arm_force_mode_string, "thumb") == 0)
440 return 1;
441
9779414d
DJ
442 /* ARM v6-M and v7-M are always in Thumb mode. */
443 if (gdbarch_tdep (gdbarch)->is_m)
444 return 1;
445
f9d67f43
DJ
446 /* If there are mapping symbols, consult them. */
447 type = arm_find_mapping_symbol (memaddr, NULL);
448 if (type)
449 return type == 't';
450
ed9a39eb 451 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c 452 sym = lookup_minimal_symbol_by_pc (memaddr);
7cbd4a93
TT
453 if (sym.minsym)
454 return (MSYMBOL_IS_SPECIAL (sym.minsym));
0428b8f5
DJ
455
456 /* If the user wants to override the fallback mode, let them. */
457 if (strcmp (arm_fallback_mode_string, "arm") == 0)
458 return 0;
459 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
460 return 1;
461
462 /* If we couldn't find any symbol, but we're talking to a running
463 target, then trust the current value of $cpsr. This lets
464 "display/i $pc" always show the correct mode (though if there is
465 a symbol table we will not reach here, so it still may not be
18819fa6 466 displayed in the mode it will be executed). */
0428b8f5 467 if (target_has_registers)
18819fa6 468 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
469
470 /* Otherwise we're out of luck; we assume ARM. */
471 return 0;
c906108c
SS
472}
473
ca90e760
FH
474/* Determine if the address specified equals any of these magic return
475 values, called EXC_RETURN, defined by the ARM v6-M and v7-M
476 architectures.
477
478 From ARMv6-M Reference Manual B1.5.8
479 Table B1-5 Exception return behavior
480
481 EXC_RETURN Return To Return Stack
482 0xFFFFFFF1 Handler mode Main
483 0xFFFFFFF9 Thread mode Main
484 0xFFFFFFFD Thread mode Process
485
486 From ARMv7-M Reference Manual B1.5.8
487 Table B1-8 EXC_RETURN definition of exception return behavior, no FP
488
489 EXC_RETURN Return To Return Stack
490 0xFFFFFFF1 Handler mode Main
491 0xFFFFFFF9 Thread mode Main
492 0xFFFFFFFD Thread mode Process
493
494 Table B1-9 EXC_RETURN definition of exception return behavior, with
495 FP
496
497 EXC_RETURN Return To Return Stack Frame Type
498 0xFFFFFFE1 Handler mode Main Extended
499 0xFFFFFFE9 Thread mode Main Extended
500 0xFFFFFFED Thread mode Process Extended
501 0xFFFFFFF1 Handler mode Main Basic
502 0xFFFFFFF9 Thread mode Main Basic
503 0xFFFFFFFD Thread mode Process Basic
504
505 For more details see "B1.5.8 Exception return behavior"
506 in both ARMv6-M and ARMv7-M Architecture Reference Manuals. */
507
508static int
509arm_m_addr_is_magic (CORE_ADDR addr)
510{
511 switch (addr)
512 {
513 /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
514 the exception return behavior. */
515 case 0xffffffe1:
516 case 0xffffffe9:
517 case 0xffffffed:
518 case 0xfffffff1:
519 case 0xfffffff9:
520 case 0xfffffffd:
521 /* Address is magic. */
522 return 1;
523
524 default:
525 /* Address is not magic. */
526 return 0;
527 }
528}
529
181c1381 530/* Remove useless bits from addresses in a running program. */
34e8f22d 531static CORE_ADDR
24568a2c 532arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 533{
2ae28aa9
YQ
534 /* On M-profile devices, do not strip the low bit from EXC_RETURN
535 (the magic exception return address). */
536 if (gdbarch_tdep (gdbarch)->is_m
ca90e760 537 && arm_m_addr_is_magic (val))
2ae28aa9
YQ
538 return val;
539
a3a2ee65 540 if (arm_apcs_32)
dd6be234 541 return UNMAKE_THUMB_ADDR (val);
c906108c 542 else
a3a2ee65 543 return (val & 0x03fffffc);
c906108c
SS
544}
545
0d39a070 546/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
547 can be safely ignored during prologue skipping. IS_THUMB is true
548 if the function is known to be a Thumb function due to the way it
549 is being called. */
0d39a070 550static int
e0634ccf 551skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 552{
e0634ccf 553 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7cbd4a93 554 struct bound_minimal_symbol msym;
0d39a070
DJ
555
556 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 557 if (msym.minsym != NULL
77e371c0 558 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
efd66ac6 559 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
e0634ccf 560 {
efd66ac6 561 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
0d39a070 562
e0634ccf
UW
563 /* The GNU linker's Thumb call stub to foo is named
564 __foo_from_thumb. */
565 if (strstr (name, "_from_thumb") != NULL)
566 name += 2;
0d39a070 567
e0634ccf
UW
568 /* On soft-float targets, __truncdfsf2 is called to convert promoted
569 arguments to their argument types in non-prototyped
570 functions. */
61012eef 571 if (startswith (name, "__truncdfsf2"))
e0634ccf 572 return 1;
61012eef 573 if (startswith (name, "__aeabi_d2f"))
e0634ccf 574 return 1;
0d39a070 575
e0634ccf 576 /* Internal functions related to thread-local storage. */
61012eef 577 if (startswith (name, "__tls_get_addr"))
e0634ccf 578 return 1;
61012eef 579 if (startswith (name, "__aeabi_read_tp"))
e0634ccf
UW
580 return 1;
581 }
582 else
583 {
584 /* If we run against a stripped glibc, we may be unable to identify
585 special functions by name. Check for one important case,
586 __aeabi_read_tp, by comparing the *code* against the default
587 implementation (this is hand-written ARM assembler in glibc). */
588
589 if (!is_thumb
198cd59d 590 && read_code_unsigned_integer (pc, 4, byte_order_for_code)
e0634ccf 591 == 0xe3e00a0f /* mov r0, #0xffff0fff */
198cd59d 592 && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
e0634ccf
UW
593 == 0xe240f01f) /* sub pc, r0, #31 */
594 return 1;
595 }
ec3d575a 596
0d39a070
DJ
597 return 0;
598}
599
621c6d5b
YQ
600/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
601 the first 16-bit of instruction, and INSN2 is the second 16-bit of
602 instruction. */
603#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
604 ((bits ((insn1), 0, 3) << 12) \
605 | (bits ((insn1), 10, 10) << 11) \
606 | (bits ((insn2), 12, 14) << 8) \
607 | bits ((insn2), 0, 7))
608
609/* Extract the immediate from instruction movw/movt of encoding A. INSN is
610 the 32-bit instruction. */
611#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
612 ((bits ((insn), 16, 19) << 12) \
613 | bits ((insn), 0, 11))
614
ec3d575a
UW
615/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
616
617static unsigned int
618thumb_expand_immediate (unsigned int imm)
619{
620 unsigned int count = imm >> 7;
621
622 if (count < 8)
623 switch (count / 2)
624 {
625 case 0:
626 return imm & 0xff;
627 case 1:
628 return (imm & 0xff) | ((imm & 0xff) << 16);
629 case 2:
630 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
631 case 3:
632 return (imm & 0xff) | ((imm & 0xff) << 8)
633 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
634 }
635
636 return (0x80 | (imm & 0x7f)) << (32 - count);
637}
638
540314bd
YQ
639/* Return 1 if the 16-bit Thumb instruction INSN restores SP in
640 epilogue, 0 otherwise. */
641
642static int
643thumb_instruction_restores_sp (unsigned short insn)
644{
645 return (insn == 0x46bd /* mov sp, r7 */
646 || (insn & 0xff80) == 0xb000 /* add sp, imm */
647 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
648}
649
29d73ae4
DJ
650/* Analyze a Thumb prologue, looking for a recognizable stack frame
651 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
652 clobber the stack frame unexpectedly, or an unknown instruction.
653 Return the last address which is definitely safe to skip for an
654 initial breakpoint. */
c906108c
SS
655
656static CORE_ADDR
29d73ae4
DJ
657thumb_analyze_prologue (struct gdbarch *gdbarch,
658 CORE_ADDR start, CORE_ADDR limit,
659 struct arm_prologue_cache *cache)
c906108c 660{
0d39a070 661 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 662 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
663 int i;
664 pv_t regs[16];
29d73ae4 665 CORE_ADDR offset;
ec3d575a 666 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 667
29d73ae4
DJ
668 for (i = 0; i < 16; i++)
669 regs[i] = pv_register (i, 0);
f7b7ed97 670 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4 671
29d73ae4 672 while (start < limit)
c906108c 673 {
29d73ae4
DJ
674 unsigned short insn;
675
198cd59d 676 insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 677
94c30b78 678 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 679 {
29d73ae4
DJ
680 int regno;
681 int mask;
4be43953 682
f7b7ed97 683 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953 684 break;
29d73ae4
DJ
685
686 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
687 whether to save LR (R14). */
688 mask = (insn & 0xff) | ((insn & 0x100) << 6);
689
690 /* Calculate offsets of saved R0-R7 and LR. */
691 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
692 if (mask & (1 << regno))
693 {
29d73ae4
DJ
694 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
695 -4);
f7b7ed97 696 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
29d73ae4 697 }
da59e081 698 }
1db01f22 699 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
da59e081 700 {
29d73ae4 701 offset = (insn & 0x7f) << 2; /* get scaled offset */
1db01f22
YQ
702 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
703 -offset);
da59e081 704 }
808f7ab1
YQ
705 else if (thumb_instruction_restores_sp (insn))
706 {
707 /* Don't scan past the epilogue. */
708 break;
709 }
0d39a070
DJ
710 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
711 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
712 (insn & 0xff) << 2);
713 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
714 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
715 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
716 bits (insn, 6, 8));
717 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
718 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
719 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
720 bits (insn, 0, 7));
721 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
722 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
723 && pv_is_constant (regs[bits (insn, 3, 5)]))
724 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
725 regs[bits (insn, 6, 8)]);
726 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
727 && pv_is_constant (regs[bits (insn, 3, 6)]))
728 {
729 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
730 int rm = bits (insn, 3, 6);
731 regs[rd] = pv_add (regs[rd], regs[rm]);
732 }
29d73ae4 733 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 734 {
29d73ae4
DJ
735 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
736 int src_reg = (insn & 0x78) >> 3;
737 regs[dst_reg] = regs[src_reg];
da59e081 738 }
29d73ae4 739 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 740 {
29d73ae4
DJ
741 /* Handle stores to the stack. Normally pushes are used,
742 but with GCC -mtpcs-frame, there may be other stores
743 in the prologue to create the frame. */
744 int regno = (insn >> 8) & 0x7;
745 pv_t addr;
746
747 offset = (insn & 0xff) << 2;
748 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
749
f7b7ed97 750 if (stack.store_would_trash (addr))
29d73ae4
DJ
751 break;
752
f7b7ed97 753 stack.store (addr, 4, regs[regno]);
da59e081 754 }
0d39a070
DJ
755 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
756 {
757 int rd = bits (insn, 0, 2);
758 int rn = bits (insn, 3, 5);
759 pv_t addr;
760
761 offset = bits (insn, 6, 10) << 2;
762 addr = pv_add_constant (regs[rn], offset);
763
f7b7ed97 764 if (stack.store_would_trash (addr))
0d39a070
DJ
765 break;
766
f7b7ed97 767 stack.store (addr, 4, regs[rd]);
0d39a070
DJ
768 }
769 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
770 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
771 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
772 /* Ignore stores of argument registers to the stack. */
773 ;
774 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
775 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
776 /* Ignore block loads from the stack, potentially copying
777 parameters from memory. */
778 ;
779 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
780 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
781 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
782 /* Similarly ignore single loads from the stack. */
783 ;
784 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
785 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
786 /* Skip register copies, i.e. saves to another register
787 instead of the stack. */
788 ;
789 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
790 /* Recognize constant loads; even with small stacks these are necessary
791 on Thumb. */
792 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
793 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
794 {
795 /* Constant pool loads, for the same reason. */
796 unsigned int constant;
797 CORE_ADDR loc;
798
799 loc = start + 4 + bits (insn, 0, 7) * 4;
800 constant = read_memory_unsigned_integer (loc, 4, byte_order);
801 regs[bits (insn, 8, 10)] = pv_constant (constant);
802 }
db24da6d 803 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 804 {
0d39a070
DJ
805 unsigned short inst2;
806
198cd59d
YQ
807 inst2 = read_code_unsigned_integer (start + 2, 2,
808 byte_order_for_code);
0d39a070
DJ
809
810 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
811 {
812 /* BL, BLX. Allow some special function calls when
813 skipping the prologue; GCC generates these before
814 storing arguments to the stack. */
815 CORE_ADDR nextpc;
816 int j1, j2, imm1, imm2;
817
818 imm1 = sbits (insn, 0, 10);
819 imm2 = bits (inst2, 0, 10);
820 j1 = bit (inst2, 13);
821 j2 = bit (inst2, 11);
822
823 offset = ((imm1 << 12) + (imm2 << 1));
824 offset ^= ((!j2) << 22) | ((!j1) << 23);
825
826 nextpc = start + 4 + offset;
827 /* For BLX make sure to clear the low bits. */
828 if (bit (inst2, 12) == 0)
829 nextpc = nextpc & 0xfffffffc;
830
e0634ccf
UW
831 if (!skip_prologue_function (gdbarch, nextpc,
832 bit (inst2, 12) != 0))
0d39a070
DJ
833 break;
834 }
ec3d575a 835
0963b4bd
MS
836 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
837 { registers } */
ec3d575a
UW
838 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
839 {
840 pv_t addr = regs[bits (insn, 0, 3)];
841 int regno;
842
f7b7ed97 843 if (stack.store_would_trash (addr))
ec3d575a
UW
844 break;
845
846 /* Calculate offsets of saved registers. */
847 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
848 if (inst2 & (1 << regno))
849 {
850 addr = pv_add_constant (addr, -4);
f7b7ed97 851 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
852 }
853
854 if (insn & 0x0020)
855 regs[bits (insn, 0, 3)] = addr;
856 }
857
0963b4bd
MS
858 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
859 [Rn, #+/-imm]{!} */
ec3d575a
UW
860 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
861 {
862 int regno1 = bits (inst2, 12, 15);
863 int regno2 = bits (inst2, 8, 11);
864 pv_t addr = regs[bits (insn, 0, 3)];
865
866 offset = inst2 & 0xff;
867 if (insn & 0x0080)
868 addr = pv_add_constant (addr, offset);
869 else
870 addr = pv_add_constant (addr, -offset);
871
f7b7ed97 872 if (stack.store_would_trash (addr))
ec3d575a
UW
873 break;
874
f7b7ed97
TT
875 stack.store (addr, 4, regs[regno1]);
876 stack.store (pv_add_constant (addr, 4),
877 4, regs[regno2]);
ec3d575a
UW
878
879 if (insn & 0x0020)
880 regs[bits (insn, 0, 3)] = addr;
881 }
882
883 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
884 && (inst2 & 0x0c00) == 0x0c00
885 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
886 {
887 int regno = bits (inst2, 12, 15);
888 pv_t addr = regs[bits (insn, 0, 3)];
889
890 offset = inst2 & 0xff;
891 if (inst2 & 0x0200)
892 addr = pv_add_constant (addr, offset);
893 else
894 addr = pv_add_constant (addr, -offset);
895
f7b7ed97 896 if (stack.store_would_trash (addr))
ec3d575a
UW
897 break;
898
f7b7ed97 899 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
900
901 if (inst2 & 0x0100)
902 regs[bits (insn, 0, 3)] = addr;
903 }
904
905 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
906 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
907 {
908 int regno = bits (inst2, 12, 15);
909 pv_t addr;
910
911 offset = inst2 & 0xfff;
912 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
913
f7b7ed97 914 if (stack.store_would_trash (addr))
ec3d575a
UW
915 break;
916
f7b7ed97 917 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
918 }
919
920 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 921 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 922 /* Ignore stores of argument registers to the stack. */
0d39a070 923 ;
ec3d575a
UW
924
925 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
926 && (inst2 & 0x0d00) == 0x0c00
0d39a070 927 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 928 /* Ignore stores of argument registers to the stack. */
0d39a070 929 ;
ec3d575a 930
0963b4bd
MS
931 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
932 { registers } */
ec3d575a
UW
933 && (inst2 & 0x8000) == 0x0000
934 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
935 /* Ignore block loads from the stack, potentially copying
936 parameters from memory. */
0d39a070 937 ;
ec3d575a 938
0963b4bd
MS
939 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
940 [Rn, #+/-imm] */
0d39a070 941 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 942 /* Similarly ignore dual loads from the stack. */
0d39a070 943 ;
ec3d575a
UW
944
945 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
946 && (inst2 & 0x0d00) == 0x0c00
0d39a070 947 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 948 /* Similarly ignore single loads from the stack. */
0d39a070 949 ;
ec3d575a
UW
950
951 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
0d39a070 952 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 953 /* Similarly ignore single loads from the stack. */
0d39a070 954 ;
ec3d575a
UW
955
956 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
957 && (inst2 & 0x8000) == 0x0000)
958 {
959 unsigned int imm = ((bits (insn, 10, 10) << 11)
960 | (bits (inst2, 12, 14) << 8)
961 | bits (inst2, 0, 7));
962
963 regs[bits (inst2, 8, 11)]
964 = pv_add_constant (regs[bits (insn, 0, 3)],
965 thumb_expand_immediate (imm));
966 }
967
968 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
969 && (inst2 & 0x8000) == 0x0000)
0d39a070 970 {
ec3d575a
UW
971 unsigned int imm = ((bits (insn, 10, 10) << 11)
972 | (bits (inst2, 12, 14) << 8)
973 | bits (inst2, 0, 7));
974
975 regs[bits (inst2, 8, 11)]
976 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
977 }
978
979 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
980 && (inst2 & 0x8000) == 0x0000)
981 {
982 unsigned int imm = ((bits (insn, 10, 10) << 11)
983 | (bits (inst2, 12, 14) << 8)
984 | bits (inst2, 0, 7));
985
986 regs[bits (inst2, 8, 11)]
987 = pv_add_constant (regs[bits (insn, 0, 3)],
988 - (CORE_ADDR) thumb_expand_immediate (imm));
989 }
990
991 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
992 && (inst2 & 0x8000) == 0x0000)
993 {
994 unsigned int imm = ((bits (insn, 10, 10) << 11)
995 | (bits (inst2, 12, 14) << 8)
996 | bits (inst2, 0, 7));
997
998 regs[bits (inst2, 8, 11)]
999 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1000 }
1001
1002 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
1003 {
1004 unsigned int imm = ((bits (insn, 10, 10) << 11)
1005 | (bits (inst2, 12, 14) << 8)
1006 | bits (inst2, 0, 7));
1007
1008 regs[bits (inst2, 8, 11)]
1009 = pv_constant (thumb_expand_immediate (imm));
1010 }
1011
1012 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
1013 {
621c6d5b
YQ
1014 unsigned int imm
1015 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
1016
1017 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1018 }
1019
1020 else if (insn == 0xea5f /* mov.w Rd,Rm */
1021 && (inst2 & 0xf0f0) == 0)
1022 {
1023 int dst_reg = (inst2 & 0x0f00) >> 8;
1024 int src_reg = inst2 & 0xf;
1025 regs[dst_reg] = regs[src_reg];
1026 }
1027
1028 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1029 {
1030 /* Constant pool loads. */
1031 unsigned int constant;
1032 CORE_ADDR loc;
1033
cac395ea 1034 offset = bits (inst2, 0, 11);
ec3d575a
UW
1035 if (insn & 0x0080)
1036 loc = start + 4 + offset;
1037 else
1038 loc = start + 4 - offset;
1039
1040 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1041 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1042 }
1043
1044 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1045 {
1046 /* Constant pool loads. */
1047 unsigned int constant;
1048 CORE_ADDR loc;
1049
cac395ea 1050 offset = bits (inst2, 0, 7) << 2;
ec3d575a
UW
1051 if (insn & 0x0080)
1052 loc = start + 4 + offset;
1053 else
1054 loc = start + 4 - offset;
1055
1056 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1057 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1058
1059 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1060 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1061 }
1062
1063 else if (thumb2_instruction_changes_pc (insn, inst2))
1064 {
1065 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1066 break;
1067 }
ec3d575a
UW
1068 else
1069 {
1070 /* The optimizer might shove anything into the prologue,
1071 so we just skip what we don't recognize. */
1072 unrecognized_pc = start;
1073 }
0d39a070
DJ
1074
1075 start += 2;
1076 }
ec3d575a 1077 else if (thumb_instruction_changes_pc (insn))
3d74b771 1078 {
ec3d575a 1079 /* Don't scan past anything that might change control flow. */
da3c6d4a 1080 break;
3d74b771 1081 }
ec3d575a
UW
1082 else
1083 {
1084 /* The optimizer might shove anything into the prologue,
1085 so we just skip what we don't recognize. */
1086 unrecognized_pc = start;
1087 }
29d73ae4
DJ
1088
1089 start += 2;
c906108c
SS
1090 }
1091
0d39a070
DJ
1092 if (arm_debug)
1093 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1094 paddress (gdbarch, start));
1095
ec3d575a
UW
1096 if (unrecognized_pc == 0)
1097 unrecognized_pc = start;
1098
29d73ae4 1099 if (cache == NULL)
f7b7ed97 1100 return unrecognized_pc;
29d73ae4 1101
29d73ae4
DJ
1102 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1103 {
1104 /* Frame pointer is fp. Frame size is constant. */
1105 cache->framereg = ARM_FP_REGNUM;
1106 cache->framesize = -regs[ARM_FP_REGNUM].k;
1107 }
1108 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1109 {
1110 /* Frame pointer is r7. Frame size is constant. */
1111 cache->framereg = THUMB_FP_REGNUM;
1112 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1113 }
72a2e3dc 1114 else
29d73ae4
DJ
1115 {
1116 /* Try the stack pointer... this is a bit desperate. */
1117 cache->framereg = ARM_SP_REGNUM;
1118 cache->framesize = -regs[ARM_SP_REGNUM].k;
1119 }
29d73ae4
DJ
1120
1121 for (i = 0; i < 16; i++)
f7b7ed97 1122 if (stack.find_reg (gdbarch, i, &offset))
29d73ae4
DJ
1123 cache->saved_regs[i].addr = offset;
1124
ec3d575a 1125 return unrecognized_pc;
c906108c
SS
1126}
1127
621c6d5b
YQ
1128
1129/* Try to analyze the instructions starting from PC, which load symbol
1130 __stack_chk_guard. Return the address of instruction after loading this
1131 symbol, set the dest register number to *BASEREG, and set the size of
1132 instructions for loading symbol in OFFSET. Return 0 if instructions are
1133 not recognized. */
1134
1135static CORE_ADDR
1136arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1137 unsigned int *destreg, int *offset)
1138{
1139 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1140 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1141 unsigned int low, high, address;
1142
1143 address = 0;
1144 if (is_thumb)
1145 {
1146 unsigned short insn1
198cd59d 1147 = read_code_unsigned_integer (pc, 2, byte_order_for_code);
621c6d5b
YQ
1148
1149 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1150 {
1151 *destreg = bits (insn1, 8, 10);
1152 *offset = 2;
6ae274b7
YQ
1153 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1154 address = read_memory_unsigned_integer (address, 4,
1155 byte_order_for_code);
621c6d5b
YQ
1156 }
1157 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1158 {
1159 unsigned short insn2
198cd59d 1160 = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
621c6d5b
YQ
1161
1162 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1163
1164 insn1
198cd59d 1165 = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
621c6d5b 1166 insn2
198cd59d 1167 = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
621c6d5b
YQ
1168
1169 /* movt Rd, #const */
1170 if ((insn1 & 0xfbc0) == 0xf2c0)
1171 {
1172 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1173 *destreg = bits (insn2, 8, 11);
1174 *offset = 8;
1175 address = (high << 16 | low);
1176 }
1177 }
1178 }
1179 else
1180 {
2e9e421f 1181 unsigned int insn
198cd59d 1182 = read_code_unsigned_integer (pc, 4, byte_order_for_code);
2e9e421f 1183
6ae274b7 1184 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
2e9e421f 1185 {
6ae274b7
YQ
1186 address = bits (insn, 0, 11) + pc + 8;
1187 address = read_memory_unsigned_integer (address, 4,
1188 byte_order_for_code);
1189
2e9e421f
UW
1190 *destreg = bits (insn, 12, 15);
1191 *offset = 4;
1192 }
1193 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1194 {
1195 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1196
1197 insn
198cd59d 1198 = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
2e9e421f
UW
1199
1200 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1201 {
1202 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1203 *destreg = bits (insn, 12, 15);
1204 *offset = 8;
1205 address = (high << 16 | low);
1206 }
1207 }
621c6d5b
YQ
1208 }
1209
1210 return address;
1211}
1212
1213/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1214 points to the first instruction of this sequence, return the address of
1215 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1216
1217 On arm, this sequence of instructions is composed of mainly three steps,
1218 Step 1: load symbol __stack_chk_guard,
1219 Step 2: load from address of __stack_chk_guard,
1220 Step 3: store it to somewhere else.
1221
1222 Usually, instructions on step 2 and step 3 are the same on various ARM
1223 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1224 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1225 instructions in step 1 vary from different ARM architectures. On ARMv7,
1226 they are,
1227
1228 movw Rn, #:lower16:__stack_chk_guard
1229 movt Rn, #:upper16:__stack_chk_guard
1230
1231 On ARMv5t, it is,
1232
1233 ldr Rn, .Label
1234 ....
1235 .Lable:
1236 .word __stack_chk_guard
1237
1238 Since ldr/str is a very popular instruction, we can't use them as
1239 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1240 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1241 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1242
1243static CORE_ADDR
1244arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1245{
1246 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1247 unsigned int basereg;
7cbd4a93 1248 struct bound_minimal_symbol stack_chk_guard;
621c6d5b
YQ
1249 int offset;
1250 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1251 CORE_ADDR addr;
1252
1253 /* Try to parse the instructions in Step 1. */
1254 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1255 &basereg, &offset);
1256 if (!addr)
1257 return pc;
1258
1259 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
6041179a
JB
1260 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1261 Otherwise, this sequence cannot be for stack protector. */
1262 if (stack_chk_guard.minsym == NULL
61012eef 1263 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
621c6d5b
YQ
1264 return pc;
1265
1266 if (is_thumb)
1267 {
1268 unsigned int destreg;
1269 unsigned short insn
198cd59d 1270 = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
621c6d5b
YQ
1271
1272 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1273 if ((insn & 0xf800) != 0x6800)
1274 return pc;
1275 if (bits (insn, 3, 5) != basereg)
1276 return pc;
1277 destreg = bits (insn, 0, 2);
1278
198cd59d
YQ
1279 insn = read_code_unsigned_integer (pc + offset + 2, 2,
1280 byte_order_for_code);
621c6d5b
YQ
1281 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1282 if ((insn & 0xf800) != 0x6000)
1283 return pc;
1284 if (destreg != bits (insn, 0, 2))
1285 return pc;
1286 }
1287 else
1288 {
1289 unsigned int destreg;
1290 unsigned int insn
198cd59d 1291 = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
621c6d5b
YQ
1292
1293 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1294 if ((insn & 0x0e500000) != 0x04100000)
1295 return pc;
1296 if (bits (insn, 16, 19) != basereg)
1297 return pc;
1298 destreg = bits (insn, 12, 15);
1299 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
198cd59d 1300 insn = read_code_unsigned_integer (pc + offset + 4,
621c6d5b
YQ
1301 4, byte_order_for_code);
1302 if ((insn & 0x0e500000) != 0x04000000)
1303 return pc;
1304 if (bits (insn, 12, 15) != destreg)
1305 return pc;
1306 }
1307 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1308 on arm. */
1309 if (is_thumb)
1310 return pc + offset + 4;
1311 else
1312 return pc + offset + 8;
1313}
1314
da3c6d4a
MS
1315/* Advance the PC across any function entry prologue instructions to
1316 reach some "real" code.
34e8f22d
RE
1317
1318 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1319 prologue:
c906108c 1320
c5aa993b
JM
1321 mov ip, sp
1322 [stmfd sp!, {a1,a2,a3,a4}]
1323 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1324 [stfe f7, [sp, #-12]!]
1325 [stfe f6, [sp, #-12]!]
1326 [stfe f5, [sp, #-12]!]
1327 [stfe f4, [sp, #-12]!]
0963b4bd 1328 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1329
34e8f22d 1330static CORE_ADDR
6093d2eb 1331arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1332{
a89fea3c 1333 CORE_ADDR func_addr, limit_pc;
c906108c 1334
a89fea3c
JL
1335 /* See if we can determine the end of the prologue via the symbol table.
1336 If so, then return either PC, or the PC after the prologue, whichever
1337 is greater. */
1338 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1339 {
d80b854b
UW
1340 CORE_ADDR post_prologue_pc
1341 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1342 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1343
621c6d5b
YQ
1344 if (post_prologue_pc)
1345 post_prologue_pc
1346 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1347
1348
0d39a070
DJ
1349 /* GCC always emits a line note before the prologue and another
1350 one after, even if the two are at the same address or on the
1351 same line. Take advantage of this so that we do not need to
1352 know every instruction that might appear in the prologue. We
1353 will have producer information for most binaries; if it is
1354 missing (e.g. for -gstabs), assuming the GNU tools. */
1355 if (post_prologue_pc
43f3e411
DE
1356 && (cust == NULL
1357 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1358 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1359 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1360 return post_prologue_pc;
1361
a89fea3c 1362 if (post_prologue_pc != 0)
0d39a070
DJ
1363 {
1364 CORE_ADDR analyzed_limit;
1365
1366 /* For non-GCC compilers, make sure the entire line is an
1367 acceptable prologue; GDB will round this function's
1368 return value up to the end of the following line so we
1369 can not skip just part of a line (and we do not want to).
1370
1371 RealView does not treat the prologue specially, but does
1372 associate prologue code with the opening brace; so this
1373 lets us skip the first line if we think it is the opening
1374 brace. */
9779414d 1375 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1376 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1377 post_prologue_pc, NULL);
1378 else
1379 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1380 post_prologue_pc, NULL);
1381
1382 if (analyzed_limit != post_prologue_pc)
1383 return func_addr;
1384
1385 return post_prologue_pc;
1386 }
c906108c
SS
1387 }
1388
a89fea3c
JL
1389 /* Can't determine prologue from the symbol table, need to examine
1390 instructions. */
c906108c 1391
a89fea3c
JL
1392 /* Find an upper limit on the function prologue using the debug
1393 information. If the debug information could not be used to provide
1394 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1395 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1396 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1397 if (limit_pc == 0)
1398 limit_pc = pc + 64; /* Magic. */
1399
c906108c 1400
29d73ae4 1401 /* Check if this is Thumb code. */
9779414d 1402 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1403 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1404 else
1405 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1406}
94c30b78 1407
c5aa993b 1408/* *INDENT-OFF* */
c906108c
SS
1409/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1410 This function decodes a Thumb function prologue to determine:
1411 1) the size of the stack frame
1412 2) which registers are saved on it
1413 3) the offsets of saved regs
1414 4) the offset from the stack pointer to the frame pointer
c906108c 1415
da59e081
JM
1416 A typical Thumb function prologue would create this stack frame
1417 (offsets relative to FP)
c906108c
SS
1418 old SP -> 24 stack parameters
1419 20 LR
1420 16 R7
1421 R7 -> 0 local variables (16 bytes)
1422 SP -> -12 additional stack space (12 bytes)
1423 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1424 12 bytes. The frame register is R7.
da59e081 1425
da3c6d4a
MS
1426 The comments for thumb_skip_prolog() describe the algorithm we use
1427 to detect the end of the prolog. */
c5aa993b
JM
1428/* *INDENT-ON* */
1429
c906108c 1430static void
be8626e0 1431thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1432 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1433{
1434 CORE_ADDR prologue_start;
1435 CORE_ADDR prologue_end;
c906108c 1436
b39cc962
DJ
1437 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1438 &prologue_end))
c906108c 1439 {
ec3d575a
UW
1440 /* See comment in arm_scan_prologue for an explanation of
1441 this heuristics. */
1442 if (prologue_end > prologue_start + 64)
1443 {
1444 prologue_end = prologue_start + 64;
1445 }
c906108c
SS
1446 }
1447 else
f7060f85
DJ
1448 /* We're in the boondocks: we have no idea where the start of the
1449 function is. */
1450 return;
c906108c 1451
325fac50 1452 prologue_end = std::min (prologue_end, prev_pc);
c906108c 1453
be8626e0 1454 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1455}
1456
f303bc3e
YQ
1457/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1458 otherwise. */
1459
1460static int
1461arm_instruction_restores_sp (unsigned int insn)
1462{
1463 if (bits (insn, 28, 31) != INST_NV)
1464 {
1465 if ((insn & 0x0df0f000) == 0x0080d000
1466 /* ADD SP (register or immediate). */
1467 || (insn & 0x0df0f000) == 0x0040d000
1468 /* SUB SP (register or immediate). */
1469 || (insn & 0x0ffffff0) == 0x01a0d000
1470 /* MOV SP. */
1471 || (insn & 0x0fff0000) == 0x08bd0000
1472 /* POP (LDMIA). */
1473 || (insn & 0x0fff0000) == 0x049d0000)
1474 /* POP of a single register. */
1475 return 1;
1476 }
1477
1478 return 0;
1479}
1480
0d39a070
DJ
1481/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1482 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1483 fill it in. Return the first address not recognized as a prologue
1484 instruction.
eb5492fa 1485
0d39a070
DJ
1486 We recognize all the instructions typically found in ARM prologues,
1487 plus harmless instructions which can be skipped (either for analysis
1488 purposes, or a more restrictive set that can be skipped when finding
1489 the end of the prologue). */
1490
1491static CORE_ADDR
1492arm_analyze_prologue (struct gdbarch *gdbarch,
1493 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1494 struct arm_prologue_cache *cache)
1495{
0d39a070
DJ
1496 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1497 int regno;
1498 CORE_ADDR offset, current_pc;
1499 pv_t regs[ARM_FPS_REGNUM];
0d39a070
DJ
1500 CORE_ADDR unrecognized_pc = 0;
1501
1502 /* Search the prologue looking for instructions that set up the
96baa820 1503 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1504
96baa820
JM
1505 Be careful, however, and if it doesn't look like a prologue,
1506 don't try to scan it. If, for instance, a frameless function
1507 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1508 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1509 and other operations that rely on a knowledge of the stack
0d39a070 1510 traceback. */
d4473757 1511
4be43953
DJ
1512 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1513 regs[regno] = pv_register (regno, 0);
f7b7ed97 1514 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953 1515
94c30b78
MS
1516 for (current_pc = prologue_start;
1517 current_pc < prologue_end;
f43845b3 1518 current_pc += 4)
96baa820 1519 {
e17a4113 1520 unsigned int insn
198cd59d 1521 = read_code_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1522
94c30b78 1523 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1524 {
4be43953 1525 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1526 continue;
1527 }
0d39a070
DJ
1528 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1529 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1530 {
1531 unsigned imm = insn & 0xff; /* immediate value */
1532 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1533 int rd = bits (insn, 12, 15);
28cd8767 1534 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1535 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1536 continue;
1537 }
0d39a070
DJ
1538 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1539 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1540 {
1541 unsigned imm = insn & 0xff; /* immediate value */
1542 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1543 int rd = bits (insn, 12, 15);
28cd8767 1544 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1545 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1546 continue;
1547 }
0963b4bd
MS
1548 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1549 [sp, #-4]! */
f43845b3 1550 {
f7b7ed97 1551 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1552 break;
1553 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
f7b7ed97
TT
1554 stack.store (regs[ARM_SP_REGNUM], 4,
1555 regs[bits (insn, 12, 15)]);
f43845b3
MS
1556 continue;
1557 }
1558 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1559 /* stmfd sp!, {..., fp, ip, lr, pc}
1560 or
1561 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1562 {
d4473757 1563 int mask = insn & 0xffff;
ed9a39eb 1564
f7b7ed97 1565 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1566 break;
1567
94c30b78 1568 /* Calculate offsets of saved registers. */
34e8f22d 1569 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1570 if (mask & (1 << regno))
1571 {
0963b4bd
MS
1572 regs[ARM_SP_REGNUM]
1573 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
f7b7ed97 1574 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1575 }
1576 }
0d39a070
DJ
1577 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1578 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1579 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1580 {
1581 /* No need to add this to saved_regs -- it's just an arg reg. */
1582 continue;
1583 }
0d39a070
DJ
1584 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1585 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1586 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1587 {
1588 /* No need to add this to saved_regs -- it's just an arg reg. */
1589 continue;
1590 }
0963b4bd
MS
1591 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1592 { registers } */
0d39a070
DJ
1593 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1594 {
1595 /* No need to add this to saved_regs -- it's just arg regs. */
1596 continue;
1597 }
d4473757
KB
1598 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1599 {
94c30b78
MS
1600 unsigned imm = insn & 0xff; /* immediate value */
1601 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1602 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1603 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1604 }
1605 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1606 {
94c30b78
MS
1607 unsigned imm = insn & 0xff; /* immediate value */
1608 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1609 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1610 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1611 }
0963b4bd
MS
1612 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1613 [sp, -#c]! */
2af46ca0 1614 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1615 {
f7b7ed97 1616 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1617 break;
1618
1619 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1620 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
f7b7ed97 1621 stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1622 }
0963b4bd
MS
1623 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1624 [sp!] */
2af46ca0 1625 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1626 {
1627 int n_saved_fp_regs;
1628 unsigned int fp_start_reg, fp_bound_reg;
1629
f7b7ed97 1630 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1631 break;
1632
94c30b78 1633 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1634 {
d4473757
KB
1635 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1636 n_saved_fp_regs = 3;
1637 else
1638 n_saved_fp_regs = 1;
96baa820 1639 }
d4473757 1640 else
96baa820 1641 {
d4473757
KB
1642 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1643 n_saved_fp_regs = 2;
1644 else
1645 n_saved_fp_regs = 4;
96baa820 1646 }
d4473757 1647
34e8f22d 1648 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1649 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1650 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1651 {
4be43953 1652 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
f7b7ed97
TT
1653 stack.store (regs[ARM_SP_REGNUM], 12,
1654 regs[fp_start_reg++]);
96baa820 1655 }
c906108c 1656 }
0d39a070
DJ
1657 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1658 {
1659 /* Allow some special function calls when skipping the
1660 prologue; GCC generates these before storing arguments to
1661 the stack. */
1662 CORE_ADDR dest = BranchDest (current_pc, insn);
1663
e0634ccf 1664 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1665 continue;
1666 else
1667 break;
1668 }
d4473757 1669 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1670 break; /* Condition not true, exit early. */
0d39a070
DJ
1671 else if (arm_instruction_changes_pc (insn))
1672 /* Don't scan past anything that might change control flow. */
1673 break;
f303bc3e
YQ
1674 else if (arm_instruction_restores_sp (insn))
1675 {
1676 /* Don't scan past the epilogue. */
1677 break;
1678 }
d19f7eee
UW
1679 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1680 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1681 /* Ignore block loads from the stack, potentially copying
1682 parameters from memory. */
1683 continue;
1684 else if ((insn & 0xfc500000) == 0xe4100000
1685 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1686 /* Similarly ignore single loads from the stack. */
1687 continue;
0d39a070
DJ
1688 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1689 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1690 register instead of the stack. */
d4473757 1691 continue;
0d39a070
DJ
1692 else
1693 {
21daaaaf
YQ
1694 /* The optimizer might shove anything into the prologue, if
1695 we build up cache (cache != NULL) from scanning prologue,
1696 we just skip what we don't recognize and scan further to
1697 make cache as complete as possible. However, if we skip
1698 prologue, we'll stop immediately on unrecognized
1699 instruction. */
0d39a070 1700 unrecognized_pc = current_pc;
21daaaaf
YQ
1701 if (cache != NULL)
1702 continue;
1703 else
1704 break;
0d39a070 1705 }
c906108c
SS
1706 }
1707
0d39a070
DJ
1708 if (unrecognized_pc == 0)
1709 unrecognized_pc = current_pc;
1710
0d39a070
DJ
1711 if (cache)
1712 {
4072f920
YQ
1713 int framereg, framesize;
1714
1715 /* The frame size is just the distance from the frame register
1716 to the original stack pointer. */
1717 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1718 {
1719 /* Frame pointer is fp. */
1720 framereg = ARM_FP_REGNUM;
1721 framesize = -regs[ARM_FP_REGNUM].k;
1722 }
1723 else
1724 {
1725 /* Try the stack pointer... this is a bit desperate. */
1726 framereg = ARM_SP_REGNUM;
1727 framesize = -regs[ARM_SP_REGNUM].k;
1728 }
1729
0d39a070
DJ
1730 cache->framereg = framereg;
1731 cache->framesize = framesize;
1732
1733 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
f7b7ed97 1734 if (stack.find_reg (gdbarch, regno, &offset))
0d39a070
DJ
1735 cache->saved_regs[regno].addr = offset;
1736 }
1737
1738 if (arm_debug)
1739 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1740 paddress (gdbarch, unrecognized_pc));
4be43953 1741
0d39a070
DJ
1742 return unrecognized_pc;
1743}
1744
1745static void
1746arm_scan_prologue (struct frame_info *this_frame,
1747 struct arm_prologue_cache *cache)
1748{
1749 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1750 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
bec2ab5a 1751 CORE_ADDR prologue_start, prologue_end;
0d39a070
DJ
1752 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1753 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
0d39a070
DJ
1754
1755 /* Assume there is no frame until proven otherwise. */
1756 cache->framereg = ARM_SP_REGNUM;
1757 cache->framesize = 0;
1758
1759 /* Check for Thumb prologue. */
1760 if (arm_frame_is_thumb (this_frame))
1761 {
1762 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1763 return;
1764 }
1765
1766 /* Find the function prologue. If we can't find the function in
1767 the symbol table, peek in the stack frame to find the PC. */
1768 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1769 &prologue_end))
1770 {
1771 /* One way to find the end of the prologue (which works well
1772 for unoptimized code) is to do the following:
1773
1774 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1775
1776 if (sal.line == 0)
1777 prologue_end = prev_pc;
1778 else if (sal.end < prologue_end)
1779 prologue_end = sal.end;
1780
1781 This mechanism is very accurate so long as the optimizer
1782 doesn't move any instructions from the function body into the
1783 prologue. If this happens, sal.end will be the last
1784 instruction in the first hunk of prologue code just before
1785 the first instruction that the scheduler has moved from
1786 the body to the prologue.
1787
1788 In order to make sure that we scan all of the prologue
1789 instructions, we use a slightly less accurate mechanism which
1790 may scan more than necessary. To help compensate for this
1791 lack of accuracy, the prologue scanning loop below contains
1792 several clauses which'll cause the loop to terminate early if
1793 an implausible prologue instruction is encountered.
1794
1795 The expression
1796
1797 prologue_start + 64
1798
1799 is a suitable endpoint since it accounts for the largest
1800 possible prologue plus up to five instructions inserted by
1801 the scheduler. */
1802
1803 if (prologue_end > prologue_start + 64)
1804 {
1805 prologue_end = prologue_start + 64; /* See above. */
1806 }
1807 }
1808 else
1809 {
1810 /* We have no symbol information. Our only option is to assume this
1811 function has a standard stack frame and the normal frame register.
1812 Then, we can find the value of our frame pointer on entrance to
1813 the callee (or at the present moment if this is the innermost frame).
1814 The value stored there should be the address of the stmfd + 8. */
1815 CORE_ADDR frame_loc;
7913a64c 1816 ULONGEST return_value;
0d39a070 1817
9e237747
MM
1818 /* AAPCS does not use a frame register, so we can abort here. */
1819 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_AAPCS)
1820 return;
1821
0d39a070 1822 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
7913a64c
YQ
1823 if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
1824 &return_value))
0d39a070
DJ
1825 return;
1826 else
1827 {
1828 prologue_start = gdbarch_addr_bits_remove
1829 (gdbarch, return_value) - 8;
1830 prologue_end = prologue_start + 64; /* See above. */
1831 }
1832 }
1833
1834 if (prev_pc < prologue_end)
1835 prologue_end = prev_pc;
1836
1837 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1838}
1839
eb5492fa 1840static struct arm_prologue_cache *
a262aec2 1841arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1842{
eb5492fa
DJ
1843 int reg;
1844 struct arm_prologue_cache *cache;
1845 CORE_ADDR unwound_fp;
c5aa993b 1846
35d5d4ee 1847 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1848 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1849
a262aec2 1850 arm_scan_prologue (this_frame, cache);
848cfffb 1851
a262aec2 1852 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
1853 if (unwound_fp == 0)
1854 return cache;
c906108c 1855
4be43953 1856 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 1857
eb5492fa
DJ
1858 /* Calculate actual addresses of saved registers using offsets
1859 determined by arm_scan_prologue. */
a262aec2 1860 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 1861 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
1862 cache->saved_regs[reg].addr += cache->prev_sp;
1863
1864 return cache;
c906108c
SS
1865}
1866
c1ee9414
LM
1867/* Implementation of the stop_reason hook for arm_prologue frames. */
1868
1869static enum unwind_stop_reason
1870arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1871 void **this_cache)
1872{
1873 struct arm_prologue_cache *cache;
1874 CORE_ADDR pc;
1875
1876 if (*this_cache == NULL)
1877 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1878 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
1879
1880 /* This is meant to halt the backtrace at "_start". */
1881 pc = get_frame_pc (this_frame);
1882 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1883 return UNWIND_OUTERMOST;
1884
1885 /* If we've hit a wall, stop. */
1886 if (cache->prev_sp == 0)
1887 return UNWIND_OUTERMOST;
1888
1889 return UNWIND_NO_REASON;
1890}
1891
eb5492fa
DJ
1892/* Our frame ID for a normal frame is the current function's starting PC
1893 and the caller's SP when we were called. */
c906108c 1894
148754e5 1895static void
a262aec2 1896arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
1897 void **this_cache,
1898 struct frame_id *this_id)
c906108c 1899{
eb5492fa
DJ
1900 struct arm_prologue_cache *cache;
1901 struct frame_id id;
2c404490 1902 CORE_ADDR pc, func;
f079148d 1903
eb5492fa 1904 if (*this_cache == NULL)
a262aec2 1905 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1906 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 1907
0e9e9abd
UW
1908 /* Use function start address as part of the frame ID. If we cannot
1909 identify the start address (due to missing symbol information),
1910 fall back to just using the current PC. */
c1ee9414 1911 pc = get_frame_pc (this_frame);
2c404490 1912 func = get_frame_func (this_frame);
0e9e9abd
UW
1913 if (!func)
1914 func = pc;
1915
eb5492fa 1916 id = frame_id_build (cache->prev_sp, func);
eb5492fa 1917 *this_id = id;
c906108c
SS
1918}
1919
a262aec2
DJ
1920static struct value *
1921arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 1922 void **this_cache,
a262aec2 1923 int prev_regnum)
24de872b 1924{
24568a2c 1925 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
1926 struct arm_prologue_cache *cache;
1927
eb5492fa 1928 if (*this_cache == NULL)
a262aec2 1929 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1930 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 1931
eb5492fa 1932 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
1933 instead. The prologue may save PC, but it will point into this
1934 frame's prologue, not the next frame's resume location. Also
1935 strip the saved T bit. A valid LR may have the low bit set, but
1936 a valid PC never does. */
eb5492fa 1937 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
1938 {
1939 CORE_ADDR lr;
1940
1941 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1942 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 1943 arm_addr_bits_remove (gdbarch, lr));
b39cc962 1944 }
24de872b 1945
eb5492fa 1946 /* SP is generally not saved to the stack, but this frame is
a262aec2 1947 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
1948 The value was already reconstructed into PREV_SP. */
1949 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 1950 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 1951
b39cc962
DJ
1952 /* The CPSR may have been changed by the call instruction and by the
1953 called function. The only bit we can reconstruct is the T bit,
1954 by checking the low bit of LR as of the call. This is a reliable
1955 indicator of Thumb-ness except for some ARM v4T pre-interworking
1956 Thumb code, which could get away with a clear low bit as long as
1957 the called function did not use bx. Guess that all other
1958 bits are unchanged; the condition flags are presumably lost,
1959 but the processor status is likely valid. */
1960 if (prev_regnum == ARM_PS_REGNUM)
1961 {
1962 CORE_ADDR lr, cpsr;
9779414d 1963 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
1964
1965 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1966 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1967 if (IS_THUMB_ADDR (lr))
9779414d 1968 cpsr |= t_bit;
b39cc962 1969 else
9779414d 1970 cpsr &= ~t_bit;
b39cc962
DJ
1971 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1972 }
1973
a262aec2
DJ
1974 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1975 prev_regnum);
eb5492fa
DJ
1976}
1977
1978struct frame_unwind arm_prologue_unwind = {
1979 NORMAL_FRAME,
c1ee9414 1980 arm_prologue_unwind_stop_reason,
eb5492fa 1981 arm_prologue_this_id,
a262aec2
DJ
1982 arm_prologue_prev_register,
1983 NULL,
1984 default_frame_sniffer
eb5492fa
DJ
1985};
1986
0e9e9abd
UW
1987/* Maintain a list of ARM exception table entries per objfile, similar to the
1988 list of mapping symbols. We only cache entries for standard ARM-defined
1989 personality routines; the cache will contain only the frame unwinding
1990 instructions associated with the entry (not the descriptors). */
1991
0e9e9abd
UW
1992struct arm_exidx_entry
1993{
1994 bfd_vma addr;
1995 gdb_byte *entry;
7a5d944b
TT
1996
1997 bool operator< (const arm_exidx_entry &other) const
1998 {
1999 return addr < other.addr;
2000 }
0e9e9abd 2001};
0e9e9abd
UW
2002
2003struct arm_exidx_data
2004{
7a5d944b 2005 std::vector<std::vector<arm_exidx_entry>> section_maps;
0e9e9abd
UW
2006};
2007
7a5d944b 2008static const struct objfile_key<arm_exidx_data> arm_exidx_data_key;
0e9e9abd
UW
2009
2010static struct obj_section *
2011arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2012{
2013 struct obj_section *osect;
2014
2015 ALL_OBJFILE_OSECTIONS (objfile, osect)
2016 if (bfd_get_section_flags (objfile->obfd,
2017 osect->the_bfd_section) & SEC_ALLOC)
2018 {
2019 bfd_vma start, size;
2020 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
2021 size = bfd_get_section_size (osect->the_bfd_section);
2022
2023 if (start <= vma && vma < start + size)
2024 return osect;
2025 }
2026
2027 return NULL;
2028}
2029
2030/* Parse contents of exception table and exception index sections
2031 of OBJFILE, and fill in the exception table entry cache.
2032
2033 For each entry that refers to a standard ARM-defined personality
2034 routine, extract the frame unwinding instructions (from either
2035 the index or the table section). The unwinding instructions
2036 are normalized by:
2037 - extracting them from the rest of the table data
2038 - converting to host endianness
2039 - appending the implicit 0xb0 ("Finish") code
2040
2041 The extracted and normalized instructions are stored for later
2042 retrieval by the arm_find_exidx_entry routine. */
2043
2044static void
2045arm_exidx_new_objfile (struct objfile *objfile)
2046{
0e9e9abd
UW
2047 struct arm_exidx_data *data;
2048 asection *exidx, *extab;
2049 bfd_vma exidx_vma = 0, extab_vma = 0;
0e9e9abd
UW
2050 LONGEST i;
2051
2052 /* If we've already touched this file, do nothing. */
7a5d944b 2053 if (!objfile || arm_exidx_data_key.get (objfile) != NULL)
0e9e9abd
UW
2054 return;
2055
2056 /* Read contents of exception table and index. */
a5eda10c 2057 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
984c7238 2058 gdb::byte_vector exidx_data;
0e9e9abd
UW
2059 if (exidx)
2060 {
2061 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
984c7238 2062 exidx_data.resize (bfd_get_section_size (exidx));
0e9e9abd
UW
2063
2064 if (!bfd_get_section_contents (objfile->obfd, exidx,
984c7238
TT
2065 exidx_data.data (), 0,
2066 exidx_data.size ()))
2067 return;
0e9e9abd
UW
2068 }
2069
2070 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
984c7238 2071 gdb::byte_vector extab_data;
0e9e9abd
UW
2072 if (extab)
2073 {
2074 extab_vma = bfd_section_vma (objfile->obfd, extab);
984c7238 2075 extab_data.resize (bfd_get_section_size (extab));
0e9e9abd
UW
2076
2077 if (!bfd_get_section_contents (objfile->obfd, extab,
984c7238
TT
2078 extab_data.data (), 0,
2079 extab_data.size ()))
2080 return;
0e9e9abd
UW
2081 }
2082
2083 /* Allocate exception table data structure. */
7a5d944b
TT
2084 data = arm_exidx_data_key.emplace (objfile);
2085 data->section_maps.resize (objfile->obfd->section_count);
0e9e9abd
UW
2086
2087 /* Fill in exception table. */
984c7238 2088 for (i = 0; i < exidx_data.size () / 8; i++)
0e9e9abd
UW
2089 {
2090 struct arm_exidx_entry new_exidx_entry;
984c7238
TT
2091 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data.data () + i * 8);
2092 bfd_vma val = bfd_h_get_32 (objfile->obfd,
2093 exidx_data.data () + i * 8 + 4);
0e9e9abd
UW
2094 bfd_vma addr = 0, word = 0;
2095 int n_bytes = 0, n_words = 0;
2096 struct obj_section *sec;
2097 gdb_byte *entry = NULL;
2098
2099 /* Extract address of start of function. */
2100 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2101 idx += exidx_vma + i * 8;
2102
2103 /* Find section containing function and compute section offset. */
2104 sec = arm_obj_section_from_vma (objfile, idx);
2105 if (sec == NULL)
2106 continue;
2107 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2108
2109 /* Determine address of exception table entry. */
2110 if (val == 1)
2111 {
2112 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2113 }
2114 else if ((val & 0xff000000) == 0x80000000)
2115 {
2116 /* Exception table entry embedded in .ARM.exidx
2117 -- must be short form. */
2118 word = val;
2119 n_bytes = 3;
2120 }
2121 else if (!(val & 0x80000000))
2122 {
2123 /* Exception table entry in .ARM.extab. */
2124 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2125 addr += exidx_vma + i * 8 + 4;
2126
984c7238 2127 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_data.size ())
0e9e9abd
UW
2128 {
2129 word = bfd_h_get_32 (objfile->obfd,
984c7238 2130 extab_data.data () + addr - extab_vma);
0e9e9abd
UW
2131 addr += 4;
2132
2133 if ((word & 0xff000000) == 0x80000000)
2134 {
2135 /* Short form. */
2136 n_bytes = 3;
2137 }
2138 else if ((word & 0xff000000) == 0x81000000
2139 || (word & 0xff000000) == 0x82000000)
2140 {
2141 /* Long form. */
2142 n_bytes = 2;
2143 n_words = ((word >> 16) & 0xff);
2144 }
2145 else if (!(word & 0x80000000))
2146 {
2147 bfd_vma pers;
2148 struct obj_section *pers_sec;
2149 int gnu_personality = 0;
2150
2151 /* Custom personality routine. */
2152 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2153 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2154
2155 /* Check whether we've got one of the variants of the
2156 GNU personality routines. */
2157 pers_sec = arm_obj_section_from_vma (objfile, pers);
2158 if (pers_sec)
2159 {
2160 static const char *personality[] =
2161 {
2162 "__gcc_personality_v0",
2163 "__gxx_personality_v0",
2164 "__gcj_personality_v0",
2165 "__gnu_objc_personality_v0",
2166 NULL
2167 };
2168
2169 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2170 int k;
2171
2172 for (k = 0; personality[k]; k++)
2173 if (lookup_minimal_symbol_by_pc_name
2174 (pc, personality[k], objfile))
2175 {
2176 gnu_personality = 1;
2177 break;
2178 }
2179 }
2180
2181 /* If so, the next word contains a word count in the high
2182 byte, followed by the same unwind instructions as the
2183 pre-defined forms. */
2184 if (gnu_personality
984c7238 2185 && addr + 4 <= extab_vma + extab_data.size ())
0e9e9abd
UW
2186 {
2187 word = bfd_h_get_32 (objfile->obfd,
984c7238
TT
2188 (extab_data.data ()
2189 + addr - extab_vma));
0e9e9abd
UW
2190 addr += 4;
2191 n_bytes = 3;
2192 n_words = ((word >> 24) & 0xff);
2193 }
2194 }
2195 }
2196 }
2197
2198 /* Sanity check address. */
2199 if (n_words)
984c7238
TT
2200 if (addr < extab_vma
2201 || addr + 4 * n_words > extab_vma + extab_data.size ())
0e9e9abd
UW
2202 n_words = n_bytes = 0;
2203
2204 /* The unwind instructions reside in WORD (only the N_BYTES least
2205 significant bytes are valid), followed by N_WORDS words in the
2206 extab section starting at ADDR. */
2207 if (n_bytes || n_words)
2208 {
224c3ddb
SM
2209 gdb_byte *p = entry
2210 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2211 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2212
2213 while (n_bytes--)
2214 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2215
2216 while (n_words--)
2217 {
2218 word = bfd_h_get_32 (objfile->obfd,
984c7238 2219 extab_data.data () + addr - extab_vma);
0e9e9abd
UW
2220 addr += 4;
2221
2222 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2223 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2224 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2225 *p++ = (gdb_byte) (word & 0xff);
2226 }
2227
2228 /* Implied "Finish" to terminate the list. */
2229 *p++ = 0xb0;
2230 }
2231
2232 /* Push entry onto vector. They are guaranteed to always
2233 appear in order of increasing addresses. */
2234 new_exidx_entry.addr = idx;
2235 new_exidx_entry.entry = entry;
7a5d944b
TT
2236 data->section_maps[sec->the_bfd_section->index].push_back
2237 (new_exidx_entry);
0e9e9abd 2238 }
0e9e9abd
UW
2239}
2240
2241/* Search for the exception table entry covering MEMADDR. If one is found,
2242 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2243 set *START to the start of the region covered by this entry. */
2244
2245static gdb_byte *
2246arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2247{
2248 struct obj_section *sec;
2249
2250 sec = find_pc_section (memaddr);
2251 if (sec != NULL)
2252 {
2253 struct arm_exidx_data *data;
0e9e9abd 2254 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
0e9e9abd 2255
7a5d944b 2256 data = arm_exidx_data_key.get (sec->objfile);
0e9e9abd
UW
2257 if (data != NULL)
2258 {
7a5d944b
TT
2259 std::vector<arm_exidx_entry> &map
2260 = data->section_maps[sec->the_bfd_section->index];
2261 if (!map.empty ())
0e9e9abd 2262 {
7a5d944b 2263 auto idx = std::lower_bound (map.begin (), map.end (), map_key);
0e9e9abd 2264
7a5d944b 2265 /* std::lower_bound finds the earliest ordered insertion
0e9e9abd
UW
2266 point. If the following symbol starts at this exact
2267 address, we use that; otherwise, the preceding
2268 exception table entry covers this address. */
7a5d944b 2269 if (idx < map.end ())
0e9e9abd 2270 {
7a5d944b 2271 if (idx->addr == map_key.addr)
0e9e9abd
UW
2272 {
2273 if (start)
7a5d944b
TT
2274 *start = idx->addr + obj_section_addr (sec);
2275 return idx->entry;
0e9e9abd
UW
2276 }
2277 }
2278
7a5d944b 2279 if (idx > map.begin ())
0e9e9abd 2280 {
7a5d944b 2281 idx = idx - 1;
0e9e9abd 2282 if (start)
7a5d944b
TT
2283 *start = idx->addr + obj_section_addr (sec);
2284 return idx->entry;
0e9e9abd
UW
2285 }
2286 }
2287 }
2288 }
2289
2290 return NULL;
2291}
2292
2293/* Given the current frame THIS_FRAME, and its associated frame unwinding
2294 instruction list from the ARM exception table entry ENTRY, allocate and
2295 return a prologue cache structure describing how to unwind this frame.
2296
2297 Return NULL if the unwinding instruction list contains a "spare",
2298 "reserved" or "refuse to unwind" instruction as defined in section
2299 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2300 for the ARM Architecture" document. */
2301
2302static struct arm_prologue_cache *
2303arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2304{
2305 CORE_ADDR vsp = 0;
2306 int vsp_valid = 0;
2307
2308 struct arm_prologue_cache *cache;
2309 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2310 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2311
2312 for (;;)
2313 {
2314 gdb_byte insn;
2315
2316 /* Whenever we reload SP, we actually have to retrieve its
2317 actual value in the current frame. */
2318 if (!vsp_valid)
2319 {
2320 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2321 {
2322 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2323 vsp = get_frame_register_unsigned (this_frame, reg);
2324 }
2325 else
2326 {
2327 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2328 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2329 }
2330
2331 vsp_valid = 1;
2332 }
2333
2334 /* Decode next unwind instruction. */
2335 insn = *entry++;
2336
2337 if ((insn & 0xc0) == 0)
2338 {
2339 int offset = insn & 0x3f;
2340 vsp += (offset << 2) + 4;
2341 }
2342 else if ((insn & 0xc0) == 0x40)
2343 {
2344 int offset = insn & 0x3f;
2345 vsp -= (offset << 2) + 4;
2346 }
2347 else if ((insn & 0xf0) == 0x80)
2348 {
2349 int mask = ((insn & 0xf) << 8) | *entry++;
2350 int i;
2351
2352 /* The special case of an all-zero mask identifies
2353 "Refuse to unwind". We return NULL to fall back
2354 to the prologue analyzer. */
2355 if (mask == 0)
2356 return NULL;
2357
2358 /* Pop registers r4..r15 under mask. */
2359 for (i = 0; i < 12; i++)
2360 if (mask & (1 << i))
2361 {
2362 cache->saved_regs[4 + i].addr = vsp;
2363 vsp += 4;
2364 }
2365
2366 /* Special-case popping SP -- we need to reload vsp. */
2367 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2368 vsp_valid = 0;
2369 }
2370 else if ((insn & 0xf0) == 0x90)
2371 {
2372 int reg = insn & 0xf;
2373
2374 /* Reserved cases. */
2375 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2376 return NULL;
2377
2378 /* Set SP from another register and mark VSP for reload. */
2379 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2380 vsp_valid = 0;
2381 }
2382 else if ((insn & 0xf0) == 0xa0)
2383 {
2384 int count = insn & 0x7;
2385 int pop_lr = (insn & 0x8) != 0;
2386 int i;
2387
2388 /* Pop r4..r[4+count]. */
2389 for (i = 0; i <= count; i++)
2390 {
2391 cache->saved_regs[4 + i].addr = vsp;
2392 vsp += 4;
2393 }
2394
2395 /* If indicated by flag, pop LR as well. */
2396 if (pop_lr)
2397 {
2398 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2399 vsp += 4;
2400 }
2401 }
2402 else if (insn == 0xb0)
2403 {
2404 /* We could only have updated PC by popping into it; if so, it
2405 will show up as address. Otherwise, copy LR into PC. */
2406 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2407 cache->saved_regs[ARM_PC_REGNUM]
2408 = cache->saved_regs[ARM_LR_REGNUM];
2409
2410 /* We're done. */
2411 break;
2412 }
2413 else if (insn == 0xb1)
2414 {
2415 int mask = *entry++;
2416 int i;
2417
2418 /* All-zero mask and mask >= 16 is "spare". */
2419 if (mask == 0 || mask >= 16)
2420 return NULL;
2421
2422 /* Pop r0..r3 under mask. */
2423 for (i = 0; i < 4; i++)
2424 if (mask & (1 << i))
2425 {
2426 cache->saved_regs[i].addr = vsp;
2427 vsp += 4;
2428 }
2429 }
2430 else if (insn == 0xb2)
2431 {
2432 ULONGEST offset = 0;
2433 unsigned shift = 0;
2434
2435 do
2436 {
2437 offset |= (*entry & 0x7f) << shift;
2438 shift += 7;
2439 }
2440 while (*entry++ & 0x80);
2441
2442 vsp += 0x204 + (offset << 2);
2443 }
2444 else if (insn == 0xb3)
2445 {
2446 int start = *entry >> 4;
2447 int count = (*entry++) & 0xf;
2448 int i;
2449
2450 /* Only registers D0..D15 are valid here. */
2451 if (start + count >= 16)
2452 return NULL;
2453
2454 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2455 for (i = 0; i <= count; i++)
2456 {
2457 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2458 vsp += 8;
2459 }
2460
2461 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2462 vsp += 4;
2463 }
2464 else if ((insn & 0xf8) == 0xb8)
2465 {
2466 int count = insn & 0x7;
2467 int i;
2468
2469 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2470 for (i = 0; i <= count; i++)
2471 {
2472 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2473 vsp += 8;
2474 }
2475
2476 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2477 vsp += 4;
2478 }
2479 else if (insn == 0xc6)
2480 {
2481 int start = *entry >> 4;
2482 int count = (*entry++) & 0xf;
2483 int i;
2484
2485 /* Only registers WR0..WR15 are valid. */
2486 if (start + count >= 16)
2487 return NULL;
2488
2489 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2490 for (i = 0; i <= count; i++)
2491 {
2492 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2493 vsp += 8;
2494 }
2495 }
2496 else if (insn == 0xc7)
2497 {
2498 int mask = *entry++;
2499 int i;
2500
2501 /* All-zero mask and mask >= 16 is "spare". */
2502 if (mask == 0 || mask >= 16)
2503 return NULL;
2504
2505 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2506 for (i = 0; i < 4; i++)
2507 if (mask & (1 << i))
2508 {
2509 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2510 vsp += 4;
2511 }
2512 }
2513 else if ((insn & 0xf8) == 0xc0)
2514 {
2515 int count = insn & 0x7;
2516 int i;
2517
2518 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2519 for (i = 0; i <= count; i++)
2520 {
2521 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2522 vsp += 8;
2523 }
2524 }
2525 else if (insn == 0xc8)
2526 {
2527 int start = *entry >> 4;
2528 int count = (*entry++) & 0xf;
2529 int i;
2530
2531 /* Only registers D0..D31 are valid. */
2532 if (start + count >= 16)
2533 return NULL;
2534
2535 /* Pop VFP double-precision registers
2536 D[16+start]..D[16+start+count]. */
2537 for (i = 0; i <= count; i++)
2538 {
2539 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2540 vsp += 8;
2541 }
2542 }
2543 else if (insn == 0xc9)
2544 {
2545 int start = *entry >> 4;
2546 int count = (*entry++) & 0xf;
2547 int i;
2548
2549 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2550 for (i = 0; i <= count; i++)
2551 {
2552 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2553 vsp += 8;
2554 }
2555 }
2556 else if ((insn & 0xf8) == 0xd0)
2557 {
2558 int count = insn & 0x7;
2559 int i;
2560
2561 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2562 for (i = 0; i <= count; i++)
2563 {
2564 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2565 vsp += 8;
2566 }
2567 }
2568 else
2569 {
2570 /* Everything else is "spare". */
2571 return NULL;
2572 }
2573 }
2574
2575 /* If we restore SP from a register, assume this was the frame register.
2576 Otherwise just fall back to SP as frame register. */
2577 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2578 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2579 else
2580 cache->framereg = ARM_SP_REGNUM;
2581
2582 /* Determine offset to previous frame. */
2583 cache->framesize
2584 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2585
2586 /* We already got the previous SP. */
2587 cache->prev_sp = vsp;
2588
2589 return cache;
2590}
2591
2592/* Unwinding via ARM exception table entries. Note that the sniffer
2593 already computes a filled-in prologue cache, which is then used
2594 with the same arm_prologue_this_id and arm_prologue_prev_register
2595 routines also used for prologue-parsing based unwinding. */
2596
2597static int
2598arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2599 struct frame_info *this_frame,
2600 void **this_prologue_cache)
2601{
2602 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2603 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2604 CORE_ADDR addr_in_block, exidx_region, func_start;
2605 struct arm_prologue_cache *cache;
2606 gdb_byte *entry;
2607
2608 /* See if we have an ARM exception table entry covering this address. */
2609 addr_in_block = get_frame_address_in_block (this_frame);
2610 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2611 if (!entry)
2612 return 0;
2613
2614 /* The ARM exception table does not describe unwind information
2615 for arbitrary PC values, but is guaranteed to be correct only
2616 at call sites. We have to decide here whether we want to use
2617 ARM exception table information for this frame, or fall back
2618 to using prologue parsing. (Note that if we have DWARF CFI,
2619 this sniffer isn't even called -- CFI is always preferred.)
2620
2621 Before we make this decision, however, we check whether we
2622 actually have *symbol* information for the current frame.
2623 If not, prologue parsing would not work anyway, so we might
2624 as well use the exception table and hope for the best. */
2625 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2626 {
2627 int exc_valid = 0;
2628
2629 /* If the next frame is "normal", we are at a call site in this
2630 frame, so exception information is guaranteed to be valid. */
2631 if (get_next_frame (this_frame)
2632 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2633 exc_valid = 1;
2634
2635 /* We also assume exception information is valid if we're currently
2636 blocked in a system call. The system library is supposed to
d9311bfa
AT
2637 ensure this, so that e.g. pthread cancellation works. */
2638 if (arm_frame_is_thumb (this_frame))
0e9e9abd 2639 {
7913a64c 2640 ULONGEST insn;
416dc9c6 2641
7913a64c
YQ
2642 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 2,
2643 2, byte_order_for_code, &insn)
d9311bfa
AT
2644 && (insn & 0xff00) == 0xdf00 /* svc */)
2645 exc_valid = 1;
0e9e9abd 2646 }
d9311bfa
AT
2647 else
2648 {
7913a64c 2649 ULONGEST insn;
416dc9c6 2650
7913a64c
YQ
2651 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 4,
2652 4, byte_order_for_code, &insn)
d9311bfa
AT
2653 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2654 exc_valid = 1;
2655 }
2656
0e9e9abd
UW
2657 /* Bail out if we don't know that exception information is valid. */
2658 if (!exc_valid)
2659 return 0;
2660
2661 /* The ARM exception index does not mark the *end* of the region
2662 covered by the entry, and some functions will not have any entry.
2663 To correctly recognize the end of the covered region, the linker
2664 should have inserted dummy records with a CANTUNWIND marker.
2665
2666 Unfortunately, current versions of GNU ld do not reliably do
2667 this, and thus we may have found an incorrect entry above.
2668 As a (temporary) sanity check, we only use the entry if it
2669 lies *within* the bounds of the function. Note that this check
2670 might reject perfectly valid entries that just happen to cover
2671 multiple functions; therefore this check ought to be removed
2672 once the linker is fixed. */
2673 if (func_start > exidx_region)
2674 return 0;
2675 }
2676
2677 /* Decode the list of unwinding instructions into a prologue cache.
2678 Note that this may fail due to e.g. a "refuse to unwind" code. */
2679 cache = arm_exidx_fill_cache (this_frame, entry);
2680 if (!cache)
2681 return 0;
2682
2683 *this_prologue_cache = cache;
2684 return 1;
2685}
2686
2687struct frame_unwind arm_exidx_unwind = {
2688 NORMAL_FRAME,
8fbca658 2689 default_frame_unwind_stop_reason,
0e9e9abd
UW
2690 arm_prologue_this_id,
2691 arm_prologue_prev_register,
2692 NULL,
2693 arm_exidx_unwind_sniffer
2694};
2695
779aa56f
YQ
2696static struct arm_prologue_cache *
2697arm_make_epilogue_frame_cache (struct frame_info *this_frame)
2698{
2699 struct arm_prologue_cache *cache;
779aa56f
YQ
2700 int reg;
2701
2702 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2703 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2704
2705 /* Still rely on the offset calculated from prologue. */
2706 arm_scan_prologue (this_frame, cache);
2707
2708 /* Since we are in epilogue, the SP has been restored. */
2709 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
2710
2711 /* Calculate actual addresses of saved registers using offsets
2712 determined by arm_scan_prologue. */
2713 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2714 if (trad_frame_addr_p (cache->saved_regs, reg))
2715 cache->saved_regs[reg].addr += cache->prev_sp;
2716
2717 return cache;
2718}
2719
2720/* Implementation of function hook 'this_id' in
2721 'struct frame_uwnind' for epilogue unwinder. */
2722
2723static void
2724arm_epilogue_frame_this_id (struct frame_info *this_frame,
2725 void **this_cache,
2726 struct frame_id *this_id)
2727{
2728 struct arm_prologue_cache *cache;
2729 CORE_ADDR pc, func;
2730
2731 if (*this_cache == NULL)
2732 *this_cache = arm_make_epilogue_frame_cache (this_frame);
2733 cache = (struct arm_prologue_cache *) *this_cache;
2734
2735 /* Use function start address as part of the frame ID. If we cannot
2736 identify the start address (due to missing symbol information),
2737 fall back to just using the current PC. */
2738 pc = get_frame_pc (this_frame);
2739 func = get_frame_func (this_frame);
fb3f3d25 2740 if (func == 0)
779aa56f
YQ
2741 func = pc;
2742
2743 (*this_id) = frame_id_build (cache->prev_sp, pc);
2744}
2745
2746/* Implementation of function hook 'prev_register' in
2747 'struct frame_uwnind' for epilogue unwinder. */
2748
2749static struct value *
2750arm_epilogue_frame_prev_register (struct frame_info *this_frame,
2751 void **this_cache, int regnum)
2752{
779aa56f
YQ
2753 if (*this_cache == NULL)
2754 *this_cache = arm_make_epilogue_frame_cache (this_frame);
779aa56f
YQ
2755
2756 return arm_prologue_prev_register (this_frame, this_cache, regnum);
2757}
2758
2759static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
2760 CORE_ADDR pc);
2761static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
2762 CORE_ADDR pc);
2763
2764/* Implementation of function hook 'sniffer' in
2765 'struct frame_uwnind' for epilogue unwinder. */
2766
2767static int
2768arm_epilogue_frame_sniffer (const struct frame_unwind *self,
2769 struct frame_info *this_frame,
2770 void **this_prologue_cache)
2771{
2772 if (frame_relative_level (this_frame) == 0)
2773 {
2774 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2775 CORE_ADDR pc = get_frame_pc (this_frame);
2776
2777 if (arm_frame_is_thumb (this_frame))
2778 return thumb_stack_frame_destroyed_p (gdbarch, pc);
2779 else
2780 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
2781 }
2782 else
2783 return 0;
2784}
2785
2786/* Frame unwinder from epilogue. */
2787
2788static const struct frame_unwind arm_epilogue_frame_unwind =
2789{
2790 NORMAL_FRAME,
2791 default_frame_unwind_stop_reason,
2792 arm_epilogue_frame_this_id,
2793 arm_epilogue_frame_prev_register,
2794 NULL,
2795 arm_epilogue_frame_sniffer,
2796};
2797
80d8d390
YQ
2798/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2799 trampoline, return the target PC. Otherwise return 0.
2800
2801 void call0a (char c, short s, int i, long l) {}
2802
2803 int main (void)
2804 {
2805 (*pointer_to_call0a) (c, s, i, l);
2806 }
2807
2808 Instead of calling a stub library function _call_via_xx (xx is
2809 the register name), GCC may inline the trampoline in the object
2810 file as below (register r2 has the address of call0a).
2811
2812 .global main
2813 .type main, %function
2814 ...
2815 bl .L1
2816 ...
2817 .size main, .-main
2818
2819 .L1:
2820 bx r2
2821
2822 The trampoline 'bx r2' doesn't belong to main. */
2823
2824static CORE_ADDR
2825arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2826{
2827 /* The heuristics of recognizing such trampoline is that FRAME is
2828 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2829 if (arm_frame_is_thumb (frame))
2830 {
2831 gdb_byte buf[2];
2832
2833 if (target_read_memory (pc, buf, 2) == 0)
2834 {
2835 struct gdbarch *gdbarch = get_frame_arch (frame);
2836 enum bfd_endian byte_order_for_code
2837 = gdbarch_byte_order_for_code (gdbarch);
2838 uint16_t insn
2839 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2840
2841 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2842 {
2843 CORE_ADDR dest
2844 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2845
2846 /* Clear the LSB so that gdb core sets step-resume
2847 breakpoint at the right address. */
2848 return UNMAKE_THUMB_ADDR (dest);
2849 }
2850 }
2851 }
2852
2853 return 0;
2854}
2855
909cf6ea 2856static struct arm_prologue_cache *
a262aec2 2857arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2858{
909cf6ea 2859 struct arm_prologue_cache *cache;
909cf6ea 2860
35d5d4ee 2861 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2862 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2863
a262aec2 2864 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2865
2866 return cache;
2867}
2868
2869/* Our frame ID for a stub frame is the current SP and LR. */
2870
2871static void
a262aec2 2872arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2873 void **this_cache,
2874 struct frame_id *this_id)
2875{
2876 struct arm_prologue_cache *cache;
2877
2878 if (*this_cache == NULL)
a262aec2 2879 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2880 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2881
a262aec2 2882 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2883}
2884
a262aec2
DJ
2885static int
2886arm_stub_unwind_sniffer (const struct frame_unwind *self,
2887 struct frame_info *this_frame,
2888 void **this_prologue_cache)
909cf6ea 2889{
93d42b30 2890 CORE_ADDR addr_in_block;
948f8e3d 2891 gdb_byte dummy[4];
18d18ac8
YQ
2892 CORE_ADDR pc, start_addr;
2893 const char *name;
909cf6ea 2894
a262aec2 2895 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2896 pc = get_frame_pc (this_frame);
3e5d3a5a 2897 if (in_plt_section (addr_in_block)
fc36e839
DE
2898 /* We also use the stub winder if the target memory is unreadable
2899 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2900 || target_read_memory (pc, dummy, 4) != 0)
2901 return 1;
2902
2903 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2904 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2905 return 1;
909cf6ea 2906
a262aec2 2907 return 0;
909cf6ea
DJ
2908}
2909
a262aec2
DJ
2910struct frame_unwind arm_stub_unwind = {
2911 NORMAL_FRAME,
8fbca658 2912 default_frame_unwind_stop_reason,
a262aec2
DJ
2913 arm_stub_this_id,
2914 arm_prologue_prev_register,
2915 NULL,
2916 arm_stub_unwind_sniffer
2917};
2918
2ae28aa9
YQ
2919/* Put here the code to store, into CACHE->saved_regs, the addresses
2920 of the saved registers of frame described by THIS_FRAME. CACHE is
2921 returned. */
2922
2923static struct arm_prologue_cache *
2924arm_m_exception_cache (struct frame_info *this_frame)
2925{
2926 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2927 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2928 struct arm_prologue_cache *cache;
2929 CORE_ADDR unwound_sp;
2930 LONGEST xpsr;
2931
2932 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2933 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2934
2935 unwound_sp = get_frame_register_unsigned (this_frame,
2936 ARM_SP_REGNUM);
2937
2938 /* The hardware saves eight 32-bit words, comprising xPSR,
2939 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2940 "B1.5.6 Exception entry behavior" in
2941 "ARMv7-M Architecture Reference Manual". */
2942 cache->saved_regs[0].addr = unwound_sp;
2943 cache->saved_regs[1].addr = unwound_sp + 4;
2944 cache->saved_regs[2].addr = unwound_sp + 8;
2945 cache->saved_regs[3].addr = unwound_sp + 12;
2946 cache->saved_regs[12].addr = unwound_sp + 16;
2947 cache->saved_regs[14].addr = unwound_sp + 20;
2948 cache->saved_regs[15].addr = unwound_sp + 24;
2949 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2950
2951 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2952 aligner between the top of the 32-byte stack frame and the
2953 previous context's stack pointer. */
2954 cache->prev_sp = unwound_sp + 32;
2955 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2956 && (xpsr & (1 << 9)) != 0)
2957 cache->prev_sp += 4;
2958
2959 return cache;
2960}
2961
2962/* Implementation of function hook 'this_id' in
2963 'struct frame_uwnind'. */
2964
2965static void
2966arm_m_exception_this_id (struct frame_info *this_frame,
2967 void **this_cache,
2968 struct frame_id *this_id)
2969{
2970 struct arm_prologue_cache *cache;
2971
2972 if (*this_cache == NULL)
2973 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2974 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2975
2976 /* Our frame ID for a stub frame is the current SP and LR. */
2977 *this_id = frame_id_build (cache->prev_sp,
2978 get_frame_pc (this_frame));
2979}
2980
2981/* Implementation of function hook 'prev_register' in
2982 'struct frame_uwnind'. */
2983
2984static struct value *
2985arm_m_exception_prev_register (struct frame_info *this_frame,
2986 void **this_cache,
2987 int prev_regnum)
2988{
2ae28aa9
YQ
2989 struct arm_prologue_cache *cache;
2990
2991 if (*this_cache == NULL)
2992 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2993 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2994
2995 /* The value was already reconstructed into PREV_SP. */
2996 if (prev_regnum == ARM_SP_REGNUM)
2997 return frame_unwind_got_constant (this_frame, prev_regnum,
2998 cache->prev_sp);
2999
3000 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3001 prev_regnum);
3002}
3003
3004/* Implementation of function hook 'sniffer' in
3005 'struct frame_uwnind'. */
3006
3007static int
3008arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3009 struct frame_info *this_frame,
3010 void **this_prologue_cache)
3011{
3012 CORE_ADDR this_pc = get_frame_pc (this_frame);
3013
3014 /* No need to check is_m; this sniffer is only registered for
3015 M-profile architectures. */
3016
ca90e760
FH
3017 /* Check if exception frame returns to a magic PC value. */
3018 return arm_m_addr_is_magic (this_pc);
2ae28aa9
YQ
3019}
3020
3021/* Frame unwinder for M-profile exceptions. */
3022
3023struct frame_unwind arm_m_exception_unwind =
3024{
3025 SIGTRAMP_FRAME,
3026 default_frame_unwind_stop_reason,
3027 arm_m_exception_this_id,
3028 arm_m_exception_prev_register,
3029 NULL,
3030 arm_m_exception_unwind_sniffer
3031};
3032
24de872b 3033static CORE_ADDR
a262aec2 3034arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
3035{
3036 struct arm_prologue_cache *cache;
3037
eb5492fa 3038 if (*this_cache == NULL)
a262aec2 3039 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 3040 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 3041
4be43953 3042 return cache->prev_sp - cache->framesize;
24de872b
DJ
3043}
3044
eb5492fa
DJ
3045struct frame_base arm_normal_base = {
3046 &arm_prologue_unwind,
3047 arm_normal_frame_base,
3048 arm_normal_frame_base,
3049 arm_normal_frame_base
3050};
3051
b39cc962
DJ
3052static struct value *
3053arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
3054 int regnum)
3055{
24568a2c 3056 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 3057 CORE_ADDR lr, cpsr;
9779414d 3058 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
3059
3060 switch (regnum)
3061 {
3062 case ARM_PC_REGNUM:
3063 /* The PC is normally copied from the return column, which
3064 describes saves of LR. However, that version may have an
3065 extra bit set to indicate Thumb state. The bit is not
3066 part of the PC. */
3067 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3068 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 3069 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
3070
3071 case ARM_PS_REGNUM:
3072 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 3073 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
3074 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3075 if (IS_THUMB_ADDR (lr))
9779414d 3076 cpsr |= t_bit;
b39cc962 3077 else
9779414d 3078 cpsr &= ~t_bit;
ca38c58e 3079 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
3080
3081 default:
3082 internal_error (__FILE__, __LINE__,
3083 _("Unexpected register %d"), regnum);
3084 }
3085}
3086
3087static void
3088arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3089 struct dwarf2_frame_state_reg *reg,
3090 struct frame_info *this_frame)
3091{
3092 switch (regnum)
3093 {
3094 case ARM_PC_REGNUM:
3095 case ARM_PS_REGNUM:
3096 reg->how = DWARF2_FRAME_REG_FN;
3097 reg->loc.fn = arm_dwarf2_prev_register;
3098 break;
3099 case ARM_SP_REGNUM:
3100 reg->how = DWARF2_FRAME_REG_CFA;
3101 break;
3102 }
3103}
3104
c9cf6e20 3105/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3106
3107static int
c9cf6e20 3108thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3109{
3110 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3111 unsigned int insn, insn2;
3112 int found_return = 0, found_stack_adjust = 0;
3113 CORE_ADDR func_start, func_end;
3114 CORE_ADDR scan_pc;
3115 gdb_byte buf[4];
3116
3117 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3118 return 0;
3119
3120 /* The epilogue is a sequence of instructions along the following lines:
3121
3122 - add stack frame size to SP or FP
3123 - [if frame pointer used] restore SP from FP
3124 - restore registers from SP [may include PC]
3125 - a return-type instruction [if PC wasn't already restored]
3126
3127 In a first pass, we scan forward from the current PC and verify the
3128 instructions we find as compatible with this sequence, ending in a
3129 return instruction.
3130
3131 However, this is not sufficient to distinguish indirect function calls
3132 within a function from indirect tail calls in the epilogue in some cases.
3133 Therefore, if we didn't already find any SP-changing instruction during
3134 forward scan, we add a backward scanning heuristic to ensure we actually
3135 are in the epilogue. */
3136
3137 scan_pc = pc;
3138 while (scan_pc < func_end && !found_return)
3139 {
3140 if (target_read_memory (scan_pc, buf, 2))
3141 break;
3142
3143 scan_pc += 2;
3144 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3145
3146 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3147 found_return = 1;
3148 else if (insn == 0x46f7) /* mov pc, lr */
3149 found_return = 1;
540314bd 3150 else if (thumb_instruction_restores_sp (insn))
4024ca99 3151 {
b7576e5c 3152 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3153 found_return = 1;
3154 }
db24da6d 3155 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3156 {
3157 if (target_read_memory (scan_pc, buf, 2))
3158 break;
3159
3160 scan_pc += 2;
3161 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3162
3163 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3164 {
4024ca99
UW
3165 if (insn2 & 0x8000) /* <registers> include PC. */
3166 found_return = 1;
3167 }
3168 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3169 && (insn2 & 0x0fff) == 0x0b04)
3170 {
4024ca99
UW
3171 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3172 found_return = 1;
3173 }
3174 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3175 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3176 ;
4024ca99
UW
3177 else
3178 break;
3179 }
3180 else
3181 break;
3182 }
3183
3184 if (!found_return)
3185 return 0;
3186
3187 /* Since any instruction in the epilogue sequence, with the possible
3188 exception of return itself, updates the stack pointer, we need to
3189 scan backwards for at most one instruction. Try either a 16-bit or
3190 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3191 too much about false positives. */
4024ca99 3192
6b65d1b6
YQ
3193 if (pc - 4 < func_start)
3194 return 0;
3195 if (target_read_memory (pc - 4, buf, 4))
3196 return 0;
4024ca99 3197
6b65d1b6
YQ
3198 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3199 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3200
3201 if (thumb_instruction_restores_sp (insn2))
3202 found_stack_adjust = 1;
3203 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3204 found_stack_adjust = 1;
3205 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3206 && (insn2 & 0x0fff) == 0x0b04)
3207 found_stack_adjust = 1;
3208 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3209 && (insn2 & 0x0e00) == 0x0a00)
3210 found_stack_adjust = 1;
4024ca99
UW
3211
3212 return found_stack_adjust;
3213}
3214
4024ca99 3215static int
c58b006a 3216arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3217{
3218 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3219 unsigned int insn;
f303bc3e 3220 int found_return;
4024ca99
UW
3221 CORE_ADDR func_start, func_end;
3222
4024ca99
UW
3223 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3224 return 0;
3225
3226 /* We are in the epilogue if the previous instruction was a stack
3227 adjustment and the next instruction is a possible return (bx, mov
3228 pc, or pop). We could have to scan backwards to find the stack
3229 adjustment, or forwards to find the return, but this is a decent
3230 approximation. First scan forwards. */
3231
3232 found_return = 0;
3233 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3234 if (bits (insn, 28, 31) != INST_NV)
3235 {
3236 if ((insn & 0x0ffffff0) == 0x012fff10)
3237 /* BX. */
3238 found_return = 1;
3239 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3240 /* MOV PC. */
3241 found_return = 1;
3242 else if ((insn & 0x0fff0000) == 0x08bd0000
3243 && (insn & 0x0000c000) != 0)
3244 /* POP (LDMIA), including PC or LR. */
3245 found_return = 1;
3246 }
3247
3248 if (!found_return)
3249 return 0;
3250
3251 /* Scan backwards. This is just a heuristic, so do not worry about
3252 false positives from mode changes. */
3253
3254 if (pc < func_start + 4)
3255 return 0;
3256
3257 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3258 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3259 return 1;
3260
3261 return 0;
3262}
3263
c58b006a
YQ
3264/* Implement the stack_frame_destroyed_p gdbarch method. */
3265
3266static int
3267arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3268{
3269 if (arm_pc_is_thumb (gdbarch, pc))
3270 return thumb_stack_frame_destroyed_p (gdbarch, pc);
3271 else
3272 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3273}
4024ca99 3274
2dd604e7
RE
3275/* When arguments must be pushed onto the stack, they go on in reverse
3276 order. The code below implements a FILO (stack) to do this. */
3277
3278struct stack_item
3279{
3280 int len;
3281 struct stack_item *prev;
7c543f7b 3282 gdb_byte *data;
2dd604e7
RE
3283};
3284
3285static struct stack_item *
df3b6708 3286push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3287{
3288 struct stack_item *si;
8d749320 3289 si = XNEW (struct stack_item);
7c543f7b 3290 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3291 si->len = len;
3292 si->prev = prev;
3293 memcpy (si->data, contents, len);
3294 return si;
3295}
3296
3297static struct stack_item *
3298pop_stack_item (struct stack_item *si)
3299{
3300 struct stack_item *dead = si;
3301 si = si->prev;
3302 xfree (dead->data);
3303 xfree (dead);
3304 return si;
3305}
3306
030197b4
AB
3307/* Implement the gdbarch type alignment method, overrides the generic
3308 alignment algorithm for anything that is arm specific. */
2af48f68 3309
030197b4
AB
3310static ULONGEST
3311arm_type_align (gdbarch *gdbarch, struct type *t)
2af48f68 3312{
2af48f68 3313 t = check_typedef (t);
030197b4 3314 if (TYPE_CODE (t) == TYPE_CODE_ARRAY && TYPE_VECTOR (t))
2af48f68 3315 {
030197b4
AB
3316 /* Use the natural alignment for vector types (the same for
3317 scalar type), but the maximum alignment is 64-bit. */
3318 if (TYPE_LENGTH (t) > 8)
3319 return 8;
c4312b19 3320 else
030197b4 3321 return TYPE_LENGTH (t);
2af48f68 3322 }
030197b4
AB
3323
3324 /* Allow the common code to calculate the alignment. */
3325 return 0;
2af48f68
PB
3326}
3327
90445bd3
DJ
3328/* Possible base types for a candidate for passing and returning in
3329 VFP registers. */
3330
3331enum arm_vfp_cprc_base_type
3332{
3333 VFP_CPRC_UNKNOWN,
3334 VFP_CPRC_SINGLE,
3335 VFP_CPRC_DOUBLE,
3336 VFP_CPRC_VEC64,
3337 VFP_CPRC_VEC128
3338};
3339
3340/* The length of one element of base type B. */
3341
3342static unsigned
3343arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3344{
3345 switch (b)
3346 {
3347 case VFP_CPRC_SINGLE:
3348 return 4;
3349 case VFP_CPRC_DOUBLE:
3350 return 8;
3351 case VFP_CPRC_VEC64:
3352 return 8;
3353 case VFP_CPRC_VEC128:
3354 return 16;
3355 default:
3356 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3357 (int) b);
3358 }
3359}
3360
3361/* The character ('s', 'd' or 'q') for the type of VFP register used
3362 for passing base type B. */
3363
3364static int
3365arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3366{
3367 switch (b)
3368 {
3369 case VFP_CPRC_SINGLE:
3370 return 's';
3371 case VFP_CPRC_DOUBLE:
3372 return 'd';
3373 case VFP_CPRC_VEC64:
3374 return 'd';
3375 case VFP_CPRC_VEC128:
3376 return 'q';
3377 default:
3378 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3379 (int) b);
3380 }
3381}
3382
3383/* Determine whether T may be part of a candidate for passing and
3384 returning in VFP registers, ignoring the limit on the total number
3385 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3386 classification of the first valid component found; if it is not
3387 VFP_CPRC_UNKNOWN, all components must have the same classification
3388 as *BASE_TYPE. If it is found that T contains a type not permitted
3389 for passing and returning in VFP registers, a type differently
3390 classified from *BASE_TYPE, or two types differently classified
3391 from each other, return -1, otherwise return the total number of
3392 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3393 array). Vector types are not currently supported, matching the
3394 generic AAPCS support. */
90445bd3
DJ
3395
3396static int
3397arm_vfp_cprc_sub_candidate (struct type *t,
3398 enum arm_vfp_cprc_base_type *base_type)
3399{
3400 t = check_typedef (t);
3401 switch (TYPE_CODE (t))
3402 {
3403 case TYPE_CODE_FLT:
3404 switch (TYPE_LENGTH (t))
3405 {
3406 case 4:
3407 if (*base_type == VFP_CPRC_UNKNOWN)
3408 *base_type = VFP_CPRC_SINGLE;
3409 else if (*base_type != VFP_CPRC_SINGLE)
3410 return -1;
3411 return 1;
3412
3413 case 8:
3414 if (*base_type == VFP_CPRC_UNKNOWN)
3415 *base_type = VFP_CPRC_DOUBLE;
3416 else if (*base_type != VFP_CPRC_DOUBLE)
3417 return -1;
3418 return 1;
3419
3420 default:
3421 return -1;
3422 }
3423 break;
3424
817e0957
YQ
3425 case TYPE_CODE_COMPLEX:
3426 /* Arguments of complex T where T is one of the types float or
3427 double get treated as if they are implemented as:
3428
3429 struct complexT
3430 {
3431 T real;
3432 T imag;
5f52445b
YQ
3433 };
3434
3435 */
817e0957
YQ
3436 switch (TYPE_LENGTH (t))
3437 {
3438 case 8:
3439 if (*base_type == VFP_CPRC_UNKNOWN)
3440 *base_type = VFP_CPRC_SINGLE;
3441 else if (*base_type != VFP_CPRC_SINGLE)
3442 return -1;
3443 return 2;
3444
3445 case 16:
3446 if (*base_type == VFP_CPRC_UNKNOWN)
3447 *base_type = VFP_CPRC_DOUBLE;
3448 else if (*base_type != VFP_CPRC_DOUBLE)
3449 return -1;
3450 return 2;
3451
3452 default:
3453 return -1;
3454 }
3455 break;
3456
90445bd3
DJ
3457 case TYPE_CODE_ARRAY:
3458 {
c4312b19 3459 if (TYPE_VECTOR (t))
90445bd3 3460 {
c4312b19
YQ
3461 /* A 64-bit or 128-bit containerized vector type are VFP
3462 CPRCs. */
3463 switch (TYPE_LENGTH (t))
3464 {
3465 case 8:
3466 if (*base_type == VFP_CPRC_UNKNOWN)
3467 *base_type = VFP_CPRC_VEC64;
3468 return 1;
3469 case 16:
3470 if (*base_type == VFP_CPRC_UNKNOWN)
3471 *base_type = VFP_CPRC_VEC128;
3472 return 1;
3473 default:
3474 return -1;
3475 }
3476 }
3477 else
3478 {
3479 int count;
3480 unsigned unitlen;
3481
3482 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3483 base_type);
3484 if (count == -1)
3485 return -1;
3486 if (TYPE_LENGTH (t) == 0)
3487 {
3488 gdb_assert (count == 0);
3489 return 0;
3490 }
3491 else if (count == 0)
3492 return -1;
3493 unitlen = arm_vfp_cprc_unit_length (*base_type);
3494 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3495 return TYPE_LENGTH (t) / unitlen;
90445bd3 3496 }
90445bd3
DJ
3497 }
3498 break;
3499
3500 case TYPE_CODE_STRUCT:
3501 {
3502 int count = 0;
3503 unsigned unitlen;
3504 int i;
3505 for (i = 0; i < TYPE_NFIELDS (t); i++)
3506 {
1040b979
YQ
3507 int sub_count = 0;
3508
3509 if (!field_is_static (&TYPE_FIELD (t, i)))
3510 sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3511 base_type);
90445bd3
DJ
3512 if (sub_count == -1)
3513 return -1;
3514 count += sub_count;
3515 }
3516 if (TYPE_LENGTH (t) == 0)
3517 {
3518 gdb_assert (count == 0);
3519 return 0;
3520 }
3521 else if (count == 0)
3522 return -1;
3523 unitlen = arm_vfp_cprc_unit_length (*base_type);
3524 if (TYPE_LENGTH (t) != unitlen * count)
3525 return -1;
3526 return count;
3527 }
3528
3529 case TYPE_CODE_UNION:
3530 {
3531 int count = 0;
3532 unsigned unitlen;
3533 int i;
3534 for (i = 0; i < TYPE_NFIELDS (t); i++)
3535 {
3536 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3537 base_type);
3538 if (sub_count == -1)
3539 return -1;
3540 count = (count > sub_count ? count : sub_count);
3541 }
3542 if (TYPE_LENGTH (t) == 0)
3543 {
3544 gdb_assert (count == 0);
3545 return 0;
3546 }
3547 else if (count == 0)
3548 return -1;
3549 unitlen = arm_vfp_cprc_unit_length (*base_type);
3550 if (TYPE_LENGTH (t) != unitlen * count)
3551 return -1;
3552 return count;
3553 }
3554
3555 default:
3556 break;
3557 }
3558
3559 return -1;
3560}
3561
3562/* Determine whether T is a VFP co-processor register candidate (CPRC)
3563 if passed to or returned from a non-variadic function with the VFP
3564 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3565 *BASE_TYPE to the base type for T and *COUNT to the number of
3566 elements of that base type before returning. */
3567
3568static int
3569arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3570 int *count)
3571{
3572 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3573 int c = arm_vfp_cprc_sub_candidate (t, &b);
3574 if (c <= 0 || c > 4)
3575 return 0;
3576 *base_type = b;
3577 *count = c;
3578 return 1;
3579}
3580
3581/* Return 1 if the VFP ABI should be used for passing arguments to and
3582 returning values from a function of type FUNC_TYPE, 0
3583 otherwise. */
3584
3585static int
3586arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3587{
3588 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3589 /* Variadic functions always use the base ABI. Assume that functions
3590 without debug info are not variadic. */
3591 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3592 return 0;
3593 /* The VFP ABI is only supported as a variant of AAPCS. */
3594 if (tdep->arm_abi != ARM_ABI_AAPCS)
3595 return 0;
3596 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3597}
3598
3599/* We currently only support passing parameters in integer registers, which
3600 conforms with GCC's default model, and VFP argument passing following
3601 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3602 we should probably support some of them based on the selected ABI. */
3603
3604static CORE_ADDR
7d9b040b 3605arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a 3606 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
cf84fa6b
AH
3607 struct value **args, CORE_ADDR sp,
3608 function_call_return_method return_method,
6a65450a 3609 CORE_ADDR struct_addr)
2dd604e7 3610{
e17a4113 3611 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3612 int argnum;
3613 int argreg;
3614 int nstack;
3615 struct stack_item *si = NULL;
90445bd3
DJ
3616 int use_vfp_abi;
3617 struct type *ftype;
3618 unsigned vfp_regs_free = (1 << 16) - 1;
3619
3620 /* Determine the type of this function and whether the VFP ABI
3621 applies. */
3622 ftype = check_typedef (value_type (function));
3623 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3624 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3625 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3626
6a65450a
AC
3627 /* Set the return address. For the ARM, the return breakpoint is
3628 always at BP_ADDR. */
9779414d 3629 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3630 bp_addr |= 1;
6a65450a 3631 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3632
3633 /* Walk through the list of args and determine how large a temporary
3634 stack is required. Need to take care here as structs may be
7a9dd1b2 3635 passed on the stack, and we have to push them. */
2dd604e7
RE
3636 nstack = 0;
3637
3638 argreg = ARM_A1_REGNUM;
3639 nstack = 0;
3640
2dd604e7
RE
3641 /* The struct_return pointer occupies the first parameter
3642 passing register. */
cf84fa6b 3643 if (return_method == return_method_struct)
2dd604e7
RE
3644 {
3645 if (arm_debug)
5af949e3 3646 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3647 gdbarch_register_name (gdbarch, argreg),
5af949e3 3648 paddress (gdbarch, struct_addr));
2dd604e7
RE
3649 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3650 argreg++;
3651 }
3652
3653 for (argnum = 0; argnum < nargs; argnum++)
3654 {
3655 int len;
3656 struct type *arg_type;
3657 struct type *target_type;
3658 enum type_code typecode;
8c6363cf 3659 const bfd_byte *val;
2af48f68 3660 int align;
90445bd3
DJ
3661 enum arm_vfp_cprc_base_type vfp_base_type;
3662 int vfp_base_count;
3663 int may_use_core_reg = 1;
2dd604e7 3664
df407dfe 3665 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3666 len = TYPE_LENGTH (arg_type);
3667 target_type = TYPE_TARGET_TYPE (arg_type);
3668 typecode = TYPE_CODE (arg_type);
8c6363cf 3669 val = value_contents (args[argnum]);
2dd604e7 3670
030197b4 3671 align = type_align (arg_type);
2af48f68 3672 /* Round alignment up to a whole number of words. */
f0452268
AH
3673 align = (align + ARM_INT_REGISTER_SIZE - 1)
3674 & ~(ARM_INT_REGISTER_SIZE - 1);
2af48f68
PB
3675 /* Different ABIs have different maximum alignments. */
3676 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3677 {
3678 /* The APCS ABI only requires word alignment. */
f0452268 3679 align = ARM_INT_REGISTER_SIZE;
2af48f68
PB
3680 }
3681 else
3682 {
3683 /* The AAPCS requires at most doubleword alignment. */
f0452268
AH
3684 if (align > ARM_INT_REGISTER_SIZE * 2)
3685 align = ARM_INT_REGISTER_SIZE * 2;
2af48f68
PB
3686 }
3687
90445bd3
DJ
3688 if (use_vfp_abi
3689 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3690 &vfp_base_count))
3691 {
3692 int regno;
3693 int unit_length;
3694 int shift;
3695 unsigned mask;
3696
3697 /* Because this is a CPRC it cannot go in a core register or
3698 cause a core register to be skipped for alignment.
3699 Either it goes in VFP registers and the rest of this loop
3700 iteration is skipped for this argument, or it goes on the
3701 stack (and the stack alignment code is correct for this
3702 case). */
3703 may_use_core_reg = 0;
3704
3705 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3706 shift = unit_length / 4;
3707 mask = (1 << (shift * vfp_base_count)) - 1;
3708 for (regno = 0; regno < 16; regno += shift)
3709 if (((vfp_regs_free >> regno) & mask) == mask)
3710 break;
3711
3712 if (regno < 16)
3713 {
3714 int reg_char;
3715 int reg_scaled;
3716 int i;
3717
3718 vfp_regs_free &= ~(mask << regno);
3719 reg_scaled = regno / shift;
3720 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3721 for (i = 0; i < vfp_base_count; i++)
3722 {
3723 char name_buf[4];
3724 int regnum;
58d6951d
DJ
3725 if (reg_char == 'q')
3726 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3727 val + i * unit_length);
58d6951d
DJ
3728 else
3729 {
8c042590
PM
3730 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3731 reg_char, reg_scaled + i);
58d6951d
DJ
3732 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3733 strlen (name_buf));
b66f5587 3734 regcache->cooked_write (regnum, val + i * unit_length);
58d6951d 3735 }
90445bd3
DJ
3736 }
3737 continue;
3738 }
3739 else
3740 {
3741 /* This CPRC could not go in VFP registers, so all VFP
3742 registers are now marked as used. */
3743 vfp_regs_free = 0;
3744 }
3745 }
3746
2af48f68
PB
3747 /* Push stack padding for dowubleword alignment. */
3748 if (nstack & (align - 1))
3749 {
f0452268
AH
3750 si = push_stack_item (si, val, ARM_INT_REGISTER_SIZE);
3751 nstack += ARM_INT_REGISTER_SIZE;
2af48f68
PB
3752 }
3753
3754 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3755 if (may_use_core_reg
3756 && argreg <= ARM_LAST_ARG_REGNUM
f0452268 3757 && align > ARM_INT_REGISTER_SIZE
2af48f68
PB
3758 && argreg & 1)
3759 argreg++;
3760
2dd604e7
RE
3761 /* If the argument is a pointer to a function, and it is a
3762 Thumb function, create a LOCAL copy of the value and set
3763 the THUMB bit in it. */
3764 if (TYPE_CODE_PTR == typecode
3765 && target_type != NULL
f96b8fa0 3766 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3767 {
e17a4113 3768 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3769 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3770 {
224c3ddb 3771 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3772 store_unsigned_integer (copy, len, byte_order,
e17a4113 3773 MAKE_THUMB_ADDR (regval));
8c6363cf 3774 val = copy;
2dd604e7
RE
3775 }
3776 }
3777
3778 /* Copy the argument to general registers or the stack in
3779 register-sized pieces. Large arguments are split between
3780 registers and stack. */
3781 while (len > 0)
3782 {
f0452268
AH
3783 int partial_len = len < ARM_INT_REGISTER_SIZE
3784 ? len : ARM_INT_REGISTER_SIZE;
ef9bd0b8
YQ
3785 CORE_ADDR regval
3786 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3787
90445bd3 3788 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3789 {
3790 /* The argument is being passed in a general purpose
3791 register. */
e17a4113 3792 if (byte_order == BFD_ENDIAN_BIG)
f0452268 3793 regval <<= (ARM_INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3794 if (arm_debug)
3795 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3796 argnum,
3797 gdbarch_register_name
2af46ca0 3798 (gdbarch, argreg),
f0452268 3799 phex (regval, ARM_INT_REGISTER_SIZE));
2dd604e7
RE
3800 regcache_cooked_write_unsigned (regcache, argreg, regval);
3801 argreg++;
3802 }
3803 else
3804 {
f0452268 3805 gdb_byte buf[ARM_INT_REGISTER_SIZE];
ef9bd0b8
YQ
3806
3807 memset (buf, 0, sizeof (buf));
3808 store_unsigned_integer (buf, partial_len, byte_order, regval);
3809
2dd604e7
RE
3810 /* Push the arguments onto the stack. */
3811 if (arm_debug)
3812 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3813 argnum, nstack);
f0452268
AH
3814 si = push_stack_item (si, buf, ARM_INT_REGISTER_SIZE);
3815 nstack += ARM_INT_REGISTER_SIZE;
2dd604e7
RE
3816 }
3817
3818 len -= partial_len;
3819 val += partial_len;
3820 }
3821 }
3822 /* If we have an odd number of words to push, then decrement the stack
3823 by one word now, so first stack argument will be dword aligned. */
3824 if (nstack & 4)
3825 sp -= 4;
3826
3827 while (si)
3828 {
3829 sp -= si->len;
3830 write_memory (sp, si->data, si->len);
3831 si = pop_stack_item (si);
3832 }
3833
3834 /* Finally, update teh SP register. */
3835 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3836
3837 return sp;
3838}
3839
f53f0d0b
PB
3840
3841/* Always align the frame to an 8-byte boundary. This is required on
3842 some platforms and harmless on the rest. */
3843
3844static CORE_ADDR
3845arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3846{
3847 /* Align the stack to eight bytes. */
3848 return sp & ~ (CORE_ADDR) 7;
3849}
3850
c906108c 3851static void
12b27276 3852print_fpu_flags (struct ui_file *file, int flags)
c906108c 3853{
c5aa993b 3854 if (flags & (1 << 0))
12b27276 3855 fputs_filtered ("IVO ", file);
c5aa993b 3856 if (flags & (1 << 1))
12b27276 3857 fputs_filtered ("DVZ ", file);
c5aa993b 3858 if (flags & (1 << 2))
12b27276 3859 fputs_filtered ("OFL ", file);
c5aa993b 3860 if (flags & (1 << 3))
12b27276 3861 fputs_filtered ("UFL ", file);
c5aa993b 3862 if (flags & (1 << 4))
12b27276
WN
3863 fputs_filtered ("INX ", file);
3864 fputc_filtered ('\n', file);
c906108c
SS
3865}
3866
5e74b15c
RE
3867/* Print interesting information about the floating point processor
3868 (if present) or emulator. */
34e8f22d 3869static void
d855c300 3870arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3871 struct frame_info *frame, const char *args)
c906108c 3872{
9c9acae0 3873 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3874 int type;
3875
3876 type = (status >> 24) & 127;
edefbb7c 3877 if (status & (1 << 31))
12b27276 3878 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 3879 else
12b27276 3880 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 3881 /* i18n: [floating point unit] mask */
12b27276
WN
3882 fputs_filtered (_("mask: "), file);
3883 print_fpu_flags (file, status >> 16);
edefbb7c 3884 /* i18n: [floating point unit] flags */
12b27276
WN
3885 fputs_filtered (_("flags: "), file);
3886 print_fpu_flags (file, status);
c906108c
SS
3887}
3888
27067745
UW
3889/* Construct the ARM extended floating point type. */
3890static struct type *
3891arm_ext_type (struct gdbarch *gdbarch)
3892{
3893 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3894
3895 if (!tdep->arm_ext_type)
3896 tdep->arm_ext_type
e9bb382b 3897 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3898 floatformats_arm_ext);
3899
3900 return tdep->arm_ext_type;
3901}
3902
58d6951d
DJ
3903static struct type *
3904arm_neon_double_type (struct gdbarch *gdbarch)
3905{
3906 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3907
3908 if (tdep->neon_double_type == NULL)
3909 {
3910 struct type *t, *elem;
3911
3912 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3913 TYPE_CODE_UNION);
3914 elem = builtin_type (gdbarch)->builtin_uint8;
3915 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3916 elem = builtin_type (gdbarch)->builtin_uint16;
3917 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3918 elem = builtin_type (gdbarch)->builtin_uint32;
3919 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3920 elem = builtin_type (gdbarch)->builtin_uint64;
3921 append_composite_type_field (t, "u64", elem);
3922 elem = builtin_type (gdbarch)->builtin_float;
3923 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3924 elem = builtin_type (gdbarch)->builtin_double;
3925 append_composite_type_field (t, "f64", elem);
3926
3927 TYPE_VECTOR (t) = 1;
3928 TYPE_NAME (t) = "neon_d";
3929 tdep->neon_double_type = t;
3930 }
3931
3932 return tdep->neon_double_type;
3933}
3934
3935/* FIXME: The vector types are not correctly ordered on big-endian
3936 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3937 bits of d0 - regardless of what unit size is being held in d0. So
3938 the offset of the first uint8 in d0 is 7, but the offset of the
3939 first float is 4. This code works as-is for little-endian
3940 targets. */
3941
3942static struct type *
3943arm_neon_quad_type (struct gdbarch *gdbarch)
3944{
3945 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3946
3947 if (tdep->neon_quad_type == NULL)
3948 {
3949 struct type *t, *elem;
3950
3951 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3952 TYPE_CODE_UNION);
3953 elem = builtin_type (gdbarch)->builtin_uint8;
3954 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3955 elem = builtin_type (gdbarch)->builtin_uint16;
3956 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3957 elem = builtin_type (gdbarch)->builtin_uint32;
3958 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3959 elem = builtin_type (gdbarch)->builtin_uint64;
3960 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3961 elem = builtin_type (gdbarch)->builtin_float;
3962 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3963 elem = builtin_type (gdbarch)->builtin_double;
3964 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3965
3966 TYPE_VECTOR (t) = 1;
3967 TYPE_NAME (t) = "neon_q";
3968 tdep->neon_quad_type = t;
3969 }
3970
3971 return tdep->neon_quad_type;
3972}
3973
34e8f22d
RE
3974/* Return the GDB type object for the "standard" data type of data in
3975 register N. */
3976
3977static struct type *
7a5ea0d4 3978arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3979{
58d6951d
DJ
3980 int num_regs = gdbarch_num_regs (gdbarch);
3981
3982 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3983 && regnum >= num_regs && regnum < num_regs + 32)
3984 return builtin_type (gdbarch)->builtin_float;
3985
3986 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3987 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3988 return arm_neon_quad_type (gdbarch);
3989
3990 /* If the target description has register information, we are only
3991 in this function so that we can override the types of
3992 double-precision registers for NEON. */
3993 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
3994 {
3995 struct type *t = tdesc_register_type (gdbarch, regnum);
3996
3997 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
3998 && TYPE_CODE (t) == TYPE_CODE_FLT
3999 && gdbarch_tdep (gdbarch)->have_neon)
4000 return arm_neon_double_type (gdbarch);
4001 else
4002 return t;
4003 }
4004
34e8f22d 4005 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
4006 {
4007 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
4008 return builtin_type (gdbarch)->builtin_void;
4009
4010 return arm_ext_type (gdbarch);
4011 }
e4c16157 4012 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 4013 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 4014 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 4015 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
4016 else if (regnum >= ARRAY_SIZE (arm_register_names))
4017 /* These registers are only supported on targets which supply
4018 an XML description. */
df4df182 4019 return builtin_type (gdbarch)->builtin_int0;
032758dc 4020 else
df4df182 4021 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
4022}
4023
ff6f572f
DJ
4024/* Map a DWARF register REGNUM onto the appropriate GDB register
4025 number. */
4026
4027static int
d3f73121 4028arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
4029{
4030 /* Core integer regs. */
4031 if (reg >= 0 && reg <= 15)
4032 return reg;
4033
4034 /* Legacy FPA encoding. These were once used in a way which
4035 overlapped with VFP register numbering, so their use is
4036 discouraged, but GDB doesn't support the ARM toolchain
4037 which used them for VFP. */
4038 if (reg >= 16 && reg <= 23)
4039 return ARM_F0_REGNUM + reg - 16;
4040
4041 /* New assignments for the FPA registers. */
4042 if (reg >= 96 && reg <= 103)
4043 return ARM_F0_REGNUM + reg - 96;
4044
4045 /* WMMX register assignments. */
4046 if (reg >= 104 && reg <= 111)
4047 return ARM_WCGR0_REGNUM + reg - 104;
4048
4049 if (reg >= 112 && reg <= 127)
4050 return ARM_WR0_REGNUM + reg - 112;
4051
4052 if (reg >= 192 && reg <= 199)
4053 return ARM_WC0_REGNUM + reg - 192;
4054
58d6951d
DJ
4055 /* VFP v2 registers. A double precision value is actually
4056 in d1 rather than s2, but the ABI only defines numbering
4057 for the single precision registers. This will "just work"
4058 in GDB for little endian targets (we'll read eight bytes,
4059 starting in s0 and then progressing to s1), but will be
4060 reversed on big endian targets with VFP. This won't
4061 be a problem for the new Neon quad registers; you're supposed
4062 to use DW_OP_piece for those. */
4063 if (reg >= 64 && reg <= 95)
4064 {
4065 char name_buf[4];
4066
8c042590 4067 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4068 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4069 strlen (name_buf));
4070 }
4071
4072 /* VFP v3 / Neon registers. This range is also used for VFP v2
4073 registers, except that it now describes d0 instead of s0. */
4074 if (reg >= 256 && reg <= 287)
4075 {
4076 char name_buf[4];
4077
8c042590 4078 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4079 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4080 strlen (name_buf));
4081 }
4082
ff6f572f
DJ
4083 return -1;
4084}
4085
26216b98
AC
4086/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4087static int
e7faf938 4088arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4089{
4090 int reg = regnum;
e7faf938 4091 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4092
ff6f572f
DJ
4093 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4094 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4095
4096 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4097 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4098
4099 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4100 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4101
26216b98
AC
4102 if (reg < NUM_GREGS)
4103 return SIM_ARM_R0_REGNUM + reg;
4104 reg -= NUM_GREGS;
4105
4106 if (reg < NUM_FREGS)
4107 return SIM_ARM_FP0_REGNUM + reg;
4108 reg -= NUM_FREGS;
4109
4110 if (reg < NUM_SREGS)
4111 return SIM_ARM_FPS_REGNUM + reg;
4112 reg -= NUM_SREGS;
4113
edefbb7c 4114 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4115}
34e8f22d 4116
d9311bfa
AT
4117/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4118 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4119 NULL if an error occurs. BUF is freed. */
c906108c 4120
d9311bfa
AT
4121static gdb_byte *
4122extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4123 int old_len, int new_len)
4124{
4125 gdb_byte *new_buf;
4126 int bytes_to_read = new_len - old_len;
c906108c 4127
d9311bfa
AT
4128 new_buf = (gdb_byte *) xmalloc (new_len);
4129 memcpy (new_buf + bytes_to_read, buf, old_len);
4130 xfree (buf);
198cd59d 4131 if (target_read_code (endaddr - new_len, new_buf, bytes_to_read) != 0)
d9311bfa
AT
4132 {
4133 xfree (new_buf);
4134 return NULL;
c906108c 4135 }
d9311bfa 4136 return new_buf;
c906108c
SS
4137}
4138
d9311bfa
AT
4139/* An IT block is at most the 2-byte IT instruction followed by
4140 four 4-byte instructions. The furthest back we must search to
4141 find an IT block that affects the current instruction is thus
4142 2 + 3 * 4 == 14 bytes. */
4143#define MAX_IT_BLOCK_PREFIX 14
177321bd 4144
d9311bfa
AT
4145/* Use a quick scan if there are more than this many bytes of
4146 code. */
4147#define IT_SCAN_THRESHOLD 32
177321bd 4148
d9311bfa
AT
4149/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4150 A breakpoint in an IT block may not be hit, depending on the
4151 condition flags. */
ad527d2e 4152static CORE_ADDR
d9311bfa 4153arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
c906108c 4154{
d9311bfa
AT
4155 gdb_byte *buf;
4156 char map_type;
4157 CORE_ADDR boundary, func_start;
4158 int buf_len;
4159 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4160 int i, any, last_it, last_it_count;
177321bd 4161
d9311bfa
AT
4162 /* If we are using BKPT breakpoints, none of this is necessary. */
4163 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4164 return bpaddr;
177321bd 4165
d9311bfa
AT
4166 /* ARM mode does not have this problem. */
4167 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4168 return bpaddr;
177321bd 4169
d9311bfa
AT
4170 /* We are setting a breakpoint in Thumb code that could potentially
4171 contain an IT block. The first step is to find how much Thumb
4172 code there is; we do not need to read outside of known Thumb
4173 sequences. */
4174 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4175 if (map_type == 0)
4176 /* Thumb-2 code must have mapping symbols to have a chance. */
4177 return bpaddr;
9dca5578 4178
d9311bfa 4179 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
177321bd 4180
d9311bfa
AT
4181 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4182 && func_start > boundary)
4183 boundary = func_start;
9dca5578 4184
d9311bfa
AT
4185 /* Search for a candidate IT instruction. We have to do some fancy
4186 footwork to distinguish a real IT instruction from the second
4187 half of a 32-bit instruction, but there is no need for that if
4188 there's no candidate. */
325fac50 4189 buf_len = std::min (bpaddr - boundary, (CORE_ADDR) MAX_IT_BLOCK_PREFIX);
d9311bfa
AT
4190 if (buf_len == 0)
4191 /* No room for an IT instruction. */
4192 return bpaddr;
c906108c 4193
d9311bfa 4194 buf = (gdb_byte *) xmalloc (buf_len);
198cd59d 4195 if (target_read_code (bpaddr - buf_len, buf, buf_len) != 0)
d9311bfa
AT
4196 return bpaddr;
4197 any = 0;
4198 for (i = 0; i < buf_len; i += 2)
c906108c 4199 {
d9311bfa
AT
4200 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4201 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
25b41d01 4202 {
d9311bfa
AT
4203 any = 1;
4204 break;
25b41d01 4205 }
c906108c 4206 }
d9311bfa
AT
4207
4208 if (any == 0)
c906108c 4209 {
d9311bfa
AT
4210 xfree (buf);
4211 return bpaddr;
f9d67f43
DJ
4212 }
4213
4214 /* OK, the code bytes before this instruction contain at least one
4215 halfword which resembles an IT instruction. We know that it's
4216 Thumb code, but there are still two possibilities. Either the
4217 halfword really is an IT instruction, or it is the second half of
4218 a 32-bit Thumb instruction. The only way we can tell is to
4219 scan forwards from a known instruction boundary. */
4220 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4221 {
4222 int definite;
4223
4224 /* There's a lot of code before this instruction. Start with an
4225 optimistic search; it's easy to recognize halfwords that can
4226 not be the start of a 32-bit instruction, and use that to
4227 lock on to the instruction boundaries. */
4228 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4229 if (buf == NULL)
4230 return bpaddr;
4231 buf_len = IT_SCAN_THRESHOLD;
4232
4233 definite = 0;
4234 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4235 {
4236 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4237 if (thumb_insn_size (inst1) == 2)
4238 {
4239 definite = 1;
4240 break;
4241 }
4242 }
4243
4244 /* At this point, if DEFINITE, BUF[I] is the first place we
4245 are sure that we know the instruction boundaries, and it is far
4246 enough from BPADDR that we could not miss an IT instruction
4247 affecting BPADDR. If ! DEFINITE, give up - start from a
4248 known boundary. */
4249 if (! definite)
4250 {
0963b4bd
MS
4251 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4252 bpaddr - boundary);
f9d67f43
DJ
4253 if (buf == NULL)
4254 return bpaddr;
4255 buf_len = bpaddr - boundary;
4256 i = 0;
4257 }
4258 }
4259 else
4260 {
4261 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4262 if (buf == NULL)
4263 return bpaddr;
4264 buf_len = bpaddr - boundary;
4265 i = 0;
4266 }
4267
4268 /* Scan forwards. Find the last IT instruction before BPADDR. */
4269 last_it = -1;
4270 last_it_count = 0;
4271 while (i < buf_len)
4272 {
4273 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4274 last_it_count--;
4275 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4276 {
4277 last_it = i;
4278 if (inst1 & 0x0001)
4279 last_it_count = 4;
4280 else if (inst1 & 0x0002)
4281 last_it_count = 3;
4282 else if (inst1 & 0x0004)
4283 last_it_count = 2;
4284 else
4285 last_it_count = 1;
4286 }
4287 i += thumb_insn_size (inst1);
4288 }
4289
4290 xfree (buf);
4291
4292 if (last_it == -1)
4293 /* There wasn't really an IT instruction after all. */
4294 return bpaddr;
4295
4296 if (last_it_count < 1)
4297 /* It was too far away. */
4298 return bpaddr;
4299
4300 /* This really is a trouble spot. Move the breakpoint to the IT
4301 instruction. */
4302 return bpaddr - buf_len + last_it;
4303}
4304
cca44b1b 4305/* ARM displaced stepping support.
c906108c 4306
cca44b1b 4307 Generally ARM displaced stepping works as follows:
c906108c 4308
cca44b1b 4309 1. When an instruction is to be single-stepped, it is first decoded by
2ba163c8
SM
4310 arm_process_displaced_insn. Depending on the type of instruction, it is
4311 then copied to a scratch location, possibly in a modified form. The
4312 copy_* set of functions performs such modification, as necessary. A
4313 breakpoint is placed after the modified instruction in the scratch space
4314 to return control to GDB. Note in particular that instructions which
4315 modify the PC will no longer do so after modification.
c5aa993b 4316
cca44b1b
JB
4317 2. The instruction is single-stepped, by setting the PC to the scratch
4318 location address, and resuming. Control returns to GDB when the
4319 breakpoint is hit.
c5aa993b 4320
cca44b1b
JB
4321 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4322 function used for the current instruction. This function's job is to
4323 put the CPU/memory state back to what it would have been if the
4324 instruction had been executed unmodified in its original location. */
c5aa993b 4325
cca44b1b
JB
4326/* NOP instruction (mov r0, r0). */
4327#define ARM_NOP 0xe1a00000
34518530 4328#define THUMB_NOP 0x4600
cca44b1b
JB
4329
4330/* Helper for register reads for displaced stepping. In particular, this
4331 returns the PC as it would be seen by the instruction at its original
4332 location. */
4333
4334ULONGEST
cfba9872 4335displaced_read_reg (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4336 int regno)
cca44b1b
JB
4337{
4338 ULONGEST ret;
36073a92 4339 CORE_ADDR from = dsc->insn_addr;
cca44b1b 4340
bf9f652a 4341 if (regno == ARM_PC_REGNUM)
cca44b1b 4342 {
4db71c0b
YQ
4343 /* Compute pipeline offset:
4344 - When executing an ARM instruction, PC reads as the address of the
4345 current instruction plus 8.
4346 - When executing a Thumb instruction, PC reads as the address of the
4347 current instruction plus 4. */
4348
36073a92 4349 if (!dsc->is_thumb)
4db71c0b
YQ
4350 from += 8;
4351 else
4352 from += 4;
4353
cca44b1b
JB
4354 if (debug_displaced)
4355 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
4356 (unsigned long) from);
4357 return (ULONGEST) from;
cca44b1b 4358 }
c906108c 4359 else
cca44b1b
JB
4360 {
4361 regcache_cooked_read_unsigned (regs, regno, &ret);
4362 if (debug_displaced)
4363 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4364 regno, (unsigned long) ret);
4365 return ret;
4366 }
c906108c
SS
4367}
4368
cca44b1b
JB
4369static int
4370displaced_in_arm_mode (struct regcache *regs)
4371{
4372 ULONGEST ps;
ac7936df 4373 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
66e810cd 4374
cca44b1b 4375 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 4376
9779414d 4377 return (ps & t_bit) == 0;
cca44b1b 4378}
66e810cd 4379
cca44b1b 4380/* Write to the PC as from a branch instruction. */
c906108c 4381
cca44b1b 4382static void
cfba9872 4383branch_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4384 ULONGEST val)
c906108c 4385{
36073a92 4386 if (!dsc->is_thumb)
cca44b1b
JB
4387 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4388 architecture versions < 6. */
0963b4bd
MS
4389 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4390 val & ~(ULONGEST) 0x3);
cca44b1b 4391 else
0963b4bd
MS
4392 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4393 val & ~(ULONGEST) 0x1);
cca44b1b 4394}
66e810cd 4395
cca44b1b
JB
4396/* Write to the PC as from a branch-exchange instruction. */
4397
4398static void
4399bx_write_pc (struct regcache *regs, ULONGEST val)
4400{
4401 ULONGEST ps;
ac7936df 4402 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
cca44b1b
JB
4403
4404 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4405
4406 if ((val & 1) == 1)
c906108c 4407 {
9779414d 4408 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
4409 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4410 }
4411 else if ((val & 2) == 0)
4412 {
9779414d 4413 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4414 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
4415 }
4416 else
4417 {
cca44b1b
JB
4418 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4419 mode, align dest to 4 bytes). */
4420 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 4421 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4422 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
4423 }
4424}
ed9a39eb 4425
cca44b1b 4426/* Write to the PC as if from a load instruction. */
ed9a39eb 4427
34e8f22d 4428static void
cfba9872 4429load_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4430 ULONGEST val)
ed9a39eb 4431{
cca44b1b
JB
4432 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4433 bx_write_pc (regs, val);
4434 else
36073a92 4435 branch_write_pc (regs, dsc, val);
cca44b1b 4436}
be8626e0 4437
cca44b1b
JB
4438/* Write to the PC as if from an ALU instruction. */
4439
4440static void
cfba9872 4441alu_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4442 ULONGEST val)
cca44b1b 4443{
36073a92 4444 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
4445 bx_write_pc (regs, val);
4446 else
36073a92 4447 branch_write_pc (regs, dsc, val);
cca44b1b
JB
4448}
4449
4450/* Helper for writing to registers for displaced stepping. Writing to the PC
4451 has a varying effects depending on the instruction which does the write:
4452 this is controlled by the WRITE_PC argument. */
4453
4454void
cfba9872 4455displaced_write_reg (struct regcache *regs, arm_displaced_step_closure *dsc,
cca44b1b
JB
4456 int regno, ULONGEST val, enum pc_write_style write_pc)
4457{
bf9f652a 4458 if (regno == ARM_PC_REGNUM)
08216dd7 4459 {
cca44b1b
JB
4460 if (debug_displaced)
4461 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4462 (unsigned long) val);
4463 switch (write_pc)
08216dd7 4464 {
cca44b1b 4465 case BRANCH_WRITE_PC:
36073a92 4466 branch_write_pc (regs, dsc, val);
08216dd7
RE
4467 break;
4468
cca44b1b
JB
4469 case BX_WRITE_PC:
4470 bx_write_pc (regs, val);
4471 break;
4472
4473 case LOAD_WRITE_PC:
36073a92 4474 load_write_pc (regs, dsc, val);
cca44b1b
JB
4475 break;
4476
4477 case ALU_WRITE_PC:
36073a92 4478 alu_write_pc (regs, dsc, val);
cca44b1b
JB
4479 break;
4480
4481 case CANNOT_WRITE_PC:
4482 warning (_("Instruction wrote to PC in an unexpected way when "
4483 "single-stepping"));
08216dd7
RE
4484 break;
4485
4486 default:
97b9747c
JB
4487 internal_error (__FILE__, __LINE__,
4488 _("Invalid argument to displaced_write_reg"));
08216dd7 4489 }
b508a996 4490
cca44b1b 4491 dsc->wrote_to_pc = 1;
b508a996 4492 }
ed9a39eb 4493 else
b508a996 4494 {
cca44b1b
JB
4495 if (debug_displaced)
4496 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4497 regno, (unsigned long) val);
4498 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 4499 }
34e8f22d
RE
4500}
4501
cca44b1b
JB
4502/* This function is used to concisely determine if an instruction INSN
4503 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
4504 corresponding fields of BITMASK set to 0b1111. The function
4505 returns return 1 if any of these fields in INSN reference the PC
4506 (also 0b1111, r15), else it returns 0. */
67255d04
RE
4507
4508static int
cca44b1b 4509insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 4510{
cca44b1b 4511 uint32_t lowbit = 1;
67255d04 4512
cca44b1b
JB
4513 while (bitmask != 0)
4514 {
4515 uint32_t mask;
44e1a9eb 4516
cca44b1b
JB
4517 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4518 ;
67255d04 4519
cca44b1b
JB
4520 if (!lowbit)
4521 break;
67255d04 4522
cca44b1b 4523 mask = lowbit * 0xf;
67255d04 4524
cca44b1b
JB
4525 if ((insn & mask) == mask)
4526 return 1;
4527
4528 bitmask &= ~mask;
67255d04
RE
4529 }
4530
cca44b1b
JB
4531 return 0;
4532}
2af48f68 4533
cca44b1b
JB
4534/* The simplest copy function. Many instructions have the same effect no
4535 matter what address they are executed at: in those cases, use this. */
67255d04 4536
cca44b1b 4537static int
7ff120b4 4538arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 4539 const char *iname, arm_displaced_step_closure *dsc)
cca44b1b
JB
4540{
4541 if (debug_displaced)
4542 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4543 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4544 iname);
67255d04 4545
cca44b1b 4546 dsc->modinsn[0] = insn;
67255d04 4547
cca44b1b
JB
4548 return 0;
4549}
4550
34518530
YQ
4551static int
4552thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4553 uint16_t insn2, const char *iname,
cfba9872 4554 arm_displaced_step_closure *dsc)
34518530
YQ
4555{
4556 if (debug_displaced)
4557 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4558 "opcode/class '%s' unmodified\n", insn1, insn2,
4559 iname);
4560
4561 dsc->modinsn[0] = insn1;
4562 dsc->modinsn[1] = insn2;
4563 dsc->numinsns = 2;
4564
4565 return 0;
4566}
4567
4568/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4569 modification. */
4570static int
615234c1 4571thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
34518530 4572 const char *iname,
cfba9872 4573 arm_displaced_step_closure *dsc)
34518530
YQ
4574{
4575 if (debug_displaced)
4576 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4577 "opcode/class '%s' unmodified\n", insn,
4578 iname);
4579
4580 dsc->modinsn[0] = insn;
4581
4582 return 0;
4583}
4584
cca44b1b
JB
4585/* Preload instructions with immediate offset. */
4586
4587static void
6e39997a 4588cleanup_preload (struct gdbarch *gdbarch,
cfba9872 4589 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
4590{
4591 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4592 if (!dsc->u.preload.immed)
4593 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4594}
4595
7ff120b4
YQ
4596static void
4597install_preload (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4598 arm_displaced_step_closure *dsc, unsigned int rn)
cca44b1b 4599{
cca44b1b 4600 ULONGEST rn_val;
cca44b1b
JB
4601 /* Preload instructions:
4602
4603 {pli/pld} [rn, #+/-imm]
4604 ->
4605 {pli/pld} [r0, #+/-imm]. */
4606
36073a92
YQ
4607 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4608 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 4609 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
4610 dsc->u.preload.immed = 1;
4611
cca44b1b 4612 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
4613}
4614
cca44b1b 4615static int
7ff120b4 4616arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 4617 arm_displaced_step_closure *dsc)
cca44b1b
JB
4618{
4619 unsigned int rn = bits (insn, 16, 19);
cca44b1b 4620
7ff120b4
YQ
4621 if (!insn_references_pc (insn, 0x000f0000ul))
4622 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
4623
4624 if (debug_displaced)
4625 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4626 (unsigned long) insn);
4627
7ff120b4
YQ
4628 dsc->modinsn[0] = insn & 0xfff0ffff;
4629
4630 install_preload (gdbarch, regs, dsc, rn);
4631
4632 return 0;
4633}
4634
34518530
YQ
4635static int
4636thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
cfba9872 4637 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
4638{
4639 unsigned int rn = bits (insn1, 0, 3);
4640 unsigned int u_bit = bit (insn1, 7);
4641 int imm12 = bits (insn2, 0, 11);
4642 ULONGEST pc_val;
4643
4644 if (rn != ARM_PC_REGNUM)
4645 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4646
4647 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4648 PLD (literal) Encoding T1. */
4649 if (debug_displaced)
4650 fprintf_unfiltered (gdb_stdlog,
4651 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4652 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4653 imm12);
4654
4655 if (!u_bit)
4656 imm12 = -1 * imm12;
4657
4658 /* Rewrite instruction {pli/pld} PC imm12 into:
4659 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4660
4661 {pli/pld} [r0, r1]
4662
4663 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4664
4665 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4666 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4667
4668 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4669
4670 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4671 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4672 dsc->u.preload.immed = 0;
4673
4674 /* {pli/pld} [r0, r1] */
4675 dsc->modinsn[0] = insn1 & 0xfff0;
4676 dsc->modinsn[1] = 0xf001;
4677 dsc->numinsns = 2;
4678
4679 dsc->cleanup = &cleanup_preload;
4680 return 0;
4681}
4682
7ff120b4
YQ
4683/* Preload instructions with register offset. */
4684
4685static void
4686install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4687 arm_displaced_step_closure *dsc, unsigned int rn,
7ff120b4
YQ
4688 unsigned int rm)
4689{
4690 ULONGEST rn_val, rm_val;
4691
cca44b1b
JB
4692 /* Preload register-offset instructions:
4693
4694 {pli/pld} [rn, rm {, shift}]
4695 ->
4696 {pli/pld} [r0, r1 {, shift}]. */
4697
36073a92
YQ
4698 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4699 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4700 rn_val = displaced_read_reg (regs, dsc, rn);
4701 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
4702 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4703 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
4704 dsc->u.preload.immed = 0;
4705
cca44b1b 4706 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
4707}
4708
4709static int
4710arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4711 struct regcache *regs,
cfba9872 4712 arm_displaced_step_closure *dsc)
7ff120b4
YQ
4713{
4714 unsigned int rn = bits (insn, 16, 19);
4715 unsigned int rm = bits (insn, 0, 3);
4716
4717
4718 if (!insn_references_pc (insn, 0x000f000ful))
4719 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4720
4721 if (debug_displaced)
4722 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4723 (unsigned long) insn);
4724
4725 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 4726
7ff120b4 4727 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
4728 return 0;
4729}
4730
4731/* Copy/cleanup coprocessor load and store instructions. */
4732
4733static void
6e39997a 4734cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b 4735 struct regcache *regs,
cfba9872 4736 arm_displaced_step_closure *dsc)
cca44b1b 4737{
36073a92 4738 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
4739
4740 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4741
4742 if (dsc->u.ldst.writeback)
4743 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4744}
4745
7ff120b4
YQ
4746static void
4747install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4748 arm_displaced_step_closure *dsc,
7ff120b4 4749 int writeback, unsigned int rn)
cca44b1b 4750{
cca44b1b 4751 ULONGEST rn_val;
cca44b1b 4752
cca44b1b
JB
4753 /* Coprocessor load/store instructions:
4754
4755 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4756 ->
4757 {stc/stc2} [r0, #+/-imm].
4758
4759 ldc/ldc2 are handled identically. */
4760
36073a92
YQ
4761 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4762 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
4763 /* PC should be 4-byte aligned. */
4764 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
4765 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4766
7ff120b4 4767 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
4768 dsc->u.ldst.rn = rn;
4769
7ff120b4
YQ
4770 dsc->cleanup = &cleanup_copro_load_store;
4771}
4772
4773static int
4774arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4775 struct regcache *regs,
cfba9872 4776 arm_displaced_step_closure *dsc)
7ff120b4
YQ
4777{
4778 unsigned int rn = bits (insn, 16, 19);
4779
4780 if (!insn_references_pc (insn, 0x000f0000ul))
4781 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4782
4783 if (debug_displaced)
4784 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4785 "load/store insn %.8lx\n", (unsigned long) insn);
4786
cca44b1b
JB
4787 dsc->modinsn[0] = insn & 0xfff0ffff;
4788
7ff120b4 4789 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
4790
4791 return 0;
4792}
4793
34518530
YQ
4794static int
4795thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4796 uint16_t insn2, struct regcache *regs,
cfba9872 4797 arm_displaced_step_closure *dsc)
34518530
YQ
4798{
4799 unsigned int rn = bits (insn1, 0, 3);
4800
4801 if (rn != ARM_PC_REGNUM)
4802 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4803 "copro load/store", dsc);
4804
4805 if (debug_displaced)
4806 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4807 "load/store insn %.4x%.4x\n", insn1, insn2);
4808
4809 dsc->modinsn[0] = insn1 & 0xfff0;
4810 dsc->modinsn[1] = insn2;
4811 dsc->numinsns = 2;
4812
4813 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4814 doesn't support writeback, so pass 0. */
4815 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4816
4817 return 0;
4818}
4819
cca44b1b
JB
4820/* Clean up branch instructions (actually perform the branch, by setting
4821 PC). */
4822
4823static void
6e39997a 4824cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4825 arm_displaced_step_closure *dsc)
cca44b1b 4826{
36073a92 4827 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
4828 int branch_taken = condition_true (dsc->u.branch.cond, status);
4829 enum pc_write_style write_pc = dsc->u.branch.exchange
4830 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4831
4832 if (!branch_taken)
4833 return;
4834
4835 if (dsc->u.branch.link)
4836 {
8c8dba6d
YQ
4837 /* The value of LR should be the next insn of current one. In order
4838 not to confuse logic hanlding later insn `bx lr', if current insn mode
4839 is Thumb, the bit 0 of LR value should be set to 1. */
4840 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4841
4842 if (dsc->is_thumb)
4843 next_insn_addr |= 0x1;
4844
4845 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4846 CANNOT_WRITE_PC);
cca44b1b
JB
4847 }
4848
bf9f652a 4849 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
4850}
4851
4852/* Copy B/BL/BLX instructions with immediate destinations. */
4853
7ff120b4
YQ
4854static void
4855install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4856 arm_displaced_step_closure *dsc,
7ff120b4
YQ
4857 unsigned int cond, int exchange, int link, long offset)
4858{
4859 /* Implement "BL<cond> <label>" as:
4860
4861 Preparation: cond <- instruction condition
4862 Insn: mov r0, r0 (nop)
4863 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4864
4865 B<cond> similar, but don't set r14 in cleanup. */
4866
4867 dsc->u.branch.cond = cond;
4868 dsc->u.branch.link = link;
4869 dsc->u.branch.exchange = exchange;
4870
2b16b2e3
YQ
4871 dsc->u.branch.dest = dsc->insn_addr;
4872 if (link && exchange)
4873 /* For BLX, offset is computed from the Align (PC, 4). */
4874 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4875
7ff120b4 4876 if (dsc->is_thumb)
2b16b2e3 4877 dsc->u.branch.dest += 4 + offset;
7ff120b4 4878 else
2b16b2e3 4879 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
4880
4881 dsc->cleanup = &cleanup_branch;
4882}
cca44b1b 4883static int
7ff120b4 4884arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 4885 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
4886{
4887 unsigned int cond = bits (insn, 28, 31);
4888 int exchange = (cond == 0xf);
4889 int link = exchange || bit (insn, 24);
cca44b1b
JB
4890 long offset;
4891
4892 if (debug_displaced)
4893 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4894 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4895 (unsigned long) insn);
cca44b1b
JB
4896 if (exchange)
4897 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4898 then arrange the switch into Thumb mode. */
4899 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4900 else
4901 offset = bits (insn, 0, 23) << 2;
4902
4903 if (bit (offset, 25))
4904 offset = offset | ~0x3ffffff;
4905
cca44b1b
JB
4906 dsc->modinsn[0] = ARM_NOP;
4907
7ff120b4 4908 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
4909 return 0;
4910}
4911
34518530
YQ
4912static int
4913thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4914 uint16_t insn2, struct regcache *regs,
cfba9872 4915 arm_displaced_step_closure *dsc)
34518530
YQ
4916{
4917 int link = bit (insn2, 14);
4918 int exchange = link && !bit (insn2, 12);
4919 int cond = INST_AL;
4920 long offset = 0;
4921 int j1 = bit (insn2, 13);
4922 int j2 = bit (insn2, 11);
4923 int s = sbits (insn1, 10, 10);
4924 int i1 = !(j1 ^ bit (insn1, 10));
4925 int i2 = !(j2 ^ bit (insn1, 10));
4926
4927 if (!link && !exchange) /* B */
4928 {
4929 offset = (bits (insn2, 0, 10) << 1);
4930 if (bit (insn2, 12)) /* Encoding T4 */
4931 {
4932 offset |= (bits (insn1, 0, 9) << 12)
4933 | (i2 << 22)
4934 | (i1 << 23)
4935 | (s << 24);
4936 cond = INST_AL;
4937 }
4938 else /* Encoding T3 */
4939 {
4940 offset |= (bits (insn1, 0, 5) << 12)
4941 | (j1 << 18)
4942 | (j2 << 19)
4943 | (s << 20);
4944 cond = bits (insn1, 6, 9);
4945 }
4946 }
4947 else
4948 {
4949 offset = (bits (insn1, 0, 9) << 12);
4950 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
4951 offset |= exchange ?
4952 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
4953 }
4954
4955 if (debug_displaced)
4956 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
4957 "%.4x %.4x with offset %.8lx\n",
4958 link ? (exchange) ? "blx" : "bl" : "b",
4959 insn1, insn2, offset);
4960
4961 dsc->modinsn[0] = THUMB_NOP;
4962
4963 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4964 return 0;
4965}
4966
4967/* Copy B Thumb instructions. */
4968static int
615234c1 4969thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
cfba9872 4970 arm_displaced_step_closure *dsc)
34518530
YQ
4971{
4972 unsigned int cond = 0;
4973 int offset = 0;
4974 unsigned short bit_12_15 = bits (insn, 12, 15);
4975 CORE_ADDR from = dsc->insn_addr;
4976
4977 if (bit_12_15 == 0xd)
4978 {
4979 /* offset = SignExtend (imm8:0, 32) */
4980 offset = sbits ((insn << 1), 0, 8);
4981 cond = bits (insn, 8, 11);
4982 }
4983 else if (bit_12_15 == 0xe) /* Encoding T2 */
4984 {
4985 offset = sbits ((insn << 1), 0, 11);
4986 cond = INST_AL;
4987 }
4988
4989 if (debug_displaced)
4990 fprintf_unfiltered (gdb_stdlog,
4991 "displaced: copying b immediate insn %.4x "
4992 "with offset %d\n", insn, offset);
4993
4994 dsc->u.branch.cond = cond;
4995 dsc->u.branch.link = 0;
4996 dsc->u.branch.exchange = 0;
4997 dsc->u.branch.dest = from + 4 + offset;
4998
4999 dsc->modinsn[0] = THUMB_NOP;
5000
5001 dsc->cleanup = &cleanup_branch;
5002
5003 return 0;
5004}
5005
cca44b1b
JB
5006/* Copy BX/BLX with register-specified destinations. */
5007
7ff120b4
YQ
5008static void
5009install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5010 arm_displaced_step_closure *dsc, int link,
7ff120b4 5011 unsigned int cond, unsigned int rm)
cca44b1b 5012{
cca44b1b
JB
5013 /* Implement {BX,BLX}<cond> <reg>" as:
5014
5015 Preparation: cond <- instruction condition
5016 Insn: mov r0, r0 (nop)
5017 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5018
5019 Don't set r14 in cleanup for BX. */
5020
36073a92 5021 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5022
5023 dsc->u.branch.cond = cond;
5024 dsc->u.branch.link = link;
cca44b1b 5025
7ff120b4 5026 dsc->u.branch.exchange = 1;
cca44b1b
JB
5027
5028 dsc->cleanup = &cleanup_branch;
7ff120b4 5029}
cca44b1b 5030
7ff120b4
YQ
5031static int
5032arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 5033 struct regcache *regs, arm_displaced_step_closure *dsc)
7ff120b4
YQ
5034{
5035 unsigned int cond = bits (insn, 28, 31);
5036 /* BX: x12xxx1x
5037 BLX: x12xxx3x. */
5038 int link = bit (insn, 5);
5039 unsigned int rm = bits (insn, 0, 3);
5040
5041 if (debug_displaced)
5042 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5043 (unsigned long) insn);
5044
5045 dsc->modinsn[0] = ARM_NOP;
5046
5047 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
5048 return 0;
5049}
5050
34518530
YQ
5051static int
5052thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5053 struct regcache *regs,
cfba9872 5054 arm_displaced_step_closure *dsc)
34518530
YQ
5055{
5056 int link = bit (insn, 7);
5057 unsigned int rm = bits (insn, 3, 6);
5058
5059 if (debug_displaced)
5060 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5061 (unsigned short) insn);
5062
5063 dsc->modinsn[0] = THUMB_NOP;
5064
5065 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5066
5067 return 0;
5068}
5069
5070
0963b4bd 5071/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
5072
5073static void
6e39997a 5074cleanup_alu_imm (struct gdbarch *gdbarch,
cfba9872 5075 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b 5076{
36073a92 5077 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5078 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5079 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5080 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5081}
5082
5083static int
7ff120b4 5084arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 5085 arm_displaced_step_closure *dsc)
cca44b1b
JB
5086{
5087 unsigned int rn = bits (insn, 16, 19);
5088 unsigned int rd = bits (insn, 12, 15);
5089 unsigned int op = bits (insn, 21, 24);
5090 int is_mov = (op == 0xd);
5091 ULONGEST rd_val, rn_val;
cca44b1b
JB
5092
5093 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 5094 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
5095
5096 if (debug_displaced)
5097 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5098 "%.8lx\n", is_mov ? "move" : "ALU",
5099 (unsigned long) insn);
5100
5101 /* Instruction is of form:
5102
5103 <op><cond> rd, [rn,] #imm
5104
5105 Rewrite as:
5106
5107 Preparation: tmp1, tmp2 <- r0, r1;
5108 r0, r1 <- rd, rn
5109 Insn: <op><cond> r0, r1, #imm
5110 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5111 */
5112
36073a92
YQ
5113 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5114 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5115 rn_val = displaced_read_reg (regs, dsc, rn);
5116 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
5117 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5118 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5119 dsc->rd = rd;
5120
5121 if (is_mov)
5122 dsc->modinsn[0] = insn & 0xfff00fff;
5123 else
5124 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5125
5126 dsc->cleanup = &cleanup_alu_imm;
5127
5128 return 0;
5129}
5130
34518530
YQ
5131static int
5132thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5133 uint16_t insn2, struct regcache *regs,
cfba9872 5134 arm_displaced_step_closure *dsc)
34518530
YQ
5135{
5136 unsigned int op = bits (insn1, 5, 8);
5137 unsigned int rn, rm, rd;
5138 ULONGEST rd_val, rn_val;
5139
5140 rn = bits (insn1, 0, 3); /* Rn */
5141 rm = bits (insn2, 0, 3); /* Rm */
5142 rd = bits (insn2, 8, 11); /* Rd */
5143
5144 /* This routine is only called for instruction MOV. */
5145 gdb_assert (op == 0x2 && rn == 0xf);
5146
5147 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5148 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5149
5150 if (debug_displaced)
5151 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5152 "ALU", insn1, insn2);
5153
5154 /* Instruction is of form:
5155
5156 <op><cond> rd, [rn,] #imm
5157
5158 Rewrite as:
5159
5160 Preparation: tmp1, tmp2 <- r0, r1;
5161 r0, r1 <- rd, rn
5162 Insn: <op><cond> r0, r1, #imm
5163 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5164 */
5165
5166 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5167 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5168 rn_val = displaced_read_reg (regs, dsc, rn);
5169 rd_val = displaced_read_reg (regs, dsc, rd);
5170 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5171 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5172 dsc->rd = rd;
5173
5174 dsc->modinsn[0] = insn1;
5175 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5176 dsc->numinsns = 2;
5177
5178 dsc->cleanup = &cleanup_alu_imm;
5179
5180 return 0;
5181}
5182
cca44b1b
JB
5183/* Copy/cleanup arithmetic/logic insns with register RHS. */
5184
5185static void
6e39997a 5186cleanup_alu_reg (struct gdbarch *gdbarch,
cfba9872 5187 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
5188{
5189 ULONGEST rd_val;
5190 int i;
5191
36073a92 5192 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5193
5194 for (i = 0; i < 3; i++)
5195 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5196
5197 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5198}
5199
7ff120b4
YQ
5200static void
5201install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5202 arm_displaced_step_closure *dsc,
7ff120b4 5203 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 5204{
cca44b1b 5205 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 5206
cca44b1b
JB
5207 /* Instruction is of form:
5208
5209 <op><cond> rd, [rn,] rm [, <shift>]
5210
5211 Rewrite as:
5212
5213 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5214 r0, r1, r2 <- rd, rn, rm
ef713951 5215 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
5216 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5217 */
5218
36073a92
YQ
5219 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5220 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5221 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5222 rd_val = displaced_read_reg (regs, dsc, rd);
5223 rn_val = displaced_read_reg (regs, dsc, rn);
5224 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5225 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5226 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5227 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5228 dsc->rd = rd;
5229
7ff120b4
YQ
5230 dsc->cleanup = &cleanup_alu_reg;
5231}
5232
5233static int
5234arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 5235 arm_displaced_step_closure *dsc)
7ff120b4
YQ
5236{
5237 unsigned int op = bits (insn, 21, 24);
5238 int is_mov = (op == 0xd);
5239
5240 if (!insn_references_pc (insn, 0x000ff00ful))
5241 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5242
5243 if (debug_displaced)
5244 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5245 is_mov ? "move" : "ALU", (unsigned long) insn);
5246
cca44b1b
JB
5247 if (is_mov)
5248 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5249 else
5250 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5251
7ff120b4
YQ
5252 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5253 bits (insn, 0, 3));
cca44b1b
JB
5254 return 0;
5255}
5256
34518530
YQ
5257static int
5258thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5259 struct regcache *regs,
cfba9872 5260 arm_displaced_step_closure *dsc)
34518530 5261{
ef713951 5262 unsigned rm, rd;
34518530 5263
ef713951
YQ
5264 rm = bits (insn, 3, 6);
5265 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 5266
ef713951 5267 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
5268 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5269
5270 if (debug_displaced)
ef713951
YQ
5271 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5272 (unsigned short) insn);
34518530 5273
ef713951 5274 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 5275
ef713951 5276 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
5277
5278 return 0;
5279}
5280
cca44b1b
JB
5281/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5282
5283static void
6e39997a 5284cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b 5285 struct regcache *regs,
cfba9872 5286 arm_displaced_step_closure *dsc)
cca44b1b 5287{
36073a92 5288 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5289 int i;
5290
5291 for (i = 0; i < 4; i++)
5292 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5293
5294 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5295}
5296
7ff120b4
YQ
5297static void
5298install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5299 arm_displaced_step_closure *dsc,
7ff120b4
YQ
5300 unsigned int rd, unsigned int rn, unsigned int rm,
5301 unsigned rs)
cca44b1b 5302{
7ff120b4 5303 int i;
cca44b1b 5304 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 5305
cca44b1b
JB
5306 /* Instruction is of form:
5307
5308 <op><cond> rd, [rn,] rm, <shift> rs
5309
5310 Rewrite as:
5311
5312 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5313 r0, r1, r2, r3 <- rd, rn, rm, rs
5314 Insn: <op><cond> r0, r1, r2, <shift> r3
5315 Cleanup: tmp5 <- r0
5316 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5317 rd <- tmp5
5318 */
5319
5320 for (i = 0; i < 4; i++)
36073a92 5321 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 5322
36073a92
YQ
5323 rd_val = displaced_read_reg (regs, dsc, rd);
5324 rn_val = displaced_read_reg (regs, dsc, rn);
5325 rm_val = displaced_read_reg (regs, dsc, rm);
5326 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
5327 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5328 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5329 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5330 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5331 dsc->rd = rd;
7ff120b4
YQ
5332 dsc->cleanup = &cleanup_alu_shifted_reg;
5333}
5334
5335static int
5336arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5337 struct regcache *regs,
cfba9872 5338 arm_displaced_step_closure *dsc)
7ff120b4
YQ
5339{
5340 unsigned int op = bits (insn, 21, 24);
5341 int is_mov = (op == 0xd);
5342 unsigned int rd, rn, rm, rs;
5343
5344 if (!insn_references_pc (insn, 0x000fff0ful))
5345 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5346
5347 if (debug_displaced)
5348 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5349 "%.8lx\n", is_mov ? "move" : "ALU",
5350 (unsigned long) insn);
5351
5352 rn = bits (insn, 16, 19);
5353 rm = bits (insn, 0, 3);
5354 rs = bits (insn, 8, 11);
5355 rd = bits (insn, 12, 15);
cca44b1b
JB
5356
5357 if (is_mov)
5358 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5359 else
5360 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5361
7ff120b4 5362 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
5363
5364 return 0;
5365}
5366
5367/* Clean up load instructions. */
5368
5369static void
6e39997a 5370cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5371 arm_displaced_step_closure *dsc)
cca44b1b
JB
5372{
5373 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 5374
36073a92 5375 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 5376 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
5377 rt_val2 = displaced_read_reg (regs, dsc, 1);
5378 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5379
5380 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5381 if (dsc->u.ldst.xfersize > 4)
5382 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5383 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5384 if (!dsc->u.ldst.immed)
5385 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5386
5387 /* Handle register writeback. */
5388 if (dsc->u.ldst.writeback)
5389 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5390 /* Put result in right place. */
5391 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5392 if (dsc->u.ldst.xfersize == 8)
5393 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5394}
5395
5396/* Clean up store instructions. */
5397
5398static void
6e39997a 5399cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5400 arm_displaced_step_closure *dsc)
cca44b1b 5401{
36073a92 5402 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5403
5404 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5405 if (dsc->u.ldst.xfersize > 4)
5406 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5407 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5408 if (!dsc->u.ldst.immed)
5409 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5410 if (!dsc->u.ldst.restore_r4)
5411 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5412
5413 /* Writeback. */
5414 if (dsc->u.ldst.writeback)
5415 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5416}
5417
5418/* Copy "extra" load/store instructions. These are halfword/doubleword
5419 transfers, which have a different encoding to byte/word transfers. */
5420
5421static int
550dc4e2 5422arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
cfba9872 5423 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
5424{
5425 unsigned int op1 = bits (insn, 20, 24);
5426 unsigned int op2 = bits (insn, 5, 6);
5427 unsigned int rt = bits (insn, 12, 15);
5428 unsigned int rn = bits (insn, 16, 19);
5429 unsigned int rm = bits (insn, 0, 3);
5430 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5431 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5432 int immed = (op1 & 0x4) != 0;
5433 int opcode;
5434 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
5435
5436 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 5437 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
5438
5439 if (debug_displaced)
5440 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
550dc4e2 5441 "insn %.8lx\n", unprivileged ? "unprivileged " : "",
cca44b1b
JB
5442 (unsigned long) insn);
5443
5444 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5445
5446 if (opcode < 0)
5447 internal_error (__FILE__, __LINE__,
5448 _("copy_extra_ld_st: instruction decode error"));
5449
36073a92
YQ
5450 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5451 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5452 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5453 if (!immed)
36073a92 5454 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5455
36073a92 5456 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 5457 if (bytesize[opcode] == 8)
36073a92
YQ
5458 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5459 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5460 if (!immed)
36073a92 5461 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5462
5463 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5464 if (bytesize[opcode] == 8)
5465 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5466 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5467 if (!immed)
5468 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5469
5470 dsc->rd = rt;
5471 dsc->u.ldst.xfersize = bytesize[opcode];
5472 dsc->u.ldst.rn = rn;
5473 dsc->u.ldst.immed = immed;
5474 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5475 dsc->u.ldst.restore_r4 = 0;
5476
5477 if (immed)
5478 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5479 ->
5480 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5481 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5482 else
5483 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5484 ->
5485 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5486 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5487
5488 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5489
5490 return 0;
5491}
5492
0f6f04ba 5493/* Copy byte/half word/word loads and stores. */
cca44b1b 5494
7ff120b4 5495static void
0f6f04ba 5496install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5497 arm_displaced_step_closure *dsc, int load,
0f6f04ba
YQ
5498 int immed, int writeback, int size, int usermode,
5499 int rt, int rm, int rn)
cca44b1b 5500{
cca44b1b 5501 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 5502
36073a92
YQ
5503 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5504 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5505 if (!immed)
36073a92 5506 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5507 if (!load)
36073a92 5508 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 5509
36073a92
YQ
5510 rt_val = displaced_read_reg (regs, dsc, rt);
5511 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5512 if (!immed)
36073a92 5513 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5514
5515 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5516 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5517 if (!immed)
5518 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 5519 dsc->rd = rt;
0f6f04ba 5520 dsc->u.ldst.xfersize = size;
cca44b1b
JB
5521 dsc->u.ldst.rn = rn;
5522 dsc->u.ldst.immed = immed;
7ff120b4 5523 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5524
5525 /* To write PC we can do:
5526
494e194e
YQ
5527 Before this sequence of instructions:
5528 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5529 r2 is the Rn value got from dispalced_read_reg.
5530
5531 Insn1: push {pc} Write address of STR instruction + offset on stack
5532 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5533 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5534 = addr(Insn1) + offset - addr(Insn3) - 8
5535 = offset - 16
5536 Insn4: add r4, r4, #8 r4 = offset - 8
5537 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5538 = from + offset
5539 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
5540
5541 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
5542 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5543 of this can be found in Section "Saving from r15" in
5544 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 5545
7ff120b4
YQ
5546 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5547}
5548
34518530
YQ
5549
5550static int
5551thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5552 uint16_t insn2, struct regcache *regs,
cfba9872 5553 arm_displaced_step_closure *dsc, int size)
34518530
YQ
5554{
5555 unsigned int u_bit = bit (insn1, 7);
5556 unsigned int rt = bits (insn2, 12, 15);
5557 int imm12 = bits (insn2, 0, 11);
5558 ULONGEST pc_val;
5559
5560 if (debug_displaced)
5561 fprintf_unfiltered (gdb_stdlog,
5562 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5563 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5564 imm12);
5565
5566 if (!u_bit)
5567 imm12 = -1 * imm12;
5568
5569 /* Rewrite instruction LDR Rt imm12 into:
5570
5571 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5572
5573 LDR R0, R2, R3,
5574
5575 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5576
5577
5578 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5579 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5580 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5581
5582 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5583
5584 pc_val = pc_val & 0xfffffffc;
5585
5586 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5587 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5588
5589 dsc->rd = rt;
5590
5591 dsc->u.ldst.xfersize = size;
5592 dsc->u.ldst.immed = 0;
5593 dsc->u.ldst.writeback = 0;
5594 dsc->u.ldst.restore_r4 = 0;
5595
5596 /* LDR R0, R2, R3 */
5597 dsc->modinsn[0] = 0xf852;
5598 dsc->modinsn[1] = 0x3;
5599 dsc->numinsns = 2;
5600
5601 dsc->cleanup = &cleanup_load;
5602
5603 return 0;
5604}
5605
5606static int
5607thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5608 uint16_t insn2, struct regcache *regs,
cfba9872 5609 arm_displaced_step_closure *dsc,
34518530
YQ
5610 int writeback, int immed)
5611{
5612 unsigned int rt = bits (insn2, 12, 15);
5613 unsigned int rn = bits (insn1, 0, 3);
5614 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5615 /* In LDR (register), there is also a register Rm, which is not allowed to
5616 be PC, so we don't have to check it. */
5617
5618 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5619 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5620 dsc);
5621
5622 if (debug_displaced)
5623 fprintf_unfiltered (gdb_stdlog,
5624 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5625 rt, rn, insn1, insn2);
5626
5627 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5628 0, rt, rm, rn);
5629
5630 dsc->u.ldst.restore_r4 = 0;
5631
5632 if (immed)
5633 /* ldr[b]<cond> rt, [rn, #imm], etc.
5634 ->
5635 ldr[b]<cond> r0, [r2, #imm]. */
5636 {
5637 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5638 dsc->modinsn[1] = insn2 & 0x0fff;
5639 }
5640 else
5641 /* ldr[b]<cond> rt, [rn, rm], etc.
5642 ->
5643 ldr[b]<cond> r0, [r2, r3]. */
5644 {
5645 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5646 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5647 }
5648
5649 dsc->numinsns = 2;
5650
5651 return 0;
5652}
5653
5654
7ff120b4
YQ
5655static int
5656arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5657 struct regcache *regs,
cfba9872 5658 arm_displaced_step_closure *dsc,
0f6f04ba 5659 int load, int size, int usermode)
7ff120b4
YQ
5660{
5661 int immed = !bit (insn, 25);
5662 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5663 unsigned int rt = bits (insn, 12, 15);
5664 unsigned int rn = bits (insn, 16, 19);
5665 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5666
5667 if (!insn_references_pc (insn, 0x000ff00ful))
5668 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5669
5670 if (debug_displaced)
5671 fprintf_unfiltered (gdb_stdlog,
5672 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
5673 load ? (size == 1 ? "ldrb" : "ldr")
5674 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
5675 rt, rn,
5676 (unsigned long) insn);
5677
0f6f04ba
YQ
5678 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5679 usermode, rt, rm, rn);
7ff120b4 5680
bf9f652a 5681 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
5682 {
5683 dsc->u.ldst.restore_r4 = 0;
5684
5685 if (immed)
5686 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5687 ->
5688 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5689 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5690 else
5691 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5692 ->
5693 {ldr,str}[b]<cond> r0, [r2, r3]. */
5694 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5695 }
5696 else
5697 {
5698 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5699 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
5700 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5701 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
5702 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5703 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5704 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5705
5706 /* As above. */
5707 if (immed)
5708 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5709 else
5710 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5711
cca44b1b
JB
5712 dsc->numinsns = 6;
5713 }
5714
5715 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5716
5717 return 0;
5718}
5719
5720/* Cleanup LDM instructions with fully-populated register list. This is an
5721 unfortunate corner case: it's impossible to implement correctly by modifying
5722 the instruction. The issue is as follows: we have an instruction,
5723
5724 ldm rN, {r0-r15}
5725
5726 which we must rewrite to avoid loading PC. A possible solution would be to
5727 do the load in two halves, something like (with suitable cleanup
5728 afterwards):
5729
5730 mov r8, rN
5731 ldm[id][ab] r8!, {r0-r7}
5732 str r7, <temp>
5733 ldm[id][ab] r8, {r7-r14}
5734 <bkpt>
5735
5736 but at present there's no suitable place for <temp>, since the scratch space
5737 is overwritten before the cleanup routine is called. For now, we simply
5738 emulate the instruction. */
5739
5740static void
5741cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5742 arm_displaced_step_closure *dsc)
cca44b1b 5743{
cca44b1b
JB
5744 int inc = dsc->u.block.increment;
5745 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5746 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5747 uint32_t regmask = dsc->u.block.regmask;
5748 int regno = inc ? 0 : 15;
5749 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5750 int exception_return = dsc->u.block.load && dsc->u.block.user
5751 && (regmask & 0x8000) != 0;
36073a92 5752 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5753 int do_transfer = condition_true (dsc->u.block.cond, status);
5754 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5755
5756 if (!do_transfer)
5757 return;
5758
5759 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5760 sensible we can do here. Complain loudly. */
5761 if (exception_return)
5762 error (_("Cannot single-step exception return"));
5763
5764 /* We don't handle any stores here for now. */
5765 gdb_assert (dsc->u.block.load != 0);
5766
5767 if (debug_displaced)
5768 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5769 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5770 dsc->u.block.increment ? "inc" : "dec",
5771 dsc->u.block.before ? "before" : "after");
5772
5773 while (regmask)
5774 {
5775 uint32_t memword;
5776
5777 if (inc)
bf9f652a 5778 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
5779 regno++;
5780 else
5781 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5782 regno--;
5783
5784 xfer_addr += bump_before;
5785
5786 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5787 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5788
5789 xfer_addr += bump_after;
5790
5791 regmask &= ~(1 << regno);
5792 }
5793
5794 if (dsc->u.block.writeback)
5795 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5796 CANNOT_WRITE_PC);
5797}
5798
5799/* Clean up an STM which included the PC in the register list. */
5800
5801static void
5802cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5803 arm_displaced_step_closure *dsc)
cca44b1b 5804{
36073a92 5805 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5806 int store_executed = condition_true (dsc->u.block.cond, status);
5807 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5808 CORE_ADDR stm_insn_addr;
5809 uint32_t pc_val;
5810 long offset;
5811 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5812
5813 /* If condition code fails, there's nothing else to do. */
5814 if (!store_executed)
5815 return;
5816
5817 if (dsc->u.block.increment)
5818 {
5819 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5820
5821 if (dsc->u.block.before)
5822 pc_stored_at += 4;
5823 }
5824 else
5825 {
5826 pc_stored_at = dsc->u.block.xfer_addr;
5827
5828 if (dsc->u.block.before)
5829 pc_stored_at -= 4;
5830 }
5831
5832 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5833 stm_insn_addr = dsc->scratch_base;
5834 offset = pc_val - stm_insn_addr;
5835
5836 if (debug_displaced)
5837 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5838 "STM instruction\n", offset);
5839
5840 /* Rewrite the stored PC to the proper value for the non-displaced original
5841 instruction. */
5842 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5843 dsc->insn_addr + offset);
5844}
5845
5846/* Clean up an LDM which includes the PC in the register list. We clumped all
5847 the registers in the transferred list into a contiguous range r0...rX (to
5848 avoid loading PC directly and losing control of the debugged program), so we
5849 must undo that here. */
5850
5851static void
6e39997a 5852cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b 5853 struct regcache *regs,
cfba9872 5854 arm_displaced_step_closure *dsc)
cca44b1b 5855{
36073a92 5856 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 5857 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 5858 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
5859 unsigned int regs_loaded = bitcount (mask);
5860 unsigned int num_to_shuffle = regs_loaded, clobbered;
5861
5862 /* The method employed here will fail if the register list is fully populated
5863 (we need to avoid loading PC directly). */
5864 gdb_assert (num_to_shuffle < 16);
5865
5866 if (!load_executed)
5867 return;
5868
5869 clobbered = (1 << num_to_shuffle) - 1;
5870
5871 while (num_to_shuffle > 0)
5872 {
5873 if ((mask & (1 << write_reg)) != 0)
5874 {
5875 unsigned int read_reg = num_to_shuffle - 1;
5876
5877 if (read_reg != write_reg)
5878 {
36073a92 5879 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
5880 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5881 if (debug_displaced)
5882 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5883 "loaded register r%d to r%d\n"), read_reg,
5884 write_reg);
5885 }
5886 else if (debug_displaced)
5887 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5888 "r%d already in the right place\n"),
5889 write_reg);
5890
5891 clobbered &= ~(1 << write_reg);
5892
5893 num_to_shuffle--;
5894 }
5895
5896 write_reg--;
5897 }
5898
5899 /* Restore any registers we scribbled over. */
5900 for (write_reg = 0; clobbered != 0; write_reg++)
5901 {
5902 if ((clobbered & (1 << write_reg)) != 0)
5903 {
5904 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5905 CANNOT_WRITE_PC);
5906 if (debug_displaced)
5907 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5908 "clobbered register r%d\n"), write_reg);
5909 clobbered &= ~(1 << write_reg);
5910 }
5911 }
5912
5913 /* Perform register writeback manually. */
5914 if (dsc->u.block.writeback)
5915 {
5916 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5917
5918 if (dsc->u.block.increment)
5919 new_rn_val += regs_loaded * 4;
5920 else
5921 new_rn_val -= regs_loaded * 4;
5922
5923 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
5924 CANNOT_WRITE_PC);
5925 }
5926}
5927
5928/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
5929 in user-level code (in particular exception return, ldm rn, {...pc}^). */
5930
5931static int
7ff120b4
YQ
5932arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
5933 struct regcache *regs,
cfba9872 5934 arm_displaced_step_closure *dsc)
cca44b1b
JB
5935{
5936 int load = bit (insn, 20);
5937 int user = bit (insn, 22);
5938 int increment = bit (insn, 23);
5939 int before = bit (insn, 24);
5940 int writeback = bit (insn, 21);
5941 int rn = bits (insn, 16, 19);
cca44b1b 5942
0963b4bd
MS
5943 /* Block transfers which don't mention PC can be run directly
5944 out-of-line. */
bf9f652a 5945 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 5946 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 5947
bf9f652a 5948 if (rn == ARM_PC_REGNUM)
cca44b1b 5949 {
0963b4bd
MS
5950 warning (_("displaced: Unpredictable LDM or STM with "
5951 "base register r15"));
7ff120b4 5952 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
5953 }
5954
5955 if (debug_displaced)
5956 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
5957 "%.8lx\n", (unsigned long) insn);
5958
36073a92 5959 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
5960 dsc->u.block.rn = rn;
5961
5962 dsc->u.block.load = load;
5963 dsc->u.block.user = user;
5964 dsc->u.block.increment = increment;
5965 dsc->u.block.before = before;
5966 dsc->u.block.writeback = writeback;
5967 dsc->u.block.cond = bits (insn, 28, 31);
5968
5969 dsc->u.block.regmask = insn & 0xffff;
5970
5971 if (load)
5972 {
5973 if ((insn & 0xffff) == 0xffff)
5974 {
5975 /* LDM with a fully-populated register list. This case is
5976 particularly tricky. Implement for now by fully emulating the
5977 instruction (which might not behave perfectly in all cases, but
5978 these instructions should be rare enough for that not to matter
5979 too much). */
5980 dsc->modinsn[0] = ARM_NOP;
5981
5982 dsc->cleanup = &cleanup_block_load_all;
5983 }
5984 else
5985 {
5986 /* LDM of a list of registers which includes PC. Implement by
5987 rewriting the list of registers to be transferred into a
5988 contiguous chunk r0...rX before doing the transfer, then shuffling
5989 registers into the correct places in the cleanup routine. */
5990 unsigned int regmask = insn & 0xffff;
bec2ab5a
SM
5991 unsigned int num_in_list = bitcount (regmask), new_regmask;
5992 unsigned int i;
cca44b1b
JB
5993
5994 for (i = 0; i < num_in_list; i++)
36073a92 5995 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
5996
5997 /* Writeback makes things complicated. We need to avoid clobbering
5998 the base register with one of the registers in our modified
5999 register list, but just using a different register can't work in
6000 all cases, e.g.:
6001
6002 ldm r14!, {r0-r13,pc}
6003
6004 which would need to be rewritten as:
6005
6006 ldm rN!, {r0-r14}
6007
6008 but that can't work, because there's no free register for N.
6009
6010 Solve this by turning off the writeback bit, and emulating
6011 writeback manually in the cleanup routine. */
6012
6013 if (writeback)
6014 insn &= ~(1 << 21);
6015
6016 new_regmask = (1 << num_in_list) - 1;
6017
6018 if (debug_displaced)
6019 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6020 "{..., pc}: original reg list %.4x, modified "
6021 "list %.4x\n"), rn, writeback ? "!" : "",
6022 (int) insn & 0xffff, new_regmask);
6023
6024 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6025
6026 dsc->cleanup = &cleanup_block_load_pc;
6027 }
6028 }
6029 else
6030 {
6031 /* STM of a list of registers which includes PC. Run the instruction
6032 as-is, but out of line: this will store the wrong value for the PC,
6033 so we must manually fix up the memory in the cleanup routine.
6034 Doing things this way has the advantage that we can auto-detect
6035 the offset of the PC write (which is architecture-dependent) in
6036 the cleanup routine. */
6037 dsc->modinsn[0] = insn;
6038
6039 dsc->cleanup = &cleanup_block_store_pc;
6040 }
6041
6042 return 0;
6043}
6044
34518530
YQ
6045static int
6046thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6047 struct regcache *regs,
cfba9872 6048 arm_displaced_step_closure *dsc)
cca44b1b 6049{
34518530
YQ
6050 int rn = bits (insn1, 0, 3);
6051 int load = bit (insn1, 4);
6052 int writeback = bit (insn1, 5);
cca44b1b 6053
34518530
YQ
6054 /* Block transfers which don't mention PC can be run directly
6055 out-of-line. */
6056 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6057 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 6058
34518530
YQ
6059 if (rn == ARM_PC_REGNUM)
6060 {
6061 warning (_("displaced: Unpredictable LDM or STM with "
6062 "base register r15"));
6063 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6064 "unpredictable ldm/stm", dsc);
6065 }
cca44b1b
JB
6066
6067 if (debug_displaced)
34518530
YQ
6068 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6069 "%.4x%.4x\n", insn1, insn2);
cca44b1b 6070
34518530
YQ
6071 /* Clear bit 13, since it should be always zero. */
6072 dsc->u.block.regmask = (insn2 & 0xdfff);
6073 dsc->u.block.rn = rn;
cca44b1b 6074
34518530
YQ
6075 dsc->u.block.load = load;
6076 dsc->u.block.user = 0;
6077 dsc->u.block.increment = bit (insn1, 7);
6078 dsc->u.block.before = bit (insn1, 8);
6079 dsc->u.block.writeback = writeback;
6080 dsc->u.block.cond = INST_AL;
6081 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 6082
34518530
YQ
6083 if (load)
6084 {
6085 if (dsc->u.block.regmask == 0xffff)
6086 {
6087 /* This branch is impossible to happen. */
6088 gdb_assert (0);
6089 }
6090 else
6091 {
6092 unsigned int regmask = dsc->u.block.regmask;
bec2ab5a
SM
6093 unsigned int num_in_list = bitcount (regmask), new_regmask;
6094 unsigned int i;
34518530
YQ
6095
6096 for (i = 0; i < num_in_list; i++)
6097 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6098
6099 if (writeback)
6100 insn1 &= ~(1 << 5);
6101
6102 new_regmask = (1 << num_in_list) - 1;
6103
6104 if (debug_displaced)
6105 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6106 "{..., pc}: original reg list %.4x, modified "
6107 "list %.4x\n"), rn, writeback ? "!" : "",
6108 (int) dsc->u.block.regmask, new_regmask);
6109
6110 dsc->modinsn[0] = insn1;
6111 dsc->modinsn[1] = (new_regmask & 0xffff);
6112 dsc->numinsns = 2;
6113
6114 dsc->cleanup = &cleanup_block_load_pc;
6115 }
6116 }
6117 else
6118 {
6119 dsc->modinsn[0] = insn1;
6120 dsc->modinsn[1] = insn2;
6121 dsc->numinsns = 2;
6122 dsc->cleanup = &cleanup_block_store_pc;
6123 }
6124 return 0;
6125}
6126
d9311bfa
AT
6127/* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6128 This is used to avoid a dependency on BFD's bfd_endian enum. */
6129
6130ULONGEST
6131arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6132 int byte_order)
6133{
5f2dfcfd
AT
6134 return read_memory_unsigned_integer (memaddr, len,
6135 (enum bfd_endian) byte_order);
d9311bfa
AT
6136}
6137
6138/* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6139
6140CORE_ADDR
6141arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6142 CORE_ADDR val)
6143{
ac7936df 6144 return gdbarch_addr_bits_remove (self->regcache->arch (), val);
d9311bfa
AT
6145}
6146
6147/* Wrapper over syscall_next_pc for use in get_next_pcs. */
6148
e7cf25a8 6149static CORE_ADDR
553cb527 6150arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
d9311bfa 6151{
d9311bfa
AT
6152 return 0;
6153}
6154
6155/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6156
6157int
6158arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6159{
6160 return arm_is_thumb (self->regcache);
6161}
6162
6163/* single_step() is called just before we want to resume the inferior,
6164 if we want to single-step it but there is no hardware or kernel
6165 single-step support. We find the target of the coming instructions
6166 and breakpoint them. */
6167
a0ff9e1a 6168std::vector<CORE_ADDR>
f5ea389a 6169arm_software_single_step (struct regcache *regcache)
d9311bfa 6170{
ac7936df 6171 struct gdbarch *gdbarch = regcache->arch ();
d9311bfa 6172 struct arm_get_next_pcs next_pcs_ctx;
d9311bfa
AT
6173
6174 arm_get_next_pcs_ctor (&next_pcs_ctx,
6175 &arm_get_next_pcs_ops,
6176 gdbarch_byte_order (gdbarch),
6177 gdbarch_byte_order_for_code (gdbarch),
1b451dda 6178 0,
d9311bfa
AT
6179 regcache);
6180
a0ff9e1a 6181 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
d9311bfa 6182
a0ff9e1a
SM
6183 for (CORE_ADDR &pc_ref : next_pcs)
6184 pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
d9311bfa 6185
93f9a11f 6186 return next_pcs;
d9311bfa
AT
6187}
6188
34518530
YQ
6189/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6190 for Linux, where some SVC instructions must be treated specially. */
6191
6192static void
6193cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6194 arm_displaced_step_closure *dsc)
34518530
YQ
6195{
6196 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6197
6198 if (debug_displaced)
6199 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6200 "%.8lx\n", (unsigned long) resume_addr);
6201
6202 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6203}
6204
6205
6206/* Common copy routine for svc instruciton. */
6207
6208static int
6209install_svc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6210 arm_displaced_step_closure *dsc)
34518530
YQ
6211{
6212 /* Preparation: none.
6213 Insn: unmodified svc.
6214 Cleanup: pc <- insn_addr + insn_size. */
6215
6216 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6217 instruction. */
6218 dsc->wrote_to_pc = 1;
6219
6220 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6221 if (dsc->u.svc.copy_svc_os)
6222 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6223 else
6224 {
6225 dsc->cleanup = &cleanup_svc;
6226 return 0;
6227 }
34518530
YQ
6228}
6229
6230static int
6231arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6232 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
6233{
6234
6235 if (debug_displaced)
6236 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6237 (unsigned long) insn);
6238
6239 dsc->modinsn[0] = insn;
6240
6241 return install_svc (gdbarch, regs, dsc);
6242}
6243
6244static int
6245thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
cfba9872 6246 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
6247{
6248
6249 if (debug_displaced)
6250 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6251 insn);
bd18283a 6252
34518530
YQ
6253 dsc->modinsn[0] = insn;
6254
6255 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6256}
6257
6258/* Copy undefined instructions. */
6259
6260static int
7ff120b4 6261arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6262 arm_displaced_step_closure *dsc)
cca44b1b
JB
6263{
6264 if (debug_displaced)
0963b4bd
MS
6265 fprintf_unfiltered (gdb_stdlog,
6266 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6267 (unsigned long) insn);
6268
6269 dsc->modinsn[0] = insn;
6270
6271 return 0;
6272}
6273
34518530
YQ
6274static int
6275thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
cfba9872 6276 arm_displaced_step_closure *dsc)
34518530
YQ
6277{
6278
6279 if (debug_displaced)
6280 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6281 "%.4x %.4x\n", (unsigned short) insn1,
6282 (unsigned short) insn2);
6283
6284 dsc->modinsn[0] = insn1;
6285 dsc->modinsn[1] = insn2;
6286 dsc->numinsns = 2;
6287
6288 return 0;
6289}
6290
cca44b1b
JB
6291/* Copy unpredictable instructions. */
6292
6293static int
7ff120b4 6294arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6295 arm_displaced_step_closure *dsc)
cca44b1b
JB
6296{
6297 if (debug_displaced)
6298 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6299 "%.8lx\n", (unsigned long) insn);
6300
6301 dsc->modinsn[0] = insn;
6302
6303 return 0;
6304}
6305
6306/* The decode_* functions are instruction decoding helpers. They mostly follow
6307 the presentation in the ARM ARM. */
6308
6309static int
7ff120b4
YQ
6310arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6311 struct regcache *regs,
cfba9872 6312 arm_displaced_step_closure *dsc)
cca44b1b
JB
6313{
6314 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6315 unsigned int rn = bits (insn, 16, 19);
6316
2f924de6 6317 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0x1) == 0x0)
7ff120b4 6318 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
2f924de6 6319 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0x1) == 0x1)
7ff120b4 6320 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6321 else if ((op1 & 0x60) == 0x20)
7ff120b4 6322 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6323 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6324 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6325 dsc);
cca44b1b 6326 else if ((op1 & 0x77) == 0x41)
7ff120b4 6327 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6328 else if ((op1 & 0x77) == 0x45)
7ff120b4 6329 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6330 else if ((op1 & 0x77) == 0x51)
6331 {
6332 if (rn != 0xf)
7ff120b4 6333 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6334 else
7ff120b4 6335 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6336 }
6337 else if ((op1 & 0x77) == 0x55)
7ff120b4 6338 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6339 else if (op1 == 0x57)
6340 switch (op2)
6341 {
7ff120b4
YQ
6342 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6343 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6344 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6345 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6346 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6347 }
6348 else if ((op1 & 0x63) == 0x43)
7ff120b4 6349 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6350 else if ((op2 & 0x1) == 0x0)
6351 switch (op1 & ~0x80)
6352 {
6353 case 0x61:
7ff120b4 6354 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6355 case 0x65:
7ff120b4 6356 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6357 case 0x71: case 0x75:
6358 /* pld/pldw reg. */
7ff120b4 6359 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6360 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6361 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6362 default:
7ff120b4 6363 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6364 }
6365 else
7ff120b4 6366 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6367}
6368
6369static int
7ff120b4
YQ
6370arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6371 struct regcache *regs,
cfba9872 6372 arm_displaced_step_closure *dsc)
cca44b1b
JB
6373{
6374 if (bit (insn, 27) == 0)
7ff120b4 6375 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6376 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6377 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6378 {
6379 case 0x0: case 0x2:
7ff120b4 6380 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6381
6382 case 0x1: case 0x3:
7ff120b4 6383 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6384
6385 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6386 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6387
6388 case 0x8:
6389 switch ((insn & 0xe00000) >> 21)
6390 {
6391 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6392 /* stc/stc2. */
7ff120b4 6393 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6394
6395 case 0x2:
7ff120b4 6396 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6397
6398 default:
7ff120b4 6399 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6400 }
6401
6402 case 0x9:
6403 {
6404 int rn_f = (bits (insn, 16, 19) == 0xf);
6405 switch ((insn & 0xe00000) >> 21)
6406 {
6407 case 0x1: case 0x3:
6408 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6409 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6410 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6411
6412 case 0x2:
7ff120b4 6413 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6414
6415 case 0x4: case 0x5: case 0x6: case 0x7:
6416 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6417 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6418 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6419
6420 default:
7ff120b4 6421 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6422 }
6423 }
6424
6425 case 0xa:
7ff120b4 6426 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6427
6428 case 0xb:
6429 if (bits (insn, 16, 19) == 0xf)
6430 /* ldc/ldc2 lit. */
7ff120b4 6431 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6432 else
7ff120b4 6433 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6434
6435 case 0xc:
6436 if (bit (insn, 4))
7ff120b4 6437 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6438 else
7ff120b4 6439 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6440
6441 case 0xd:
6442 if (bit (insn, 4))
7ff120b4 6443 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6444 else
7ff120b4 6445 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6446
6447 default:
7ff120b4 6448 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6449 }
6450}
6451
6452/* Decode miscellaneous instructions in dp/misc encoding space. */
6453
6454static int
7ff120b4
YQ
6455arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6456 struct regcache *regs,
cfba9872 6457 arm_displaced_step_closure *dsc)
cca44b1b
JB
6458{
6459 unsigned int op2 = bits (insn, 4, 6);
6460 unsigned int op = bits (insn, 21, 22);
cca44b1b
JB
6461
6462 switch (op2)
6463 {
6464 case 0x0:
7ff120b4 6465 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6466
6467 case 0x1:
6468 if (op == 0x1) /* bx. */
7ff120b4 6469 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6470 else if (op == 0x3)
7ff120b4 6471 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6472 else
7ff120b4 6473 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6474
6475 case 0x2:
6476 if (op == 0x1)
6477 /* Not really supported. */
7ff120b4 6478 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6479 else
7ff120b4 6480 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6481
6482 case 0x3:
6483 if (op == 0x1)
7ff120b4 6484 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6485 regs, dsc); /* blx register. */
cca44b1b 6486 else
7ff120b4 6487 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6488
6489 case 0x5:
7ff120b4 6490 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6491
6492 case 0x7:
6493 if (op == 0x1)
7ff120b4 6494 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6495 else if (op == 0x3)
6496 /* Not really supported. */
7ff120b4 6497 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
86a73007 6498 /* Fall through. */
cca44b1b
JB
6499
6500 default:
7ff120b4 6501 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6502 }
6503}
6504
6505static int
7ff120b4
YQ
6506arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6507 struct regcache *regs,
cfba9872 6508 arm_displaced_step_closure *dsc)
cca44b1b
JB
6509{
6510 if (bit (insn, 25))
6511 switch (bits (insn, 20, 24))
6512 {
6513 case 0x10:
7ff120b4 6514 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6515
6516 case 0x14:
7ff120b4 6517 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6518
6519 case 0x12: case 0x16:
7ff120b4 6520 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6521
6522 default:
7ff120b4 6523 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6524 }
6525 else
6526 {
6527 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6528
6529 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6530 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6531 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6532 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6533 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6534 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6535 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6536 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6537 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6538 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6539 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6540 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b 6541 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
550dc4e2 6542 /* 2nd arg means "unprivileged". */
7ff120b4
YQ
6543 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6544 dsc);
cca44b1b
JB
6545 }
6546
6547 /* Should be unreachable. */
6548 return 1;
6549}
6550
6551static int
7ff120b4
YQ
6552arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6553 struct regcache *regs,
cfba9872 6554 arm_displaced_step_closure *dsc)
cca44b1b
JB
6555{
6556 int a = bit (insn, 25), b = bit (insn, 4);
6557 uint32_t op1 = bits (insn, 20, 24);
cca44b1b
JB
6558
6559 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6560 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6561 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6562 else if ((!a && (op1 & 0x17) == 0x02)
6563 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6564 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6565 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6566 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6567 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6568 else if ((!a && (op1 & 0x17) == 0x03)
6569 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6570 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6571 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6572 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6573 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6574 else if ((!a && (op1 & 0x17) == 0x06)
6575 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6576 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6577 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6578 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6579 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6580 else if ((!a && (op1 & 0x17) == 0x07)
6581 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6582 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6583
6584 /* Should be unreachable. */
6585 return 1;
6586}
6587
6588static int
7ff120b4 6589arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6590 arm_displaced_step_closure *dsc)
cca44b1b
JB
6591{
6592 switch (bits (insn, 20, 24))
6593 {
6594 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6595 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6596
6597 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6598 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6599
6600 case 0x08: case 0x09: case 0x0a: case 0x0b:
6601 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6602 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6603 "decode/pack/unpack/saturate/reverse", dsc);
6604
6605 case 0x18:
6606 if (bits (insn, 5, 7) == 0) /* op2. */
6607 {
6608 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6609 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6610 else
7ff120b4 6611 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6612 }
6613 else
7ff120b4 6614 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6615
6616 case 0x1a: case 0x1b:
6617 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6618 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6619 else
7ff120b4 6620 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6621
6622 case 0x1c: case 0x1d:
6623 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6624 {
6625 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6626 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6627 else
7ff120b4 6628 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6629 }
6630 else
7ff120b4 6631 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6632
6633 case 0x1e: case 0x1f:
6634 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6635 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6636 else
7ff120b4 6637 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6638 }
6639
6640 /* Should be unreachable. */
6641 return 1;
6642}
6643
6644static int
615234c1 6645arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7ff120b4 6646 struct regcache *regs,
cfba9872 6647 arm_displaced_step_closure *dsc)
cca44b1b
JB
6648{
6649 if (bit (insn, 25))
7ff120b4 6650 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6651 else
7ff120b4 6652 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6653}
6654
6655static int
7ff120b4
YQ
6656arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6657 struct regcache *regs,
cfba9872 6658 arm_displaced_step_closure *dsc)
cca44b1b
JB
6659{
6660 unsigned int opcode = bits (insn, 20, 24);
6661
6662 switch (opcode)
6663 {
6664 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6665 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6666
6667 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6668 case 0x12: case 0x16:
7ff120b4 6669 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6670
6671 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6672 case 0x13: case 0x17:
7ff120b4 6673 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6674
6675 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6676 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6677 /* Note: no writeback for these instructions. Bit 25 will always be
6678 zero though (via caller), so the following works OK. */
7ff120b4 6679 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6680 }
6681
6682 /* Should be unreachable. */
6683 return 1;
6684}
6685
34518530
YQ
6686/* Decode shifted register instructions. */
6687
6688static int
6689thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6690 uint16_t insn2, struct regcache *regs,
cfba9872 6691 arm_displaced_step_closure *dsc)
34518530
YQ
6692{
6693 /* PC is only allowed to be used in instruction MOV. */
6694
6695 unsigned int op = bits (insn1, 5, 8);
6696 unsigned int rn = bits (insn1, 0, 3);
6697
6698 if (op == 0x2 && rn == 0xf) /* MOV */
6699 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6700 else
6701 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6702 "dp (shift reg)", dsc);
6703}
6704
6705
6706/* Decode extension register load/store. Exactly the same as
6707 arm_decode_ext_reg_ld_st. */
6708
6709static int
6710thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6711 uint16_t insn2, struct regcache *regs,
cfba9872 6712 arm_displaced_step_closure *dsc)
34518530
YQ
6713{
6714 unsigned int opcode = bits (insn1, 4, 8);
6715
6716 switch (opcode)
6717 {
6718 case 0x04: case 0x05:
6719 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6720 "vfp/neon vmov", dsc);
6721
6722 case 0x08: case 0x0c: /* 01x00 */
6723 case 0x0a: case 0x0e: /* 01x10 */
6724 case 0x12: case 0x16: /* 10x10 */
6725 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6726 "vfp/neon vstm/vpush", dsc);
6727
6728 case 0x09: case 0x0d: /* 01x01 */
6729 case 0x0b: case 0x0f: /* 01x11 */
6730 case 0x13: case 0x17: /* 10x11 */
6731 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6732 "vfp/neon vldm/vpop", dsc);
6733
6734 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6735 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6736 "vstr", dsc);
6737 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6738 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6739 }
6740
6741 /* Should be unreachable. */
6742 return 1;
6743}
6744
cca44b1b 6745static int
12545665 6746arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6747 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
6748{
6749 unsigned int op1 = bits (insn, 20, 25);
6750 int op = bit (insn, 4);
6751 unsigned int coproc = bits (insn, 8, 11);
cca44b1b
JB
6752
6753 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6754 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6755 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6756 && (coproc & 0xe) != 0xa)
6757 /* stc/stc2. */
7ff120b4 6758 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6759 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6760 && (coproc & 0xe) != 0xa)
6761 /* ldc/ldc2 imm/lit. */
7ff120b4 6762 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6763 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6764 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6765 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6766 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6767 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6768 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6769 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6770 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6771 else if ((op1 & 0x30) == 0x20 && !op)
6772 {
6773 if ((coproc & 0xe) == 0xa)
7ff120b4 6774 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6775 else
7ff120b4 6776 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6777 }
6778 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6779 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6780 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6781 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6782 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6783 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6784 else if ((op1 & 0x30) == 0x30)
7ff120b4 6785 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6786 else
7ff120b4 6787 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6788}
6789
34518530
YQ
6790static int
6791thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6792 uint16_t insn2, struct regcache *regs,
cfba9872 6793 arm_displaced_step_closure *dsc)
34518530
YQ
6794{
6795 unsigned int coproc = bits (insn2, 8, 11);
34518530
YQ
6796 unsigned int bit_5_8 = bits (insn1, 5, 8);
6797 unsigned int bit_9 = bit (insn1, 9);
6798 unsigned int bit_4 = bit (insn1, 4);
34518530
YQ
6799
6800 if (bit_9 == 0)
6801 {
6802 if (bit_5_8 == 2)
6803 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6804 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6805 dsc);
6806 else if (bit_5_8 == 0) /* UNDEFINED. */
6807 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6808 else
6809 {
6810 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6811 if ((coproc & 0xe) == 0xa)
6812 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6813 dsc);
6814 else /* coproc is not 101x. */
6815 {
6816 if (bit_4 == 0) /* STC/STC2. */
6817 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6818 "stc/stc2", dsc);
6819 else /* LDC/LDC2 {literal, immeidate}. */
6820 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6821 regs, dsc);
6822 }
6823 }
6824 }
6825 else
6826 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6827
6828 return 0;
6829}
6830
6831static void
6832install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6833 arm_displaced_step_closure *dsc, int rd)
34518530
YQ
6834{
6835 /* ADR Rd, #imm
6836
6837 Rewrite as:
6838
6839 Preparation: Rd <- PC
6840 Insn: ADD Rd, #imm
6841 Cleanup: Null.
6842 */
6843
6844 /* Rd <- PC */
6845 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6846 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6847}
6848
6849static int
6850thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6851 arm_displaced_step_closure *dsc,
34518530
YQ
6852 int rd, unsigned int imm)
6853{
6854
6855 /* Encoding T2: ADDS Rd, #imm */
6856 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6857
6858 install_pc_relative (gdbarch, regs, dsc, rd);
6859
6860 return 0;
6861}
6862
6863static int
6864thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6865 struct regcache *regs,
cfba9872 6866 arm_displaced_step_closure *dsc)
34518530
YQ
6867{
6868 unsigned int rd = bits (insn, 8, 10);
6869 unsigned int imm8 = bits (insn, 0, 7);
6870
6871 if (debug_displaced)
6872 fprintf_unfiltered (gdb_stdlog,
6873 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6874 rd, imm8, insn);
6875
6876 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6877}
6878
6879static int
6880thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6881 uint16_t insn2, struct regcache *regs,
cfba9872 6882 arm_displaced_step_closure *dsc)
34518530
YQ
6883{
6884 unsigned int rd = bits (insn2, 8, 11);
6885 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6886 extract raw immediate encoding rather than computing immediate. When
6887 generating ADD or SUB instruction, we can simply perform OR operation to
6888 set immediate into ADD. */
6889 unsigned int imm_3_8 = insn2 & 0x70ff;
6890 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6891
6892 if (debug_displaced)
6893 fprintf_unfiltered (gdb_stdlog,
6894 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6895 rd, imm_i, imm_3_8, insn1, insn2);
6896
6897 if (bit (insn1, 7)) /* Encoding T2 */
6898 {
6899 /* Encoding T3: SUB Rd, Rd, #imm */
6900 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6901 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6902 }
6903 else /* Encoding T3 */
6904 {
6905 /* Encoding T3: ADD Rd, Rd, #imm */
6906 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6907 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6908 }
6909 dsc->numinsns = 2;
6910
6911 install_pc_relative (gdbarch, regs, dsc, rd);
6912
6913 return 0;
6914}
6915
6916static int
615234c1 6917thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
34518530 6918 struct regcache *regs,
cfba9872 6919 arm_displaced_step_closure *dsc)
34518530
YQ
6920{
6921 unsigned int rt = bits (insn1, 8, 10);
6922 unsigned int pc;
6923 int imm8 = (bits (insn1, 0, 7) << 2);
34518530
YQ
6924
6925 /* LDR Rd, #imm8
6926
6927 Rwrite as:
6928
6929 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6930
6931 Insn: LDR R0, [R2, R3];
6932 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6933
6934 if (debug_displaced)
6935 fprintf_unfiltered (gdb_stdlog,
6936 "displaced: copying thumb ldr r%d [pc #%d]\n"
6937 , rt, imm8);
6938
6939 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6940 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6941 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6942 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6943 /* The assembler calculates the required value of the offset from the
6944 Align(PC,4) value of this instruction to the label. */
6945 pc = pc & 0xfffffffc;
6946
6947 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6948 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6949
6950 dsc->rd = rt;
6951 dsc->u.ldst.xfersize = 4;
6952 dsc->u.ldst.rn = 0;
6953 dsc->u.ldst.immed = 0;
6954 dsc->u.ldst.writeback = 0;
6955 dsc->u.ldst.restore_r4 = 0;
6956
6957 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6958
6959 dsc->cleanup = &cleanup_load;
6960
6961 return 0;
6962}
6963
6964/* Copy Thumb cbnz/cbz insruction. */
6965
6966static int
6967thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6968 struct regcache *regs,
cfba9872 6969 arm_displaced_step_closure *dsc)
34518530
YQ
6970{
6971 int non_zero = bit (insn1, 11);
6972 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6973 CORE_ADDR from = dsc->insn_addr;
6974 int rn = bits (insn1, 0, 2);
6975 int rn_val = displaced_read_reg (regs, dsc, rn);
6976
6977 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6978 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6979 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6980 condition is false, let it be, cleanup_branch will do nothing. */
6981 if (dsc->u.branch.cond)
6982 {
6983 dsc->u.branch.cond = INST_AL;
6984 dsc->u.branch.dest = from + 4 + imm5;
6985 }
6986 else
6987 dsc->u.branch.dest = from + 2;
6988
6989 dsc->u.branch.link = 0;
6990 dsc->u.branch.exchange = 0;
6991
6992 if (debug_displaced)
6993 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
6994 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
6995 rn, rn_val, insn1, dsc->u.branch.dest);
6996
6997 dsc->modinsn[0] = THUMB_NOP;
6998
6999 dsc->cleanup = &cleanup_branch;
7000 return 0;
7001}
7002
7003/* Copy Table Branch Byte/Halfword */
7004static int
7005thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7006 uint16_t insn2, struct regcache *regs,
cfba9872 7007 arm_displaced_step_closure *dsc)
34518530
YQ
7008{
7009 ULONGEST rn_val, rm_val;
7010 int is_tbh = bit (insn2, 4);
7011 CORE_ADDR halfwords = 0;
7012 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7013
7014 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7015 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7016
7017 if (is_tbh)
7018 {
7019 gdb_byte buf[2];
7020
7021 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7022 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7023 }
7024 else
7025 {
7026 gdb_byte buf[1];
7027
7028 target_read_memory (rn_val + rm_val, buf, 1);
7029 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7030 }
7031
7032 if (debug_displaced)
7033 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7034 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7035 (unsigned int) rn_val, (unsigned int) rm_val,
7036 (unsigned int) halfwords);
7037
7038 dsc->u.branch.cond = INST_AL;
7039 dsc->u.branch.link = 0;
7040 dsc->u.branch.exchange = 0;
7041 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7042
7043 dsc->cleanup = &cleanup_branch;
7044
7045 return 0;
7046}
7047
7048static void
7049cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 7050 arm_displaced_step_closure *dsc)
34518530
YQ
7051{
7052 /* PC <- r7 */
7053 int val = displaced_read_reg (regs, dsc, 7);
7054 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7055
7056 /* r7 <- r8 */
7057 val = displaced_read_reg (regs, dsc, 8);
7058 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7059
7060 /* r8 <- tmp[0] */
7061 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7062
7063}
7064
7065static int
615234c1 7066thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
34518530 7067 struct regcache *regs,
cfba9872 7068 arm_displaced_step_closure *dsc)
34518530
YQ
7069{
7070 dsc->u.block.regmask = insn1 & 0x00ff;
7071
7072 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7073 to :
7074
7075 (1) register list is full, that is, r0-r7 are used.
7076 Prepare: tmp[0] <- r8
7077
7078 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7079 MOV r8, r7; Move value of r7 to r8;
7080 POP {r7}; Store PC value into r7.
7081
7082 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7083
7084 (2) register list is not full, supposing there are N registers in
7085 register list (except PC, 0 <= N <= 7).
7086 Prepare: for each i, 0 - N, tmp[i] <- ri.
7087
7088 POP {r0, r1, ...., rN};
7089
7090 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7091 from tmp[] properly.
7092 */
7093 if (debug_displaced)
7094 fprintf_unfiltered (gdb_stdlog,
7095 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7096 dsc->u.block.regmask, insn1);
7097
7098 if (dsc->u.block.regmask == 0xff)
7099 {
7100 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7101
7102 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7103 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7104 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7105
7106 dsc->numinsns = 3;
7107 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7108 }
7109 else
7110 {
7111 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
bec2ab5a
SM
7112 unsigned int i;
7113 unsigned int new_regmask;
34518530
YQ
7114
7115 for (i = 0; i < num_in_list + 1; i++)
7116 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7117
7118 new_regmask = (1 << (num_in_list + 1)) - 1;
7119
7120 if (debug_displaced)
7121 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7122 "{..., pc}: original reg list %.4x,"
7123 " modified list %.4x\n"),
7124 (int) dsc->u.block.regmask, new_regmask);
7125
7126 dsc->u.block.regmask |= 0x8000;
7127 dsc->u.block.writeback = 0;
7128 dsc->u.block.cond = INST_AL;
7129
7130 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7131
7132 dsc->cleanup = &cleanup_block_load_pc;
7133 }
7134
7135 return 0;
7136}
7137
7138static void
7139thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7140 struct regcache *regs,
cfba9872 7141 arm_displaced_step_closure *dsc)
34518530
YQ
7142{
7143 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7144 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7145 int err = 0;
7146
7147 /* 16-bit thumb instructions. */
7148 switch (op_bit_12_15)
7149 {
7150 /* Shift (imme), add, subtract, move and compare. */
7151 case 0: case 1: case 2: case 3:
7152 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7153 "shift/add/sub/mov/cmp",
7154 dsc);
7155 break;
7156 case 4:
7157 switch (op_bit_10_11)
7158 {
7159 case 0: /* Data-processing */
7160 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7161 "data-processing",
7162 dsc);
7163 break;
7164 case 1: /* Special data instructions and branch and exchange. */
7165 {
7166 unsigned short op = bits (insn1, 7, 9);
7167 if (op == 6 || op == 7) /* BX or BLX */
7168 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7169 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7170 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7171 else
7172 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7173 dsc);
7174 }
7175 break;
7176 default: /* LDR (literal) */
7177 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7178 }
7179 break;
7180 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7181 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7182 break;
7183 case 10:
7184 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7185 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7186 else /* Generate SP-relative address */
7187 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7188 break;
7189 case 11: /* Misc 16-bit instructions */
7190 {
7191 switch (bits (insn1, 8, 11))
7192 {
7193 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7194 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7195 break;
7196 case 12: case 13: /* POP */
7197 if (bit (insn1, 8)) /* PC is in register list. */
7198 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7199 else
7200 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7201 break;
7202 case 15: /* If-Then, and hints */
7203 if (bits (insn1, 0, 3))
7204 /* If-Then makes up to four following instructions conditional.
7205 IT instruction itself is not conditional, so handle it as a
7206 common unmodified instruction. */
7207 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7208 dsc);
7209 else
7210 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7211 break;
7212 default:
7213 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7214 }
7215 }
7216 break;
7217 case 12:
7218 if (op_bit_10_11 < 2) /* Store multiple registers */
7219 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7220 else /* Load multiple registers */
7221 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7222 break;
7223 case 13: /* Conditional branch and supervisor call */
7224 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7225 err = thumb_copy_b (gdbarch, insn1, dsc);
7226 else
7227 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7228 break;
7229 case 14: /* Unconditional branch */
7230 err = thumb_copy_b (gdbarch, insn1, dsc);
7231 break;
7232 default:
7233 err = 1;
7234 }
7235
7236 if (err)
7237 internal_error (__FILE__, __LINE__,
7238 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7239}
7240
7241static int
7242decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7243 uint16_t insn1, uint16_t insn2,
7244 struct regcache *regs,
cfba9872 7245 arm_displaced_step_closure *dsc)
34518530
YQ
7246{
7247 int rt = bits (insn2, 12, 15);
7248 int rn = bits (insn1, 0, 3);
7249 int op1 = bits (insn1, 7, 8);
34518530
YQ
7250
7251 switch (bits (insn1, 5, 6))
7252 {
7253 case 0: /* Load byte and memory hints */
7254 if (rt == 0xf) /* PLD/PLI */
7255 {
7256 if (rn == 0xf)
7257 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7258 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7259 else
7260 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7261 "pli/pld", dsc);
7262 }
7263 else
7264 {
7265 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7266 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7267 1);
7268 else
7269 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7270 "ldrb{reg, immediate}/ldrbt",
7271 dsc);
7272 }
7273
7274 break;
7275 case 1: /* Load halfword and memory hints. */
7276 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7277 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7278 "pld/unalloc memhint", dsc);
7279 else
7280 {
7281 if (rn == 0xf)
7282 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7283 2);
7284 else
7285 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7286 "ldrh/ldrht", dsc);
7287 }
7288 break;
7289 case 2: /* Load word */
7290 {
7291 int insn2_bit_8_11 = bits (insn2, 8, 11);
7292
7293 if (rn == 0xf)
7294 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7295 else if (op1 == 0x1) /* Encoding T3 */
7296 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7297 0, 1);
7298 else /* op1 == 0x0 */
7299 {
7300 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7301 /* LDR (immediate) */
7302 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7303 dsc, bit (insn2, 8), 1);
7304 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7305 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7306 "ldrt", dsc);
7307 else
7308 /* LDR (register) */
7309 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7310 dsc, 0, 0);
7311 }
7312 break;
7313 }
7314 default:
7315 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7316 break;
7317 }
7318 return 0;
7319}
7320
7321static void
7322thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7323 uint16_t insn2, struct regcache *regs,
cfba9872 7324 arm_displaced_step_closure *dsc)
34518530
YQ
7325{
7326 int err = 0;
7327 unsigned short op = bit (insn2, 15);
7328 unsigned int op1 = bits (insn1, 11, 12);
7329
7330 switch (op1)
7331 {
7332 case 1:
7333 {
7334 switch (bits (insn1, 9, 10))
7335 {
7336 case 0:
7337 if (bit (insn1, 6))
7338 {
7339 /* Load/store {dual, execlusive}, table branch. */
7340 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7341 && bits (insn2, 5, 7) == 0)
7342 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7343 dsc);
7344 else
7345 /* PC is not allowed to use in load/store {dual, exclusive}
7346 instructions. */
7347 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7348 "load/store dual/ex", dsc);
7349 }
7350 else /* load/store multiple */
7351 {
7352 switch (bits (insn1, 7, 8))
7353 {
7354 case 0: case 3: /* SRS, RFE */
7355 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7356 "srs/rfe", dsc);
7357 break;
7358 case 1: case 2: /* LDM/STM/PUSH/POP */
7359 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7360 break;
7361 }
7362 }
7363 break;
7364
7365 case 1:
7366 /* Data-processing (shift register). */
7367 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7368 dsc);
7369 break;
7370 default: /* Coprocessor instructions. */
7371 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7372 break;
7373 }
7374 break;
7375 }
7376 case 2: /* op1 = 2 */
7377 if (op) /* Branch and misc control. */
7378 {
7379 if (bit (insn2, 14) /* BLX/BL */
7380 || bit (insn2, 12) /* Unconditional branch */
7381 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7382 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7383 else
7384 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7385 "misc ctrl", dsc);
7386 }
7387 else
7388 {
7389 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7390 {
b926417a 7391 int dp_op = bits (insn1, 4, 8);
34518530 7392 int rn = bits (insn1, 0, 3);
b926417a 7393 if ((dp_op == 0 || dp_op == 0xa) && rn == 0xf)
34518530
YQ
7394 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7395 regs, dsc);
7396 else
7397 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7398 "dp/pb", dsc);
7399 }
7400 else /* Data processing (modified immeidate) */
7401 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7402 "dp/mi", dsc);
7403 }
7404 break;
7405 case 3: /* op1 = 3 */
7406 switch (bits (insn1, 9, 10))
7407 {
7408 case 0:
7409 if (bit (insn1, 4))
7410 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7411 regs, dsc);
7412 else /* NEON Load/Store and Store single data item */
7413 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7414 "neon elt/struct load/store",
7415 dsc);
7416 break;
7417 case 1: /* op1 = 3, bits (9, 10) == 1 */
7418 switch (bits (insn1, 7, 8))
7419 {
7420 case 0: case 1: /* Data processing (register) */
7421 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7422 "dp(reg)", dsc);
7423 break;
7424 case 2: /* Multiply and absolute difference */
7425 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7426 "mul/mua/diff", dsc);
7427 break;
7428 case 3: /* Long multiply and divide */
7429 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7430 "lmul/lmua", dsc);
7431 break;
7432 }
7433 break;
7434 default: /* Coprocessor instructions */
7435 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7436 break;
7437 }
7438 break;
7439 default:
7440 err = 1;
7441 }
7442
7443 if (err)
7444 internal_error (__FILE__, __LINE__,
7445 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7446
7447}
7448
b434a28f
YQ
7449static void
7450thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
12545665 7451 struct regcache *regs,
cfba9872 7452 arm_displaced_step_closure *dsc)
b434a28f 7453{
34518530
YQ
7454 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7455 uint16_t insn1
7456 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7457
7458 if (debug_displaced)
7459 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7460 "at %.8lx\n", insn1, (unsigned long) from);
7461
7462 dsc->is_thumb = 1;
7463 dsc->insn_size = thumb_insn_size (insn1);
7464 if (thumb_insn_size (insn1) == 4)
7465 {
7466 uint16_t insn2
7467 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7468 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7469 }
7470 else
7471 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7472}
7473
cca44b1b 7474void
b434a28f
YQ
7475arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7476 CORE_ADDR to, struct regcache *regs,
cfba9872 7477 arm_displaced_step_closure *dsc)
cca44b1b
JB
7478{
7479 int err = 0;
b434a28f
YQ
7480 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7481 uint32_t insn;
cca44b1b
JB
7482
7483 /* Most displaced instructions use a 1-instruction scratch space, so set this
7484 here and override below if/when necessary. */
7485 dsc->numinsns = 1;
7486 dsc->insn_addr = from;
7487 dsc->scratch_base = to;
7488 dsc->cleanup = NULL;
7489 dsc->wrote_to_pc = 0;
7490
b434a28f 7491 if (!displaced_in_arm_mode (regs))
12545665 7492 return thumb_process_displaced_insn (gdbarch, from, regs, dsc);
b434a28f 7493
4db71c0b
YQ
7494 dsc->is_thumb = 0;
7495 dsc->insn_size = 4;
b434a28f
YQ
7496 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7497 if (debug_displaced)
7498 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7499 "at %.8lx\n", (unsigned long) insn,
7500 (unsigned long) from);
7501
cca44b1b 7502 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7503 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7504 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7505 {
7506 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7507 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7508 break;
7509
7510 case 0x4: case 0x5: case 0x6:
7ff120b4 7511 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7512 break;
7513
7514 case 0x7:
7ff120b4 7515 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7516 break;
7517
7518 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7519 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7520 break;
7521
7522 case 0xc: case 0xd: case 0xe: case 0xf:
12545665 7523 err = arm_decode_svc_copro (gdbarch, insn, regs, dsc);
cca44b1b
JB
7524 break;
7525 }
7526
7527 if (err)
7528 internal_error (__FILE__, __LINE__,
7529 _("arm_process_displaced_insn: Instruction decode error"));
7530}
7531
7532/* Actually set up the scratch space for a displaced instruction. */
7533
7534void
7535arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
cfba9872 7536 CORE_ADDR to, arm_displaced_step_closure *dsc)
cca44b1b
JB
7537{
7538 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7539 unsigned int i, len, offset;
cca44b1b 7540 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7541 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7542 const gdb_byte *bkp_insn;
cca44b1b 7543
4db71c0b 7544 offset = 0;
cca44b1b
JB
7545 /* Poke modified instruction(s). */
7546 for (i = 0; i < dsc->numinsns; i++)
7547 {
7548 if (debug_displaced)
4db71c0b
YQ
7549 {
7550 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7551 if (size == 4)
7552 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7553 dsc->modinsn[i]);
7554 else if (size == 2)
7555 fprintf_unfiltered (gdb_stdlog, "%.4x",
7556 (unsigned short)dsc->modinsn[i]);
7557
7558 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7559 (unsigned long) to + offset);
7560
7561 }
7562 write_memory_unsigned_integer (to + offset, size,
7563 byte_order_for_code,
cca44b1b 7564 dsc->modinsn[i]);
4db71c0b
YQ
7565 offset += size;
7566 }
7567
7568 /* Choose the correct breakpoint instruction. */
7569 if (dsc->is_thumb)
7570 {
7571 bkp_insn = tdep->thumb_breakpoint;
7572 len = tdep->thumb_breakpoint_size;
7573 }
7574 else
7575 {
7576 bkp_insn = tdep->arm_breakpoint;
7577 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7578 }
7579
7580 /* Put breakpoint afterwards. */
4db71c0b 7581 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7582
7583 if (debug_displaced)
7584 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7585 paddress (gdbarch, from), paddress (gdbarch, to));
7586}
7587
cca44b1b
JB
7588/* Entry point for cleaning things up after a displaced instruction has been
7589 single-stepped. */
7590
7591void
7592arm_displaced_step_fixup (struct gdbarch *gdbarch,
cfba9872 7593 struct displaced_step_closure *dsc_,
cca44b1b
JB
7594 CORE_ADDR from, CORE_ADDR to,
7595 struct regcache *regs)
7596{
cfba9872
SM
7597 arm_displaced_step_closure *dsc = (arm_displaced_step_closure *) dsc_;
7598
cca44b1b
JB
7599 if (dsc->cleanup)
7600 dsc->cleanup (gdbarch, regs, dsc);
7601
7602 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7603 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7604 dsc->insn_addr + dsc->insn_size);
7605
cca44b1b
JB
7606}
7607
7608#include "bfd-in2.h"
7609#include "libcoff.h"
7610
7611static int
7612gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7613{
e47ad6c0
YQ
7614 gdb_disassembler *di
7615 = static_cast<gdb_disassembler *>(info->application_data);
7616 struct gdbarch *gdbarch = di->arch ();
9779414d
DJ
7617
7618 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7619 {
7620 static asymbol *asym;
7621 static combined_entry_type ce;
7622 static struct coff_symbol_struct csym;
7623 static struct bfd fake_bfd;
7624 static bfd_target fake_target;
7625
7626 if (csym.native == NULL)
7627 {
7628 /* Create a fake symbol vector containing a Thumb symbol.
7629 This is solely so that the code in print_insn_little_arm()
7630 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7631 the presence of a Thumb symbol and switch to decoding
7632 Thumb instructions. */
7633
7634 fake_target.flavour = bfd_target_coff_flavour;
7635 fake_bfd.xvec = &fake_target;
7636 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7637 csym.native = &ce;
7638 csym.symbol.the_bfd = &fake_bfd;
7639 csym.symbol.name = "fake";
7640 asym = (asymbol *) & csym;
7641 }
7642
7643 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7644 info->symbols = &asym;
7645 }
7646 else
7647 info->symbols = NULL;
7648
e60eb288
YQ
7649 /* GDB is able to get bfd_mach from the exe_bfd, info->mach is
7650 accurate, so mark USER_SPECIFIED_MACHINE_TYPE bit. Otherwise,
7651 opcodes/arm-dis.c:print_insn reset info->mach, and it will trigger
7652 the assert on the mismatch of info->mach and bfd_get_mach (exec_bfd)
7653 in default_print_insn. */
7654 if (exec_bfd != NULL)
7655 info->flags |= USER_SPECIFIED_MACHINE_TYPE;
7656
6394c606 7657 return default_print_insn (memaddr, info);
cca44b1b
JB
7658}
7659
7660/* The following define instruction sequences that will cause ARM
7661 cpu's to take an undefined instruction trap. These are used to
7662 signal a breakpoint to GDB.
7663
7664 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7665 modes. A different instruction is required for each mode. The ARM
7666 cpu's can also be big or little endian. Thus four different
7667 instructions are needed to support all cases.
7668
7669 Note: ARMv4 defines several new instructions that will take the
7670 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7671 not in fact add the new instructions. The new undefined
7672 instructions in ARMv4 are all instructions that had no defined
7673 behaviour in earlier chips. There is no guarantee that they will
7674 raise an exception, but may be treated as NOP's. In practice, it
7675 may only safe to rely on instructions matching:
7676
7677 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7678 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
7679 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
7680
0963b4bd 7681 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7682 following use a condition predicate of ALWAYS so it is always TRUE.
7683
7684 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7685 and NetBSD all use a software interrupt rather than an undefined
7686 instruction to force a trap. This can be handled by by the
7687 abi-specific code during establishment of the gdbarch vector. */
7688
7689#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7690#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7691#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7692#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7693
948f8e3d
PA
7694static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7695static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7696static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7697static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b 7698
cd6c3b4f
YQ
7699/* Implement the breakpoint_kind_from_pc gdbarch method. */
7700
d19280ad
YQ
7701static int
7702arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
cca44b1b
JB
7703{
7704 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7705 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7706
9779414d 7707 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7708 {
7709 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7710
7711 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7712 check whether we are replacing a 32-bit instruction. */
7713 if (tdep->thumb2_breakpoint != NULL)
7714 {
7715 gdb_byte buf[2];
d19280ad 7716
177321bd
DJ
7717 if (target_read_memory (*pcptr, buf, 2) == 0)
7718 {
7719 unsigned short inst1;
d19280ad 7720
177321bd 7721 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7722 if (thumb_insn_size (inst1) == 4)
d19280ad 7723 return ARM_BP_KIND_THUMB2;
177321bd
DJ
7724 }
7725 }
7726
d19280ad 7727 return ARM_BP_KIND_THUMB;
cca44b1b
JB
7728 }
7729 else
d19280ad
YQ
7730 return ARM_BP_KIND_ARM;
7731
7732}
7733
cd6c3b4f
YQ
7734/* Implement the sw_breakpoint_from_kind gdbarch method. */
7735
d19280ad
YQ
7736static const gdb_byte *
7737arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
7738{
7739 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7740
7741 switch (kind)
cca44b1b 7742 {
d19280ad
YQ
7743 case ARM_BP_KIND_ARM:
7744 *size = tdep->arm_breakpoint_size;
cca44b1b 7745 return tdep->arm_breakpoint;
d19280ad
YQ
7746 case ARM_BP_KIND_THUMB:
7747 *size = tdep->thumb_breakpoint_size;
7748 return tdep->thumb_breakpoint;
7749 case ARM_BP_KIND_THUMB2:
7750 *size = tdep->thumb2_breakpoint_size;
7751 return tdep->thumb2_breakpoint;
7752 default:
7753 gdb_assert_not_reached ("unexpected arm breakpoint kind");
cca44b1b
JB
7754 }
7755}
7756
833b7ab5
YQ
7757/* Implement the breakpoint_kind_from_current_state gdbarch method. */
7758
7759static int
7760arm_breakpoint_kind_from_current_state (struct gdbarch *gdbarch,
7761 struct regcache *regcache,
7762 CORE_ADDR *pcptr)
7763{
7764 gdb_byte buf[4];
7765
7766 /* Check the memory pointed by PC is readable. */
7767 if (target_read_memory (regcache_read_pc (regcache), buf, 4) == 0)
7768 {
7769 struct arm_get_next_pcs next_pcs_ctx;
833b7ab5
YQ
7770
7771 arm_get_next_pcs_ctor (&next_pcs_ctx,
7772 &arm_get_next_pcs_ops,
7773 gdbarch_byte_order (gdbarch),
7774 gdbarch_byte_order_for_code (gdbarch),
7775 0,
7776 regcache);
7777
a0ff9e1a 7778 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
833b7ab5
YQ
7779
7780 /* If MEMADDR is the next instruction of current pc, do the
7781 software single step computation, and get the thumb mode by
7782 the destination address. */
a0ff9e1a 7783 for (CORE_ADDR pc : next_pcs)
833b7ab5
YQ
7784 {
7785 if (UNMAKE_THUMB_ADDR (pc) == *pcptr)
7786 {
833b7ab5
YQ
7787 if (IS_THUMB_ADDR (pc))
7788 {
7789 *pcptr = MAKE_THUMB_ADDR (*pcptr);
7790 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7791 }
7792 else
7793 return ARM_BP_KIND_ARM;
7794 }
7795 }
833b7ab5
YQ
7796 }
7797
7798 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7799}
7800
cca44b1b
JB
7801/* Extract from an array REGBUF containing the (raw) register state a
7802 function return value of type TYPE, and copy that, in virtual
7803 format, into VALBUF. */
7804
7805static void
7806arm_extract_return_value (struct type *type, struct regcache *regs,
7807 gdb_byte *valbuf)
7808{
ac7936df 7809 struct gdbarch *gdbarch = regs->arch ();
cca44b1b
JB
7810 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7811
7812 if (TYPE_CODE_FLT == TYPE_CODE (type))
7813 {
7814 switch (gdbarch_tdep (gdbarch)->fp_model)
7815 {
7816 case ARM_FLOAT_FPA:
7817 {
7818 /* The value is in register F0 in internal format. We need to
7819 extract the raw value and then convert it to the desired
7820 internal type. */
f0452268 7821 bfd_byte tmpbuf[ARM_FP_REGISTER_SIZE];
cca44b1b 7822
dca08e1f 7823 regs->cooked_read (ARM_F0_REGNUM, tmpbuf);
3b2ca824
UW
7824 target_float_convert (tmpbuf, arm_ext_type (gdbarch),
7825 valbuf, type);
cca44b1b
JB
7826 }
7827 break;
7828
7829 case ARM_FLOAT_SOFT_FPA:
7830 case ARM_FLOAT_SOFT_VFP:
7831 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7832 not using the VFP ABI code. */
7833 case ARM_FLOAT_VFP:
dca08e1f 7834 regs->cooked_read (ARM_A1_REGNUM, valbuf);
cca44b1b 7835 if (TYPE_LENGTH (type) > 4)
f0452268
AH
7836 regs->cooked_read (ARM_A1_REGNUM + 1,
7837 valbuf + ARM_INT_REGISTER_SIZE);
cca44b1b
JB
7838 break;
7839
7840 default:
0963b4bd
MS
7841 internal_error (__FILE__, __LINE__,
7842 _("arm_extract_return_value: "
7843 "Floating point model not supported"));
cca44b1b
JB
7844 break;
7845 }
7846 }
7847 else if (TYPE_CODE (type) == TYPE_CODE_INT
7848 || TYPE_CODE (type) == TYPE_CODE_CHAR
7849 || TYPE_CODE (type) == TYPE_CODE_BOOL
7850 || TYPE_CODE (type) == TYPE_CODE_PTR
aa006118 7851 || TYPE_IS_REFERENCE (type)
cca44b1b
JB
7852 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7853 {
b021a221
MS
7854 /* If the type is a plain integer, then the access is
7855 straight-forward. Otherwise we have to play around a bit
7856 more. */
cca44b1b
JB
7857 int len = TYPE_LENGTH (type);
7858 int regno = ARM_A1_REGNUM;
7859 ULONGEST tmp;
7860
7861 while (len > 0)
7862 {
7863 /* By using store_unsigned_integer we avoid having to do
7864 anything special for small big-endian values. */
7865 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7866 store_unsigned_integer (valbuf,
f0452268
AH
7867 (len > ARM_INT_REGISTER_SIZE
7868 ? ARM_INT_REGISTER_SIZE : len),
cca44b1b 7869 byte_order, tmp);
f0452268
AH
7870 len -= ARM_INT_REGISTER_SIZE;
7871 valbuf += ARM_INT_REGISTER_SIZE;
cca44b1b
JB
7872 }
7873 }
7874 else
7875 {
7876 /* For a structure or union the behaviour is as if the value had
7877 been stored to word-aligned memory and then loaded into
7878 registers with 32-bit load instruction(s). */
7879 int len = TYPE_LENGTH (type);
7880 int regno = ARM_A1_REGNUM;
f0452268 7881 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
cca44b1b
JB
7882
7883 while (len > 0)
7884 {
dca08e1f 7885 regs->cooked_read (regno++, tmpbuf);
cca44b1b 7886 memcpy (valbuf, tmpbuf,
f0452268
AH
7887 len > ARM_INT_REGISTER_SIZE ? ARM_INT_REGISTER_SIZE : len);
7888 len -= ARM_INT_REGISTER_SIZE;
7889 valbuf += ARM_INT_REGISTER_SIZE;
cca44b1b
JB
7890 }
7891 }
7892}
7893
7894
7895/* Will a function return an aggregate type in memory or in a
7896 register? Return 0 if an aggregate type can be returned in a
7897 register, 1 if it must be returned in memory. */
7898
7899static int
7900arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7901{
cca44b1b
JB
7902 enum type_code code;
7903
f168693b 7904 type = check_typedef (type);
cca44b1b 7905
b13c8ab2
YQ
7906 /* Simple, non-aggregate types (ie not including vectors and
7907 complex) are always returned in a register (or registers). */
7908 code = TYPE_CODE (type);
7909 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7910 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7911 return 0;
cca44b1b 7912
c4312b19
YQ
7913 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7914 {
7915 /* Vector values should be returned using ARM registers if they
7916 are not over 16 bytes. */
7917 return (TYPE_LENGTH (type) > 16);
7918 }
7919
b13c8ab2 7920 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7921 {
b13c8ab2
YQ
7922 /* The AAPCS says all aggregates not larger than a word are returned
7923 in a register. */
f0452268 7924 if (TYPE_LENGTH (type) <= ARM_INT_REGISTER_SIZE)
b13c8ab2
YQ
7925 return 0;
7926
cca44b1b
JB
7927 return 1;
7928 }
b13c8ab2
YQ
7929 else
7930 {
7931 int nRc;
cca44b1b 7932
b13c8ab2
YQ
7933 /* All aggregate types that won't fit in a register must be returned
7934 in memory. */
f0452268 7935 if (TYPE_LENGTH (type) > ARM_INT_REGISTER_SIZE)
b13c8ab2 7936 return 1;
cca44b1b 7937
b13c8ab2
YQ
7938 /* In the ARM ABI, "integer" like aggregate types are returned in
7939 registers. For an aggregate type to be integer like, its size
f0452268 7940 must be less than or equal to ARM_INT_REGISTER_SIZE and the
b13c8ab2
YQ
7941 offset of each addressable subfield must be zero. Note that bit
7942 fields are not addressable, and all addressable subfields of
7943 unions always start at offset zero.
cca44b1b 7944
b13c8ab2
YQ
7945 This function is based on the behaviour of GCC 2.95.1.
7946 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7947
b13c8ab2
YQ
7948 Note: All versions of GCC before GCC 2.95.2 do not set up the
7949 parameters correctly for a function returning the following
7950 structure: struct { float f;}; This should be returned in memory,
7951 not a register. Richard Earnshaw sent me a patch, but I do not
7952 know of any way to detect if a function like the above has been
7953 compiled with the correct calling convention. */
7954
7955 /* Assume all other aggregate types can be returned in a register.
7956 Run a check for structures, unions and arrays. */
7957 nRc = 0;
67255d04 7958
b13c8ab2
YQ
7959 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7960 {
7961 int i;
7962 /* Need to check if this struct/union is "integer" like. For
7963 this to be true, its size must be less than or equal to
f0452268 7964 ARM_INT_REGISTER_SIZE and the offset of each addressable
b13c8ab2
YQ
7965 subfield must be zero. Note that bit fields are not
7966 addressable, and unions always start at offset zero. If any
7967 of the subfields is a floating point type, the struct/union
7968 cannot be an integer type. */
7969
7970 /* For each field in the object, check:
7971 1) Is it FP? --> yes, nRc = 1;
7972 2) Is it addressable (bitpos != 0) and
7973 not packed (bitsize == 0)?
7974 --> yes, nRc = 1
7975 */
7976
7977 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7978 {
b13c8ab2
YQ
7979 enum type_code field_type_code;
7980
7981 field_type_code
7982 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7983 i)));
7984
7985 /* Is it a floating point type field? */
7986 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7987 {
7988 nRc = 1;
7989 break;
7990 }
b13c8ab2
YQ
7991
7992 /* If bitpos != 0, then we have to care about it. */
7993 if (TYPE_FIELD_BITPOS (type, i) != 0)
7994 {
7995 /* Bitfields are not addressable. If the field bitsize is
7996 zero, then the field is not packed. Hence it cannot be
7997 a bitfield or any other packed type. */
7998 if (TYPE_FIELD_BITSIZE (type, i) == 0)
7999 {
8000 nRc = 1;
8001 break;
8002 }
8003 }
67255d04
RE
8004 }
8005 }
67255d04 8006
b13c8ab2
YQ
8007 return nRc;
8008 }
67255d04
RE
8009}
8010
34e8f22d
RE
8011/* Write into appropriate registers a function return value of type
8012 TYPE, given in virtual format. */
8013
8014static void
b508a996 8015arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 8016 const gdb_byte *valbuf)
34e8f22d 8017{
ac7936df 8018 struct gdbarch *gdbarch = regs->arch ();
e17a4113 8019 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 8020
34e8f22d
RE
8021 if (TYPE_CODE (type) == TYPE_CODE_FLT)
8022 {
f0452268 8023 gdb_byte buf[ARM_FP_REGISTER_SIZE];
34e8f22d 8024
be8626e0 8025 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
8026 {
8027 case ARM_FLOAT_FPA:
8028
3b2ca824 8029 target_float_convert (valbuf, type, buf, arm_ext_type (gdbarch));
b66f5587 8030 regs->cooked_write (ARM_F0_REGNUM, buf);
08216dd7
RE
8031 break;
8032
fd50bc42 8033 case ARM_FLOAT_SOFT_FPA:
08216dd7 8034 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
8035 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8036 not using the VFP ABI code. */
8037 case ARM_FLOAT_VFP:
b66f5587 8038 regs->cooked_write (ARM_A1_REGNUM, valbuf);
b508a996 8039 if (TYPE_LENGTH (type) > 4)
f0452268
AH
8040 regs->cooked_write (ARM_A1_REGNUM + 1,
8041 valbuf + ARM_INT_REGISTER_SIZE);
08216dd7
RE
8042 break;
8043
8044 default:
9b20d036
MS
8045 internal_error (__FILE__, __LINE__,
8046 _("arm_store_return_value: Floating "
8047 "point model not supported"));
08216dd7
RE
8048 break;
8049 }
34e8f22d 8050 }
b508a996
RE
8051 else if (TYPE_CODE (type) == TYPE_CODE_INT
8052 || TYPE_CODE (type) == TYPE_CODE_CHAR
8053 || TYPE_CODE (type) == TYPE_CODE_BOOL
8054 || TYPE_CODE (type) == TYPE_CODE_PTR
aa006118 8055 || TYPE_IS_REFERENCE (type)
b508a996
RE
8056 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8057 {
8058 if (TYPE_LENGTH (type) <= 4)
8059 {
8060 /* Values of one word or less are zero/sign-extended and
8061 returned in r0. */
f0452268 8062 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
b508a996
RE
8063 LONGEST val = unpack_long (type, valbuf);
8064
f0452268 8065 store_signed_integer (tmpbuf, ARM_INT_REGISTER_SIZE, byte_order, val);
b66f5587 8066 regs->cooked_write (ARM_A1_REGNUM, tmpbuf);
b508a996
RE
8067 }
8068 else
8069 {
8070 /* Integral values greater than one word are stored in consecutive
8071 registers starting with r0. This will always be a multiple of
8072 the regiser size. */
8073 int len = TYPE_LENGTH (type);
8074 int regno = ARM_A1_REGNUM;
8075
8076 while (len > 0)
8077 {
b66f5587 8078 regs->cooked_write (regno++, valbuf);
f0452268
AH
8079 len -= ARM_INT_REGISTER_SIZE;
8080 valbuf += ARM_INT_REGISTER_SIZE;
b508a996
RE
8081 }
8082 }
8083 }
34e8f22d 8084 else
b508a996
RE
8085 {
8086 /* For a structure or union the behaviour is as if the value had
8087 been stored to word-aligned memory and then loaded into
8088 registers with 32-bit load instruction(s). */
8089 int len = TYPE_LENGTH (type);
8090 int regno = ARM_A1_REGNUM;
f0452268 8091 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
b508a996
RE
8092
8093 while (len > 0)
8094 {
8095 memcpy (tmpbuf, valbuf,
f0452268 8096 len > ARM_INT_REGISTER_SIZE ? ARM_INT_REGISTER_SIZE : len);
b66f5587 8097 regs->cooked_write (regno++, tmpbuf);
f0452268
AH
8098 len -= ARM_INT_REGISTER_SIZE;
8099 valbuf += ARM_INT_REGISTER_SIZE;
b508a996
RE
8100 }
8101 }
34e8f22d
RE
8102}
8103
2af48f68
PB
8104
8105/* Handle function return values. */
8106
8107static enum return_value_convention
6a3a010b 8108arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8109 struct type *valtype, struct regcache *regcache,
8110 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8111{
7c00367c 8112 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8113 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8114 enum arm_vfp_cprc_base_type vfp_base_type;
8115 int vfp_base_count;
8116
8117 if (arm_vfp_abi_for_function (gdbarch, func_type)
8118 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8119 {
8120 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8121 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8122 int i;
8123 for (i = 0; i < vfp_base_count; i++)
8124 {
58d6951d
DJ
8125 if (reg_char == 'q')
8126 {
8127 if (writebuf)
8128 arm_neon_quad_write (gdbarch, regcache, i,
8129 writebuf + i * unit_length);
8130
8131 if (readbuf)
8132 arm_neon_quad_read (gdbarch, regcache, i,
8133 readbuf + i * unit_length);
8134 }
8135 else
8136 {
8137 char name_buf[4];
8138 int regnum;
8139
8c042590 8140 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8141 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8142 strlen (name_buf));
8143 if (writebuf)
b66f5587 8144 regcache->cooked_write (regnum, writebuf + i * unit_length);
58d6951d 8145 if (readbuf)
dca08e1f 8146 regcache->cooked_read (regnum, readbuf + i * unit_length);
58d6951d 8147 }
90445bd3
DJ
8148 }
8149 return RETURN_VALUE_REGISTER_CONVENTION;
8150 }
7c00367c 8151
2af48f68
PB
8152 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8153 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8154 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8155 {
7c00367c
MK
8156 if (tdep->struct_return == pcc_struct_return
8157 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8158 return RETURN_VALUE_STRUCT_CONVENTION;
8159 }
b13c8ab2
YQ
8160 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8161 {
8162 if (arm_return_in_memory (gdbarch, valtype))
8163 return RETURN_VALUE_STRUCT_CONVENTION;
8164 }
7052e42c 8165
2af48f68
PB
8166 if (writebuf)
8167 arm_store_return_value (valtype, regcache, writebuf);
8168
8169 if (readbuf)
8170 arm_extract_return_value (valtype, regcache, readbuf);
8171
8172 return RETURN_VALUE_REGISTER_CONVENTION;
8173}
8174
8175
9df628e0 8176static int
60ade65d 8177arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8178{
e17a4113
UW
8179 struct gdbarch *gdbarch = get_frame_arch (frame);
8180 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8181 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8182 CORE_ADDR jb_addr;
f0452268 8183 gdb_byte buf[ARM_INT_REGISTER_SIZE];
9df628e0 8184
60ade65d 8185 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8186
8187 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
f0452268 8188 ARM_INT_REGISTER_SIZE))
9df628e0
RE
8189 return 0;
8190
f0452268 8191 *pc = extract_unsigned_integer (buf, ARM_INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8192 return 1;
8193}
8194
faa95490
DJ
8195/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8196 return the target PC. Otherwise return 0. */
c906108c
SS
8197
8198CORE_ADDR
52f729a7 8199arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8200{
2c02bd72 8201 const char *name;
faa95490 8202 int namelen;
c906108c
SS
8203 CORE_ADDR start_addr;
8204
8205 /* Find the starting address and name of the function containing the PC. */
8206 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8207 {
8208 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8209 check here. */
8210 start_addr = arm_skip_bx_reg (frame, pc);
8211 if (start_addr != 0)
8212 return start_addr;
8213
8214 return 0;
8215 }
c906108c 8216
faa95490
DJ
8217 /* If PC is in a Thumb call or return stub, return the address of the
8218 target PC, which is in a register. The thunk functions are called
8219 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8220 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8221 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8222 if (startswith (name, "_call_via_")
8223 || startswith (name, "__ARM_call_via_"))
c906108c 8224 {
ed9a39eb
JM
8225 /* Use the name suffix to determine which register contains the
8226 target PC. */
a121b7c1 8227 static const char *table[15] =
c5aa993b
JM
8228 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8229 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8230 };
c906108c 8231 int regno;
faa95490 8232 int offset = strlen (name) - 2;
c906108c
SS
8233
8234 for (regno = 0; regno <= 14; regno++)
faa95490 8235 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8236 return get_frame_register_unsigned (frame, regno);
c906108c 8237 }
ed9a39eb 8238
faa95490
DJ
8239 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8240 non-interworking calls to foo. We could decode the stubs
8241 to find the target but it's easier to use the symbol table. */
8242 namelen = strlen (name);
8243 if (name[0] == '_' && name[1] == '_'
8244 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8245 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8246 || (namelen > 2 + strlen ("_from_arm")
61012eef 8247 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8248 {
8249 char *target_name;
8250 int target_len = namelen - 2;
3b7344d5 8251 struct bound_minimal_symbol minsym;
faa95490
DJ
8252 struct objfile *objfile;
8253 struct obj_section *sec;
8254
8255 if (name[namelen - 1] == 'b')
8256 target_len -= strlen ("_from_thumb");
8257 else
8258 target_len -= strlen ("_from_arm");
8259
224c3ddb 8260 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8261 memcpy (target_name, name + 2, target_len);
8262 target_name[target_len] = '\0';
8263
8264 sec = find_pc_section (pc);
8265 objfile = (sec == NULL) ? NULL : sec->objfile;
8266 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8267 if (minsym.minsym != NULL)
77e371c0 8268 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8269 else
8270 return 0;
8271 }
8272
c5aa993b 8273 return 0; /* not a stub */
c906108c
SS
8274}
8275
afd7eef0 8276static void
981a3fb3 8277set_arm_command (const char *args, int from_tty)
afd7eef0 8278{
edefbb7c
AC
8279 printf_unfiltered (_("\
8280\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8281 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8282}
8283
8284static void
981a3fb3 8285show_arm_command (const char *args, int from_tty)
afd7eef0 8286{
26304000 8287 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8288}
8289
28e97307
DJ
8290static void
8291arm_update_current_architecture (void)
fd50bc42 8292{
28e97307 8293 struct gdbarch_info info;
fd50bc42 8294
28e97307 8295 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8296 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8297 return;
fd50bc42 8298
28e97307
DJ
8299 /* Update the architecture. */
8300 gdbarch_info_init (&info);
fd50bc42 8301
28e97307 8302 if (!gdbarch_update_p (info))
9b20d036 8303 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8304}
8305
8306static void
eb4c3f4a 8307set_fp_model_sfunc (const char *args, int from_tty,
fd50bc42
RE
8308 struct cmd_list_element *c)
8309{
570dc176 8310 int fp_model;
fd50bc42
RE
8311
8312 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8313 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8314 {
aead7601 8315 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8316 break;
8317 }
8318
8319 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8320 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8321 current_fp_model);
8322
28e97307 8323 arm_update_current_architecture ();
fd50bc42
RE
8324}
8325
8326static void
08546159
AC
8327show_fp_model (struct ui_file *file, int from_tty,
8328 struct cmd_list_element *c, const char *value)
fd50bc42 8329{
f5656ead 8330 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8331
28e97307 8332 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8333 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8334 fprintf_filtered (file, _("\
8335The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8336 fp_model_strings[tdep->fp_model]);
8337 else
8338 fprintf_filtered (file, _("\
8339The current ARM floating point model is \"%s\".\n"),
8340 fp_model_strings[arm_fp_model]);
8341}
8342
8343static void
eb4c3f4a 8344arm_set_abi (const char *args, int from_tty,
28e97307
DJ
8345 struct cmd_list_element *c)
8346{
570dc176 8347 int arm_abi;
28e97307
DJ
8348
8349 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8350 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8351 {
aead7601 8352 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8353 break;
8354 }
8355
8356 if (arm_abi == ARM_ABI_LAST)
8357 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8358 arm_abi_string);
8359
8360 arm_update_current_architecture ();
8361}
8362
8363static void
8364arm_show_abi (struct ui_file *file, int from_tty,
8365 struct cmd_list_element *c, const char *value)
8366{
f5656ead 8367 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8368
8369 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8370 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8371 fprintf_filtered (file, _("\
8372The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8373 arm_abi_strings[tdep->arm_abi]);
8374 else
8375 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8376 arm_abi_string);
fd50bc42
RE
8377}
8378
0428b8f5
DJ
8379static void
8380arm_show_fallback_mode (struct ui_file *file, int from_tty,
8381 struct cmd_list_element *c, const char *value)
8382{
0963b4bd
MS
8383 fprintf_filtered (file,
8384 _("The current execution mode assumed "
8385 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8386 arm_fallback_mode_string);
8387}
8388
8389static void
8390arm_show_force_mode (struct ui_file *file, int from_tty,
8391 struct cmd_list_element *c, const char *value)
8392{
0963b4bd
MS
8393 fprintf_filtered (file,
8394 _("The current execution mode assumed "
8395 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8396 arm_force_mode_string);
8397}
8398
afd7eef0
RE
8399/* If the user changes the register disassembly style used for info
8400 register and other commands, we have to also switch the style used
8401 in opcodes for disassembly output. This function is run in the "set
8402 arm disassembly" command, and does that. */
bc90b915
FN
8403
8404static void
eb4c3f4a 8405set_disassembly_style_sfunc (const char *args, int from_tty,
65b48a81 8406 struct cmd_list_element *c)
bc90b915 8407{
65b48a81
PB
8408 /* Convert the short style name into the long style name (eg, reg-names-*)
8409 before calling the generic set_disassembler_options() function. */
8410 std::string long_name = std::string ("reg-names-") + disassembly_style;
8411 set_disassembler_options (&long_name[0]);
8412}
8413
8414static void
8415show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
8416 struct cmd_list_element *c, const char *value)
8417{
8418 struct gdbarch *gdbarch = get_current_arch ();
8419 char *options = get_disassembler_options (gdbarch);
8420 const char *style = "";
8421 int len = 0;
f995bbe8 8422 const char *opt;
65b48a81
PB
8423
8424 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
8425 if (CONST_STRNEQ (opt, "reg-names-"))
8426 {
8427 style = &opt[strlen ("reg-names-")];
8428 len = strcspn (style, ",");
8429 }
8430
8431 fprintf_unfiltered (file, "The disassembly style is \"%.*s\".\n", len, style);
bc90b915
FN
8432}
8433\f
966fbf70 8434/* Return the ARM register name corresponding to register I. */
a208b0cb 8435static const char *
d93859e2 8436arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8437{
58d6951d
DJ
8438 const int num_regs = gdbarch_num_regs (gdbarch);
8439
8440 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8441 && i >= num_regs && i < num_regs + 32)
8442 {
8443 static const char *const vfp_pseudo_names[] = {
8444 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8445 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8446 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8447 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8448 };
8449
8450 return vfp_pseudo_names[i - num_regs];
8451 }
8452
8453 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8454 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8455 {
8456 static const char *const neon_pseudo_names[] = {
8457 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8458 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8459 };
8460
8461 return neon_pseudo_names[i - num_regs - 32];
8462 }
8463
ff6f572f
DJ
8464 if (i >= ARRAY_SIZE (arm_register_names))
8465 /* These registers are only supported on targets which supply
8466 an XML description. */
8467 return "";
8468
966fbf70
RE
8469 return arm_register_names[i];
8470}
8471
082fc60d
RE
8472/* Test whether the coff symbol specific value corresponds to a Thumb
8473 function. */
8474
8475static int
8476coff_sym_is_thumb (int val)
8477{
f8bf5763
PM
8478 return (val == C_THUMBEXT
8479 || val == C_THUMBSTAT
8480 || val == C_THUMBEXTFUNC
8481 || val == C_THUMBSTATFUNC
8482 || val == C_THUMBLABEL);
082fc60d
RE
8483}
8484
8485/* arm_coff_make_msymbol_special()
8486 arm_elf_make_msymbol_special()
8487
8488 These functions test whether the COFF or ELF symbol corresponds to
8489 an address in thumb code, and set a "special" bit in a minimal
8490 symbol to indicate that it does. */
8491
34e8f22d 8492static void
082fc60d
RE
8493arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8494{
39d911fc
TP
8495 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
8496
8497 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
467d42c4 8498 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8499 MSYMBOL_SET_SPECIAL (msym);
8500}
8501
34e8f22d 8502static void
082fc60d
RE
8503arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8504{
8505 if (coff_sym_is_thumb (val))
8506 MSYMBOL_SET_SPECIAL (msym);
8507}
8508
60c5725c
DJ
8509static void
8510arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8511 asymbol *sym)
8512{
8513 const char *name = bfd_asymbol_name (sym);
8514 struct arm_per_objfile *data;
60c5725c
DJ
8515 struct arm_mapping_symbol new_map_sym;
8516
8517 gdb_assert (name[0] == '$');
8518 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8519 return;
8520
1b7f24cd 8521 data = arm_objfile_data_key.get (objfile);
60c5725c 8522 if (data == NULL)
1b7f24cd
TT
8523 data = arm_objfile_data_key.emplace (objfile,
8524 objfile->obfd->section_count);
54cc7474
SM
8525 arm_mapping_symbol_vec &map
8526 = data->section_maps[bfd_get_section (sym)->index];
60c5725c
DJ
8527
8528 new_map_sym.value = sym->value;
8529 new_map_sym.type = name[1];
8530
4838e44c
SM
8531 /* Insert at the end, the vector will be sorted on first use. */
8532 map.push_back (new_map_sym);
60c5725c
DJ
8533}
8534
756fe439 8535static void
61a1198a 8536arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8537{
ac7936df 8538 struct gdbarch *gdbarch = regcache->arch ();
61a1198a 8539 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8540
8541 /* If necessary, set the T bit. */
8542 if (arm_apcs_32)
8543 {
9779414d 8544 ULONGEST val, t_bit;
61a1198a 8545 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8546 t_bit = arm_psr_thumb_bit (gdbarch);
8547 if (arm_pc_is_thumb (gdbarch, pc))
8548 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8549 val | t_bit);
756fe439 8550 else
61a1198a 8551 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8552 val & ~t_bit);
756fe439
DJ
8553 }
8554}
123dc839 8555
58d6951d
DJ
8556/* Read the contents of a NEON quad register, by reading from two
8557 double registers. This is used to implement the quad pseudo
8558 registers, and for argument passing in case the quad registers are
8559 missing; vectors are passed in quad registers when using the VFP
8560 ABI, even if a NEON unit is not present. REGNUM is the index of
8561 the quad register, in [0, 15]. */
8562
05d1431c 8563static enum register_status
849d0ba8 8564arm_neon_quad_read (struct gdbarch *gdbarch, readable_regcache *regcache,
58d6951d
DJ
8565 int regnum, gdb_byte *buf)
8566{
8567 char name_buf[4];
8568 gdb_byte reg_buf[8];
8569 int offset, double_regnum;
05d1431c 8570 enum register_status status;
58d6951d 8571
8c042590 8572 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8573 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8574 strlen (name_buf));
8575
8576 /* d0 is always the least significant half of q0. */
8577 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8578 offset = 8;
8579 else
8580 offset = 0;
8581
03f50fc8 8582 status = regcache->raw_read (double_regnum, reg_buf);
05d1431c
PA
8583 if (status != REG_VALID)
8584 return status;
58d6951d
DJ
8585 memcpy (buf + offset, reg_buf, 8);
8586
8587 offset = 8 - offset;
03f50fc8 8588 status = regcache->raw_read (double_regnum + 1, reg_buf);
05d1431c
PA
8589 if (status != REG_VALID)
8590 return status;
58d6951d 8591 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8592
8593 return REG_VALID;
58d6951d
DJ
8594}
8595
05d1431c 8596static enum register_status
849d0ba8 8597arm_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
58d6951d
DJ
8598 int regnum, gdb_byte *buf)
8599{
8600 const int num_regs = gdbarch_num_regs (gdbarch);
8601 char name_buf[4];
8602 gdb_byte reg_buf[8];
8603 int offset, double_regnum;
8604
8605 gdb_assert (regnum >= num_regs);
8606 regnum -= num_regs;
8607
8608 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8609 /* Quad-precision register. */
05d1431c 8610 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8611 else
8612 {
05d1431c
PA
8613 enum register_status status;
8614
58d6951d
DJ
8615 /* Single-precision register. */
8616 gdb_assert (regnum < 32);
8617
8618 /* s0 is always the least significant half of d0. */
8619 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8620 offset = (regnum & 1) ? 0 : 4;
8621 else
8622 offset = (regnum & 1) ? 4 : 0;
8623
8c042590 8624 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8625 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8626 strlen (name_buf));
8627
03f50fc8 8628 status = regcache->raw_read (double_regnum, reg_buf);
05d1431c
PA
8629 if (status == REG_VALID)
8630 memcpy (buf, reg_buf + offset, 4);
8631 return status;
58d6951d
DJ
8632 }
8633}
8634
8635/* Store the contents of BUF to a NEON quad register, by writing to
8636 two double registers. This is used to implement the quad pseudo
8637 registers, and for argument passing in case the quad registers are
8638 missing; vectors are passed in quad registers when using the VFP
8639 ABI, even if a NEON unit is not present. REGNUM is the index
8640 of the quad register, in [0, 15]. */
8641
8642static void
8643arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8644 int regnum, const gdb_byte *buf)
8645{
8646 char name_buf[4];
58d6951d
DJ
8647 int offset, double_regnum;
8648
8c042590 8649 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8650 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8651 strlen (name_buf));
8652
8653 /* d0 is always the least significant half of q0. */
8654 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8655 offset = 8;
8656 else
8657 offset = 0;
8658
10eaee5f 8659 regcache->raw_write (double_regnum, buf + offset);
58d6951d 8660 offset = 8 - offset;
10eaee5f 8661 regcache->raw_write (double_regnum + 1, buf + offset);
58d6951d
DJ
8662}
8663
8664static void
8665arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8666 int regnum, const gdb_byte *buf)
8667{
8668 const int num_regs = gdbarch_num_regs (gdbarch);
8669 char name_buf[4];
8670 gdb_byte reg_buf[8];
8671 int offset, double_regnum;
8672
8673 gdb_assert (regnum >= num_regs);
8674 regnum -= num_regs;
8675
8676 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8677 /* Quad-precision register. */
8678 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8679 else
8680 {
8681 /* Single-precision register. */
8682 gdb_assert (regnum < 32);
8683
8684 /* s0 is always the least significant half of d0. */
8685 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8686 offset = (regnum & 1) ? 0 : 4;
8687 else
8688 offset = (regnum & 1) ? 4 : 0;
8689
8c042590 8690 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8691 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8692 strlen (name_buf));
8693
0b883586 8694 regcache->raw_read (double_regnum, reg_buf);
58d6951d 8695 memcpy (reg_buf + offset, buf, 4);
10eaee5f 8696 regcache->raw_write (double_regnum, reg_buf);
58d6951d
DJ
8697 }
8698}
8699
123dc839
DJ
8700static struct value *
8701value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8702{
9a3c8263 8703 const int *reg_p = (const int *) baton;
123dc839
DJ
8704 return value_of_register (*reg_p, frame);
8705}
97e03143 8706\f
70f80edf
JT
8707static enum gdb_osabi
8708arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8709{
2af48f68 8710 unsigned int elfosabi;
70f80edf 8711 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8712
70f80edf 8713 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8714
28e97307
DJ
8715 if (elfosabi == ELFOSABI_ARM)
8716 /* GNU tools use this value. Check note sections in this case,
8717 as well. */
8718 bfd_map_over_sections (abfd,
8719 generic_elf_osabi_sniff_abi_tag_sections,
8720 &osabi);
97e03143 8721
28e97307 8722 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8723 return osabi;
97e03143
RE
8724}
8725
54483882
YQ
8726static int
8727arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8728 struct reggroup *group)
8729{
2c291032
YQ
8730 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8731 this, FPS register belongs to save_regroup, restore_reggroup, and
8732 all_reggroup, of course. */
54483882 8733 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8734 return (group == float_reggroup
8735 || group == save_reggroup
8736 || group == restore_reggroup
8737 || group == all_reggroup);
54483882
YQ
8738 else
8739 return default_register_reggroup_p (gdbarch, regnum, group);
8740}
8741
25f8c692
JL
8742\f
8743/* For backward-compatibility we allow two 'g' packet lengths with
8744 the remote protocol depending on whether FPA registers are
8745 supplied. M-profile targets do not have FPA registers, but some
8746 stubs already exist in the wild which use a 'g' packet which
8747 supplies them albeit with dummy values. The packet format which
8748 includes FPA registers should be considered deprecated for
8749 M-profile targets. */
8750
8751static void
8752arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8753{
8754 if (gdbarch_tdep (gdbarch)->is_m)
8755 {
8756 /* If we know from the executable this is an M-profile target,
8757 cater for remote targets whose register set layout is the
8758 same as the FPA layout. */
8759 register_remote_g_packet_guess (gdbarch,
350fab54 8760 ARM_CORE_REGS_SIZE + ARM_FP_REGS_SIZE,
25f8c692
JL
8761 tdesc_arm_with_m_fpa_layout);
8762
8763 /* The regular M-profile layout. */
350fab54 8764 register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE,
25f8c692 8765 tdesc_arm_with_m);
3184d3f9
JL
8766
8767 /* M-profile plus M4F VFP. */
8768 register_remote_g_packet_guess (gdbarch,
350fab54 8769 ARM_CORE_REGS_SIZE + ARM_VFP2_REGS_SIZE,
3184d3f9 8770 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8771 }
8772
8773 /* Otherwise we don't have a useful guess. */
8774}
8775
7eb89530
YQ
8776/* Implement the code_of_frame_writable gdbarch method. */
8777
8778static int
8779arm_code_of_frame_writable (struct gdbarch *gdbarch, struct frame_info *frame)
8780{
8781 if (gdbarch_tdep (gdbarch)->is_m
8782 && get_frame_type (frame) == SIGTRAMP_FRAME)
8783 {
8784 /* M-profile exception frames return to some magic PCs, where
8785 isn't writable at all. */
8786 return 0;
8787 }
8788 else
8789 return 1;
8790}
8791
3426ae57
AH
8792/* Implement gdbarch_gnu_triplet_regexp. If the arch name is arm then allow it
8793 to be postfixed by a version (eg armv7hl). */
8794
8795static const char *
8796arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
8797{
8798 if (strcmp (gdbarch_bfd_arch_info (gdbarch)->arch_name, "arm") == 0)
8799 return "arm(v[^- ]*)?";
8800 return gdbarch_bfd_arch_info (gdbarch)->arch_name;
8801}
8802
da3c6d4a
MS
8803/* Initialize the current architecture based on INFO. If possible,
8804 re-use an architecture from ARCHES, which is a list of
8805 architectures already created during this debugging session.
97e03143 8806
da3c6d4a
MS
8807 Called e.g. at program startup, when reading a core file, and when
8808 reading a binary file. */
97e03143 8809
39bbf761
RE
8810static struct gdbarch *
8811arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8812{
97e03143 8813 struct gdbarch_tdep *tdep;
39bbf761 8814 struct gdbarch *gdbarch;
28e97307
DJ
8815 struct gdbarch_list *best_arch;
8816 enum arm_abi_kind arm_abi = arm_abi_global;
8817 enum arm_float_model fp_model = arm_fp_model;
123dc839 8818 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8819 int i, is_m = 0;
330c6ca9 8820 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8821 int have_wmmx_registers = 0;
58d6951d 8822 int have_neon = 0;
ff6f572f 8823 int have_fpa_registers = 1;
9779414d
DJ
8824 const struct target_desc *tdesc = info.target_desc;
8825
8826 /* If we have an object to base this architecture on, try to determine
8827 its ABI. */
8828
8829 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8830 {
8831 int ei_osabi, e_flags;
8832
8833 switch (bfd_get_flavour (info.abfd))
8834 {
9779414d
DJ
8835 case bfd_target_coff_flavour:
8836 /* Assume it's an old APCS-style ABI. */
8837 /* XXX WinCE? */
8838 arm_abi = ARM_ABI_APCS;
8839 break;
8840
8841 case bfd_target_elf_flavour:
8842 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8843 e_flags = elf_elfheader (info.abfd)->e_flags;
8844
8845 if (ei_osabi == ELFOSABI_ARM)
8846 {
8847 /* GNU tools used to use this value, but do not for EABI
8848 objects. There's nowhere to tag an EABI version
8849 anyway, so assume APCS. */
8850 arm_abi = ARM_ABI_APCS;
8851 }
d403db27 8852 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8853 {
8854 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
9779414d
DJ
8855
8856 switch (eabi_ver)
8857 {
8858 case EF_ARM_EABI_UNKNOWN:
8859 /* Assume GNU tools. */
8860 arm_abi = ARM_ABI_APCS;
8861 break;
8862
8863 case EF_ARM_EABI_VER4:
8864 case EF_ARM_EABI_VER5:
8865 arm_abi = ARM_ABI_AAPCS;
8866 /* EABI binaries default to VFP float ordering.
8867 They may also contain build attributes that can
8868 be used to identify if the VFP argument-passing
8869 ABI is in use. */
8870 if (fp_model == ARM_FLOAT_AUTO)
8871 {
8872#ifdef HAVE_ELF
8873 switch (bfd_elf_get_obj_attr_int (info.abfd,
8874 OBJ_ATTR_PROC,
8875 Tag_ABI_VFP_args))
8876 {
b35b0298 8877 case AEABI_VFP_args_base:
9779414d
DJ
8878 /* "The user intended FP parameter/result
8879 passing to conform to AAPCS, base
8880 variant". */
8881 fp_model = ARM_FLOAT_SOFT_VFP;
8882 break;
b35b0298 8883 case AEABI_VFP_args_vfp:
9779414d
DJ
8884 /* "The user intended FP parameter/result
8885 passing to conform to AAPCS, VFP
8886 variant". */
8887 fp_model = ARM_FLOAT_VFP;
8888 break;
b35b0298 8889 case AEABI_VFP_args_toolchain:
9779414d
DJ
8890 /* "The user intended FP parameter/result
8891 passing to conform to tool chain-specific
8892 conventions" - we don't know any such
8893 conventions, so leave it as "auto". */
8894 break;
b35b0298 8895 case AEABI_VFP_args_compatible:
5c294fee
TG
8896 /* "Code is compatible with both the base
8897 and VFP variants; the user did not permit
8898 non-variadic functions to pass FP
8899 parameters/results" - leave it as
8900 "auto". */
8901 break;
9779414d
DJ
8902 default:
8903 /* Attribute value not mentioned in the
5c294fee 8904 November 2012 ABI, so leave it as
9779414d
DJ
8905 "auto". */
8906 break;
8907 }
8908#else
8909 fp_model = ARM_FLOAT_SOFT_VFP;
8910#endif
8911 }
8912 break;
8913
8914 default:
8915 /* Leave it as "auto". */
8916 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8917 break;
8918 }
8919
8920#ifdef HAVE_ELF
8921 /* Detect M-profile programs. This only works if the
8922 executable file includes build attributes; GCC does
8923 copy them to the executable, but e.g. RealView does
8924 not. */
17cbafdb
SM
8925 int attr_arch
8926 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8927 Tag_CPU_arch);
8928 int attr_profile
8929 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8930 Tag_CPU_arch_profile);
8931
9779414d
DJ
8932 /* GCC specifies the profile for v6-M; RealView only
8933 specifies the profile for architectures starting with
8934 V7 (as opposed to architectures with a tag
8935 numerically greater than TAG_CPU_ARCH_V7). */
8936 if (!tdesc_has_registers (tdesc)
8937 && (attr_arch == TAG_CPU_ARCH_V6_M
8938 || attr_arch == TAG_CPU_ARCH_V6S_M
8939 || attr_profile == 'M'))
25f8c692 8940 is_m = 1;
9779414d
DJ
8941#endif
8942 }
8943
8944 if (fp_model == ARM_FLOAT_AUTO)
8945 {
9779414d
DJ
8946 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8947 {
8948 case 0:
8949 /* Leave it as "auto". Strictly speaking this case
8950 means FPA, but almost nobody uses that now, and
8951 many toolchains fail to set the appropriate bits
8952 for the floating-point model they use. */
8953 break;
8954 case EF_ARM_SOFT_FLOAT:
8955 fp_model = ARM_FLOAT_SOFT_FPA;
8956 break;
8957 case EF_ARM_VFP_FLOAT:
8958 fp_model = ARM_FLOAT_VFP;
8959 break;
8960 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
8961 fp_model = ARM_FLOAT_SOFT_VFP;
8962 break;
8963 }
8964 }
8965
8966 if (e_flags & EF_ARM_BE8)
8967 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
8968
8969 break;
8970
8971 default:
8972 /* Leave it as "auto". */
8973 break;
8974 }
8975 }
123dc839
DJ
8976
8977 /* Check any target description for validity. */
9779414d 8978 if (tdesc_has_registers (tdesc))
123dc839
DJ
8979 {
8980 /* For most registers we require GDB's default names; but also allow
8981 the numeric names for sp / lr / pc, as a convenience. */
8982 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
8983 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
8984 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
8985
8986 const struct tdesc_feature *feature;
58d6951d 8987 int valid_p;
123dc839 8988
9779414d 8989 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8990 "org.gnu.gdb.arm.core");
8991 if (feature == NULL)
9779414d
DJ
8992 {
8993 feature = tdesc_find_feature (tdesc,
8994 "org.gnu.gdb.arm.m-profile");
8995 if (feature == NULL)
8996 return NULL;
8997 else
8998 is_m = 1;
8999 }
123dc839
DJ
9000
9001 tdesc_data = tdesc_data_alloc ();
9002
9003 valid_p = 1;
9004 for (i = 0; i < ARM_SP_REGNUM; i++)
9005 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9006 arm_register_names[i]);
9007 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9008 ARM_SP_REGNUM,
9009 arm_sp_names);
9010 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9011 ARM_LR_REGNUM,
9012 arm_lr_names);
9013 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9014 ARM_PC_REGNUM,
9015 arm_pc_names);
9779414d
DJ
9016 if (is_m)
9017 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9018 ARM_PS_REGNUM, "xpsr");
9019 else
9020 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9021 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
9022
9023 if (!valid_p)
9024 {
9025 tdesc_data_cleanup (tdesc_data);
9026 return NULL;
9027 }
9028
9779414d 9029 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9030 "org.gnu.gdb.arm.fpa");
9031 if (feature != NULL)
9032 {
9033 valid_p = 1;
9034 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9035 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9036 arm_register_names[i]);
9037 if (!valid_p)
9038 {
9039 tdesc_data_cleanup (tdesc_data);
9040 return NULL;
9041 }
9042 }
ff6f572f
DJ
9043 else
9044 have_fpa_registers = 0;
9045
9779414d 9046 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9047 "org.gnu.gdb.xscale.iwmmxt");
9048 if (feature != NULL)
9049 {
9050 static const char *const iwmmxt_names[] = {
9051 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9052 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9053 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9054 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9055 };
9056
9057 valid_p = 1;
9058 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9059 valid_p
9060 &= tdesc_numbered_register (feature, tdesc_data, i,
9061 iwmmxt_names[i - ARM_WR0_REGNUM]);
9062
9063 /* Check for the control registers, but do not fail if they
9064 are missing. */
9065 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9066 tdesc_numbered_register (feature, tdesc_data, i,
9067 iwmmxt_names[i - ARM_WR0_REGNUM]);
9068
9069 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9070 valid_p
9071 &= tdesc_numbered_register (feature, tdesc_data, i,
9072 iwmmxt_names[i - ARM_WR0_REGNUM]);
9073
9074 if (!valid_p)
9075 {
9076 tdesc_data_cleanup (tdesc_data);
9077 return NULL;
9078 }
a56cc1ce
YQ
9079
9080 have_wmmx_registers = 1;
ff6f572f 9081 }
58d6951d
DJ
9082
9083 /* If we have a VFP unit, check whether the single precision registers
9084 are present. If not, then we will synthesize them as pseudo
9085 registers. */
9779414d 9086 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9087 "org.gnu.gdb.arm.vfp");
9088 if (feature != NULL)
9089 {
9090 static const char *const vfp_double_names[] = {
9091 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9092 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9093 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9094 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9095 };
9096
9097 /* Require the double precision registers. There must be either
9098 16 or 32. */
9099 valid_p = 1;
9100 for (i = 0; i < 32; i++)
9101 {
9102 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9103 ARM_D0_REGNUM + i,
9104 vfp_double_names[i]);
9105 if (!valid_p)
9106 break;
9107 }
2b9e5ea6
UW
9108 if (!valid_p && i == 16)
9109 valid_p = 1;
58d6951d 9110
2b9e5ea6
UW
9111 /* Also require FPSCR. */
9112 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9113 ARM_FPSCR_REGNUM, "fpscr");
9114 if (!valid_p)
58d6951d
DJ
9115 {
9116 tdesc_data_cleanup (tdesc_data);
9117 return NULL;
9118 }
9119
9120 if (tdesc_unnumbered_register (feature, "s0") == 0)
9121 have_vfp_pseudos = 1;
9122
330c6ca9 9123 vfp_register_count = i;
58d6951d
DJ
9124
9125 /* If we have VFP, also check for NEON. The architecture allows
9126 NEON without VFP (integer vector operations only), but GDB
9127 does not support that. */
9779414d 9128 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9129 "org.gnu.gdb.arm.neon");
9130 if (feature != NULL)
9131 {
9132 /* NEON requires 32 double-precision registers. */
9133 if (i != 32)
9134 {
9135 tdesc_data_cleanup (tdesc_data);
9136 return NULL;
9137 }
9138
9139 /* If there are quad registers defined by the stub, use
9140 their type; otherwise (normally) provide them with
9141 the default type. */
9142 if (tdesc_unnumbered_register (feature, "q0") == 0)
9143 have_neon_pseudos = 1;
9144
9145 have_neon = 1;
9146 }
9147 }
123dc839 9148 }
39bbf761 9149
28e97307
DJ
9150 /* If there is already a candidate, use it. */
9151 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9152 best_arch != NULL;
9153 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9154 {
b8926edc
DJ
9155 if (arm_abi != ARM_ABI_AUTO
9156 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9157 continue;
9158
b8926edc
DJ
9159 if (fp_model != ARM_FLOAT_AUTO
9160 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9161 continue;
9162
58d6951d
DJ
9163 /* There are various other properties in tdep that we do not
9164 need to check here: those derived from a target description,
9165 since gdbarches with a different target description are
9166 automatically disqualified. */
9167
9779414d
DJ
9168 /* Do check is_m, though, since it might come from the binary. */
9169 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9170 continue;
9171
28e97307
DJ
9172 /* Found a match. */
9173 break;
9174 }
97e03143 9175
28e97307 9176 if (best_arch != NULL)
123dc839
DJ
9177 {
9178 if (tdesc_data != NULL)
9179 tdesc_data_cleanup (tdesc_data);
9180 return best_arch->gdbarch;
9181 }
28e97307 9182
8d749320 9183 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9184 gdbarch = gdbarch_alloc (&info, tdep);
9185
28e97307
DJ
9186 /* Record additional information about the architecture we are defining.
9187 These are gdbarch discriminators, like the OSABI. */
9188 tdep->arm_abi = arm_abi;
9189 tdep->fp_model = fp_model;
9779414d 9190 tdep->is_m = is_m;
ff6f572f 9191 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9192 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9193 gdb_assert (vfp_register_count == 0
9194 || vfp_register_count == 16
9195 || vfp_register_count == 32);
9196 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9197 tdep->have_vfp_pseudos = have_vfp_pseudos;
9198 tdep->have_neon_pseudos = have_neon_pseudos;
9199 tdep->have_neon = have_neon;
08216dd7 9200
25f8c692
JL
9201 arm_register_g_packet_guesses (gdbarch);
9202
08216dd7 9203 /* Breakpoints. */
9d4fde75 9204 switch (info.byte_order_for_code)
67255d04
RE
9205 {
9206 case BFD_ENDIAN_BIG:
66e810cd
RE
9207 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9208 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9209 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9210 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9211
67255d04
RE
9212 break;
9213
9214 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9215 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9216 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9217 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9218 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9219
67255d04
RE
9220 break;
9221
9222 default:
9223 internal_error (__FILE__, __LINE__,
edefbb7c 9224 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9225 }
9226
d7b486e7
RE
9227 /* On ARM targets char defaults to unsigned. */
9228 set_gdbarch_char_signed (gdbarch, 0);
9229
53375380
PA
9230 /* wchar_t is unsigned under the AAPCS. */
9231 if (tdep->arm_abi == ARM_ABI_AAPCS)
9232 set_gdbarch_wchar_signed (gdbarch, 0);
9233 else
9234 set_gdbarch_wchar_signed (gdbarch, 1);
53375380 9235
030197b4
AB
9236 /* Compute type alignment. */
9237 set_gdbarch_type_align (gdbarch, arm_type_align);
9238
cca44b1b
JB
9239 /* Note: for displaced stepping, this includes the breakpoint, and one word
9240 of additional scratch space. This setting isn't used for anything beside
9241 displaced stepping at present. */
e935475c 9242 set_gdbarch_max_insn_length (gdbarch, 4 * ARM_DISPLACED_MODIFIED_INSNS);
cca44b1b 9243
9df628e0 9244 /* This should be low enough for everything. */
97e03143 9245 tdep->lowest_pc = 0x20;
94c30b78 9246 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9247
7c00367c
MK
9248 /* The default, for both APCS and AAPCS, is to return small
9249 structures in registers. */
9250 tdep->struct_return = reg_struct_return;
9251
2dd604e7 9252 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9253 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9254
7eb89530
YQ
9255 if (is_m)
9256 set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
9257
756fe439
DJ
9258 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9259
eb5492fa 9260 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9261
34e8f22d 9262 /* Address manipulation. */
34e8f22d
RE
9263 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9264
34e8f22d
RE
9265 /* Advance PC across function entry code. */
9266 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9267
c9cf6e20
MG
9268 /* Detect whether PC is at a point where the stack has been destroyed. */
9269 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9270
190dce09
UW
9271 /* Skip trampolines. */
9272 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9273
34e8f22d
RE
9274 /* The stack grows downward. */
9275 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9276
9277 /* Breakpoint manipulation. */
04180708
YQ
9278 set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
9279 set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
833b7ab5
YQ
9280 set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
9281 arm_breakpoint_kind_from_current_state);
34e8f22d
RE
9282
9283 /* Information about registers, etc. */
34e8f22d
RE
9284 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9285 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9286 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9287 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9288 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9289
ff6f572f
DJ
9290 /* This "info float" is FPA-specific. Use the generic version if we
9291 do not have FPA. */
9292 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9293 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9294
26216b98 9295 /* Internal <-> external register number maps. */
ff6f572f 9296 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9297 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9298
34e8f22d
RE
9299 set_gdbarch_register_name (gdbarch, arm_register_name);
9300
9301 /* Returning results. */
2af48f68 9302 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9303
03d48a7d
RE
9304 /* Disassembly. */
9305 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9306
34e8f22d
RE
9307 /* Minsymbol frobbing. */
9308 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9309 set_gdbarch_coff_make_msymbol_special (gdbarch,
9310 arm_coff_make_msymbol_special);
60c5725c 9311 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9312
f9d67f43
DJ
9313 /* Thumb-2 IT block support. */
9314 set_gdbarch_adjust_breakpoint_address (gdbarch,
9315 arm_adjust_breakpoint_address);
9316
0d5de010
DJ
9317 /* Virtual tables. */
9318 set_gdbarch_vbit_in_delta (gdbarch, 1);
9319
97e03143 9320 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9321 gdbarch_init_osabi (info, gdbarch);
97e03143 9322
b39cc962
DJ
9323 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9324
eb5492fa 9325 /* Add some default predicates. */
2ae28aa9
YQ
9326 if (is_m)
9327 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9328 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9329 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9330 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
779aa56f 9331 frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
a262aec2 9332 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9333
97e03143
RE
9334 /* Now we have tuned the configuration, set a few final things,
9335 based on what the OS ABI has told us. */
9336
b8926edc
DJ
9337 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9338 binaries are always marked. */
9339 if (tdep->arm_abi == ARM_ABI_AUTO)
9340 tdep->arm_abi = ARM_ABI_APCS;
9341
e3039479
UW
9342 /* Watchpoints are not steppable. */
9343 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9344
b8926edc
DJ
9345 /* We used to default to FPA for generic ARM, but almost nobody
9346 uses that now, and we now provide a way for the user to force
9347 the model. So default to the most useful variant. */
9348 if (tdep->fp_model == ARM_FLOAT_AUTO)
9349 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9350
9df628e0
RE
9351 if (tdep->jb_pc >= 0)
9352 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9353
08216dd7 9354 /* Floating point sizes and format. */
8da61cc4 9355 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9356 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9357 {
8da61cc4
DJ
9358 set_gdbarch_double_format
9359 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9360 set_gdbarch_long_double_format
9361 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9362 }
9363 else
9364 {
9365 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9366 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9367 }
9368
58d6951d
DJ
9369 if (have_vfp_pseudos)
9370 {
9371 /* NOTE: These are the only pseudo registers used by
9372 the ARM target at the moment. If more are added, a
9373 little more care in numbering will be needed. */
9374
9375 int num_pseudos = 32;
9376 if (have_neon_pseudos)
9377 num_pseudos += 16;
9378 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9379 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9380 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9381 }
9382
123dc839 9383 if (tdesc_data)
58d6951d
DJ
9384 {
9385 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9386
9779414d 9387 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9388
9389 /* Override tdesc_register_type to adjust the types of VFP
9390 registers for NEON. */
9391 set_gdbarch_register_type (gdbarch, arm_register_type);
9392 }
123dc839
DJ
9393
9394 /* Add standard register aliases. We add aliases even for those
9395 nanes which are used by the current architecture - it's simpler,
9396 and does no harm, since nothing ever lists user registers. */
9397 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9398 user_reg_add (gdbarch, arm_register_aliases[i].name,
9399 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9400
65b48a81
PB
9401 set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
9402 set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
9403
3426ae57
AH
9404 set_gdbarch_gnu_triplet_regexp (gdbarch, arm_gnu_triplet_regexp);
9405
39bbf761
RE
9406 return gdbarch;
9407}
9408
97e03143 9409static void
2af46ca0 9410arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9411{
2af46ca0 9412 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9413
9414 if (tdep == NULL)
9415 return;
9416
edefbb7c 9417 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9418 (unsigned long) tdep->lowest_pc);
9419}
9420
0d4c07af 9421#if GDB_SELF_TEST
b121eeb9
YQ
9422namespace selftests
9423{
9424static void arm_record_test (void);
9425}
0d4c07af 9426#endif
b121eeb9 9427
c906108c 9428void
ed9a39eb 9429_initialize_arm_tdep (void)
c906108c 9430{
bc90b915 9431 long length;
65b48a81 9432 int i, j;
edefbb7c
AC
9433 char regdesc[1024], *rdptr = regdesc;
9434 size_t rest = sizeof (regdesc);
085dd6e6 9435
42cf1509 9436 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9437
0e9e9abd 9438 /* Add ourselves to objfile event chain. */
76727919 9439 gdb::observers::new_objfile.attach (arm_exidx_new_objfile);
0e9e9abd 9440
70f80edf
JT
9441 /* Register an ELF OS ABI sniffer for ARM binaries. */
9442 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9443 bfd_target_elf_flavour,
9444 arm_elf_osabi_sniffer);
9445
9779414d
DJ
9446 /* Initialize the standard target descriptions. */
9447 initialize_tdesc_arm_with_m ();
25f8c692 9448 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9449 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9450 initialize_tdesc_arm_with_iwmmxt ();
9451 initialize_tdesc_arm_with_vfpv2 ();
9452 initialize_tdesc_arm_with_vfpv3 ();
9453 initialize_tdesc_arm_with_neon ();
9779414d 9454
afd7eef0
RE
9455 /* Add root prefix command for all "set arm"/"show arm" commands. */
9456 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9457 _("Various ARM-specific commands."),
afd7eef0
RE
9458 &setarmcmdlist, "set arm ", 0, &setlist);
9459
9460 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9461 _("Various ARM-specific commands."),
afd7eef0 9462 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9463
c5aa993b 9464
65b48a81 9465 arm_disassembler_options = xstrdup ("reg-names-std");
471b9d15
MR
9466 const disasm_options_t *disasm_options
9467 = &disassembler_options_arm ()->options;
65b48a81
PB
9468 int num_disassembly_styles = 0;
9469 for (i = 0; disasm_options->name[i] != NULL; i++)
9470 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9471 num_disassembly_styles++;
9472
9473 /* Initialize the array that will be passed to add_setshow_enum_cmd(). */
8d749320 9474 valid_disassembly_styles = XNEWVEC (const char *,
65b48a81
PB
9475 num_disassembly_styles + 1);
9476 for (i = j = 0; disasm_options->name[i] != NULL; i++)
9477 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9478 {
9479 size_t offset = strlen ("reg-names-");
9480 const char *style = disasm_options->name[i];
9481 valid_disassembly_styles[j++] = &style[offset];
9482 length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
9483 disasm_options->description[i]);
9484 rdptr += length;
9485 rest -= length;
9486 }
94c30b78 9487 /* Mark the end of valid options. */
65b48a81 9488 valid_disassembly_styles[num_disassembly_styles] = NULL;
c906108c 9489
edefbb7c 9490 /* Create the help text. */
d7e74731
PA
9491 std::string helptext = string_printf ("%s%s%s",
9492 _("The valid values are:\n"),
9493 regdesc,
9494 _("The default is \"std\"."));
ed9a39eb 9495
edefbb7c
AC
9496 add_setshow_enum_cmd("disassembler", no_class,
9497 valid_disassembly_styles, &disassembly_style,
9498 _("Set the disassembly style."),
9499 _("Show the disassembly style."),
09b0e4b0 9500 helptext.c_str (),
2c5b56ce 9501 set_disassembly_style_sfunc,
65b48a81 9502 show_disassembly_style_sfunc,
7376b4c2 9503 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9504
9505 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9506 _("Set usage of ARM 32-bit mode."),
9507 _("Show usage of ARM 32-bit mode."),
9508 _("When off, a 26-bit PC will be used."),
2c5b56ce 9509 NULL,
0963b4bd
MS
9510 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9511 mode is %s. */
26304000 9512 &setarmcmdlist, &showarmcmdlist);
c906108c 9513
fd50bc42 9514 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9515 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9516 _("Set the floating point type."),
9517 _("Show the floating point type."),
9518 _("auto - Determine the FP typefrom the OS-ABI.\n\
9519softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9520fpa - FPA co-processor (GCC compiled).\n\
9521softvfp - Software FP with pure-endian doubles.\n\
9522vfp - VFP co-processor."),
edefbb7c 9523 set_fp_model_sfunc, show_fp_model,
7376b4c2 9524 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9525
28e97307
DJ
9526 /* Add a command to allow the user to force the ABI. */
9527 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9528 _("Set the ABI."),
9529 _("Show the ABI."),
9530 NULL, arm_set_abi, arm_show_abi,
9531 &setarmcmdlist, &showarmcmdlist);
9532
0428b8f5
DJ
9533 /* Add two commands to allow the user to force the assumed
9534 execution mode. */
9535 add_setshow_enum_cmd ("fallback-mode", class_support,
9536 arm_mode_strings, &arm_fallback_mode_string,
9537 _("Set the mode assumed when symbols are unavailable."),
9538 _("Show the mode assumed when symbols are unavailable."),
9539 NULL, NULL, arm_show_fallback_mode,
9540 &setarmcmdlist, &showarmcmdlist);
9541 add_setshow_enum_cmd ("force-mode", class_support,
9542 arm_mode_strings, &arm_force_mode_string,
9543 _("Set the mode assumed even when symbols are available."),
9544 _("Show the mode assumed even when symbols are available."),
9545 NULL, NULL, arm_show_force_mode,
9546 &setarmcmdlist, &showarmcmdlist);
9547
6529d2dd 9548 /* Debugging flag. */
edefbb7c
AC
9549 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9550 _("Set ARM debugging."),
9551 _("Show ARM debugging."),
9552 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9553 NULL,
7915a72c 9554 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9555 &setdebuglist, &showdebuglist);
b121eeb9
YQ
9556
9557#if GDB_SELF_TEST
1526853e 9558 selftests::register_test ("arm-record", selftests::arm_record_test);
b121eeb9
YQ
9559#endif
9560
c906108c 9561}
72508ac0
PO
9562
9563/* ARM-reversible process record data structures. */
9564
9565#define ARM_INSN_SIZE_BYTES 4
9566#define THUMB_INSN_SIZE_BYTES 2
9567#define THUMB2_INSN_SIZE_BYTES 4
9568
9569
71e396f9
LM
9570/* Position of the bit within a 32-bit ARM instruction
9571 that defines whether the instruction is a load or store. */
72508ac0
PO
9572#define INSN_S_L_BIT_NUM 20
9573
9574#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9575 do \
9576 { \
9577 unsigned int reg_len = LENGTH; \
9578 if (reg_len) \
9579 { \
9580 REGS = XNEWVEC (uint32_t, reg_len); \
9581 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9582 } \
9583 } \
9584 while (0)
9585
9586#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9587 do \
9588 { \
9589 unsigned int mem_len = LENGTH; \
9590 if (mem_len) \
9591 { \
9592 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9593 memcpy(&MEMS->len, &RECORD_BUF[0], \
9594 sizeof(struct arm_mem_r) * LENGTH); \
9595 } \
9596 } \
9597 while (0)
9598
9599/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9600#define INSN_RECORDED(ARM_RECORD) \
9601 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9602
9603/* ARM memory record structure. */
9604struct arm_mem_r
9605{
9606 uint32_t len; /* Record length. */
bfbbec00 9607 uint32_t addr; /* Memory address. */
72508ac0
PO
9608};
9609
9610/* ARM instruction record contains opcode of current insn
9611 and execution state (before entry to decode_insn()),
9612 contains list of to-be-modified registers and
9613 memory blocks (on return from decode_insn()). */
9614
9615typedef struct insn_decode_record_t
9616{
9617 struct gdbarch *gdbarch;
9618 struct regcache *regcache;
9619 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9620 uint32_t arm_insn; /* Should accommodate thumb. */
9621 uint32_t cond; /* Condition code. */
9622 uint32_t opcode; /* Insn opcode. */
9623 uint32_t decode; /* Insn decode bits. */
9624 uint32_t mem_rec_count; /* No of mem records. */
9625 uint32_t reg_rec_count; /* No of reg records. */
9626 uint32_t *arm_regs; /* Registers to be saved for this record. */
9627 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9628} insn_decode_record;
9629
9630
9631/* Checks ARM SBZ and SBO mandatory fields. */
9632
9633static int
9634sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9635{
9636 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9637
9638 if (!len)
9639 return 1;
9640
9641 if (!sbo)
9642 ones = ~ones;
9643
9644 while (ones)
9645 {
9646 if (!(ones & sbo))
9647 {
9648 return 0;
9649 }
9650 ones = ones >> 1;
9651 }
9652 return 1;
9653}
9654
c6ec2b30
OJ
9655enum arm_record_result
9656{
9657 ARM_RECORD_SUCCESS = 0,
9658 ARM_RECORD_FAILURE = 1
9659};
9660
72508ac0
PO
9661typedef enum
9662{
9663 ARM_RECORD_STRH=1,
9664 ARM_RECORD_STRD
9665} arm_record_strx_t;
9666
9667typedef enum
9668{
9669 ARM_RECORD=1,
9670 THUMB_RECORD,
9671 THUMB2_RECORD
9672} record_type_t;
9673
9674
9675static int
9676arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9677 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9678{
9679
9680 struct regcache *reg_cache = arm_insn_r->regcache;
9681 ULONGEST u_regval[2]= {0};
9682
9683 uint32_t reg_src1 = 0, reg_src2 = 0;
9684 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
72508ac0
PO
9685
9686 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9687 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
72508ac0
PO
9688
9689 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9690 {
9691 /* 1) Handle misc store, immediate offset. */
9692 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9693 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9694 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9695 regcache_raw_read_unsigned (reg_cache, reg_src1,
9696 &u_regval[0]);
9697 if (ARM_PC_REGNUM == reg_src1)
9698 {
9699 /* If R15 was used as Rn, hence current PC+8. */
9700 u_regval[0] = u_regval[0] + 8;
9701 }
9702 offset_8 = (immed_high << 4) | immed_low;
9703 /* Calculate target store address. */
9704 if (14 == arm_insn_r->opcode)
9705 {
9706 tgt_mem_addr = u_regval[0] + offset_8;
9707 }
9708 else
9709 {
9710 tgt_mem_addr = u_regval[0] - offset_8;
9711 }
9712 if (ARM_RECORD_STRH == str_type)
9713 {
9714 record_buf_mem[0] = 2;
9715 record_buf_mem[1] = tgt_mem_addr;
9716 arm_insn_r->mem_rec_count = 1;
9717 }
9718 else if (ARM_RECORD_STRD == str_type)
9719 {
9720 record_buf_mem[0] = 4;
9721 record_buf_mem[1] = tgt_mem_addr;
9722 record_buf_mem[2] = 4;
9723 record_buf_mem[3] = tgt_mem_addr + 4;
9724 arm_insn_r->mem_rec_count = 2;
9725 }
9726 }
9727 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9728 {
9729 /* 2) Store, register offset. */
9730 /* Get Rm. */
9731 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9732 /* Get Rn. */
9733 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9734 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9735 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9736 if (15 == reg_src2)
9737 {
9738 /* If R15 was used as Rn, hence current PC+8. */
9739 u_regval[0] = u_regval[0] + 8;
9740 }
9741 /* Calculate target store address, Rn +/- Rm, register offset. */
9742 if (12 == arm_insn_r->opcode)
9743 {
9744 tgt_mem_addr = u_regval[0] + u_regval[1];
9745 }
9746 else
9747 {
9748 tgt_mem_addr = u_regval[1] - u_regval[0];
9749 }
9750 if (ARM_RECORD_STRH == str_type)
9751 {
9752 record_buf_mem[0] = 2;
9753 record_buf_mem[1] = tgt_mem_addr;
9754 arm_insn_r->mem_rec_count = 1;
9755 }
9756 else if (ARM_RECORD_STRD == str_type)
9757 {
9758 record_buf_mem[0] = 4;
9759 record_buf_mem[1] = tgt_mem_addr;
9760 record_buf_mem[2] = 4;
9761 record_buf_mem[3] = tgt_mem_addr + 4;
9762 arm_insn_r->mem_rec_count = 2;
9763 }
9764 }
9765 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9766 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9767 {
9768 /* 3) Store, immediate pre-indexed. */
9769 /* 5) Store, immediate post-indexed. */
9770 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9771 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9772 offset_8 = (immed_high << 4) | immed_low;
9773 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9774 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9775 /* Calculate target store address, Rn +/- Rm, register offset. */
9776 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9777 {
9778 tgt_mem_addr = u_regval[0] + offset_8;
9779 }
9780 else
9781 {
9782 tgt_mem_addr = u_regval[0] - offset_8;
9783 }
9784 if (ARM_RECORD_STRH == str_type)
9785 {
9786 record_buf_mem[0] = 2;
9787 record_buf_mem[1] = tgt_mem_addr;
9788 arm_insn_r->mem_rec_count = 1;
9789 }
9790 else if (ARM_RECORD_STRD == str_type)
9791 {
9792 record_buf_mem[0] = 4;
9793 record_buf_mem[1] = tgt_mem_addr;
9794 record_buf_mem[2] = 4;
9795 record_buf_mem[3] = tgt_mem_addr + 4;
9796 arm_insn_r->mem_rec_count = 2;
9797 }
9798 /* Record Rn also as it changes. */
9799 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9800 arm_insn_r->reg_rec_count = 1;
9801 }
9802 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9803 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9804 {
9805 /* 4) Store, register pre-indexed. */
9806 /* 6) Store, register post -indexed. */
9807 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9808 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9809 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9810 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9811 /* Calculate target store address, Rn +/- Rm, register offset. */
9812 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9813 {
9814 tgt_mem_addr = u_regval[0] + u_regval[1];
9815 }
9816 else
9817 {
9818 tgt_mem_addr = u_regval[1] - u_regval[0];
9819 }
9820 if (ARM_RECORD_STRH == str_type)
9821 {
9822 record_buf_mem[0] = 2;
9823 record_buf_mem[1] = tgt_mem_addr;
9824 arm_insn_r->mem_rec_count = 1;
9825 }
9826 else if (ARM_RECORD_STRD == str_type)
9827 {
9828 record_buf_mem[0] = 4;
9829 record_buf_mem[1] = tgt_mem_addr;
9830 record_buf_mem[2] = 4;
9831 record_buf_mem[3] = tgt_mem_addr + 4;
9832 arm_insn_r->mem_rec_count = 2;
9833 }
9834 /* Record Rn also as it changes. */
9835 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9836 arm_insn_r->reg_rec_count = 1;
9837 }
9838 return 0;
9839}
9840
9841/* Handling ARM extension space insns. */
9842
9843static int
9844arm_record_extension_space (insn_decode_record *arm_insn_r)
9845{
df95a9cf 9846 int ret = 0; /* Return value: -1:record failure ; 0:success */
72508ac0
PO
9847 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9848 uint32_t record_buf[8], record_buf_mem[8];
9849 uint32_t reg_src1 = 0;
72508ac0
PO
9850 struct regcache *reg_cache = arm_insn_r->regcache;
9851 ULONGEST u_regval = 0;
9852
9853 gdb_assert (!INSN_RECORDED(arm_insn_r));
9854 /* Handle unconditional insn extension space. */
9855
9856 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9857 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9858 if (arm_insn_r->cond)
9859 {
9860 /* PLD has no affect on architectural state, it just affects
9861 the caches. */
9862 if (5 == ((opcode1 & 0xE0) >> 5))
9863 {
9864 /* BLX(1) */
9865 record_buf[0] = ARM_PS_REGNUM;
9866 record_buf[1] = ARM_LR_REGNUM;
9867 arm_insn_r->reg_rec_count = 2;
9868 }
9869 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9870 }
9871
9872
9873 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9874 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9875 {
9876 ret = -1;
9877 /* Undefined instruction on ARM V5; need to handle if later
9878 versions define it. */
9879 }
9880
9881 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9882 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9883 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9884
9885 /* Handle arithmetic insn extension space. */
9886 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9887 && !INSN_RECORDED(arm_insn_r))
9888 {
9889 /* Handle MLA(S) and MUL(S). */
b020ff80 9890 if (in_inclusive_range (insn_op1, 0U, 3U))
72508ac0
PO
9891 {
9892 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9893 record_buf[1] = ARM_PS_REGNUM;
9894 arm_insn_r->reg_rec_count = 2;
9895 }
b020ff80 9896 else if (in_inclusive_range (insn_op1, 4U, 15U))
72508ac0
PO
9897 {
9898 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9899 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9900 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9901 record_buf[2] = ARM_PS_REGNUM;
9902 arm_insn_r->reg_rec_count = 3;
9903 }
9904 }
9905
9906 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9907 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9908 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9909
9910 /* Handle control insn extension space. */
9911
9912 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9913 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9914 {
9915 if (!bit (arm_insn_r->arm_insn,25))
9916 {
9917 if (!bits (arm_insn_r->arm_insn, 4, 7))
9918 {
9919 if ((0 == insn_op1) || (2 == insn_op1))
9920 {
9921 /* MRS. */
9922 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9923 arm_insn_r->reg_rec_count = 1;
9924 }
9925 else if (1 == insn_op1)
9926 {
9927 /* CSPR is going to be changed. */
9928 record_buf[0] = ARM_PS_REGNUM;
9929 arm_insn_r->reg_rec_count = 1;
9930 }
9931 else if (3 == insn_op1)
9932 {
9933 /* SPSR is going to be changed. */
9934 /* We need to get SPSR value, which is yet to be done. */
72508ac0
PO
9935 return -1;
9936 }
9937 }
9938 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9939 {
9940 if (1 == insn_op1)
9941 {
9942 /* BX. */
9943 record_buf[0] = ARM_PS_REGNUM;
9944 arm_insn_r->reg_rec_count = 1;
9945 }
9946 else if (3 == insn_op1)
9947 {
9948 /* CLZ. */
9949 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9950 arm_insn_r->reg_rec_count = 1;
9951 }
9952 }
9953 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9954 {
9955 /* BLX. */
9956 record_buf[0] = ARM_PS_REGNUM;
9957 record_buf[1] = ARM_LR_REGNUM;
9958 arm_insn_r->reg_rec_count = 2;
9959 }
9960 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
9961 {
9962 /* QADD, QSUB, QDADD, QDSUB */
9963 record_buf[0] = ARM_PS_REGNUM;
9964 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9965 arm_insn_r->reg_rec_count = 2;
9966 }
9967 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
9968 {
9969 /* BKPT. */
9970 record_buf[0] = ARM_PS_REGNUM;
9971 record_buf[1] = ARM_LR_REGNUM;
9972 arm_insn_r->reg_rec_count = 2;
9973
9974 /* Save SPSR also;how? */
72508ac0
PO
9975 return -1;
9976 }
9977 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
9978 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
9979 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
9980 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
9981 )
9982 {
9983 if (0 == insn_op1 || 1 == insn_op1)
9984 {
9985 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
9986 /* We dont do optimization for SMULW<y> where we
9987 need only Rd. */
9988 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9989 record_buf[1] = ARM_PS_REGNUM;
9990 arm_insn_r->reg_rec_count = 2;
9991 }
9992 else if (2 == insn_op1)
9993 {
9994 /* SMLAL<x><y>. */
9995 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9996 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
9997 arm_insn_r->reg_rec_count = 2;
9998 }
9999 else if (3 == insn_op1)
10000 {
10001 /* SMUL<x><y>. */
10002 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10003 arm_insn_r->reg_rec_count = 1;
10004 }
10005 }
10006 }
10007 else
10008 {
10009 /* MSR : immediate form. */
10010 if (1 == insn_op1)
10011 {
10012 /* CSPR is going to be changed. */
10013 record_buf[0] = ARM_PS_REGNUM;
10014 arm_insn_r->reg_rec_count = 1;
10015 }
10016 else if (3 == insn_op1)
10017 {
10018 /* SPSR is going to be changed. */
10019 /* we need to get SPSR value, which is yet to be done */
72508ac0
PO
10020 return -1;
10021 }
10022 }
10023 }
10024
10025 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10026 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10027 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10028
10029 /* Handle load/store insn extension space. */
10030
10031 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10032 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10033 && !INSN_RECORDED(arm_insn_r))
10034 {
10035 /* SWP/SWPB. */
10036 if (0 == insn_op1)
10037 {
10038 /* These insn, changes register and memory as well. */
10039 /* SWP or SWPB insn. */
10040 /* Get memory address given by Rn. */
10041 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10042 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10043 /* SWP insn ?, swaps word. */
10044 if (8 == arm_insn_r->opcode)
10045 {
10046 record_buf_mem[0] = 4;
10047 }
10048 else
10049 {
10050 /* SWPB insn, swaps only byte. */
10051 record_buf_mem[0] = 1;
10052 }
10053 record_buf_mem[1] = u_regval;
10054 arm_insn_r->mem_rec_count = 1;
10055 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10056 arm_insn_r->reg_rec_count = 1;
10057 }
10058 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10059 {
10060 /* STRH. */
10061 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10062 ARM_RECORD_STRH);
10063 }
10064 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10065 {
10066 /* LDRD. */
10067 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10068 record_buf[1] = record_buf[0] + 1;
10069 arm_insn_r->reg_rec_count = 2;
10070 }
10071 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10072 {
10073 /* STRD. */
10074 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10075 ARM_RECORD_STRD);
10076 }
10077 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10078 {
10079 /* LDRH, LDRSB, LDRSH. */
10080 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10081 arm_insn_r->reg_rec_count = 1;
10082 }
10083
10084 }
10085
10086 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10087 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10088 && !INSN_RECORDED(arm_insn_r))
10089 {
10090 ret = -1;
10091 /* Handle coprocessor insn extension space. */
10092 }
10093
10094 /* To be done for ARMv5 and later; as of now we return -1. */
10095 if (-1 == ret)
ca92db2d 10096 return ret;
72508ac0
PO
10097
10098 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10099 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10100
10101 return ret;
10102}
10103
10104/* Handling opcode 000 insns. */
10105
10106static int
10107arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10108{
10109 struct regcache *reg_cache = arm_insn_r->regcache;
10110 uint32_t record_buf[8], record_buf_mem[8];
10111 ULONGEST u_regval[2] = {0};
10112
8d49165d 10113 uint32_t reg_src1 = 0;
72508ac0
PO
10114 uint32_t opcode1 = 0;
10115
10116 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10117 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10118 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10119
2d9e6acb 10120 if (!((opcode1 & 0x19) == 0x10))
72508ac0 10121 {
2d9e6acb
YQ
10122 /* Data-processing (register) and Data-processing (register-shifted
10123 register */
10124 /* Out of 11 shifter operands mode, all the insn modifies destination
10125 register, which is specified by 13-16 decode. */
10126 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10127 record_buf[1] = ARM_PS_REGNUM;
10128 arm_insn_r->reg_rec_count = 2;
72508ac0 10129 }
2d9e6acb 10130 else if ((arm_insn_r->decode < 8) && ((opcode1 & 0x19) == 0x10))
72508ac0 10131 {
2d9e6acb
YQ
10132 /* Miscellaneous instructions */
10133
10134 if (3 == arm_insn_r->decode && 0x12 == opcode1
10135 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10136 {
10137 /* Handle BLX, branch and link/exchange. */
10138 if (9 == arm_insn_r->opcode)
10139 {
10140 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10141 and R14 stores the return address. */
10142 record_buf[0] = ARM_PS_REGNUM;
10143 record_buf[1] = ARM_LR_REGNUM;
10144 arm_insn_r->reg_rec_count = 2;
10145 }
10146 }
10147 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10148 {
10149 /* Handle enhanced software breakpoint insn, BKPT. */
10150 /* CPSR is changed to be executed in ARM state, disabling normal
10151 interrupts, entering abort mode. */
10152 /* According to high vector configuration PC is set. */
10153 /* user hit breakpoint and type reverse, in
10154 that case, we need to go back with previous CPSR and
10155 Program Counter. */
10156 record_buf[0] = ARM_PS_REGNUM;
10157 record_buf[1] = ARM_LR_REGNUM;
10158 arm_insn_r->reg_rec_count = 2;
10159
10160 /* Save SPSR also; how? */
10161 return -1;
10162 }
10163 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10164 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10165 {
10166 /* Handle BX, branch and link/exchange. */
10167 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10168 record_buf[0] = ARM_PS_REGNUM;
10169 arm_insn_r->reg_rec_count = 1;
10170 }
10171 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10172 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10173 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10174 {
10175 /* Count leading zeros: CLZ. */
10176 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10177 arm_insn_r->reg_rec_count = 1;
10178 }
10179 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10180 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10181 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10182 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0))
10183 {
10184 /* Handle MRS insn. */
10185 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10186 arm_insn_r->reg_rec_count = 1;
10187 }
72508ac0 10188 }
2d9e6acb 10189 else if (9 == arm_insn_r->decode && opcode1 < 0x10)
72508ac0 10190 {
2d9e6acb
YQ
10191 /* Multiply and multiply-accumulate */
10192
10193 /* Handle multiply instructions. */
10194 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10195 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10196 {
10197 /* Handle MLA and MUL. */
10198 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10199 record_buf[1] = ARM_PS_REGNUM;
10200 arm_insn_r->reg_rec_count = 2;
10201 }
10202 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10203 {
10204 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10205 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10206 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10207 record_buf[2] = ARM_PS_REGNUM;
10208 arm_insn_r->reg_rec_count = 3;
10209 }
10210 }
10211 else if (9 == arm_insn_r->decode && opcode1 > 0x10)
10212 {
10213 /* Synchronization primitives */
10214
72508ac0
PO
10215 /* Handling SWP, SWPB. */
10216 /* These insn, changes register and memory as well. */
10217 /* SWP or SWPB insn. */
10218
10219 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10220 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10221 /* SWP insn ?, swaps word. */
10222 if (8 == arm_insn_r->opcode)
2d9e6acb
YQ
10223 {
10224 record_buf_mem[0] = 4;
10225 }
10226 else
10227 {
10228 /* SWPB insn, swaps only byte. */
10229 record_buf_mem[0] = 1;
10230 }
72508ac0
PO
10231 record_buf_mem[1] = u_regval[0];
10232 arm_insn_r->mem_rec_count = 1;
10233 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10234 arm_insn_r->reg_rec_count = 1;
10235 }
2d9e6acb
YQ
10236 else if (11 == arm_insn_r->decode || 13 == arm_insn_r->decode
10237 || 15 == arm_insn_r->decode)
72508ac0 10238 {
2d9e6acb
YQ
10239 if ((opcode1 & 0x12) == 2)
10240 {
10241 /* Extra load/store (unprivileged) */
10242 return -1;
10243 }
10244 else
10245 {
10246 /* Extra load/store */
10247 switch (bits (arm_insn_r->arm_insn, 5, 6))
10248 {
10249 case 1:
10250 if ((opcode1 & 0x05) == 0x0 || (opcode1 & 0x05) == 0x4)
10251 {
10252 /* STRH (register), STRH (immediate) */
10253 arm_record_strx (arm_insn_r, &record_buf[0],
10254 &record_buf_mem[0], ARM_RECORD_STRH);
10255 }
10256 else if ((opcode1 & 0x05) == 0x1)
10257 {
10258 /* LDRH (register) */
10259 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10260 arm_insn_r->reg_rec_count = 1;
72508ac0 10261
2d9e6acb
YQ
10262 if (bit (arm_insn_r->arm_insn, 21))
10263 {
10264 /* Write back to Rn. */
10265 record_buf[arm_insn_r->reg_rec_count++]
10266 = bits (arm_insn_r->arm_insn, 16, 19);
10267 }
10268 }
10269 else if ((opcode1 & 0x05) == 0x5)
10270 {
10271 /* LDRH (immediate), LDRH (literal) */
10272 int rn = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10273
2d9e6acb
YQ
10274 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10275 arm_insn_r->reg_rec_count = 1;
10276
10277 if (rn != 15)
10278 {
10279 /*LDRH (immediate) */
10280 if (bit (arm_insn_r->arm_insn, 21))
10281 {
10282 /* Write back to Rn. */
10283 record_buf[arm_insn_r->reg_rec_count++] = rn;
10284 }
10285 }
10286 }
10287 else
10288 return -1;
10289 break;
10290 case 2:
10291 if ((opcode1 & 0x05) == 0x0)
10292 {
10293 /* LDRD (register) */
10294 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10295 record_buf[1] = record_buf[0] + 1;
10296 arm_insn_r->reg_rec_count = 2;
10297
10298 if (bit (arm_insn_r->arm_insn, 21))
10299 {
10300 /* Write back to Rn. */
10301 record_buf[arm_insn_r->reg_rec_count++]
10302 = bits (arm_insn_r->arm_insn, 16, 19);
10303 }
10304 }
10305 else if ((opcode1 & 0x05) == 0x1)
10306 {
10307 /* LDRSB (register) */
10308 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10309 arm_insn_r->reg_rec_count = 1;
10310
10311 if (bit (arm_insn_r->arm_insn, 21))
10312 {
10313 /* Write back to Rn. */
10314 record_buf[arm_insn_r->reg_rec_count++]
10315 = bits (arm_insn_r->arm_insn, 16, 19);
10316 }
10317 }
10318 else if ((opcode1 & 0x05) == 0x4 || (opcode1 & 0x05) == 0x5)
10319 {
10320 /* LDRD (immediate), LDRD (literal), LDRSB (immediate),
10321 LDRSB (literal) */
10322 int rn = bits (arm_insn_r->arm_insn, 16, 19);
10323
10324 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10325 arm_insn_r->reg_rec_count = 1;
10326
10327 if (rn != 15)
10328 {
10329 /*LDRD (immediate), LDRSB (immediate) */
10330 if (bit (arm_insn_r->arm_insn, 21))
10331 {
10332 /* Write back to Rn. */
10333 record_buf[arm_insn_r->reg_rec_count++] = rn;
10334 }
10335 }
10336 }
10337 else
10338 return -1;
10339 break;
10340 case 3:
10341 if ((opcode1 & 0x05) == 0x0)
10342 {
10343 /* STRD (register) */
10344 arm_record_strx (arm_insn_r, &record_buf[0],
10345 &record_buf_mem[0], ARM_RECORD_STRD);
10346 }
10347 else if ((opcode1 & 0x05) == 0x1)
10348 {
10349 /* LDRSH (register) */
10350 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10351 arm_insn_r->reg_rec_count = 1;
10352
10353 if (bit (arm_insn_r->arm_insn, 21))
10354 {
10355 /* Write back to Rn. */
10356 record_buf[arm_insn_r->reg_rec_count++]
10357 = bits (arm_insn_r->arm_insn, 16, 19);
10358 }
10359 }
10360 else if ((opcode1 & 0x05) == 0x4)
10361 {
10362 /* STRD (immediate) */
10363 arm_record_strx (arm_insn_r, &record_buf[0],
10364 &record_buf_mem[0], ARM_RECORD_STRD);
10365 }
10366 else if ((opcode1 & 0x05) == 0x5)
10367 {
10368 /* LDRSH (immediate), LDRSH (literal) */
10369 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10370 arm_insn_r->reg_rec_count = 1;
10371
10372 if (bit (arm_insn_r->arm_insn, 21))
10373 {
10374 /* Write back to Rn. */
10375 record_buf[arm_insn_r->reg_rec_count++]
10376 = bits (arm_insn_r->arm_insn, 16, 19);
10377 }
10378 }
10379 else
10380 return -1;
10381 break;
10382 default:
10383 return -1;
10384 }
10385 }
72508ac0
PO
10386 }
10387 else
10388 {
10389 return -1;
10390 }
10391
10392 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10393 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10394 return 0;
10395}
10396
10397/* Handling opcode 001 insns. */
10398
10399static int
10400arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10401{
10402 uint32_t record_buf[8], record_buf_mem[8];
10403
10404 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10405 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10406
10407 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10408 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10409 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10410 )
10411 {
10412 /* Handle MSR insn. */
10413 if (9 == arm_insn_r->opcode)
10414 {
10415 /* CSPR is going to be changed. */
10416 record_buf[0] = ARM_PS_REGNUM;
10417 arm_insn_r->reg_rec_count = 1;
10418 }
10419 else
10420 {
10421 /* SPSR is going to be changed. */
10422 }
10423 }
10424 else if (arm_insn_r->opcode <= 15)
10425 {
10426 /* Normal data processing insns. */
10427 /* Out of 11 shifter operands mode, all the insn modifies destination
10428 register, which is specified by 13-16 decode. */
10429 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10430 record_buf[1] = ARM_PS_REGNUM;
10431 arm_insn_r->reg_rec_count = 2;
10432 }
10433 else
10434 {
10435 return -1;
10436 }
10437
10438 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10439 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10440 return 0;
10441}
10442
c55978a6
YQ
10443static int
10444arm_record_media (insn_decode_record *arm_insn_r)
10445{
10446 uint32_t record_buf[8];
10447
10448 switch (bits (arm_insn_r->arm_insn, 22, 24))
10449 {
10450 case 0:
10451 /* Parallel addition and subtraction, signed */
10452 case 1:
10453 /* Parallel addition and subtraction, unsigned */
10454 case 2:
10455 case 3:
10456 /* Packing, unpacking, saturation and reversal */
10457 {
10458 int rd = bits (arm_insn_r->arm_insn, 12, 15);
10459
10460 record_buf[arm_insn_r->reg_rec_count++] = rd;
10461 }
10462 break;
10463
10464 case 4:
10465 case 5:
10466 /* Signed multiplies */
10467 {
10468 int rd = bits (arm_insn_r->arm_insn, 16, 19);
10469 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
10470
10471 record_buf[arm_insn_r->reg_rec_count++] = rd;
10472 if (op1 == 0x0)
10473 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10474 else if (op1 == 0x4)
10475 record_buf[arm_insn_r->reg_rec_count++]
10476 = bits (arm_insn_r->arm_insn, 12, 15);
10477 }
10478 break;
10479
10480 case 6:
10481 {
10482 if (bit (arm_insn_r->arm_insn, 21)
10483 && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
10484 {
10485 /* SBFX */
10486 record_buf[arm_insn_r->reg_rec_count++]
10487 = bits (arm_insn_r->arm_insn, 12, 15);
10488 }
10489 else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
10490 && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
10491 {
10492 /* USAD8 and USADA8 */
10493 record_buf[arm_insn_r->reg_rec_count++]
10494 = bits (arm_insn_r->arm_insn, 16, 19);
10495 }
10496 }
10497 break;
10498
10499 case 7:
10500 {
10501 if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
10502 && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
10503 {
10504 /* Permanently UNDEFINED */
10505 return -1;
10506 }
10507 else
10508 {
10509 /* BFC, BFI and UBFX */
10510 record_buf[arm_insn_r->reg_rec_count++]
10511 = bits (arm_insn_r->arm_insn, 12, 15);
10512 }
10513 }
10514 break;
10515
10516 default:
10517 return -1;
10518 }
10519
10520 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10521
10522 return 0;
10523}
10524
71e396f9 10525/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10526
10527static int
10528arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10529{
10530 struct regcache *reg_cache = arm_insn_r->regcache;
10531
71e396f9
LM
10532 uint32_t reg_base , reg_dest;
10533 uint32_t offset_12, tgt_mem_addr;
72508ac0 10534 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10535 unsigned char wback;
10536 ULONGEST u_regval;
72508ac0 10537
71e396f9
LM
10538 /* Calculate wback. */
10539 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10540 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10541
71e396f9
LM
10542 arm_insn_r->reg_rec_count = 0;
10543 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10544
10545 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10546 {
71e396f9
LM
10547 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10548 and LDRT. */
10549
72508ac0 10550 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10551 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10552
10553 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10554 preceeds a LDR instruction having R15 as reg_base, it
10555 emulates a branch and link instruction, and hence we need to save
10556 CPSR and PC as well. */
10557 if (ARM_PC_REGNUM == reg_dest)
10558 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10559
10560 /* If wback is true, also save the base register, which is going to be
10561 written to. */
10562 if (wback)
10563 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10564 }
10565 else
10566 {
71e396f9
LM
10567 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10568
72508ac0 10569 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10570 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10571
10572 /* Handle bit U. */
72508ac0 10573 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10574 {
10575 /* U == 1: Add the offset. */
10576 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10577 }
72508ac0 10578 else
71e396f9
LM
10579 {
10580 /* U == 0: subtract the offset. */
10581 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10582 }
10583
10584 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10585 bytes. */
10586 if (bit (arm_insn_r->arm_insn, 22))
10587 {
10588 /* STRB and STRBT: 1 byte. */
10589 record_buf_mem[0] = 1;
10590 }
10591 else
10592 {
10593 /* STR and STRT: 4 bytes. */
10594 record_buf_mem[0] = 4;
10595 }
10596
10597 /* Handle bit P. */
10598 if (bit (arm_insn_r->arm_insn, 24))
10599 record_buf_mem[1] = tgt_mem_addr;
10600 else
10601 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10602
72508ac0
PO
10603 arm_insn_r->mem_rec_count = 1;
10604
71e396f9
LM
10605 /* If wback is true, also save the base register, which is going to be
10606 written to. */
10607 if (wback)
10608 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10609 }
10610
10611 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10612 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10613 return 0;
10614}
10615
10616/* Handling opcode 011 insns. */
10617
10618static int
10619arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10620{
10621 struct regcache *reg_cache = arm_insn_r->regcache;
10622
10623 uint32_t shift_imm = 0;
10624 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10625 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10626 uint32_t record_buf[8], record_buf_mem[8];
10627
10628 LONGEST s_word;
10629 ULONGEST u_regval[2];
10630
c55978a6
YQ
10631 if (bit (arm_insn_r->arm_insn, 4))
10632 return arm_record_media (arm_insn_r);
10633
72508ac0
PO
10634 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10635 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10636
10637 /* Handle enhanced store insns and LDRD DSP insn,
10638 order begins according to addressing modes for store insns
10639 STRH insn. */
10640
10641 /* LDR or STR? */
10642 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10643 {
10644 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10645 /* LDR insn has a capability to do branching, if
10646 MOV LR, PC is precedded by LDR insn having Rn as R15
10647 in that case, it emulates branch and link insn, and hence we
10648 need to save CSPR and PC as well. */
10649 if (15 != reg_dest)
10650 {
10651 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10652 arm_insn_r->reg_rec_count = 1;
10653 }
10654 else
10655 {
10656 record_buf[0] = reg_dest;
10657 record_buf[1] = ARM_PS_REGNUM;
10658 arm_insn_r->reg_rec_count = 2;
10659 }
10660 }
10661 else
10662 {
10663 if (! bits (arm_insn_r->arm_insn, 4, 11))
10664 {
10665 /* Store insn, register offset and register pre-indexed,
10666 register post-indexed. */
10667 /* Get Rm. */
10668 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10669 /* Get Rn. */
10670 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10671 regcache_raw_read_unsigned (reg_cache, reg_src1
10672 , &u_regval[0]);
10673 regcache_raw_read_unsigned (reg_cache, reg_src2
10674 , &u_regval[1]);
10675 if (15 == reg_src2)
10676 {
10677 /* If R15 was used as Rn, hence current PC+8. */
10678 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10679 u_regval[0] = u_regval[0] + 8;
10680 }
10681 /* Calculate target store address, Rn +/- Rm, register offset. */
10682 /* U == 1. */
10683 if (bit (arm_insn_r->arm_insn, 23))
10684 {
10685 tgt_mem_addr = u_regval[0] + u_regval[1];
10686 }
10687 else
10688 {
10689 tgt_mem_addr = u_regval[1] - u_regval[0];
10690 }
10691
10692 switch (arm_insn_r->opcode)
10693 {
10694 /* STR. */
10695 case 8:
10696 case 12:
10697 /* STR. */
10698 case 9:
10699 case 13:
10700 /* STRT. */
10701 case 1:
10702 case 5:
10703 /* STR. */
10704 case 0:
10705 case 4:
10706 record_buf_mem[0] = 4;
10707 break;
10708
10709 /* STRB. */
10710 case 10:
10711 case 14:
10712 /* STRB. */
10713 case 11:
10714 case 15:
10715 /* STRBT. */
10716 case 3:
10717 case 7:
10718 /* STRB. */
10719 case 2:
10720 case 6:
10721 record_buf_mem[0] = 1;
10722 break;
10723
10724 default:
10725 gdb_assert_not_reached ("no decoding pattern found");
10726 break;
10727 }
10728 record_buf_mem[1] = tgt_mem_addr;
10729 arm_insn_r->mem_rec_count = 1;
10730
10731 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10732 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10733 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10734 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10735 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10736 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10737 )
10738 {
10739 /* Rn is going to be changed in pre-indexed mode and
10740 post-indexed mode as well. */
10741 record_buf[0] = reg_src2;
10742 arm_insn_r->reg_rec_count = 1;
10743 }
10744 }
10745 else
10746 {
10747 /* Store insn, scaled register offset; scaled pre-indexed. */
10748 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10749 /* Get Rm. */
10750 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10751 /* Get Rn. */
10752 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10753 /* Get shift_imm. */
10754 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10755 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10756 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10757 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10758 /* Offset_12 used as shift. */
10759 switch (offset_12)
10760 {
10761 case 0:
10762 /* Offset_12 used as index. */
10763 offset_12 = u_regval[0] << shift_imm;
10764 break;
10765
10766 case 1:
10767 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10768 break;
10769
10770 case 2:
10771 if (!shift_imm)
10772 {
10773 if (bit (u_regval[0], 31))
10774 {
10775 offset_12 = 0xFFFFFFFF;
10776 }
10777 else
10778 {
10779 offset_12 = 0;
10780 }
10781 }
10782 else
10783 {
10784 /* This is arithmetic shift. */
10785 offset_12 = s_word >> shift_imm;
10786 }
10787 break;
10788
10789 case 3:
10790 if (!shift_imm)
10791 {
10792 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10793 &u_regval[1]);
10794 /* Get C flag value and shift it by 31. */
10795 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10796 | (u_regval[0]) >> 1);
10797 }
10798 else
10799 {
10800 offset_12 = (u_regval[0] >> shift_imm) \
10801 | (u_regval[0] <<
10802 (sizeof(uint32_t) - shift_imm));
10803 }
10804 break;
10805
10806 default:
10807 gdb_assert_not_reached ("no decoding pattern found");
10808 break;
10809 }
10810
10811 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10812 /* bit U set. */
10813 if (bit (arm_insn_r->arm_insn, 23))
10814 {
10815 tgt_mem_addr = u_regval[1] + offset_12;
10816 }
10817 else
10818 {
10819 tgt_mem_addr = u_regval[1] - offset_12;
10820 }
10821
10822 switch (arm_insn_r->opcode)
10823 {
10824 /* STR. */
10825 case 8:
10826 case 12:
10827 /* STR. */
10828 case 9:
10829 case 13:
10830 /* STRT. */
10831 case 1:
10832 case 5:
10833 /* STR. */
10834 case 0:
10835 case 4:
10836 record_buf_mem[0] = 4;
10837 break;
10838
10839 /* STRB. */
10840 case 10:
10841 case 14:
10842 /* STRB. */
10843 case 11:
10844 case 15:
10845 /* STRBT. */
10846 case 3:
10847 case 7:
10848 /* STRB. */
10849 case 2:
10850 case 6:
10851 record_buf_mem[0] = 1;
10852 break;
10853
10854 default:
10855 gdb_assert_not_reached ("no decoding pattern found");
10856 break;
10857 }
10858 record_buf_mem[1] = tgt_mem_addr;
10859 arm_insn_r->mem_rec_count = 1;
10860
10861 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10862 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10863 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10864 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10865 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10866 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10867 )
10868 {
10869 /* Rn is going to be changed in register scaled pre-indexed
10870 mode,and scaled post indexed mode. */
10871 record_buf[0] = reg_src2;
10872 arm_insn_r->reg_rec_count = 1;
10873 }
10874 }
10875 }
10876
10877 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10878 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10879 return 0;
10880}
10881
71e396f9 10882/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10883
10884static int
10885arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10886{
10887 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10888 uint32_t register_count = 0, register_bits;
10889 uint32_t reg_base, addr_mode;
72508ac0 10890 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10891 uint32_t wback;
10892 ULONGEST u_regval;
72508ac0 10893
71e396f9
LM
10894 /* Fetch the list of registers. */
10895 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10896 arm_insn_r->reg_rec_count = 0;
10897
10898 /* Fetch the base register that contains the address we are loading data
10899 to. */
10900 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10901
71e396f9
LM
10902 /* Calculate wback. */
10903 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10904
10905 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10906 {
71e396f9 10907 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10908
71e396f9 10909 /* Find out which registers are going to be loaded from memory. */
72508ac0 10910 while (register_bits)
71e396f9
LM
10911 {
10912 if (register_bits & 0x00000001)
10913 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10914 register_bits = register_bits >> 1;
10915 register_count++;
10916 }
72508ac0 10917
71e396f9
LM
10918
10919 /* If wback is true, also save the base register, which is going to be
10920 written to. */
10921 if (wback)
10922 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10923
10924 /* Save the CPSR register. */
10925 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10926 }
10927 else
10928 {
71e396f9 10929 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10930
71e396f9
LM
10931 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10932
10933 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10934
10935 /* Find out how many registers are going to be stored to memory. */
72508ac0 10936 while (register_bits)
71e396f9
LM
10937 {
10938 if (register_bits & 0x00000001)
10939 register_count++;
10940 register_bits = register_bits >> 1;
10941 }
72508ac0
PO
10942
10943 switch (addr_mode)
71e396f9
LM
10944 {
10945 /* STMDA (STMED): Decrement after. */
10946 case 0:
10947 record_buf_mem[1] = (uint32_t) u_regval
f0452268 10948 - register_count * ARM_INT_REGISTER_SIZE + 4;
71e396f9
LM
10949 break;
10950 /* STM (STMIA, STMEA): Increment after. */
10951 case 1:
10952 record_buf_mem[1] = (uint32_t) u_regval;
10953 break;
10954 /* STMDB (STMFD): Decrement before. */
10955 case 2:
10956 record_buf_mem[1] = (uint32_t) u_regval
f0452268 10957 - register_count * ARM_INT_REGISTER_SIZE;
71e396f9
LM
10958 break;
10959 /* STMIB (STMFA): Increment before. */
10960 case 3:
f0452268 10961 record_buf_mem[1] = (uint32_t) u_regval + ARM_INT_REGISTER_SIZE;
71e396f9
LM
10962 break;
10963 default:
10964 gdb_assert_not_reached ("no decoding pattern found");
10965 break;
10966 }
72508ac0 10967
f0452268 10968 record_buf_mem[0] = register_count * ARM_INT_REGISTER_SIZE;
71e396f9
LM
10969 arm_insn_r->mem_rec_count = 1;
10970
10971 /* If wback is true, also save the base register, which is going to be
10972 written to. */
10973 if (wback)
10974 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10975 }
10976
10977 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10978 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10979 return 0;
10980}
10981
10982/* Handling opcode 101 insns. */
10983
10984static int
10985arm_record_b_bl (insn_decode_record *arm_insn_r)
10986{
10987 uint32_t record_buf[8];
10988
10989 /* Handle B, BL, BLX(1) insns. */
10990 /* B simply branches so we do nothing here. */
10991 /* Note: BLX(1) doesnt fall here but instead it falls into
10992 extension space. */
10993 if (bit (arm_insn_r->arm_insn, 24))
10994 {
10995 record_buf[0] = ARM_LR_REGNUM;
10996 arm_insn_r->reg_rec_count = 1;
10997 }
10998
10999 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11000
11001 return 0;
11002}
11003
72508ac0 11004static int
c6ec2b30 11005arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
11006{
11007 printf_unfiltered (_("Process record does not support instruction "
01e57735
YQ
11008 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11009 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
72508ac0
PO
11010
11011 return -1;
11012}
11013
5a578da5
OJ
11014/* Record handler for vector data transfer instructions. */
11015
11016static int
11017arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
11018{
11019 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
11020 uint32_t record_buf[4];
11021
5a578da5
OJ
11022 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
11023 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
11024 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
11025 bit_l = bit (arm_insn_r->arm_insn, 20);
11026 bit_c = bit (arm_insn_r->arm_insn, 8);
11027
11028 /* Handle VMOV instruction. */
11029 if (bit_l && bit_c)
11030 {
11031 record_buf[0] = reg_t;
11032 arm_insn_r->reg_rec_count = 1;
11033 }
11034 else if (bit_l && !bit_c)
11035 {
11036 /* Handle VMOV instruction. */
11037 if (bits_a == 0x00)
11038 {
f1771dce 11039 record_buf[0] = reg_t;
5a578da5
OJ
11040 arm_insn_r->reg_rec_count = 1;
11041 }
11042 /* Handle VMRS instruction. */
11043 else if (bits_a == 0x07)
11044 {
11045 if (reg_t == 15)
11046 reg_t = ARM_PS_REGNUM;
11047
11048 record_buf[0] = reg_t;
11049 arm_insn_r->reg_rec_count = 1;
11050 }
11051 }
11052 else if (!bit_l && !bit_c)
11053 {
11054 /* Handle VMOV instruction. */
11055 if (bits_a == 0x00)
11056 {
f1771dce 11057 record_buf[0] = ARM_D0_REGNUM + reg_v;
5a578da5
OJ
11058
11059 arm_insn_r->reg_rec_count = 1;
11060 }
11061 /* Handle VMSR instruction. */
11062 else if (bits_a == 0x07)
11063 {
11064 record_buf[0] = ARM_FPSCR_REGNUM;
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 & 0x04))
11072 {
11073 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
11074 + ARM_D0_REGNUM;
11075 arm_insn_r->reg_rec_count = 1;
11076 }
11077 /* Handle VDUP instruction. */
11078 else
11079 {
11080 if (bit (arm_insn_r->arm_insn, 21))
11081 {
11082 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11083 record_buf[0] = reg_v + ARM_D0_REGNUM;
11084 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
11085 arm_insn_r->reg_rec_count = 2;
11086 }
11087 else
11088 {
11089 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11090 record_buf[0] = reg_v + ARM_D0_REGNUM;
11091 arm_insn_r->reg_rec_count = 1;
11092 }
11093 }
11094 }
11095
11096 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11097 return 0;
11098}
11099
f20f80dd
OJ
11100/* Record handler for extension register load/store instructions. */
11101
11102static int
11103arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
11104{
11105 uint32_t opcode, single_reg;
11106 uint8_t op_vldm_vstm;
11107 uint32_t record_buf[8], record_buf_mem[128];
11108 ULONGEST u_regval = 0;
11109
11110 struct regcache *reg_cache = arm_insn_r->regcache;
f20f80dd
OJ
11111
11112 opcode = bits (arm_insn_r->arm_insn, 20, 24);
9fde51ed 11113 single_reg = !bit (arm_insn_r->arm_insn, 8);
f20f80dd
OJ
11114 op_vldm_vstm = opcode & 0x1b;
11115
11116 /* Handle VMOV instructions. */
11117 if ((opcode & 0x1e) == 0x04)
11118 {
9fde51ed 11119 if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
01e57735
YQ
11120 {
11121 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11122 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11123 arm_insn_r->reg_rec_count = 2;
11124 }
f20f80dd 11125 else
01e57735 11126 {
9fde51ed
YQ
11127 uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
11128 uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
f20f80dd 11129
9fde51ed 11130 if (single_reg)
01e57735 11131 {
9fde51ed
YQ
11132 /* The first S register number m is REG_M:M (M is bit 5),
11133 the corresponding D register number is REG_M:M / 2, which
11134 is REG_M. */
11135 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
11136 /* The second S register number is REG_M:M + 1, the
11137 corresponding D register number is (REG_M:M + 1) / 2.
11138 IOW, if bit M is 1, the first and second S registers
11139 are mapped to different D registers, otherwise, they are
11140 in the same D register. */
11141 if (bit_m)
11142 {
11143 record_buf[arm_insn_r->reg_rec_count++]
11144 = ARM_D0_REGNUM + reg_m + 1;
11145 }
01e57735
YQ
11146 }
11147 else
11148 {
9fde51ed 11149 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
01e57735
YQ
11150 arm_insn_r->reg_rec_count = 1;
11151 }
11152 }
f20f80dd
OJ
11153 }
11154 /* Handle VSTM and VPUSH instructions. */
11155 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
01e57735 11156 || op_vldm_vstm == 0x12)
f20f80dd
OJ
11157 {
11158 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11159 uint32_t memory_index = 0;
11160
11161 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11162 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11163 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
9fde51ed 11164 imm_off32 = imm_off8 << 2;
f20f80dd
OJ
11165 memory_count = imm_off8;
11166
11167 if (bit (arm_insn_r->arm_insn, 23))
01e57735 11168 start_address = u_regval;
f20f80dd 11169 else
01e57735 11170 start_address = u_regval - imm_off32;
f20f80dd
OJ
11171
11172 if (bit (arm_insn_r->arm_insn, 21))
01e57735
YQ
11173 {
11174 record_buf[0] = reg_rn;
11175 arm_insn_r->reg_rec_count = 1;
11176 }
f20f80dd
OJ
11177
11178 while (memory_count > 0)
01e57735 11179 {
9fde51ed 11180 if (single_reg)
01e57735 11181 {
9fde51ed
YQ
11182 record_buf_mem[memory_index] = 4;
11183 record_buf_mem[memory_index + 1] = start_address;
01e57735
YQ
11184 start_address = start_address + 4;
11185 memory_index = memory_index + 2;
11186 }
11187 else
11188 {
9fde51ed
YQ
11189 record_buf_mem[memory_index] = 4;
11190 record_buf_mem[memory_index + 1] = start_address;
11191 record_buf_mem[memory_index + 2] = 4;
11192 record_buf_mem[memory_index + 3] = start_address + 4;
01e57735
YQ
11193 start_address = start_address + 8;
11194 memory_index = memory_index + 4;
11195 }
11196 memory_count--;
11197 }
f20f80dd
OJ
11198 arm_insn_r->mem_rec_count = (memory_index >> 1);
11199 }
11200 /* Handle VLDM instructions. */
11201 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
01e57735 11202 || op_vldm_vstm == 0x13)
f20f80dd
OJ
11203 {
11204 uint32_t reg_count, reg_vd;
11205 uint32_t reg_index = 0;
9fde51ed 11206 uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
f20f80dd
OJ
11207
11208 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11209 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11210
9fde51ed
YQ
11211 /* REG_VD is the first D register number. If the instruction
11212 loads memory to S registers (SINGLE_REG is TRUE), the register
11213 number is (REG_VD << 1 | bit D), so the corresponding D
11214 register number is (REG_VD << 1 | bit D) / 2 = REG_VD. */
11215 if (!single_reg)
11216 reg_vd = reg_vd | (bit_d << 4);
f20f80dd 11217
9fde51ed 11218 if (bit (arm_insn_r->arm_insn, 21) /* write back */)
01e57735 11219 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
f20f80dd 11220
9fde51ed
YQ
11221 /* If the instruction loads memory to D register, REG_COUNT should
11222 be divided by 2, according to the ARM Architecture Reference
11223 Manual. If the instruction loads memory to S register, divide by
11224 2 as well because two S registers are mapped to D register. */
11225 reg_count = reg_count / 2;
11226 if (single_reg && bit_d)
01e57735 11227 {
9fde51ed
YQ
11228 /* Increase the register count if S register list starts from
11229 an odd number (bit d is one). */
11230 reg_count++;
11231 }
f20f80dd 11232
9fde51ed
YQ
11233 while (reg_count > 0)
11234 {
11235 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
01e57735
YQ
11236 reg_count--;
11237 }
f20f80dd
OJ
11238 arm_insn_r->reg_rec_count = reg_index;
11239 }
11240 /* VSTR Vector store register. */
11241 else if ((opcode & 0x13) == 0x10)
11242 {
bec2ab5a 11243 uint32_t start_address, reg_rn, imm_off32, imm_off8;
f20f80dd
OJ
11244 uint32_t memory_index = 0;
11245
11246 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11247 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11248 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
9fde51ed 11249 imm_off32 = imm_off8 << 2;
f20f80dd
OJ
11250
11251 if (bit (arm_insn_r->arm_insn, 23))
01e57735 11252 start_address = u_regval + imm_off32;
f20f80dd 11253 else
01e57735 11254 start_address = u_regval - imm_off32;
f20f80dd
OJ
11255
11256 if (single_reg)
01e57735 11257 {
9fde51ed
YQ
11258 record_buf_mem[memory_index] = 4;
11259 record_buf_mem[memory_index + 1] = start_address;
01e57735
YQ
11260 arm_insn_r->mem_rec_count = 1;
11261 }
f20f80dd 11262 else
01e57735 11263 {
9fde51ed
YQ
11264 record_buf_mem[memory_index] = 4;
11265 record_buf_mem[memory_index + 1] = start_address;
11266 record_buf_mem[memory_index + 2] = 4;
11267 record_buf_mem[memory_index + 3] = start_address + 4;
01e57735
YQ
11268 arm_insn_r->mem_rec_count = 2;
11269 }
f20f80dd
OJ
11270 }
11271 /* VLDR Vector load register. */
11272 else if ((opcode & 0x13) == 0x11)
11273 {
11274 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11275
11276 if (!single_reg)
01e57735
YQ
11277 {
11278 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11279 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11280 }
f20f80dd 11281 else
01e57735
YQ
11282 {
11283 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
9fde51ed
YQ
11284 /* Record register D rather than pseudo register S. */
11285 record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
01e57735 11286 }
f20f80dd
OJ
11287 arm_insn_r->reg_rec_count = 1;
11288 }
11289
11290 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11291 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11292 return 0;
11293}
11294
851f26ae
OJ
11295/* Record handler for arm/thumb mode VFP data processing instructions. */
11296
11297static int
11298arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11299{
11300 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11301 uint32_t record_buf[4];
11302 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11303 enum insn_types curr_insn_type = INSN_INV;
11304
11305 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11306 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11307 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11308 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11309 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11310 bit_d = bit (arm_insn_r->arm_insn, 22);
ce887586
TT
11311 /* Mask off the "D" bit. */
11312 opc1 = opc1 & ~0x04;
851f26ae
OJ
11313
11314 /* Handle VMLA, VMLS. */
11315 if (opc1 == 0x00)
11316 {
11317 if (bit (arm_insn_r->arm_insn, 10))
11318 {
11319 if (bit (arm_insn_r->arm_insn, 6))
11320 curr_insn_type = INSN_T0;
11321 else
11322 curr_insn_type = INSN_T1;
11323 }
11324 else
11325 {
11326 if (dp_op_sz)
11327 curr_insn_type = INSN_T1;
11328 else
11329 curr_insn_type = INSN_T2;
11330 }
11331 }
11332 /* Handle VNMLA, VNMLS, VNMUL. */
11333 else if (opc1 == 0x01)
11334 {
11335 if (dp_op_sz)
11336 curr_insn_type = INSN_T1;
11337 else
11338 curr_insn_type = INSN_T2;
11339 }
11340 /* Handle VMUL. */
11341 else if (opc1 == 0x02 && !(opc3 & 0x01))
11342 {
11343 if (bit (arm_insn_r->arm_insn, 10))
11344 {
11345 if (bit (arm_insn_r->arm_insn, 6))
11346 curr_insn_type = INSN_T0;
11347 else
11348 curr_insn_type = INSN_T1;
11349 }
11350 else
11351 {
11352 if (dp_op_sz)
11353 curr_insn_type = INSN_T1;
11354 else
11355 curr_insn_type = INSN_T2;
11356 }
11357 }
11358 /* Handle VADD, VSUB. */
11359 else if (opc1 == 0x03)
11360 {
11361 if (!bit (arm_insn_r->arm_insn, 9))
11362 {
11363 if (bit (arm_insn_r->arm_insn, 6))
11364 curr_insn_type = INSN_T0;
11365 else
11366 curr_insn_type = INSN_T1;
11367 }
11368 else
11369 {
11370 if (dp_op_sz)
11371 curr_insn_type = INSN_T1;
11372 else
11373 curr_insn_type = INSN_T2;
11374 }
11375 }
11376 /* Handle VDIV. */
ce887586 11377 else if (opc1 == 0x08)
851f26ae
OJ
11378 {
11379 if (dp_op_sz)
11380 curr_insn_type = INSN_T1;
11381 else
11382 curr_insn_type = INSN_T2;
11383 }
11384 /* Handle all other vfp data processing instructions. */
11385 else if (opc1 == 0x0b)
11386 {
11387 /* Handle VMOV. */
11388 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11389 {
11390 if (bit (arm_insn_r->arm_insn, 4))
11391 {
11392 if (bit (arm_insn_r->arm_insn, 6))
11393 curr_insn_type = INSN_T0;
11394 else
11395 curr_insn_type = INSN_T1;
11396 }
11397 else
11398 {
11399 if (dp_op_sz)
11400 curr_insn_type = INSN_T1;
11401 else
11402 curr_insn_type = INSN_T2;
11403 }
11404 }
11405 /* Handle VNEG and VABS. */
11406 else if ((opc2 == 0x01 && opc3 == 0x01)
11407 || (opc2 == 0x00 && opc3 == 0x03))
11408 {
11409 if (!bit (arm_insn_r->arm_insn, 11))
11410 {
11411 if (bit (arm_insn_r->arm_insn, 6))
11412 curr_insn_type = INSN_T0;
11413 else
11414 curr_insn_type = INSN_T1;
11415 }
11416 else
11417 {
11418 if (dp_op_sz)
11419 curr_insn_type = INSN_T1;
11420 else
11421 curr_insn_type = INSN_T2;
11422 }
11423 }
11424 /* Handle VSQRT. */
11425 else if (opc2 == 0x01 && opc3 == 0x03)
11426 {
11427 if (dp_op_sz)
11428 curr_insn_type = INSN_T1;
11429 else
11430 curr_insn_type = INSN_T2;
11431 }
11432 /* Handle VCVT. */
11433 else if (opc2 == 0x07 && opc3 == 0x03)
11434 {
11435 if (!dp_op_sz)
11436 curr_insn_type = INSN_T1;
11437 else
11438 curr_insn_type = INSN_T2;
11439 }
11440 else if (opc3 & 0x01)
11441 {
11442 /* Handle VCVT. */
11443 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11444 {
11445 if (!bit (arm_insn_r->arm_insn, 18))
11446 curr_insn_type = INSN_T2;
11447 else
11448 {
11449 if (dp_op_sz)
11450 curr_insn_type = INSN_T1;
11451 else
11452 curr_insn_type = INSN_T2;
11453 }
11454 }
11455 /* Handle VCVT. */
11456 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11457 {
11458 if (dp_op_sz)
11459 curr_insn_type = INSN_T1;
11460 else
11461 curr_insn_type = INSN_T2;
11462 }
11463 /* Handle VCVTB, VCVTT. */
11464 else if ((opc2 & 0x0e) == 0x02)
11465 curr_insn_type = INSN_T2;
11466 /* Handle VCMP, VCMPE. */
11467 else if ((opc2 & 0x0e) == 0x04)
11468 curr_insn_type = INSN_T3;
11469 }
11470 }
11471
11472 switch (curr_insn_type)
11473 {
11474 case INSN_T0:
11475 reg_vd = reg_vd | (bit_d << 4);
11476 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11477 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11478 arm_insn_r->reg_rec_count = 2;
11479 break;
11480
11481 case INSN_T1:
11482 reg_vd = reg_vd | (bit_d << 4);
11483 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11484 arm_insn_r->reg_rec_count = 1;
11485 break;
11486
11487 case INSN_T2:
11488 reg_vd = (reg_vd << 1) | bit_d;
11489 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11490 arm_insn_r->reg_rec_count = 1;
11491 break;
11492
11493 case INSN_T3:
11494 record_buf[0] = ARM_FPSCR_REGNUM;
11495 arm_insn_r->reg_rec_count = 1;
11496 break;
11497
11498 default:
11499 gdb_assert_not_reached ("no decoding pattern found");
11500 break;
11501 }
11502
11503 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11504 return 0;
11505}
11506
60cc5e93
OJ
11507/* Handling opcode 110 insns. */
11508
11509static int
11510arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11511{
bec2ab5a 11512 uint32_t op1, op1_ebit, coproc;
60cc5e93
OJ
11513
11514 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11515 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11516 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11517
11518 if ((coproc & 0x0e) == 0x0a)
11519 {
11520 /* Handle extension register ld/st instructions. */
11521 if (!(op1 & 0x20))
f20f80dd 11522 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11523
11524 /* 64-bit transfers between arm core and extension registers. */
11525 if ((op1 & 0x3e) == 0x04)
f20f80dd 11526 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11527 }
11528 else
11529 {
11530 /* Handle coprocessor ld/st instructions. */
11531 if (!(op1 & 0x3a))
11532 {
11533 /* Store. */
11534 if (!op1_ebit)
11535 return arm_record_unsupported_insn (arm_insn_r);
11536 else
11537 /* Load. */
11538 return arm_record_unsupported_insn (arm_insn_r);
11539 }
11540
11541 /* Move to coprocessor from two arm core registers. */
11542 if (op1 == 0x4)
11543 return arm_record_unsupported_insn (arm_insn_r);
11544
11545 /* Move to two arm core registers from coprocessor. */
11546 if (op1 == 0x5)
11547 {
11548 uint32_t reg_t[2];
11549
11550 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11551 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11552 arm_insn_r->reg_rec_count = 2;
11553
11554 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11555 return 0;
11556 }
11557 }
11558 return arm_record_unsupported_insn (arm_insn_r);
11559}
11560
72508ac0
PO
11561/* Handling opcode 111 insns. */
11562
11563static int
11564arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11565{
2d9e6acb 11566 uint32_t op, op1_ebit, coproc, bits_24_25;
72508ac0
PO
11567 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11568 struct regcache *reg_cache = arm_insn_r->regcache;
72508ac0
PO
11569
11570 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93 11571 coproc = bits (arm_insn_r->arm_insn, 8, 11);
60cc5e93
OJ
11572 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11573 op = bit (arm_insn_r->arm_insn, 4);
2d9e6acb 11574 bits_24_25 = bits (arm_insn_r->arm_insn, 24, 25);
97dfe206
OJ
11575
11576 /* Handle arm SWI/SVC system call instructions. */
2d9e6acb 11577 if (bits_24_25 == 0x3)
97dfe206
OJ
11578 {
11579 if (tdep->arm_syscall_record != NULL)
11580 {
11581 ULONGEST svc_operand, svc_number;
11582
11583 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11584
11585 if (svc_operand) /* OABI. */
11586 svc_number = svc_operand - 0x900000;
11587 else /* EABI. */
11588 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11589
60cc5e93 11590 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11591 }
11592 else
11593 {
11594 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11595 return -1;
97dfe206
OJ
11596 }
11597 }
2d9e6acb 11598 else if (bits_24_25 == 0x02)
60cc5e93 11599 {
2d9e6acb
YQ
11600 if (op)
11601 {
11602 if ((coproc & 0x0e) == 0x0a)
11603 {
11604 /* 8, 16, and 32-bit transfer */
11605 return arm_record_vdata_transfer_insn (arm_insn_r);
11606 }
11607 else
11608 {
11609 if (op1_ebit)
11610 {
11611 /* MRC, MRC2 */
11612 uint32_t record_buf[1];
11613
11614 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11615 if (record_buf[0] == 15)
11616 record_buf[0] = ARM_PS_REGNUM;
60cc5e93 11617
2d9e6acb
YQ
11618 arm_insn_r->reg_rec_count = 1;
11619 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11620 record_buf);
11621 return 0;
11622 }
11623 else
11624 {
11625 /* MCR, MCR2 */
11626 return -1;
11627 }
11628 }
11629 }
11630 else
11631 {
11632 if ((coproc & 0x0e) == 0x0a)
11633 {
11634 /* VFP data-processing instructions. */
11635 return arm_record_vfp_data_proc_insn (arm_insn_r);
11636 }
11637 else
11638 {
11639 /* CDP, CDP2 */
11640 return -1;
11641 }
11642 }
60cc5e93 11643 }
97dfe206
OJ
11644 else
11645 {
2d9e6acb 11646 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 25);
60cc5e93 11647
2d9e6acb
YQ
11648 if (op1 == 5)
11649 {
11650 if ((coproc & 0x0e) != 0x0a)
11651 {
11652 /* MRRC, MRRC2 */
11653 return -1;
11654 }
11655 }
11656 else if (op1 == 4 || op1 == 5)
11657 {
11658 if ((coproc & 0x0e) == 0x0a)
11659 {
11660 /* 64-bit transfers between ARM core and extension */
11661 return -1;
11662 }
11663 else if (op1 == 4)
11664 {
11665 /* MCRR, MCRR2 */
11666 return -1;
11667 }
11668 }
11669 else if (op1 == 0 || op1 == 1)
11670 {
11671 /* UNDEFINED */
11672 return -1;
11673 }
11674 else
11675 {
11676 if ((coproc & 0x0e) == 0x0a)
11677 {
11678 /* Extension register load/store */
11679 }
11680 else
11681 {
11682 /* STC, STC2, LDC, LDC2 */
11683 }
11684 return -1;
11685 }
97dfe206 11686 }
72508ac0 11687
2d9e6acb 11688 return -1;
72508ac0
PO
11689}
11690
11691/* Handling opcode 000 insns. */
11692
11693static int
11694thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11695{
11696 uint32_t record_buf[8];
11697 uint32_t reg_src1 = 0;
11698
11699 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11700
11701 record_buf[0] = ARM_PS_REGNUM;
11702 record_buf[1] = reg_src1;
11703 thumb_insn_r->reg_rec_count = 2;
11704
11705 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11706
11707 return 0;
11708}
11709
11710
11711/* Handling opcode 001 insns. */
11712
11713static int
11714thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11715{
11716 uint32_t record_buf[8];
11717 uint32_t reg_src1 = 0;
11718
11719 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11720
11721 record_buf[0] = ARM_PS_REGNUM;
11722 record_buf[1] = reg_src1;
11723 thumb_insn_r->reg_rec_count = 2;
11724
11725 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11726
11727 return 0;
11728}
11729
11730/* Handling opcode 010 insns. */
11731
11732static int
11733thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11734{
11735 struct regcache *reg_cache = thumb_insn_r->regcache;
11736 uint32_t record_buf[8], record_buf_mem[8];
11737
11738 uint32_t reg_src1 = 0, reg_src2 = 0;
11739 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11740
11741 ULONGEST u_regval[2] = {0};
11742
11743 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11744
11745 if (bit (thumb_insn_r->arm_insn, 12))
11746 {
11747 /* Handle load/store register offset. */
b121eeb9
YQ
11748 uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
11749
b020ff80 11750 if (in_inclusive_range (opB, 4U, 7U))
72508ac0
PO
11751 {
11752 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11753 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11754 record_buf[0] = reg_src1;
11755 thumb_insn_r->reg_rec_count = 1;
11756 }
b020ff80 11757 else if (in_inclusive_range (opB, 0U, 2U))
72508ac0
PO
11758 {
11759 /* STR(2), STRB(2), STRH(2) . */
11760 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11761 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11762 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11763 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
b121eeb9 11764 if (0 == opB)
72508ac0 11765 record_buf_mem[0] = 4; /* STR (2). */
b121eeb9 11766 else if (2 == opB)
72508ac0 11767 record_buf_mem[0] = 1; /* STRB (2). */
b121eeb9 11768 else if (1 == opB)
72508ac0
PO
11769 record_buf_mem[0] = 2; /* STRH (2). */
11770 record_buf_mem[1] = u_regval[0] + u_regval[1];
11771 thumb_insn_r->mem_rec_count = 1;
11772 }
11773 }
11774 else if (bit (thumb_insn_r->arm_insn, 11))
11775 {
11776 /* Handle load from literal pool. */
11777 /* LDR(3). */
11778 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11779 record_buf[0] = reg_src1;
11780 thumb_insn_r->reg_rec_count = 1;
11781 }
11782 else if (opcode1)
11783 {
b121eeb9 11784 /* Special data instructions and branch and exchange */
72508ac0
PO
11785 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11786 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11787 if ((3 == opcode2) && (!opcode3))
11788 {
11789 /* Branch with exchange. */
11790 record_buf[0] = ARM_PS_REGNUM;
11791 thumb_insn_r->reg_rec_count = 1;
11792 }
11793 else
11794 {
1f33efec
YQ
11795 /* Format 8; special data processing insns. */
11796 record_buf[0] = ARM_PS_REGNUM;
11797 record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
11798 | bits (thumb_insn_r->arm_insn, 0, 2));
72508ac0
PO
11799 thumb_insn_r->reg_rec_count = 2;
11800 }
11801 }
11802 else
11803 {
11804 /* Format 5; data processing insns. */
11805 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11806 if (bit (thumb_insn_r->arm_insn, 7))
11807 {
11808 reg_src1 = reg_src1 + 8;
11809 }
11810 record_buf[0] = ARM_PS_REGNUM;
11811 record_buf[1] = reg_src1;
11812 thumb_insn_r->reg_rec_count = 2;
11813 }
11814
11815 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11816 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11817 record_buf_mem);
11818
11819 return 0;
11820}
11821
11822/* Handling opcode 001 insns. */
11823
11824static int
11825thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11826{
11827 struct regcache *reg_cache = thumb_insn_r->regcache;
11828 uint32_t record_buf[8], record_buf_mem[8];
11829
11830 uint32_t reg_src1 = 0;
11831 uint32_t opcode = 0, immed_5 = 0;
11832
11833 ULONGEST u_regval = 0;
11834
11835 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11836
11837 if (opcode)
11838 {
11839 /* LDR(1). */
11840 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11841 record_buf[0] = reg_src1;
11842 thumb_insn_r->reg_rec_count = 1;
11843 }
11844 else
11845 {
11846 /* STR(1). */
11847 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11848 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11849 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11850 record_buf_mem[0] = 4;
11851 record_buf_mem[1] = u_regval + (immed_5 * 4);
11852 thumb_insn_r->mem_rec_count = 1;
11853 }
11854
11855 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11856 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11857 record_buf_mem);
11858
11859 return 0;
11860}
11861
11862/* Handling opcode 100 insns. */
11863
11864static int
11865thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11866{
11867 struct regcache *reg_cache = thumb_insn_r->regcache;
11868 uint32_t record_buf[8], record_buf_mem[8];
11869
11870 uint32_t reg_src1 = 0;
11871 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11872
11873 ULONGEST u_regval = 0;
11874
11875 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11876
11877 if (3 == opcode)
11878 {
11879 /* LDR(4). */
11880 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11881 record_buf[0] = reg_src1;
11882 thumb_insn_r->reg_rec_count = 1;
11883 }
11884 else if (1 == opcode)
11885 {
11886 /* LDRH(1). */
11887 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11888 record_buf[0] = reg_src1;
11889 thumb_insn_r->reg_rec_count = 1;
11890 }
11891 else if (2 == opcode)
11892 {
11893 /* STR(3). */
11894 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11895 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11896 record_buf_mem[0] = 4;
11897 record_buf_mem[1] = u_regval + (immed_8 * 4);
11898 thumb_insn_r->mem_rec_count = 1;
11899 }
11900 else if (0 == opcode)
11901 {
11902 /* STRH(1). */
11903 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11904 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11905 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11906 record_buf_mem[0] = 2;
11907 record_buf_mem[1] = u_regval + (immed_5 * 2);
11908 thumb_insn_r->mem_rec_count = 1;
11909 }
11910
11911 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11912 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11913 record_buf_mem);
11914
11915 return 0;
11916}
11917
11918/* Handling opcode 101 insns. */
11919
11920static int
11921thumb_record_misc (insn_decode_record *thumb_insn_r)
11922{
11923 struct regcache *reg_cache = thumb_insn_r->regcache;
11924
b121eeb9 11925 uint32_t opcode = 0;
72508ac0 11926 uint32_t register_bits = 0, register_count = 0;
bec2ab5a 11927 uint32_t index = 0, start_address = 0;
72508ac0
PO
11928 uint32_t record_buf[24], record_buf_mem[48];
11929 uint32_t reg_src1;
11930
11931 ULONGEST u_regval = 0;
11932
11933 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
72508ac0 11934
b121eeb9 11935 if (opcode == 0 || opcode == 1)
72508ac0 11936 {
b121eeb9
YQ
11937 /* ADR and ADD (SP plus immediate) */
11938
72508ac0
PO
11939 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11940 record_buf[0] = reg_src1;
11941 thumb_insn_r->reg_rec_count = 1;
11942 }
b121eeb9 11943 else
72508ac0 11944 {
b121eeb9
YQ
11945 /* Miscellaneous 16-bit instructions */
11946 uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
11947
11948 switch (opcode2)
11949 {
11950 case 6:
11951 /* SETEND and CPS */
11952 break;
11953 case 0:
11954 /* ADD/SUB (SP plus immediate) */
11955 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11956 record_buf[0] = ARM_SP_REGNUM;
11957 thumb_insn_r->reg_rec_count = 1;
11958 break;
11959 case 1: /* fall through */
11960 case 3: /* fall through */
11961 case 9: /* fall through */
11962 case 11:
11963 /* CBNZ, CBZ */
b121eeb9
YQ
11964 break;
11965 case 2:
11966 /* SXTH, SXTB, UXTH, UXTB */
11967 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
11968 thumb_insn_r->reg_rec_count = 1;
11969 break;
11970 case 4: /* fall through */
11971 case 5:
11972 /* PUSH. */
11973 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11974 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11975 while (register_bits)
11976 {
11977 if (register_bits & 0x00000001)
11978 register_count++;
11979 register_bits = register_bits >> 1;
11980 }
11981 start_address = u_regval - \
11982 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11983 thumb_insn_r->mem_rec_count = register_count;
11984 while (register_count)
11985 {
11986 record_buf_mem[(register_count * 2) - 1] = start_address;
11987 record_buf_mem[(register_count * 2) - 2] = 4;
11988 start_address = start_address + 4;
11989 register_count--;
11990 }
11991 record_buf[0] = ARM_SP_REGNUM;
11992 thumb_insn_r->reg_rec_count = 1;
11993 break;
11994 case 10:
11995 /* REV, REV16, REVSH */
ba14f379
YQ
11996 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
11997 thumb_insn_r->reg_rec_count = 1;
b121eeb9
YQ
11998 break;
11999 case 12: /* fall through */
12000 case 13:
12001 /* POP. */
12002 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12003 while (register_bits)
12004 {
12005 if (register_bits & 0x00000001)
12006 record_buf[index++] = register_count;
12007 register_bits = register_bits >> 1;
12008 register_count++;
12009 }
12010 record_buf[index++] = ARM_PS_REGNUM;
12011 record_buf[index++] = ARM_SP_REGNUM;
12012 thumb_insn_r->reg_rec_count = index;
12013 break;
12014 case 0xe:
12015 /* BKPT insn. */
12016 /* Handle enhanced software breakpoint insn, BKPT. */
12017 /* CPSR is changed to be executed in ARM state, disabling normal
12018 interrupts, entering abort mode. */
12019 /* According to high vector configuration PC is set. */
12020 /* User hits breakpoint and type reverse, in that case, we need to go back with
12021 previous CPSR and Program Counter. */
12022 record_buf[0] = ARM_PS_REGNUM;
12023 record_buf[1] = ARM_LR_REGNUM;
12024 thumb_insn_r->reg_rec_count = 2;
12025 /* We need to save SPSR value, which is not yet done. */
12026 printf_unfiltered (_("Process record does not support instruction "
12027 "0x%0x at address %s.\n"),
12028 thumb_insn_r->arm_insn,
12029 paddress (thumb_insn_r->gdbarch,
12030 thumb_insn_r->this_addr));
12031 return -1;
12032
12033 case 0xf:
12034 /* If-Then, and hints */
12035 break;
12036 default:
12037 return -1;
12038 };
72508ac0
PO
12039 }
12040
12041 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12042 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12043 record_buf_mem);
12044
12045 return 0;
12046}
12047
12048/* Handling opcode 110 insns. */
12049
12050static int
12051thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
12052{
12053 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
12054 struct regcache *reg_cache = thumb_insn_r->regcache;
12055
12056 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
12057 uint32_t reg_src1 = 0;
12058 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
bec2ab5a 12059 uint32_t index = 0, start_address = 0;
72508ac0
PO
12060 uint32_t record_buf[24], record_buf_mem[48];
12061
12062 ULONGEST u_regval = 0;
12063
12064 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12065 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
12066
12067 if (1 == opcode2)
12068 {
12069
12070 /* LDMIA. */
12071 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12072 /* Get Rn. */
12073 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12074 while (register_bits)
12075 {
12076 if (register_bits & 0x00000001)
f969241e 12077 record_buf[index++] = register_count;
72508ac0 12078 register_bits = register_bits >> 1;
f969241e 12079 register_count++;
72508ac0 12080 }
f969241e
OJ
12081 record_buf[index++] = reg_src1;
12082 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
12083 }
12084 else if (0 == opcode2)
12085 {
12086 /* It handles both STMIA. */
12087 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12088 /* Get Rn. */
12089 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12090 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12091 while (register_bits)
12092 {
12093 if (register_bits & 0x00000001)
12094 register_count++;
12095 register_bits = register_bits >> 1;
12096 }
12097 start_address = u_regval;
12098 thumb_insn_r->mem_rec_count = register_count;
12099 while (register_count)
12100 {
12101 record_buf_mem[(register_count * 2) - 1] = start_address;
12102 record_buf_mem[(register_count * 2) - 2] = 4;
12103 start_address = start_address + 4;
12104 register_count--;
12105 }
12106 }
12107 else if (0x1F == opcode1)
12108 {
12109 /* Handle arm syscall insn. */
97dfe206 12110 if (tdep->arm_syscall_record != NULL)
72508ac0 12111 {
97dfe206
OJ
12112 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
12113 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
12114 }
12115 else
12116 {
12117 printf_unfiltered (_("no syscall record support\n"));
12118 return -1;
12119 }
12120 }
12121
12122 /* B (1), conditional branch is automatically taken care in process_record,
12123 as PC is saved there. */
12124
12125 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12126 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12127 record_buf_mem);
12128
12129 return ret;
12130}
12131
12132/* Handling opcode 111 insns. */
12133
12134static int
12135thumb_record_branch (insn_decode_record *thumb_insn_r)
12136{
12137 uint32_t record_buf[8];
12138 uint32_t bits_h = 0;
12139
12140 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
12141
12142 if (2 == bits_h || 3 == bits_h)
12143 {
12144 /* BL */
12145 record_buf[0] = ARM_LR_REGNUM;
12146 thumb_insn_r->reg_rec_count = 1;
12147 }
12148 else if (1 == bits_h)
12149 {
12150 /* BLX(1). */
12151 record_buf[0] = ARM_PS_REGNUM;
12152 record_buf[1] = ARM_LR_REGNUM;
12153 thumb_insn_r->reg_rec_count = 2;
12154 }
12155
12156 /* B(2) is automatically taken care in process_record, as PC is
12157 saved there. */
12158
12159 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12160
12161 return 0;
12162}
12163
c6ec2b30
OJ
12164/* Handler for thumb2 load/store multiple instructions. */
12165
12166static int
12167thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
12168{
12169 struct regcache *reg_cache = thumb2_insn_r->regcache;
12170
12171 uint32_t reg_rn, op;
12172 uint32_t register_bits = 0, register_count = 0;
12173 uint32_t index = 0, start_address = 0;
12174 uint32_t record_buf[24], record_buf_mem[48];
12175
12176 ULONGEST u_regval = 0;
12177
12178 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12179 op = bits (thumb2_insn_r->arm_insn, 23, 24);
12180
12181 if (0 == op || 3 == op)
12182 {
12183 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12184 {
12185 /* Handle RFE instruction. */
12186 record_buf[0] = ARM_PS_REGNUM;
12187 thumb2_insn_r->reg_rec_count = 1;
12188 }
12189 else
12190 {
12191 /* Handle SRS instruction after reading banked SP. */
12192 return arm_record_unsupported_insn (thumb2_insn_r);
12193 }
12194 }
12195 else if (1 == op || 2 == op)
12196 {
12197 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12198 {
12199 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
12200 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12201 while (register_bits)
12202 {
12203 if (register_bits & 0x00000001)
12204 record_buf[index++] = register_count;
12205
12206 register_count++;
12207 register_bits = register_bits >> 1;
12208 }
12209 record_buf[index++] = reg_rn;
12210 record_buf[index++] = ARM_PS_REGNUM;
12211 thumb2_insn_r->reg_rec_count = index;
12212 }
12213 else
12214 {
12215 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
12216 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12217 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12218 while (register_bits)
12219 {
12220 if (register_bits & 0x00000001)
12221 register_count++;
12222
12223 register_bits = register_bits >> 1;
12224 }
12225
12226 if (1 == op)
12227 {
12228 /* Start address calculation for LDMDB/LDMEA. */
12229 start_address = u_regval;
12230 }
12231 else if (2 == op)
12232 {
12233 /* Start address calculation for LDMDB/LDMEA. */
12234 start_address = u_regval - register_count * 4;
12235 }
12236
12237 thumb2_insn_r->mem_rec_count = register_count;
12238 while (register_count)
12239 {
12240 record_buf_mem[register_count * 2 - 1] = start_address;
12241 record_buf_mem[register_count * 2 - 2] = 4;
12242 start_address = start_address + 4;
12243 register_count--;
12244 }
12245 record_buf[0] = reg_rn;
12246 record_buf[1] = ARM_PS_REGNUM;
12247 thumb2_insn_r->reg_rec_count = 2;
12248 }
12249 }
12250
12251 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12252 record_buf_mem);
12253 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12254 record_buf);
12255 return ARM_RECORD_SUCCESS;
12256}
12257
12258/* Handler for thumb2 load/store (dual/exclusive) and table branch
12259 instructions. */
12260
12261static int
12262thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
12263{
12264 struct regcache *reg_cache = thumb2_insn_r->regcache;
12265
12266 uint32_t reg_rd, reg_rn, offset_imm;
12267 uint32_t reg_dest1, reg_dest2;
12268 uint32_t address, offset_addr;
12269 uint32_t record_buf[8], record_buf_mem[8];
12270 uint32_t op1, op2, op3;
c6ec2b30
OJ
12271
12272 ULONGEST u_regval[2];
12273
12274 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
12275 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
12276 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
12277
12278 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12279 {
12280 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12281 {
12282 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
12283 record_buf[0] = reg_dest1;
12284 record_buf[1] = ARM_PS_REGNUM;
12285 thumb2_insn_r->reg_rec_count = 2;
12286 }
12287
12288 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12289 {
12290 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12291 record_buf[2] = reg_dest2;
12292 thumb2_insn_r->reg_rec_count = 3;
12293 }
12294 }
12295 else
12296 {
12297 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12298 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12299
12300 if (0 == op1 && 0 == op2)
12301 {
12302 /* Handle STREX. */
12303 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12304 address = u_regval[0] + (offset_imm * 4);
12305 record_buf_mem[0] = 4;
12306 record_buf_mem[1] = address;
12307 thumb2_insn_r->mem_rec_count = 1;
12308 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12309 record_buf[0] = reg_rd;
12310 thumb2_insn_r->reg_rec_count = 1;
12311 }
12312 else if (1 == op1 && 0 == op2)
12313 {
12314 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12315 record_buf[0] = reg_rd;
12316 thumb2_insn_r->reg_rec_count = 1;
12317 address = u_regval[0];
12318 record_buf_mem[1] = address;
12319
12320 if (4 == op3)
12321 {
12322 /* Handle STREXB. */
12323 record_buf_mem[0] = 1;
12324 thumb2_insn_r->mem_rec_count = 1;
12325 }
12326 else if (5 == op3)
12327 {
12328 /* Handle STREXH. */
12329 record_buf_mem[0] = 2 ;
12330 thumb2_insn_r->mem_rec_count = 1;
12331 }
12332 else if (7 == op3)
12333 {
12334 /* Handle STREXD. */
12335 address = u_regval[0];
12336 record_buf_mem[0] = 4;
12337 record_buf_mem[2] = 4;
12338 record_buf_mem[3] = address + 4;
12339 thumb2_insn_r->mem_rec_count = 2;
12340 }
12341 }
12342 else
12343 {
12344 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12345
12346 if (bit (thumb2_insn_r->arm_insn, 24))
12347 {
12348 if (bit (thumb2_insn_r->arm_insn, 23))
12349 offset_addr = u_regval[0] + (offset_imm * 4);
12350 else
12351 offset_addr = u_regval[0] - (offset_imm * 4);
12352
12353 address = offset_addr;
12354 }
12355 else
12356 address = u_regval[0];
12357
12358 record_buf_mem[0] = 4;
12359 record_buf_mem[1] = address;
12360 record_buf_mem[2] = 4;
12361 record_buf_mem[3] = address + 4;
12362 thumb2_insn_r->mem_rec_count = 2;
12363 record_buf[0] = reg_rn;
12364 thumb2_insn_r->reg_rec_count = 1;
12365 }
12366 }
12367
12368 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12369 record_buf);
12370 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12371 record_buf_mem);
12372 return ARM_RECORD_SUCCESS;
12373}
12374
12375/* Handler for thumb2 data processing (shift register and modified immediate)
12376 instructions. */
12377
12378static int
12379thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12380{
12381 uint32_t reg_rd, op;
12382 uint32_t record_buf[8];
12383
12384 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12385 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12386
12387 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12388 {
12389 record_buf[0] = ARM_PS_REGNUM;
12390 thumb2_insn_r->reg_rec_count = 1;
12391 }
12392 else
12393 {
12394 record_buf[0] = reg_rd;
12395 record_buf[1] = ARM_PS_REGNUM;
12396 thumb2_insn_r->reg_rec_count = 2;
12397 }
12398
12399 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12400 record_buf);
12401 return ARM_RECORD_SUCCESS;
12402}
12403
12404/* Generic handler for thumb2 instructions which effect destination and PS
12405 registers. */
12406
12407static int
12408thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12409{
12410 uint32_t reg_rd;
12411 uint32_t record_buf[8];
12412
12413 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12414
12415 record_buf[0] = reg_rd;
12416 record_buf[1] = ARM_PS_REGNUM;
12417 thumb2_insn_r->reg_rec_count = 2;
12418
12419 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12420 record_buf);
12421 return ARM_RECORD_SUCCESS;
12422}
12423
12424/* Handler for thumb2 branch and miscellaneous control instructions. */
12425
12426static int
12427thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12428{
12429 uint32_t op, op1, op2;
12430 uint32_t record_buf[8];
12431
12432 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12433 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12434 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12435
12436 /* Handle MSR insn. */
12437 if (!(op1 & 0x2) && 0x38 == op)
12438 {
12439 if (!(op2 & 0x3))
12440 {
12441 /* CPSR is going to be changed. */
12442 record_buf[0] = ARM_PS_REGNUM;
12443 thumb2_insn_r->reg_rec_count = 1;
12444 }
12445 else
12446 {
12447 arm_record_unsupported_insn(thumb2_insn_r);
12448 return -1;
12449 }
12450 }
12451 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12452 {
12453 /* BLX. */
12454 record_buf[0] = ARM_PS_REGNUM;
12455 record_buf[1] = ARM_LR_REGNUM;
12456 thumb2_insn_r->reg_rec_count = 2;
12457 }
12458
12459 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12460 record_buf);
12461 return ARM_RECORD_SUCCESS;
12462}
12463
12464/* Handler for thumb2 store single data item instructions. */
12465
12466static int
12467thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12468{
12469 struct regcache *reg_cache = thumb2_insn_r->regcache;
12470
12471 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12472 uint32_t address, offset_addr;
12473 uint32_t record_buf[8], record_buf_mem[8];
12474 uint32_t op1, op2;
12475
12476 ULONGEST u_regval[2];
12477
12478 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12479 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12480 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12481 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12482
12483 if (bit (thumb2_insn_r->arm_insn, 23))
12484 {
12485 /* T2 encoding. */
12486 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12487 offset_addr = u_regval[0] + offset_imm;
12488 address = offset_addr;
12489 }
12490 else
12491 {
12492 /* T3 encoding. */
12493 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12494 {
12495 /* Handle STRB (register). */
12496 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12497 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12498 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12499 offset_addr = u_regval[1] << shift_imm;
12500 address = u_regval[0] + offset_addr;
12501 }
12502 else
12503 {
12504 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12505 if (bit (thumb2_insn_r->arm_insn, 10))
12506 {
12507 if (bit (thumb2_insn_r->arm_insn, 9))
12508 offset_addr = u_regval[0] + offset_imm;
12509 else
12510 offset_addr = u_regval[0] - offset_imm;
12511
12512 address = offset_addr;
12513 }
12514 else
12515 address = u_regval[0];
12516 }
12517 }
12518
12519 switch (op1)
12520 {
12521 /* Store byte instructions. */
12522 case 4:
12523 case 0:
12524 record_buf_mem[0] = 1;
12525 break;
12526 /* Store half word instructions. */
12527 case 1:
12528 case 5:
12529 record_buf_mem[0] = 2;
12530 break;
12531 /* Store word instructions. */
12532 case 2:
12533 case 6:
12534 record_buf_mem[0] = 4;
12535 break;
12536
12537 default:
12538 gdb_assert_not_reached ("no decoding pattern found");
12539 break;
12540 }
12541
12542 record_buf_mem[1] = address;
12543 thumb2_insn_r->mem_rec_count = 1;
12544 record_buf[0] = reg_rn;
12545 thumb2_insn_r->reg_rec_count = 1;
12546
12547 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12548 record_buf);
12549 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12550 record_buf_mem);
12551 return ARM_RECORD_SUCCESS;
12552}
12553
12554/* Handler for thumb2 load memory hints instructions. */
12555
12556static int
12557thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12558{
12559 uint32_t record_buf[8];
12560 uint32_t reg_rt, reg_rn;
12561
12562 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12563 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12564
12565 if (ARM_PC_REGNUM != reg_rt)
12566 {
12567 record_buf[0] = reg_rt;
12568 record_buf[1] = reg_rn;
12569 record_buf[2] = ARM_PS_REGNUM;
12570 thumb2_insn_r->reg_rec_count = 3;
12571
12572 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12573 record_buf);
12574 return ARM_RECORD_SUCCESS;
12575 }
12576
12577 return ARM_RECORD_FAILURE;
12578}
12579
12580/* Handler for thumb2 load word instructions. */
12581
12582static int
12583thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12584{
c6ec2b30
OJ
12585 uint32_t record_buf[8];
12586
12587 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12588 record_buf[1] = ARM_PS_REGNUM;
12589 thumb2_insn_r->reg_rec_count = 2;
12590
12591 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12592 record_buf);
12593 return ARM_RECORD_SUCCESS;
12594}
12595
12596/* Handler for thumb2 long multiply, long multiply accumulate, and
12597 divide instructions. */
12598
12599static int
12600thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12601{
12602 uint32_t opcode1 = 0, opcode2 = 0;
12603 uint32_t record_buf[8];
c6ec2b30
OJ
12604
12605 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12606 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12607
12608 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12609 {
12610 /* Handle SMULL, UMULL, SMULAL. */
12611 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12612 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12613 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12614 record_buf[2] = ARM_PS_REGNUM;
12615 thumb2_insn_r->reg_rec_count = 3;
12616 }
12617 else if (1 == opcode1 || 3 == opcode2)
12618 {
12619 /* Handle SDIV and UDIV. */
12620 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12621 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12622 record_buf[2] = ARM_PS_REGNUM;
12623 thumb2_insn_r->reg_rec_count = 3;
12624 }
12625 else
12626 return ARM_RECORD_FAILURE;
12627
12628 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12629 record_buf);
12630 return ARM_RECORD_SUCCESS;
12631}
12632
60cc5e93
OJ
12633/* Record handler for thumb32 coprocessor instructions. */
12634
12635static int
12636thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12637{
12638 if (bit (thumb2_insn_r->arm_insn, 25))
12639 return arm_record_coproc_data_proc (thumb2_insn_r);
12640 else
12641 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12642}
12643
1e1b6563
OJ
12644/* Record handler for advance SIMD structure load/store instructions. */
12645
12646static int
12647thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12648{
12649 struct regcache *reg_cache = thumb2_insn_r->regcache;
12650 uint32_t l_bit, a_bit, b_bits;
12651 uint32_t record_buf[128], record_buf_mem[128];
bec2ab5a 12652 uint32_t reg_rn, reg_vd, address, f_elem;
1e1b6563
OJ
12653 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12654 uint8_t f_ebytes;
12655
12656 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12657 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12658 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12659 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12660 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12661 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12662 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
1e1b6563
OJ
12663 f_elem = 8 / f_ebytes;
12664
12665 if (!l_bit)
12666 {
12667 ULONGEST u_regval = 0;
12668 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12669 address = u_regval;
12670
12671 if (!a_bit)
12672 {
12673 /* Handle VST1. */
12674 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12675 {
12676 if (b_bits == 0x07)
12677 bf_regs = 1;
12678 else if (b_bits == 0x0a)
12679 bf_regs = 2;
12680 else if (b_bits == 0x06)
12681 bf_regs = 3;
12682 else if (b_bits == 0x02)
12683 bf_regs = 4;
12684 else
12685 bf_regs = 0;
12686
12687 for (index_r = 0; index_r < bf_regs; index_r++)
12688 {
12689 for (index_e = 0; index_e < f_elem; index_e++)
12690 {
12691 record_buf_mem[index_m++] = f_ebytes;
12692 record_buf_mem[index_m++] = address;
12693 address = address + f_ebytes;
12694 thumb2_insn_r->mem_rec_count += 1;
12695 }
12696 }
12697 }
12698 /* Handle VST2. */
12699 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12700 {
12701 if (b_bits == 0x09 || b_bits == 0x08)
12702 bf_regs = 1;
12703 else if (b_bits == 0x03)
12704 bf_regs = 2;
12705 else
12706 bf_regs = 0;
12707
12708 for (index_r = 0; index_r < bf_regs; index_r++)
12709 for (index_e = 0; index_e < f_elem; index_e++)
12710 {
12711 for (loop_t = 0; loop_t < 2; loop_t++)
12712 {
12713 record_buf_mem[index_m++] = f_ebytes;
12714 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12715 thumb2_insn_r->mem_rec_count += 1;
12716 }
12717 address = address + (2 * f_ebytes);
12718 }
12719 }
12720 /* Handle VST3. */
12721 else if ((b_bits & 0x0e) == 0x04)
12722 {
12723 for (index_e = 0; index_e < f_elem; index_e++)
12724 {
12725 for (loop_t = 0; loop_t < 3; loop_t++)
12726 {
12727 record_buf_mem[index_m++] = f_ebytes;
12728 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12729 thumb2_insn_r->mem_rec_count += 1;
12730 }
12731 address = address + (3 * f_ebytes);
12732 }
12733 }
12734 /* Handle VST4. */
12735 else if (!(b_bits & 0x0e))
12736 {
12737 for (index_e = 0; index_e < f_elem; index_e++)
12738 {
12739 for (loop_t = 0; loop_t < 4; loop_t++)
12740 {
12741 record_buf_mem[index_m++] = f_ebytes;
12742 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12743 thumb2_insn_r->mem_rec_count += 1;
12744 }
12745 address = address + (4 * f_ebytes);
12746 }
12747 }
12748 }
12749 else
12750 {
12751 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12752
12753 if (bft_size == 0x00)
12754 f_ebytes = 1;
12755 else if (bft_size == 0x01)
12756 f_ebytes = 2;
12757 else if (bft_size == 0x02)
12758 f_ebytes = 4;
12759 else
12760 f_ebytes = 0;
12761
12762 /* Handle VST1. */
12763 if (!(b_bits & 0x0b) || b_bits == 0x08)
12764 thumb2_insn_r->mem_rec_count = 1;
12765 /* Handle VST2. */
12766 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12767 thumb2_insn_r->mem_rec_count = 2;
12768 /* Handle VST3. */
12769 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12770 thumb2_insn_r->mem_rec_count = 3;
12771 /* Handle VST4. */
12772 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12773 thumb2_insn_r->mem_rec_count = 4;
12774
12775 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12776 {
12777 record_buf_mem[index_m] = f_ebytes;
12778 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12779 }
12780 }
12781 }
12782 else
12783 {
12784 if (!a_bit)
12785 {
12786 /* Handle VLD1. */
12787 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12788 thumb2_insn_r->reg_rec_count = 1;
12789 /* Handle VLD2. */
12790 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12791 thumb2_insn_r->reg_rec_count = 2;
12792 /* Handle VLD3. */
12793 else if ((b_bits & 0x0e) == 0x04)
12794 thumb2_insn_r->reg_rec_count = 3;
12795 /* Handle VLD4. */
12796 else if (!(b_bits & 0x0e))
12797 thumb2_insn_r->reg_rec_count = 4;
12798 }
12799 else
12800 {
12801 /* Handle VLD1. */
12802 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12803 thumb2_insn_r->reg_rec_count = 1;
12804 /* Handle VLD2. */
12805 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12806 thumb2_insn_r->reg_rec_count = 2;
12807 /* Handle VLD3. */
12808 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12809 thumb2_insn_r->reg_rec_count = 3;
12810 /* Handle VLD4. */
12811 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12812 thumb2_insn_r->reg_rec_count = 4;
12813
12814 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12815 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12816 }
12817 }
12818
12819 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12820 {
12821 record_buf[index_r] = reg_rn;
12822 thumb2_insn_r->reg_rec_count += 1;
12823 }
12824
12825 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12826 record_buf);
12827 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12828 record_buf_mem);
12829 return 0;
12830}
12831
c6ec2b30
OJ
12832/* Decodes thumb2 instruction type and invokes its record handler. */
12833
12834static unsigned int
12835thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12836{
12837 uint32_t op, op1, op2;
12838
12839 op = bit (thumb2_insn_r->arm_insn, 15);
12840 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12841 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12842
12843 if (op1 == 0x01)
12844 {
12845 if (!(op2 & 0x64 ))
12846 {
12847 /* Load/store multiple instruction. */
12848 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12849 }
b121eeb9 12850 else if ((op2 & 0x64) == 0x4)
c6ec2b30
OJ
12851 {
12852 /* Load/store (dual/exclusive) and table branch instruction. */
12853 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12854 }
b121eeb9 12855 else if ((op2 & 0x60) == 0x20)
c6ec2b30
OJ
12856 {
12857 /* Data-processing (shifted register). */
12858 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12859 }
12860 else if (op2 & 0x40)
12861 {
12862 /* Co-processor instructions. */
60cc5e93 12863 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12864 }
12865 }
12866 else if (op1 == 0x02)
12867 {
12868 if (op)
12869 {
12870 /* Branches and miscellaneous control instructions. */
12871 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12872 }
12873 else if (op2 & 0x20)
12874 {
12875 /* Data-processing (plain binary immediate) instruction. */
12876 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12877 }
12878 else
12879 {
12880 /* Data-processing (modified immediate). */
12881 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12882 }
12883 }
12884 else if (op1 == 0x03)
12885 {
12886 if (!(op2 & 0x71 ))
12887 {
12888 /* Store single data item. */
12889 return thumb2_record_str_single_data (thumb2_insn_r);
12890 }
12891 else if (!((op2 & 0x71) ^ 0x10))
12892 {
12893 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12894 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12895 }
12896 else if (!((op2 & 0x67) ^ 0x01))
12897 {
12898 /* Load byte, memory hints instruction. */
12899 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12900 }
12901 else if (!((op2 & 0x67) ^ 0x03))
12902 {
12903 /* Load halfword, memory hints instruction. */
12904 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12905 }
12906 else if (!((op2 & 0x67) ^ 0x05))
12907 {
12908 /* Load word instruction. */
12909 return thumb2_record_ld_word (thumb2_insn_r);
12910 }
12911 else if (!((op2 & 0x70) ^ 0x20))
12912 {
12913 /* Data-processing (register) instruction. */
12914 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12915 }
12916 else if (!((op2 & 0x78) ^ 0x30))
12917 {
12918 /* Multiply, multiply accumulate, abs diff instruction. */
12919 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12920 }
12921 else if (!((op2 & 0x78) ^ 0x38))
12922 {
12923 /* Long multiply, long multiply accumulate, and divide. */
12924 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12925 }
12926 else if (op2 & 0x40)
12927 {
12928 /* Co-processor instructions. */
60cc5e93 12929 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12930 }
12931 }
12932
12933 return -1;
12934}
72508ac0 12935
ffdbe864 12936namespace {
728a7913
YQ
12937/* Abstract memory reader. */
12938
12939class abstract_memory_reader
12940{
12941public:
12942 /* Read LEN bytes of target memory at address MEMADDR, placing the
12943 results in GDB's memory at BUF. Return true on success. */
12944
12945 virtual bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) = 0;
12946};
12947
12948/* Instruction reader from real target. */
12949
12950class instruction_reader : public abstract_memory_reader
12951{
12952 public:
632e107b 12953 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) override
728a7913
YQ
12954 {
12955 if (target_read_memory (memaddr, buf, len))
12956 return false;
12957 else
12958 return true;
12959 }
12960};
12961
ffdbe864
YQ
12962} // namespace
12963
72508ac0
PO
12964/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12965and positive val on fauilure. */
12966
12967static int
728a7913
YQ
12968extract_arm_insn (abstract_memory_reader& reader,
12969 insn_decode_record *insn_record, uint32_t insn_size)
72508ac0
PO
12970{
12971 gdb_byte buf[insn_size];
12972
12973 memset (&buf[0], 0, insn_size);
12974
728a7913 12975 if (!reader.read (insn_record->this_addr, buf, insn_size))
72508ac0
PO
12976 return 1;
12977 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12978 insn_size,
2959fed9 12979 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
12980 return 0;
12981}
12982
12983typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12984
12985/* Decode arm/thumb insn depending on condition cods and opcodes; and
12986 dispatch it. */
12987
12988static int
728a7913
YQ
12989decode_insn (abstract_memory_reader &reader, insn_decode_record *arm_record,
12990 record_type_t record_type, uint32_t insn_size)
72508ac0
PO
12991{
12992
01e57735
YQ
12993 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
12994 instruction. */
0fa9c223 12995 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
12996 {
12997 arm_record_data_proc_misc_ld_str, /* 000. */
12998 arm_record_data_proc_imm, /* 001. */
12999 arm_record_ld_st_imm_offset, /* 010. */
13000 arm_record_ld_st_reg_offset, /* 011. */
13001 arm_record_ld_st_multiple, /* 100. */
13002 arm_record_b_bl, /* 101. */
60cc5e93 13003 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
13004 arm_record_coproc_data_proc /* 111. */
13005 };
13006
01e57735
YQ
13007 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
13008 instruction. */
0fa9c223 13009 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
13010 { \
13011 thumb_record_shift_add_sub, /* 000. */
13012 thumb_record_add_sub_cmp_mov, /* 001. */
13013 thumb_record_ld_st_reg_offset, /* 010. */
13014 thumb_record_ld_st_imm_offset, /* 011. */
13015 thumb_record_ld_st_stack, /* 100. */
13016 thumb_record_misc, /* 101. */
13017 thumb_record_ldm_stm_swi, /* 110. */
13018 thumb_record_branch /* 111. */
13019 };
13020
13021 uint32_t ret = 0; /* return value: negative:failure 0:success. */
13022 uint32_t insn_id = 0;
13023
728a7913 13024 if (extract_arm_insn (reader, arm_record, insn_size))
72508ac0
PO
13025 {
13026 if (record_debug)
01e57735
YQ
13027 {
13028 printf_unfiltered (_("Process record: error reading memory at "
13029 "addr %s len = %d.\n"),
13030 paddress (arm_record->gdbarch,
13031 arm_record->this_addr), insn_size);
13032 }
72508ac0
PO
13033 return -1;
13034 }
13035 else if (ARM_RECORD == record_type)
13036 {
13037 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
13038 insn_id = bits (arm_record->arm_insn, 25, 27);
ca92db2d
YQ
13039
13040 if (arm_record->cond == 0xf)
13041 ret = arm_record_extension_space (arm_record);
13042 else
01e57735 13043 {
ca92db2d
YQ
13044 /* If this insn has fallen into extension space
13045 then we need not decode it anymore. */
01e57735
YQ
13046 ret = arm_handle_insn[insn_id] (arm_record);
13047 }
ca92db2d
YQ
13048 if (ret != ARM_RECORD_SUCCESS)
13049 {
13050 arm_record_unsupported_insn (arm_record);
13051 ret = -1;
13052 }
72508ac0
PO
13053 }
13054 else if (THUMB_RECORD == record_type)
13055 {
13056 /* As thumb does not have condition codes, we set negative. */
13057 arm_record->cond = -1;
13058 insn_id = bits (arm_record->arm_insn, 13, 15);
13059 ret = thumb_handle_insn[insn_id] (arm_record);
ca92db2d
YQ
13060 if (ret != ARM_RECORD_SUCCESS)
13061 {
13062 arm_record_unsupported_insn (arm_record);
13063 ret = -1;
13064 }
72508ac0
PO
13065 }
13066 else if (THUMB2_RECORD == record_type)
13067 {
c6ec2b30
OJ
13068 /* As thumb does not have condition codes, we set negative. */
13069 arm_record->cond = -1;
13070
13071 /* Swap first half of 32bit thumb instruction with second half. */
13072 arm_record->arm_insn
01e57735 13073 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
c6ec2b30 13074
ca92db2d 13075 ret = thumb2_record_decode_insn_handler (arm_record);
c6ec2b30 13076
ca92db2d 13077 if (ret != ARM_RECORD_SUCCESS)
01e57735
YQ
13078 {
13079 arm_record_unsupported_insn (arm_record);
13080 ret = -1;
13081 }
72508ac0
PO
13082 }
13083 else
13084 {
13085 /* Throw assertion. */
13086 gdb_assert_not_reached ("not a valid instruction, could not decode");
13087 }
13088
13089 return ret;
13090}
13091
b121eeb9
YQ
13092#if GDB_SELF_TEST
13093namespace selftests {
13094
13095/* Provide both 16-bit and 32-bit thumb instructions. */
13096
13097class instruction_reader_thumb : public abstract_memory_reader
13098{
13099public:
13100 template<size_t SIZE>
13101 instruction_reader_thumb (enum bfd_endian endian,
13102 const uint16_t (&insns)[SIZE])
13103 : m_endian (endian), m_insns (insns), m_insns_size (SIZE)
13104 {}
13105
632e107b 13106 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) override
b121eeb9
YQ
13107 {
13108 SELF_CHECK (len == 4 || len == 2);
13109 SELF_CHECK (memaddr % 2 == 0);
13110 SELF_CHECK ((memaddr / 2) < m_insns_size);
13111
13112 store_unsigned_integer (buf, 2, m_endian, m_insns[memaddr / 2]);
13113 if (len == 4)
13114 {
13115 store_unsigned_integer (&buf[2], 2, m_endian,
13116 m_insns[memaddr / 2 + 1]);
13117 }
13118 return true;
13119 }
13120
13121private:
13122 enum bfd_endian m_endian;
13123 const uint16_t *m_insns;
13124 size_t m_insns_size;
13125};
13126
13127static void
13128arm_record_test (void)
13129{
13130 struct gdbarch_info info;
13131 gdbarch_info_init (&info);
13132 info.bfd_arch_info = bfd_scan_arch ("arm");
13133
13134 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
13135
13136 SELF_CHECK (gdbarch != NULL);
13137
13138 /* 16-bit Thumb instructions. */
13139 {
13140 insn_decode_record arm_record;
13141
13142 memset (&arm_record, 0, sizeof (insn_decode_record));
13143 arm_record.gdbarch = gdbarch;
13144
13145 static const uint16_t insns[] = {
13146 /* db b2 uxtb r3, r3 */
13147 0xb2db,
13148 /* cd 58 ldr r5, [r1, r3] */
13149 0x58cd,
13150 };
13151
13152 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13153 instruction_reader_thumb reader (endian, insns);
13154 int ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13155 THUMB_INSN_SIZE_BYTES);
13156
13157 SELF_CHECK (ret == 0);
13158 SELF_CHECK (arm_record.mem_rec_count == 0);
13159 SELF_CHECK (arm_record.reg_rec_count == 1);
13160 SELF_CHECK (arm_record.arm_regs[0] == 3);
13161
13162 arm_record.this_addr += 2;
13163 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13164 THUMB_INSN_SIZE_BYTES);
13165
13166 SELF_CHECK (ret == 0);
13167 SELF_CHECK (arm_record.mem_rec_count == 0);
13168 SELF_CHECK (arm_record.reg_rec_count == 1);
13169 SELF_CHECK (arm_record.arm_regs[0] == 5);
13170 }
13171
13172 /* 32-bit Thumb-2 instructions. */
13173 {
13174 insn_decode_record arm_record;
13175
13176 memset (&arm_record, 0, sizeof (insn_decode_record));
13177 arm_record.gdbarch = gdbarch;
13178
13179 static const uint16_t insns[] = {
13180 /* 1d ee 70 7f mrc 15, 0, r7, cr13, cr0, {3} */
13181 0xee1d, 0x7f70,
13182 };
13183
13184 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13185 instruction_reader_thumb reader (endian, insns);
13186 int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
13187 THUMB2_INSN_SIZE_BYTES);
13188
13189 SELF_CHECK (ret == 0);
13190 SELF_CHECK (arm_record.mem_rec_count == 0);
13191 SELF_CHECK (arm_record.reg_rec_count == 1);
13192 SELF_CHECK (arm_record.arm_regs[0] == 7);
13193 }
13194}
13195} // namespace selftests
13196#endif /* GDB_SELF_TEST */
72508ac0
PO
13197
13198/* Cleans up local record registers and memory allocations. */
13199
13200static void
13201deallocate_reg_mem (insn_decode_record *record)
13202{
13203 xfree (record->arm_regs);
13204 xfree (record->arm_mems);
13205}
13206
13207
01e57735 13208/* Parse the current instruction and record the values of the registers and
72508ac0
PO
13209 memory that will be changed in current instruction to record_arch_list".
13210 Return -1 if something is wrong. */
13211
13212int
01e57735
YQ
13213arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
13214 CORE_ADDR insn_addr)
72508ac0
PO
13215{
13216
72508ac0
PO
13217 uint32_t no_of_rec = 0;
13218 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
13219 ULONGEST t_bit = 0, insn_id = 0;
13220
13221 ULONGEST u_regval = 0;
13222
13223 insn_decode_record arm_record;
13224
13225 memset (&arm_record, 0, sizeof (insn_decode_record));
13226 arm_record.regcache = regcache;
13227 arm_record.this_addr = insn_addr;
13228 arm_record.gdbarch = gdbarch;
13229
13230
13231 if (record_debug > 1)
13232 {
13233 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
01e57735 13234 "addr = %s\n",
72508ac0
PO
13235 paddress (gdbarch, arm_record.this_addr));
13236 }
13237
728a7913
YQ
13238 instruction_reader reader;
13239 if (extract_arm_insn (reader, &arm_record, 2))
72508ac0
PO
13240 {
13241 if (record_debug)
01e57735
YQ
13242 {
13243 printf_unfiltered (_("Process record: error reading memory at "
13244 "addr %s len = %d.\n"),
13245 paddress (arm_record.gdbarch,
13246 arm_record.this_addr), 2);
13247 }
72508ac0
PO
13248 return -1;
13249 }
13250
13251 /* Check the insn, whether it is thumb or arm one. */
13252
13253 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
13254 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
13255
13256
13257 if (!(u_regval & t_bit))
13258 {
13259 /* We are decoding arm insn. */
728a7913 13260 ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
72508ac0
PO
13261 }
13262 else
13263 {
13264 insn_id = bits (arm_record.arm_insn, 11, 15);
13265 /* is it thumb2 insn? */
13266 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
01e57735 13267 {
728a7913 13268 ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
01e57735
YQ
13269 THUMB2_INSN_SIZE_BYTES);
13270 }
72508ac0 13271 else
01e57735
YQ
13272 {
13273 /* We are decoding thumb insn. */
728a7913
YQ
13274 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13275 THUMB_INSN_SIZE_BYTES);
01e57735 13276 }
72508ac0
PO
13277 }
13278
13279 if (0 == ret)
13280 {
13281 /* Record registers. */
25ea693b 13282 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0 13283 if (arm_record.arm_regs)
01e57735
YQ
13284 {
13285 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
13286 {
13287 if (record_full_arch_list_add_reg
25ea693b 13288 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
01e57735
YQ
13289 ret = -1;
13290 }
13291 }
72508ac0
PO
13292 /* Record memories. */
13293 if (arm_record.arm_mems)
01e57735
YQ
13294 {
13295 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
13296 {
13297 if (record_full_arch_list_add_mem
13298 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 13299 arm_record.arm_mems[no_of_rec].len))
01e57735
YQ
13300 ret = -1;
13301 }
13302 }
72508ac0 13303
25ea693b 13304 if (record_full_arch_list_add_end ())
01e57735 13305 ret = -1;
72508ac0
PO
13306 }
13307
13308
13309 deallocate_reg_mem (&arm_record);
13310
13311 return ret;
13312}
This page took 2.279431 seconds and 4 git commands to generate.