Fix alias command not detecting non matching prefix & sometimes asserting.
[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
TT
57
58#include "common/vec.h"
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
0747795c 73#include "common/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
91/* Per-objfile data used for mapping symbols. */
92static const struct objfile_data *arm_objfile_data_key;
93
94struct arm_mapping_symbol
95{
96 bfd_vma value;
97 char type;
98};
99typedef struct arm_mapping_symbol arm_mapping_symbol_s;
100DEF_VEC_O(arm_mapping_symbol_s);
101
102struct arm_per_objfile
103{
104 VEC(arm_mapping_symbol_s) **section_maps;
105};
106
afd7eef0
RE
107/* The list of available "set arm ..." and "show arm ..." commands. */
108static struct cmd_list_element *setarmcmdlist = NULL;
109static struct cmd_list_element *showarmcmdlist = NULL;
110
fd50bc42
RE
111/* The type of floating-point to use. Keep this in sync with enum
112 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 113static const char *const fp_model_strings[] =
fd50bc42
RE
114{
115 "auto",
116 "softfpa",
117 "fpa",
118 "softvfp",
28e97307
DJ
119 "vfp",
120 NULL
fd50bc42
RE
121};
122
123/* A variable that can be configured by the user. */
124static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
125static const char *current_fp_model = "auto";
126
28e97307 127/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 128static const char *const arm_abi_strings[] =
28e97307
DJ
129{
130 "auto",
131 "APCS",
132 "AAPCS",
133 NULL
134};
135
136/* A variable that can be configured by the user. */
137static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
138static const char *arm_abi_string = "auto";
139
0428b8f5 140/* The execution mode to assume. */
40478521 141static const char *const arm_mode_strings[] =
0428b8f5
DJ
142 {
143 "auto",
144 "arm",
68770265
MGD
145 "thumb",
146 NULL
0428b8f5
DJ
147 };
148
149static const char *arm_fallback_mode_string = "auto";
150static const char *arm_force_mode_string = "auto";
151
f32bf4a4
YQ
152/* The standard register names, and all the valid aliases for them. Note
153 that `fp', `sp' and `pc' are not added in this alias list, because they
154 have been added as builtin user registers in
155 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
156static const struct
157{
158 const char *name;
159 int regnum;
160} arm_register_aliases[] = {
161 /* Basic register numbers. */
162 { "r0", 0 },
163 { "r1", 1 },
164 { "r2", 2 },
165 { "r3", 3 },
166 { "r4", 4 },
167 { "r5", 5 },
168 { "r6", 6 },
169 { "r7", 7 },
170 { "r8", 8 },
171 { "r9", 9 },
172 { "r10", 10 },
173 { "r11", 11 },
174 { "r12", 12 },
175 { "r13", 13 },
176 { "r14", 14 },
177 { "r15", 15 },
178 /* Synonyms (argument and variable registers). */
179 { "a1", 0 },
180 { "a2", 1 },
181 { "a3", 2 },
182 { "a4", 3 },
183 { "v1", 4 },
184 { "v2", 5 },
185 { "v3", 6 },
186 { "v4", 7 },
187 { "v5", 8 },
188 { "v6", 9 },
189 { "v7", 10 },
190 { "v8", 11 },
191 /* Other platform-specific names for r9. */
192 { "sb", 9 },
193 { "tr", 9 },
194 /* Special names. */
195 { "ip", 12 },
123dc839 196 { "lr", 14 },
123dc839
DJ
197 /* Names used by GCC (not listed in the ARM EABI). */
198 { "sl", 10 },
123dc839
DJ
199 /* A special name from the older ATPCS. */
200 { "wr", 7 },
201};
bc90b915 202
123dc839 203static const char *const arm_register_names[] =
da59e081
JM
204{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
205 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
206 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
207 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
208 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
209 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 210 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 211
65b48a81
PB
212/* Holds the current set of options to be passed to the disassembler. */
213static char *arm_disassembler_options;
214
afd7eef0
RE
215/* Valid register name styles. */
216static const char **valid_disassembly_styles;
ed9a39eb 217
afd7eef0
RE
218/* Disassembly style to use. Default to "std" register names. */
219static const char *disassembly_style;
96baa820 220
ed9a39eb 221/* This is used to keep the bfd arch_info in sync with the disassembly
afd7eef0 222 style. */
eb4c3f4a 223static void set_disassembly_style_sfunc (const char *, int,
ed9a39eb 224 struct cmd_list_element *);
65b48a81
PB
225static void show_disassembly_style_sfunc (struct ui_file *, int,
226 struct cmd_list_element *,
227 const char *);
ed9a39eb 228
05d1431c 229static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
849d0ba8 230 readable_regcache *regcache,
05d1431c 231 int regnum, gdb_byte *buf);
58d6951d
DJ
232static void arm_neon_quad_write (struct gdbarch *gdbarch,
233 struct regcache *regcache,
234 int regnum, const gdb_byte *buf);
235
e7cf25a8 236static CORE_ADDR
553cb527 237 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
e7cf25a8
YQ
238
239
d9311bfa
AT
240/* get_next_pcs operations. */
241static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
242 arm_get_next_pcs_read_memory_unsigned_integer,
243 arm_get_next_pcs_syscall_next_pc,
244 arm_get_next_pcs_addr_bits_remove,
ed443b61
YQ
245 arm_get_next_pcs_is_thumb,
246 NULL,
d9311bfa
AT
247};
248
9b8d791a 249struct arm_prologue_cache
c3b4394c 250{
eb5492fa
DJ
251 /* The stack pointer at the time this frame was created; i.e. the
252 caller's stack pointer when this function was called. It is used
253 to identify this frame. */
254 CORE_ADDR prev_sp;
255
4be43953
DJ
256 /* The frame base for this frame is just prev_sp - frame size.
257 FRAMESIZE is the distance from the frame pointer to the
258 initial stack pointer. */
eb5492fa 259
c3b4394c 260 int framesize;
eb5492fa
DJ
261
262 /* The register used to hold the frame pointer for this frame. */
c3b4394c 263 int framereg;
eb5492fa
DJ
264
265 /* Saved register offsets. */
266 struct trad_frame_saved_reg *saved_regs;
c3b4394c 267};
ed9a39eb 268
0d39a070
DJ
269static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
270 CORE_ADDR prologue_start,
271 CORE_ADDR prologue_end,
272 struct arm_prologue_cache *cache);
273
cca44b1b
JB
274/* Architecture version for displaced stepping. This effects the behaviour of
275 certain instructions, and really should not be hard-wired. */
276
277#define DISPLACED_STEPPING_ARCH_VERSION 5
278
94c30b78 279/* Set to true if the 32-bit mode is in use. */
c906108c
SS
280
281int arm_apcs_32 = 1;
282
9779414d
DJ
283/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
284
478fd957 285int
9779414d
DJ
286arm_psr_thumb_bit (struct gdbarch *gdbarch)
287{
288 if (gdbarch_tdep (gdbarch)->is_m)
289 return XPSR_T;
290 else
291 return CPSR_T;
292}
293
d0e59a68
AT
294/* Determine if the processor is currently executing in Thumb mode. */
295
296int
297arm_is_thumb (struct regcache *regcache)
298{
299 ULONGEST cpsr;
ac7936df 300 ULONGEST t_bit = arm_psr_thumb_bit (regcache->arch ());
d0e59a68
AT
301
302 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
303
304 return (cpsr & t_bit) != 0;
305}
306
b39cc962
DJ
307/* Determine if FRAME is executing in Thumb mode. */
308
25b41d01 309int
b39cc962
DJ
310arm_frame_is_thumb (struct frame_info *frame)
311{
312 CORE_ADDR cpsr;
9779414d 313 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
314
315 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
316 directly (from a signal frame or dummy frame) or by interpreting
317 the saved LR (from a prologue or DWARF frame). So consult it and
318 trust the unwinders. */
319 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
320
9779414d 321 return (cpsr & t_bit) != 0;
b39cc962
DJ
322}
323
60c5725c
DJ
324/* Callback for VEC_lower_bound. */
325
326static inline int
327arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
328 const struct arm_mapping_symbol *rhs)
329{
330 return lhs->value < rhs->value;
331}
332
f9d67f43
DJ
333/* Search for the mapping symbol covering MEMADDR. If one is found,
334 return its type. Otherwise, return 0. If START is non-NULL,
335 set *START to the location of the mapping symbol. */
c906108c 336
f9d67f43
DJ
337static char
338arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 339{
60c5725c 340 struct obj_section *sec;
0428b8f5 341
60c5725c
DJ
342 /* If there are mapping symbols, consult them. */
343 sec = find_pc_section (memaddr);
344 if (sec != NULL)
345 {
346 struct arm_per_objfile *data;
347 VEC(arm_mapping_symbol_s) *map;
aded6f54
PA
348 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
349 0 };
60c5725c
DJ
350 unsigned int idx;
351
9a3c8263
SM
352 data = (struct arm_per_objfile *) objfile_data (sec->objfile,
353 arm_objfile_data_key);
60c5725c
DJ
354 if (data != NULL)
355 {
356 map = data->section_maps[sec->the_bfd_section->index];
357 if (!VEC_empty (arm_mapping_symbol_s, map))
358 {
359 struct arm_mapping_symbol *map_sym;
360
361 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
362 arm_compare_mapping_symbols);
363
364 /* VEC_lower_bound finds the earliest ordered insertion
365 point. If the following symbol starts at this exact
366 address, we use that; otherwise, the preceding
367 mapping symbol covers this address. */
368 if (idx < VEC_length (arm_mapping_symbol_s, map))
369 {
370 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
371 if (map_sym->value == map_key.value)
f9d67f43
DJ
372 {
373 if (start)
374 *start = map_sym->value + obj_section_addr (sec);
375 return map_sym->type;
376 }
60c5725c
DJ
377 }
378
379 if (idx > 0)
380 {
381 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
f9d67f43
DJ
382 if (start)
383 *start = map_sym->value + obj_section_addr (sec);
384 return map_sym->type;
60c5725c
DJ
385 }
386 }
387 }
388 }
389
f9d67f43
DJ
390 return 0;
391}
392
393/* Determine if the program counter specified in MEMADDR is in a Thumb
394 function. This function should be called for addresses unrelated to
395 any executing frame; otherwise, prefer arm_frame_is_thumb. */
396
e3039479 397int
9779414d 398arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 399{
7cbd4a93 400 struct bound_minimal_symbol sym;
f9d67f43 401 char type;
cfba9872
SM
402 arm_displaced_step_closure *dsc
403 = ((arm_displaced_step_closure * )
404 get_displaced_step_closure_by_addr (memaddr));
a42244db
YQ
405
406 /* If checking the mode of displaced instruction in copy area, the mode
407 should be determined by instruction on the original address. */
408 if (dsc)
409 {
410 if (debug_displaced)
411 fprintf_unfiltered (gdb_stdlog,
412 "displaced: check mode of %.8lx instead of %.8lx\n",
413 (unsigned long) dsc->insn_addr,
414 (unsigned long) memaddr);
415 memaddr = dsc->insn_addr;
416 }
f9d67f43
DJ
417
418 /* If bit 0 of the address is set, assume this is a Thumb address. */
419 if (IS_THUMB_ADDR (memaddr))
420 return 1;
421
422 /* If the user wants to override the symbol table, let him. */
423 if (strcmp (arm_force_mode_string, "arm") == 0)
424 return 0;
425 if (strcmp (arm_force_mode_string, "thumb") == 0)
426 return 1;
427
9779414d
DJ
428 /* ARM v6-M and v7-M are always in Thumb mode. */
429 if (gdbarch_tdep (gdbarch)->is_m)
430 return 1;
431
f9d67f43
DJ
432 /* If there are mapping symbols, consult them. */
433 type = arm_find_mapping_symbol (memaddr, NULL);
434 if (type)
435 return type == 't';
436
ed9a39eb 437 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c 438 sym = lookup_minimal_symbol_by_pc (memaddr);
7cbd4a93
TT
439 if (sym.minsym)
440 return (MSYMBOL_IS_SPECIAL (sym.minsym));
0428b8f5
DJ
441
442 /* If the user wants to override the fallback mode, let them. */
443 if (strcmp (arm_fallback_mode_string, "arm") == 0)
444 return 0;
445 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
446 return 1;
447
448 /* If we couldn't find any symbol, but we're talking to a running
449 target, then trust the current value of $cpsr. This lets
450 "display/i $pc" always show the correct mode (though if there is
451 a symbol table we will not reach here, so it still may not be
18819fa6 452 displayed in the mode it will be executed). */
0428b8f5 453 if (target_has_registers)
18819fa6 454 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
455
456 /* Otherwise we're out of luck; we assume ARM. */
457 return 0;
c906108c
SS
458}
459
ca90e760
FH
460/* Determine if the address specified equals any of these magic return
461 values, called EXC_RETURN, defined by the ARM v6-M and v7-M
462 architectures.
463
464 From ARMv6-M Reference Manual B1.5.8
465 Table B1-5 Exception return behavior
466
467 EXC_RETURN Return To Return Stack
468 0xFFFFFFF1 Handler mode Main
469 0xFFFFFFF9 Thread mode Main
470 0xFFFFFFFD Thread mode Process
471
472 From ARMv7-M Reference Manual B1.5.8
473 Table B1-8 EXC_RETURN definition of exception return behavior, no FP
474
475 EXC_RETURN Return To Return Stack
476 0xFFFFFFF1 Handler mode Main
477 0xFFFFFFF9 Thread mode Main
478 0xFFFFFFFD Thread mode Process
479
480 Table B1-9 EXC_RETURN definition of exception return behavior, with
481 FP
482
483 EXC_RETURN Return To Return Stack Frame Type
484 0xFFFFFFE1 Handler mode Main Extended
485 0xFFFFFFE9 Thread mode Main Extended
486 0xFFFFFFED Thread mode Process Extended
487 0xFFFFFFF1 Handler mode Main Basic
488 0xFFFFFFF9 Thread mode Main Basic
489 0xFFFFFFFD Thread mode Process Basic
490
491 For more details see "B1.5.8 Exception return behavior"
492 in both ARMv6-M and ARMv7-M Architecture Reference Manuals. */
493
494static int
495arm_m_addr_is_magic (CORE_ADDR addr)
496{
497 switch (addr)
498 {
499 /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
500 the exception return behavior. */
501 case 0xffffffe1:
502 case 0xffffffe9:
503 case 0xffffffed:
504 case 0xfffffff1:
505 case 0xfffffff9:
506 case 0xfffffffd:
507 /* Address is magic. */
508 return 1;
509
510 default:
511 /* Address is not magic. */
512 return 0;
513 }
514}
515
181c1381 516/* Remove useless bits from addresses in a running program. */
34e8f22d 517static CORE_ADDR
24568a2c 518arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 519{
2ae28aa9
YQ
520 /* On M-profile devices, do not strip the low bit from EXC_RETURN
521 (the magic exception return address). */
522 if (gdbarch_tdep (gdbarch)->is_m
ca90e760 523 && arm_m_addr_is_magic (val))
2ae28aa9
YQ
524 return val;
525
a3a2ee65 526 if (arm_apcs_32)
dd6be234 527 return UNMAKE_THUMB_ADDR (val);
c906108c 528 else
a3a2ee65 529 return (val & 0x03fffffc);
c906108c
SS
530}
531
0d39a070 532/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
533 can be safely ignored during prologue skipping. IS_THUMB is true
534 if the function is known to be a Thumb function due to the way it
535 is being called. */
0d39a070 536static int
e0634ccf 537skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 538{
e0634ccf 539 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7cbd4a93 540 struct bound_minimal_symbol msym;
0d39a070
DJ
541
542 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 543 if (msym.minsym != NULL
77e371c0 544 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
efd66ac6 545 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
e0634ccf 546 {
efd66ac6 547 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
0d39a070 548
e0634ccf
UW
549 /* The GNU linker's Thumb call stub to foo is named
550 __foo_from_thumb. */
551 if (strstr (name, "_from_thumb") != NULL)
552 name += 2;
0d39a070 553
e0634ccf
UW
554 /* On soft-float targets, __truncdfsf2 is called to convert promoted
555 arguments to their argument types in non-prototyped
556 functions. */
61012eef 557 if (startswith (name, "__truncdfsf2"))
e0634ccf 558 return 1;
61012eef 559 if (startswith (name, "__aeabi_d2f"))
e0634ccf 560 return 1;
0d39a070 561
e0634ccf 562 /* Internal functions related to thread-local storage. */
61012eef 563 if (startswith (name, "__tls_get_addr"))
e0634ccf 564 return 1;
61012eef 565 if (startswith (name, "__aeabi_read_tp"))
e0634ccf
UW
566 return 1;
567 }
568 else
569 {
570 /* If we run against a stripped glibc, we may be unable to identify
571 special functions by name. Check for one important case,
572 __aeabi_read_tp, by comparing the *code* against the default
573 implementation (this is hand-written ARM assembler in glibc). */
574
575 if (!is_thumb
198cd59d 576 && read_code_unsigned_integer (pc, 4, byte_order_for_code)
e0634ccf 577 == 0xe3e00a0f /* mov r0, #0xffff0fff */
198cd59d 578 && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
e0634ccf
UW
579 == 0xe240f01f) /* sub pc, r0, #31 */
580 return 1;
581 }
ec3d575a 582
0d39a070
DJ
583 return 0;
584}
585
621c6d5b
YQ
586/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
587 the first 16-bit of instruction, and INSN2 is the second 16-bit of
588 instruction. */
589#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
590 ((bits ((insn1), 0, 3) << 12) \
591 | (bits ((insn1), 10, 10) << 11) \
592 | (bits ((insn2), 12, 14) << 8) \
593 | bits ((insn2), 0, 7))
594
595/* Extract the immediate from instruction movw/movt of encoding A. INSN is
596 the 32-bit instruction. */
597#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
598 ((bits ((insn), 16, 19) << 12) \
599 | bits ((insn), 0, 11))
600
ec3d575a
UW
601/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
602
603static unsigned int
604thumb_expand_immediate (unsigned int imm)
605{
606 unsigned int count = imm >> 7;
607
608 if (count < 8)
609 switch (count / 2)
610 {
611 case 0:
612 return imm & 0xff;
613 case 1:
614 return (imm & 0xff) | ((imm & 0xff) << 16);
615 case 2:
616 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
617 case 3:
618 return (imm & 0xff) | ((imm & 0xff) << 8)
619 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
620 }
621
622 return (0x80 | (imm & 0x7f)) << (32 - count);
623}
624
540314bd
YQ
625/* Return 1 if the 16-bit Thumb instruction INSN restores SP in
626 epilogue, 0 otherwise. */
627
628static int
629thumb_instruction_restores_sp (unsigned short insn)
630{
631 return (insn == 0x46bd /* mov sp, r7 */
632 || (insn & 0xff80) == 0xb000 /* add sp, imm */
633 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
634}
635
29d73ae4
DJ
636/* Analyze a Thumb prologue, looking for a recognizable stack frame
637 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
638 clobber the stack frame unexpectedly, or an unknown instruction.
639 Return the last address which is definitely safe to skip for an
640 initial breakpoint. */
c906108c
SS
641
642static CORE_ADDR
29d73ae4
DJ
643thumb_analyze_prologue (struct gdbarch *gdbarch,
644 CORE_ADDR start, CORE_ADDR limit,
645 struct arm_prologue_cache *cache)
c906108c 646{
0d39a070 647 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 648 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
649 int i;
650 pv_t regs[16];
29d73ae4 651 CORE_ADDR offset;
ec3d575a 652 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 653
29d73ae4
DJ
654 for (i = 0; i < 16; i++)
655 regs[i] = pv_register (i, 0);
f7b7ed97 656 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4 657
29d73ae4 658 while (start < limit)
c906108c 659 {
29d73ae4
DJ
660 unsigned short insn;
661
198cd59d 662 insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 663
94c30b78 664 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 665 {
29d73ae4
DJ
666 int regno;
667 int mask;
4be43953 668
f7b7ed97 669 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953 670 break;
29d73ae4
DJ
671
672 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
673 whether to save LR (R14). */
674 mask = (insn & 0xff) | ((insn & 0x100) << 6);
675
676 /* Calculate offsets of saved R0-R7 and LR. */
677 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
678 if (mask & (1 << regno))
679 {
29d73ae4
DJ
680 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
681 -4);
f7b7ed97 682 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
29d73ae4 683 }
da59e081 684 }
1db01f22 685 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
da59e081 686 {
29d73ae4 687 offset = (insn & 0x7f) << 2; /* get scaled offset */
1db01f22
YQ
688 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
689 -offset);
da59e081 690 }
808f7ab1
YQ
691 else if (thumb_instruction_restores_sp (insn))
692 {
693 /* Don't scan past the epilogue. */
694 break;
695 }
0d39a070
DJ
696 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
697 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
698 (insn & 0xff) << 2);
699 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
700 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
701 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
702 bits (insn, 6, 8));
703 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
704 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
705 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
706 bits (insn, 0, 7));
707 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
708 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
709 && pv_is_constant (regs[bits (insn, 3, 5)]))
710 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
711 regs[bits (insn, 6, 8)]);
712 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
713 && pv_is_constant (regs[bits (insn, 3, 6)]))
714 {
715 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
716 int rm = bits (insn, 3, 6);
717 regs[rd] = pv_add (regs[rd], regs[rm]);
718 }
29d73ae4 719 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 720 {
29d73ae4
DJ
721 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
722 int src_reg = (insn & 0x78) >> 3;
723 regs[dst_reg] = regs[src_reg];
da59e081 724 }
29d73ae4 725 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 726 {
29d73ae4
DJ
727 /* Handle stores to the stack. Normally pushes are used,
728 but with GCC -mtpcs-frame, there may be other stores
729 in the prologue to create the frame. */
730 int regno = (insn >> 8) & 0x7;
731 pv_t addr;
732
733 offset = (insn & 0xff) << 2;
734 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
735
f7b7ed97 736 if (stack.store_would_trash (addr))
29d73ae4
DJ
737 break;
738
f7b7ed97 739 stack.store (addr, 4, regs[regno]);
da59e081 740 }
0d39a070
DJ
741 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
742 {
743 int rd = bits (insn, 0, 2);
744 int rn = bits (insn, 3, 5);
745 pv_t addr;
746
747 offset = bits (insn, 6, 10) << 2;
748 addr = pv_add_constant (regs[rn], offset);
749
f7b7ed97 750 if (stack.store_would_trash (addr))
0d39a070
DJ
751 break;
752
f7b7ed97 753 stack.store (addr, 4, regs[rd]);
0d39a070
DJ
754 }
755 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
756 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
757 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
758 /* Ignore stores of argument registers to the stack. */
759 ;
760 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
761 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
762 /* Ignore block loads from the stack, potentially copying
763 parameters from memory. */
764 ;
765 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
766 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
767 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
768 /* Similarly ignore single loads from the stack. */
769 ;
770 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
771 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
772 /* Skip register copies, i.e. saves to another register
773 instead of the stack. */
774 ;
775 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
776 /* Recognize constant loads; even with small stacks these are necessary
777 on Thumb. */
778 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
779 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
780 {
781 /* Constant pool loads, for the same reason. */
782 unsigned int constant;
783 CORE_ADDR loc;
784
785 loc = start + 4 + bits (insn, 0, 7) * 4;
786 constant = read_memory_unsigned_integer (loc, 4, byte_order);
787 regs[bits (insn, 8, 10)] = pv_constant (constant);
788 }
db24da6d 789 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 790 {
0d39a070
DJ
791 unsigned short inst2;
792
198cd59d
YQ
793 inst2 = read_code_unsigned_integer (start + 2, 2,
794 byte_order_for_code);
0d39a070
DJ
795
796 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
797 {
798 /* BL, BLX. Allow some special function calls when
799 skipping the prologue; GCC generates these before
800 storing arguments to the stack. */
801 CORE_ADDR nextpc;
802 int j1, j2, imm1, imm2;
803
804 imm1 = sbits (insn, 0, 10);
805 imm2 = bits (inst2, 0, 10);
806 j1 = bit (inst2, 13);
807 j2 = bit (inst2, 11);
808
809 offset = ((imm1 << 12) + (imm2 << 1));
810 offset ^= ((!j2) << 22) | ((!j1) << 23);
811
812 nextpc = start + 4 + offset;
813 /* For BLX make sure to clear the low bits. */
814 if (bit (inst2, 12) == 0)
815 nextpc = nextpc & 0xfffffffc;
816
e0634ccf
UW
817 if (!skip_prologue_function (gdbarch, nextpc,
818 bit (inst2, 12) != 0))
0d39a070
DJ
819 break;
820 }
ec3d575a 821
0963b4bd
MS
822 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
823 { registers } */
ec3d575a
UW
824 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
825 {
826 pv_t addr = regs[bits (insn, 0, 3)];
827 int regno;
828
f7b7ed97 829 if (stack.store_would_trash (addr))
ec3d575a
UW
830 break;
831
832 /* Calculate offsets of saved registers. */
833 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
834 if (inst2 & (1 << regno))
835 {
836 addr = pv_add_constant (addr, -4);
f7b7ed97 837 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
838 }
839
840 if (insn & 0x0020)
841 regs[bits (insn, 0, 3)] = addr;
842 }
843
0963b4bd
MS
844 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
845 [Rn, #+/-imm]{!} */
ec3d575a
UW
846 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
847 {
848 int regno1 = bits (inst2, 12, 15);
849 int regno2 = bits (inst2, 8, 11);
850 pv_t addr = regs[bits (insn, 0, 3)];
851
852 offset = inst2 & 0xff;
853 if (insn & 0x0080)
854 addr = pv_add_constant (addr, offset);
855 else
856 addr = pv_add_constant (addr, -offset);
857
f7b7ed97 858 if (stack.store_would_trash (addr))
ec3d575a
UW
859 break;
860
f7b7ed97
TT
861 stack.store (addr, 4, regs[regno1]);
862 stack.store (pv_add_constant (addr, 4),
863 4, regs[regno2]);
ec3d575a
UW
864
865 if (insn & 0x0020)
866 regs[bits (insn, 0, 3)] = addr;
867 }
868
869 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
870 && (inst2 & 0x0c00) == 0x0c00
871 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
872 {
873 int regno = bits (inst2, 12, 15);
874 pv_t addr = regs[bits (insn, 0, 3)];
875
876 offset = inst2 & 0xff;
877 if (inst2 & 0x0200)
878 addr = pv_add_constant (addr, offset);
879 else
880 addr = pv_add_constant (addr, -offset);
881
f7b7ed97 882 if (stack.store_would_trash (addr))
ec3d575a
UW
883 break;
884
f7b7ed97 885 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
886
887 if (inst2 & 0x0100)
888 regs[bits (insn, 0, 3)] = addr;
889 }
890
891 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
892 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
893 {
894 int regno = bits (inst2, 12, 15);
895 pv_t addr;
896
897 offset = inst2 & 0xfff;
898 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
899
f7b7ed97 900 if (stack.store_would_trash (addr))
ec3d575a
UW
901 break;
902
f7b7ed97 903 stack.store (addr, 4, regs[regno]);
ec3d575a
UW
904 }
905
906 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 907 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 908 /* Ignore stores of argument registers to the stack. */
0d39a070 909 ;
ec3d575a
UW
910
911 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
912 && (inst2 & 0x0d00) == 0x0c00
0d39a070 913 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 914 /* Ignore stores of argument registers to the stack. */
0d39a070 915 ;
ec3d575a 916
0963b4bd
MS
917 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
918 { registers } */
ec3d575a
UW
919 && (inst2 & 0x8000) == 0x0000
920 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
921 /* Ignore block loads from the stack, potentially copying
922 parameters from memory. */
0d39a070 923 ;
ec3d575a 924
0963b4bd
MS
925 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
926 [Rn, #+/-imm] */
0d39a070 927 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 928 /* Similarly ignore dual loads from the stack. */
0d39a070 929 ;
ec3d575a
UW
930
931 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
932 && (inst2 & 0x0d00) == 0x0c00
0d39a070 933 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 934 /* Similarly ignore single loads from the stack. */
0d39a070 935 ;
ec3d575a
UW
936
937 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
0d39a070 938 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 939 /* Similarly ignore single loads from the stack. */
0d39a070 940 ;
ec3d575a
UW
941
942 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
943 && (inst2 & 0x8000) == 0x0000)
944 {
945 unsigned int imm = ((bits (insn, 10, 10) << 11)
946 | (bits (inst2, 12, 14) << 8)
947 | bits (inst2, 0, 7));
948
949 regs[bits (inst2, 8, 11)]
950 = pv_add_constant (regs[bits (insn, 0, 3)],
951 thumb_expand_immediate (imm));
952 }
953
954 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
955 && (inst2 & 0x8000) == 0x0000)
0d39a070 956 {
ec3d575a
UW
957 unsigned int imm = ((bits (insn, 10, 10) << 11)
958 | (bits (inst2, 12, 14) << 8)
959 | bits (inst2, 0, 7));
960
961 regs[bits (inst2, 8, 11)]
962 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
963 }
964
965 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
966 && (inst2 & 0x8000) == 0x0000)
967 {
968 unsigned int imm = ((bits (insn, 10, 10) << 11)
969 | (bits (inst2, 12, 14) << 8)
970 | bits (inst2, 0, 7));
971
972 regs[bits (inst2, 8, 11)]
973 = pv_add_constant (regs[bits (insn, 0, 3)],
974 - (CORE_ADDR) thumb_expand_immediate (imm));
975 }
976
977 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
978 && (inst2 & 0x8000) == 0x0000)
979 {
980 unsigned int imm = ((bits (insn, 10, 10) << 11)
981 | (bits (inst2, 12, 14) << 8)
982 | bits (inst2, 0, 7));
983
984 regs[bits (inst2, 8, 11)]
985 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
986 }
987
988 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
989 {
990 unsigned int imm = ((bits (insn, 10, 10) << 11)
991 | (bits (inst2, 12, 14) << 8)
992 | bits (inst2, 0, 7));
993
994 regs[bits (inst2, 8, 11)]
995 = pv_constant (thumb_expand_immediate (imm));
996 }
997
998 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
999 {
621c6d5b
YQ
1000 unsigned int imm
1001 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
1002
1003 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1004 }
1005
1006 else if (insn == 0xea5f /* mov.w Rd,Rm */
1007 && (inst2 & 0xf0f0) == 0)
1008 {
1009 int dst_reg = (inst2 & 0x0f00) >> 8;
1010 int src_reg = inst2 & 0xf;
1011 regs[dst_reg] = regs[src_reg];
1012 }
1013
1014 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1015 {
1016 /* Constant pool loads. */
1017 unsigned int constant;
1018 CORE_ADDR loc;
1019
cac395ea 1020 offset = bits (inst2, 0, 11);
ec3d575a
UW
1021 if (insn & 0x0080)
1022 loc = start + 4 + offset;
1023 else
1024 loc = start + 4 - offset;
1025
1026 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1027 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1028 }
1029
1030 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1031 {
1032 /* Constant pool loads. */
1033 unsigned int constant;
1034 CORE_ADDR loc;
1035
cac395ea 1036 offset = bits (inst2, 0, 7) << 2;
ec3d575a
UW
1037 if (insn & 0x0080)
1038 loc = start + 4 + offset;
1039 else
1040 loc = start + 4 - offset;
1041
1042 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1043 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1044
1045 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1046 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1047 }
1048
1049 else if (thumb2_instruction_changes_pc (insn, inst2))
1050 {
1051 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1052 break;
1053 }
ec3d575a
UW
1054 else
1055 {
1056 /* The optimizer might shove anything into the prologue,
1057 so we just skip what we don't recognize. */
1058 unrecognized_pc = start;
1059 }
0d39a070
DJ
1060
1061 start += 2;
1062 }
ec3d575a 1063 else if (thumb_instruction_changes_pc (insn))
3d74b771 1064 {
ec3d575a 1065 /* Don't scan past anything that might change control flow. */
da3c6d4a 1066 break;
3d74b771 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 }
29d73ae4
DJ
1074
1075 start += 2;
c906108c
SS
1076 }
1077
0d39a070
DJ
1078 if (arm_debug)
1079 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1080 paddress (gdbarch, start));
1081
ec3d575a
UW
1082 if (unrecognized_pc == 0)
1083 unrecognized_pc = start;
1084
29d73ae4 1085 if (cache == NULL)
f7b7ed97 1086 return unrecognized_pc;
29d73ae4 1087
29d73ae4
DJ
1088 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1089 {
1090 /* Frame pointer is fp. Frame size is constant. */
1091 cache->framereg = ARM_FP_REGNUM;
1092 cache->framesize = -regs[ARM_FP_REGNUM].k;
1093 }
1094 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1095 {
1096 /* Frame pointer is r7. Frame size is constant. */
1097 cache->framereg = THUMB_FP_REGNUM;
1098 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1099 }
72a2e3dc 1100 else
29d73ae4
DJ
1101 {
1102 /* Try the stack pointer... this is a bit desperate. */
1103 cache->framereg = ARM_SP_REGNUM;
1104 cache->framesize = -regs[ARM_SP_REGNUM].k;
1105 }
29d73ae4
DJ
1106
1107 for (i = 0; i < 16; i++)
f7b7ed97 1108 if (stack.find_reg (gdbarch, i, &offset))
29d73ae4
DJ
1109 cache->saved_regs[i].addr = offset;
1110
ec3d575a 1111 return unrecognized_pc;
c906108c
SS
1112}
1113
621c6d5b
YQ
1114
1115/* Try to analyze the instructions starting from PC, which load symbol
1116 __stack_chk_guard. Return the address of instruction after loading this
1117 symbol, set the dest register number to *BASEREG, and set the size of
1118 instructions for loading symbol in OFFSET. Return 0 if instructions are
1119 not recognized. */
1120
1121static CORE_ADDR
1122arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1123 unsigned int *destreg, int *offset)
1124{
1125 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1126 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1127 unsigned int low, high, address;
1128
1129 address = 0;
1130 if (is_thumb)
1131 {
1132 unsigned short insn1
198cd59d 1133 = read_code_unsigned_integer (pc, 2, byte_order_for_code);
621c6d5b
YQ
1134
1135 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1136 {
1137 *destreg = bits (insn1, 8, 10);
1138 *offset = 2;
6ae274b7
YQ
1139 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1140 address = read_memory_unsigned_integer (address, 4,
1141 byte_order_for_code);
621c6d5b
YQ
1142 }
1143 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1144 {
1145 unsigned short insn2
198cd59d 1146 = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
621c6d5b
YQ
1147
1148 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1149
1150 insn1
198cd59d 1151 = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
621c6d5b 1152 insn2
198cd59d 1153 = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
621c6d5b
YQ
1154
1155 /* movt Rd, #const */
1156 if ((insn1 & 0xfbc0) == 0xf2c0)
1157 {
1158 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1159 *destreg = bits (insn2, 8, 11);
1160 *offset = 8;
1161 address = (high << 16 | low);
1162 }
1163 }
1164 }
1165 else
1166 {
2e9e421f 1167 unsigned int insn
198cd59d 1168 = read_code_unsigned_integer (pc, 4, byte_order_for_code);
2e9e421f 1169
6ae274b7 1170 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
2e9e421f 1171 {
6ae274b7
YQ
1172 address = bits (insn, 0, 11) + pc + 8;
1173 address = read_memory_unsigned_integer (address, 4,
1174 byte_order_for_code);
1175
2e9e421f
UW
1176 *destreg = bits (insn, 12, 15);
1177 *offset = 4;
1178 }
1179 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1180 {
1181 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1182
1183 insn
198cd59d 1184 = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
2e9e421f
UW
1185
1186 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1187 {
1188 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1189 *destreg = bits (insn, 12, 15);
1190 *offset = 8;
1191 address = (high << 16 | low);
1192 }
1193 }
621c6d5b
YQ
1194 }
1195
1196 return address;
1197}
1198
1199/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1200 points to the first instruction of this sequence, return the address of
1201 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1202
1203 On arm, this sequence of instructions is composed of mainly three steps,
1204 Step 1: load symbol __stack_chk_guard,
1205 Step 2: load from address of __stack_chk_guard,
1206 Step 3: store it to somewhere else.
1207
1208 Usually, instructions on step 2 and step 3 are the same on various ARM
1209 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1210 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1211 instructions in step 1 vary from different ARM architectures. On ARMv7,
1212 they are,
1213
1214 movw Rn, #:lower16:__stack_chk_guard
1215 movt Rn, #:upper16:__stack_chk_guard
1216
1217 On ARMv5t, it is,
1218
1219 ldr Rn, .Label
1220 ....
1221 .Lable:
1222 .word __stack_chk_guard
1223
1224 Since ldr/str is a very popular instruction, we can't use them as
1225 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1226 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1227 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1228
1229static CORE_ADDR
1230arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1231{
1232 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1233 unsigned int basereg;
7cbd4a93 1234 struct bound_minimal_symbol stack_chk_guard;
621c6d5b
YQ
1235 int offset;
1236 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1237 CORE_ADDR addr;
1238
1239 /* Try to parse the instructions in Step 1. */
1240 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1241 &basereg, &offset);
1242 if (!addr)
1243 return pc;
1244
1245 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
6041179a
JB
1246 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1247 Otherwise, this sequence cannot be for stack protector. */
1248 if (stack_chk_guard.minsym == NULL
61012eef 1249 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
621c6d5b
YQ
1250 return pc;
1251
1252 if (is_thumb)
1253 {
1254 unsigned int destreg;
1255 unsigned short insn
198cd59d 1256 = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
621c6d5b
YQ
1257
1258 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1259 if ((insn & 0xf800) != 0x6800)
1260 return pc;
1261 if (bits (insn, 3, 5) != basereg)
1262 return pc;
1263 destreg = bits (insn, 0, 2);
1264
198cd59d
YQ
1265 insn = read_code_unsigned_integer (pc + offset + 2, 2,
1266 byte_order_for_code);
621c6d5b
YQ
1267 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1268 if ((insn & 0xf800) != 0x6000)
1269 return pc;
1270 if (destreg != bits (insn, 0, 2))
1271 return pc;
1272 }
1273 else
1274 {
1275 unsigned int destreg;
1276 unsigned int insn
198cd59d 1277 = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
621c6d5b
YQ
1278
1279 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1280 if ((insn & 0x0e500000) != 0x04100000)
1281 return pc;
1282 if (bits (insn, 16, 19) != basereg)
1283 return pc;
1284 destreg = bits (insn, 12, 15);
1285 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
198cd59d 1286 insn = read_code_unsigned_integer (pc + offset + 4,
621c6d5b
YQ
1287 4, byte_order_for_code);
1288 if ((insn & 0x0e500000) != 0x04000000)
1289 return pc;
1290 if (bits (insn, 12, 15) != destreg)
1291 return pc;
1292 }
1293 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1294 on arm. */
1295 if (is_thumb)
1296 return pc + offset + 4;
1297 else
1298 return pc + offset + 8;
1299}
1300
da3c6d4a
MS
1301/* Advance the PC across any function entry prologue instructions to
1302 reach some "real" code.
34e8f22d
RE
1303
1304 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1305 prologue:
c906108c 1306
c5aa993b
JM
1307 mov ip, sp
1308 [stmfd sp!, {a1,a2,a3,a4}]
1309 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1310 [stfe f7, [sp, #-12]!]
1311 [stfe f6, [sp, #-12]!]
1312 [stfe f5, [sp, #-12]!]
1313 [stfe f4, [sp, #-12]!]
0963b4bd 1314 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1315
34e8f22d 1316static CORE_ADDR
6093d2eb 1317arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1318{
a89fea3c 1319 CORE_ADDR func_addr, limit_pc;
c906108c 1320
a89fea3c
JL
1321 /* See if we can determine the end of the prologue via the symbol table.
1322 If so, then return either PC, or the PC after the prologue, whichever
1323 is greater. */
1324 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1325 {
d80b854b
UW
1326 CORE_ADDR post_prologue_pc
1327 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1328 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1329
621c6d5b
YQ
1330 if (post_prologue_pc)
1331 post_prologue_pc
1332 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1333
1334
0d39a070
DJ
1335 /* GCC always emits a line note before the prologue and another
1336 one after, even if the two are at the same address or on the
1337 same line. Take advantage of this so that we do not need to
1338 know every instruction that might appear in the prologue. We
1339 will have producer information for most binaries; if it is
1340 missing (e.g. for -gstabs), assuming the GNU tools. */
1341 if (post_prologue_pc
43f3e411
DE
1342 && (cust == NULL
1343 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1344 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1345 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1346 return post_prologue_pc;
1347
a89fea3c 1348 if (post_prologue_pc != 0)
0d39a070
DJ
1349 {
1350 CORE_ADDR analyzed_limit;
1351
1352 /* For non-GCC compilers, make sure the entire line is an
1353 acceptable prologue; GDB will round this function's
1354 return value up to the end of the following line so we
1355 can not skip just part of a line (and we do not want to).
1356
1357 RealView does not treat the prologue specially, but does
1358 associate prologue code with the opening brace; so this
1359 lets us skip the first line if we think it is the opening
1360 brace. */
9779414d 1361 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1362 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1363 post_prologue_pc, NULL);
1364 else
1365 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1366 post_prologue_pc, NULL);
1367
1368 if (analyzed_limit != post_prologue_pc)
1369 return func_addr;
1370
1371 return post_prologue_pc;
1372 }
c906108c
SS
1373 }
1374
a89fea3c
JL
1375 /* Can't determine prologue from the symbol table, need to examine
1376 instructions. */
c906108c 1377
a89fea3c
JL
1378 /* Find an upper limit on the function prologue using the debug
1379 information. If the debug information could not be used to provide
1380 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1381 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1382 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1383 if (limit_pc == 0)
1384 limit_pc = pc + 64; /* Magic. */
1385
c906108c 1386
29d73ae4 1387 /* Check if this is Thumb code. */
9779414d 1388 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1389 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1390 else
1391 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1392}
94c30b78 1393
c5aa993b 1394/* *INDENT-OFF* */
c906108c
SS
1395/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1396 This function decodes a Thumb function prologue to determine:
1397 1) the size of the stack frame
1398 2) which registers are saved on it
1399 3) the offsets of saved regs
1400 4) the offset from the stack pointer to the frame pointer
c906108c 1401
da59e081
JM
1402 A typical Thumb function prologue would create this stack frame
1403 (offsets relative to FP)
c906108c
SS
1404 old SP -> 24 stack parameters
1405 20 LR
1406 16 R7
1407 R7 -> 0 local variables (16 bytes)
1408 SP -> -12 additional stack space (12 bytes)
1409 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1410 12 bytes. The frame register is R7.
da59e081 1411
da3c6d4a
MS
1412 The comments for thumb_skip_prolog() describe the algorithm we use
1413 to detect the end of the prolog. */
c5aa993b
JM
1414/* *INDENT-ON* */
1415
c906108c 1416static void
be8626e0 1417thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1418 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1419{
1420 CORE_ADDR prologue_start;
1421 CORE_ADDR prologue_end;
c906108c 1422
b39cc962
DJ
1423 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1424 &prologue_end))
c906108c 1425 {
ec3d575a
UW
1426 /* See comment in arm_scan_prologue for an explanation of
1427 this heuristics. */
1428 if (prologue_end > prologue_start + 64)
1429 {
1430 prologue_end = prologue_start + 64;
1431 }
c906108c
SS
1432 }
1433 else
f7060f85
DJ
1434 /* We're in the boondocks: we have no idea where the start of the
1435 function is. */
1436 return;
c906108c 1437
325fac50 1438 prologue_end = std::min (prologue_end, prev_pc);
c906108c 1439
be8626e0 1440 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1441}
1442
f303bc3e
YQ
1443/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1444 otherwise. */
1445
1446static int
1447arm_instruction_restores_sp (unsigned int insn)
1448{
1449 if (bits (insn, 28, 31) != INST_NV)
1450 {
1451 if ((insn & 0x0df0f000) == 0x0080d000
1452 /* ADD SP (register or immediate). */
1453 || (insn & 0x0df0f000) == 0x0040d000
1454 /* SUB SP (register or immediate). */
1455 || (insn & 0x0ffffff0) == 0x01a0d000
1456 /* MOV SP. */
1457 || (insn & 0x0fff0000) == 0x08bd0000
1458 /* POP (LDMIA). */
1459 || (insn & 0x0fff0000) == 0x049d0000)
1460 /* POP of a single register. */
1461 return 1;
1462 }
1463
1464 return 0;
1465}
1466
0d39a070
DJ
1467/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1468 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1469 fill it in. Return the first address not recognized as a prologue
1470 instruction.
eb5492fa 1471
0d39a070
DJ
1472 We recognize all the instructions typically found in ARM prologues,
1473 plus harmless instructions which can be skipped (either for analysis
1474 purposes, or a more restrictive set that can be skipped when finding
1475 the end of the prologue). */
1476
1477static CORE_ADDR
1478arm_analyze_prologue (struct gdbarch *gdbarch,
1479 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1480 struct arm_prologue_cache *cache)
1481{
0d39a070
DJ
1482 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1483 int regno;
1484 CORE_ADDR offset, current_pc;
1485 pv_t regs[ARM_FPS_REGNUM];
0d39a070
DJ
1486 CORE_ADDR unrecognized_pc = 0;
1487
1488 /* Search the prologue looking for instructions that set up the
96baa820 1489 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1490
96baa820
JM
1491 Be careful, however, and if it doesn't look like a prologue,
1492 don't try to scan it. If, for instance, a frameless function
1493 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1494 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1495 and other operations that rely on a knowledge of the stack
0d39a070 1496 traceback. */
d4473757 1497
4be43953
DJ
1498 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1499 regs[regno] = pv_register (regno, 0);
f7b7ed97 1500 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953 1501
94c30b78
MS
1502 for (current_pc = prologue_start;
1503 current_pc < prologue_end;
f43845b3 1504 current_pc += 4)
96baa820 1505 {
e17a4113 1506 unsigned int insn
198cd59d 1507 = read_code_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1508
94c30b78 1509 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1510 {
4be43953 1511 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1512 continue;
1513 }
0d39a070
DJ
1514 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1515 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1516 {
1517 unsigned imm = insn & 0xff; /* immediate value */
1518 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1519 int rd = bits (insn, 12, 15);
28cd8767 1520 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1521 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1522 continue;
1523 }
0d39a070
DJ
1524 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1525 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1526 {
1527 unsigned imm = insn & 0xff; /* immediate value */
1528 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1529 int rd = bits (insn, 12, 15);
28cd8767 1530 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1531 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1532 continue;
1533 }
0963b4bd
MS
1534 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1535 [sp, #-4]! */
f43845b3 1536 {
f7b7ed97 1537 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1538 break;
1539 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
f7b7ed97
TT
1540 stack.store (regs[ARM_SP_REGNUM], 4,
1541 regs[bits (insn, 12, 15)]);
f43845b3
MS
1542 continue;
1543 }
1544 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1545 /* stmfd sp!, {..., fp, ip, lr, pc}
1546 or
1547 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1548 {
d4473757 1549 int mask = insn & 0xffff;
ed9a39eb 1550
f7b7ed97 1551 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1552 break;
1553
94c30b78 1554 /* Calculate offsets of saved registers. */
34e8f22d 1555 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1556 if (mask & (1 << regno))
1557 {
0963b4bd
MS
1558 regs[ARM_SP_REGNUM]
1559 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
f7b7ed97 1560 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1561 }
1562 }
0d39a070
DJ
1563 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1564 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1565 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1566 {
1567 /* No need to add this to saved_regs -- it's just an arg reg. */
1568 continue;
1569 }
0d39a070
DJ
1570 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1571 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1572 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1573 {
1574 /* No need to add this to saved_regs -- it's just an arg reg. */
1575 continue;
1576 }
0963b4bd
MS
1577 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1578 { registers } */
0d39a070
DJ
1579 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1580 {
1581 /* No need to add this to saved_regs -- it's just arg regs. */
1582 continue;
1583 }
d4473757
KB
1584 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1585 {
94c30b78
MS
1586 unsigned imm = insn & 0xff; /* immediate value */
1587 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1588 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1589 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1590 }
1591 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1592 {
94c30b78
MS
1593 unsigned imm = insn & 0xff; /* immediate value */
1594 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1595 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1596 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1597 }
0963b4bd
MS
1598 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1599 [sp, -#c]! */
2af46ca0 1600 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1601 {
f7b7ed97 1602 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1603 break;
1604
1605 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1606 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
f7b7ed97 1607 stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1608 }
0963b4bd
MS
1609 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1610 [sp!] */
2af46ca0 1611 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1612 {
1613 int n_saved_fp_regs;
1614 unsigned int fp_start_reg, fp_bound_reg;
1615
f7b7ed97 1616 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
4be43953
DJ
1617 break;
1618
94c30b78 1619 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1620 {
d4473757
KB
1621 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1622 n_saved_fp_regs = 3;
1623 else
1624 n_saved_fp_regs = 1;
96baa820 1625 }
d4473757 1626 else
96baa820 1627 {
d4473757
KB
1628 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1629 n_saved_fp_regs = 2;
1630 else
1631 n_saved_fp_regs = 4;
96baa820 1632 }
d4473757 1633
34e8f22d 1634 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1635 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1636 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1637 {
4be43953 1638 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
f7b7ed97
TT
1639 stack.store (regs[ARM_SP_REGNUM], 12,
1640 regs[fp_start_reg++]);
96baa820 1641 }
c906108c 1642 }
0d39a070
DJ
1643 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1644 {
1645 /* Allow some special function calls when skipping the
1646 prologue; GCC generates these before storing arguments to
1647 the stack. */
1648 CORE_ADDR dest = BranchDest (current_pc, insn);
1649
e0634ccf 1650 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1651 continue;
1652 else
1653 break;
1654 }
d4473757 1655 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1656 break; /* Condition not true, exit early. */
0d39a070
DJ
1657 else if (arm_instruction_changes_pc (insn))
1658 /* Don't scan past anything that might change control flow. */
1659 break;
f303bc3e
YQ
1660 else if (arm_instruction_restores_sp (insn))
1661 {
1662 /* Don't scan past the epilogue. */
1663 break;
1664 }
d19f7eee
UW
1665 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1666 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1667 /* Ignore block loads from the stack, potentially copying
1668 parameters from memory. */
1669 continue;
1670 else if ((insn & 0xfc500000) == 0xe4100000
1671 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1672 /* Similarly ignore single loads from the stack. */
1673 continue;
0d39a070
DJ
1674 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1675 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1676 register instead of the stack. */
d4473757 1677 continue;
0d39a070
DJ
1678 else
1679 {
21daaaaf
YQ
1680 /* The optimizer might shove anything into the prologue, if
1681 we build up cache (cache != NULL) from scanning prologue,
1682 we just skip what we don't recognize and scan further to
1683 make cache as complete as possible. However, if we skip
1684 prologue, we'll stop immediately on unrecognized
1685 instruction. */
0d39a070 1686 unrecognized_pc = current_pc;
21daaaaf
YQ
1687 if (cache != NULL)
1688 continue;
1689 else
1690 break;
0d39a070 1691 }
c906108c
SS
1692 }
1693
0d39a070
DJ
1694 if (unrecognized_pc == 0)
1695 unrecognized_pc = current_pc;
1696
0d39a070
DJ
1697 if (cache)
1698 {
4072f920
YQ
1699 int framereg, framesize;
1700
1701 /* The frame size is just the distance from the frame register
1702 to the original stack pointer. */
1703 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1704 {
1705 /* Frame pointer is fp. */
1706 framereg = ARM_FP_REGNUM;
1707 framesize = -regs[ARM_FP_REGNUM].k;
1708 }
1709 else
1710 {
1711 /* Try the stack pointer... this is a bit desperate. */
1712 framereg = ARM_SP_REGNUM;
1713 framesize = -regs[ARM_SP_REGNUM].k;
1714 }
1715
0d39a070
DJ
1716 cache->framereg = framereg;
1717 cache->framesize = framesize;
1718
1719 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
f7b7ed97 1720 if (stack.find_reg (gdbarch, regno, &offset))
0d39a070
DJ
1721 cache->saved_regs[regno].addr = offset;
1722 }
1723
1724 if (arm_debug)
1725 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1726 paddress (gdbarch, unrecognized_pc));
4be43953 1727
0d39a070
DJ
1728 return unrecognized_pc;
1729}
1730
1731static void
1732arm_scan_prologue (struct frame_info *this_frame,
1733 struct arm_prologue_cache *cache)
1734{
1735 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1736 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
bec2ab5a 1737 CORE_ADDR prologue_start, prologue_end;
0d39a070
DJ
1738 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1739 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
0d39a070
DJ
1740
1741 /* Assume there is no frame until proven otherwise. */
1742 cache->framereg = ARM_SP_REGNUM;
1743 cache->framesize = 0;
1744
1745 /* Check for Thumb prologue. */
1746 if (arm_frame_is_thumb (this_frame))
1747 {
1748 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1749 return;
1750 }
1751
1752 /* Find the function prologue. If we can't find the function in
1753 the symbol table, peek in the stack frame to find the PC. */
1754 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1755 &prologue_end))
1756 {
1757 /* One way to find the end of the prologue (which works well
1758 for unoptimized code) is to do the following:
1759
1760 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1761
1762 if (sal.line == 0)
1763 prologue_end = prev_pc;
1764 else if (sal.end < prologue_end)
1765 prologue_end = sal.end;
1766
1767 This mechanism is very accurate so long as the optimizer
1768 doesn't move any instructions from the function body into the
1769 prologue. If this happens, sal.end will be the last
1770 instruction in the first hunk of prologue code just before
1771 the first instruction that the scheduler has moved from
1772 the body to the prologue.
1773
1774 In order to make sure that we scan all of the prologue
1775 instructions, we use a slightly less accurate mechanism which
1776 may scan more than necessary. To help compensate for this
1777 lack of accuracy, the prologue scanning loop below contains
1778 several clauses which'll cause the loop to terminate early if
1779 an implausible prologue instruction is encountered.
1780
1781 The expression
1782
1783 prologue_start + 64
1784
1785 is a suitable endpoint since it accounts for the largest
1786 possible prologue plus up to five instructions inserted by
1787 the scheduler. */
1788
1789 if (prologue_end > prologue_start + 64)
1790 {
1791 prologue_end = prologue_start + 64; /* See above. */
1792 }
1793 }
1794 else
1795 {
1796 /* We have no symbol information. Our only option is to assume this
1797 function has a standard stack frame and the normal frame register.
1798 Then, we can find the value of our frame pointer on entrance to
1799 the callee (or at the present moment if this is the innermost frame).
1800 The value stored there should be the address of the stmfd + 8. */
1801 CORE_ADDR frame_loc;
7913a64c 1802 ULONGEST return_value;
0d39a070 1803
9e237747
MM
1804 /* AAPCS does not use a frame register, so we can abort here. */
1805 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_AAPCS)
1806 return;
1807
0d39a070 1808 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
7913a64c
YQ
1809 if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
1810 &return_value))
0d39a070
DJ
1811 return;
1812 else
1813 {
1814 prologue_start = gdbarch_addr_bits_remove
1815 (gdbarch, return_value) - 8;
1816 prologue_end = prologue_start + 64; /* See above. */
1817 }
1818 }
1819
1820 if (prev_pc < prologue_end)
1821 prologue_end = prev_pc;
1822
1823 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1824}
1825
eb5492fa 1826static struct arm_prologue_cache *
a262aec2 1827arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1828{
eb5492fa
DJ
1829 int reg;
1830 struct arm_prologue_cache *cache;
1831 CORE_ADDR unwound_fp;
c5aa993b 1832
35d5d4ee 1833 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1834 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1835
a262aec2 1836 arm_scan_prologue (this_frame, cache);
848cfffb 1837
a262aec2 1838 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
1839 if (unwound_fp == 0)
1840 return cache;
c906108c 1841
4be43953 1842 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 1843
eb5492fa
DJ
1844 /* Calculate actual addresses of saved registers using offsets
1845 determined by arm_scan_prologue. */
a262aec2 1846 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 1847 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
1848 cache->saved_regs[reg].addr += cache->prev_sp;
1849
1850 return cache;
c906108c
SS
1851}
1852
c1ee9414
LM
1853/* Implementation of the stop_reason hook for arm_prologue frames. */
1854
1855static enum unwind_stop_reason
1856arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1857 void **this_cache)
1858{
1859 struct arm_prologue_cache *cache;
1860 CORE_ADDR pc;
1861
1862 if (*this_cache == NULL)
1863 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1864 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
1865
1866 /* This is meant to halt the backtrace at "_start". */
1867 pc = get_frame_pc (this_frame);
1868 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1869 return UNWIND_OUTERMOST;
1870
1871 /* If we've hit a wall, stop. */
1872 if (cache->prev_sp == 0)
1873 return UNWIND_OUTERMOST;
1874
1875 return UNWIND_NO_REASON;
1876}
1877
eb5492fa
DJ
1878/* Our frame ID for a normal frame is the current function's starting PC
1879 and the caller's SP when we were called. */
c906108c 1880
148754e5 1881static void
a262aec2 1882arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
1883 void **this_cache,
1884 struct frame_id *this_id)
c906108c 1885{
eb5492fa
DJ
1886 struct arm_prologue_cache *cache;
1887 struct frame_id id;
2c404490 1888 CORE_ADDR pc, func;
f079148d 1889
eb5492fa 1890 if (*this_cache == NULL)
a262aec2 1891 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1892 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 1893
0e9e9abd
UW
1894 /* Use function start address as part of the frame ID. If we cannot
1895 identify the start address (due to missing symbol information),
1896 fall back to just using the current PC. */
c1ee9414 1897 pc = get_frame_pc (this_frame);
2c404490 1898 func = get_frame_func (this_frame);
0e9e9abd
UW
1899 if (!func)
1900 func = pc;
1901
eb5492fa 1902 id = frame_id_build (cache->prev_sp, func);
eb5492fa 1903 *this_id = id;
c906108c
SS
1904}
1905
a262aec2
DJ
1906static struct value *
1907arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 1908 void **this_cache,
a262aec2 1909 int prev_regnum)
24de872b 1910{
24568a2c 1911 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
1912 struct arm_prologue_cache *cache;
1913
eb5492fa 1914 if (*this_cache == NULL)
a262aec2 1915 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1916 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 1917
eb5492fa 1918 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
1919 instead. The prologue may save PC, but it will point into this
1920 frame's prologue, not the next frame's resume location. Also
1921 strip the saved T bit. A valid LR may have the low bit set, but
1922 a valid PC never does. */
eb5492fa 1923 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
1924 {
1925 CORE_ADDR lr;
1926
1927 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1928 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 1929 arm_addr_bits_remove (gdbarch, lr));
b39cc962 1930 }
24de872b 1931
eb5492fa 1932 /* SP is generally not saved to the stack, but this frame is
a262aec2 1933 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
1934 The value was already reconstructed into PREV_SP. */
1935 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 1936 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 1937
b39cc962
DJ
1938 /* The CPSR may have been changed by the call instruction and by the
1939 called function. The only bit we can reconstruct is the T bit,
1940 by checking the low bit of LR as of the call. This is a reliable
1941 indicator of Thumb-ness except for some ARM v4T pre-interworking
1942 Thumb code, which could get away with a clear low bit as long as
1943 the called function did not use bx. Guess that all other
1944 bits are unchanged; the condition flags are presumably lost,
1945 but the processor status is likely valid. */
1946 if (prev_regnum == ARM_PS_REGNUM)
1947 {
1948 CORE_ADDR lr, cpsr;
9779414d 1949 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
1950
1951 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1952 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1953 if (IS_THUMB_ADDR (lr))
9779414d 1954 cpsr |= t_bit;
b39cc962 1955 else
9779414d 1956 cpsr &= ~t_bit;
b39cc962
DJ
1957 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1958 }
1959
a262aec2
DJ
1960 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1961 prev_regnum);
eb5492fa
DJ
1962}
1963
1964struct frame_unwind arm_prologue_unwind = {
1965 NORMAL_FRAME,
c1ee9414 1966 arm_prologue_unwind_stop_reason,
eb5492fa 1967 arm_prologue_this_id,
a262aec2
DJ
1968 arm_prologue_prev_register,
1969 NULL,
1970 default_frame_sniffer
eb5492fa
DJ
1971};
1972
0e9e9abd
UW
1973/* Maintain a list of ARM exception table entries per objfile, similar to the
1974 list of mapping symbols. We only cache entries for standard ARM-defined
1975 personality routines; the cache will contain only the frame unwinding
1976 instructions associated with the entry (not the descriptors). */
1977
1978static const struct objfile_data *arm_exidx_data_key;
1979
1980struct arm_exidx_entry
1981{
1982 bfd_vma addr;
1983 gdb_byte *entry;
1984};
1985typedef struct arm_exidx_entry arm_exidx_entry_s;
1986DEF_VEC_O(arm_exidx_entry_s);
1987
1988struct arm_exidx_data
1989{
1990 VEC(arm_exidx_entry_s) **section_maps;
1991};
1992
1993static void
1994arm_exidx_data_free (struct objfile *objfile, void *arg)
1995{
9a3c8263 1996 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
0e9e9abd
UW
1997 unsigned int i;
1998
1999 for (i = 0; i < objfile->obfd->section_count; i++)
2000 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
2001}
2002
2003static inline int
2004arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
2005 const struct arm_exidx_entry *rhs)
2006{
2007 return lhs->addr < rhs->addr;
2008}
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. */
2053 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
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. */
2084 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2085 set_objfile_data (objfile, arm_exidx_data_key, data);
2086 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2087 objfile->obfd->section_count,
2088 VEC(arm_exidx_entry_s) *);
2089
2090 /* Fill in exception table. */
984c7238 2091 for (i = 0; i < exidx_data.size () / 8; i++)
0e9e9abd
UW
2092 {
2093 struct arm_exidx_entry new_exidx_entry;
984c7238
TT
2094 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data.data () + i * 8);
2095 bfd_vma val = bfd_h_get_32 (objfile->obfd,
2096 exidx_data.data () + i * 8 + 4);
0e9e9abd
UW
2097 bfd_vma addr = 0, word = 0;
2098 int n_bytes = 0, n_words = 0;
2099 struct obj_section *sec;
2100 gdb_byte *entry = NULL;
2101
2102 /* Extract address of start of function. */
2103 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2104 idx += exidx_vma + i * 8;
2105
2106 /* Find section containing function and compute section offset. */
2107 sec = arm_obj_section_from_vma (objfile, idx);
2108 if (sec == NULL)
2109 continue;
2110 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2111
2112 /* Determine address of exception table entry. */
2113 if (val == 1)
2114 {
2115 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2116 }
2117 else if ((val & 0xff000000) == 0x80000000)
2118 {
2119 /* Exception table entry embedded in .ARM.exidx
2120 -- must be short form. */
2121 word = val;
2122 n_bytes = 3;
2123 }
2124 else if (!(val & 0x80000000))
2125 {
2126 /* Exception table entry in .ARM.extab. */
2127 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2128 addr += exidx_vma + i * 8 + 4;
2129
984c7238 2130 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_data.size ())
0e9e9abd
UW
2131 {
2132 word = bfd_h_get_32 (objfile->obfd,
984c7238 2133 extab_data.data () + addr - extab_vma);
0e9e9abd
UW
2134 addr += 4;
2135
2136 if ((word & 0xff000000) == 0x80000000)
2137 {
2138 /* Short form. */
2139 n_bytes = 3;
2140 }
2141 else if ((word & 0xff000000) == 0x81000000
2142 || (word & 0xff000000) == 0x82000000)
2143 {
2144 /* Long form. */
2145 n_bytes = 2;
2146 n_words = ((word >> 16) & 0xff);
2147 }
2148 else if (!(word & 0x80000000))
2149 {
2150 bfd_vma pers;
2151 struct obj_section *pers_sec;
2152 int gnu_personality = 0;
2153
2154 /* Custom personality routine. */
2155 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2156 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2157
2158 /* Check whether we've got one of the variants of the
2159 GNU personality routines. */
2160 pers_sec = arm_obj_section_from_vma (objfile, pers);
2161 if (pers_sec)
2162 {
2163 static const char *personality[] =
2164 {
2165 "__gcc_personality_v0",
2166 "__gxx_personality_v0",
2167 "__gcj_personality_v0",
2168 "__gnu_objc_personality_v0",
2169 NULL
2170 };
2171
2172 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2173 int k;
2174
2175 for (k = 0; personality[k]; k++)
2176 if (lookup_minimal_symbol_by_pc_name
2177 (pc, personality[k], objfile))
2178 {
2179 gnu_personality = 1;
2180 break;
2181 }
2182 }
2183
2184 /* If so, the next word contains a word count in the high
2185 byte, followed by the same unwind instructions as the
2186 pre-defined forms. */
2187 if (gnu_personality
984c7238 2188 && addr + 4 <= extab_vma + extab_data.size ())
0e9e9abd
UW
2189 {
2190 word = bfd_h_get_32 (objfile->obfd,
984c7238
TT
2191 (extab_data.data ()
2192 + addr - extab_vma));
0e9e9abd
UW
2193 addr += 4;
2194 n_bytes = 3;
2195 n_words = ((word >> 24) & 0xff);
2196 }
2197 }
2198 }
2199 }
2200
2201 /* Sanity check address. */
2202 if (n_words)
984c7238
TT
2203 if (addr < extab_vma
2204 || addr + 4 * n_words > extab_vma + extab_data.size ())
0e9e9abd
UW
2205 n_words = n_bytes = 0;
2206
2207 /* The unwind instructions reside in WORD (only the N_BYTES least
2208 significant bytes are valid), followed by N_WORDS words in the
2209 extab section starting at ADDR. */
2210 if (n_bytes || n_words)
2211 {
224c3ddb
SM
2212 gdb_byte *p = entry
2213 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2214 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2215
2216 while (n_bytes--)
2217 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2218
2219 while (n_words--)
2220 {
2221 word = bfd_h_get_32 (objfile->obfd,
984c7238 2222 extab_data.data () + addr - extab_vma);
0e9e9abd
UW
2223 addr += 4;
2224
2225 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2226 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2227 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2228 *p++ = (gdb_byte) (word & 0xff);
2229 }
2230
2231 /* Implied "Finish" to terminate the list. */
2232 *p++ = 0xb0;
2233 }
2234
2235 /* Push entry onto vector. They are guaranteed to always
2236 appear in order of increasing addresses. */
2237 new_exidx_entry.addr = idx;
2238 new_exidx_entry.entry = entry;
2239 VEC_safe_push (arm_exidx_entry_s,
2240 data->section_maps[sec->the_bfd_section->index],
2241 &new_exidx_entry);
2242 }
0e9e9abd
UW
2243}
2244
2245/* Search for the exception table entry covering MEMADDR. If one is found,
2246 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2247 set *START to the start of the region covered by this entry. */
2248
2249static gdb_byte *
2250arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2251{
2252 struct obj_section *sec;
2253
2254 sec = find_pc_section (memaddr);
2255 if (sec != NULL)
2256 {
2257 struct arm_exidx_data *data;
2258 VEC(arm_exidx_entry_s) *map;
2259 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2260 unsigned int idx;
2261
9a3c8263
SM
2262 data = ((struct arm_exidx_data *)
2263 objfile_data (sec->objfile, arm_exidx_data_key));
0e9e9abd
UW
2264 if (data != NULL)
2265 {
2266 map = data->section_maps[sec->the_bfd_section->index];
2267 if (!VEC_empty (arm_exidx_entry_s, map))
2268 {
2269 struct arm_exidx_entry *map_sym;
2270
2271 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2272 arm_compare_exidx_entries);
2273
2274 /* VEC_lower_bound finds the earliest ordered insertion
2275 point. If the following symbol starts at this exact
2276 address, we use that; otherwise, the preceding
2277 exception table entry covers this address. */
2278 if (idx < VEC_length (arm_exidx_entry_s, map))
2279 {
2280 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2281 if (map_sym->addr == map_key.addr)
2282 {
2283 if (start)
2284 *start = map_sym->addr + obj_section_addr (sec);
2285 return map_sym->entry;
2286 }
2287 }
2288
2289 if (idx > 0)
2290 {
2291 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2292 if (start)
2293 *start = map_sym->addr + obj_section_addr (sec);
2294 return map_sym->entry;
2295 }
2296 }
2297 }
2298 }
2299
2300 return NULL;
2301}
2302
2303/* Given the current frame THIS_FRAME, and its associated frame unwinding
2304 instruction list from the ARM exception table entry ENTRY, allocate and
2305 return a prologue cache structure describing how to unwind this frame.
2306
2307 Return NULL if the unwinding instruction list contains a "spare",
2308 "reserved" or "refuse to unwind" instruction as defined in section
2309 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2310 for the ARM Architecture" document. */
2311
2312static struct arm_prologue_cache *
2313arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2314{
2315 CORE_ADDR vsp = 0;
2316 int vsp_valid = 0;
2317
2318 struct arm_prologue_cache *cache;
2319 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2320 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2321
2322 for (;;)
2323 {
2324 gdb_byte insn;
2325
2326 /* Whenever we reload SP, we actually have to retrieve its
2327 actual value in the current frame. */
2328 if (!vsp_valid)
2329 {
2330 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2331 {
2332 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2333 vsp = get_frame_register_unsigned (this_frame, reg);
2334 }
2335 else
2336 {
2337 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2338 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2339 }
2340
2341 vsp_valid = 1;
2342 }
2343
2344 /* Decode next unwind instruction. */
2345 insn = *entry++;
2346
2347 if ((insn & 0xc0) == 0)
2348 {
2349 int offset = insn & 0x3f;
2350 vsp += (offset << 2) + 4;
2351 }
2352 else if ((insn & 0xc0) == 0x40)
2353 {
2354 int offset = insn & 0x3f;
2355 vsp -= (offset << 2) + 4;
2356 }
2357 else if ((insn & 0xf0) == 0x80)
2358 {
2359 int mask = ((insn & 0xf) << 8) | *entry++;
2360 int i;
2361
2362 /* The special case of an all-zero mask identifies
2363 "Refuse to unwind". We return NULL to fall back
2364 to the prologue analyzer. */
2365 if (mask == 0)
2366 return NULL;
2367
2368 /* Pop registers r4..r15 under mask. */
2369 for (i = 0; i < 12; i++)
2370 if (mask & (1 << i))
2371 {
2372 cache->saved_regs[4 + i].addr = vsp;
2373 vsp += 4;
2374 }
2375
2376 /* Special-case popping SP -- we need to reload vsp. */
2377 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2378 vsp_valid = 0;
2379 }
2380 else if ((insn & 0xf0) == 0x90)
2381 {
2382 int reg = insn & 0xf;
2383
2384 /* Reserved cases. */
2385 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2386 return NULL;
2387
2388 /* Set SP from another register and mark VSP for reload. */
2389 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2390 vsp_valid = 0;
2391 }
2392 else if ((insn & 0xf0) == 0xa0)
2393 {
2394 int count = insn & 0x7;
2395 int pop_lr = (insn & 0x8) != 0;
2396 int i;
2397
2398 /* Pop r4..r[4+count]. */
2399 for (i = 0; i <= count; i++)
2400 {
2401 cache->saved_regs[4 + i].addr = vsp;
2402 vsp += 4;
2403 }
2404
2405 /* If indicated by flag, pop LR as well. */
2406 if (pop_lr)
2407 {
2408 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2409 vsp += 4;
2410 }
2411 }
2412 else if (insn == 0xb0)
2413 {
2414 /* We could only have updated PC by popping into it; if so, it
2415 will show up as address. Otherwise, copy LR into PC. */
2416 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2417 cache->saved_regs[ARM_PC_REGNUM]
2418 = cache->saved_regs[ARM_LR_REGNUM];
2419
2420 /* We're done. */
2421 break;
2422 }
2423 else if (insn == 0xb1)
2424 {
2425 int mask = *entry++;
2426 int i;
2427
2428 /* All-zero mask and mask >= 16 is "spare". */
2429 if (mask == 0 || mask >= 16)
2430 return NULL;
2431
2432 /* Pop r0..r3 under mask. */
2433 for (i = 0; i < 4; i++)
2434 if (mask & (1 << i))
2435 {
2436 cache->saved_regs[i].addr = vsp;
2437 vsp += 4;
2438 }
2439 }
2440 else if (insn == 0xb2)
2441 {
2442 ULONGEST offset = 0;
2443 unsigned shift = 0;
2444
2445 do
2446 {
2447 offset |= (*entry & 0x7f) << shift;
2448 shift += 7;
2449 }
2450 while (*entry++ & 0x80);
2451
2452 vsp += 0x204 + (offset << 2);
2453 }
2454 else if (insn == 0xb3)
2455 {
2456 int start = *entry >> 4;
2457 int count = (*entry++) & 0xf;
2458 int i;
2459
2460 /* Only registers D0..D15 are valid here. */
2461 if (start + count >= 16)
2462 return NULL;
2463
2464 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2465 for (i = 0; i <= count; i++)
2466 {
2467 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2468 vsp += 8;
2469 }
2470
2471 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2472 vsp += 4;
2473 }
2474 else if ((insn & 0xf8) == 0xb8)
2475 {
2476 int count = insn & 0x7;
2477 int i;
2478
2479 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2480 for (i = 0; i <= count; i++)
2481 {
2482 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2483 vsp += 8;
2484 }
2485
2486 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2487 vsp += 4;
2488 }
2489 else if (insn == 0xc6)
2490 {
2491 int start = *entry >> 4;
2492 int count = (*entry++) & 0xf;
2493 int i;
2494
2495 /* Only registers WR0..WR15 are valid. */
2496 if (start + count >= 16)
2497 return NULL;
2498
2499 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2500 for (i = 0; i <= count; i++)
2501 {
2502 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2503 vsp += 8;
2504 }
2505 }
2506 else if (insn == 0xc7)
2507 {
2508 int mask = *entry++;
2509 int i;
2510
2511 /* All-zero mask and mask >= 16 is "spare". */
2512 if (mask == 0 || mask >= 16)
2513 return NULL;
2514
2515 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2516 for (i = 0; i < 4; i++)
2517 if (mask & (1 << i))
2518 {
2519 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2520 vsp += 4;
2521 }
2522 }
2523 else if ((insn & 0xf8) == 0xc0)
2524 {
2525 int count = insn & 0x7;
2526 int i;
2527
2528 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2529 for (i = 0; i <= count; i++)
2530 {
2531 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2532 vsp += 8;
2533 }
2534 }
2535 else if (insn == 0xc8)
2536 {
2537 int start = *entry >> 4;
2538 int count = (*entry++) & 0xf;
2539 int i;
2540
2541 /* Only registers D0..D31 are valid. */
2542 if (start + count >= 16)
2543 return NULL;
2544
2545 /* Pop VFP double-precision registers
2546 D[16+start]..D[16+start+count]. */
2547 for (i = 0; i <= count; i++)
2548 {
2549 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2550 vsp += 8;
2551 }
2552 }
2553 else if (insn == 0xc9)
2554 {
2555 int start = *entry >> 4;
2556 int count = (*entry++) & 0xf;
2557 int i;
2558
2559 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2560 for (i = 0; i <= count; i++)
2561 {
2562 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2563 vsp += 8;
2564 }
2565 }
2566 else if ((insn & 0xf8) == 0xd0)
2567 {
2568 int count = insn & 0x7;
2569 int i;
2570
2571 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2572 for (i = 0; i <= count; i++)
2573 {
2574 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2575 vsp += 8;
2576 }
2577 }
2578 else
2579 {
2580 /* Everything else is "spare". */
2581 return NULL;
2582 }
2583 }
2584
2585 /* If we restore SP from a register, assume this was the frame register.
2586 Otherwise just fall back to SP as frame register. */
2587 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2588 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2589 else
2590 cache->framereg = ARM_SP_REGNUM;
2591
2592 /* Determine offset to previous frame. */
2593 cache->framesize
2594 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2595
2596 /* We already got the previous SP. */
2597 cache->prev_sp = vsp;
2598
2599 return cache;
2600}
2601
2602/* Unwinding via ARM exception table entries. Note that the sniffer
2603 already computes a filled-in prologue cache, which is then used
2604 with the same arm_prologue_this_id and arm_prologue_prev_register
2605 routines also used for prologue-parsing based unwinding. */
2606
2607static int
2608arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2609 struct frame_info *this_frame,
2610 void **this_prologue_cache)
2611{
2612 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2613 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2614 CORE_ADDR addr_in_block, exidx_region, func_start;
2615 struct arm_prologue_cache *cache;
2616 gdb_byte *entry;
2617
2618 /* See if we have an ARM exception table entry covering this address. */
2619 addr_in_block = get_frame_address_in_block (this_frame);
2620 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2621 if (!entry)
2622 return 0;
2623
2624 /* The ARM exception table does not describe unwind information
2625 for arbitrary PC values, but is guaranteed to be correct only
2626 at call sites. We have to decide here whether we want to use
2627 ARM exception table information for this frame, or fall back
2628 to using prologue parsing. (Note that if we have DWARF CFI,
2629 this sniffer isn't even called -- CFI is always preferred.)
2630
2631 Before we make this decision, however, we check whether we
2632 actually have *symbol* information for the current frame.
2633 If not, prologue parsing would not work anyway, so we might
2634 as well use the exception table and hope for the best. */
2635 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2636 {
2637 int exc_valid = 0;
2638
2639 /* If the next frame is "normal", we are at a call site in this
2640 frame, so exception information is guaranteed to be valid. */
2641 if (get_next_frame (this_frame)
2642 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2643 exc_valid = 1;
2644
2645 /* We also assume exception information is valid if we're currently
2646 blocked in a system call. The system library is supposed to
d9311bfa
AT
2647 ensure this, so that e.g. pthread cancellation works. */
2648 if (arm_frame_is_thumb (this_frame))
0e9e9abd 2649 {
7913a64c 2650 ULONGEST insn;
416dc9c6 2651
7913a64c
YQ
2652 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 2,
2653 2, byte_order_for_code, &insn)
d9311bfa
AT
2654 && (insn & 0xff00) == 0xdf00 /* svc */)
2655 exc_valid = 1;
0e9e9abd 2656 }
d9311bfa
AT
2657 else
2658 {
7913a64c 2659 ULONGEST insn;
416dc9c6 2660
7913a64c
YQ
2661 if (safe_read_memory_unsigned_integer (get_frame_pc (this_frame) - 4,
2662 4, byte_order_for_code, &insn)
d9311bfa
AT
2663 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2664 exc_valid = 1;
2665 }
2666
0e9e9abd
UW
2667 /* Bail out if we don't know that exception information is valid. */
2668 if (!exc_valid)
2669 return 0;
2670
2671 /* The ARM exception index does not mark the *end* of the region
2672 covered by the entry, and some functions will not have any entry.
2673 To correctly recognize the end of the covered region, the linker
2674 should have inserted dummy records with a CANTUNWIND marker.
2675
2676 Unfortunately, current versions of GNU ld do not reliably do
2677 this, and thus we may have found an incorrect entry above.
2678 As a (temporary) sanity check, we only use the entry if it
2679 lies *within* the bounds of the function. Note that this check
2680 might reject perfectly valid entries that just happen to cover
2681 multiple functions; therefore this check ought to be removed
2682 once the linker is fixed. */
2683 if (func_start > exidx_region)
2684 return 0;
2685 }
2686
2687 /* Decode the list of unwinding instructions into a prologue cache.
2688 Note that this may fail due to e.g. a "refuse to unwind" code. */
2689 cache = arm_exidx_fill_cache (this_frame, entry);
2690 if (!cache)
2691 return 0;
2692
2693 *this_prologue_cache = cache;
2694 return 1;
2695}
2696
2697struct frame_unwind arm_exidx_unwind = {
2698 NORMAL_FRAME,
8fbca658 2699 default_frame_unwind_stop_reason,
0e9e9abd
UW
2700 arm_prologue_this_id,
2701 arm_prologue_prev_register,
2702 NULL,
2703 arm_exidx_unwind_sniffer
2704};
2705
779aa56f
YQ
2706static struct arm_prologue_cache *
2707arm_make_epilogue_frame_cache (struct frame_info *this_frame)
2708{
2709 struct arm_prologue_cache *cache;
779aa56f
YQ
2710 int reg;
2711
2712 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2713 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2714
2715 /* Still rely on the offset calculated from prologue. */
2716 arm_scan_prologue (this_frame, cache);
2717
2718 /* Since we are in epilogue, the SP has been restored. */
2719 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
2720
2721 /* Calculate actual addresses of saved registers using offsets
2722 determined by arm_scan_prologue. */
2723 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2724 if (trad_frame_addr_p (cache->saved_regs, reg))
2725 cache->saved_regs[reg].addr += cache->prev_sp;
2726
2727 return cache;
2728}
2729
2730/* Implementation of function hook 'this_id' in
2731 'struct frame_uwnind' for epilogue unwinder. */
2732
2733static void
2734arm_epilogue_frame_this_id (struct frame_info *this_frame,
2735 void **this_cache,
2736 struct frame_id *this_id)
2737{
2738 struct arm_prologue_cache *cache;
2739 CORE_ADDR pc, func;
2740
2741 if (*this_cache == NULL)
2742 *this_cache = arm_make_epilogue_frame_cache (this_frame);
2743 cache = (struct arm_prologue_cache *) *this_cache;
2744
2745 /* Use function start address as part of the frame ID. If we cannot
2746 identify the start address (due to missing symbol information),
2747 fall back to just using the current PC. */
2748 pc = get_frame_pc (this_frame);
2749 func = get_frame_func (this_frame);
fb3f3d25 2750 if (func == 0)
779aa56f
YQ
2751 func = pc;
2752
2753 (*this_id) = frame_id_build (cache->prev_sp, pc);
2754}
2755
2756/* Implementation of function hook 'prev_register' in
2757 'struct frame_uwnind' for epilogue unwinder. */
2758
2759static struct value *
2760arm_epilogue_frame_prev_register (struct frame_info *this_frame,
2761 void **this_cache, int regnum)
2762{
779aa56f
YQ
2763 if (*this_cache == NULL)
2764 *this_cache = arm_make_epilogue_frame_cache (this_frame);
779aa56f
YQ
2765
2766 return arm_prologue_prev_register (this_frame, this_cache, regnum);
2767}
2768
2769static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
2770 CORE_ADDR pc);
2771static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
2772 CORE_ADDR pc);
2773
2774/* Implementation of function hook 'sniffer' in
2775 'struct frame_uwnind' for epilogue unwinder. */
2776
2777static int
2778arm_epilogue_frame_sniffer (const struct frame_unwind *self,
2779 struct frame_info *this_frame,
2780 void **this_prologue_cache)
2781{
2782 if (frame_relative_level (this_frame) == 0)
2783 {
2784 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2785 CORE_ADDR pc = get_frame_pc (this_frame);
2786
2787 if (arm_frame_is_thumb (this_frame))
2788 return thumb_stack_frame_destroyed_p (gdbarch, pc);
2789 else
2790 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
2791 }
2792 else
2793 return 0;
2794}
2795
2796/* Frame unwinder from epilogue. */
2797
2798static const struct frame_unwind arm_epilogue_frame_unwind =
2799{
2800 NORMAL_FRAME,
2801 default_frame_unwind_stop_reason,
2802 arm_epilogue_frame_this_id,
2803 arm_epilogue_frame_prev_register,
2804 NULL,
2805 arm_epilogue_frame_sniffer,
2806};
2807
80d8d390
YQ
2808/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2809 trampoline, return the target PC. Otherwise return 0.
2810
2811 void call0a (char c, short s, int i, long l) {}
2812
2813 int main (void)
2814 {
2815 (*pointer_to_call0a) (c, s, i, l);
2816 }
2817
2818 Instead of calling a stub library function _call_via_xx (xx is
2819 the register name), GCC may inline the trampoline in the object
2820 file as below (register r2 has the address of call0a).
2821
2822 .global main
2823 .type main, %function
2824 ...
2825 bl .L1
2826 ...
2827 .size main, .-main
2828
2829 .L1:
2830 bx r2
2831
2832 The trampoline 'bx r2' doesn't belong to main. */
2833
2834static CORE_ADDR
2835arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2836{
2837 /* The heuristics of recognizing such trampoline is that FRAME is
2838 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2839 if (arm_frame_is_thumb (frame))
2840 {
2841 gdb_byte buf[2];
2842
2843 if (target_read_memory (pc, buf, 2) == 0)
2844 {
2845 struct gdbarch *gdbarch = get_frame_arch (frame);
2846 enum bfd_endian byte_order_for_code
2847 = gdbarch_byte_order_for_code (gdbarch);
2848 uint16_t insn
2849 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2850
2851 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2852 {
2853 CORE_ADDR dest
2854 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2855
2856 /* Clear the LSB so that gdb core sets step-resume
2857 breakpoint at the right address. */
2858 return UNMAKE_THUMB_ADDR (dest);
2859 }
2860 }
2861 }
2862
2863 return 0;
2864}
2865
909cf6ea 2866static struct arm_prologue_cache *
a262aec2 2867arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2868{
909cf6ea 2869 struct arm_prologue_cache *cache;
909cf6ea 2870
35d5d4ee 2871 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2872 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2873
a262aec2 2874 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2875
2876 return cache;
2877}
2878
2879/* Our frame ID for a stub frame is the current SP and LR. */
2880
2881static void
a262aec2 2882arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2883 void **this_cache,
2884 struct frame_id *this_id)
2885{
2886 struct arm_prologue_cache *cache;
2887
2888 if (*this_cache == NULL)
a262aec2 2889 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2890 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2891
a262aec2 2892 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2893}
2894
a262aec2
DJ
2895static int
2896arm_stub_unwind_sniffer (const struct frame_unwind *self,
2897 struct frame_info *this_frame,
2898 void **this_prologue_cache)
909cf6ea 2899{
93d42b30 2900 CORE_ADDR addr_in_block;
948f8e3d 2901 gdb_byte dummy[4];
18d18ac8
YQ
2902 CORE_ADDR pc, start_addr;
2903 const char *name;
909cf6ea 2904
a262aec2 2905 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2906 pc = get_frame_pc (this_frame);
3e5d3a5a 2907 if (in_plt_section (addr_in_block)
fc36e839
DE
2908 /* We also use the stub winder if the target memory is unreadable
2909 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2910 || target_read_memory (pc, dummy, 4) != 0)
2911 return 1;
2912
2913 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2914 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2915 return 1;
909cf6ea 2916
a262aec2 2917 return 0;
909cf6ea
DJ
2918}
2919
a262aec2
DJ
2920struct frame_unwind arm_stub_unwind = {
2921 NORMAL_FRAME,
8fbca658 2922 default_frame_unwind_stop_reason,
a262aec2
DJ
2923 arm_stub_this_id,
2924 arm_prologue_prev_register,
2925 NULL,
2926 arm_stub_unwind_sniffer
2927};
2928
2ae28aa9
YQ
2929/* Put here the code to store, into CACHE->saved_regs, the addresses
2930 of the saved registers of frame described by THIS_FRAME. CACHE is
2931 returned. */
2932
2933static struct arm_prologue_cache *
2934arm_m_exception_cache (struct frame_info *this_frame)
2935{
2936 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2937 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2938 struct arm_prologue_cache *cache;
2939 CORE_ADDR unwound_sp;
2940 LONGEST xpsr;
2941
2942 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2943 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2944
2945 unwound_sp = get_frame_register_unsigned (this_frame,
2946 ARM_SP_REGNUM);
2947
2948 /* The hardware saves eight 32-bit words, comprising xPSR,
2949 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2950 "B1.5.6 Exception entry behavior" in
2951 "ARMv7-M Architecture Reference Manual". */
2952 cache->saved_regs[0].addr = unwound_sp;
2953 cache->saved_regs[1].addr = unwound_sp + 4;
2954 cache->saved_regs[2].addr = unwound_sp + 8;
2955 cache->saved_regs[3].addr = unwound_sp + 12;
2956 cache->saved_regs[12].addr = unwound_sp + 16;
2957 cache->saved_regs[14].addr = unwound_sp + 20;
2958 cache->saved_regs[15].addr = unwound_sp + 24;
2959 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2960
2961 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2962 aligner between the top of the 32-byte stack frame and the
2963 previous context's stack pointer. */
2964 cache->prev_sp = unwound_sp + 32;
2965 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2966 && (xpsr & (1 << 9)) != 0)
2967 cache->prev_sp += 4;
2968
2969 return cache;
2970}
2971
2972/* Implementation of function hook 'this_id' in
2973 'struct frame_uwnind'. */
2974
2975static void
2976arm_m_exception_this_id (struct frame_info *this_frame,
2977 void **this_cache,
2978 struct frame_id *this_id)
2979{
2980 struct arm_prologue_cache *cache;
2981
2982 if (*this_cache == NULL)
2983 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2984 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2985
2986 /* Our frame ID for a stub frame is the current SP and LR. */
2987 *this_id = frame_id_build (cache->prev_sp,
2988 get_frame_pc (this_frame));
2989}
2990
2991/* Implementation of function hook 'prev_register' in
2992 'struct frame_uwnind'. */
2993
2994static struct value *
2995arm_m_exception_prev_register (struct frame_info *this_frame,
2996 void **this_cache,
2997 int prev_regnum)
2998{
2ae28aa9
YQ
2999 struct arm_prologue_cache *cache;
3000
3001 if (*this_cache == NULL)
3002 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 3003 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
3004
3005 /* The value was already reconstructed into PREV_SP. */
3006 if (prev_regnum == ARM_SP_REGNUM)
3007 return frame_unwind_got_constant (this_frame, prev_regnum,
3008 cache->prev_sp);
3009
3010 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3011 prev_regnum);
3012}
3013
3014/* Implementation of function hook 'sniffer' in
3015 'struct frame_uwnind'. */
3016
3017static int
3018arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3019 struct frame_info *this_frame,
3020 void **this_prologue_cache)
3021{
3022 CORE_ADDR this_pc = get_frame_pc (this_frame);
3023
3024 /* No need to check is_m; this sniffer is only registered for
3025 M-profile architectures. */
3026
ca90e760
FH
3027 /* Check if exception frame returns to a magic PC value. */
3028 return arm_m_addr_is_magic (this_pc);
2ae28aa9
YQ
3029}
3030
3031/* Frame unwinder for M-profile exceptions. */
3032
3033struct frame_unwind arm_m_exception_unwind =
3034{
3035 SIGTRAMP_FRAME,
3036 default_frame_unwind_stop_reason,
3037 arm_m_exception_this_id,
3038 arm_m_exception_prev_register,
3039 NULL,
3040 arm_m_exception_unwind_sniffer
3041};
3042
24de872b 3043static CORE_ADDR
a262aec2 3044arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
3045{
3046 struct arm_prologue_cache *cache;
3047
eb5492fa 3048 if (*this_cache == NULL)
a262aec2 3049 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 3050 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 3051
4be43953 3052 return cache->prev_sp - cache->framesize;
24de872b
DJ
3053}
3054
eb5492fa
DJ
3055struct frame_base arm_normal_base = {
3056 &arm_prologue_unwind,
3057 arm_normal_frame_base,
3058 arm_normal_frame_base,
3059 arm_normal_frame_base
3060};
3061
b39cc962
DJ
3062static struct value *
3063arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
3064 int regnum)
3065{
24568a2c 3066 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 3067 CORE_ADDR lr, cpsr;
9779414d 3068 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
3069
3070 switch (regnum)
3071 {
3072 case ARM_PC_REGNUM:
3073 /* The PC is normally copied from the return column, which
3074 describes saves of LR. However, that version may have an
3075 extra bit set to indicate Thumb state. The bit is not
3076 part of the PC. */
3077 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3078 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 3079 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
3080
3081 case ARM_PS_REGNUM:
3082 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 3083 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
3084 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3085 if (IS_THUMB_ADDR (lr))
9779414d 3086 cpsr |= t_bit;
b39cc962 3087 else
9779414d 3088 cpsr &= ~t_bit;
ca38c58e 3089 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
3090
3091 default:
3092 internal_error (__FILE__, __LINE__,
3093 _("Unexpected register %d"), regnum);
3094 }
3095}
3096
3097static void
3098arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3099 struct dwarf2_frame_state_reg *reg,
3100 struct frame_info *this_frame)
3101{
3102 switch (regnum)
3103 {
3104 case ARM_PC_REGNUM:
3105 case ARM_PS_REGNUM:
3106 reg->how = DWARF2_FRAME_REG_FN;
3107 reg->loc.fn = arm_dwarf2_prev_register;
3108 break;
3109 case ARM_SP_REGNUM:
3110 reg->how = DWARF2_FRAME_REG_CFA;
3111 break;
3112 }
3113}
3114
c9cf6e20 3115/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3116
3117static int
c9cf6e20 3118thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3119{
3120 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3121 unsigned int insn, insn2;
3122 int found_return = 0, found_stack_adjust = 0;
3123 CORE_ADDR func_start, func_end;
3124 CORE_ADDR scan_pc;
3125 gdb_byte buf[4];
3126
3127 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3128 return 0;
3129
3130 /* The epilogue is a sequence of instructions along the following lines:
3131
3132 - add stack frame size to SP or FP
3133 - [if frame pointer used] restore SP from FP
3134 - restore registers from SP [may include PC]
3135 - a return-type instruction [if PC wasn't already restored]
3136
3137 In a first pass, we scan forward from the current PC and verify the
3138 instructions we find as compatible with this sequence, ending in a
3139 return instruction.
3140
3141 However, this is not sufficient to distinguish indirect function calls
3142 within a function from indirect tail calls in the epilogue in some cases.
3143 Therefore, if we didn't already find any SP-changing instruction during
3144 forward scan, we add a backward scanning heuristic to ensure we actually
3145 are in the epilogue. */
3146
3147 scan_pc = pc;
3148 while (scan_pc < func_end && !found_return)
3149 {
3150 if (target_read_memory (scan_pc, buf, 2))
3151 break;
3152
3153 scan_pc += 2;
3154 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3155
3156 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3157 found_return = 1;
3158 else if (insn == 0x46f7) /* mov pc, lr */
3159 found_return = 1;
540314bd 3160 else if (thumb_instruction_restores_sp (insn))
4024ca99 3161 {
b7576e5c 3162 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3163 found_return = 1;
3164 }
db24da6d 3165 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3166 {
3167 if (target_read_memory (scan_pc, buf, 2))
3168 break;
3169
3170 scan_pc += 2;
3171 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3172
3173 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3174 {
4024ca99
UW
3175 if (insn2 & 0x8000) /* <registers> include PC. */
3176 found_return = 1;
3177 }
3178 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3179 && (insn2 & 0x0fff) == 0x0b04)
3180 {
4024ca99
UW
3181 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3182 found_return = 1;
3183 }
3184 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3185 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3186 ;
4024ca99
UW
3187 else
3188 break;
3189 }
3190 else
3191 break;
3192 }
3193
3194 if (!found_return)
3195 return 0;
3196
3197 /* Since any instruction in the epilogue sequence, with the possible
3198 exception of return itself, updates the stack pointer, we need to
3199 scan backwards for at most one instruction. Try either a 16-bit or
3200 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3201 too much about false positives. */
4024ca99 3202
6b65d1b6
YQ
3203 if (pc - 4 < func_start)
3204 return 0;
3205 if (target_read_memory (pc - 4, buf, 4))
3206 return 0;
4024ca99 3207
6b65d1b6
YQ
3208 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3209 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3210
3211 if (thumb_instruction_restores_sp (insn2))
3212 found_stack_adjust = 1;
3213 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3214 found_stack_adjust = 1;
3215 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3216 && (insn2 & 0x0fff) == 0x0b04)
3217 found_stack_adjust = 1;
3218 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3219 && (insn2 & 0x0e00) == 0x0a00)
3220 found_stack_adjust = 1;
4024ca99
UW
3221
3222 return found_stack_adjust;
3223}
3224
4024ca99 3225static int
c58b006a 3226arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3227{
3228 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3229 unsigned int insn;
f303bc3e 3230 int found_return;
4024ca99
UW
3231 CORE_ADDR func_start, func_end;
3232
4024ca99
UW
3233 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3234 return 0;
3235
3236 /* We are in the epilogue if the previous instruction was a stack
3237 adjustment and the next instruction is a possible return (bx, mov
3238 pc, or pop). We could have to scan backwards to find the stack
3239 adjustment, or forwards to find the return, but this is a decent
3240 approximation. First scan forwards. */
3241
3242 found_return = 0;
3243 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3244 if (bits (insn, 28, 31) != INST_NV)
3245 {
3246 if ((insn & 0x0ffffff0) == 0x012fff10)
3247 /* BX. */
3248 found_return = 1;
3249 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3250 /* MOV PC. */
3251 found_return = 1;
3252 else if ((insn & 0x0fff0000) == 0x08bd0000
3253 && (insn & 0x0000c000) != 0)
3254 /* POP (LDMIA), including PC or LR. */
3255 found_return = 1;
3256 }
3257
3258 if (!found_return)
3259 return 0;
3260
3261 /* Scan backwards. This is just a heuristic, so do not worry about
3262 false positives from mode changes. */
3263
3264 if (pc < func_start + 4)
3265 return 0;
3266
3267 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3268 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3269 return 1;
3270
3271 return 0;
3272}
3273
c58b006a
YQ
3274/* Implement the stack_frame_destroyed_p gdbarch method. */
3275
3276static int
3277arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3278{
3279 if (arm_pc_is_thumb (gdbarch, pc))
3280 return thumb_stack_frame_destroyed_p (gdbarch, pc);
3281 else
3282 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3283}
4024ca99 3284
2dd604e7
RE
3285/* When arguments must be pushed onto the stack, they go on in reverse
3286 order. The code below implements a FILO (stack) to do this. */
3287
3288struct stack_item
3289{
3290 int len;
3291 struct stack_item *prev;
7c543f7b 3292 gdb_byte *data;
2dd604e7
RE
3293};
3294
3295static struct stack_item *
df3b6708 3296push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3297{
3298 struct stack_item *si;
8d749320 3299 si = XNEW (struct stack_item);
7c543f7b 3300 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3301 si->len = len;
3302 si->prev = prev;
3303 memcpy (si->data, contents, len);
3304 return si;
3305}
3306
3307static struct stack_item *
3308pop_stack_item (struct stack_item *si)
3309{
3310 struct stack_item *dead = si;
3311 si = si->prev;
3312 xfree (dead->data);
3313 xfree (dead);
3314 return si;
3315}
3316
030197b4
AB
3317/* Implement the gdbarch type alignment method, overrides the generic
3318 alignment algorithm for anything that is arm specific. */
2af48f68 3319
030197b4
AB
3320static ULONGEST
3321arm_type_align (gdbarch *gdbarch, struct type *t)
2af48f68 3322{
2af48f68 3323 t = check_typedef (t);
030197b4 3324 if (TYPE_CODE (t) == TYPE_CODE_ARRAY && TYPE_VECTOR (t))
2af48f68 3325 {
030197b4
AB
3326 /* Use the natural alignment for vector types (the same for
3327 scalar type), but the maximum alignment is 64-bit. */
3328 if (TYPE_LENGTH (t) > 8)
3329 return 8;
c4312b19 3330 else
030197b4 3331 return TYPE_LENGTH (t);
2af48f68 3332 }
030197b4
AB
3333
3334 /* Allow the common code to calculate the alignment. */
3335 return 0;
2af48f68
PB
3336}
3337
90445bd3
DJ
3338/* Possible base types for a candidate for passing and returning in
3339 VFP registers. */
3340
3341enum arm_vfp_cprc_base_type
3342{
3343 VFP_CPRC_UNKNOWN,
3344 VFP_CPRC_SINGLE,
3345 VFP_CPRC_DOUBLE,
3346 VFP_CPRC_VEC64,
3347 VFP_CPRC_VEC128
3348};
3349
3350/* The length of one element of base type B. */
3351
3352static unsigned
3353arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3354{
3355 switch (b)
3356 {
3357 case VFP_CPRC_SINGLE:
3358 return 4;
3359 case VFP_CPRC_DOUBLE:
3360 return 8;
3361 case VFP_CPRC_VEC64:
3362 return 8;
3363 case VFP_CPRC_VEC128:
3364 return 16;
3365 default:
3366 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3367 (int) b);
3368 }
3369}
3370
3371/* The character ('s', 'd' or 'q') for the type of VFP register used
3372 for passing base type B. */
3373
3374static int
3375arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3376{
3377 switch (b)
3378 {
3379 case VFP_CPRC_SINGLE:
3380 return 's';
3381 case VFP_CPRC_DOUBLE:
3382 return 'd';
3383 case VFP_CPRC_VEC64:
3384 return 'd';
3385 case VFP_CPRC_VEC128:
3386 return 'q';
3387 default:
3388 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3389 (int) b);
3390 }
3391}
3392
3393/* Determine whether T may be part of a candidate for passing and
3394 returning in VFP registers, ignoring the limit on the total number
3395 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3396 classification of the first valid component found; if it is not
3397 VFP_CPRC_UNKNOWN, all components must have the same classification
3398 as *BASE_TYPE. If it is found that T contains a type not permitted
3399 for passing and returning in VFP registers, a type differently
3400 classified from *BASE_TYPE, or two types differently classified
3401 from each other, return -1, otherwise return the total number of
3402 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3403 array). Vector types are not currently supported, matching the
3404 generic AAPCS support. */
90445bd3
DJ
3405
3406static int
3407arm_vfp_cprc_sub_candidate (struct type *t,
3408 enum arm_vfp_cprc_base_type *base_type)
3409{
3410 t = check_typedef (t);
3411 switch (TYPE_CODE (t))
3412 {
3413 case TYPE_CODE_FLT:
3414 switch (TYPE_LENGTH (t))
3415 {
3416 case 4:
3417 if (*base_type == VFP_CPRC_UNKNOWN)
3418 *base_type = VFP_CPRC_SINGLE;
3419 else if (*base_type != VFP_CPRC_SINGLE)
3420 return -1;
3421 return 1;
3422
3423 case 8:
3424 if (*base_type == VFP_CPRC_UNKNOWN)
3425 *base_type = VFP_CPRC_DOUBLE;
3426 else if (*base_type != VFP_CPRC_DOUBLE)
3427 return -1;
3428 return 1;
3429
3430 default:
3431 return -1;
3432 }
3433 break;
3434
817e0957
YQ
3435 case TYPE_CODE_COMPLEX:
3436 /* Arguments of complex T where T is one of the types float or
3437 double get treated as if they are implemented as:
3438
3439 struct complexT
3440 {
3441 T real;
3442 T imag;
5f52445b
YQ
3443 };
3444
3445 */
817e0957
YQ
3446 switch (TYPE_LENGTH (t))
3447 {
3448 case 8:
3449 if (*base_type == VFP_CPRC_UNKNOWN)
3450 *base_type = VFP_CPRC_SINGLE;
3451 else if (*base_type != VFP_CPRC_SINGLE)
3452 return -1;
3453 return 2;
3454
3455 case 16:
3456 if (*base_type == VFP_CPRC_UNKNOWN)
3457 *base_type = VFP_CPRC_DOUBLE;
3458 else if (*base_type != VFP_CPRC_DOUBLE)
3459 return -1;
3460 return 2;
3461
3462 default:
3463 return -1;
3464 }
3465 break;
3466
90445bd3
DJ
3467 case TYPE_CODE_ARRAY:
3468 {
c4312b19 3469 if (TYPE_VECTOR (t))
90445bd3 3470 {
c4312b19
YQ
3471 /* A 64-bit or 128-bit containerized vector type are VFP
3472 CPRCs. */
3473 switch (TYPE_LENGTH (t))
3474 {
3475 case 8:
3476 if (*base_type == VFP_CPRC_UNKNOWN)
3477 *base_type = VFP_CPRC_VEC64;
3478 return 1;
3479 case 16:
3480 if (*base_type == VFP_CPRC_UNKNOWN)
3481 *base_type = VFP_CPRC_VEC128;
3482 return 1;
3483 default:
3484 return -1;
3485 }
3486 }
3487 else
3488 {
3489 int count;
3490 unsigned unitlen;
3491
3492 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3493 base_type);
3494 if (count == -1)
3495 return -1;
3496 if (TYPE_LENGTH (t) == 0)
3497 {
3498 gdb_assert (count == 0);
3499 return 0;
3500 }
3501 else if (count == 0)
3502 return -1;
3503 unitlen = arm_vfp_cprc_unit_length (*base_type);
3504 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3505 return TYPE_LENGTH (t) / unitlen;
90445bd3 3506 }
90445bd3
DJ
3507 }
3508 break;
3509
3510 case TYPE_CODE_STRUCT:
3511 {
3512 int count = 0;
3513 unsigned unitlen;
3514 int i;
3515 for (i = 0; i < TYPE_NFIELDS (t); i++)
3516 {
1040b979
YQ
3517 int sub_count = 0;
3518
3519 if (!field_is_static (&TYPE_FIELD (t, i)))
3520 sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3521 base_type);
90445bd3
DJ
3522 if (sub_count == -1)
3523 return -1;
3524 count += sub_count;
3525 }
3526 if (TYPE_LENGTH (t) == 0)
3527 {
3528 gdb_assert (count == 0);
3529 return 0;
3530 }
3531 else if (count == 0)
3532 return -1;
3533 unitlen = arm_vfp_cprc_unit_length (*base_type);
3534 if (TYPE_LENGTH (t) != unitlen * count)
3535 return -1;
3536 return count;
3537 }
3538
3539 case TYPE_CODE_UNION:
3540 {
3541 int count = 0;
3542 unsigned unitlen;
3543 int i;
3544 for (i = 0; i < TYPE_NFIELDS (t); i++)
3545 {
3546 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3547 base_type);
3548 if (sub_count == -1)
3549 return -1;
3550 count = (count > sub_count ? count : sub_count);
3551 }
3552 if (TYPE_LENGTH (t) == 0)
3553 {
3554 gdb_assert (count == 0);
3555 return 0;
3556 }
3557 else if (count == 0)
3558 return -1;
3559 unitlen = arm_vfp_cprc_unit_length (*base_type);
3560 if (TYPE_LENGTH (t) != unitlen * count)
3561 return -1;
3562 return count;
3563 }
3564
3565 default:
3566 break;
3567 }
3568
3569 return -1;
3570}
3571
3572/* Determine whether T is a VFP co-processor register candidate (CPRC)
3573 if passed to or returned from a non-variadic function with the VFP
3574 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3575 *BASE_TYPE to the base type for T and *COUNT to the number of
3576 elements of that base type before returning. */
3577
3578static int
3579arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3580 int *count)
3581{
3582 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3583 int c = arm_vfp_cprc_sub_candidate (t, &b);
3584 if (c <= 0 || c > 4)
3585 return 0;
3586 *base_type = b;
3587 *count = c;
3588 return 1;
3589}
3590
3591/* Return 1 if the VFP ABI should be used for passing arguments to and
3592 returning values from a function of type FUNC_TYPE, 0
3593 otherwise. */
3594
3595static int
3596arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3597{
3598 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3599 /* Variadic functions always use the base ABI. Assume that functions
3600 without debug info are not variadic. */
3601 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3602 return 0;
3603 /* The VFP ABI is only supported as a variant of AAPCS. */
3604 if (tdep->arm_abi != ARM_ABI_AAPCS)
3605 return 0;
3606 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3607}
3608
3609/* We currently only support passing parameters in integer registers, which
3610 conforms with GCC's default model, and VFP argument passing following
3611 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3612 we should probably support some of them based on the selected ABI. */
3613
3614static CORE_ADDR
7d9b040b 3615arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a 3616 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
cf84fa6b
AH
3617 struct value **args, CORE_ADDR sp,
3618 function_call_return_method return_method,
6a65450a 3619 CORE_ADDR struct_addr)
2dd604e7 3620{
e17a4113 3621 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3622 int argnum;
3623 int argreg;
3624 int nstack;
3625 struct stack_item *si = NULL;
90445bd3
DJ
3626 int use_vfp_abi;
3627 struct type *ftype;
3628 unsigned vfp_regs_free = (1 << 16) - 1;
3629
3630 /* Determine the type of this function and whether the VFP ABI
3631 applies. */
3632 ftype = check_typedef (value_type (function));
3633 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3634 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3635 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3636
6a65450a
AC
3637 /* Set the return address. For the ARM, the return breakpoint is
3638 always at BP_ADDR. */
9779414d 3639 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3640 bp_addr |= 1;
6a65450a 3641 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3642
3643 /* Walk through the list of args and determine how large a temporary
3644 stack is required. Need to take care here as structs may be
7a9dd1b2 3645 passed on the stack, and we have to push them. */
2dd604e7
RE
3646 nstack = 0;
3647
3648 argreg = ARM_A1_REGNUM;
3649 nstack = 0;
3650
2dd604e7
RE
3651 /* The struct_return pointer occupies the first parameter
3652 passing register. */
cf84fa6b 3653 if (return_method == return_method_struct)
2dd604e7
RE
3654 {
3655 if (arm_debug)
5af949e3 3656 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3657 gdbarch_register_name (gdbarch, argreg),
5af949e3 3658 paddress (gdbarch, struct_addr));
2dd604e7
RE
3659 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3660 argreg++;
3661 }
3662
3663 for (argnum = 0; argnum < nargs; argnum++)
3664 {
3665 int len;
3666 struct type *arg_type;
3667 struct type *target_type;
3668 enum type_code typecode;
8c6363cf 3669 const bfd_byte *val;
2af48f68 3670 int align;
90445bd3
DJ
3671 enum arm_vfp_cprc_base_type vfp_base_type;
3672 int vfp_base_count;
3673 int may_use_core_reg = 1;
2dd604e7 3674
df407dfe 3675 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3676 len = TYPE_LENGTH (arg_type);
3677 target_type = TYPE_TARGET_TYPE (arg_type);
3678 typecode = TYPE_CODE (arg_type);
8c6363cf 3679 val = value_contents (args[argnum]);
2dd604e7 3680
030197b4 3681 align = type_align (arg_type);
2af48f68
PB
3682 /* Round alignment up to a whole number of words. */
3683 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3684 /* Different ABIs have different maximum alignments. */
3685 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3686 {
3687 /* The APCS ABI only requires word alignment. */
3688 align = INT_REGISTER_SIZE;
3689 }
3690 else
3691 {
3692 /* The AAPCS requires at most doubleword alignment. */
3693 if (align > INT_REGISTER_SIZE * 2)
3694 align = INT_REGISTER_SIZE * 2;
3695 }
3696
90445bd3
DJ
3697 if (use_vfp_abi
3698 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3699 &vfp_base_count))
3700 {
3701 int regno;
3702 int unit_length;
3703 int shift;
3704 unsigned mask;
3705
3706 /* Because this is a CPRC it cannot go in a core register or
3707 cause a core register to be skipped for alignment.
3708 Either it goes in VFP registers and the rest of this loop
3709 iteration is skipped for this argument, or it goes on the
3710 stack (and the stack alignment code is correct for this
3711 case). */
3712 may_use_core_reg = 0;
3713
3714 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3715 shift = unit_length / 4;
3716 mask = (1 << (shift * vfp_base_count)) - 1;
3717 for (regno = 0; regno < 16; regno += shift)
3718 if (((vfp_regs_free >> regno) & mask) == mask)
3719 break;
3720
3721 if (regno < 16)
3722 {
3723 int reg_char;
3724 int reg_scaled;
3725 int i;
3726
3727 vfp_regs_free &= ~(mask << regno);
3728 reg_scaled = regno / shift;
3729 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3730 for (i = 0; i < vfp_base_count; i++)
3731 {
3732 char name_buf[4];
3733 int regnum;
58d6951d
DJ
3734 if (reg_char == 'q')
3735 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3736 val + i * unit_length);
58d6951d
DJ
3737 else
3738 {
8c042590
PM
3739 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3740 reg_char, reg_scaled + i);
58d6951d
DJ
3741 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3742 strlen (name_buf));
b66f5587 3743 regcache->cooked_write (regnum, val + i * unit_length);
58d6951d 3744 }
90445bd3
DJ
3745 }
3746 continue;
3747 }
3748 else
3749 {
3750 /* This CPRC could not go in VFP registers, so all VFP
3751 registers are now marked as used. */
3752 vfp_regs_free = 0;
3753 }
3754 }
3755
2af48f68
PB
3756 /* Push stack padding for dowubleword alignment. */
3757 if (nstack & (align - 1))
3758 {
3759 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3760 nstack += INT_REGISTER_SIZE;
3761 }
3762
3763 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3764 if (may_use_core_reg
3765 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3766 && align > INT_REGISTER_SIZE
3767 && argreg & 1)
3768 argreg++;
3769
2dd604e7
RE
3770 /* If the argument is a pointer to a function, and it is a
3771 Thumb function, create a LOCAL copy of the value and set
3772 the THUMB bit in it. */
3773 if (TYPE_CODE_PTR == typecode
3774 && target_type != NULL
f96b8fa0 3775 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3776 {
e17a4113 3777 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3778 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3779 {
224c3ddb 3780 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3781 store_unsigned_integer (copy, len, byte_order,
e17a4113 3782 MAKE_THUMB_ADDR (regval));
8c6363cf 3783 val = copy;
2dd604e7
RE
3784 }
3785 }
3786
3787 /* Copy the argument to general registers or the stack in
3788 register-sized pieces. Large arguments are split between
3789 registers and stack. */
3790 while (len > 0)
3791 {
f0c9063c 3792 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
ef9bd0b8
YQ
3793 CORE_ADDR regval
3794 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3795
90445bd3 3796 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3797 {
3798 /* The argument is being passed in a general purpose
3799 register. */
e17a4113 3800 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3801 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3802 if (arm_debug)
3803 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3804 argnum,
3805 gdbarch_register_name
2af46ca0 3806 (gdbarch, argreg),
f0c9063c 3807 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3808 regcache_cooked_write_unsigned (regcache, argreg, regval);
3809 argreg++;
3810 }
3811 else
3812 {
ef9bd0b8
YQ
3813 gdb_byte buf[INT_REGISTER_SIZE];
3814
3815 memset (buf, 0, sizeof (buf));
3816 store_unsigned_integer (buf, partial_len, byte_order, regval);
3817
2dd604e7
RE
3818 /* Push the arguments onto the stack. */
3819 if (arm_debug)
3820 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3821 argnum, nstack);
ef9bd0b8 3822 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
f0c9063c 3823 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3824 }
3825
3826 len -= partial_len;
3827 val += partial_len;
3828 }
3829 }
3830 /* If we have an odd number of words to push, then decrement the stack
3831 by one word now, so first stack argument will be dword aligned. */
3832 if (nstack & 4)
3833 sp -= 4;
3834
3835 while (si)
3836 {
3837 sp -= si->len;
3838 write_memory (sp, si->data, si->len);
3839 si = pop_stack_item (si);
3840 }
3841
3842 /* Finally, update teh SP register. */
3843 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3844
3845 return sp;
3846}
3847
f53f0d0b
PB
3848
3849/* Always align the frame to an 8-byte boundary. This is required on
3850 some platforms and harmless on the rest. */
3851
3852static CORE_ADDR
3853arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3854{
3855 /* Align the stack to eight bytes. */
3856 return sp & ~ (CORE_ADDR) 7;
3857}
3858
c906108c 3859static void
12b27276 3860print_fpu_flags (struct ui_file *file, int flags)
c906108c 3861{
c5aa993b 3862 if (flags & (1 << 0))
12b27276 3863 fputs_filtered ("IVO ", file);
c5aa993b 3864 if (flags & (1 << 1))
12b27276 3865 fputs_filtered ("DVZ ", file);
c5aa993b 3866 if (flags & (1 << 2))
12b27276 3867 fputs_filtered ("OFL ", file);
c5aa993b 3868 if (flags & (1 << 3))
12b27276 3869 fputs_filtered ("UFL ", file);
c5aa993b 3870 if (flags & (1 << 4))
12b27276
WN
3871 fputs_filtered ("INX ", file);
3872 fputc_filtered ('\n', file);
c906108c
SS
3873}
3874
5e74b15c
RE
3875/* Print interesting information about the floating point processor
3876 (if present) or emulator. */
34e8f22d 3877static void
d855c300 3878arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3879 struct frame_info *frame, const char *args)
c906108c 3880{
9c9acae0 3881 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3882 int type;
3883
3884 type = (status >> 24) & 127;
edefbb7c 3885 if (status & (1 << 31))
12b27276 3886 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 3887 else
12b27276 3888 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 3889 /* i18n: [floating point unit] mask */
12b27276
WN
3890 fputs_filtered (_("mask: "), file);
3891 print_fpu_flags (file, status >> 16);
edefbb7c 3892 /* i18n: [floating point unit] flags */
12b27276
WN
3893 fputs_filtered (_("flags: "), file);
3894 print_fpu_flags (file, status);
c906108c
SS
3895}
3896
27067745
UW
3897/* Construct the ARM extended floating point type. */
3898static struct type *
3899arm_ext_type (struct gdbarch *gdbarch)
3900{
3901 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3902
3903 if (!tdep->arm_ext_type)
3904 tdep->arm_ext_type
e9bb382b 3905 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3906 floatformats_arm_ext);
3907
3908 return tdep->arm_ext_type;
3909}
3910
58d6951d
DJ
3911static struct type *
3912arm_neon_double_type (struct gdbarch *gdbarch)
3913{
3914 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3915
3916 if (tdep->neon_double_type == NULL)
3917 {
3918 struct type *t, *elem;
3919
3920 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3921 TYPE_CODE_UNION);
3922 elem = builtin_type (gdbarch)->builtin_uint8;
3923 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3924 elem = builtin_type (gdbarch)->builtin_uint16;
3925 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3926 elem = builtin_type (gdbarch)->builtin_uint32;
3927 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3928 elem = builtin_type (gdbarch)->builtin_uint64;
3929 append_composite_type_field (t, "u64", elem);
3930 elem = builtin_type (gdbarch)->builtin_float;
3931 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3932 elem = builtin_type (gdbarch)->builtin_double;
3933 append_composite_type_field (t, "f64", elem);
3934
3935 TYPE_VECTOR (t) = 1;
3936 TYPE_NAME (t) = "neon_d";
3937 tdep->neon_double_type = t;
3938 }
3939
3940 return tdep->neon_double_type;
3941}
3942
3943/* FIXME: The vector types are not correctly ordered on big-endian
3944 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3945 bits of d0 - regardless of what unit size is being held in d0. So
3946 the offset of the first uint8 in d0 is 7, but the offset of the
3947 first float is 4. This code works as-is for little-endian
3948 targets. */
3949
3950static struct type *
3951arm_neon_quad_type (struct gdbarch *gdbarch)
3952{
3953 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3954
3955 if (tdep->neon_quad_type == NULL)
3956 {
3957 struct type *t, *elem;
3958
3959 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3960 TYPE_CODE_UNION);
3961 elem = builtin_type (gdbarch)->builtin_uint8;
3962 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3963 elem = builtin_type (gdbarch)->builtin_uint16;
3964 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3965 elem = builtin_type (gdbarch)->builtin_uint32;
3966 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3967 elem = builtin_type (gdbarch)->builtin_uint64;
3968 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3969 elem = builtin_type (gdbarch)->builtin_float;
3970 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3971 elem = builtin_type (gdbarch)->builtin_double;
3972 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3973
3974 TYPE_VECTOR (t) = 1;
3975 TYPE_NAME (t) = "neon_q";
3976 tdep->neon_quad_type = t;
3977 }
3978
3979 return tdep->neon_quad_type;
3980}
3981
34e8f22d
RE
3982/* Return the GDB type object for the "standard" data type of data in
3983 register N. */
3984
3985static struct type *
7a5ea0d4 3986arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3987{
58d6951d
DJ
3988 int num_regs = gdbarch_num_regs (gdbarch);
3989
3990 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3991 && regnum >= num_regs && regnum < num_regs + 32)
3992 return builtin_type (gdbarch)->builtin_float;
3993
3994 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3995 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3996 return arm_neon_quad_type (gdbarch);
3997
3998 /* If the target description has register information, we are only
3999 in this function so that we can override the types of
4000 double-precision registers for NEON. */
4001 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
4002 {
4003 struct type *t = tdesc_register_type (gdbarch, regnum);
4004
4005 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
4006 && TYPE_CODE (t) == TYPE_CODE_FLT
4007 && gdbarch_tdep (gdbarch)->have_neon)
4008 return arm_neon_double_type (gdbarch);
4009 else
4010 return t;
4011 }
4012
34e8f22d 4013 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
4014 {
4015 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
4016 return builtin_type (gdbarch)->builtin_void;
4017
4018 return arm_ext_type (gdbarch);
4019 }
e4c16157 4020 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 4021 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 4022 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 4023 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
4024 else if (regnum >= ARRAY_SIZE (arm_register_names))
4025 /* These registers are only supported on targets which supply
4026 an XML description. */
df4df182 4027 return builtin_type (gdbarch)->builtin_int0;
032758dc 4028 else
df4df182 4029 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
4030}
4031
ff6f572f
DJ
4032/* Map a DWARF register REGNUM onto the appropriate GDB register
4033 number. */
4034
4035static int
d3f73121 4036arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
4037{
4038 /* Core integer regs. */
4039 if (reg >= 0 && reg <= 15)
4040 return reg;
4041
4042 /* Legacy FPA encoding. These were once used in a way which
4043 overlapped with VFP register numbering, so their use is
4044 discouraged, but GDB doesn't support the ARM toolchain
4045 which used them for VFP. */
4046 if (reg >= 16 && reg <= 23)
4047 return ARM_F0_REGNUM + reg - 16;
4048
4049 /* New assignments for the FPA registers. */
4050 if (reg >= 96 && reg <= 103)
4051 return ARM_F0_REGNUM + reg - 96;
4052
4053 /* WMMX register assignments. */
4054 if (reg >= 104 && reg <= 111)
4055 return ARM_WCGR0_REGNUM + reg - 104;
4056
4057 if (reg >= 112 && reg <= 127)
4058 return ARM_WR0_REGNUM + reg - 112;
4059
4060 if (reg >= 192 && reg <= 199)
4061 return ARM_WC0_REGNUM + reg - 192;
4062
58d6951d
DJ
4063 /* VFP v2 registers. A double precision value is actually
4064 in d1 rather than s2, but the ABI only defines numbering
4065 for the single precision registers. This will "just work"
4066 in GDB for little endian targets (we'll read eight bytes,
4067 starting in s0 and then progressing to s1), but will be
4068 reversed on big endian targets with VFP. This won't
4069 be a problem for the new Neon quad registers; you're supposed
4070 to use DW_OP_piece for those. */
4071 if (reg >= 64 && reg <= 95)
4072 {
4073 char name_buf[4];
4074
8c042590 4075 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4076 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4077 strlen (name_buf));
4078 }
4079
4080 /* VFP v3 / Neon registers. This range is also used for VFP v2
4081 registers, except that it now describes d0 instead of s0. */
4082 if (reg >= 256 && reg <= 287)
4083 {
4084 char name_buf[4];
4085
8c042590 4086 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4087 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4088 strlen (name_buf));
4089 }
4090
ff6f572f
DJ
4091 return -1;
4092}
4093
26216b98
AC
4094/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4095static int
e7faf938 4096arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4097{
4098 int reg = regnum;
e7faf938 4099 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4100
ff6f572f
DJ
4101 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4102 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4103
4104 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4105 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4106
4107 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4108 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4109
26216b98
AC
4110 if (reg < NUM_GREGS)
4111 return SIM_ARM_R0_REGNUM + reg;
4112 reg -= NUM_GREGS;
4113
4114 if (reg < NUM_FREGS)
4115 return SIM_ARM_FP0_REGNUM + reg;
4116 reg -= NUM_FREGS;
4117
4118 if (reg < NUM_SREGS)
4119 return SIM_ARM_FPS_REGNUM + reg;
4120 reg -= NUM_SREGS;
4121
edefbb7c 4122 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4123}
34e8f22d 4124
d9311bfa
AT
4125/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4126 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4127 NULL if an error occurs. BUF is freed. */
c906108c 4128
d9311bfa
AT
4129static gdb_byte *
4130extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4131 int old_len, int new_len)
4132{
4133 gdb_byte *new_buf;
4134 int bytes_to_read = new_len - old_len;
c906108c 4135
d9311bfa
AT
4136 new_buf = (gdb_byte *) xmalloc (new_len);
4137 memcpy (new_buf + bytes_to_read, buf, old_len);
4138 xfree (buf);
198cd59d 4139 if (target_read_code (endaddr - new_len, new_buf, bytes_to_read) != 0)
d9311bfa
AT
4140 {
4141 xfree (new_buf);
4142 return NULL;
c906108c 4143 }
d9311bfa 4144 return new_buf;
c906108c
SS
4145}
4146
d9311bfa
AT
4147/* An IT block is at most the 2-byte IT instruction followed by
4148 four 4-byte instructions. The furthest back we must search to
4149 find an IT block that affects the current instruction is thus
4150 2 + 3 * 4 == 14 bytes. */
4151#define MAX_IT_BLOCK_PREFIX 14
177321bd 4152
d9311bfa
AT
4153/* Use a quick scan if there are more than this many bytes of
4154 code. */
4155#define IT_SCAN_THRESHOLD 32
177321bd 4156
d9311bfa
AT
4157/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4158 A breakpoint in an IT block may not be hit, depending on the
4159 condition flags. */
ad527d2e 4160static CORE_ADDR
d9311bfa 4161arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
c906108c 4162{
d9311bfa
AT
4163 gdb_byte *buf;
4164 char map_type;
4165 CORE_ADDR boundary, func_start;
4166 int buf_len;
4167 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4168 int i, any, last_it, last_it_count;
177321bd 4169
d9311bfa
AT
4170 /* If we are using BKPT breakpoints, none of this is necessary. */
4171 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4172 return bpaddr;
177321bd 4173
d9311bfa
AT
4174 /* ARM mode does not have this problem. */
4175 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4176 return bpaddr;
177321bd 4177
d9311bfa
AT
4178 /* We are setting a breakpoint in Thumb code that could potentially
4179 contain an IT block. The first step is to find how much Thumb
4180 code there is; we do not need to read outside of known Thumb
4181 sequences. */
4182 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4183 if (map_type == 0)
4184 /* Thumb-2 code must have mapping symbols to have a chance. */
4185 return bpaddr;
9dca5578 4186
d9311bfa 4187 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
177321bd 4188
d9311bfa
AT
4189 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4190 && func_start > boundary)
4191 boundary = func_start;
9dca5578 4192
d9311bfa
AT
4193 /* Search for a candidate IT instruction. We have to do some fancy
4194 footwork to distinguish a real IT instruction from the second
4195 half of a 32-bit instruction, but there is no need for that if
4196 there's no candidate. */
325fac50 4197 buf_len = std::min (bpaddr - boundary, (CORE_ADDR) MAX_IT_BLOCK_PREFIX);
d9311bfa
AT
4198 if (buf_len == 0)
4199 /* No room for an IT instruction. */
4200 return bpaddr;
c906108c 4201
d9311bfa 4202 buf = (gdb_byte *) xmalloc (buf_len);
198cd59d 4203 if (target_read_code (bpaddr - buf_len, buf, buf_len) != 0)
d9311bfa
AT
4204 return bpaddr;
4205 any = 0;
4206 for (i = 0; i < buf_len; i += 2)
c906108c 4207 {
d9311bfa
AT
4208 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4209 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
25b41d01 4210 {
d9311bfa
AT
4211 any = 1;
4212 break;
25b41d01 4213 }
c906108c 4214 }
d9311bfa
AT
4215
4216 if (any == 0)
c906108c 4217 {
d9311bfa
AT
4218 xfree (buf);
4219 return bpaddr;
f9d67f43
DJ
4220 }
4221
4222 /* OK, the code bytes before this instruction contain at least one
4223 halfword which resembles an IT instruction. We know that it's
4224 Thumb code, but there are still two possibilities. Either the
4225 halfword really is an IT instruction, or it is the second half of
4226 a 32-bit Thumb instruction. The only way we can tell is to
4227 scan forwards from a known instruction boundary. */
4228 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4229 {
4230 int definite;
4231
4232 /* There's a lot of code before this instruction. Start with an
4233 optimistic search; it's easy to recognize halfwords that can
4234 not be the start of a 32-bit instruction, and use that to
4235 lock on to the instruction boundaries. */
4236 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4237 if (buf == NULL)
4238 return bpaddr;
4239 buf_len = IT_SCAN_THRESHOLD;
4240
4241 definite = 0;
4242 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4243 {
4244 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4245 if (thumb_insn_size (inst1) == 2)
4246 {
4247 definite = 1;
4248 break;
4249 }
4250 }
4251
4252 /* At this point, if DEFINITE, BUF[I] is the first place we
4253 are sure that we know the instruction boundaries, and it is far
4254 enough from BPADDR that we could not miss an IT instruction
4255 affecting BPADDR. If ! DEFINITE, give up - start from a
4256 known boundary. */
4257 if (! definite)
4258 {
0963b4bd
MS
4259 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4260 bpaddr - boundary);
f9d67f43
DJ
4261 if (buf == NULL)
4262 return bpaddr;
4263 buf_len = bpaddr - boundary;
4264 i = 0;
4265 }
4266 }
4267 else
4268 {
4269 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4270 if (buf == NULL)
4271 return bpaddr;
4272 buf_len = bpaddr - boundary;
4273 i = 0;
4274 }
4275
4276 /* Scan forwards. Find the last IT instruction before BPADDR. */
4277 last_it = -1;
4278 last_it_count = 0;
4279 while (i < buf_len)
4280 {
4281 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4282 last_it_count--;
4283 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4284 {
4285 last_it = i;
4286 if (inst1 & 0x0001)
4287 last_it_count = 4;
4288 else if (inst1 & 0x0002)
4289 last_it_count = 3;
4290 else if (inst1 & 0x0004)
4291 last_it_count = 2;
4292 else
4293 last_it_count = 1;
4294 }
4295 i += thumb_insn_size (inst1);
4296 }
4297
4298 xfree (buf);
4299
4300 if (last_it == -1)
4301 /* There wasn't really an IT instruction after all. */
4302 return bpaddr;
4303
4304 if (last_it_count < 1)
4305 /* It was too far away. */
4306 return bpaddr;
4307
4308 /* This really is a trouble spot. Move the breakpoint to the IT
4309 instruction. */
4310 return bpaddr - buf_len + last_it;
4311}
4312
cca44b1b 4313/* ARM displaced stepping support.
c906108c 4314
cca44b1b 4315 Generally ARM displaced stepping works as follows:
c906108c 4316
cca44b1b 4317 1. When an instruction is to be single-stepped, it is first decoded by
2ba163c8
SM
4318 arm_process_displaced_insn. Depending on the type of instruction, it is
4319 then copied to a scratch location, possibly in a modified form. The
4320 copy_* set of functions performs such modification, as necessary. A
4321 breakpoint is placed after the modified instruction in the scratch space
4322 to return control to GDB. Note in particular that instructions which
4323 modify the PC will no longer do so after modification.
c5aa993b 4324
cca44b1b
JB
4325 2. The instruction is single-stepped, by setting the PC to the scratch
4326 location address, and resuming. Control returns to GDB when the
4327 breakpoint is hit.
c5aa993b 4328
cca44b1b
JB
4329 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4330 function used for the current instruction. This function's job is to
4331 put the CPU/memory state back to what it would have been if the
4332 instruction had been executed unmodified in its original location. */
c5aa993b 4333
cca44b1b
JB
4334/* NOP instruction (mov r0, r0). */
4335#define ARM_NOP 0xe1a00000
34518530 4336#define THUMB_NOP 0x4600
cca44b1b
JB
4337
4338/* Helper for register reads for displaced stepping. In particular, this
4339 returns the PC as it would be seen by the instruction at its original
4340 location. */
4341
4342ULONGEST
cfba9872 4343displaced_read_reg (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4344 int regno)
cca44b1b
JB
4345{
4346 ULONGEST ret;
36073a92 4347 CORE_ADDR from = dsc->insn_addr;
cca44b1b 4348
bf9f652a 4349 if (regno == ARM_PC_REGNUM)
cca44b1b 4350 {
4db71c0b
YQ
4351 /* Compute pipeline offset:
4352 - When executing an ARM instruction, PC reads as the address of the
4353 current instruction plus 8.
4354 - When executing a Thumb instruction, PC reads as the address of the
4355 current instruction plus 4. */
4356
36073a92 4357 if (!dsc->is_thumb)
4db71c0b
YQ
4358 from += 8;
4359 else
4360 from += 4;
4361
cca44b1b
JB
4362 if (debug_displaced)
4363 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
4364 (unsigned long) from);
4365 return (ULONGEST) from;
cca44b1b 4366 }
c906108c 4367 else
cca44b1b
JB
4368 {
4369 regcache_cooked_read_unsigned (regs, regno, &ret);
4370 if (debug_displaced)
4371 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4372 regno, (unsigned long) ret);
4373 return ret;
4374 }
c906108c
SS
4375}
4376
cca44b1b
JB
4377static int
4378displaced_in_arm_mode (struct regcache *regs)
4379{
4380 ULONGEST ps;
ac7936df 4381 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
66e810cd 4382
cca44b1b 4383 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 4384
9779414d 4385 return (ps & t_bit) == 0;
cca44b1b 4386}
66e810cd 4387
cca44b1b 4388/* Write to the PC as from a branch instruction. */
c906108c 4389
cca44b1b 4390static void
cfba9872 4391branch_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4392 ULONGEST val)
c906108c 4393{
36073a92 4394 if (!dsc->is_thumb)
cca44b1b
JB
4395 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4396 architecture versions < 6. */
0963b4bd
MS
4397 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4398 val & ~(ULONGEST) 0x3);
cca44b1b 4399 else
0963b4bd
MS
4400 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4401 val & ~(ULONGEST) 0x1);
cca44b1b 4402}
66e810cd 4403
cca44b1b
JB
4404/* Write to the PC as from a branch-exchange instruction. */
4405
4406static void
4407bx_write_pc (struct regcache *regs, ULONGEST val)
4408{
4409 ULONGEST ps;
ac7936df 4410 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
cca44b1b
JB
4411
4412 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4413
4414 if ((val & 1) == 1)
c906108c 4415 {
9779414d 4416 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
4417 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4418 }
4419 else if ((val & 2) == 0)
4420 {
9779414d 4421 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4422 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
4423 }
4424 else
4425 {
cca44b1b
JB
4426 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4427 mode, align dest to 4 bytes). */
4428 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 4429 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4430 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
4431 }
4432}
ed9a39eb 4433
cca44b1b 4434/* Write to the PC as if from a load instruction. */
ed9a39eb 4435
34e8f22d 4436static void
cfba9872 4437load_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4438 ULONGEST val)
ed9a39eb 4439{
cca44b1b
JB
4440 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4441 bx_write_pc (regs, val);
4442 else
36073a92 4443 branch_write_pc (regs, dsc, val);
cca44b1b 4444}
be8626e0 4445
cca44b1b
JB
4446/* Write to the PC as if from an ALU instruction. */
4447
4448static void
cfba9872 4449alu_write_pc (struct regcache *regs, arm_displaced_step_closure *dsc,
36073a92 4450 ULONGEST val)
cca44b1b 4451{
36073a92 4452 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
4453 bx_write_pc (regs, val);
4454 else
36073a92 4455 branch_write_pc (regs, dsc, val);
cca44b1b
JB
4456}
4457
4458/* Helper for writing to registers for displaced stepping. Writing to the PC
4459 has a varying effects depending on the instruction which does the write:
4460 this is controlled by the WRITE_PC argument. */
4461
4462void
cfba9872 4463displaced_write_reg (struct regcache *regs, arm_displaced_step_closure *dsc,
cca44b1b
JB
4464 int regno, ULONGEST val, enum pc_write_style write_pc)
4465{
bf9f652a 4466 if (regno == ARM_PC_REGNUM)
08216dd7 4467 {
cca44b1b
JB
4468 if (debug_displaced)
4469 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4470 (unsigned long) val);
4471 switch (write_pc)
08216dd7 4472 {
cca44b1b 4473 case BRANCH_WRITE_PC:
36073a92 4474 branch_write_pc (regs, dsc, val);
08216dd7
RE
4475 break;
4476
cca44b1b
JB
4477 case BX_WRITE_PC:
4478 bx_write_pc (regs, val);
4479 break;
4480
4481 case LOAD_WRITE_PC:
36073a92 4482 load_write_pc (regs, dsc, val);
cca44b1b
JB
4483 break;
4484
4485 case ALU_WRITE_PC:
36073a92 4486 alu_write_pc (regs, dsc, val);
cca44b1b
JB
4487 break;
4488
4489 case CANNOT_WRITE_PC:
4490 warning (_("Instruction wrote to PC in an unexpected way when "
4491 "single-stepping"));
08216dd7
RE
4492 break;
4493
4494 default:
97b9747c
JB
4495 internal_error (__FILE__, __LINE__,
4496 _("Invalid argument to displaced_write_reg"));
08216dd7 4497 }
b508a996 4498
cca44b1b 4499 dsc->wrote_to_pc = 1;
b508a996 4500 }
ed9a39eb 4501 else
b508a996 4502 {
cca44b1b
JB
4503 if (debug_displaced)
4504 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4505 regno, (unsigned long) val);
4506 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 4507 }
34e8f22d
RE
4508}
4509
cca44b1b
JB
4510/* This function is used to concisely determine if an instruction INSN
4511 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
4512 corresponding fields of BITMASK set to 0b1111. The function
4513 returns return 1 if any of these fields in INSN reference the PC
4514 (also 0b1111, r15), else it returns 0. */
67255d04
RE
4515
4516static int
cca44b1b 4517insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 4518{
cca44b1b 4519 uint32_t lowbit = 1;
67255d04 4520
cca44b1b
JB
4521 while (bitmask != 0)
4522 {
4523 uint32_t mask;
44e1a9eb 4524
cca44b1b
JB
4525 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4526 ;
67255d04 4527
cca44b1b
JB
4528 if (!lowbit)
4529 break;
67255d04 4530
cca44b1b 4531 mask = lowbit * 0xf;
67255d04 4532
cca44b1b
JB
4533 if ((insn & mask) == mask)
4534 return 1;
4535
4536 bitmask &= ~mask;
67255d04
RE
4537 }
4538
cca44b1b
JB
4539 return 0;
4540}
2af48f68 4541
cca44b1b
JB
4542/* The simplest copy function. Many instructions have the same effect no
4543 matter what address they are executed at: in those cases, use this. */
67255d04 4544
cca44b1b 4545static int
7ff120b4 4546arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 4547 const char *iname, arm_displaced_step_closure *dsc)
cca44b1b
JB
4548{
4549 if (debug_displaced)
4550 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4551 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4552 iname);
67255d04 4553
cca44b1b 4554 dsc->modinsn[0] = insn;
67255d04 4555
cca44b1b
JB
4556 return 0;
4557}
4558
34518530
YQ
4559static int
4560thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4561 uint16_t insn2, const char *iname,
cfba9872 4562 arm_displaced_step_closure *dsc)
34518530
YQ
4563{
4564 if (debug_displaced)
4565 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4566 "opcode/class '%s' unmodified\n", insn1, insn2,
4567 iname);
4568
4569 dsc->modinsn[0] = insn1;
4570 dsc->modinsn[1] = insn2;
4571 dsc->numinsns = 2;
4572
4573 return 0;
4574}
4575
4576/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4577 modification. */
4578static int
615234c1 4579thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
34518530 4580 const char *iname,
cfba9872 4581 arm_displaced_step_closure *dsc)
34518530
YQ
4582{
4583 if (debug_displaced)
4584 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4585 "opcode/class '%s' unmodified\n", insn,
4586 iname);
4587
4588 dsc->modinsn[0] = insn;
4589
4590 return 0;
4591}
4592
cca44b1b
JB
4593/* Preload instructions with immediate offset. */
4594
4595static void
6e39997a 4596cleanup_preload (struct gdbarch *gdbarch,
cfba9872 4597 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
4598{
4599 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4600 if (!dsc->u.preload.immed)
4601 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4602}
4603
7ff120b4
YQ
4604static void
4605install_preload (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4606 arm_displaced_step_closure *dsc, unsigned int rn)
cca44b1b 4607{
cca44b1b 4608 ULONGEST rn_val;
cca44b1b
JB
4609 /* Preload instructions:
4610
4611 {pli/pld} [rn, #+/-imm]
4612 ->
4613 {pli/pld} [r0, #+/-imm]. */
4614
36073a92
YQ
4615 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4616 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 4617 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
4618 dsc->u.preload.immed = 1;
4619
cca44b1b 4620 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
4621}
4622
cca44b1b 4623static int
7ff120b4 4624arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 4625 arm_displaced_step_closure *dsc)
cca44b1b
JB
4626{
4627 unsigned int rn = bits (insn, 16, 19);
cca44b1b 4628
7ff120b4
YQ
4629 if (!insn_references_pc (insn, 0x000f0000ul))
4630 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
4631
4632 if (debug_displaced)
4633 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4634 (unsigned long) insn);
4635
7ff120b4
YQ
4636 dsc->modinsn[0] = insn & 0xfff0ffff;
4637
4638 install_preload (gdbarch, regs, dsc, rn);
4639
4640 return 0;
4641}
4642
34518530
YQ
4643static int
4644thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
cfba9872 4645 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
4646{
4647 unsigned int rn = bits (insn1, 0, 3);
4648 unsigned int u_bit = bit (insn1, 7);
4649 int imm12 = bits (insn2, 0, 11);
4650 ULONGEST pc_val;
4651
4652 if (rn != ARM_PC_REGNUM)
4653 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4654
4655 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4656 PLD (literal) Encoding T1. */
4657 if (debug_displaced)
4658 fprintf_unfiltered (gdb_stdlog,
4659 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4660 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4661 imm12);
4662
4663 if (!u_bit)
4664 imm12 = -1 * imm12;
4665
4666 /* Rewrite instruction {pli/pld} PC imm12 into:
4667 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4668
4669 {pli/pld} [r0, r1]
4670
4671 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4672
4673 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4674 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4675
4676 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4677
4678 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4679 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4680 dsc->u.preload.immed = 0;
4681
4682 /* {pli/pld} [r0, r1] */
4683 dsc->modinsn[0] = insn1 & 0xfff0;
4684 dsc->modinsn[1] = 0xf001;
4685 dsc->numinsns = 2;
4686
4687 dsc->cleanup = &cleanup_preload;
4688 return 0;
4689}
4690
7ff120b4
YQ
4691/* Preload instructions with register offset. */
4692
4693static void
4694install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4695 arm_displaced_step_closure *dsc, unsigned int rn,
7ff120b4
YQ
4696 unsigned int rm)
4697{
4698 ULONGEST rn_val, rm_val;
4699
cca44b1b
JB
4700 /* Preload register-offset instructions:
4701
4702 {pli/pld} [rn, rm {, shift}]
4703 ->
4704 {pli/pld} [r0, r1 {, shift}]. */
4705
36073a92
YQ
4706 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4707 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4708 rn_val = displaced_read_reg (regs, dsc, rn);
4709 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
4710 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4711 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
4712 dsc->u.preload.immed = 0;
4713
cca44b1b 4714 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
4715}
4716
4717static int
4718arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4719 struct regcache *regs,
cfba9872 4720 arm_displaced_step_closure *dsc)
7ff120b4
YQ
4721{
4722 unsigned int rn = bits (insn, 16, 19);
4723 unsigned int rm = bits (insn, 0, 3);
4724
4725
4726 if (!insn_references_pc (insn, 0x000f000ful))
4727 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4728
4729 if (debug_displaced)
4730 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4731 (unsigned long) insn);
4732
4733 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 4734
7ff120b4 4735 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
4736 return 0;
4737}
4738
4739/* Copy/cleanup coprocessor load and store instructions. */
4740
4741static void
6e39997a 4742cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b 4743 struct regcache *regs,
cfba9872 4744 arm_displaced_step_closure *dsc)
cca44b1b 4745{
36073a92 4746 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
4747
4748 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4749
4750 if (dsc->u.ldst.writeback)
4751 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4752}
4753
7ff120b4
YQ
4754static void
4755install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4756 arm_displaced_step_closure *dsc,
7ff120b4 4757 int writeback, unsigned int rn)
cca44b1b 4758{
cca44b1b 4759 ULONGEST rn_val;
cca44b1b 4760
cca44b1b
JB
4761 /* Coprocessor load/store instructions:
4762
4763 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4764 ->
4765 {stc/stc2} [r0, #+/-imm].
4766
4767 ldc/ldc2 are handled identically. */
4768
36073a92
YQ
4769 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4770 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
4771 /* PC should be 4-byte aligned. */
4772 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
4773 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4774
7ff120b4 4775 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
4776 dsc->u.ldst.rn = rn;
4777
7ff120b4
YQ
4778 dsc->cleanup = &cleanup_copro_load_store;
4779}
4780
4781static int
4782arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4783 struct regcache *regs,
cfba9872 4784 arm_displaced_step_closure *dsc)
7ff120b4
YQ
4785{
4786 unsigned int rn = bits (insn, 16, 19);
4787
4788 if (!insn_references_pc (insn, 0x000f0000ul))
4789 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4790
4791 if (debug_displaced)
4792 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4793 "load/store insn %.8lx\n", (unsigned long) insn);
4794
cca44b1b
JB
4795 dsc->modinsn[0] = insn & 0xfff0ffff;
4796
7ff120b4 4797 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
4798
4799 return 0;
4800}
4801
34518530
YQ
4802static int
4803thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4804 uint16_t insn2, struct regcache *regs,
cfba9872 4805 arm_displaced_step_closure *dsc)
34518530
YQ
4806{
4807 unsigned int rn = bits (insn1, 0, 3);
4808
4809 if (rn != ARM_PC_REGNUM)
4810 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4811 "copro load/store", dsc);
4812
4813 if (debug_displaced)
4814 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4815 "load/store insn %.4x%.4x\n", insn1, insn2);
4816
4817 dsc->modinsn[0] = insn1 & 0xfff0;
4818 dsc->modinsn[1] = insn2;
4819 dsc->numinsns = 2;
4820
4821 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4822 doesn't support writeback, so pass 0. */
4823 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4824
4825 return 0;
4826}
4827
cca44b1b
JB
4828/* Clean up branch instructions (actually perform the branch, by setting
4829 PC). */
4830
4831static void
6e39997a 4832cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4833 arm_displaced_step_closure *dsc)
cca44b1b 4834{
36073a92 4835 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
4836 int branch_taken = condition_true (dsc->u.branch.cond, status);
4837 enum pc_write_style write_pc = dsc->u.branch.exchange
4838 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4839
4840 if (!branch_taken)
4841 return;
4842
4843 if (dsc->u.branch.link)
4844 {
8c8dba6d
YQ
4845 /* The value of LR should be the next insn of current one. In order
4846 not to confuse logic hanlding later insn `bx lr', if current insn mode
4847 is Thumb, the bit 0 of LR value should be set to 1. */
4848 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4849
4850 if (dsc->is_thumb)
4851 next_insn_addr |= 0x1;
4852
4853 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4854 CANNOT_WRITE_PC);
cca44b1b
JB
4855 }
4856
bf9f652a 4857 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
4858}
4859
4860/* Copy B/BL/BLX instructions with immediate destinations. */
4861
7ff120b4
YQ
4862static void
4863install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 4864 arm_displaced_step_closure *dsc,
7ff120b4
YQ
4865 unsigned int cond, int exchange, int link, long offset)
4866{
4867 /* Implement "BL<cond> <label>" as:
4868
4869 Preparation: cond <- instruction condition
4870 Insn: mov r0, r0 (nop)
4871 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4872
4873 B<cond> similar, but don't set r14 in cleanup. */
4874
4875 dsc->u.branch.cond = cond;
4876 dsc->u.branch.link = link;
4877 dsc->u.branch.exchange = exchange;
4878
2b16b2e3
YQ
4879 dsc->u.branch.dest = dsc->insn_addr;
4880 if (link && exchange)
4881 /* For BLX, offset is computed from the Align (PC, 4). */
4882 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4883
7ff120b4 4884 if (dsc->is_thumb)
2b16b2e3 4885 dsc->u.branch.dest += 4 + offset;
7ff120b4 4886 else
2b16b2e3 4887 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
4888
4889 dsc->cleanup = &cleanup_branch;
4890}
cca44b1b 4891static int
7ff120b4 4892arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 4893 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
4894{
4895 unsigned int cond = bits (insn, 28, 31);
4896 int exchange = (cond == 0xf);
4897 int link = exchange || bit (insn, 24);
cca44b1b
JB
4898 long offset;
4899
4900 if (debug_displaced)
4901 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4902 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4903 (unsigned long) insn);
cca44b1b
JB
4904 if (exchange)
4905 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4906 then arrange the switch into Thumb mode. */
4907 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4908 else
4909 offset = bits (insn, 0, 23) << 2;
4910
4911 if (bit (offset, 25))
4912 offset = offset | ~0x3ffffff;
4913
cca44b1b
JB
4914 dsc->modinsn[0] = ARM_NOP;
4915
7ff120b4 4916 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
4917 return 0;
4918}
4919
34518530
YQ
4920static int
4921thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4922 uint16_t insn2, struct regcache *regs,
cfba9872 4923 arm_displaced_step_closure *dsc)
34518530
YQ
4924{
4925 int link = bit (insn2, 14);
4926 int exchange = link && !bit (insn2, 12);
4927 int cond = INST_AL;
4928 long offset = 0;
4929 int j1 = bit (insn2, 13);
4930 int j2 = bit (insn2, 11);
4931 int s = sbits (insn1, 10, 10);
4932 int i1 = !(j1 ^ bit (insn1, 10));
4933 int i2 = !(j2 ^ bit (insn1, 10));
4934
4935 if (!link && !exchange) /* B */
4936 {
4937 offset = (bits (insn2, 0, 10) << 1);
4938 if (bit (insn2, 12)) /* Encoding T4 */
4939 {
4940 offset |= (bits (insn1, 0, 9) << 12)
4941 | (i2 << 22)
4942 | (i1 << 23)
4943 | (s << 24);
4944 cond = INST_AL;
4945 }
4946 else /* Encoding T3 */
4947 {
4948 offset |= (bits (insn1, 0, 5) << 12)
4949 | (j1 << 18)
4950 | (j2 << 19)
4951 | (s << 20);
4952 cond = bits (insn1, 6, 9);
4953 }
4954 }
4955 else
4956 {
4957 offset = (bits (insn1, 0, 9) << 12);
4958 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
4959 offset |= exchange ?
4960 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
4961 }
4962
4963 if (debug_displaced)
4964 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
4965 "%.4x %.4x with offset %.8lx\n",
4966 link ? (exchange) ? "blx" : "bl" : "b",
4967 insn1, insn2, offset);
4968
4969 dsc->modinsn[0] = THUMB_NOP;
4970
4971 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4972 return 0;
4973}
4974
4975/* Copy B Thumb instructions. */
4976static int
615234c1 4977thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
cfba9872 4978 arm_displaced_step_closure *dsc)
34518530
YQ
4979{
4980 unsigned int cond = 0;
4981 int offset = 0;
4982 unsigned short bit_12_15 = bits (insn, 12, 15);
4983 CORE_ADDR from = dsc->insn_addr;
4984
4985 if (bit_12_15 == 0xd)
4986 {
4987 /* offset = SignExtend (imm8:0, 32) */
4988 offset = sbits ((insn << 1), 0, 8);
4989 cond = bits (insn, 8, 11);
4990 }
4991 else if (bit_12_15 == 0xe) /* Encoding T2 */
4992 {
4993 offset = sbits ((insn << 1), 0, 11);
4994 cond = INST_AL;
4995 }
4996
4997 if (debug_displaced)
4998 fprintf_unfiltered (gdb_stdlog,
4999 "displaced: copying b immediate insn %.4x "
5000 "with offset %d\n", insn, offset);
5001
5002 dsc->u.branch.cond = cond;
5003 dsc->u.branch.link = 0;
5004 dsc->u.branch.exchange = 0;
5005 dsc->u.branch.dest = from + 4 + offset;
5006
5007 dsc->modinsn[0] = THUMB_NOP;
5008
5009 dsc->cleanup = &cleanup_branch;
5010
5011 return 0;
5012}
5013
cca44b1b
JB
5014/* Copy BX/BLX with register-specified destinations. */
5015
7ff120b4
YQ
5016static void
5017install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5018 arm_displaced_step_closure *dsc, int link,
7ff120b4 5019 unsigned int cond, unsigned int rm)
cca44b1b 5020{
cca44b1b
JB
5021 /* Implement {BX,BLX}<cond> <reg>" as:
5022
5023 Preparation: cond <- instruction condition
5024 Insn: mov r0, r0 (nop)
5025 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5026
5027 Don't set r14 in cleanup for BX. */
5028
36073a92 5029 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5030
5031 dsc->u.branch.cond = cond;
5032 dsc->u.branch.link = link;
cca44b1b 5033
7ff120b4 5034 dsc->u.branch.exchange = 1;
cca44b1b
JB
5035
5036 dsc->cleanup = &cleanup_branch;
7ff120b4 5037}
cca44b1b 5038
7ff120b4
YQ
5039static int
5040arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 5041 struct regcache *regs, arm_displaced_step_closure *dsc)
7ff120b4
YQ
5042{
5043 unsigned int cond = bits (insn, 28, 31);
5044 /* BX: x12xxx1x
5045 BLX: x12xxx3x. */
5046 int link = bit (insn, 5);
5047 unsigned int rm = bits (insn, 0, 3);
5048
5049 if (debug_displaced)
5050 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5051 (unsigned long) insn);
5052
5053 dsc->modinsn[0] = ARM_NOP;
5054
5055 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
5056 return 0;
5057}
5058
34518530
YQ
5059static int
5060thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5061 struct regcache *regs,
cfba9872 5062 arm_displaced_step_closure *dsc)
34518530
YQ
5063{
5064 int link = bit (insn, 7);
5065 unsigned int rm = bits (insn, 3, 6);
5066
5067 if (debug_displaced)
5068 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5069 (unsigned short) insn);
5070
5071 dsc->modinsn[0] = THUMB_NOP;
5072
5073 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5074
5075 return 0;
5076}
5077
5078
0963b4bd 5079/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
5080
5081static void
6e39997a 5082cleanup_alu_imm (struct gdbarch *gdbarch,
cfba9872 5083 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b 5084{
36073a92 5085 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5086 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5087 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5088 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5089}
5090
5091static int
7ff120b4 5092arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 5093 arm_displaced_step_closure *dsc)
cca44b1b
JB
5094{
5095 unsigned int rn = bits (insn, 16, 19);
5096 unsigned int rd = bits (insn, 12, 15);
5097 unsigned int op = bits (insn, 21, 24);
5098 int is_mov = (op == 0xd);
5099 ULONGEST rd_val, rn_val;
cca44b1b
JB
5100
5101 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 5102 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
5103
5104 if (debug_displaced)
5105 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5106 "%.8lx\n", is_mov ? "move" : "ALU",
5107 (unsigned long) insn);
5108
5109 /* Instruction is of form:
5110
5111 <op><cond> rd, [rn,] #imm
5112
5113 Rewrite as:
5114
5115 Preparation: tmp1, tmp2 <- r0, r1;
5116 r0, r1 <- rd, rn
5117 Insn: <op><cond> r0, r1, #imm
5118 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5119 */
5120
36073a92
YQ
5121 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5122 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5123 rn_val = displaced_read_reg (regs, dsc, rn);
5124 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
5125 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5126 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5127 dsc->rd = rd;
5128
5129 if (is_mov)
5130 dsc->modinsn[0] = insn & 0xfff00fff;
5131 else
5132 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5133
5134 dsc->cleanup = &cleanup_alu_imm;
5135
5136 return 0;
5137}
5138
34518530
YQ
5139static int
5140thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5141 uint16_t insn2, struct regcache *regs,
cfba9872 5142 arm_displaced_step_closure *dsc)
34518530
YQ
5143{
5144 unsigned int op = bits (insn1, 5, 8);
5145 unsigned int rn, rm, rd;
5146 ULONGEST rd_val, rn_val;
5147
5148 rn = bits (insn1, 0, 3); /* Rn */
5149 rm = bits (insn2, 0, 3); /* Rm */
5150 rd = bits (insn2, 8, 11); /* Rd */
5151
5152 /* This routine is only called for instruction MOV. */
5153 gdb_assert (op == 0x2 && rn == 0xf);
5154
5155 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5156 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5157
5158 if (debug_displaced)
5159 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5160 "ALU", insn1, insn2);
5161
5162 /* Instruction is of form:
5163
5164 <op><cond> rd, [rn,] #imm
5165
5166 Rewrite as:
5167
5168 Preparation: tmp1, tmp2 <- r0, r1;
5169 r0, r1 <- rd, rn
5170 Insn: <op><cond> r0, r1, #imm
5171 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5172 */
5173
5174 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5175 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5176 rn_val = displaced_read_reg (regs, dsc, rn);
5177 rd_val = displaced_read_reg (regs, dsc, rd);
5178 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5179 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5180 dsc->rd = rd;
5181
5182 dsc->modinsn[0] = insn1;
5183 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5184 dsc->numinsns = 2;
5185
5186 dsc->cleanup = &cleanup_alu_imm;
5187
5188 return 0;
5189}
5190
cca44b1b
JB
5191/* Copy/cleanup arithmetic/logic insns with register RHS. */
5192
5193static void
6e39997a 5194cleanup_alu_reg (struct gdbarch *gdbarch,
cfba9872 5195 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
5196{
5197 ULONGEST rd_val;
5198 int i;
5199
36073a92 5200 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5201
5202 for (i = 0; i < 3; i++)
5203 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5204
5205 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5206}
5207
7ff120b4
YQ
5208static void
5209install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5210 arm_displaced_step_closure *dsc,
7ff120b4 5211 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 5212{
cca44b1b 5213 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 5214
cca44b1b
JB
5215 /* Instruction is of form:
5216
5217 <op><cond> rd, [rn,] rm [, <shift>]
5218
5219 Rewrite as:
5220
5221 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5222 r0, r1, r2 <- rd, rn, rm
ef713951 5223 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
5224 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5225 */
5226
36073a92
YQ
5227 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5228 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5229 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5230 rd_val = displaced_read_reg (regs, dsc, rd);
5231 rn_val = displaced_read_reg (regs, dsc, rn);
5232 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5233 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5234 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5235 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5236 dsc->rd = rd;
5237
7ff120b4
YQ
5238 dsc->cleanup = &cleanup_alu_reg;
5239}
5240
5241static int
5242arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cfba9872 5243 arm_displaced_step_closure *dsc)
7ff120b4
YQ
5244{
5245 unsigned int op = bits (insn, 21, 24);
5246 int is_mov = (op == 0xd);
5247
5248 if (!insn_references_pc (insn, 0x000ff00ful))
5249 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5250
5251 if (debug_displaced)
5252 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5253 is_mov ? "move" : "ALU", (unsigned long) insn);
5254
cca44b1b
JB
5255 if (is_mov)
5256 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5257 else
5258 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5259
7ff120b4
YQ
5260 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5261 bits (insn, 0, 3));
cca44b1b
JB
5262 return 0;
5263}
5264
34518530
YQ
5265static int
5266thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5267 struct regcache *regs,
cfba9872 5268 arm_displaced_step_closure *dsc)
34518530 5269{
ef713951 5270 unsigned rm, rd;
34518530 5271
ef713951
YQ
5272 rm = bits (insn, 3, 6);
5273 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 5274
ef713951 5275 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
5276 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5277
5278 if (debug_displaced)
ef713951
YQ
5279 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5280 (unsigned short) insn);
34518530 5281
ef713951 5282 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 5283
ef713951 5284 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
5285
5286 return 0;
5287}
5288
cca44b1b
JB
5289/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5290
5291static void
6e39997a 5292cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b 5293 struct regcache *regs,
cfba9872 5294 arm_displaced_step_closure *dsc)
cca44b1b 5295{
36073a92 5296 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5297 int i;
5298
5299 for (i = 0; i < 4; i++)
5300 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5301
5302 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5303}
5304
7ff120b4
YQ
5305static void
5306install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5307 arm_displaced_step_closure *dsc,
7ff120b4
YQ
5308 unsigned int rd, unsigned int rn, unsigned int rm,
5309 unsigned rs)
cca44b1b 5310{
7ff120b4 5311 int i;
cca44b1b 5312 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 5313
cca44b1b
JB
5314 /* Instruction is of form:
5315
5316 <op><cond> rd, [rn,] rm, <shift> rs
5317
5318 Rewrite as:
5319
5320 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5321 r0, r1, r2, r3 <- rd, rn, rm, rs
5322 Insn: <op><cond> r0, r1, r2, <shift> r3
5323 Cleanup: tmp5 <- r0
5324 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5325 rd <- tmp5
5326 */
5327
5328 for (i = 0; i < 4; i++)
36073a92 5329 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 5330
36073a92
YQ
5331 rd_val = displaced_read_reg (regs, dsc, rd);
5332 rn_val = displaced_read_reg (regs, dsc, rn);
5333 rm_val = displaced_read_reg (regs, dsc, rm);
5334 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
5335 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5336 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5337 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5338 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5339 dsc->rd = rd;
7ff120b4
YQ
5340 dsc->cleanup = &cleanup_alu_shifted_reg;
5341}
5342
5343static int
5344arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5345 struct regcache *regs,
cfba9872 5346 arm_displaced_step_closure *dsc)
7ff120b4
YQ
5347{
5348 unsigned int op = bits (insn, 21, 24);
5349 int is_mov = (op == 0xd);
5350 unsigned int rd, rn, rm, rs;
5351
5352 if (!insn_references_pc (insn, 0x000fff0ful))
5353 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5354
5355 if (debug_displaced)
5356 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5357 "%.8lx\n", is_mov ? "move" : "ALU",
5358 (unsigned long) insn);
5359
5360 rn = bits (insn, 16, 19);
5361 rm = bits (insn, 0, 3);
5362 rs = bits (insn, 8, 11);
5363 rd = bits (insn, 12, 15);
cca44b1b
JB
5364
5365 if (is_mov)
5366 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5367 else
5368 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5369
7ff120b4 5370 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
5371
5372 return 0;
5373}
5374
5375/* Clean up load instructions. */
5376
5377static void
6e39997a 5378cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5379 arm_displaced_step_closure *dsc)
cca44b1b
JB
5380{
5381 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 5382
36073a92 5383 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 5384 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
5385 rt_val2 = displaced_read_reg (regs, dsc, 1);
5386 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5387
5388 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5389 if (dsc->u.ldst.xfersize > 4)
5390 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5391 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5392 if (!dsc->u.ldst.immed)
5393 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5394
5395 /* Handle register writeback. */
5396 if (dsc->u.ldst.writeback)
5397 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5398 /* Put result in right place. */
5399 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5400 if (dsc->u.ldst.xfersize == 8)
5401 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5402}
5403
5404/* Clean up store instructions. */
5405
5406static void
6e39997a 5407cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5408 arm_displaced_step_closure *dsc)
cca44b1b 5409{
36073a92 5410 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5411
5412 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5413 if (dsc->u.ldst.xfersize > 4)
5414 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5415 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5416 if (!dsc->u.ldst.immed)
5417 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5418 if (!dsc->u.ldst.restore_r4)
5419 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5420
5421 /* Writeback. */
5422 if (dsc->u.ldst.writeback)
5423 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5424}
5425
5426/* Copy "extra" load/store instructions. These are halfword/doubleword
5427 transfers, which have a different encoding to byte/word transfers. */
5428
5429static int
550dc4e2 5430arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
cfba9872 5431 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
5432{
5433 unsigned int op1 = bits (insn, 20, 24);
5434 unsigned int op2 = bits (insn, 5, 6);
5435 unsigned int rt = bits (insn, 12, 15);
5436 unsigned int rn = bits (insn, 16, 19);
5437 unsigned int rm = bits (insn, 0, 3);
5438 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5439 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5440 int immed = (op1 & 0x4) != 0;
5441 int opcode;
5442 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
5443
5444 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 5445 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
5446
5447 if (debug_displaced)
5448 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
550dc4e2 5449 "insn %.8lx\n", unprivileged ? "unprivileged " : "",
cca44b1b
JB
5450 (unsigned long) insn);
5451
5452 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5453
5454 if (opcode < 0)
5455 internal_error (__FILE__, __LINE__,
5456 _("copy_extra_ld_st: instruction decode error"));
5457
36073a92
YQ
5458 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5459 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5460 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5461 if (!immed)
36073a92 5462 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5463
36073a92 5464 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 5465 if (bytesize[opcode] == 8)
36073a92
YQ
5466 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5467 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5468 if (!immed)
36073a92 5469 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5470
5471 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5472 if (bytesize[opcode] == 8)
5473 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5474 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5475 if (!immed)
5476 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5477
5478 dsc->rd = rt;
5479 dsc->u.ldst.xfersize = bytesize[opcode];
5480 dsc->u.ldst.rn = rn;
5481 dsc->u.ldst.immed = immed;
5482 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5483 dsc->u.ldst.restore_r4 = 0;
5484
5485 if (immed)
5486 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5487 ->
5488 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5489 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5490 else
5491 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5492 ->
5493 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5494 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5495
5496 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5497
5498 return 0;
5499}
5500
0f6f04ba 5501/* Copy byte/half word/word loads and stores. */
cca44b1b 5502
7ff120b4 5503static void
0f6f04ba 5504install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5505 arm_displaced_step_closure *dsc, int load,
0f6f04ba
YQ
5506 int immed, int writeback, int size, int usermode,
5507 int rt, int rm, int rn)
cca44b1b 5508{
cca44b1b 5509 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 5510
36073a92
YQ
5511 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5512 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5513 if (!immed)
36073a92 5514 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5515 if (!load)
36073a92 5516 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 5517
36073a92
YQ
5518 rt_val = displaced_read_reg (regs, dsc, rt);
5519 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5520 if (!immed)
36073a92 5521 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5522
5523 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5524 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5525 if (!immed)
5526 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 5527 dsc->rd = rt;
0f6f04ba 5528 dsc->u.ldst.xfersize = size;
cca44b1b
JB
5529 dsc->u.ldst.rn = rn;
5530 dsc->u.ldst.immed = immed;
7ff120b4 5531 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5532
5533 /* To write PC we can do:
5534
494e194e
YQ
5535 Before this sequence of instructions:
5536 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5537 r2 is the Rn value got from dispalced_read_reg.
5538
5539 Insn1: push {pc} Write address of STR instruction + offset on stack
5540 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5541 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5542 = addr(Insn1) + offset - addr(Insn3) - 8
5543 = offset - 16
5544 Insn4: add r4, r4, #8 r4 = offset - 8
5545 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5546 = from + offset
5547 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
5548
5549 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
5550 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5551 of this can be found in Section "Saving from r15" in
5552 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 5553
7ff120b4
YQ
5554 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5555}
5556
34518530
YQ
5557
5558static int
5559thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5560 uint16_t insn2, struct regcache *regs,
cfba9872 5561 arm_displaced_step_closure *dsc, int size)
34518530
YQ
5562{
5563 unsigned int u_bit = bit (insn1, 7);
5564 unsigned int rt = bits (insn2, 12, 15);
5565 int imm12 = bits (insn2, 0, 11);
5566 ULONGEST pc_val;
5567
5568 if (debug_displaced)
5569 fprintf_unfiltered (gdb_stdlog,
5570 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5571 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5572 imm12);
5573
5574 if (!u_bit)
5575 imm12 = -1 * imm12;
5576
5577 /* Rewrite instruction LDR Rt imm12 into:
5578
5579 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5580
5581 LDR R0, R2, R3,
5582
5583 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5584
5585
5586 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5587 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5588 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5589
5590 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5591
5592 pc_val = pc_val & 0xfffffffc;
5593
5594 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5595 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5596
5597 dsc->rd = rt;
5598
5599 dsc->u.ldst.xfersize = size;
5600 dsc->u.ldst.immed = 0;
5601 dsc->u.ldst.writeback = 0;
5602 dsc->u.ldst.restore_r4 = 0;
5603
5604 /* LDR R0, R2, R3 */
5605 dsc->modinsn[0] = 0xf852;
5606 dsc->modinsn[1] = 0x3;
5607 dsc->numinsns = 2;
5608
5609 dsc->cleanup = &cleanup_load;
5610
5611 return 0;
5612}
5613
5614static int
5615thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5616 uint16_t insn2, struct regcache *regs,
cfba9872 5617 arm_displaced_step_closure *dsc,
34518530
YQ
5618 int writeback, int immed)
5619{
5620 unsigned int rt = bits (insn2, 12, 15);
5621 unsigned int rn = bits (insn1, 0, 3);
5622 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5623 /* In LDR (register), there is also a register Rm, which is not allowed to
5624 be PC, so we don't have to check it. */
5625
5626 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5627 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5628 dsc);
5629
5630 if (debug_displaced)
5631 fprintf_unfiltered (gdb_stdlog,
5632 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5633 rt, rn, insn1, insn2);
5634
5635 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5636 0, rt, rm, rn);
5637
5638 dsc->u.ldst.restore_r4 = 0;
5639
5640 if (immed)
5641 /* ldr[b]<cond> rt, [rn, #imm], etc.
5642 ->
5643 ldr[b]<cond> r0, [r2, #imm]. */
5644 {
5645 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5646 dsc->modinsn[1] = insn2 & 0x0fff;
5647 }
5648 else
5649 /* ldr[b]<cond> rt, [rn, rm], etc.
5650 ->
5651 ldr[b]<cond> r0, [r2, r3]. */
5652 {
5653 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5654 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5655 }
5656
5657 dsc->numinsns = 2;
5658
5659 return 0;
5660}
5661
5662
7ff120b4
YQ
5663static int
5664arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5665 struct regcache *regs,
cfba9872 5666 arm_displaced_step_closure *dsc,
0f6f04ba 5667 int load, int size, int usermode)
7ff120b4
YQ
5668{
5669 int immed = !bit (insn, 25);
5670 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5671 unsigned int rt = bits (insn, 12, 15);
5672 unsigned int rn = bits (insn, 16, 19);
5673 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5674
5675 if (!insn_references_pc (insn, 0x000ff00ful))
5676 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5677
5678 if (debug_displaced)
5679 fprintf_unfiltered (gdb_stdlog,
5680 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
5681 load ? (size == 1 ? "ldrb" : "ldr")
5682 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
5683 rt, rn,
5684 (unsigned long) insn);
5685
0f6f04ba
YQ
5686 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5687 usermode, rt, rm, rn);
7ff120b4 5688
bf9f652a 5689 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
5690 {
5691 dsc->u.ldst.restore_r4 = 0;
5692
5693 if (immed)
5694 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5695 ->
5696 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5697 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5698 else
5699 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5700 ->
5701 {ldr,str}[b]<cond> r0, [r2, r3]. */
5702 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5703 }
5704 else
5705 {
5706 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5707 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
5708 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5709 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
5710 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5711 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5712 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5713
5714 /* As above. */
5715 if (immed)
5716 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5717 else
5718 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5719
cca44b1b
JB
5720 dsc->numinsns = 6;
5721 }
5722
5723 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5724
5725 return 0;
5726}
5727
5728/* Cleanup LDM instructions with fully-populated register list. This is an
5729 unfortunate corner case: it's impossible to implement correctly by modifying
5730 the instruction. The issue is as follows: we have an instruction,
5731
5732 ldm rN, {r0-r15}
5733
5734 which we must rewrite to avoid loading PC. A possible solution would be to
5735 do the load in two halves, something like (with suitable cleanup
5736 afterwards):
5737
5738 mov r8, rN
5739 ldm[id][ab] r8!, {r0-r7}
5740 str r7, <temp>
5741 ldm[id][ab] r8, {r7-r14}
5742 <bkpt>
5743
5744 but at present there's no suitable place for <temp>, since the scratch space
5745 is overwritten before the cleanup routine is called. For now, we simply
5746 emulate the instruction. */
5747
5748static void
5749cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5750 arm_displaced_step_closure *dsc)
cca44b1b 5751{
cca44b1b
JB
5752 int inc = dsc->u.block.increment;
5753 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5754 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5755 uint32_t regmask = dsc->u.block.regmask;
5756 int regno = inc ? 0 : 15;
5757 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5758 int exception_return = dsc->u.block.load && dsc->u.block.user
5759 && (regmask & 0x8000) != 0;
36073a92 5760 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5761 int do_transfer = condition_true (dsc->u.block.cond, status);
5762 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5763
5764 if (!do_transfer)
5765 return;
5766
5767 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5768 sensible we can do here. Complain loudly. */
5769 if (exception_return)
5770 error (_("Cannot single-step exception return"));
5771
5772 /* We don't handle any stores here for now. */
5773 gdb_assert (dsc->u.block.load != 0);
5774
5775 if (debug_displaced)
5776 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5777 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5778 dsc->u.block.increment ? "inc" : "dec",
5779 dsc->u.block.before ? "before" : "after");
5780
5781 while (regmask)
5782 {
5783 uint32_t memword;
5784
5785 if (inc)
bf9f652a 5786 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
5787 regno++;
5788 else
5789 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5790 regno--;
5791
5792 xfer_addr += bump_before;
5793
5794 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5795 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5796
5797 xfer_addr += bump_after;
5798
5799 regmask &= ~(1 << regno);
5800 }
5801
5802 if (dsc->u.block.writeback)
5803 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5804 CANNOT_WRITE_PC);
5805}
5806
5807/* Clean up an STM which included the PC in the register list. */
5808
5809static void
5810cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 5811 arm_displaced_step_closure *dsc)
cca44b1b 5812{
36073a92 5813 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5814 int store_executed = condition_true (dsc->u.block.cond, status);
5815 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5816 CORE_ADDR stm_insn_addr;
5817 uint32_t pc_val;
5818 long offset;
5819 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5820
5821 /* If condition code fails, there's nothing else to do. */
5822 if (!store_executed)
5823 return;
5824
5825 if (dsc->u.block.increment)
5826 {
5827 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5828
5829 if (dsc->u.block.before)
5830 pc_stored_at += 4;
5831 }
5832 else
5833 {
5834 pc_stored_at = dsc->u.block.xfer_addr;
5835
5836 if (dsc->u.block.before)
5837 pc_stored_at -= 4;
5838 }
5839
5840 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5841 stm_insn_addr = dsc->scratch_base;
5842 offset = pc_val - stm_insn_addr;
5843
5844 if (debug_displaced)
5845 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5846 "STM instruction\n", offset);
5847
5848 /* Rewrite the stored PC to the proper value for the non-displaced original
5849 instruction. */
5850 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5851 dsc->insn_addr + offset);
5852}
5853
5854/* Clean up an LDM which includes the PC in the register list. We clumped all
5855 the registers in the transferred list into a contiguous range r0...rX (to
5856 avoid loading PC directly and losing control of the debugged program), so we
5857 must undo that here. */
5858
5859static void
6e39997a 5860cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b 5861 struct regcache *regs,
cfba9872 5862 arm_displaced_step_closure *dsc)
cca44b1b 5863{
36073a92 5864 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 5865 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 5866 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
5867 unsigned int regs_loaded = bitcount (mask);
5868 unsigned int num_to_shuffle = regs_loaded, clobbered;
5869
5870 /* The method employed here will fail if the register list is fully populated
5871 (we need to avoid loading PC directly). */
5872 gdb_assert (num_to_shuffle < 16);
5873
5874 if (!load_executed)
5875 return;
5876
5877 clobbered = (1 << num_to_shuffle) - 1;
5878
5879 while (num_to_shuffle > 0)
5880 {
5881 if ((mask & (1 << write_reg)) != 0)
5882 {
5883 unsigned int read_reg = num_to_shuffle - 1;
5884
5885 if (read_reg != write_reg)
5886 {
36073a92 5887 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
5888 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5889 if (debug_displaced)
5890 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5891 "loaded register r%d to r%d\n"), read_reg,
5892 write_reg);
5893 }
5894 else if (debug_displaced)
5895 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5896 "r%d already in the right place\n"),
5897 write_reg);
5898
5899 clobbered &= ~(1 << write_reg);
5900
5901 num_to_shuffle--;
5902 }
5903
5904 write_reg--;
5905 }
5906
5907 /* Restore any registers we scribbled over. */
5908 for (write_reg = 0; clobbered != 0; write_reg++)
5909 {
5910 if ((clobbered & (1 << write_reg)) != 0)
5911 {
5912 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5913 CANNOT_WRITE_PC);
5914 if (debug_displaced)
5915 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5916 "clobbered register r%d\n"), write_reg);
5917 clobbered &= ~(1 << write_reg);
5918 }
5919 }
5920
5921 /* Perform register writeback manually. */
5922 if (dsc->u.block.writeback)
5923 {
5924 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5925
5926 if (dsc->u.block.increment)
5927 new_rn_val += regs_loaded * 4;
5928 else
5929 new_rn_val -= regs_loaded * 4;
5930
5931 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
5932 CANNOT_WRITE_PC);
5933 }
5934}
5935
5936/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
5937 in user-level code (in particular exception return, ldm rn, {...pc}^). */
5938
5939static int
7ff120b4
YQ
5940arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
5941 struct regcache *regs,
cfba9872 5942 arm_displaced_step_closure *dsc)
cca44b1b
JB
5943{
5944 int load = bit (insn, 20);
5945 int user = bit (insn, 22);
5946 int increment = bit (insn, 23);
5947 int before = bit (insn, 24);
5948 int writeback = bit (insn, 21);
5949 int rn = bits (insn, 16, 19);
cca44b1b 5950
0963b4bd
MS
5951 /* Block transfers which don't mention PC can be run directly
5952 out-of-line. */
bf9f652a 5953 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 5954 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 5955
bf9f652a 5956 if (rn == ARM_PC_REGNUM)
cca44b1b 5957 {
0963b4bd
MS
5958 warning (_("displaced: Unpredictable LDM or STM with "
5959 "base register r15"));
7ff120b4 5960 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
5961 }
5962
5963 if (debug_displaced)
5964 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
5965 "%.8lx\n", (unsigned long) insn);
5966
36073a92 5967 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
5968 dsc->u.block.rn = rn;
5969
5970 dsc->u.block.load = load;
5971 dsc->u.block.user = user;
5972 dsc->u.block.increment = increment;
5973 dsc->u.block.before = before;
5974 dsc->u.block.writeback = writeback;
5975 dsc->u.block.cond = bits (insn, 28, 31);
5976
5977 dsc->u.block.regmask = insn & 0xffff;
5978
5979 if (load)
5980 {
5981 if ((insn & 0xffff) == 0xffff)
5982 {
5983 /* LDM with a fully-populated register list. This case is
5984 particularly tricky. Implement for now by fully emulating the
5985 instruction (which might not behave perfectly in all cases, but
5986 these instructions should be rare enough for that not to matter
5987 too much). */
5988 dsc->modinsn[0] = ARM_NOP;
5989
5990 dsc->cleanup = &cleanup_block_load_all;
5991 }
5992 else
5993 {
5994 /* LDM of a list of registers which includes PC. Implement by
5995 rewriting the list of registers to be transferred into a
5996 contiguous chunk r0...rX before doing the transfer, then shuffling
5997 registers into the correct places in the cleanup routine. */
5998 unsigned int regmask = insn & 0xffff;
bec2ab5a
SM
5999 unsigned int num_in_list = bitcount (regmask), new_regmask;
6000 unsigned int i;
cca44b1b
JB
6001
6002 for (i = 0; i < num_in_list; i++)
36073a92 6003 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
6004
6005 /* Writeback makes things complicated. We need to avoid clobbering
6006 the base register with one of the registers in our modified
6007 register list, but just using a different register can't work in
6008 all cases, e.g.:
6009
6010 ldm r14!, {r0-r13,pc}
6011
6012 which would need to be rewritten as:
6013
6014 ldm rN!, {r0-r14}
6015
6016 but that can't work, because there's no free register for N.
6017
6018 Solve this by turning off the writeback bit, and emulating
6019 writeback manually in the cleanup routine. */
6020
6021 if (writeback)
6022 insn &= ~(1 << 21);
6023
6024 new_regmask = (1 << num_in_list) - 1;
6025
6026 if (debug_displaced)
6027 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6028 "{..., pc}: original reg list %.4x, modified "
6029 "list %.4x\n"), rn, writeback ? "!" : "",
6030 (int) insn & 0xffff, new_regmask);
6031
6032 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6033
6034 dsc->cleanup = &cleanup_block_load_pc;
6035 }
6036 }
6037 else
6038 {
6039 /* STM of a list of registers which includes PC. Run the instruction
6040 as-is, but out of line: this will store the wrong value for the PC,
6041 so we must manually fix up the memory in the cleanup routine.
6042 Doing things this way has the advantage that we can auto-detect
6043 the offset of the PC write (which is architecture-dependent) in
6044 the cleanup routine. */
6045 dsc->modinsn[0] = insn;
6046
6047 dsc->cleanup = &cleanup_block_store_pc;
6048 }
6049
6050 return 0;
6051}
6052
34518530
YQ
6053static int
6054thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6055 struct regcache *regs,
cfba9872 6056 arm_displaced_step_closure *dsc)
cca44b1b 6057{
34518530
YQ
6058 int rn = bits (insn1, 0, 3);
6059 int load = bit (insn1, 4);
6060 int writeback = bit (insn1, 5);
cca44b1b 6061
34518530
YQ
6062 /* Block transfers which don't mention PC can be run directly
6063 out-of-line. */
6064 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6065 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 6066
34518530
YQ
6067 if (rn == ARM_PC_REGNUM)
6068 {
6069 warning (_("displaced: Unpredictable LDM or STM with "
6070 "base register r15"));
6071 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6072 "unpredictable ldm/stm", dsc);
6073 }
cca44b1b
JB
6074
6075 if (debug_displaced)
34518530
YQ
6076 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6077 "%.4x%.4x\n", insn1, insn2);
cca44b1b 6078
34518530
YQ
6079 /* Clear bit 13, since it should be always zero. */
6080 dsc->u.block.regmask = (insn2 & 0xdfff);
6081 dsc->u.block.rn = rn;
cca44b1b 6082
34518530
YQ
6083 dsc->u.block.load = load;
6084 dsc->u.block.user = 0;
6085 dsc->u.block.increment = bit (insn1, 7);
6086 dsc->u.block.before = bit (insn1, 8);
6087 dsc->u.block.writeback = writeback;
6088 dsc->u.block.cond = INST_AL;
6089 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 6090
34518530
YQ
6091 if (load)
6092 {
6093 if (dsc->u.block.regmask == 0xffff)
6094 {
6095 /* This branch is impossible to happen. */
6096 gdb_assert (0);
6097 }
6098 else
6099 {
6100 unsigned int regmask = dsc->u.block.regmask;
bec2ab5a
SM
6101 unsigned int num_in_list = bitcount (regmask), new_regmask;
6102 unsigned int i;
34518530
YQ
6103
6104 for (i = 0; i < num_in_list; i++)
6105 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6106
6107 if (writeback)
6108 insn1 &= ~(1 << 5);
6109
6110 new_regmask = (1 << num_in_list) - 1;
6111
6112 if (debug_displaced)
6113 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6114 "{..., pc}: original reg list %.4x, modified "
6115 "list %.4x\n"), rn, writeback ? "!" : "",
6116 (int) dsc->u.block.regmask, new_regmask);
6117
6118 dsc->modinsn[0] = insn1;
6119 dsc->modinsn[1] = (new_regmask & 0xffff);
6120 dsc->numinsns = 2;
6121
6122 dsc->cleanup = &cleanup_block_load_pc;
6123 }
6124 }
6125 else
6126 {
6127 dsc->modinsn[0] = insn1;
6128 dsc->modinsn[1] = insn2;
6129 dsc->numinsns = 2;
6130 dsc->cleanup = &cleanup_block_store_pc;
6131 }
6132 return 0;
6133}
6134
d9311bfa
AT
6135/* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6136 This is used to avoid a dependency on BFD's bfd_endian enum. */
6137
6138ULONGEST
6139arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6140 int byte_order)
6141{
5f2dfcfd
AT
6142 return read_memory_unsigned_integer (memaddr, len,
6143 (enum bfd_endian) byte_order);
d9311bfa
AT
6144}
6145
6146/* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6147
6148CORE_ADDR
6149arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6150 CORE_ADDR val)
6151{
ac7936df 6152 return gdbarch_addr_bits_remove (self->regcache->arch (), val);
d9311bfa
AT
6153}
6154
6155/* Wrapper over syscall_next_pc for use in get_next_pcs. */
6156
e7cf25a8 6157static CORE_ADDR
553cb527 6158arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
d9311bfa 6159{
d9311bfa
AT
6160 return 0;
6161}
6162
6163/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6164
6165int
6166arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6167{
6168 return arm_is_thumb (self->regcache);
6169}
6170
6171/* single_step() is called just before we want to resume the inferior,
6172 if we want to single-step it but there is no hardware or kernel
6173 single-step support. We find the target of the coming instructions
6174 and breakpoint them. */
6175
a0ff9e1a 6176std::vector<CORE_ADDR>
f5ea389a 6177arm_software_single_step (struct regcache *regcache)
d9311bfa 6178{
ac7936df 6179 struct gdbarch *gdbarch = regcache->arch ();
d9311bfa 6180 struct arm_get_next_pcs next_pcs_ctx;
d9311bfa
AT
6181
6182 arm_get_next_pcs_ctor (&next_pcs_ctx,
6183 &arm_get_next_pcs_ops,
6184 gdbarch_byte_order (gdbarch),
6185 gdbarch_byte_order_for_code (gdbarch),
1b451dda 6186 0,
d9311bfa
AT
6187 regcache);
6188
a0ff9e1a 6189 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
d9311bfa 6190
a0ff9e1a
SM
6191 for (CORE_ADDR &pc_ref : next_pcs)
6192 pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
d9311bfa 6193
93f9a11f 6194 return next_pcs;
d9311bfa
AT
6195}
6196
34518530
YQ
6197/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6198 for Linux, where some SVC instructions must be treated specially. */
6199
6200static void
6201cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6202 arm_displaced_step_closure *dsc)
34518530
YQ
6203{
6204 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6205
6206 if (debug_displaced)
6207 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6208 "%.8lx\n", (unsigned long) resume_addr);
6209
6210 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6211}
6212
6213
6214/* Common copy routine for svc instruciton. */
6215
6216static int
6217install_svc (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6218 arm_displaced_step_closure *dsc)
34518530
YQ
6219{
6220 /* Preparation: none.
6221 Insn: unmodified svc.
6222 Cleanup: pc <- insn_addr + insn_size. */
6223
6224 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6225 instruction. */
6226 dsc->wrote_to_pc = 1;
6227
6228 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6229 if (dsc->u.svc.copy_svc_os)
6230 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6231 else
6232 {
6233 dsc->cleanup = &cleanup_svc;
6234 return 0;
6235 }
34518530
YQ
6236}
6237
6238static int
6239arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6240 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
6241{
6242
6243 if (debug_displaced)
6244 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6245 (unsigned long) insn);
6246
6247 dsc->modinsn[0] = insn;
6248
6249 return install_svc (gdbarch, regs, dsc);
6250}
6251
6252static int
6253thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
cfba9872 6254 struct regcache *regs, arm_displaced_step_closure *dsc)
34518530
YQ
6255{
6256
6257 if (debug_displaced)
6258 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6259 insn);
bd18283a 6260
34518530
YQ
6261 dsc->modinsn[0] = insn;
6262
6263 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6264}
6265
6266/* Copy undefined instructions. */
6267
6268static int
7ff120b4 6269arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6270 arm_displaced_step_closure *dsc)
cca44b1b
JB
6271{
6272 if (debug_displaced)
0963b4bd
MS
6273 fprintf_unfiltered (gdb_stdlog,
6274 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6275 (unsigned long) insn);
6276
6277 dsc->modinsn[0] = insn;
6278
6279 return 0;
6280}
6281
34518530
YQ
6282static int
6283thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
cfba9872 6284 arm_displaced_step_closure *dsc)
34518530
YQ
6285{
6286
6287 if (debug_displaced)
6288 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6289 "%.4x %.4x\n", (unsigned short) insn1,
6290 (unsigned short) insn2);
6291
6292 dsc->modinsn[0] = insn1;
6293 dsc->modinsn[1] = insn2;
6294 dsc->numinsns = 2;
6295
6296 return 0;
6297}
6298
cca44b1b
JB
6299/* Copy unpredictable instructions. */
6300
6301static int
7ff120b4 6302arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6303 arm_displaced_step_closure *dsc)
cca44b1b
JB
6304{
6305 if (debug_displaced)
6306 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6307 "%.8lx\n", (unsigned long) insn);
6308
6309 dsc->modinsn[0] = insn;
6310
6311 return 0;
6312}
6313
6314/* The decode_* functions are instruction decoding helpers. They mostly follow
6315 the presentation in the ARM ARM. */
6316
6317static int
7ff120b4
YQ
6318arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6319 struct regcache *regs,
cfba9872 6320 arm_displaced_step_closure *dsc)
cca44b1b
JB
6321{
6322 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6323 unsigned int rn = bits (insn, 16, 19);
6324
2f924de6 6325 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0x1) == 0x0)
7ff120b4 6326 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
2f924de6 6327 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0x1) == 0x1)
7ff120b4 6328 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6329 else if ((op1 & 0x60) == 0x20)
7ff120b4 6330 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6331 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6332 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6333 dsc);
cca44b1b 6334 else if ((op1 & 0x77) == 0x41)
7ff120b4 6335 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6336 else if ((op1 & 0x77) == 0x45)
7ff120b4 6337 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6338 else if ((op1 & 0x77) == 0x51)
6339 {
6340 if (rn != 0xf)
7ff120b4 6341 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6342 else
7ff120b4 6343 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6344 }
6345 else if ((op1 & 0x77) == 0x55)
7ff120b4 6346 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6347 else if (op1 == 0x57)
6348 switch (op2)
6349 {
7ff120b4
YQ
6350 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6351 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6352 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6353 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6354 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6355 }
6356 else if ((op1 & 0x63) == 0x43)
7ff120b4 6357 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6358 else if ((op2 & 0x1) == 0x0)
6359 switch (op1 & ~0x80)
6360 {
6361 case 0x61:
7ff120b4 6362 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6363 case 0x65:
7ff120b4 6364 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6365 case 0x71: case 0x75:
6366 /* pld/pldw reg. */
7ff120b4 6367 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6368 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6369 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6370 default:
7ff120b4 6371 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6372 }
6373 else
7ff120b4 6374 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6375}
6376
6377static int
7ff120b4
YQ
6378arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6379 struct regcache *regs,
cfba9872 6380 arm_displaced_step_closure *dsc)
cca44b1b
JB
6381{
6382 if (bit (insn, 27) == 0)
7ff120b4 6383 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6384 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6385 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6386 {
6387 case 0x0: case 0x2:
7ff120b4 6388 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6389
6390 case 0x1: case 0x3:
7ff120b4 6391 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6392
6393 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6394 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6395
6396 case 0x8:
6397 switch ((insn & 0xe00000) >> 21)
6398 {
6399 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6400 /* stc/stc2. */
7ff120b4 6401 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6402
6403 case 0x2:
7ff120b4 6404 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6405
6406 default:
7ff120b4 6407 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6408 }
6409
6410 case 0x9:
6411 {
6412 int rn_f = (bits (insn, 16, 19) == 0xf);
6413 switch ((insn & 0xe00000) >> 21)
6414 {
6415 case 0x1: case 0x3:
6416 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6417 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6418 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6419
6420 case 0x2:
7ff120b4 6421 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6422
6423 case 0x4: case 0x5: case 0x6: case 0x7:
6424 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6425 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6426 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6427
6428 default:
7ff120b4 6429 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6430 }
6431 }
6432
6433 case 0xa:
7ff120b4 6434 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6435
6436 case 0xb:
6437 if (bits (insn, 16, 19) == 0xf)
6438 /* ldc/ldc2 lit. */
7ff120b4 6439 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6440 else
7ff120b4 6441 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6442
6443 case 0xc:
6444 if (bit (insn, 4))
7ff120b4 6445 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6446 else
7ff120b4 6447 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6448
6449 case 0xd:
6450 if (bit (insn, 4))
7ff120b4 6451 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6452 else
7ff120b4 6453 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6454
6455 default:
7ff120b4 6456 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6457 }
6458}
6459
6460/* Decode miscellaneous instructions in dp/misc encoding space. */
6461
6462static int
7ff120b4
YQ
6463arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6464 struct regcache *regs,
cfba9872 6465 arm_displaced_step_closure *dsc)
cca44b1b
JB
6466{
6467 unsigned int op2 = bits (insn, 4, 6);
6468 unsigned int op = bits (insn, 21, 22);
cca44b1b
JB
6469
6470 switch (op2)
6471 {
6472 case 0x0:
7ff120b4 6473 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6474
6475 case 0x1:
6476 if (op == 0x1) /* bx. */
7ff120b4 6477 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6478 else if (op == 0x3)
7ff120b4 6479 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6480 else
7ff120b4 6481 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6482
6483 case 0x2:
6484 if (op == 0x1)
6485 /* Not really supported. */
7ff120b4 6486 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6487 else
7ff120b4 6488 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6489
6490 case 0x3:
6491 if (op == 0x1)
7ff120b4 6492 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6493 regs, dsc); /* blx register. */
cca44b1b 6494 else
7ff120b4 6495 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6496
6497 case 0x5:
7ff120b4 6498 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6499
6500 case 0x7:
6501 if (op == 0x1)
7ff120b4 6502 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6503 else if (op == 0x3)
6504 /* Not really supported. */
7ff120b4 6505 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
86a73007 6506 /* Fall through. */
cca44b1b
JB
6507
6508 default:
7ff120b4 6509 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6510 }
6511}
6512
6513static int
7ff120b4
YQ
6514arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6515 struct regcache *regs,
cfba9872 6516 arm_displaced_step_closure *dsc)
cca44b1b
JB
6517{
6518 if (bit (insn, 25))
6519 switch (bits (insn, 20, 24))
6520 {
6521 case 0x10:
7ff120b4 6522 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6523
6524 case 0x14:
7ff120b4 6525 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6526
6527 case 0x12: case 0x16:
7ff120b4 6528 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6529
6530 default:
7ff120b4 6531 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6532 }
6533 else
6534 {
6535 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6536
6537 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6538 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6539 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6540 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6541 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6542 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6543 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6544 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6545 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6546 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6547 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6548 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b 6549 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
550dc4e2 6550 /* 2nd arg means "unprivileged". */
7ff120b4
YQ
6551 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6552 dsc);
cca44b1b
JB
6553 }
6554
6555 /* Should be unreachable. */
6556 return 1;
6557}
6558
6559static int
7ff120b4
YQ
6560arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6561 struct regcache *regs,
cfba9872 6562 arm_displaced_step_closure *dsc)
cca44b1b
JB
6563{
6564 int a = bit (insn, 25), b = bit (insn, 4);
6565 uint32_t op1 = bits (insn, 20, 24);
cca44b1b
JB
6566
6567 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6568 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6569 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6570 else if ((!a && (op1 & 0x17) == 0x02)
6571 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6572 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6573 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6574 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6575 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6576 else if ((!a && (op1 & 0x17) == 0x03)
6577 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6578 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6579 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6580 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6581 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6582 else if ((!a && (op1 & 0x17) == 0x06)
6583 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6584 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6585 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6586 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6587 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6588 else if ((!a && (op1 & 0x17) == 0x07)
6589 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6590 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6591
6592 /* Should be unreachable. */
6593 return 1;
6594}
6595
6596static int
7ff120b4 6597arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6598 arm_displaced_step_closure *dsc)
cca44b1b
JB
6599{
6600 switch (bits (insn, 20, 24))
6601 {
6602 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6603 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6604
6605 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6606 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6607
6608 case 0x08: case 0x09: case 0x0a: case 0x0b:
6609 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6610 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6611 "decode/pack/unpack/saturate/reverse", dsc);
6612
6613 case 0x18:
6614 if (bits (insn, 5, 7) == 0) /* op2. */
6615 {
6616 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6617 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6618 else
7ff120b4 6619 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6620 }
6621 else
7ff120b4 6622 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6623
6624 case 0x1a: case 0x1b:
6625 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6626 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6627 else
7ff120b4 6628 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6629
6630 case 0x1c: case 0x1d:
6631 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6632 {
6633 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6634 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6635 else
7ff120b4 6636 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6637 }
6638 else
7ff120b4 6639 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6640
6641 case 0x1e: case 0x1f:
6642 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6643 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6644 else
7ff120b4 6645 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6646 }
6647
6648 /* Should be unreachable. */
6649 return 1;
6650}
6651
6652static int
615234c1 6653arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7ff120b4 6654 struct regcache *regs,
cfba9872 6655 arm_displaced_step_closure *dsc)
cca44b1b
JB
6656{
6657 if (bit (insn, 25))
7ff120b4 6658 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6659 else
7ff120b4 6660 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6661}
6662
6663static int
7ff120b4
YQ
6664arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6665 struct regcache *regs,
cfba9872 6666 arm_displaced_step_closure *dsc)
cca44b1b
JB
6667{
6668 unsigned int opcode = bits (insn, 20, 24);
6669
6670 switch (opcode)
6671 {
6672 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6673 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6674
6675 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6676 case 0x12: case 0x16:
7ff120b4 6677 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6678
6679 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6680 case 0x13: case 0x17:
7ff120b4 6681 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6682
6683 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6684 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6685 /* Note: no writeback for these instructions. Bit 25 will always be
6686 zero though (via caller), so the following works OK. */
7ff120b4 6687 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6688 }
6689
6690 /* Should be unreachable. */
6691 return 1;
6692}
6693
34518530
YQ
6694/* Decode shifted register instructions. */
6695
6696static int
6697thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6698 uint16_t insn2, struct regcache *regs,
cfba9872 6699 arm_displaced_step_closure *dsc)
34518530
YQ
6700{
6701 /* PC is only allowed to be used in instruction MOV. */
6702
6703 unsigned int op = bits (insn1, 5, 8);
6704 unsigned int rn = bits (insn1, 0, 3);
6705
6706 if (op == 0x2 && rn == 0xf) /* MOV */
6707 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6708 else
6709 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6710 "dp (shift reg)", dsc);
6711}
6712
6713
6714/* Decode extension register load/store. Exactly the same as
6715 arm_decode_ext_reg_ld_st. */
6716
6717static int
6718thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6719 uint16_t insn2, struct regcache *regs,
cfba9872 6720 arm_displaced_step_closure *dsc)
34518530
YQ
6721{
6722 unsigned int opcode = bits (insn1, 4, 8);
6723
6724 switch (opcode)
6725 {
6726 case 0x04: case 0x05:
6727 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6728 "vfp/neon vmov", dsc);
6729
6730 case 0x08: case 0x0c: /* 01x00 */
6731 case 0x0a: case 0x0e: /* 01x10 */
6732 case 0x12: case 0x16: /* 10x10 */
6733 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6734 "vfp/neon vstm/vpush", dsc);
6735
6736 case 0x09: case 0x0d: /* 01x01 */
6737 case 0x0b: case 0x0f: /* 01x11 */
6738 case 0x13: case 0x17: /* 10x11 */
6739 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6740 "vfp/neon vldm/vpop", dsc);
6741
6742 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6743 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6744 "vstr", dsc);
6745 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6746 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6747 }
6748
6749 /* Should be unreachable. */
6750 return 1;
6751}
6752
cca44b1b 6753static int
12545665 6754arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn,
cfba9872 6755 struct regcache *regs, arm_displaced_step_closure *dsc)
cca44b1b
JB
6756{
6757 unsigned int op1 = bits (insn, 20, 25);
6758 int op = bit (insn, 4);
6759 unsigned int coproc = bits (insn, 8, 11);
cca44b1b
JB
6760
6761 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6762 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6763 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6764 && (coproc & 0xe) != 0xa)
6765 /* stc/stc2. */
7ff120b4 6766 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6767 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6768 && (coproc & 0xe) != 0xa)
6769 /* ldc/ldc2 imm/lit. */
7ff120b4 6770 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6771 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6772 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6773 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6774 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6775 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6776 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6777 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6778 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6779 else if ((op1 & 0x30) == 0x20 && !op)
6780 {
6781 if ((coproc & 0xe) == 0xa)
7ff120b4 6782 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6783 else
7ff120b4 6784 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6785 }
6786 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6787 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6788 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6789 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6790 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6791 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6792 else if ((op1 & 0x30) == 0x30)
7ff120b4 6793 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6794 else
7ff120b4 6795 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6796}
6797
34518530
YQ
6798static int
6799thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6800 uint16_t insn2, struct regcache *regs,
cfba9872 6801 arm_displaced_step_closure *dsc)
34518530
YQ
6802{
6803 unsigned int coproc = bits (insn2, 8, 11);
34518530
YQ
6804 unsigned int bit_5_8 = bits (insn1, 5, 8);
6805 unsigned int bit_9 = bit (insn1, 9);
6806 unsigned int bit_4 = bit (insn1, 4);
34518530
YQ
6807
6808 if (bit_9 == 0)
6809 {
6810 if (bit_5_8 == 2)
6811 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6812 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6813 dsc);
6814 else if (bit_5_8 == 0) /* UNDEFINED. */
6815 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6816 else
6817 {
6818 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6819 if ((coproc & 0xe) == 0xa)
6820 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6821 dsc);
6822 else /* coproc is not 101x. */
6823 {
6824 if (bit_4 == 0) /* STC/STC2. */
6825 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6826 "stc/stc2", dsc);
6827 else /* LDC/LDC2 {literal, immeidate}. */
6828 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6829 regs, dsc);
6830 }
6831 }
6832 }
6833 else
6834 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6835
6836 return 0;
6837}
6838
6839static void
6840install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6841 arm_displaced_step_closure *dsc, int rd)
34518530
YQ
6842{
6843 /* ADR Rd, #imm
6844
6845 Rewrite as:
6846
6847 Preparation: Rd <- PC
6848 Insn: ADD Rd, #imm
6849 Cleanup: Null.
6850 */
6851
6852 /* Rd <- PC */
6853 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6854 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6855}
6856
6857static int
6858thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 6859 arm_displaced_step_closure *dsc,
34518530
YQ
6860 int rd, unsigned int imm)
6861{
6862
6863 /* Encoding T2: ADDS Rd, #imm */
6864 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6865
6866 install_pc_relative (gdbarch, regs, dsc, rd);
6867
6868 return 0;
6869}
6870
6871static int
6872thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6873 struct regcache *regs,
cfba9872 6874 arm_displaced_step_closure *dsc)
34518530
YQ
6875{
6876 unsigned int rd = bits (insn, 8, 10);
6877 unsigned int imm8 = bits (insn, 0, 7);
6878
6879 if (debug_displaced)
6880 fprintf_unfiltered (gdb_stdlog,
6881 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6882 rd, imm8, insn);
6883
6884 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6885}
6886
6887static int
6888thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6889 uint16_t insn2, struct regcache *regs,
cfba9872 6890 arm_displaced_step_closure *dsc)
34518530
YQ
6891{
6892 unsigned int rd = bits (insn2, 8, 11);
6893 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6894 extract raw immediate encoding rather than computing immediate. When
6895 generating ADD or SUB instruction, we can simply perform OR operation to
6896 set immediate into ADD. */
6897 unsigned int imm_3_8 = insn2 & 0x70ff;
6898 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6899
6900 if (debug_displaced)
6901 fprintf_unfiltered (gdb_stdlog,
6902 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6903 rd, imm_i, imm_3_8, insn1, insn2);
6904
6905 if (bit (insn1, 7)) /* Encoding T2 */
6906 {
6907 /* Encoding T3: SUB Rd, Rd, #imm */
6908 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6909 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6910 }
6911 else /* Encoding T3 */
6912 {
6913 /* Encoding T3: ADD Rd, Rd, #imm */
6914 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6915 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6916 }
6917 dsc->numinsns = 2;
6918
6919 install_pc_relative (gdbarch, regs, dsc, rd);
6920
6921 return 0;
6922}
6923
6924static int
615234c1 6925thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
34518530 6926 struct regcache *regs,
cfba9872 6927 arm_displaced_step_closure *dsc)
34518530
YQ
6928{
6929 unsigned int rt = bits (insn1, 8, 10);
6930 unsigned int pc;
6931 int imm8 = (bits (insn1, 0, 7) << 2);
34518530
YQ
6932
6933 /* LDR Rd, #imm8
6934
6935 Rwrite as:
6936
6937 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6938
6939 Insn: LDR R0, [R2, R3];
6940 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6941
6942 if (debug_displaced)
6943 fprintf_unfiltered (gdb_stdlog,
6944 "displaced: copying thumb ldr r%d [pc #%d]\n"
6945 , rt, imm8);
6946
6947 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6948 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6949 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6950 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6951 /* The assembler calculates the required value of the offset from the
6952 Align(PC,4) value of this instruction to the label. */
6953 pc = pc & 0xfffffffc;
6954
6955 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6956 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6957
6958 dsc->rd = rt;
6959 dsc->u.ldst.xfersize = 4;
6960 dsc->u.ldst.rn = 0;
6961 dsc->u.ldst.immed = 0;
6962 dsc->u.ldst.writeback = 0;
6963 dsc->u.ldst.restore_r4 = 0;
6964
6965 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6966
6967 dsc->cleanup = &cleanup_load;
6968
6969 return 0;
6970}
6971
6972/* Copy Thumb cbnz/cbz insruction. */
6973
6974static int
6975thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6976 struct regcache *regs,
cfba9872 6977 arm_displaced_step_closure *dsc)
34518530
YQ
6978{
6979 int non_zero = bit (insn1, 11);
6980 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6981 CORE_ADDR from = dsc->insn_addr;
6982 int rn = bits (insn1, 0, 2);
6983 int rn_val = displaced_read_reg (regs, dsc, rn);
6984
6985 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6986 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6987 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6988 condition is false, let it be, cleanup_branch will do nothing. */
6989 if (dsc->u.branch.cond)
6990 {
6991 dsc->u.branch.cond = INST_AL;
6992 dsc->u.branch.dest = from + 4 + imm5;
6993 }
6994 else
6995 dsc->u.branch.dest = from + 2;
6996
6997 dsc->u.branch.link = 0;
6998 dsc->u.branch.exchange = 0;
6999
7000 if (debug_displaced)
7001 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
7002 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
7003 rn, rn_val, insn1, dsc->u.branch.dest);
7004
7005 dsc->modinsn[0] = THUMB_NOP;
7006
7007 dsc->cleanup = &cleanup_branch;
7008 return 0;
7009}
7010
7011/* Copy Table Branch Byte/Halfword */
7012static int
7013thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7014 uint16_t insn2, struct regcache *regs,
cfba9872 7015 arm_displaced_step_closure *dsc)
34518530
YQ
7016{
7017 ULONGEST rn_val, rm_val;
7018 int is_tbh = bit (insn2, 4);
7019 CORE_ADDR halfwords = 0;
7020 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7021
7022 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7023 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7024
7025 if (is_tbh)
7026 {
7027 gdb_byte buf[2];
7028
7029 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7030 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7031 }
7032 else
7033 {
7034 gdb_byte buf[1];
7035
7036 target_read_memory (rn_val + rm_val, buf, 1);
7037 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7038 }
7039
7040 if (debug_displaced)
7041 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7042 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7043 (unsigned int) rn_val, (unsigned int) rm_val,
7044 (unsigned int) halfwords);
7045
7046 dsc->u.branch.cond = INST_AL;
7047 dsc->u.branch.link = 0;
7048 dsc->u.branch.exchange = 0;
7049 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7050
7051 dsc->cleanup = &cleanup_branch;
7052
7053 return 0;
7054}
7055
7056static void
7057cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
cfba9872 7058 arm_displaced_step_closure *dsc)
34518530
YQ
7059{
7060 /* PC <- r7 */
7061 int val = displaced_read_reg (regs, dsc, 7);
7062 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7063
7064 /* r7 <- r8 */
7065 val = displaced_read_reg (regs, dsc, 8);
7066 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7067
7068 /* r8 <- tmp[0] */
7069 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7070
7071}
7072
7073static int
615234c1 7074thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
34518530 7075 struct regcache *regs,
cfba9872 7076 arm_displaced_step_closure *dsc)
34518530
YQ
7077{
7078 dsc->u.block.regmask = insn1 & 0x00ff;
7079
7080 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7081 to :
7082
7083 (1) register list is full, that is, r0-r7 are used.
7084 Prepare: tmp[0] <- r8
7085
7086 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7087 MOV r8, r7; Move value of r7 to r8;
7088 POP {r7}; Store PC value into r7.
7089
7090 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7091
7092 (2) register list is not full, supposing there are N registers in
7093 register list (except PC, 0 <= N <= 7).
7094 Prepare: for each i, 0 - N, tmp[i] <- ri.
7095
7096 POP {r0, r1, ...., rN};
7097
7098 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7099 from tmp[] properly.
7100 */
7101 if (debug_displaced)
7102 fprintf_unfiltered (gdb_stdlog,
7103 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7104 dsc->u.block.regmask, insn1);
7105
7106 if (dsc->u.block.regmask == 0xff)
7107 {
7108 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7109
7110 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7111 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7112 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7113
7114 dsc->numinsns = 3;
7115 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7116 }
7117 else
7118 {
7119 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
bec2ab5a
SM
7120 unsigned int i;
7121 unsigned int new_regmask;
34518530
YQ
7122
7123 for (i = 0; i < num_in_list + 1; i++)
7124 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7125
7126 new_regmask = (1 << (num_in_list + 1)) - 1;
7127
7128 if (debug_displaced)
7129 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7130 "{..., pc}: original reg list %.4x,"
7131 " modified list %.4x\n"),
7132 (int) dsc->u.block.regmask, new_regmask);
7133
7134 dsc->u.block.regmask |= 0x8000;
7135 dsc->u.block.writeback = 0;
7136 dsc->u.block.cond = INST_AL;
7137
7138 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7139
7140 dsc->cleanup = &cleanup_block_load_pc;
7141 }
7142
7143 return 0;
7144}
7145
7146static void
7147thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7148 struct regcache *regs,
cfba9872 7149 arm_displaced_step_closure *dsc)
34518530
YQ
7150{
7151 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7152 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7153 int err = 0;
7154
7155 /* 16-bit thumb instructions. */
7156 switch (op_bit_12_15)
7157 {
7158 /* Shift (imme), add, subtract, move and compare. */
7159 case 0: case 1: case 2: case 3:
7160 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7161 "shift/add/sub/mov/cmp",
7162 dsc);
7163 break;
7164 case 4:
7165 switch (op_bit_10_11)
7166 {
7167 case 0: /* Data-processing */
7168 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7169 "data-processing",
7170 dsc);
7171 break;
7172 case 1: /* Special data instructions and branch and exchange. */
7173 {
7174 unsigned short op = bits (insn1, 7, 9);
7175 if (op == 6 || op == 7) /* BX or BLX */
7176 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7177 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7178 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7179 else
7180 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7181 dsc);
7182 }
7183 break;
7184 default: /* LDR (literal) */
7185 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7186 }
7187 break;
7188 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7189 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7190 break;
7191 case 10:
7192 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7193 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7194 else /* Generate SP-relative address */
7195 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7196 break;
7197 case 11: /* Misc 16-bit instructions */
7198 {
7199 switch (bits (insn1, 8, 11))
7200 {
7201 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7202 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7203 break;
7204 case 12: case 13: /* POP */
7205 if (bit (insn1, 8)) /* PC is in register list. */
7206 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7207 else
7208 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7209 break;
7210 case 15: /* If-Then, and hints */
7211 if (bits (insn1, 0, 3))
7212 /* If-Then makes up to four following instructions conditional.
7213 IT instruction itself is not conditional, so handle it as a
7214 common unmodified instruction. */
7215 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7216 dsc);
7217 else
7218 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7219 break;
7220 default:
7221 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7222 }
7223 }
7224 break;
7225 case 12:
7226 if (op_bit_10_11 < 2) /* Store multiple registers */
7227 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7228 else /* Load multiple registers */
7229 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7230 break;
7231 case 13: /* Conditional branch and supervisor call */
7232 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7233 err = thumb_copy_b (gdbarch, insn1, dsc);
7234 else
7235 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7236 break;
7237 case 14: /* Unconditional branch */
7238 err = thumb_copy_b (gdbarch, insn1, dsc);
7239 break;
7240 default:
7241 err = 1;
7242 }
7243
7244 if (err)
7245 internal_error (__FILE__, __LINE__,
7246 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7247}
7248
7249static int
7250decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7251 uint16_t insn1, uint16_t insn2,
7252 struct regcache *regs,
cfba9872 7253 arm_displaced_step_closure *dsc)
34518530
YQ
7254{
7255 int rt = bits (insn2, 12, 15);
7256 int rn = bits (insn1, 0, 3);
7257 int op1 = bits (insn1, 7, 8);
34518530
YQ
7258
7259 switch (bits (insn1, 5, 6))
7260 {
7261 case 0: /* Load byte and memory hints */
7262 if (rt == 0xf) /* PLD/PLI */
7263 {
7264 if (rn == 0xf)
7265 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7266 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7267 else
7268 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7269 "pli/pld", dsc);
7270 }
7271 else
7272 {
7273 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7274 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7275 1);
7276 else
7277 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7278 "ldrb{reg, immediate}/ldrbt",
7279 dsc);
7280 }
7281
7282 break;
7283 case 1: /* Load halfword and memory hints. */
7284 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7285 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7286 "pld/unalloc memhint", dsc);
7287 else
7288 {
7289 if (rn == 0xf)
7290 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7291 2);
7292 else
7293 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7294 "ldrh/ldrht", dsc);
7295 }
7296 break;
7297 case 2: /* Load word */
7298 {
7299 int insn2_bit_8_11 = bits (insn2, 8, 11);
7300
7301 if (rn == 0xf)
7302 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7303 else if (op1 == 0x1) /* Encoding T3 */
7304 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7305 0, 1);
7306 else /* op1 == 0x0 */
7307 {
7308 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7309 /* LDR (immediate) */
7310 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7311 dsc, bit (insn2, 8), 1);
7312 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7313 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7314 "ldrt", dsc);
7315 else
7316 /* LDR (register) */
7317 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7318 dsc, 0, 0);
7319 }
7320 break;
7321 }
7322 default:
7323 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7324 break;
7325 }
7326 return 0;
7327}
7328
7329static void
7330thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7331 uint16_t insn2, struct regcache *regs,
cfba9872 7332 arm_displaced_step_closure *dsc)
34518530
YQ
7333{
7334 int err = 0;
7335 unsigned short op = bit (insn2, 15);
7336 unsigned int op1 = bits (insn1, 11, 12);
7337
7338 switch (op1)
7339 {
7340 case 1:
7341 {
7342 switch (bits (insn1, 9, 10))
7343 {
7344 case 0:
7345 if (bit (insn1, 6))
7346 {
7347 /* Load/store {dual, execlusive}, table branch. */
7348 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7349 && bits (insn2, 5, 7) == 0)
7350 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7351 dsc);
7352 else
7353 /* PC is not allowed to use in load/store {dual, exclusive}
7354 instructions. */
7355 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7356 "load/store dual/ex", dsc);
7357 }
7358 else /* load/store multiple */
7359 {
7360 switch (bits (insn1, 7, 8))
7361 {
7362 case 0: case 3: /* SRS, RFE */
7363 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7364 "srs/rfe", dsc);
7365 break;
7366 case 1: case 2: /* LDM/STM/PUSH/POP */
7367 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7368 break;
7369 }
7370 }
7371 break;
7372
7373 case 1:
7374 /* Data-processing (shift register). */
7375 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7376 dsc);
7377 break;
7378 default: /* Coprocessor instructions. */
7379 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7380 break;
7381 }
7382 break;
7383 }
7384 case 2: /* op1 = 2 */
7385 if (op) /* Branch and misc control. */
7386 {
7387 if (bit (insn2, 14) /* BLX/BL */
7388 || bit (insn2, 12) /* Unconditional branch */
7389 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7390 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7391 else
7392 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7393 "misc ctrl", dsc);
7394 }
7395 else
7396 {
7397 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7398 {
b926417a 7399 int dp_op = bits (insn1, 4, 8);
34518530 7400 int rn = bits (insn1, 0, 3);
b926417a 7401 if ((dp_op == 0 || dp_op == 0xa) && rn == 0xf)
34518530
YQ
7402 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7403 regs, dsc);
7404 else
7405 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7406 "dp/pb", dsc);
7407 }
7408 else /* Data processing (modified immeidate) */
7409 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7410 "dp/mi", dsc);
7411 }
7412 break;
7413 case 3: /* op1 = 3 */
7414 switch (bits (insn1, 9, 10))
7415 {
7416 case 0:
7417 if (bit (insn1, 4))
7418 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7419 regs, dsc);
7420 else /* NEON Load/Store and Store single data item */
7421 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7422 "neon elt/struct load/store",
7423 dsc);
7424 break;
7425 case 1: /* op1 = 3, bits (9, 10) == 1 */
7426 switch (bits (insn1, 7, 8))
7427 {
7428 case 0: case 1: /* Data processing (register) */
7429 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7430 "dp(reg)", dsc);
7431 break;
7432 case 2: /* Multiply and absolute difference */
7433 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7434 "mul/mua/diff", dsc);
7435 break;
7436 case 3: /* Long multiply and divide */
7437 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7438 "lmul/lmua", dsc);
7439 break;
7440 }
7441 break;
7442 default: /* Coprocessor instructions */
7443 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7444 break;
7445 }
7446 break;
7447 default:
7448 err = 1;
7449 }
7450
7451 if (err)
7452 internal_error (__FILE__, __LINE__,
7453 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7454
7455}
7456
b434a28f
YQ
7457static void
7458thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
12545665 7459 struct regcache *regs,
cfba9872 7460 arm_displaced_step_closure *dsc)
b434a28f 7461{
34518530
YQ
7462 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7463 uint16_t insn1
7464 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7465
7466 if (debug_displaced)
7467 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7468 "at %.8lx\n", insn1, (unsigned long) from);
7469
7470 dsc->is_thumb = 1;
7471 dsc->insn_size = thumb_insn_size (insn1);
7472 if (thumb_insn_size (insn1) == 4)
7473 {
7474 uint16_t insn2
7475 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7476 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7477 }
7478 else
7479 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7480}
7481
cca44b1b 7482void
b434a28f
YQ
7483arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7484 CORE_ADDR to, struct regcache *regs,
cfba9872 7485 arm_displaced_step_closure *dsc)
cca44b1b
JB
7486{
7487 int err = 0;
b434a28f
YQ
7488 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7489 uint32_t insn;
cca44b1b
JB
7490
7491 /* Most displaced instructions use a 1-instruction scratch space, so set this
7492 here and override below if/when necessary. */
7493 dsc->numinsns = 1;
7494 dsc->insn_addr = from;
7495 dsc->scratch_base = to;
7496 dsc->cleanup = NULL;
7497 dsc->wrote_to_pc = 0;
7498
b434a28f 7499 if (!displaced_in_arm_mode (regs))
12545665 7500 return thumb_process_displaced_insn (gdbarch, from, regs, dsc);
b434a28f 7501
4db71c0b
YQ
7502 dsc->is_thumb = 0;
7503 dsc->insn_size = 4;
b434a28f
YQ
7504 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7505 if (debug_displaced)
7506 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7507 "at %.8lx\n", (unsigned long) insn,
7508 (unsigned long) from);
7509
cca44b1b 7510 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7511 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7512 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7513 {
7514 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7515 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7516 break;
7517
7518 case 0x4: case 0x5: case 0x6:
7ff120b4 7519 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7520 break;
7521
7522 case 0x7:
7ff120b4 7523 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7524 break;
7525
7526 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7527 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7528 break;
7529
7530 case 0xc: case 0xd: case 0xe: case 0xf:
12545665 7531 err = arm_decode_svc_copro (gdbarch, insn, regs, dsc);
cca44b1b
JB
7532 break;
7533 }
7534
7535 if (err)
7536 internal_error (__FILE__, __LINE__,
7537 _("arm_process_displaced_insn: Instruction decode error"));
7538}
7539
7540/* Actually set up the scratch space for a displaced instruction. */
7541
7542void
7543arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
cfba9872 7544 CORE_ADDR to, arm_displaced_step_closure *dsc)
cca44b1b
JB
7545{
7546 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7547 unsigned int i, len, offset;
cca44b1b 7548 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7549 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7550 const gdb_byte *bkp_insn;
cca44b1b 7551
4db71c0b 7552 offset = 0;
cca44b1b
JB
7553 /* Poke modified instruction(s). */
7554 for (i = 0; i < dsc->numinsns; i++)
7555 {
7556 if (debug_displaced)
4db71c0b
YQ
7557 {
7558 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7559 if (size == 4)
7560 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7561 dsc->modinsn[i]);
7562 else if (size == 2)
7563 fprintf_unfiltered (gdb_stdlog, "%.4x",
7564 (unsigned short)dsc->modinsn[i]);
7565
7566 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7567 (unsigned long) to + offset);
7568
7569 }
7570 write_memory_unsigned_integer (to + offset, size,
7571 byte_order_for_code,
cca44b1b 7572 dsc->modinsn[i]);
4db71c0b
YQ
7573 offset += size;
7574 }
7575
7576 /* Choose the correct breakpoint instruction. */
7577 if (dsc->is_thumb)
7578 {
7579 bkp_insn = tdep->thumb_breakpoint;
7580 len = tdep->thumb_breakpoint_size;
7581 }
7582 else
7583 {
7584 bkp_insn = tdep->arm_breakpoint;
7585 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7586 }
7587
7588 /* Put breakpoint afterwards. */
4db71c0b 7589 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7590
7591 if (debug_displaced)
7592 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7593 paddress (gdbarch, from), paddress (gdbarch, to));
7594}
7595
cca44b1b
JB
7596/* Entry point for cleaning things up after a displaced instruction has been
7597 single-stepped. */
7598
7599void
7600arm_displaced_step_fixup (struct gdbarch *gdbarch,
cfba9872 7601 struct displaced_step_closure *dsc_,
cca44b1b
JB
7602 CORE_ADDR from, CORE_ADDR to,
7603 struct regcache *regs)
7604{
cfba9872
SM
7605 arm_displaced_step_closure *dsc = (arm_displaced_step_closure *) dsc_;
7606
cca44b1b
JB
7607 if (dsc->cleanup)
7608 dsc->cleanup (gdbarch, regs, dsc);
7609
7610 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7611 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7612 dsc->insn_addr + dsc->insn_size);
7613
cca44b1b
JB
7614}
7615
7616#include "bfd-in2.h"
7617#include "libcoff.h"
7618
7619static int
7620gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7621{
e47ad6c0
YQ
7622 gdb_disassembler *di
7623 = static_cast<gdb_disassembler *>(info->application_data);
7624 struct gdbarch *gdbarch = di->arch ();
9779414d
DJ
7625
7626 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7627 {
7628 static asymbol *asym;
7629 static combined_entry_type ce;
7630 static struct coff_symbol_struct csym;
7631 static struct bfd fake_bfd;
7632 static bfd_target fake_target;
7633
7634 if (csym.native == NULL)
7635 {
7636 /* Create a fake symbol vector containing a Thumb symbol.
7637 This is solely so that the code in print_insn_little_arm()
7638 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7639 the presence of a Thumb symbol and switch to decoding
7640 Thumb instructions. */
7641
7642 fake_target.flavour = bfd_target_coff_flavour;
7643 fake_bfd.xvec = &fake_target;
7644 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7645 csym.native = &ce;
7646 csym.symbol.the_bfd = &fake_bfd;
7647 csym.symbol.name = "fake";
7648 asym = (asymbol *) & csym;
7649 }
7650
7651 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7652 info->symbols = &asym;
7653 }
7654 else
7655 info->symbols = NULL;
7656
e60eb288
YQ
7657 /* GDB is able to get bfd_mach from the exe_bfd, info->mach is
7658 accurate, so mark USER_SPECIFIED_MACHINE_TYPE bit. Otherwise,
7659 opcodes/arm-dis.c:print_insn reset info->mach, and it will trigger
7660 the assert on the mismatch of info->mach and bfd_get_mach (exec_bfd)
7661 in default_print_insn. */
7662 if (exec_bfd != NULL)
7663 info->flags |= USER_SPECIFIED_MACHINE_TYPE;
7664
6394c606 7665 return default_print_insn (memaddr, info);
cca44b1b
JB
7666}
7667
7668/* The following define instruction sequences that will cause ARM
7669 cpu's to take an undefined instruction trap. These are used to
7670 signal a breakpoint to GDB.
7671
7672 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7673 modes. A different instruction is required for each mode. The ARM
7674 cpu's can also be big or little endian. Thus four different
7675 instructions are needed to support all cases.
7676
7677 Note: ARMv4 defines several new instructions that will take the
7678 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7679 not in fact add the new instructions. The new undefined
7680 instructions in ARMv4 are all instructions that had no defined
7681 behaviour in earlier chips. There is no guarantee that they will
7682 raise an exception, but may be treated as NOP's. In practice, it
7683 may only safe to rely on instructions matching:
7684
7685 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7686 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
7687 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
7688
0963b4bd 7689 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7690 following use a condition predicate of ALWAYS so it is always TRUE.
7691
7692 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7693 and NetBSD all use a software interrupt rather than an undefined
7694 instruction to force a trap. This can be handled by by the
7695 abi-specific code during establishment of the gdbarch vector. */
7696
7697#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7698#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7699#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7700#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7701
948f8e3d
PA
7702static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7703static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7704static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7705static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b 7706
cd6c3b4f
YQ
7707/* Implement the breakpoint_kind_from_pc gdbarch method. */
7708
d19280ad
YQ
7709static int
7710arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
cca44b1b
JB
7711{
7712 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7713 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7714
9779414d 7715 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7716 {
7717 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7718
7719 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7720 check whether we are replacing a 32-bit instruction. */
7721 if (tdep->thumb2_breakpoint != NULL)
7722 {
7723 gdb_byte buf[2];
d19280ad 7724
177321bd
DJ
7725 if (target_read_memory (*pcptr, buf, 2) == 0)
7726 {
7727 unsigned short inst1;
d19280ad 7728
177321bd 7729 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7730 if (thumb_insn_size (inst1) == 4)
d19280ad 7731 return ARM_BP_KIND_THUMB2;
177321bd
DJ
7732 }
7733 }
7734
d19280ad 7735 return ARM_BP_KIND_THUMB;
cca44b1b
JB
7736 }
7737 else
d19280ad
YQ
7738 return ARM_BP_KIND_ARM;
7739
7740}
7741
cd6c3b4f
YQ
7742/* Implement the sw_breakpoint_from_kind gdbarch method. */
7743
d19280ad
YQ
7744static const gdb_byte *
7745arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
7746{
7747 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7748
7749 switch (kind)
cca44b1b 7750 {
d19280ad
YQ
7751 case ARM_BP_KIND_ARM:
7752 *size = tdep->arm_breakpoint_size;
cca44b1b 7753 return tdep->arm_breakpoint;
d19280ad
YQ
7754 case ARM_BP_KIND_THUMB:
7755 *size = tdep->thumb_breakpoint_size;
7756 return tdep->thumb_breakpoint;
7757 case ARM_BP_KIND_THUMB2:
7758 *size = tdep->thumb2_breakpoint_size;
7759 return tdep->thumb2_breakpoint;
7760 default:
7761 gdb_assert_not_reached ("unexpected arm breakpoint kind");
cca44b1b
JB
7762 }
7763}
7764
833b7ab5
YQ
7765/* Implement the breakpoint_kind_from_current_state gdbarch method. */
7766
7767static int
7768arm_breakpoint_kind_from_current_state (struct gdbarch *gdbarch,
7769 struct regcache *regcache,
7770 CORE_ADDR *pcptr)
7771{
7772 gdb_byte buf[4];
7773
7774 /* Check the memory pointed by PC is readable. */
7775 if (target_read_memory (regcache_read_pc (regcache), buf, 4) == 0)
7776 {
7777 struct arm_get_next_pcs next_pcs_ctx;
833b7ab5
YQ
7778
7779 arm_get_next_pcs_ctor (&next_pcs_ctx,
7780 &arm_get_next_pcs_ops,
7781 gdbarch_byte_order (gdbarch),
7782 gdbarch_byte_order_for_code (gdbarch),
7783 0,
7784 regcache);
7785
a0ff9e1a 7786 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
833b7ab5
YQ
7787
7788 /* If MEMADDR is the next instruction of current pc, do the
7789 software single step computation, and get the thumb mode by
7790 the destination address. */
a0ff9e1a 7791 for (CORE_ADDR pc : next_pcs)
833b7ab5
YQ
7792 {
7793 if (UNMAKE_THUMB_ADDR (pc) == *pcptr)
7794 {
833b7ab5
YQ
7795 if (IS_THUMB_ADDR (pc))
7796 {
7797 *pcptr = MAKE_THUMB_ADDR (*pcptr);
7798 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7799 }
7800 else
7801 return ARM_BP_KIND_ARM;
7802 }
7803 }
833b7ab5
YQ
7804 }
7805
7806 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
7807}
7808
cca44b1b
JB
7809/* Extract from an array REGBUF containing the (raw) register state a
7810 function return value of type TYPE, and copy that, in virtual
7811 format, into VALBUF. */
7812
7813static void
7814arm_extract_return_value (struct type *type, struct regcache *regs,
7815 gdb_byte *valbuf)
7816{
ac7936df 7817 struct gdbarch *gdbarch = regs->arch ();
cca44b1b
JB
7818 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7819
7820 if (TYPE_CODE_FLT == TYPE_CODE (type))
7821 {
7822 switch (gdbarch_tdep (gdbarch)->fp_model)
7823 {
7824 case ARM_FLOAT_FPA:
7825 {
7826 /* The value is in register F0 in internal format. We need to
7827 extract the raw value and then convert it to the desired
7828 internal type. */
7829 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7830
dca08e1f 7831 regs->cooked_read (ARM_F0_REGNUM, tmpbuf);
3b2ca824
UW
7832 target_float_convert (tmpbuf, arm_ext_type (gdbarch),
7833 valbuf, type);
cca44b1b
JB
7834 }
7835 break;
7836
7837 case ARM_FLOAT_SOFT_FPA:
7838 case ARM_FLOAT_SOFT_VFP:
7839 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7840 not using the VFP ABI code. */
7841 case ARM_FLOAT_VFP:
dca08e1f 7842 regs->cooked_read (ARM_A1_REGNUM, valbuf);
cca44b1b 7843 if (TYPE_LENGTH (type) > 4)
dca08e1f 7844 regs->cooked_read (ARM_A1_REGNUM + 1, valbuf + INT_REGISTER_SIZE);
cca44b1b
JB
7845 break;
7846
7847 default:
0963b4bd
MS
7848 internal_error (__FILE__, __LINE__,
7849 _("arm_extract_return_value: "
7850 "Floating point model not supported"));
cca44b1b
JB
7851 break;
7852 }
7853 }
7854 else if (TYPE_CODE (type) == TYPE_CODE_INT
7855 || TYPE_CODE (type) == TYPE_CODE_CHAR
7856 || TYPE_CODE (type) == TYPE_CODE_BOOL
7857 || TYPE_CODE (type) == TYPE_CODE_PTR
aa006118 7858 || TYPE_IS_REFERENCE (type)
cca44b1b
JB
7859 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7860 {
b021a221
MS
7861 /* If the type is a plain integer, then the access is
7862 straight-forward. Otherwise we have to play around a bit
7863 more. */
cca44b1b
JB
7864 int len = TYPE_LENGTH (type);
7865 int regno = ARM_A1_REGNUM;
7866 ULONGEST tmp;
7867
7868 while (len > 0)
7869 {
7870 /* By using store_unsigned_integer we avoid having to do
7871 anything special for small big-endian values. */
7872 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7873 store_unsigned_integer (valbuf,
7874 (len > INT_REGISTER_SIZE
7875 ? INT_REGISTER_SIZE : len),
7876 byte_order, tmp);
7877 len -= INT_REGISTER_SIZE;
7878 valbuf += INT_REGISTER_SIZE;
7879 }
7880 }
7881 else
7882 {
7883 /* For a structure or union the behaviour is as if the value had
7884 been stored to word-aligned memory and then loaded into
7885 registers with 32-bit load instruction(s). */
7886 int len = TYPE_LENGTH (type);
7887 int regno = ARM_A1_REGNUM;
7888 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7889
7890 while (len > 0)
7891 {
dca08e1f 7892 regs->cooked_read (regno++, tmpbuf);
cca44b1b
JB
7893 memcpy (valbuf, tmpbuf,
7894 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7895 len -= INT_REGISTER_SIZE;
7896 valbuf += INT_REGISTER_SIZE;
7897 }
7898 }
7899}
7900
7901
7902/* Will a function return an aggregate type in memory or in a
7903 register? Return 0 if an aggregate type can be returned in a
7904 register, 1 if it must be returned in memory. */
7905
7906static int
7907arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7908{
cca44b1b
JB
7909 enum type_code code;
7910
f168693b 7911 type = check_typedef (type);
cca44b1b 7912
b13c8ab2
YQ
7913 /* Simple, non-aggregate types (ie not including vectors and
7914 complex) are always returned in a register (or registers). */
7915 code = TYPE_CODE (type);
7916 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7917 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7918 return 0;
cca44b1b 7919
c4312b19
YQ
7920 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7921 {
7922 /* Vector values should be returned using ARM registers if they
7923 are not over 16 bytes. */
7924 return (TYPE_LENGTH (type) > 16);
7925 }
7926
b13c8ab2 7927 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7928 {
b13c8ab2
YQ
7929 /* The AAPCS says all aggregates not larger than a word are returned
7930 in a register. */
7931 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
7932 return 0;
7933
cca44b1b
JB
7934 return 1;
7935 }
b13c8ab2
YQ
7936 else
7937 {
7938 int nRc;
cca44b1b 7939
b13c8ab2
YQ
7940 /* All aggregate types that won't fit in a register must be returned
7941 in memory. */
7942 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
7943 return 1;
cca44b1b 7944
b13c8ab2
YQ
7945 /* In the ARM ABI, "integer" like aggregate types are returned in
7946 registers. For an aggregate type to be integer like, its size
7947 must be less than or equal to INT_REGISTER_SIZE and the
7948 offset of each addressable subfield must be zero. Note that bit
7949 fields are not addressable, and all addressable subfields of
7950 unions always start at offset zero.
cca44b1b 7951
b13c8ab2
YQ
7952 This function is based on the behaviour of GCC 2.95.1.
7953 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7954
b13c8ab2
YQ
7955 Note: All versions of GCC before GCC 2.95.2 do not set up the
7956 parameters correctly for a function returning the following
7957 structure: struct { float f;}; This should be returned in memory,
7958 not a register. Richard Earnshaw sent me a patch, but I do not
7959 know of any way to detect if a function like the above has been
7960 compiled with the correct calling convention. */
7961
7962 /* Assume all other aggregate types can be returned in a register.
7963 Run a check for structures, unions and arrays. */
7964 nRc = 0;
67255d04 7965
b13c8ab2
YQ
7966 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7967 {
7968 int i;
7969 /* Need to check if this struct/union is "integer" like. For
7970 this to be true, its size must be less than or equal to
7971 INT_REGISTER_SIZE and the offset of each addressable
7972 subfield must be zero. Note that bit fields are not
7973 addressable, and unions always start at offset zero. If any
7974 of the subfields is a floating point type, the struct/union
7975 cannot be an integer type. */
7976
7977 /* For each field in the object, check:
7978 1) Is it FP? --> yes, nRc = 1;
7979 2) Is it addressable (bitpos != 0) and
7980 not packed (bitsize == 0)?
7981 --> yes, nRc = 1
7982 */
7983
7984 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7985 {
b13c8ab2
YQ
7986 enum type_code field_type_code;
7987
7988 field_type_code
7989 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7990 i)));
7991
7992 /* Is it a floating point type field? */
7993 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7994 {
7995 nRc = 1;
7996 break;
7997 }
b13c8ab2
YQ
7998
7999 /* If bitpos != 0, then we have to care about it. */
8000 if (TYPE_FIELD_BITPOS (type, i) != 0)
8001 {
8002 /* Bitfields are not addressable. If the field bitsize is
8003 zero, then the field is not packed. Hence it cannot be
8004 a bitfield or any other packed type. */
8005 if (TYPE_FIELD_BITSIZE (type, i) == 0)
8006 {
8007 nRc = 1;
8008 break;
8009 }
8010 }
67255d04
RE
8011 }
8012 }
67255d04 8013
b13c8ab2
YQ
8014 return nRc;
8015 }
67255d04
RE
8016}
8017
34e8f22d
RE
8018/* Write into appropriate registers a function return value of type
8019 TYPE, given in virtual format. */
8020
8021static void
b508a996 8022arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 8023 const gdb_byte *valbuf)
34e8f22d 8024{
ac7936df 8025 struct gdbarch *gdbarch = regs->arch ();
e17a4113 8026 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 8027
34e8f22d
RE
8028 if (TYPE_CODE (type) == TYPE_CODE_FLT)
8029 {
64403bd1 8030 gdb_byte buf[FP_REGISTER_SIZE];
34e8f22d 8031
be8626e0 8032 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
8033 {
8034 case ARM_FLOAT_FPA:
8035
3b2ca824 8036 target_float_convert (valbuf, type, buf, arm_ext_type (gdbarch));
b66f5587 8037 regs->cooked_write (ARM_F0_REGNUM, buf);
08216dd7
RE
8038 break;
8039
fd50bc42 8040 case ARM_FLOAT_SOFT_FPA:
08216dd7 8041 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
8042 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8043 not using the VFP ABI code. */
8044 case ARM_FLOAT_VFP:
b66f5587 8045 regs->cooked_write (ARM_A1_REGNUM, valbuf);
b508a996 8046 if (TYPE_LENGTH (type) > 4)
b66f5587 8047 regs->cooked_write (ARM_A1_REGNUM + 1, valbuf + INT_REGISTER_SIZE);
08216dd7
RE
8048 break;
8049
8050 default:
9b20d036
MS
8051 internal_error (__FILE__, __LINE__,
8052 _("arm_store_return_value: Floating "
8053 "point model not supported"));
08216dd7
RE
8054 break;
8055 }
34e8f22d 8056 }
b508a996
RE
8057 else if (TYPE_CODE (type) == TYPE_CODE_INT
8058 || TYPE_CODE (type) == TYPE_CODE_CHAR
8059 || TYPE_CODE (type) == TYPE_CODE_BOOL
8060 || TYPE_CODE (type) == TYPE_CODE_PTR
aa006118 8061 || TYPE_IS_REFERENCE (type)
b508a996
RE
8062 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8063 {
8064 if (TYPE_LENGTH (type) <= 4)
8065 {
8066 /* Values of one word or less are zero/sign-extended and
8067 returned in r0. */
7a5ea0d4 8068 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8069 LONGEST val = unpack_long (type, valbuf);
8070
e17a4113 8071 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b66f5587 8072 regs->cooked_write (ARM_A1_REGNUM, tmpbuf);
b508a996
RE
8073 }
8074 else
8075 {
8076 /* Integral values greater than one word are stored in consecutive
8077 registers starting with r0. This will always be a multiple of
8078 the regiser size. */
8079 int len = TYPE_LENGTH (type);
8080 int regno = ARM_A1_REGNUM;
8081
8082 while (len > 0)
8083 {
b66f5587 8084 regs->cooked_write (regno++, valbuf);
7a5ea0d4
DJ
8085 len -= INT_REGISTER_SIZE;
8086 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8087 }
8088 }
8089 }
34e8f22d 8090 else
b508a996
RE
8091 {
8092 /* For a structure or union the behaviour is as if the value had
8093 been stored to word-aligned memory and then loaded into
8094 registers with 32-bit load instruction(s). */
8095 int len = TYPE_LENGTH (type);
8096 int regno = ARM_A1_REGNUM;
7a5ea0d4 8097 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8098
8099 while (len > 0)
8100 {
8101 memcpy (tmpbuf, valbuf,
7a5ea0d4 8102 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b66f5587 8103 regs->cooked_write (regno++, tmpbuf);
7a5ea0d4
DJ
8104 len -= INT_REGISTER_SIZE;
8105 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8106 }
8107 }
34e8f22d
RE
8108}
8109
2af48f68
PB
8110
8111/* Handle function return values. */
8112
8113static enum return_value_convention
6a3a010b 8114arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8115 struct type *valtype, struct regcache *regcache,
8116 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8117{
7c00367c 8118 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8119 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8120 enum arm_vfp_cprc_base_type vfp_base_type;
8121 int vfp_base_count;
8122
8123 if (arm_vfp_abi_for_function (gdbarch, func_type)
8124 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8125 {
8126 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8127 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8128 int i;
8129 for (i = 0; i < vfp_base_count; i++)
8130 {
58d6951d
DJ
8131 if (reg_char == 'q')
8132 {
8133 if (writebuf)
8134 arm_neon_quad_write (gdbarch, regcache, i,
8135 writebuf + i * unit_length);
8136
8137 if (readbuf)
8138 arm_neon_quad_read (gdbarch, regcache, i,
8139 readbuf + i * unit_length);
8140 }
8141 else
8142 {
8143 char name_buf[4];
8144 int regnum;
8145
8c042590 8146 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8147 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8148 strlen (name_buf));
8149 if (writebuf)
b66f5587 8150 regcache->cooked_write (regnum, writebuf + i * unit_length);
58d6951d 8151 if (readbuf)
dca08e1f 8152 regcache->cooked_read (regnum, readbuf + i * unit_length);
58d6951d 8153 }
90445bd3
DJ
8154 }
8155 return RETURN_VALUE_REGISTER_CONVENTION;
8156 }
7c00367c 8157
2af48f68
PB
8158 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8159 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8160 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8161 {
7c00367c
MK
8162 if (tdep->struct_return == pcc_struct_return
8163 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8164 return RETURN_VALUE_STRUCT_CONVENTION;
8165 }
b13c8ab2
YQ
8166 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8167 {
8168 if (arm_return_in_memory (gdbarch, valtype))
8169 return RETURN_VALUE_STRUCT_CONVENTION;
8170 }
7052e42c 8171
2af48f68
PB
8172 if (writebuf)
8173 arm_store_return_value (valtype, regcache, writebuf);
8174
8175 if (readbuf)
8176 arm_extract_return_value (valtype, regcache, readbuf);
8177
8178 return RETURN_VALUE_REGISTER_CONVENTION;
8179}
8180
8181
9df628e0 8182static int
60ade65d 8183arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8184{
e17a4113
UW
8185 struct gdbarch *gdbarch = get_frame_arch (frame);
8186 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8187 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8188 CORE_ADDR jb_addr;
e362b510 8189 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 8190
60ade65d 8191 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8192
8193 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 8194 INT_REGISTER_SIZE))
9df628e0
RE
8195 return 0;
8196
e17a4113 8197 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8198 return 1;
8199}
8200
faa95490
DJ
8201/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8202 return the target PC. Otherwise return 0. */
c906108c
SS
8203
8204CORE_ADDR
52f729a7 8205arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8206{
2c02bd72 8207 const char *name;
faa95490 8208 int namelen;
c906108c
SS
8209 CORE_ADDR start_addr;
8210
8211 /* Find the starting address and name of the function containing the PC. */
8212 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8213 {
8214 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8215 check here. */
8216 start_addr = arm_skip_bx_reg (frame, pc);
8217 if (start_addr != 0)
8218 return start_addr;
8219
8220 return 0;
8221 }
c906108c 8222
faa95490
DJ
8223 /* If PC is in a Thumb call or return stub, return the address of the
8224 target PC, which is in a register. The thunk functions are called
8225 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8226 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8227 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8228 if (startswith (name, "_call_via_")
8229 || startswith (name, "__ARM_call_via_"))
c906108c 8230 {
ed9a39eb
JM
8231 /* Use the name suffix to determine which register contains the
8232 target PC. */
a121b7c1 8233 static const char *table[15] =
c5aa993b
JM
8234 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8235 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8236 };
c906108c 8237 int regno;
faa95490 8238 int offset = strlen (name) - 2;
c906108c
SS
8239
8240 for (regno = 0; regno <= 14; regno++)
faa95490 8241 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8242 return get_frame_register_unsigned (frame, regno);
c906108c 8243 }
ed9a39eb 8244
faa95490
DJ
8245 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8246 non-interworking calls to foo. We could decode the stubs
8247 to find the target but it's easier to use the symbol table. */
8248 namelen = strlen (name);
8249 if (name[0] == '_' && name[1] == '_'
8250 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8251 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8252 || (namelen > 2 + strlen ("_from_arm")
61012eef 8253 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8254 {
8255 char *target_name;
8256 int target_len = namelen - 2;
3b7344d5 8257 struct bound_minimal_symbol minsym;
faa95490
DJ
8258 struct objfile *objfile;
8259 struct obj_section *sec;
8260
8261 if (name[namelen - 1] == 'b')
8262 target_len -= strlen ("_from_thumb");
8263 else
8264 target_len -= strlen ("_from_arm");
8265
224c3ddb 8266 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8267 memcpy (target_name, name + 2, target_len);
8268 target_name[target_len] = '\0';
8269
8270 sec = find_pc_section (pc);
8271 objfile = (sec == NULL) ? NULL : sec->objfile;
8272 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8273 if (minsym.minsym != NULL)
77e371c0 8274 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8275 else
8276 return 0;
8277 }
8278
c5aa993b 8279 return 0; /* not a stub */
c906108c
SS
8280}
8281
afd7eef0 8282static void
981a3fb3 8283set_arm_command (const char *args, int from_tty)
afd7eef0 8284{
edefbb7c
AC
8285 printf_unfiltered (_("\
8286\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8287 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8288}
8289
8290static void
981a3fb3 8291show_arm_command (const char *args, int from_tty)
afd7eef0 8292{
26304000 8293 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8294}
8295
28e97307
DJ
8296static void
8297arm_update_current_architecture (void)
fd50bc42 8298{
28e97307 8299 struct gdbarch_info info;
fd50bc42 8300
28e97307 8301 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8302 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8303 return;
fd50bc42 8304
28e97307
DJ
8305 /* Update the architecture. */
8306 gdbarch_info_init (&info);
fd50bc42 8307
28e97307 8308 if (!gdbarch_update_p (info))
9b20d036 8309 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8310}
8311
8312static void
eb4c3f4a 8313set_fp_model_sfunc (const char *args, int from_tty,
fd50bc42
RE
8314 struct cmd_list_element *c)
8315{
570dc176 8316 int fp_model;
fd50bc42
RE
8317
8318 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8319 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8320 {
aead7601 8321 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8322 break;
8323 }
8324
8325 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8326 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8327 current_fp_model);
8328
28e97307 8329 arm_update_current_architecture ();
fd50bc42
RE
8330}
8331
8332static void
08546159
AC
8333show_fp_model (struct ui_file *file, int from_tty,
8334 struct cmd_list_element *c, const char *value)
fd50bc42 8335{
f5656ead 8336 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8337
28e97307 8338 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8339 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8340 fprintf_filtered (file, _("\
8341The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8342 fp_model_strings[tdep->fp_model]);
8343 else
8344 fprintf_filtered (file, _("\
8345The current ARM floating point model is \"%s\".\n"),
8346 fp_model_strings[arm_fp_model]);
8347}
8348
8349static void
eb4c3f4a 8350arm_set_abi (const char *args, int from_tty,
28e97307
DJ
8351 struct cmd_list_element *c)
8352{
570dc176 8353 int arm_abi;
28e97307
DJ
8354
8355 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8356 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8357 {
aead7601 8358 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8359 break;
8360 }
8361
8362 if (arm_abi == ARM_ABI_LAST)
8363 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8364 arm_abi_string);
8365
8366 arm_update_current_architecture ();
8367}
8368
8369static void
8370arm_show_abi (struct ui_file *file, int from_tty,
8371 struct cmd_list_element *c, const char *value)
8372{
f5656ead 8373 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8374
8375 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8376 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8377 fprintf_filtered (file, _("\
8378The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8379 arm_abi_strings[tdep->arm_abi]);
8380 else
8381 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8382 arm_abi_string);
fd50bc42
RE
8383}
8384
0428b8f5
DJ
8385static void
8386arm_show_fallback_mode (struct ui_file *file, int from_tty,
8387 struct cmd_list_element *c, const char *value)
8388{
0963b4bd
MS
8389 fprintf_filtered (file,
8390 _("The current execution mode assumed "
8391 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8392 arm_fallback_mode_string);
8393}
8394
8395static void
8396arm_show_force_mode (struct ui_file *file, int from_tty,
8397 struct cmd_list_element *c, const char *value)
8398{
0963b4bd
MS
8399 fprintf_filtered (file,
8400 _("The current execution mode assumed "
8401 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8402 arm_force_mode_string);
8403}
8404
afd7eef0
RE
8405/* If the user changes the register disassembly style used for info
8406 register and other commands, we have to also switch the style used
8407 in opcodes for disassembly output. This function is run in the "set
8408 arm disassembly" command, and does that. */
bc90b915
FN
8409
8410static void
eb4c3f4a 8411set_disassembly_style_sfunc (const char *args, int from_tty,
65b48a81 8412 struct cmd_list_element *c)
bc90b915 8413{
65b48a81
PB
8414 /* Convert the short style name into the long style name (eg, reg-names-*)
8415 before calling the generic set_disassembler_options() function. */
8416 std::string long_name = std::string ("reg-names-") + disassembly_style;
8417 set_disassembler_options (&long_name[0]);
8418}
8419
8420static void
8421show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
8422 struct cmd_list_element *c, const char *value)
8423{
8424 struct gdbarch *gdbarch = get_current_arch ();
8425 char *options = get_disassembler_options (gdbarch);
8426 const char *style = "";
8427 int len = 0;
f995bbe8 8428 const char *opt;
65b48a81
PB
8429
8430 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
8431 if (CONST_STRNEQ (opt, "reg-names-"))
8432 {
8433 style = &opt[strlen ("reg-names-")];
8434 len = strcspn (style, ",");
8435 }
8436
8437 fprintf_unfiltered (file, "The disassembly style is \"%.*s\".\n", len, style);
bc90b915
FN
8438}
8439\f
966fbf70 8440/* Return the ARM register name corresponding to register I. */
a208b0cb 8441static const char *
d93859e2 8442arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8443{
58d6951d
DJ
8444 const int num_regs = gdbarch_num_regs (gdbarch);
8445
8446 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8447 && i >= num_regs && i < num_regs + 32)
8448 {
8449 static const char *const vfp_pseudo_names[] = {
8450 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8451 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8452 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8453 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8454 };
8455
8456 return vfp_pseudo_names[i - num_regs];
8457 }
8458
8459 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8460 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8461 {
8462 static const char *const neon_pseudo_names[] = {
8463 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8464 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8465 };
8466
8467 return neon_pseudo_names[i - num_regs - 32];
8468 }
8469
ff6f572f
DJ
8470 if (i >= ARRAY_SIZE (arm_register_names))
8471 /* These registers are only supported on targets which supply
8472 an XML description. */
8473 return "";
8474
966fbf70
RE
8475 return arm_register_names[i];
8476}
8477
082fc60d
RE
8478/* Test whether the coff symbol specific value corresponds to a Thumb
8479 function. */
8480
8481static int
8482coff_sym_is_thumb (int val)
8483{
f8bf5763
PM
8484 return (val == C_THUMBEXT
8485 || val == C_THUMBSTAT
8486 || val == C_THUMBEXTFUNC
8487 || val == C_THUMBSTATFUNC
8488 || val == C_THUMBLABEL);
082fc60d
RE
8489}
8490
8491/* arm_coff_make_msymbol_special()
8492 arm_elf_make_msymbol_special()
8493
8494 These functions test whether the COFF or ELF symbol corresponds to
8495 an address in thumb code, and set a "special" bit in a minimal
8496 symbol to indicate that it does. */
8497
34e8f22d 8498static void
082fc60d
RE
8499arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8500{
39d911fc
TP
8501 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
8502
8503 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
467d42c4 8504 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8505 MSYMBOL_SET_SPECIAL (msym);
8506}
8507
34e8f22d 8508static void
082fc60d
RE
8509arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8510{
8511 if (coff_sym_is_thumb (val))
8512 MSYMBOL_SET_SPECIAL (msym);
8513}
8514
60c5725c 8515static void
c1bd65d0 8516arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 8517{
9a3c8263 8518 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
8519 unsigned int i;
8520
8521 for (i = 0; i < objfile->obfd->section_count; i++)
8522 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8523}
8524
8525static void
8526arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8527 asymbol *sym)
8528{
8529 const char *name = bfd_asymbol_name (sym);
8530 struct arm_per_objfile *data;
8531 VEC(arm_mapping_symbol_s) **map_p;
8532 struct arm_mapping_symbol new_map_sym;
8533
8534 gdb_assert (name[0] == '$');
8535 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8536 return;
8537
9a3c8263
SM
8538 data = (struct arm_per_objfile *) objfile_data (objfile,
8539 arm_objfile_data_key);
60c5725c
DJ
8540 if (data == NULL)
8541 {
8542 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8543 struct arm_per_objfile);
8544 set_objfile_data (objfile, arm_objfile_data_key, data);
8545 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8546 objfile->obfd->section_count,
8547 VEC(arm_mapping_symbol_s) *);
8548 }
8549 map_p = &data->section_maps[bfd_get_section (sym)->index];
8550
8551 new_map_sym.value = sym->value;
8552 new_map_sym.type = name[1];
8553
8554 /* Assume that most mapping symbols appear in order of increasing
8555 value. If they were randomly distributed, it would be faster to
8556 always push here and then sort at first use. */
8557 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8558 {
8559 struct arm_mapping_symbol *prev_map_sym;
8560
8561 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8562 if (prev_map_sym->value >= sym->value)
8563 {
8564 unsigned int idx;
8565 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8566 arm_compare_mapping_symbols);
8567 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8568 return;
8569 }
8570 }
8571
8572 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8573}
8574
756fe439 8575static void
61a1198a 8576arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8577{
ac7936df 8578 struct gdbarch *gdbarch = regcache->arch ();
61a1198a 8579 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8580
8581 /* If necessary, set the T bit. */
8582 if (arm_apcs_32)
8583 {
9779414d 8584 ULONGEST val, t_bit;
61a1198a 8585 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8586 t_bit = arm_psr_thumb_bit (gdbarch);
8587 if (arm_pc_is_thumb (gdbarch, pc))
8588 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8589 val | t_bit);
756fe439 8590 else
61a1198a 8591 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8592 val & ~t_bit);
756fe439
DJ
8593 }
8594}
123dc839 8595
58d6951d
DJ
8596/* Read the contents of a NEON quad register, by reading from two
8597 double registers. This is used to implement the quad pseudo
8598 registers, and for argument passing in case the quad registers are
8599 missing; vectors are passed in quad registers when using the VFP
8600 ABI, even if a NEON unit is not present. REGNUM is the index of
8601 the quad register, in [0, 15]. */
8602
05d1431c 8603static enum register_status
849d0ba8 8604arm_neon_quad_read (struct gdbarch *gdbarch, readable_regcache *regcache,
58d6951d
DJ
8605 int regnum, gdb_byte *buf)
8606{
8607 char name_buf[4];
8608 gdb_byte reg_buf[8];
8609 int offset, double_regnum;
05d1431c 8610 enum register_status status;
58d6951d 8611
8c042590 8612 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8613 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8614 strlen (name_buf));
8615
8616 /* d0 is always the least significant half of q0. */
8617 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8618 offset = 8;
8619 else
8620 offset = 0;
8621
03f50fc8 8622 status = regcache->raw_read (double_regnum, reg_buf);
05d1431c
PA
8623 if (status != REG_VALID)
8624 return status;
58d6951d
DJ
8625 memcpy (buf + offset, reg_buf, 8);
8626
8627 offset = 8 - offset;
03f50fc8 8628 status = regcache->raw_read (double_regnum + 1, reg_buf);
05d1431c
PA
8629 if (status != REG_VALID)
8630 return status;
58d6951d 8631 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8632
8633 return REG_VALID;
58d6951d
DJ
8634}
8635
05d1431c 8636static enum register_status
849d0ba8 8637arm_pseudo_read (struct gdbarch *gdbarch, readable_regcache *regcache,
58d6951d
DJ
8638 int regnum, gdb_byte *buf)
8639{
8640 const int num_regs = gdbarch_num_regs (gdbarch);
8641 char name_buf[4];
8642 gdb_byte reg_buf[8];
8643 int offset, double_regnum;
8644
8645 gdb_assert (regnum >= num_regs);
8646 regnum -= num_regs;
8647
8648 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8649 /* Quad-precision register. */
05d1431c 8650 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8651 else
8652 {
05d1431c
PA
8653 enum register_status status;
8654
58d6951d
DJ
8655 /* Single-precision register. */
8656 gdb_assert (regnum < 32);
8657
8658 /* s0 is always the least significant half of d0. */
8659 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8660 offset = (regnum & 1) ? 0 : 4;
8661 else
8662 offset = (regnum & 1) ? 4 : 0;
8663
8c042590 8664 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8665 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8666 strlen (name_buf));
8667
03f50fc8 8668 status = regcache->raw_read (double_regnum, reg_buf);
05d1431c
PA
8669 if (status == REG_VALID)
8670 memcpy (buf, reg_buf + offset, 4);
8671 return status;
58d6951d
DJ
8672 }
8673}
8674
8675/* Store the contents of BUF to a NEON quad register, by writing to
8676 two double registers. This is used to implement the quad pseudo
8677 registers, and for argument passing in case the quad registers are
8678 missing; vectors are passed in quad registers when using the VFP
8679 ABI, even if a NEON unit is not present. REGNUM is the index
8680 of the quad register, in [0, 15]. */
8681
8682static void
8683arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8684 int regnum, const gdb_byte *buf)
8685{
8686 char name_buf[4];
58d6951d
DJ
8687 int offset, double_regnum;
8688
8c042590 8689 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8690 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8691 strlen (name_buf));
8692
8693 /* d0 is always the least significant half of q0. */
8694 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8695 offset = 8;
8696 else
8697 offset = 0;
8698
10eaee5f 8699 regcache->raw_write (double_regnum, buf + offset);
58d6951d 8700 offset = 8 - offset;
10eaee5f 8701 regcache->raw_write (double_regnum + 1, buf + offset);
58d6951d
DJ
8702}
8703
8704static void
8705arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8706 int regnum, const gdb_byte *buf)
8707{
8708 const int num_regs = gdbarch_num_regs (gdbarch);
8709 char name_buf[4];
8710 gdb_byte reg_buf[8];
8711 int offset, double_regnum;
8712
8713 gdb_assert (regnum >= num_regs);
8714 regnum -= num_regs;
8715
8716 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8717 /* Quad-precision register. */
8718 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8719 else
8720 {
8721 /* Single-precision register. */
8722 gdb_assert (regnum < 32);
8723
8724 /* s0 is always the least significant half of d0. */
8725 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8726 offset = (regnum & 1) ? 0 : 4;
8727 else
8728 offset = (regnum & 1) ? 4 : 0;
8729
8c042590 8730 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8731 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8732 strlen (name_buf));
8733
0b883586 8734 regcache->raw_read (double_regnum, reg_buf);
58d6951d 8735 memcpy (reg_buf + offset, buf, 4);
10eaee5f 8736 regcache->raw_write (double_regnum, reg_buf);
58d6951d
DJ
8737 }
8738}
8739
123dc839
DJ
8740static struct value *
8741value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8742{
9a3c8263 8743 const int *reg_p = (const int *) baton;
123dc839
DJ
8744 return value_of_register (*reg_p, frame);
8745}
97e03143 8746\f
70f80edf
JT
8747static enum gdb_osabi
8748arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8749{
2af48f68 8750 unsigned int elfosabi;
70f80edf 8751 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8752
70f80edf 8753 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8754
28e97307
DJ
8755 if (elfosabi == ELFOSABI_ARM)
8756 /* GNU tools use this value. Check note sections in this case,
8757 as well. */
8758 bfd_map_over_sections (abfd,
8759 generic_elf_osabi_sniff_abi_tag_sections,
8760 &osabi);
97e03143 8761
28e97307 8762 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8763 return osabi;
97e03143
RE
8764}
8765
54483882
YQ
8766static int
8767arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8768 struct reggroup *group)
8769{
2c291032
YQ
8770 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8771 this, FPS register belongs to save_regroup, restore_reggroup, and
8772 all_reggroup, of course. */
54483882 8773 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8774 return (group == float_reggroup
8775 || group == save_reggroup
8776 || group == restore_reggroup
8777 || group == all_reggroup);
54483882
YQ
8778 else
8779 return default_register_reggroup_p (gdbarch, regnum, group);
8780}
8781
25f8c692
JL
8782\f
8783/* For backward-compatibility we allow two 'g' packet lengths with
8784 the remote protocol depending on whether FPA registers are
8785 supplied. M-profile targets do not have FPA registers, but some
8786 stubs already exist in the wild which use a 'g' packet which
8787 supplies them albeit with dummy values. The packet format which
8788 includes FPA registers should be considered deprecated for
8789 M-profile targets. */
8790
8791static void
8792arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8793{
8794 if (gdbarch_tdep (gdbarch)->is_m)
8795 {
8796 /* If we know from the executable this is an M-profile target,
8797 cater for remote targets whose register set layout is the
8798 same as the FPA layout. */
8799 register_remote_g_packet_guess (gdbarch,
03145bf4 8800 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
8801 (16 * INT_REGISTER_SIZE)
8802 + (8 * FP_REGISTER_SIZE)
8803 + (2 * INT_REGISTER_SIZE),
8804 tdesc_arm_with_m_fpa_layout);
8805
8806 /* The regular M-profile layout. */
8807 register_remote_g_packet_guess (gdbarch,
8808 /* r0-r12,sp,lr,pc; xpsr */
8809 (16 * INT_REGISTER_SIZE)
8810 + INT_REGISTER_SIZE,
8811 tdesc_arm_with_m);
3184d3f9
JL
8812
8813 /* M-profile plus M4F VFP. */
8814 register_remote_g_packet_guess (gdbarch,
8815 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8816 (16 * INT_REGISTER_SIZE)
8817 + (16 * VFP_REGISTER_SIZE)
8818 + (2 * INT_REGISTER_SIZE),
8819 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8820 }
8821
8822 /* Otherwise we don't have a useful guess. */
8823}
8824
7eb89530
YQ
8825/* Implement the code_of_frame_writable gdbarch method. */
8826
8827static int
8828arm_code_of_frame_writable (struct gdbarch *gdbarch, struct frame_info *frame)
8829{
8830 if (gdbarch_tdep (gdbarch)->is_m
8831 && get_frame_type (frame) == SIGTRAMP_FRAME)
8832 {
8833 /* M-profile exception frames return to some magic PCs, where
8834 isn't writable at all. */
8835 return 0;
8836 }
8837 else
8838 return 1;
8839}
8840
70f80edf 8841\f
da3c6d4a
MS
8842/* Initialize the current architecture based on INFO. If possible,
8843 re-use an architecture from ARCHES, which is a list of
8844 architectures already created during this debugging session.
97e03143 8845
da3c6d4a
MS
8846 Called e.g. at program startup, when reading a core file, and when
8847 reading a binary file. */
97e03143 8848
39bbf761
RE
8849static struct gdbarch *
8850arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8851{
97e03143 8852 struct gdbarch_tdep *tdep;
39bbf761 8853 struct gdbarch *gdbarch;
28e97307
DJ
8854 struct gdbarch_list *best_arch;
8855 enum arm_abi_kind arm_abi = arm_abi_global;
8856 enum arm_float_model fp_model = arm_fp_model;
123dc839 8857 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8858 int i, is_m = 0;
330c6ca9 8859 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8860 int have_wmmx_registers = 0;
58d6951d 8861 int have_neon = 0;
ff6f572f 8862 int have_fpa_registers = 1;
9779414d
DJ
8863 const struct target_desc *tdesc = info.target_desc;
8864
8865 /* If we have an object to base this architecture on, try to determine
8866 its ABI. */
8867
8868 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8869 {
8870 int ei_osabi, e_flags;
8871
8872 switch (bfd_get_flavour (info.abfd))
8873 {
9779414d
DJ
8874 case bfd_target_coff_flavour:
8875 /* Assume it's an old APCS-style ABI. */
8876 /* XXX WinCE? */
8877 arm_abi = ARM_ABI_APCS;
8878 break;
8879
8880 case bfd_target_elf_flavour:
8881 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8882 e_flags = elf_elfheader (info.abfd)->e_flags;
8883
8884 if (ei_osabi == ELFOSABI_ARM)
8885 {
8886 /* GNU tools used to use this value, but do not for EABI
8887 objects. There's nowhere to tag an EABI version
8888 anyway, so assume APCS. */
8889 arm_abi = ARM_ABI_APCS;
8890 }
d403db27 8891 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8892 {
8893 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
9779414d
DJ
8894
8895 switch (eabi_ver)
8896 {
8897 case EF_ARM_EABI_UNKNOWN:
8898 /* Assume GNU tools. */
8899 arm_abi = ARM_ABI_APCS;
8900 break;
8901
8902 case EF_ARM_EABI_VER4:
8903 case EF_ARM_EABI_VER5:
8904 arm_abi = ARM_ABI_AAPCS;
8905 /* EABI binaries default to VFP float ordering.
8906 They may also contain build attributes that can
8907 be used to identify if the VFP argument-passing
8908 ABI is in use. */
8909 if (fp_model == ARM_FLOAT_AUTO)
8910 {
8911#ifdef HAVE_ELF
8912 switch (bfd_elf_get_obj_attr_int (info.abfd,
8913 OBJ_ATTR_PROC,
8914 Tag_ABI_VFP_args))
8915 {
b35b0298 8916 case AEABI_VFP_args_base:
9779414d
DJ
8917 /* "The user intended FP parameter/result
8918 passing to conform to AAPCS, base
8919 variant". */
8920 fp_model = ARM_FLOAT_SOFT_VFP;
8921 break;
b35b0298 8922 case AEABI_VFP_args_vfp:
9779414d
DJ
8923 /* "The user intended FP parameter/result
8924 passing to conform to AAPCS, VFP
8925 variant". */
8926 fp_model = ARM_FLOAT_VFP;
8927 break;
b35b0298 8928 case AEABI_VFP_args_toolchain:
9779414d
DJ
8929 /* "The user intended FP parameter/result
8930 passing to conform to tool chain-specific
8931 conventions" - we don't know any such
8932 conventions, so leave it as "auto". */
8933 break;
b35b0298 8934 case AEABI_VFP_args_compatible:
5c294fee
TG
8935 /* "Code is compatible with both the base
8936 and VFP variants; the user did not permit
8937 non-variadic functions to pass FP
8938 parameters/results" - leave it as
8939 "auto". */
8940 break;
9779414d
DJ
8941 default:
8942 /* Attribute value not mentioned in the
5c294fee 8943 November 2012 ABI, so leave it as
9779414d
DJ
8944 "auto". */
8945 break;
8946 }
8947#else
8948 fp_model = ARM_FLOAT_SOFT_VFP;
8949#endif
8950 }
8951 break;
8952
8953 default:
8954 /* Leave it as "auto". */
8955 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8956 break;
8957 }
8958
8959#ifdef HAVE_ELF
8960 /* Detect M-profile programs. This only works if the
8961 executable file includes build attributes; GCC does
8962 copy them to the executable, but e.g. RealView does
8963 not. */
17cbafdb
SM
8964 int attr_arch
8965 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8966 Tag_CPU_arch);
8967 int attr_profile
8968 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8969 Tag_CPU_arch_profile);
8970
9779414d
DJ
8971 /* GCC specifies the profile for v6-M; RealView only
8972 specifies the profile for architectures starting with
8973 V7 (as opposed to architectures with a tag
8974 numerically greater than TAG_CPU_ARCH_V7). */
8975 if (!tdesc_has_registers (tdesc)
8976 && (attr_arch == TAG_CPU_ARCH_V6_M
8977 || attr_arch == TAG_CPU_ARCH_V6S_M
8978 || attr_profile == 'M'))
25f8c692 8979 is_m = 1;
9779414d
DJ
8980#endif
8981 }
8982
8983 if (fp_model == ARM_FLOAT_AUTO)
8984 {
9779414d
DJ
8985 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8986 {
8987 case 0:
8988 /* Leave it as "auto". Strictly speaking this case
8989 means FPA, but almost nobody uses that now, and
8990 many toolchains fail to set the appropriate bits
8991 for the floating-point model they use. */
8992 break;
8993 case EF_ARM_SOFT_FLOAT:
8994 fp_model = ARM_FLOAT_SOFT_FPA;
8995 break;
8996 case EF_ARM_VFP_FLOAT:
8997 fp_model = ARM_FLOAT_VFP;
8998 break;
8999 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
9000 fp_model = ARM_FLOAT_SOFT_VFP;
9001 break;
9002 }
9003 }
9004
9005 if (e_flags & EF_ARM_BE8)
9006 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
9007
9008 break;
9009
9010 default:
9011 /* Leave it as "auto". */
9012 break;
9013 }
9014 }
123dc839
DJ
9015
9016 /* Check any target description for validity. */
9779414d 9017 if (tdesc_has_registers (tdesc))
123dc839
DJ
9018 {
9019 /* For most registers we require GDB's default names; but also allow
9020 the numeric names for sp / lr / pc, as a convenience. */
9021 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
9022 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
9023 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
9024
9025 const struct tdesc_feature *feature;
58d6951d 9026 int valid_p;
123dc839 9027
9779414d 9028 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9029 "org.gnu.gdb.arm.core");
9030 if (feature == NULL)
9779414d
DJ
9031 {
9032 feature = tdesc_find_feature (tdesc,
9033 "org.gnu.gdb.arm.m-profile");
9034 if (feature == NULL)
9035 return NULL;
9036 else
9037 is_m = 1;
9038 }
123dc839
DJ
9039
9040 tdesc_data = tdesc_data_alloc ();
9041
9042 valid_p = 1;
9043 for (i = 0; i < ARM_SP_REGNUM; i++)
9044 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9045 arm_register_names[i]);
9046 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9047 ARM_SP_REGNUM,
9048 arm_sp_names);
9049 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9050 ARM_LR_REGNUM,
9051 arm_lr_names);
9052 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9053 ARM_PC_REGNUM,
9054 arm_pc_names);
9779414d
DJ
9055 if (is_m)
9056 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9057 ARM_PS_REGNUM, "xpsr");
9058 else
9059 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9060 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
9061
9062 if (!valid_p)
9063 {
9064 tdesc_data_cleanup (tdesc_data);
9065 return NULL;
9066 }
9067
9779414d 9068 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9069 "org.gnu.gdb.arm.fpa");
9070 if (feature != NULL)
9071 {
9072 valid_p = 1;
9073 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9074 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9075 arm_register_names[i]);
9076 if (!valid_p)
9077 {
9078 tdesc_data_cleanup (tdesc_data);
9079 return NULL;
9080 }
9081 }
ff6f572f
DJ
9082 else
9083 have_fpa_registers = 0;
9084
9779414d 9085 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9086 "org.gnu.gdb.xscale.iwmmxt");
9087 if (feature != NULL)
9088 {
9089 static const char *const iwmmxt_names[] = {
9090 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9091 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9092 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9093 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9094 };
9095
9096 valid_p = 1;
9097 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9098 valid_p
9099 &= tdesc_numbered_register (feature, tdesc_data, i,
9100 iwmmxt_names[i - ARM_WR0_REGNUM]);
9101
9102 /* Check for the control registers, but do not fail if they
9103 are missing. */
9104 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9105 tdesc_numbered_register (feature, tdesc_data, i,
9106 iwmmxt_names[i - ARM_WR0_REGNUM]);
9107
9108 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9109 valid_p
9110 &= tdesc_numbered_register (feature, tdesc_data, i,
9111 iwmmxt_names[i - ARM_WR0_REGNUM]);
9112
9113 if (!valid_p)
9114 {
9115 tdesc_data_cleanup (tdesc_data);
9116 return NULL;
9117 }
a56cc1ce
YQ
9118
9119 have_wmmx_registers = 1;
ff6f572f 9120 }
58d6951d
DJ
9121
9122 /* If we have a VFP unit, check whether the single precision registers
9123 are present. If not, then we will synthesize them as pseudo
9124 registers. */
9779414d 9125 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9126 "org.gnu.gdb.arm.vfp");
9127 if (feature != NULL)
9128 {
9129 static const char *const vfp_double_names[] = {
9130 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9131 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9132 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9133 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9134 };
9135
9136 /* Require the double precision registers. There must be either
9137 16 or 32. */
9138 valid_p = 1;
9139 for (i = 0; i < 32; i++)
9140 {
9141 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9142 ARM_D0_REGNUM + i,
9143 vfp_double_names[i]);
9144 if (!valid_p)
9145 break;
9146 }
2b9e5ea6
UW
9147 if (!valid_p && i == 16)
9148 valid_p = 1;
58d6951d 9149
2b9e5ea6
UW
9150 /* Also require FPSCR. */
9151 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9152 ARM_FPSCR_REGNUM, "fpscr");
9153 if (!valid_p)
58d6951d
DJ
9154 {
9155 tdesc_data_cleanup (tdesc_data);
9156 return NULL;
9157 }
9158
9159 if (tdesc_unnumbered_register (feature, "s0") == 0)
9160 have_vfp_pseudos = 1;
9161
330c6ca9 9162 vfp_register_count = i;
58d6951d
DJ
9163
9164 /* If we have VFP, also check for NEON. The architecture allows
9165 NEON without VFP (integer vector operations only), but GDB
9166 does not support that. */
9779414d 9167 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9168 "org.gnu.gdb.arm.neon");
9169 if (feature != NULL)
9170 {
9171 /* NEON requires 32 double-precision registers. */
9172 if (i != 32)
9173 {
9174 tdesc_data_cleanup (tdesc_data);
9175 return NULL;
9176 }
9177
9178 /* If there are quad registers defined by the stub, use
9179 their type; otherwise (normally) provide them with
9180 the default type. */
9181 if (tdesc_unnumbered_register (feature, "q0") == 0)
9182 have_neon_pseudos = 1;
9183
9184 have_neon = 1;
9185 }
9186 }
123dc839 9187 }
39bbf761 9188
28e97307
DJ
9189 /* If there is already a candidate, use it. */
9190 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9191 best_arch != NULL;
9192 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9193 {
b8926edc
DJ
9194 if (arm_abi != ARM_ABI_AUTO
9195 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9196 continue;
9197
b8926edc
DJ
9198 if (fp_model != ARM_FLOAT_AUTO
9199 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9200 continue;
9201
58d6951d
DJ
9202 /* There are various other properties in tdep that we do not
9203 need to check here: those derived from a target description,
9204 since gdbarches with a different target description are
9205 automatically disqualified. */
9206
9779414d
DJ
9207 /* Do check is_m, though, since it might come from the binary. */
9208 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9209 continue;
9210
28e97307
DJ
9211 /* Found a match. */
9212 break;
9213 }
97e03143 9214
28e97307 9215 if (best_arch != NULL)
123dc839
DJ
9216 {
9217 if (tdesc_data != NULL)
9218 tdesc_data_cleanup (tdesc_data);
9219 return best_arch->gdbarch;
9220 }
28e97307 9221
8d749320 9222 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9223 gdbarch = gdbarch_alloc (&info, tdep);
9224
28e97307
DJ
9225 /* Record additional information about the architecture we are defining.
9226 These are gdbarch discriminators, like the OSABI. */
9227 tdep->arm_abi = arm_abi;
9228 tdep->fp_model = fp_model;
9779414d 9229 tdep->is_m = is_m;
ff6f572f 9230 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9231 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9232 gdb_assert (vfp_register_count == 0
9233 || vfp_register_count == 16
9234 || vfp_register_count == 32);
9235 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9236 tdep->have_vfp_pseudos = have_vfp_pseudos;
9237 tdep->have_neon_pseudos = have_neon_pseudos;
9238 tdep->have_neon = have_neon;
08216dd7 9239
25f8c692
JL
9240 arm_register_g_packet_guesses (gdbarch);
9241
08216dd7 9242 /* Breakpoints. */
9d4fde75 9243 switch (info.byte_order_for_code)
67255d04
RE
9244 {
9245 case BFD_ENDIAN_BIG:
66e810cd
RE
9246 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9247 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9248 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9249 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9250
67255d04
RE
9251 break;
9252
9253 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9254 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9255 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9256 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9257 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9258
67255d04
RE
9259 break;
9260
9261 default:
9262 internal_error (__FILE__, __LINE__,
edefbb7c 9263 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9264 }
9265
d7b486e7
RE
9266 /* On ARM targets char defaults to unsigned. */
9267 set_gdbarch_char_signed (gdbarch, 0);
9268
53375380
PA
9269 /* wchar_t is unsigned under the AAPCS. */
9270 if (tdep->arm_abi == ARM_ABI_AAPCS)
9271 set_gdbarch_wchar_signed (gdbarch, 0);
9272 else
9273 set_gdbarch_wchar_signed (gdbarch, 1);
53375380 9274
030197b4
AB
9275 /* Compute type alignment. */
9276 set_gdbarch_type_align (gdbarch, arm_type_align);
9277
cca44b1b
JB
9278 /* Note: for displaced stepping, this includes the breakpoint, and one word
9279 of additional scratch space. This setting isn't used for anything beside
9280 displaced stepping at present. */
9281 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9282
9df628e0 9283 /* This should be low enough for everything. */
97e03143 9284 tdep->lowest_pc = 0x20;
94c30b78 9285 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9286
7c00367c
MK
9287 /* The default, for both APCS and AAPCS, is to return small
9288 structures in registers. */
9289 tdep->struct_return = reg_struct_return;
9290
2dd604e7 9291 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9292 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9293
7eb89530
YQ
9294 if (is_m)
9295 set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
9296
756fe439
DJ
9297 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9298
eb5492fa 9299 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9300
34e8f22d 9301 /* Address manipulation. */
34e8f22d
RE
9302 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9303
34e8f22d
RE
9304 /* Advance PC across function entry code. */
9305 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9306
c9cf6e20
MG
9307 /* Detect whether PC is at a point where the stack has been destroyed. */
9308 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9309
190dce09
UW
9310 /* Skip trampolines. */
9311 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9312
34e8f22d
RE
9313 /* The stack grows downward. */
9314 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9315
9316 /* Breakpoint manipulation. */
04180708
YQ
9317 set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
9318 set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
833b7ab5
YQ
9319 set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
9320 arm_breakpoint_kind_from_current_state);
34e8f22d
RE
9321
9322 /* Information about registers, etc. */
34e8f22d
RE
9323 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9324 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9325 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9326 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9327 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9328
ff6f572f
DJ
9329 /* This "info float" is FPA-specific. Use the generic version if we
9330 do not have FPA. */
9331 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9332 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9333
26216b98 9334 /* Internal <-> external register number maps. */
ff6f572f 9335 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9336 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9337
34e8f22d
RE
9338 set_gdbarch_register_name (gdbarch, arm_register_name);
9339
9340 /* Returning results. */
2af48f68 9341 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9342
03d48a7d
RE
9343 /* Disassembly. */
9344 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9345
34e8f22d
RE
9346 /* Minsymbol frobbing. */
9347 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9348 set_gdbarch_coff_make_msymbol_special (gdbarch,
9349 arm_coff_make_msymbol_special);
60c5725c 9350 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9351
f9d67f43
DJ
9352 /* Thumb-2 IT block support. */
9353 set_gdbarch_adjust_breakpoint_address (gdbarch,
9354 arm_adjust_breakpoint_address);
9355
0d5de010
DJ
9356 /* Virtual tables. */
9357 set_gdbarch_vbit_in_delta (gdbarch, 1);
9358
97e03143 9359 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9360 gdbarch_init_osabi (info, gdbarch);
97e03143 9361
b39cc962
DJ
9362 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9363
eb5492fa 9364 /* Add some default predicates. */
2ae28aa9
YQ
9365 if (is_m)
9366 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9367 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9368 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9369 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
779aa56f 9370 frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
a262aec2 9371 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9372
97e03143
RE
9373 /* Now we have tuned the configuration, set a few final things,
9374 based on what the OS ABI has told us. */
9375
b8926edc
DJ
9376 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9377 binaries are always marked. */
9378 if (tdep->arm_abi == ARM_ABI_AUTO)
9379 tdep->arm_abi = ARM_ABI_APCS;
9380
e3039479
UW
9381 /* Watchpoints are not steppable. */
9382 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9383
b8926edc
DJ
9384 /* We used to default to FPA for generic ARM, but almost nobody
9385 uses that now, and we now provide a way for the user to force
9386 the model. So default to the most useful variant. */
9387 if (tdep->fp_model == ARM_FLOAT_AUTO)
9388 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9389
9df628e0
RE
9390 if (tdep->jb_pc >= 0)
9391 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9392
08216dd7 9393 /* Floating point sizes and format. */
8da61cc4 9394 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9395 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9396 {
8da61cc4
DJ
9397 set_gdbarch_double_format
9398 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9399 set_gdbarch_long_double_format
9400 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9401 }
9402 else
9403 {
9404 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9405 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9406 }
9407
58d6951d
DJ
9408 if (have_vfp_pseudos)
9409 {
9410 /* NOTE: These are the only pseudo registers used by
9411 the ARM target at the moment. If more are added, a
9412 little more care in numbering will be needed. */
9413
9414 int num_pseudos = 32;
9415 if (have_neon_pseudos)
9416 num_pseudos += 16;
9417 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9418 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9419 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9420 }
9421
123dc839 9422 if (tdesc_data)
58d6951d
DJ
9423 {
9424 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9425
9779414d 9426 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9427
9428 /* Override tdesc_register_type to adjust the types of VFP
9429 registers for NEON. */
9430 set_gdbarch_register_type (gdbarch, arm_register_type);
9431 }
123dc839
DJ
9432
9433 /* Add standard register aliases. We add aliases even for those
9434 nanes which are used by the current architecture - it's simpler,
9435 and does no harm, since nothing ever lists user registers. */
9436 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9437 user_reg_add (gdbarch, arm_register_aliases[i].name,
9438 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9439
65b48a81
PB
9440 set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
9441 set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
9442
39bbf761
RE
9443 return gdbarch;
9444}
9445
97e03143 9446static void
2af46ca0 9447arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9448{
2af46ca0 9449 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9450
9451 if (tdep == NULL)
9452 return;
9453
edefbb7c 9454 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9455 (unsigned long) tdep->lowest_pc);
9456}
9457
0d4c07af 9458#if GDB_SELF_TEST
b121eeb9
YQ
9459namespace selftests
9460{
9461static void arm_record_test (void);
9462}
0d4c07af 9463#endif
b121eeb9 9464
c906108c 9465void
ed9a39eb 9466_initialize_arm_tdep (void)
c906108c 9467{
bc90b915 9468 long length;
65b48a81 9469 int i, j;
edefbb7c
AC
9470 char regdesc[1024], *rdptr = regdesc;
9471 size_t rest = sizeof (regdesc);
085dd6e6 9472
42cf1509 9473 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9474
60c5725c 9475 arm_objfile_data_key
c1bd65d0 9476 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 9477
0e9e9abd 9478 /* Add ourselves to objfile event chain. */
76727919 9479 gdb::observers::new_objfile.attach (arm_exidx_new_objfile);
0e9e9abd
UW
9480 arm_exidx_data_key
9481 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9482
70f80edf
JT
9483 /* Register an ELF OS ABI sniffer for ARM binaries. */
9484 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9485 bfd_target_elf_flavour,
9486 arm_elf_osabi_sniffer);
9487
9779414d
DJ
9488 /* Initialize the standard target descriptions. */
9489 initialize_tdesc_arm_with_m ();
25f8c692 9490 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9491 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9492 initialize_tdesc_arm_with_iwmmxt ();
9493 initialize_tdesc_arm_with_vfpv2 ();
9494 initialize_tdesc_arm_with_vfpv3 ();
9495 initialize_tdesc_arm_with_neon ();
9779414d 9496
afd7eef0
RE
9497 /* Add root prefix command for all "set arm"/"show arm" commands. */
9498 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9499 _("Various ARM-specific commands."),
afd7eef0
RE
9500 &setarmcmdlist, "set arm ", 0, &setlist);
9501
9502 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9503 _("Various ARM-specific commands."),
afd7eef0 9504 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9505
c5aa993b 9506
65b48a81 9507 arm_disassembler_options = xstrdup ("reg-names-std");
471b9d15
MR
9508 const disasm_options_t *disasm_options
9509 = &disassembler_options_arm ()->options;
65b48a81
PB
9510 int num_disassembly_styles = 0;
9511 for (i = 0; disasm_options->name[i] != NULL; i++)
9512 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9513 num_disassembly_styles++;
9514
9515 /* Initialize the array that will be passed to add_setshow_enum_cmd(). */
8d749320 9516 valid_disassembly_styles = XNEWVEC (const char *,
65b48a81
PB
9517 num_disassembly_styles + 1);
9518 for (i = j = 0; disasm_options->name[i] != NULL; i++)
9519 if (CONST_STRNEQ (disasm_options->name[i], "reg-names-"))
9520 {
9521 size_t offset = strlen ("reg-names-");
9522 const char *style = disasm_options->name[i];
9523 valid_disassembly_styles[j++] = &style[offset];
9524 length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
9525 disasm_options->description[i]);
9526 rdptr += length;
9527 rest -= length;
9528 }
94c30b78 9529 /* Mark the end of valid options. */
65b48a81 9530 valid_disassembly_styles[num_disassembly_styles] = NULL;
c906108c 9531
edefbb7c 9532 /* Create the help text. */
d7e74731
PA
9533 std::string helptext = string_printf ("%s%s%s",
9534 _("The valid values are:\n"),
9535 regdesc,
9536 _("The default is \"std\"."));
ed9a39eb 9537
edefbb7c
AC
9538 add_setshow_enum_cmd("disassembler", no_class,
9539 valid_disassembly_styles, &disassembly_style,
9540 _("Set the disassembly style."),
9541 _("Show the disassembly style."),
09b0e4b0 9542 helptext.c_str (),
2c5b56ce 9543 set_disassembly_style_sfunc,
65b48a81 9544 show_disassembly_style_sfunc,
7376b4c2 9545 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9546
9547 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9548 _("Set usage of ARM 32-bit mode."),
9549 _("Show usage of ARM 32-bit mode."),
9550 _("When off, a 26-bit PC will be used."),
2c5b56ce 9551 NULL,
0963b4bd
MS
9552 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9553 mode is %s. */
26304000 9554 &setarmcmdlist, &showarmcmdlist);
c906108c 9555
fd50bc42 9556 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9557 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9558 _("Set the floating point type."),
9559 _("Show the floating point type."),
9560 _("auto - Determine the FP typefrom the OS-ABI.\n\
9561softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9562fpa - FPA co-processor (GCC compiled).\n\
9563softvfp - Software FP with pure-endian doubles.\n\
9564vfp - VFP co-processor."),
edefbb7c 9565 set_fp_model_sfunc, show_fp_model,
7376b4c2 9566 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9567
28e97307
DJ
9568 /* Add a command to allow the user to force the ABI. */
9569 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9570 _("Set the ABI."),
9571 _("Show the ABI."),
9572 NULL, arm_set_abi, arm_show_abi,
9573 &setarmcmdlist, &showarmcmdlist);
9574
0428b8f5
DJ
9575 /* Add two commands to allow the user to force the assumed
9576 execution mode. */
9577 add_setshow_enum_cmd ("fallback-mode", class_support,
9578 arm_mode_strings, &arm_fallback_mode_string,
9579 _("Set the mode assumed when symbols are unavailable."),
9580 _("Show the mode assumed when symbols are unavailable."),
9581 NULL, NULL, arm_show_fallback_mode,
9582 &setarmcmdlist, &showarmcmdlist);
9583 add_setshow_enum_cmd ("force-mode", class_support,
9584 arm_mode_strings, &arm_force_mode_string,
9585 _("Set the mode assumed even when symbols are available."),
9586 _("Show the mode assumed even when symbols are available."),
9587 NULL, NULL, arm_show_force_mode,
9588 &setarmcmdlist, &showarmcmdlist);
9589
6529d2dd 9590 /* Debugging flag. */
edefbb7c
AC
9591 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9592 _("Set ARM debugging."),
9593 _("Show ARM debugging."),
9594 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9595 NULL,
7915a72c 9596 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9597 &setdebuglist, &showdebuglist);
b121eeb9
YQ
9598
9599#if GDB_SELF_TEST
1526853e 9600 selftests::register_test ("arm-record", selftests::arm_record_test);
b121eeb9
YQ
9601#endif
9602
c906108c 9603}
72508ac0
PO
9604
9605/* ARM-reversible process record data structures. */
9606
9607#define ARM_INSN_SIZE_BYTES 4
9608#define THUMB_INSN_SIZE_BYTES 2
9609#define THUMB2_INSN_SIZE_BYTES 4
9610
9611
71e396f9
LM
9612/* Position of the bit within a 32-bit ARM instruction
9613 that defines whether the instruction is a load or store. */
72508ac0
PO
9614#define INSN_S_L_BIT_NUM 20
9615
9616#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9617 do \
9618 { \
9619 unsigned int reg_len = LENGTH; \
9620 if (reg_len) \
9621 { \
9622 REGS = XNEWVEC (uint32_t, reg_len); \
9623 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9624 } \
9625 } \
9626 while (0)
9627
9628#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9629 do \
9630 { \
9631 unsigned int mem_len = LENGTH; \
9632 if (mem_len) \
9633 { \
9634 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9635 memcpy(&MEMS->len, &RECORD_BUF[0], \
9636 sizeof(struct arm_mem_r) * LENGTH); \
9637 } \
9638 } \
9639 while (0)
9640
9641/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9642#define INSN_RECORDED(ARM_RECORD) \
9643 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9644
9645/* ARM memory record structure. */
9646struct arm_mem_r
9647{
9648 uint32_t len; /* Record length. */
bfbbec00 9649 uint32_t addr; /* Memory address. */
72508ac0
PO
9650};
9651
9652/* ARM instruction record contains opcode of current insn
9653 and execution state (before entry to decode_insn()),
9654 contains list of to-be-modified registers and
9655 memory blocks (on return from decode_insn()). */
9656
9657typedef struct insn_decode_record_t
9658{
9659 struct gdbarch *gdbarch;
9660 struct regcache *regcache;
9661 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9662 uint32_t arm_insn; /* Should accommodate thumb. */
9663 uint32_t cond; /* Condition code. */
9664 uint32_t opcode; /* Insn opcode. */
9665 uint32_t decode; /* Insn decode bits. */
9666 uint32_t mem_rec_count; /* No of mem records. */
9667 uint32_t reg_rec_count; /* No of reg records. */
9668 uint32_t *arm_regs; /* Registers to be saved for this record. */
9669 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9670} insn_decode_record;
9671
9672
9673/* Checks ARM SBZ and SBO mandatory fields. */
9674
9675static int
9676sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9677{
9678 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9679
9680 if (!len)
9681 return 1;
9682
9683 if (!sbo)
9684 ones = ~ones;
9685
9686 while (ones)
9687 {
9688 if (!(ones & sbo))
9689 {
9690 return 0;
9691 }
9692 ones = ones >> 1;
9693 }
9694 return 1;
9695}
9696
c6ec2b30
OJ
9697enum arm_record_result
9698{
9699 ARM_RECORD_SUCCESS = 0,
9700 ARM_RECORD_FAILURE = 1
9701};
9702
72508ac0
PO
9703typedef enum
9704{
9705 ARM_RECORD_STRH=1,
9706 ARM_RECORD_STRD
9707} arm_record_strx_t;
9708
9709typedef enum
9710{
9711 ARM_RECORD=1,
9712 THUMB_RECORD,
9713 THUMB2_RECORD
9714} record_type_t;
9715
9716
9717static int
9718arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9719 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9720{
9721
9722 struct regcache *reg_cache = arm_insn_r->regcache;
9723 ULONGEST u_regval[2]= {0};
9724
9725 uint32_t reg_src1 = 0, reg_src2 = 0;
9726 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
72508ac0
PO
9727
9728 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9729 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
72508ac0
PO
9730
9731 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9732 {
9733 /* 1) Handle misc store, immediate offset. */
9734 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9735 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9736 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9737 regcache_raw_read_unsigned (reg_cache, reg_src1,
9738 &u_regval[0]);
9739 if (ARM_PC_REGNUM == reg_src1)
9740 {
9741 /* If R15 was used as Rn, hence current PC+8. */
9742 u_regval[0] = u_regval[0] + 8;
9743 }
9744 offset_8 = (immed_high << 4) | immed_low;
9745 /* Calculate target store address. */
9746 if (14 == arm_insn_r->opcode)
9747 {
9748 tgt_mem_addr = u_regval[0] + offset_8;
9749 }
9750 else
9751 {
9752 tgt_mem_addr = u_regval[0] - offset_8;
9753 }
9754 if (ARM_RECORD_STRH == str_type)
9755 {
9756 record_buf_mem[0] = 2;
9757 record_buf_mem[1] = tgt_mem_addr;
9758 arm_insn_r->mem_rec_count = 1;
9759 }
9760 else if (ARM_RECORD_STRD == str_type)
9761 {
9762 record_buf_mem[0] = 4;
9763 record_buf_mem[1] = tgt_mem_addr;
9764 record_buf_mem[2] = 4;
9765 record_buf_mem[3] = tgt_mem_addr + 4;
9766 arm_insn_r->mem_rec_count = 2;
9767 }
9768 }
9769 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9770 {
9771 /* 2) Store, register offset. */
9772 /* Get Rm. */
9773 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9774 /* Get Rn. */
9775 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9776 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9777 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9778 if (15 == reg_src2)
9779 {
9780 /* If R15 was used as Rn, hence current PC+8. */
9781 u_regval[0] = u_regval[0] + 8;
9782 }
9783 /* Calculate target store address, Rn +/- Rm, register offset. */
9784 if (12 == arm_insn_r->opcode)
9785 {
9786 tgt_mem_addr = u_regval[0] + u_regval[1];
9787 }
9788 else
9789 {
9790 tgt_mem_addr = u_regval[1] - u_regval[0];
9791 }
9792 if (ARM_RECORD_STRH == str_type)
9793 {
9794 record_buf_mem[0] = 2;
9795 record_buf_mem[1] = tgt_mem_addr;
9796 arm_insn_r->mem_rec_count = 1;
9797 }
9798 else if (ARM_RECORD_STRD == str_type)
9799 {
9800 record_buf_mem[0] = 4;
9801 record_buf_mem[1] = tgt_mem_addr;
9802 record_buf_mem[2] = 4;
9803 record_buf_mem[3] = tgt_mem_addr + 4;
9804 arm_insn_r->mem_rec_count = 2;
9805 }
9806 }
9807 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9808 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9809 {
9810 /* 3) Store, immediate pre-indexed. */
9811 /* 5) Store, immediate post-indexed. */
9812 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9813 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9814 offset_8 = (immed_high << 4) | immed_low;
9815 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9816 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9817 /* Calculate target store address, Rn +/- Rm, register offset. */
9818 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9819 {
9820 tgt_mem_addr = u_regval[0] + offset_8;
9821 }
9822 else
9823 {
9824 tgt_mem_addr = u_regval[0] - offset_8;
9825 }
9826 if (ARM_RECORD_STRH == str_type)
9827 {
9828 record_buf_mem[0] = 2;
9829 record_buf_mem[1] = tgt_mem_addr;
9830 arm_insn_r->mem_rec_count = 1;
9831 }
9832 else if (ARM_RECORD_STRD == str_type)
9833 {
9834 record_buf_mem[0] = 4;
9835 record_buf_mem[1] = tgt_mem_addr;
9836 record_buf_mem[2] = 4;
9837 record_buf_mem[3] = tgt_mem_addr + 4;
9838 arm_insn_r->mem_rec_count = 2;
9839 }
9840 /* Record Rn also as it changes. */
9841 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9842 arm_insn_r->reg_rec_count = 1;
9843 }
9844 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9845 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9846 {
9847 /* 4) Store, register pre-indexed. */
9848 /* 6) Store, register post -indexed. */
9849 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9850 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9851 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9852 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9853 /* Calculate target store address, Rn +/- Rm, register offset. */
9854 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9855 {
9856 tgt_mem_addr = u_regval[0] + u_regval[1];
9857 }
9858 else
9859 {
9860 tgt_mem_addr = u_regval[1] - u_regval[0];
9861 }
9862 if (ARM_RECORD_STRH == str_type)
9863 {
9864 record_buf_mem[0] = 2;
9865 record_buf_mem[1] = tgt_mem_addr;
9866 arm_insn_r->mem_rec_count = 1;
9867 }
9868 else if (ARM_RECORD_STRD == str_type)
9869 {
9870 record_buf_mem[0] = 4;
9871 record_buf_mem[1] = tgt_mem_addr;
9872 record_buf_mem[2] = 4;
9873 record_buf_mem[3] = tgt_mem_addr + 4;
9874 arm_insn_r->mem_rec_count = 2;
9875 }
9876 /* Record Rn also as it changes. */
9877 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9878 arm_insn_r->reg_rec_count = 1;
9879 }
9880 return 0;
9881}
9882
9883/* Handling ARM extension space insns. */
9884
9885static int
9886arm_record_extension_space (insn_decode_record *arm_insn_r)
9887{
df95a9cf 9888 int ret = 0; /* Return value: -1:record failure ; 0:success */
72508ac0
PO
9889 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9890 uint32_t record_buf[8], record_buf_mem[8];
9891 uint32_t reg_src1 = 0;
72508ac0
PO
9892 struct regcache *reg_cache = arm_insn_r->regcache;
9893 ULONGEST u_regval = 0;
9894
9895 gdb_assert (!INSN_RECORDED(arm_insn_r));
9896 /* Handle unconditional insn extension space. */
9897
9898 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9899 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9900 if (arm_insn_r->cond)
9901 {
9902 /* PLD has no affect on architectural state, it just affects
9903 the caches. */
9904 if (5 == ((opcode1 & 0xE0) >> 5))
9905 {
9906 /* BLX(1) */
9907 record_buf[0] = ARM_PS_REGNUM;
9908 record_buf[1] = ARM_LR_REGNUM;
9909 arm_insn_r->reg_rec_count = 2;
9910 }
9911 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9912 }
9913
9914
9915 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9916 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9917 {
9918 ret = -1;
9919 /* Undefined instruction on ARM V5; need to handle if later
9920 versions define it. */
9921 }
9922
9923 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9924 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9925 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9926
9927 /* Handle arithmetic insn extension space. */
9928 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9929 && !INSN_RECORDED(arm_insn_r))
9930 {
9931 /* Handle MLA(S) and MUL(S). */
b020ff80 9932 if (in_inclusive_range (insn_op1, 0U, 3U))
72508ac0
PO
9933 {
9934 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9935 record_buf[1] = ARM_PS_REGNUM;
9936 arm_insn_r->reg_rec_count = 2;
9937 }
b020ff80 9938 else if (in_inclusive_range (insn_op1, 4U, 15U))
72508ac0
PO
9939 {
9940 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9941 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9942 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9943 record_buf[2] = ARM_PS_REGNUM;
9944 arm_insn_r->reg_rec_count = 3;
9945 }
9946 }
9947
9948 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9949 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9950 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9951
9952 /* Handle control insn extension space. */
9953
9954 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9955 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9956 {
9957 if (!bit (arm_insn_r->arm_insn,25))
9958 {
9959 if (!bits (arm_insn_r->arm_insn, 4, 7))
9960 {
9961 if ((0 == insn_op1) || (2 == insn_op1))
9962 {
9963 /* MRS. */
9964 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9965 arm_insn_r->reg_rec_count = 1;
9966 }
9967 else if (1 == insn_op1)
9968 {
9969 /* CSPR is going to be changed. */
9970 record_buf[0] = ARM_PS_REGNUM;
9971 arm_insn_r->reg_rec_count = 1;
9972 }
9973 else if (3 == insn_op1)
9974 {
9975 /* SPSR is going to be changed. */
9976 /* We need to get SPSR value, which is yet to be done. */
72508ac0
PO
9977 return -1;
9978 }
9979 }
9980 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9981 {
9982 if (1 == insn_op1)
9983 {
9984 /* BX. */
9985 record_buf[0] = ARM_PS_REGNUM;
9986 arm_insn_r->reg_rec_count = 1;
9987 }
9988 else if (3 == insn_op1)
9989 {
9990 /* CLZ. */
9991 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9992 arm_insn_r->reg_rec_count = 1;
9993 }
9994 }
9995 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9996 {
9997 /* BLX. */
9998 record_buf[0] = ARM_PS_REGNUM;
9999 record_buf[1] = ARM_LR_REGNUM;
10000 arm_insn_r->reg_rec_count = 2;
10001 }
10002 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
10003 {
10004 /* QADD, QSUB, QDADD, QDSUB */
10005 record_buf[0] = ARM_PS_REGNUM;
10006 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10007 arm_insn_r->reg_rec_count = 2;
10008 }
10009 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
10010 {
10011 /* BKPT. */
10012 record_buf[0] = ARM_PS_REGNUM;
10013 record_buf[1] = ARM_LR_REGNUM;
10014 arm_insn_r->reg_rec_count = 2;
10015
10016 /* Save SPSR also;how? */
72508ac0
PO
10017 return -1;
10018 }
10019 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
10020 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
10021 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
10022 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
10023 )
10024 {
10025 if (0 == insn_op1 || 1 == insn_op1)
10026 {
10027 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
10028 /* We dont do optimization for SMULW<y> where we
10029 need only Rd. */
10030 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10031 record_buf[1] = ARM_PS_REGNUM;
10032 arm_insn_r->reg_rec_count = 2;
10033 }
10034 else if (2 == insn_op1)
10035 {
10036 /* SMLAL<x><y>. */
10037 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10038 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10039 arm_insn_r->reg_rec_count = 2;
10040 }
10041 else if (3 == insn_op1)
10042 {
10043 /* SMUL<x><y>. */
10044 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10045 arm_insn_r->reg_rec_count = 1;
10046 }
10047 }
10048 }
10049 else
10050 {
10051 /* MSR : immediate form. */
10052 if (1 == insn_op1)
10053 {
10054 /* CSPR is going to be changed. */
10055 record_buf[0] = ARM_PS_REGNUM;
10056 arm_insn_r->reg_rec_count = 1;
10057 }
10058 else if (3 == insn_op1)
10059 {
10060 /* SPSR is going to be changed. */
10061 /* we need to get SPSR value, which is yet to be done */
72508ac0
PO
10062 return -1;
10063 }
10064 }
10065 }
10066
10067 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10068 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10069 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10070
10071 /* Handle load/store insn extension space. */
10072
10073 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10074 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10075 && !INSN_RECORDED(arm_insn_r))
10076 {
10077 /* SWP/SWPB. */
10078 if (0 == insn_op1)
10079 {
10080 /* These insn, changes register and memory as well. */
10081 /* SWP or SWPB insn. */
10082 /* Get memory address given by Rn. */
10083 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10084 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10085 /* SWP insn ?, swaps word. */
10086 if (8 == arm_insn_r->opcode)
10087 {
10088 record_buf_mem[0] = 4;
10089 }
10090 else
10091 {
10092 /* SWPB insn, swaps only byte. */
10093 record_buf_mem[0] = 1;
10094 }
10095 record_buf_mem[1] = u_regval;
10096 arm_insn_r->mem_rec_count = 1;
10097 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10098 arm_insn_r->reg_rec_count = 1;
10099 }
10100 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10101 {
10102 /* STRH. */
10103 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10104 ARM_RECORD_STRH);
10105 }
10106 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10107 {
10108 /* LDRD. */
10109 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10110 record_buf[1] = record_buf[0] + 1;
10111 arm_insn_r->reg_rec_count = 2;
10112 }
10113 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10114 {
10115 /* STRD. */
10116 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10117 ARM_RECORD_STRD);
10118 }
10119 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10120 {
10121 /* LDRH, LDRSB, LDRSH. */
10122 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10123 arm_insn_r->reg_rec_count = 1;
10124 }
10125
10126 }
10127
10128 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10129 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10130 && !INSN_RECORDED(arm_insn_r))
10131 {
10132 ret = -1;
10133 /* Handle coprocessor insn extension space. */
10134 }
10135
10136 /* To be done for ARMv5 and later; as of now we return -1. */
10137 if (-1 == ret)
ca92db2d 10138 return ret;
72508ac0
PO
10139
10140 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10141 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10142
10143 return ret;
10144}
10145
10146/* Handling opcode 000 insns. */
10147
10148static int
10149arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10150{
10151 struct regcache *reg_cache = arm_insn_r->regcache;
10152 uint32_t record_buf[8], record_buf_mem[8];
10153 ULONGEST u_regval[2] = {0};
10154
8d49165d 10155 uint32_t reg_src1 = 0;
72508ac0
PO
10156 uint32_t opcode1 = 0;
10157
10158 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10159 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10160 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10161
2d9e6acb 10162 if (!((opcode1 & 0x19) == 0x10))
72508ac0 10163 {
2d9e6acb
YQ
10164 /* Data-processing (register) and Data-processing (register-shifted
10165 register */
10166 /* Out of 11 shifter operands mode, all the insn modifies destination
10167 register, which is specified by 13-16 decode. */
10168 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10169 record_buf[1] = ARM_PS_REGNUM;
10170 arm_insn_r->reg_rec_count = 2;
72508ac0 10171 }
2d9e6acb 10172 else if ((arm_insn_r->decode < 8) && ((opcode1 & 0x19) == 0x10))
72508ac0 10173 {
2d9e6acb
YQ
10174 /* Miscellaneous instructions */
10175
10176 if (3 == arm_insn_r->decode && 0x12 == opcode1
10177 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10178 {
10179 /* Handle BLX, branch and link/exchange. */
10180 if (9 == arm_insn_r->opcode)
10181 {
10182 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10183 and R14 stores the return address. */
10184 record_buf[0] = ARM_PS_REGNUM;
10185 record_buf[1] = ARM_LR_REGNUM;
10186 arm_insn_r->reg_rec_count = 2;
10187 }
10188 }
10189 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10190 {
10191 /* Handle enhanced software breakpoint insn, BKPT. */
10192 /* CPSR is changed to be executed in ARM state, disabling normal
10193 interrupts, entering abort mode. */
10194 /* According to high vector configuration PC is set. */
10195 /* user hit breakpoint and type reverse, in
10196 that case, we need to go back with previous CPSR and
10197 Program Counter. */
10198 record_buf[0] = ARM_PS_REGNUM;
10199 record_buf[1] = ARM_LR_REGNUM;
10200 arm_insn_r->reg_rec_count = 2;
10201
10202 /* Save SPSR also; how? */
10203 return -1;
10204 }
10205 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10206 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10207 {
10208 /* Handle BX, branch and link/exchange. */
10209 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10210 record_buf[0] = ARM_PS_REGNUM;
10211 arm_insn_r->reg_rec_count = 1;
10212 }
10213 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10214 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10215 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10216 {
10217 /* Count leading zeros: CLZ. */
10218 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10219 arm_insn_r->reg_rec_count = 1;
10220 }
10221 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10222 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10223 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10224 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0))
10225 {
10226 /* Handle MRS insn. */
10227 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10228 arm_insn_r->reg_rec_count = 1;
10229 }
72508ac0 10230 }
2d9e6acb 10231 else if (9 == arm_insn_r->decode && opcode1 < 0x10)
72508ac0 10232 {
2d9e6acb
YQ
10233 /* Multiply and multiply-accumulate */
10234
10235 /* Handle multiply instructions. */
10236 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10237 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10238 {
10239 /* Handle MLA and MUL. */
10240 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10241 record_buf[1] = ARM_PS_REGNUM;
10242 arm_insn_r->reg_rec_count = 2;
10243 }
10244 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10245 {
10246 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10247 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10248 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10249 record_buf[2] = ARM_PS_REGNUM;
10250 arm_insn_r->reg_rec_count = 3;
10251 }
10252 }
10253 else if (9 == arm_insn_r->decode && opcode1 > 0x10)
10254 {
10255 /* Synchronization primitives */
10256
72508ac0
PO
10257 /* Handling SWP, SWPB. */
10258 /* These insn, changes register and memory as well. */
10259 /* SWP or SWPB insn. */
10260
10261 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10262 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10263 /* SWP insn ?, swaps word. */
10264 if (8 == arm_insn_r->opcode)
2d9e6acb
YQ
10265 {
10266 record_buf_mem[0] = 4;
10267 }
10268 else
10269 {
10270 /* SWPB insn, swaps only byte. */
10271 record_buf_mem[0] = 1;
10272 }
72508ac0
PO
10273 record_buf_mem[1] = u_regval[0];
10274 arm_insn_r->mem_rec_count = 1;
10275 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10276 arm_insn_r->reg_rec_count = 1;
10277 }
2d9e6acb
YQ
10278 else if (11 == arm_insn_r->decode || 13 == arm_insn_r->decode
10279 || 15 == arm_insn_r->decode)
72508ac0 10280 {
2d9e6acb
YQ
10281 if ((opcode1 & 0x12) == 2)
10282 {
10283 /* Extra load/store (unprivileged) */
10284 return -1;
10285 }
10286 else
10287 {
10288 /* Extra load/store */
10289 switch (bits (arm_insn_r->arm_insn, 5, 6))
10290 {
10291 case 1:
10292 if ((opcode1 & 0x05) == 0x0 || (opcode1 & 0x05) == 0x4)
10293 {
10294 /* STRH (register), STRH (immediate) */
10295 arm_record_strx (arm_insn_r, &record_buf[0],
10296 &record_buf_mem[0], ARM_RECORD_STRH);
10297 }
10298 else if ((opcode1 & 0x05) == 0x1)
10299 {
10300 /* LDRH (register) */
10301 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10302 arm_insn_r->reg_rec_count = 1;
72508ac0 10303
2d9e6acb
YQ
10304 if (bit (arm_insn_r->arm_insn, 21))
10305 {
10306 /* Write back to Rn. */
10307 record_buf[arm_insn_r->reg_rec_count++]
10308 = bits (arm_insn_r->arm_insn, 16, 19);
10309 }
10310 }
10311 else if ((opcode1 & 0x05) == 0x5)
10312 {
10313 /* LDRH (immediate), LDRH (literal) */
10314 int rn = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10315
2d9e6acb
YQ
10316 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10317 arm_insn_r->reg_rec_count = 1;
10318
10319 if (rn != 15)
10320 {
10321 /*LDRH (immediate) */
10322 if (bit (arm_insn_r->arm_insn, 21))
10323 {
10324 /* Write back to Rn. */
10325 record_buf[arm_insn_r->reg_rec_count++] = rn;
10326 }
10327 }
10328 }
10329 else
10330 return -1;
10331 break;
10332 case 2:
10333 if ((opcode1 & 0x05) == 0x0)
10334 {
10335 /* LDRD (register) */
10336 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10337 record_buf[1] = record_buf[0] + 1;
10338 arm_insn_r->reg_rec_count = 2;
10339
10340 if (bit (arm_insn_r->arm_insn, 21))
10341 {
10342 /* Write back to Rn. */
10343 record_buf[arm_insn_r->reg_rec_count++]
10344 = bits (arm_insn_r->arm_insn, 16, 19);
10345 }
10346 }
10347 else if ((opcode1 & 0x05) == 0x1)
10348 {
10349 /* LDRSB (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 || (opcode1 & 0x05) == 0x5)
10361 {
10362 /* LDRD (immediate), LDRD (literal), LDRSB (immediate),
10363 LDRSB (literal) */
10364 int rn = bits (arm_insn_r->arm_insn, 16, 19);
10365
10366 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10367 arm_insn_r->reg_rec_count = 1;
10368
10369 if (rn != 15)
10370 {
10371 /*LDRD (immediate), LDRSB (immediate) */
10372 if (bit (arm_insn_r->arm_insn, 21))
10373 {
10374 /* Write back to Rn. */
10375 record_buf[arm_insn_r->reg_rec_count++] = rn;
10376 }
10377 }
10378 }
10379 else
10380 return -1;
10381 break;
10382 case 3:
10383 if ((opcode1 & 0x05) == 0x0)
10384 {
10385 /* STRD (register) */
10386 arm_record_strx (arm_insn_r, &record_buf[0],
10387 &record_buf_mem[0], ARM_RECORD_STRD);
10388 }
10389 else if ((opcode1 & 0x05) == 0x1)
10390 {
10391 /* LDRSH (register) */
10392 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10393 arm_insn_r->reg_rec_count = 1;
10394
10395 if (bit (arm_insn_r->arm_insn, 21))
10396 {
10397 /* Write back to Rn. */
10398 record_buf[arm_insn_r->reg_rec_count++]
10399 = bits (arm_insn_r->arm_insn, 16, 19);
10400 }
10401 }
10402 else if ((opcode1 & 0x05) == 0x4)
10403 {
10404 /* STRD (immediate) */
10405 arm_record_strx (arm_insn_r, &record_buf[0],
10406 &record_buf_mem[0], ARM_RECORD_STRD);
10407 }
10408 else if ((opcode1 & 0x05) == 0x5)
10409 {
10410 /* LDRSH (immediate), LDRSH (literal) */
10411 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10412 arm_insn_r->reg_rec_count = 1;
10413
10414 if (bit (arm_insn_r->arm_insn, 21))
10415 {
10416 /* Write back to Rn. */
10417 record_buf[arm_insn_r->reg_rec_count++]
10418 = bits (arm_insn_r->arm_insn, 16, 19);
10419 }
10420 }
10421 else
10422 return -1;
10423 break;
10424 default:
10425 return -1;
10426 }
10427 }
72508ac0
PO
10428 }
10429 else
10430 {
10431 return -1;
10432 }
10433
10434 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10435 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10436 return 0;
10437}
10438
10439/* Handling opcode 001 insns. */
10440
10441static int
10442arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10443{
10444 uint32_t record_buf[8], record_buf_mem[8];
10445
10446 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10447 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10448
10449 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10450 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10451 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10452 )
10453 {
10454 /* Handle MSR insn. */
10455 if (9 == arm_insn_r->opcode)
10456 {
10457 /* CSPR is going to be changed. */
10458 record_buf[0] = ARM_PS_REGNUM;
10459 arm_insn_r->reg_rec_count = 1;
10460 }
10461 else
10462 {
10463 /* SPSR is going to be changed. */
10464 }
10465 }
10466 else if (arm_insn_r->opcode <= 15)
10467 {
10468 /* Normal data processing insns. */
10469 /* Out of 11 shifter operands mode, all the insn modifies destination
10470 register, which is specified by 13-16 decode. */
10471 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10472 record_buf[1] = ARM_PS_REGNUM;
10473 arm_insn_r->reg_rec_count = 2;
10474 }
10475 else
10476 {
10477 return -1;
10478 }
10479
10480 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10481 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10482 return 0;
10483}
10484
c55978a6
YQ
10485static int
10486arm_record_media (insn_decode_record *arm_insn_r)
10487{
10488 uint32_t record_buf[8];
10489
10490 switch (bits (arm_insn_r->arm_insn, 22, 24))
10491 {
10492 case 0:
10493 /* Parallel addition and subtraction, signed */
10494 case 1:
10495 /* Parallel addition and subtraction, unsigned */
10496 case 2:
10497 case 3:
10498 /* Packing, unpacking, saturation and reversal */
10499 {
10500 int rd = bits (arm_insn_r->arm_insn, 12, 15);
10501
10502 record_buf[arm_insn_r->reg_rec_count++] = rd;
10503 }
10504 break;
10505
10506 case 4:
10507 case 5:
10508 /* Signed multiplies */
10509 {
10510 int rd = bits (arm_insn_r->arm_insn, 16, 19);
10511 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
10512
10513 record_buf[arm_insn_r->reg_rec_count++] = rd;
10514 if (op1 == 0x0)
10515 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10516 else if (op1 == 0x4)
10517 record_buf[arm_insn_r->reg_rec_count++]
10518 = bits (arm_insn_r->arm_insn, 12, 15);
10519 }
10520 break;
10521
10522 case 6:
10523 {
10524 if (bit (arm_insn_r->arm_insn, 21)
10525 && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
10526 {
10527 /* SBFX */
10528 record_buf[arm_insn_r->reg_rec_count++]
10529 = bits (arm_insn_r->arm_insn, 12, 15);
10530 }
10531 else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
10532 && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
10533 {
10534 /* USAD8 and USADA8 */
10535 record_buf[arm_insn_r->reg_rec_count++]
10536 = bits (arm_insn_r->arm_insn, 16, 19);
10537 }
10538 }
10539 break;
10540
10541 case 7:
10542 {
10543 if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
10544 && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
10545 {
10546 /* Permanently UNDEFINED */
10547 return -1;
10548 }
10549 else
10550 {
10551 /* BFC, BFI and UBFX */
10552 record_buf[arm_insn_r->reg_rec_count++]
10553 = bits (arm_insn_r->arm_insn, 12, 15);
10554 }
10555 }
10556 break;
10557
10558 default:
10559 return -1;
10560 }
10561
10562 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10563
10564 return 0;
10565}
10566
71e396f9 10567/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10568
10569static int
10570arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10571{
10572 struct regcache *reg_cache = arm_insn_r->regcache;
10573
71e396f9
LM
10574 uint32_t reg_base , reg_dest;
10575 uint32_t offset_12, tgt_mem_addr;
72508ac0 10576 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10577 unsigned char wback;
10578 ULONGEST u_regval;
72508ac0 10579
71e396f9
LM
10580 /* Calculate wback. */
10581 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10582 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10583
71e396f9
LM
10584 arm_insn_r->reg_rec_count = 0;
10585 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10586
10587 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10588 {
71e396f9
LM
10589 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10590 and LDRT. */
10591
72508ac0 10592 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10593 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10594
10595 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10596 preceeds a LDR instruction having R15 as reg_base, it
10597 emulates a branch and link instruction, and hence we need to save
10598 CPSR and PC as well. */
10599 if (ARM_PC_REGNUM == reg_dest)
10600 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10601
10602 /* If wback is true, also save the base register, which is going to be
10603 written to. */
10604 if (wback)
10605 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10606 }
10607 else
10608 {
71e396f9
LM
10609 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10610
72508ac0 10611 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10612 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10613
10614 /* Handle bit U. */
72508ac0 10615 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10616 {
10617 /* U == 1: Add the offset. */
10618 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10619 }
72508ac0 10620 else
71e396f9
LM
10621 {
10622 /* U == 0: subtract the offset. */
10623 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10624 }
10625
10626 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10627 bytes. */
10628 if (bit (arm_insn_r->arm_insn, 22))
10629 {
10630 /* STRB and STRBT: 1 byte. */
10631 record_buf_mem[0] = 1;
10632 }
10633 else
10634 {
10635 /* STR and STRT: 4 bytes. */
10636 record_buf_mem[0] = 4;
10637 }
10638
10639 /* Handle bit P. */
10640 if (bit (arm_insn_r->arm_insn, 24))
10641 record_buf_mem[1] = tgt_mem_addr;
10642 else
10643 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10644
72508ac0
PO
10645 arm_insn_r->mem_rec_count = 1;
10646
71e396f9
LM
10647 /* If wback is true, also save the base register, which is going to be
10648 written to. */
10649 if (wback)
10650 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10651 }
10652
10653 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10654 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10655 return 0;
10656}
10657
10658/* Handling opcode 011 insns. */
10659
10660static int
10661arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10662{
10663 struct regcache *reg_cache = arm_insn_r->regcache;
10664
10665 uint32_t shift_imm = 0;
10666 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10667 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10668 uint32_t record_buf[8], record_buf_mem[8];
10669
10670 LONGEST s_word;
10671 ULONGEST u_regval[2];
10672
c55978a6
YQ
10673 if (bit (arm_insn_r->arm_insn, 4))
10674 return arm_record_media (arm_insn_r);
10675
72508ac0
PO
10676 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10677 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10678
10679 /* Handle enhanced store insns and LDRD DSP insn,
10680 order begins according to addressing modes for store insns
10681 STRH insn. */
10682
10683 /* LDR or STR? */
10684 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10685 {
10686 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10687 /* LDR insn has a capability to do branching, if
10688 MOV LR, PC is precedded by LDR insn having Rn as R15
10689 in that case, it emulates branch and link insn, and hence we
10690 need to save CSPR and PC as well. */
10691 if (15 != reg_dest)
10692 {
10693 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10694 arm_insn_r->reg_rec_count = 1;
10695 }
10696 else
10697 {
10698 record_buf[0] = reg_dest;
10699 record_buf[1] = ARM_PS_REGNUM;
10700 arm_insn_r->reg_rec_count = 2;
10701 }
10702 }
10703 else
10704 {
10705 if (! bits (arm_insn_r->arm_insn, 4, 11))
10706 {
10707 /* Store insn, register offset and register pre-indexed,
10708 register post-indexed. */
10709 /* Get Rm. */
10710 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10711 /* Get Rn. */
10712 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10713 regcache_raw_read_unsigned (reg_cache, reg_src1
10714 , &u_regval[0]);
10715 regcache_raw_read_unsigned (reg_cache, reg_src2
10716 , &u_regval[1]);
10717 if (15 == reg_src2)
10718 {
10719 /* If R15 was used as Rn, hence current PC+8. */
10720 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10721 u_regval[0] = u_regval[0] + 8;
10722 }
10723 /* Calculate target store address, Rn +/- Rm, register offset. */
10724 /* U == 1. */
10725 if (bit (arm_insn_r->arm_insn, 23))
10726 {
10727 tgt_mem_addr = u_regval[0] + u_regval[1];
10728 }
10729 else
10730 {
10731 tgt_mem_addr = u_regval[1] - u_regval[0];
10732 }
10733
10734 switch (arm_insn_r->opcode)
10735 {
10736 /* STR. */
10737 case 8:
10738 case 12:
10739 /* STR. */
10740 case 9:
10741 case 13:
10742 /* STRT. */
10743 case 1:
10744 case 5:
10745 /* STR. */
10746 case 0:
10747 case 4:
10748 record_buf_mem[0] = 4;
10749 break;
10750
10751 /* STRB. */
10752 case 10:
10753 case 14:
10754 /* STRB. */
10755 case 11:
10756 case 15:
10757 /* STRBT. */
10758 case 3:
10759 case 7:
10760 /* STRB. */
10761 case 2:
10762 case 6:
10763 record_buf_mem[0] = 1;
10764 break;
10765
10766 default:
10767 gdb_assert_not_reached ("no decoding pattern found");
10768 break;
10769 }
10770 record_buf_mem[1] = tgt_mem_addr;
10771 arm_insn_r->mem_rec_count = 1;
10772
10773 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10774 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10775 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10776 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10777 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10778 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10779 )
10780 {
10781 /* Rn is going to be changed in pre-indexed mode and
10782 post-indexed mode as well. */
10783 record_buf[0] = reg_src2;
10784 arm_insn_r->reg_rec_count = 1;
10785 }
10786 }
10787 else
10788 {
10789 /* Store insn, scaled register offset; scaled pre-indexed. */
10790 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10791 /* Get Rm. */
10792 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10793 /* Get Rn. */
10794 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10795 /* Get shift_imm. */
10796 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10797 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10798 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10799 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10800 /* Offset_12 used as shift. */
10801 switch (offset_12)
10802 {
10803 case 0:
10804 /* Offset_12 used as index. */
10805 offset_12 = u_regval[0] << shift_imm;
10806 break;
10807
10808 case 1:
10809 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10810 break;
10811
10812 case 2:
10813 if (!shift_imm)
10814 {
10815 if (bit (u_regval[0], 31))
10816 {
10817 offset_12 = 0xFFFFFFFF;
10818 }
10819 else
10820 {
10821 offset_12 = 0;
10822 }
10823 }
10824 else
10825 {
10826 /* This is arithmetic shift. */
10827 offset_12 = s_word >> shift_imm;
10828 }
10829 break;
10830
10831 case 3:
10832 if (!shift_imm)
10833 {
10834 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10835 &u_regval[1]);
10836 /* Get C flag value and shift it by 31. */
10837 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10838 | (u_regval[0]) >> 1);
10839 }
10840 else
10841 {
10842 offset_12 = (u_regval[0] >> shift_imm) \
10843 | (u_regval[0] <<
10844 (sizeof(uint32_t) - shift_imm));
10845 }
10846 break;
10847
10848 default:
10849 gdb_assert_not_reached ("no decoding pattern found");
10850 break;
10851 }
10852
10853 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10854 /* bit U set. */
10855 if (bit (arm_insn_r->arm_insn, 23))
10856 {
10857 tgt_mem_addr = u_regval[1] + offset_12;
10858 }
10859 else
10860 {
10861 tgt_mem_addr = u_regval[1] - offset_12;
10862 }
10863
10864 switch (arm_insn_r->opcode)
10865 {
10866 /* STR. */
10867 case 8:
10868 case 12:
10869 /* STR. */
10870 case 9:
10871 case 13:
10872 /* STRT. */
10873 case 1:
10874 case 5:
10875 /* STR. */
10876 case 0:
10877 case 4:
10878 record_buf_mem[0] = 4;
10879 break;
10880
10881 /* STRB. */
10882 case 10:
10883 case 14:
10884 /* STRB. */
10885 case 11:
10886 case 15:
10887 /* STRBT. */
10888 case 3:
10889 case 7:
10890 /* STRB. */
10891 case 2:
10892 case 6:
10893 record_buf_mem[0] = 1;
10894 break;
10895
10896 default:
10897 gdb_assert_not_reached ("no decoding pattern found");
10898 break;
10899 }
10900 record_buf_mem[1] = tgt_mem_addr;
10901 arm_insn_r->mem_rec_count = 1;
10902
10903 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10904 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10905 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10906 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10907 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10908 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10909 )
10910 {
10911 /* Rn is going to be changed in register scaled pre-indexed
10912 mode,and scaled post indexed mode. */
10913 record_buf[0] = reg_src2;
10914 arm_insn_r->reg_rec_count = 1;
10915 }
10916 }
10917 }
10918
10919 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10920 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10921 return 0;
10922}
10923
71e396f9 10924/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10925
10926static int
10927arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10928{
10929 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10930 uint32_t register_count = 0, register_bits;
10931 uint32_t reg_base, addr_mode;
72508ac0 10932 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10933 uint32_t wback;
10934 ULONGEST u_regval;
72508ac0 10935
71e396f9
LM
10936 /* Fetch the list of registers. */
10937 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10938 arm_insn_r->reg_rec_count = 0;
10939
10940 /* Fetch the base register that contains the address we are loading data
10941 to. */
10942 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10943
71e396f9
LM
10944 /* Calculate wback. */
10945 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10946
10947 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10948 {
71e396f9 10949 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10950
71e396f9 10951 /* Find out which registers are going to be loaded from memory. */
72508ac0 10952 while (register_bits)
71e396f9
LM
10953 {
10954 if (register_bits & 0x00000001)
10955 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10956 register_bits = register_bits >> 1;
10957 register_count++;
10958 }
72508ac0 10959
71e396f9
LM
10960
10961 /* If wback is true, also save the base register, which is going to be
10962 written to. */
10963 if (wback)
10964 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10965
10966 /* Save the CPSR register. */
10967 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10968 }
10969 else
10970 {
71e396f9 10971 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10972
71e396f9
LM
10973 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10974
10975 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10976
10977 /* Find out how many registers are going to be stored to memory. */
72508ac0 10978 while (register_bits)
71e396f9
LM
10979 {
10980 if (register_bits & 0x00000001)
10981 register_count++;
10982 register_bits = register_bits >> 1;
10983 }
72508ac0
PO
10984
10985 switch (addr_mode)
71e396f9
LM
10986 {
10987 /* STMDA (STMED): Decrement after. */
10988 case 0:
10989 record_buf_mem[1] = (uint32_t) u_regval
10990 - register_count * INT_REGISTER_SIZE + 4;
10991 break;
10992 /* STM (STMIA, STMEA): Increment after. */
10993 case 1:
10994 record_buf_mem[1] = (uint32_t) u_regval;
10995 break;
10996 /* STMDB (STMFD): Decrement before. */
10997 case 2:
10998 record_buf_mem[1] = (uint32_t) u_regval
10999 - register_count * INT_REGISTER_SIZE;
11000 break;
11001 /* STMIB (STMFA): Increment before. */
11002 case 3:
11003 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
11004 break;
11005 default:
11006 gdb_assert_not_reached ("no decoding pattern found");
11007 break;
11008 }
72508ac0 11009
71e396f9
LM
11010 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
11011 arm_insn_r->mem_rec_count = 1;
11012
11013 /* If wback is true, also save the base register, which is going to be
11014 written to. */
11015 if (wback)
11016 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
11017 }
11018
11019 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11020 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11021 return 0;
11022}
11023
11024/* Handling opcode 101 insns. */
11025
11026static int
11027arm_record_b_bl (insn_decode_record *arm_insn_r)
11028{
11029 uint32_t record_buf[8];
11030
11031 /* Handle B, BL, BLX(1) insns. */
11032 /* B simply branches so we do nothing here. */
11033 /* Note: BLX(1) doesnt fall here but instead it falls into
11034 extension space. */
11035 if (bit (arm_insn_r->arm_insn, 24))
11036 {
11037 record_buf[0] = ARM_LR_REGNUM;
11038 arm_insn_r->reg_rec_count = 1;
11039 }
11040
11041 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11042
11043 return 0;
11044}
11045
72508ac0 11046static int
c6ec2b30 11047arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
11048{
11049 printf_unfiltered (_("Process record does not support instruction "
01e57735
YQ
11050 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11051 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
72508ac0
PO
11052
11053 return -1;
11054}
11055
5a578da5
OJ
11056/* Record handler for vector data transfer instructions. */
11057
11058static int
11059arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
11060{
11061 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
11062 uint32_t record_buf[4];
11063
5a578da5
OJ
11064 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
11065 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
11066 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
11067 bit_l = bit (arm_insn_r->arm_insn, 20);
11068 bit_c = bit (arm_insn_r->arm_insn, 8);
11069
11070 /* Handle VMOV instruction. */
11071 if (bit_l && bit_c)
11072 {
11073 record_buf[0] = reg_t;
11074 arm_insn_r->reg_rec_count = 1;
11075 }
11076 else if (bit_l && !bit_c)
11077 {
11078 /* Handle VMOV instruction. */
11079 if (bits_a == 0x00)
11080 {
f1771dce 11081 record_buf[0] = reg_t;
5a578da5
OJ
11082 arm_insn_r->reg_rec_count = 1;
11083 }
11084 /* Handle VMRS instruction. */
11085 else if (bits_a == 0x07)
11086 {
11087 if (reg_t == 15)
11088 reg_t = ARM_PS_REGNUM;
11089
11090 record_buf[0] = reg_t;
11091 arm_insn_r->reg_rec_count = 1;
11092 }
11093 }
11094 else if (!bit_l && !bit_c)
11095 {
11096 /* Handle VMOV instruction. */
11097 if (bits_a == 0x00)
11098 {
f1771dce 11099 record_buf[0] = ARM_D0_REGNUM + reg_v;
5a578da5
OJ
11100
11101 arm_insn_r->reg_rec_count = 1;
11102 }
11103 /* Handle VMSR instruction. */
11104 else if (bits_a == 0x07)
11105 {
11106 record_buf[0] = ARM_FPSCR_REGNUM;
11107 arm_insn_r->reg_rec_count = 1;
11108 }
11109 }
11110 else if (!bit_l && bit_c)
11111 {
11112 /* Handle VMOV instruction. */
11113 if (!(bits_a & 0x04))
11114 {
11115 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
11116 + ARM_D0_REGNUM;
11117 arm_insn_r->reg_rec_count = 1;
11118 }
11119 /* Handle VDUP instruction. */
11120 else
11121 {
11122 if (bit (arm_insn_r->arm_insn, 21))
11123 {
11124 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11125 record_buf[0] = reg_v + ARM_D0_REGNUM;
11126 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
11127 arm_insn_r->reg_rec_count = 2;
11128 }
11129 else
11130 {
11131 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
11132 record_buf[0] = reg_v + ARM_D0_REGNUM;
11133 arm_insn_r->reg_rec_count = 1;
11134 }
11135 }
11136 }
11137
11138 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11139 return 0;
11140}
11141
f20f80dd
OJ
11142/* Record handler for extension register load/store instructions. */
11143
11144static int
11145arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
11146{
11147 uint32_t opcode, single_reg;
11148 uint8_t op_vldm_vstm;
11149 uint32_t record_buf[8], record_buf_mem[128];
11150 ULONGEST u_regval = 0;
11151
11152 struct regcache *reg_cache = arm_insn_r->regcache;
f20f80dd
OJ
11153
11154 opcode = bits (arm_insn_r->arm_insn, 20, 24);
9fde51ed 11155 single_reg = !bit (arm_insn_r->arm_insn, 8);
f20f80dd
OJ
11156 op_vldm_vstm = opcode & 0x1b;
11157
11158 /* Handle VMOV instructions. */
11159 if ((opcode & 0x1e) == 0x04)
11160 {
9fde51ed 11161 if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
01e57735
YQ
11162 {
11163 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11164 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11165 arm_insn_r->reg_rec_count = 2;
11166 }
f20f80dd 11167 else
01e57735 11168 {
9fde51ed
YQ
11169 uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
11170 uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
f20f80dd 11171
9fde51ed 11172 if (single_reg)
01e57735 11173 {
9fde51ed
YQ
11174 /* The first S register number m is REG_M:M (M is bit 5),
11175 the corresponding D register number is REG_M:M / 2, which
11176 is REG_M. */
11177 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
11178 /* The second S register number is REG_M:M + 1, the
11179 corresponding D register number is (REG_M:M + 1) / 2.
11180 IOW, if bit M is 1, the first and second S registers
11181 are mapped to different D registers, otherwise, they are
11182 in the same D register. */
11183 if (bit_m)
11184 {
11185 record_buf[arm_insn_r->reg_rec_count++]
11186 = ARM_D0_REGNUM + reg_m + 1;
11187 }
01e57735
YQ
11188 }
11189 else
11190 {
9fde51ed 11191 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
01e57735
YQ
11192 arm_insn_r->reg_rec_count = 1;
11193 }
11194 }
f20f80dd
OJ
11195 }
11196 /* Handle VSTM and VPUSH instructions. */
11197 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
01e57735 11198 || op_vldm_vstm == 0x12)
f20f80dd
OJ
11199 {
11200 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11201 uint32_t memory_index = 0;
11202
11203 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11204 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11205 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
9fde51ed 11206 imm_off32 = imm_off8 << 2;
f20f80dd
OJ
11207 memory_count = imm_off8;
11208
11209 if (bit (arm_insn_r->arm_insn, 23))
01e57735 11210 start_address = u_regval;
f20f80dd 11211 else
01e57735 11212 start_address = u_regval - imm_off32;
f20f80dd
OJ
11213
11214 if (bit (arm_insn_r->arm_insn, 21))
01e57735
YQ
11215 {
11216 record_buf[0] = reg_rn;
11217 arm_insn_r->reg_rec_count = 1;
11218 }
f20f80dd
OJ
11219
11220 while (memory_count > 0)
01e57735 11221 {
9fde51ed 11222 if (single_reg)
01e57735 11223 {
9fde51ed
YQ
11224 record_buf_mem[memory_index] = 4;
11225 record_buf_mem[memory_index + 1] = start_address;
01e57735
YQ
11226 start_address = start_address + 4;
11227 memory_index = memory_index + 2;
11228 }
11229 else
11230 {
9fde51ed
YQ
11231 record_buf_mem[memory_index] = 4;
11232 record_buf_mem[memory_index + 1] = start_address;
11233 record_buf_mem[memory_index + 2] = 4;
11234 record_buf_mem[memory_index + 3] = start_address + 4;
01e57735
YQ
11235 start_address = start_address + 8;
11236 memory_index = memory_index + 4;
11237 }
11238 memory_count--;
11239 }
f20f80dd
OJ
11240 arm_insn_r->mem_rec_count = (memory_index >> 1);
11241 }
11242 /* Handle VLDM instructions. */
11243 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
01e57735 11244 || op_vldm_vstm == 0x13)
f20f80dd
OJ
11245 {
11246 uint32_t reg_count, reg_vd;
11247 uint32_t reg_index = 0;
9fde51ed 11248 uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
f20f80dd
OJ
11249
11250 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11251 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11252
9fde51ed
YQ
11253 /* REG_VD is the first D register number. If the instruction
11254 loads memory to S registers (SINGLE_REG is TRUE), the register
11255 number is (REG_VD << 1 | bit D), so the corresponding D
11256 register number is (REG_VD << 1 | bit D) / 2 = REG_VD. */
11257 if (!single_reg)
11258 reg_vd = reg_vd | (bit_d << 4);
f20f80dd 11259
9fde51ed 11260 if (bit (arm_insn_r->arm_insn, 21) /* write back */)
01e57735 11261 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
f20f80dd 11262
9fde51ed
YQ
11263 /* If the instruction loads memory to D register, REG_COUNT should
11264 be divided by 2, according to the ARM Architecture Reference
11265 Manual. If the instruction loads memory to S register, divide by
11266 2 as well because two S registers are mapped to D register. */
11267 reg_count = reg_count / 2;
11268 if (single_reg && bit_d)
01e57735 11269 {
9fde51ed
YQ
11270 /* Increase the register count if S register list starts from
11271 an odd number (bit d is one). */
11272 reg_count++;
11273 }
f20f80dd 11274
9fde51ed
YQ
11275 while (reg_count > 0)
11276 {
11277 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
01e57735
YQ
11278 reg_count--;
11279 }
f20f80dd
OJ
11280 arm_insn_r->reg_rec_count = reg_index;
11281 }
11282 /* VSTR Vector store register. */
11283 else if ((opcode & 0x13) == 0x10)
11284 {
bec2ab5a 11285 uint32_t start_address, reg_rn, imm_off32, imm_off8;
f20f80dd
OJ
11286 uint32_t memory_index = 0;
11287
11288 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11289 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11290 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
9fde51ed 11291 imm_off32 = imm_off8 << 2;
f20f80dd
OJ
11292
11293 if (bit (arm_insn_r->arm_insn, 23))
01e57735 11294 start_address = u_regval + imm_off32;
f20f80dd 11295 else
01e57735 11296 start_address = u_regval - imm_off32;
f20f80dd
OJ
11297
11298 if (single_reg)
01e57735 11299 {
9fde51ed
YQ
11300 record_buf_mem[memory_index] = 4;
11301 record_buf_mem[memory_index + 1] = start_address;
01e57735
YQ
11302 arm_insn_r->mem_rec_count = 1;
11303 }
f20f80dd 11304 else
01e57735 11305 {
9fde51ed
YQ
11306 record_buf_mem[memory_index] = 4;
11307 record_buf_mem[memory_index + 1] = start_address;
11308 record_buf_mem[memory_index + 2] = 4;
11309 record_buf_mem[memory_index + 3] = start_address + 4;
01e57735
YQ
11310 arm_insn_r->mem_rec_count = 2;
11311 }
f20f80dd
OJ
11312 }
11313 /* VLDR Vector load register. */
11314 else if ((opcode & 0x13) == 0x11)
11315 {
11316 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11317
11318 if (!single_reg)
01e57735
YQ
11319 {
11320 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11321 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11322 }
f20f80dd 11323 else
01e57735
YQ
11324 {
11325 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
9fde51ed
YQ
11326 /* Record register D rather than pseudo register S. */
11327 record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
01e57735 11328 }
f20f80dd
OJ
11329 arm_insn_r->reg_rec_count = 1;
11330 }
11331
11332 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11333 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11334 return 0;
11335}
11336
851f26ae
OJ
11337/* Record handler for arm/thumb mode VFP data processing instructions. */
11338
11339static int
11340arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11341{
11342 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11343 uint32_t record_buf[4];
11344 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11345 enum insn_types curr_insn_type = INSN_INV;
11346
11347 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11348 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11349 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11350 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11351 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11352 bit_d = bit (arm_insn_r->arm_insn, 22);
ce887586
TT
11353 /* Mask off the "D" bit. */
11354 opc1 = opc1 & ~0x04;
851f26ae
OJ
11355
11356 /* Handle VMLA, VMLS. */
11357 if (opc1 == 0x00)
11358 {
11359 if (bit (arm_insn_r->arm_insn, 10))
11360 {
11361 if (bit (arm_insn_r->arm_insn, 6))
11362 curr_insn_type = INSN_T0;
11363 else
11364 curr_insn_type = INSN_T1;
11365 }
11366 else
11367 {
11368 if (dp_op_sz)
11369 curr_insn_type = INSN_T1;
11370 else
11371 curr_insn_type = INSN_T2;
11372 }
11373 }
11374 /* Handle VNMLA, VNMLS, VNMUL. */
11375 else if (opc1 == 0x01)
11376 {
11377 if (dp_op_sz)
11378 curr_insn_type = INSN_T1;
11379 else
11380 curr_insn_type = INSN_T2;
11381 }
11382 /* Handle VMUL. */
11383 else if (opc1 == 0x02 && !(opc3 & 0x01))
11384 {
11385 if (bit (arm_insn_r->arm_insn, 10))
11386 {
11387 if (bit (arm_insn_r->arm_insn, 6))
11388 curr_insn_type = INSN_T0;
11389 else
11390 curr_insn_type = INSN_T1;
11391 }
11392 else
11393 {
11394 if (dp_op_sz)
11395 curr_insn_type = INSN_T1;
11396 else
11397 curr_insn_type = INSN_T2;
11398 }
11399 }
11400 /* Handle VADD, VSUB. */
11401 else if (opc1 == 0x03)
11402 {
11403 if (!bit (arm_insn_r->arm_insn, 9))
11404 {
11405 if (bit (arm_insn_r->arm_insn, 6))
11406 curr_insn_type = INSN_T0;
11407 else
11408 curr_insn_type = INSN_T1;
11409 }
11410 else
11411 {
11412 if (dp_op_sz)
11413 curr_insn_type = INSN_T1;
11414 else
11415 curr_insn_type = INSN_T2;
11416 }
11417 }
11418 /* Handle VDIV. */
ce887586 11419 else if (opc1 == 0x08)
851f26ae
OJ
11420 {
11421 if (dp_op_sz)
11422 curr_insn_type = INSN_T1;
11423 else
11424 curr_insn_type = INSN_T2;
11425 }
11426 /* Handle all other vfp data processing instructions. */
11427 else if (opc1 == 0x0b)
11428 {
11429 /* Handle VMOV. */
11430 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11431 {
11432 if (bit (arm_insn_r->arm_insn, 4))
11433 {
11434 if (bit (arm_insn_r->arm_insn, 6))
11435 curr_insn_type = INSN_T0;
11436 else
11437 curr_insn_type = INSN_T1;
11438 }
11439 else
11440 {
11441 if (dp_op_sz)
11442 curr_insn_type = INSN_T1;
11443 else
11444 curr_insn_type = INSN_T2;
11445 }
11446 }
11447 /* Handle VNEG and VABS. */
11448 else if ((opc2 == 0x01 && opc3 == 0x01)
11449 || (opc2 == 0x00 && opc3 == 0x03))
11450 {
11451 if (!bit (arm_insn_r->arm_insn, 11))
11452 {
11453 if (bit (arm_insn_r->arm_insn, 6))
11454 curr_insn_type = INSN_T0;
11455 else
11456 curr_insn_type = INSN_T1;
11457 }
11458 else
11459 {
11460 if (dp_op_sz)
11461 curr_insn_type = INSN_T1;
11462 else
11463 curr_insn_type = INSN_T2;
11464 }
11465 }
11466 /* Handle VSQRT. */
11467 else if (opc2 == 0x01 && opc3 == 0x03)
11468 {
11469 if (dp_op_sz)
11470 curr_insn_type = INSN_T1;
11471 else
11472 curr_insn_type = INSN_T2;
11473 }
11474 /* Handle VCVT. */
11475 else if (opc2 == 0x07 && opc3 == 0x03)
11476 {
11477 if (!dp_op_sz)
11478 curr_insn_type = INSN_T1;
11479 else
11480 curr_insn_type = INSN_T2;
11481 }
11482 else if (opc3 & 0x01)
11483 {
11484 /* Handle VCVT. */
11485 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11486 {
11487 if (!bit (arm_insn_r->arm_insn, 18))
11488 curr_insn_type = INSN_T2;
11489 else
11490 {
11491 if (dp_op_sz)
11492 curr_insn_type = INSN_T1;
11493 else
11494 curr_insn_type = INSN_T2;
11495 }
11496 }
11497 /* Handle VCVT. */
11498 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11499 {
11500 if (dp_op_sz)
11501 curr_insn_type = INSN_T1;
11502 else
11503 curr_insn_type = INSN_T2;
11504 }
11505 /* Handle VCVTB, VCVTT. */
11506 else if ((opc2 & 0x0e) == 0x02)
11507 curr_insn_type = INSN_T2;
11508 /* Handle VCMP, VCMPE. */
11509 else if ((opc2 & 0x0e) == 0x04)
11510 curr_insn_type = INSN_T3;
11511 }
11512 }
11513
11514 switch (curr_insn_type)
11515 {
11516 case INSN_T0:
11517 reg_vd = reg_vd | (bit_d << 4);
11518 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11519 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11520 arm_insn_r->reg_rec_count = 2;
11521 break;
11522
11523 case INSN_T1:
11524 reg_vd = reg_vd | (bit_d << 4);
11525 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11526 arm_insn_r->reg_rec_count = 1;
11527 break;
11528
11529 case INSN_T2:
11530 reg_vd = (reg_vd << 1) | bit_d;
11531 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11532 arm_insn_r->reg_rec_count = 1;
11533 break;
11534
11535 case INSN_T3:
11536 record_buf[0] = ARM_FPSCR_REGNUM;
11537 arm_insn_r->reg_rec_count = 1;
11538 break;
11539
11540 default:
11541 gdb_assert_not_reached ("no decoding pattern found");
11542 break;
11543 }
11544
11545 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11546 return 0;
11547}
11548
60cc5e93
OJ
11549/* Handling opcode 110 insns. */
11550
11551static int
11552arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11553{
bec2ab5a 11554 uint32_t op1, op1_ebit, coproc;
60cc5e93
OJ
11555
11556 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11557 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11558 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11559
11560 if ((coproc & 0x0e) == 0x0a)
11561 {
11562 /* Handle extension register ld/st instructions. */
11563 if (!(op1 & 0x20))
f20f80dd 11564 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11565
11566 /* 64-bit transfers between arm core and extension registers. */
11567 if ((op1 & 0x3e) == 0x04)
f20f80dd 11568 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11569 }
11570 else
11571 {
11572 /* Handle coprocessor ld/st instructions. */
11573 if (!(op1 & 0x3a))
11574 {
11575 /* Store. */
11576 if (!op1_ebit)
11577 return arm_record_unsupported_insn (arm_insn_r);
11578 else
11579 /* Load. */
11580 return arm_record_unsupported_insn (arm_insn_r);
11581 }
11582
11583 /* Move to coprocessor from two arm core registers. */
11584 if (op1 == 0x4)
11585 return arm_record_unsupported_insn (arm_insn_r);
11586
11587 /* Move to two arm core registers from coprocessor. */
11588 if (op1 == 0x5)
11589 {
11590 uint32_t reg_t[2];
11591
11592 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11593 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11594 arm_insn_r->reg_rec_count = 2;
11595
11596 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11597 return 0;
11598 }
11599 }
11600 return arm_record_unsupported_insn (arm_insn_r);
11601}
11602
72508ac0
PO
11603/* Handling opcode 111 insns. */
11604
11605static int
11606arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11607{
2d9e6acb 11608 uint32_t op, op1_ebit, coproc, bits_24_25;
72508ac0
PO
11609 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11610 struct regcache *reg_cache = arm_insn_r->regcache;
72508ac0
PO
11611
11612 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93 11613 coproc = bits (arm_insn_r->arm_insn, 8, 11);
60cc5e93
OJ
11614 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11615 op = bit (arm_insn_r->arm_insn, 4);
2d9e6acb 11616 bits_24_25 = bits (arm_insn_r->arm_insn, 24, 25);
97dfe206
OJ
11617
11618 /* Handle arm SWI/SVC system call instructions. */
2d9e6acb 11619 if (bits_24_25 == 0x3)
97dfe206
OJ
11620 {
11621 if (tdep->arm_syscall_record != NULL)
11622 {
11623 ULONGEST svc_operand, svc_number;
11624
11625 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11626
11627 if (svc_operand) /* OABI. */
11628 svc_number = svc_operand - 0x900000;
11629 else /* EABI. */
11630 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11631
60cc5e93 11632 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11633 }
11634 else
11635 {
11636 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11637 return -1;
97dfe206
OJ
11638 }
11639 }
2d9e6acb 11640 else if (bits_24_25 == 0x02)
60cc5e93 11641 {
2d9e6acb
YQ
11642 if (op)
11643 {
11644 if ((coproc & 0x0e) == 0x0a)
11645 {
11646 /* 8, 16, and 32-bit transfer */
11647 return arm_record_vdata_transfer_insn (arm_insn_r);
11648 }
11649 else
11650 {
11651 if (op1_ebit)
11652 {
11653 /* MRC, MRC2 */
11654 uint32_t record_buf[1];
11655
11656 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11657 if (record_buf[0] == 15)
11658 record_buf[0] = ARM_PS_REGNUM;
60cc5e93 11659
2d9e6acb
YQ
11660 arm_insn_r->reg_rec_count = 1;
11661 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11662 record_buf);
11663 return 0;
11664 }
11665 else
11666 {
11667 /* MCR, MCR2 */
11668 return -1;
11669 }
11670 }
11671 }
11672 else
11673 {
11674 if ((coproc & 0x0e) == 0x0a)
11675 {
11676 /* VFP data-processing instructions. */
11677 return arm_record_vfp_data_proc_insn (arm_insn_r);
11678 }
11679 else
11680 {
11681 /* CDP, CDP2 */
11682 return -1;
11683 }
11684 }
60cc5e93 11685 }
97dfe206
OJ
11686 else
11687 {
2d9e6acb 11688 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 25);
60cc5e93 11689
2d9e6acb
YQ
11690 if (op1 == 5)
11691 {
11692 if ((coproc & 0x0e) != 0x0a)
11693 {
11694 /* MRRC, MRRC2 */
11695 return -1;
11696 }
11697 }
11698 else if (op1 == 4 || op1 == 5)
11699 {
11700 if ((coproc & 0x0e) == 0x0a)
11701 {
11702 /* 64-bit transfers between ARM core and extension */
11703 return -1;
11704 }
11705 else if (op1 == 4)
11706 {
11707 /* MCRR, MCRR2 */
11708 return -1;
11709 }
11710 }
11711 else if (op1 == 0 || op1 == 1)
11712 {
11713 /* UNDEFINED */
11714 return -1;
11715 }
11716 else
11717 {
11718 if ((coproc & 0x0e) == 0x0a)
11719 {
11720 /* Extension register load/store */
11721 }
11722 else
11723 {
11724 /* STC, STC2, LDC, LDC2 */
11725 }
11726 return -1;
11727 }
97dfe206 11728 }
72508ac0 11729
2d9e6acb 11730 return -1;
72508ac0
PO
11731}
11732
11733/* Handling opcode 000 insns. */
11734
11735static int
11736thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11737{
11738 uint32_t record_buf[8];
11739 uint32_t reg_src1 = 0;
11740
11741 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11742
11743 record_buf[0] = ARM_PS_REGNUM;
11744 record_buf[1] = reg_src1;
11745 thumb_insn_r->reg_rec_count = 2;
11746
11747 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11748
11749 return 0;
11750}
11751
11752
11753/* Handling opcode 001 insns. */
11754
11755static int
11756thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11757{
11758 uint32_t record_buf[8];
11759 uint32_t reg_src1 = 0;
11760
11761 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11762
11763 record_buf[0] = ARM_PS_REGNUM;
11764 record_buf[1] = reg_src1;
11765 thumb_insn_r->reg_rec_count = 2;
11766
11767 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11768
11769 return 0;
11770}
11771
11772/* Handling opcode 010 insns. */
11773
11774static int
11775thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11776{
11777 struct regcache *reg_cache = thumb_insn_r->regcache;
11778 uint32_t record_buf[8], record_buf_mem[8];
11779
11780 uint32_t reg_src1 = 0, reg_src2 = 0;
11781 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11782
11783 ULONGEST u_regval[2] = {0};
11784
11785 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11786
11787 if (bit (thumb_insn_r->arm_insn, 12))
11788 {
11789 /* Handle load/store register offset. */
b121eeb9
YQ
11790 uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
11791
b020ff80 11792 if (in_inclusive_range (opB, 4U, 7U))
72508ac0
PO
11793 {
11794 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11795 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11796 record_buf[0] = reg_src1;
11797 thumb_insn_r->reg_rec_count = 1;
11798 }
b020ff80 11799 else if (in_inclusive_range (opB, 0U, 2U))
72508ac0
PO
11800 {
11801 /* STR(2), STRB(2), STRH(2) . */
11802 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11803 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11804 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11805 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
b121eeb9 11806 if (0 == opB)
72508ac0 11807 record_buf_mem[0] = 4; /* STR (2). */
b121eeb9 11808 else if (2 == opB)
72508ac0 11809 record_buf_mem[0] = 1; /* STRB (2). */
b121eeb9 11810 else if (1 == opB)
72508ac0
PO
11811 record_buf_mem[0] = 2; /* STRH (2). */
11812 record_buf_mem[1] = u_regval[0] + u_regval[1];
11813 thumb_insn_r->mem_rec_count = 1;
11814 }
11815 }
11816 else if (bit (thumb_insn_r->arm_insn, 11))
11817 {
11818 /* Handle load from literal pool. */
11819 /* LDR(3). */
11820 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11821 record_buf[0] = reg_src1;
11822 thumb_insn_r->reg_rec_count = 1;
11823 }
11824 else if (opcode1)
11825 {
b121eeb9 11826 /* Special data instructions and branch and exchange */
72508ac0
PO
11827 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11828 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11829 if ((3 == opcode2) && (!opcode3))
11830 {
11831 /* Branch with exchange. */
11832 record_buf[0] = ARM_PS_REGNUM;
11833 thumb_insn_r->reg_rec_count = 1;
11834 }
11835 else
11836 {
1f33efec
YQ
11837 /* Format 8; special data processing insns. */
11838 record_buf[0] = ARM_PS_REGNUM;
11839 record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
11840 | bits (thumb_insn_r->arm_insn, 0, 2));
72508ac0
PO
11841 thumb_insn_r->reg_rec_count = 2;
11842 }
11843 }
11844 else
11845 {
11846 /* Format 5; data processing insns. */
11847 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11848 if (bit (thumb_insn_r->arm_insn, 7))
11849 {
11850 reg_src1 = reg_src1 + 8;
11851 }
11852 record_buf[0] = ARM_PS_REGNUM;
11853 record_buf[1] = reg_src1;
11854 thumb_insn_r->reg_rec_count = 2;
11855 }
11856
11857 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11858 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11859 record_buf_mem);
11860
11861 return 0;
11862}
11863
11864/* Handling opcode 001 insns. */
11865
11866static int
11867thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11868{
11869 struct regcache *reg_cache = thumb_insn_r->regcache;
11870 uint32_t record_buf[8], record_buf_mem[8];
11871
11872 uint32_t reg_src1 = 0;
11873 uint32_t opcode = 0, immed_5 = 0;
11874
11875 ULONGEST u_regval = 0;
11876
11877 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11878
11879 if (opcode)
11880 {
11881 /* LDR(1). */
11882 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11883 record_buf[0] = reg_src1;
11884 thumb_insn_r->reg_rec_count = 1;
11885 }
11886 else
11887 {
11888 /* STR(1). */
11889 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11890 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11891 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11892 record_buf_mem[0] = 4;
11893 record_buf_mem[1] = u_regval + (immed_5 * 4);
11894 thumb_insn_r->mem_rec_count = 1;
11895 }
11896
11897 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11898 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11899 record_buf_mem);
11900
11901 return 0;
11902}
11903
11904/* Handling opcode 100 insns. */
11905
11906static int
11907thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11908{
11909 struct regcache *reg_cache = thumb_insn_r->regcache;
11910 uint32_t record_buf[8], record_buf_mem[8];
11911
11912 uint32_t reg_src1 = 0;
11913 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11914
11915 ULONGEST u_regval = 0;
11916
11917 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11918
11919 if (3 == opcode)
11920 {
11921 /* LDR(4). */
11922 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11923 record_buf[0] = reg_src1;
11924 thumb_insn_r->reg_rec_count = 1;
11925 }
11926 else if (1 == opcode)
11927 {
11928 /* LDRH(1). */
11929 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11930 record_buf[0] = reg_src1;
11931 thumb_insn_r->reg_rec_count = 1;
11932 }
11933 else if (2 == opcode)
11934 {
11935 /* STR(3). */
11936 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11937 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11938 record_buf_mem[0] = 4;
11939 record_buf_mem[1] = u_regval + (immed_8 * 4);
11940 thumb_insn_r->mem_rec_count = 1;
11941 }
11942 else if (0 == opcode)
11943 {
11944 /* STRH(1). */
11945 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11946 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11947 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11948 record_buf_mem[0] = 2;
11949 record_buf_mem[1] = u_regval + (immed_5 * 2);
11950 thumb_insn_r->mem_rec_count = 1;
11951 }
11952
11953 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11954 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11955 record_buf_mem);
11956
11957 return 0;
11958}
11959
11960/* Handling opcode 101 insns. */
11961
11962static int
11963thumb_record_misc (insn_decode_record *thumb_insn_r)
11964{
11965 struct regcache *reg_cache = thumb_insn_r->regcache;
11966
b121eeb9 11967 uint32_t opcode = 0;
72508ac0 11968 uint32_t register_bits = 0, register_count = 0;
bec2ab5a 11969 uint32_t index = 0, start_address = 0;
72508ac0
PO
11970 uint32_t record_buf[24], record_buf_mem[48];
11971 uint32_t reg_src1;
11972
11973 ULONGEST u_regval = 0;
11974
11975 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
72508ac0 11976
b121eeb9 11977 if (opcode == 0 || opcode == 1)
72508ac0 11978 {
b121eeb9
YQ
11979 /* ADR and ADD (SP plus immediate) */
11980
72508ac0
PO
11981 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11982 record_buf[0] = reg_src1;
11983 thumb_insn_r->reg_rec_count = 1;
11984 }
b121eeb9 11985 else
72508ac0 11986 {
b121eeb9
YQ
11987 /* Miscellaneous 16-bit instructions */
11988 uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
11989
11990 switch (opcode2)
11991 {
11992 case 6:
11993 /* SETEND and CPS */
11994 break;
11995 case 0:
11996 /* ADD/SUB (SP plus immediate) */
11997 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11998 record_buf[0] = ARM_SP_REGNUM;
11999 thumb_insn_r->reg_rec_count = 1;
12000 break;
12001 case 1: /* fall through */
12002 case 3: /* fall through */
12003 case 9: /* fall through */
12004 case 11:
12005 /* CBNZ, CBZ */
b121eeb9
YQ
12006 break;
12007 case 2:
12008 /* SXTH, SXTB, UXTH, UXTB */
12009 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
12010 thumb_insn_r->reg_rec_count = 1;
12011 break;
12012 case 4: /* fall through */
12013 case 5:
12014 /* PUSH. */
12015 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12016 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
12017 while (register_bits)
12018 {
12019 if (register_bits & 0x00000001)
12020 register_count++;
12021 register_bits = register_bits >> 1;
12022 }
12023 start_address = u_regval - \
12024 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
12025 thumb_insn_r->mem_rec_count = register_count;
12026 while (register_count)
12027 {
12028 record_buf_mem[(register_count * 2) - 1] = start_address;
12029 record_buf_mem[(register_count * 2) - 2] = 4;
12030 start_address = start_address + 4;
12031 register_count--;
12032 }
12033 record_buf[0] = ARM_SP_REGNUM;
12034 thumb_insn_r->reg_rec_count = 1;
12035 break;
12036 case 10:
12037 /* REV, REV16, REVSH */
ba14f379
YQ
12038 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
12039 thumb_insn_r->reg_rec_count = 1;
b121eeb9
YQ
12040 break;
12041 case 12: /* fall through */
12042 case 13:
12043 /* POP. */
12044 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12045 while (register_bits)
12046 {
12047 if (register_bits & 0x00000001)
12048 record_buf[index++] = register_count;
12049 register_bits = register_bits >> 1;
12050 register_count++;
12051 }
12052 record_buf[index++] = ARM_PS_REGNUM;
12053 record_buf[index++] = ARM_SP_REGNUM;
12054 thumb_insn_r->reg_rec_count = index;
12055 break;
12056 case 0xe:
12057 /* BKPT insn. */
12058 /* Handle enhanced software breakpoint insn, BKPT. */
12059 /* CPSR is changed to be executed in ARM state, disabling normal
12060 interrupts, entering abort mode. */
12061 /* According to high vector configuration PC is set. */
12062 /* User hits breakpoint and type reverse, in that case, we need to go back with
12063 previous CPSR and Program Counter. */
12064 record_buf[0] = ARM_PS_REGNUM;
12065 record_buf[1] = ARM_LR_REGNUM;
12066 thumb_insn_r->reg_rec_count = 2;
12067 /* We need to save SPSR value, which is not yet done. */
12068 printf_unfiltered (_("Process record does not support instruction "
12069 "0x%0x at address %s.\n"),
12070 thumb_insn_r->arm_insn,
12071 paddress (thumb_insn_r->gdbarch,
12072 thumb_insn_r->this_addr));
12073 return -1;
12074
12075 case 0xf:
12076 /* If-Then, and hints */
12077 break;
12078 default:
12079 return -1;
12080 };
72508ac0
PO
12081 }
12082
12083 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12084 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12085 record_buf_mem);
12086
12087 return 0;
12088}
12089
12090/* Handling opcode 110 insns. */
12091
12092static int
12093thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
12094{
12095 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
12096 struct regcache *reg_cache = thumb_insn_r->regcache;
12097
12098 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
12099 uint32_t reg_src1 = 0;
12100 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
bec2ab5a 12101 uint32_t index = 0, start_address = 0;
72508ac0
PO
12102 uint32_t record_buf[24], record_buf_mem[48];
12103
12104 ULONGEST u_regval = 0;
12105
12106 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12107 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
12108
12109 if (1 == opcode2)
12110 {
12111
12112 /* LDMIA. */
12113 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12114 /* Get Rn. */
12115 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12116 while (register_bits)
12117 {
12118 if (register_bits & 0x00000001)
f969241e 12119 record_buf[index++] = register_count;
72508ac0 12120 register_bits = register_bits >> 1;
f969241e 12121 register_count++;
72508ac0 12122 }
f969241e
OJ
12123 record_buf[index++] = reg_src1;
12124 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
12125 }
12126 else if (0 == opcode2)
12127 {
12128 /* It handles both STMIA. */
12129 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12130 /* Get Rn. */
12131 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12132 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12133 while (register_bits)
12134 {
12135 if (register_bits & 0x00000001)
12136 register_count++;
12137 register_bits = register_bits >> 1;
12138 }
12139 start_address = u_regval;
12140 thumb_insn_r->mem_rec_count = register_count;
12141 while (register_count)
12142 {
12143 record_buf_mem[(register_count * 2) - 1] = start_address;
12144 record_buf_mem[(register_count * 2) - 2] = 4;
12145 start_address = start_address + 4;
12146 register_count--;
12147 }
12148 }
12149 else if (0x1F == opcode1)
12150 {
12151 /* Handle arm syscall insn. */
97dfe206 12152 if (tdep->arm_syscall_record != NULL)
72508ac0 12153 {
97dfe206
OJ
12154 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
12155 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
12156 }
12157 else
12158 {
12159 printf_unfiltered (_("no syscall record support\n"));
12160 return -1;
12161 }
12162 }
12163
12164 /* B (1), conditional branch is automatically taken care in process_record,
12165 as PC is saved there. */
12166
12167 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12168 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12169 record_buf_mem);
12170
12171 return ret;
12172}
12173
12174/* Handling opcode 111 insns. */
12175
12176static int
12177thumb_record_branch (insn_decode_record *thumb_insn_r)
12178{
12179 uint32_t record_buf[8];
12180 uint32_t bits_h = 0;
12181
12182 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
12183
12184 if (2 == bits_h || 3 == bits_h)
12185 {
12186 /* BL */
12187 record_buf[0] = ARM_LR_REGNUM;
12188 thumb_insn_r->reg_rec_count = 1;
12189 }
12190 else if (1 == bits_h)
12191 {
12192 /* BLX(1). */
12193 record_buf[0] = ARM_PS_REGNUM;
12194 record_buf[1] = ARM_LR_REGNUM;
12195 thumb_insn_r->reg_rec_count = 2;
12196 }
12197
12198 /* B(2) is automatically taken care in process_record, as PC is
12199 saved there. */
12200
12201 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12202
12203 return 0;
12204}
12205
c6ec2b30
OJ
12206/* Handler for thumb2 load/store multiple instructions. */
12207
12208static int
12209thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
12210{
12211 struct regcache *reg_cache = thumb2_insn_r->regcache;
12212
12213 uint32_t reg_rn, op;
12214 uint32_t register_bits = 0, register_count = 0;
12215 uint32_t index = 0, start_address = 0;
12216 uint32_t record_buf[24], record_buf_mem[48];
12217
12218 ULONGEST u_regval = 0;
12219
12220 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12221 op = bits (thumb2_insn_r->arm_insn, 23, 24);
12222
12223 if (0 == op || 3 == op)
12224 {
12225 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12226 {
12227 /* Handle RFE instruction. */
12228 record_buf[0] = ARM_PS_REGNUM;
12229 thumb2_insn_r->reg_rec_count = 1;
12230 }
12231 else
12232 {
12233 /* Handle SRS instruction after reading banked SP. */
12234 return arm_record_unsupported_insn (thumb2_insn_r);
12235 }
12236 }
12237 else if (1 == op || 2 == op)
12238 {
12239 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12240 {
12241 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
12242 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12243 while (register_bits)
12244 {
12245 if (register_bits & 0x00000001)
12246 record_buf[index++] = register_count;
12247
12248 register_count++;
12249 register_bits = register_bits >> 1;
12250 }
12251 record_buf[index++] = reg_rn;
12252 record_buf[index++] = ARM_PS_REGNUM;
12253 thumb2_insn_r->reg_rec_count = index;
12254 }
12255 else
12256 {
12257 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
12258 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
12259 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12260 while (register_bits)
12261 {
12262 if (register_bits & 0x00000001)
12263 register_count++;
12264
12265 register_bits = register_bits >> 1;
12266 }
12267
12268 if (1 == op)
12269 {
12270 /* Start address calculation for LDMDB/LDMEA. */
12271 start_address = u_regval;
12272 }
12273 else if (2 == op)
12274 {
12275 /* Start address calculation for LDMDB/LDMEA. */
12276 start_address = u_regval - register_count * 4;
12277 }
12278
12279 thumb2_insn_r->mem_rec_count = register_count;
12280 while (register_count)
12281 {
12282 record_buf_mem[register_count * 2 - 1] = start_address;
12283 record_buf_mem[register_count * 2 - 2] = 4;
12284 start_address = start_address + 4;
12285 register_count--;
12286 }
12287 record_buf[0] = reg_rn;
12288 record_buf[1] = ARM_PS_REGNUM;
12289 thumb2_insn_r->reg_rec_count = 2;
12290 }
12291 }
12292
12293 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12294 record_buf_mem);
12295 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12296 record_buf);
12297 return ARM_RECORD_SUCCESS;
12298}
12299
12300/* Handler for thumb2 load/store (dual/exclusive) and table branch
12301 instructions. */
12302
12303static int
12304thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
12305{
12306 struct regcache *reg_cache = thumb2_insn_r->regcache;
12307
12308 uint32_t reg_rd, reg_rn, offset_imm;
12309 uint32_t reg_dest1, reg_dest2;
12310 uint32_t address, offset_addr;
12311 uint32_t record_buf[8], record_buf_mem[8];
12312 uint32_t op1, op2, op3;
c6ec2b30
OJ
12313
12314 ULONGEST u_regval[2];
12315
12316 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
12317 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
12318 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
12319
12320 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12321 {
12322 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12323 {
12324 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
12325 record_buf[0] = reg_dest1;
12326 record_buf[1] = ARM_PS_REGNUM;
12327 thumb2_insn_r->reg_rec_count = 2;
12328 }
12329
12330 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12331 {
12332 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12333 record_buf[2] = reg_dest2;
12334 thumb2_insn_r->reg_rec_count = 3;
12335 }
12336 }
12337 else
12338 {
12339 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12340 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12341
12342 if (0 == op1 && 0 == op2)
12343 {
12344 /* Handle STREX. */
12345 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12346 address = u_regval[0] + (offset_imm * 4);
12347 record_buf_mem[0] = 4;
12348 record_buf_mem[1] = address;
12349 thumb2_insn_r->mem_rec_count = 1;
12350 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12351 record_buf[0] = reg_rd;
12352 thumb2_insn_r->reg_rec_count = 1;
12353 }
12354 else if (1 == op1 && 0 == op2)
12355 {
12356 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12357 record_buf[0] = reg_rd;
12358 thumb2_insn_r->reg_rec_count = 1;
12359 address = u_regval[0];
12360 record_buf_mem[1] = address;
12361
12362 if (4 == op3)
12363 {
12364 /* Handle STREXB. */
12365 record_buf_mem[0] = 1;
12366 thumb2_insn_r->mem_rec_count = 1;
12367 }
12368 else if (5 == op3)
12369 {
12370 /* Handle STREXH. */
12371 record_buf_mem[0] = 2 ;
12372 thumb2_insn_r->mem_rec_count = 1;
12373 }
12374 else if (7 == op3)
12375 {
12376 /* Handle STREXD. */
12377 address = u_regval[0];
12378 record_buf_mem[0] = 4;
12379 record_buf_mem[2] = 4;
12380 record_buf_mem[3] = address + 4;
12381 thumb2_insn_r->mem_rec_count = 2;
12382 }
12383 }
12384 else
12385 {
12386 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12387
12388 if (bit (thumb2_insn_r->arm_insn, 24))
12389 {
12390 if (bit (thumb2_insn_r->arm_insn, 23))
12391 offset_addr = u_regval[0] + (offset_imm * 4);
12392 else
12393 offset_addr = u_regval[0] - (offset_imm * 4);
12394
12395 address = offset_addr;
12396 }
12397 else
12398 address = u_regval[0];
12399
12400 record_buf_mem[0] = 4;
12401 record_buf_mem[1] = address;
12402 record_buf_mem[2] = 4;
12403 record_buf_mem[3] = address + 4;
12404 thumb2_insn_r->mem_rec_count = 2;
12405 record_buf[0] = reg_rn;
12406 thumb2_insn_r->reg_rec_count = 1;
12407 }
12408 }
12409
12410 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12411 record_buf);
12412 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12413 record_buf_mem);
12414 return ARM_RECORD_SUCCESS;
12415}
12416
12417/* Handler for thumb2 data processing (shift register and modified immediate)
12418 instructions. */
12419
12420static int
12421thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12422{
12423 uint32_t reg_rd, op;
12424 uint32_t record_buf[8];
12425
12426 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12427 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12428
12429 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12430 {
12431 record_buf[0] = ARM_PS_REGNUM;
12432 thumb2_insn_r->reg_rec_count = 1;
12433 }
12434 else
12435 {
12436 record_buf[0] = reg_rd;
12437 record_buf[1] = ARM_PS_REGNUM;
12438 thumb2_insn_r->reg_rec_count = 2;
12439 }
12440
12441 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12442 record_buf);
12443 return ARM_RECORD_SUCCESS;
12444}
12445
12446/* Generic handler for thumb2 instructions which effect destination and PS
12447 registers. */
12448
12449static int
12450thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12451{
12452 uint32_t reg_rd;
12453 uint32_t record_buf[8];
12454
12455 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12456
12457 record_buf[0] = reg_rd;
12458 record_buf[1] = ARM_PS_REGNUM;
12459 thumb2_insn_r->reg_rec_count = 2;
12460
12461 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12462 record_buf);
12463 return ARM_RECORD_SUCCESS;
12464}
12465
12466/* Handler for thumb2 branch and miscellaneous control instructions. */
12467
12468static int
12469thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12470{
12471 uint32_t op, op1, op2;
12472 uint32_t record_buf[8];
12473
12474 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12475 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12476 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12477
12478 /* Handle MSR insn. */
12479 if (!(op1 & 0x2) && 0x38 == op)
12480 {
12481 if (!(op2 & 0x3))
12482 {
12483 /* CPSR is going to be changed. */
12484 record_buf[0] = ARM_PS_REGNUM;
12485 thumb2_insn_r->reg_rec_count = 1;
12486 }
12487 else
12488 {
12489 arm_record_unsupported_insn(thumb2_insn_r);
12490 return -1;
12491 }
12492 }
12493 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12494 {
12495 /* BLX. */
12496 record_buf[0] = ARM_PS_REGNUM;
12497 record_buf[1] = ARM_LR_REGNUM;
12498 thumb2_insn_r->reg_rec_count = 2;
12499 }
12500
12501 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12502 record_buf);
12503 return ARM_RECORD_SUCCESS;
12504}
12505
12506/* Handler for thumb2 store single data item instructions. */
12507
12508static int
12509thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12510{
12511 struct regcache *reg_cache = thumb2_insn_r->regcache;
12512
12513 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12514 uint32_t address, offset_addr;
12515 uint32_t record_buf[8], record_buf_mem[8];
12516 uint32_t op1, op2;
12517
12518 ULONGEST u_regval[2];
12519
12520 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12521 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12522 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12523 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12524
12525 if (bit (thumb2_insn_r->arm_insn, 23))
12526 {
12527 /* T2 encoding. */
12528 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12529 offset_addr = u_regval[0] + offset_imm;
12530 address = offset_addr;
12531 }
12532 else
12533 {
12534 /* T3 encoding. */
12535 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12536 {
12537 /* Handle STRB (register). */
12538 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12539 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12540 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12541 offset_addr = u_regval[1] << shift_imm;
12542 address = u_regval[0] + offset_addr;
12543 }
12544 else
12545 {
12546 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12547 if (bit (thumb2_insn_r->arm_insn, 10))
12548 {
12549 if (bit (thumb2_insn_r->arm_insn, 9))
12550 offset_addr = u_regval[0] + offset_imm;
12551 else
12552 offset_addr = u_regval[0] - offset_imm;
12553
12554 address = offset_addr;
12555 }
12556 else
12557 address = u_regval[0];
12558 }
12559 }
12560
12561 switch (op1)
12562 {
12563 /* Store byte instructions. */
12564 case 4:
12565 case 0:
12566 record_buf_mem[0] = 1;
12567 break;
12568 /* Store half word instructions. */
12569 case 1:
12570 case 5:
12571 record_buf_mem[0] = 2;
12572 break;
12573 /* Store word instructions. */
12574 case 2:
12575 case 6:
12576 record_buf_mem[0] = 4;
12577 break;
12578
12579 default:
12580 gdb_assert_not_reached ("no decoding pattern found");
12581 break;
12582 }
12583
12584 record_buf_mem[1] = address;
12585 thumb2_insn_r->mem_rec_count = 1;
12586 record_buf[0] = reg_rn;
12587 thumb2_insn_r->reg_rec_count = 1;
12588
12589 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12590 record_buf);
12591 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12592 record_buf_mem);
12593 return ARM_RECORD_SUCCESS;
12594}
12595
12596/* Handler for thumb2 load memory hints instructions. */
12597
12598static int
12599thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12600{
12601 uint32_t record_buf[8];
12602 uint32_t reg_rt, reg_rn;
12603
12604 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12605 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12606
12607 if (ARM_PC_REGNUM != reg_rt)
12608 {
12609 record_buf[0] = reg_rt;
12610 record_buf[1] = reg_rn;
12611 record_buf[2] = ARM_PS_REGNUM;
12612 thumb2_insn_r->reg_rec_count = 3;
12613
12614 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12615 record_buf);
12616 return ARM_RECORD_SUCCESS;
12617 }
12618
12619 return ARM_RECORD_FAILURE;
12620}
12621
12622/* Handler for thumb2 load word instructions. */
12623
12624static int
12625thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12626{
c6ec2b30
OJ
12627 uint32_t record_buf[8];
12628
12629 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12630 record_buf[1] = ARM_PS_REGNUM;
12631 thumb2_insn_r->reg_rec_count = 2;
12632
12633 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12634 record_buf);
12635 return ARM_RECORD_SUCCESS;
12636}
12637
12638/* Handler for thumb2 long multiply, long multiply accumulate, and
12639 divide instructions. */
12640
12641static int
12642thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12643{
12644 uint32_t opcode1 = 0, opcode2 = 0;
12645 uint32_t record_buf[8];
c6ec2b30
OJ
12646
12647 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12648 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12649
12650 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12651 {
12652 /* Handle SMULL, UMULL, SMULAL. */
12653 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12654 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12655 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12656 record_buf[2] = ARM_PS_REGNUM;
12657 thumb2_insn_r->reg_rec_count = 3;
12658 }
12659 else if (1 == opcode1 || 3 == opcode2)
12660 {
12661 /* Handle SDIV and UDIV. */
12662 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12663 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12664 record_buf[2] = ARM_PS_REGNUM;
12665 thumb2_insn_r->reg_rec_count = 3;
12666 }
12667 else
12668 return ARM_RECORD_FAILURE;
12669
12670 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12671 record_buf);
12672 return ARM_RECORD_SUCCESS;
12673}
12674
60cc5e93
OJ
12675/* Record handler for thumb32 coprocessor instructions. */
12676
12677static int
12678thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12679{
12680 if (bit (thumb2_insn_r->arm_insn, 25))
12681 return arm_record_coproc_data_proc (thumb2_insn_r);
12682 else
12683 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12684}
12685
1e1b6563
OJ
12686/* Record handler for advance SIMD structure load/store instructions. */
12687
12688static int
12689thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12690{
12691 struct regcache *reg_cache = thumb2_insn_r->regcache;
12692 uint32_t l_bit, a_bit, b_bits;
12693 uint32_t record_buf[128], record_buf_mem[128];
bec2ab5a 12694 uint32_t reg_rn, reg_vd, address, f_elem;
1e1b6563
OJ
12695 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12696 uint8_t f_ebytes;
12697
12698 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12699 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12700 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12701 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12702 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12703 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12704 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
1e1b6563
OJ
12705 f_elem = 8 / f_ebytes;
12706
12707 if (!l_bit)
12708 {
12709 ULONGEST u_regval = 0;
12710 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12711 address = u_regval;
12712
12713 if (!a_bit)
12714 {
12715 /* Handle VST1. */
12716 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12717 {
12718 if (b_bits == 0x07)
12719 bf_regs = 1;
12720 else if (b_bits == 0x0a)
12721 bf_regs = 2;
12722 else if (b_bits == 0x06)
12723 bf_regs = 3;
12724 else if (b_bits == 0x02)
12725 bf_regs = 4;
12726 else
12727 bf_regs = 0;
12728
12729 for (index_r = 0; index_r < bf_regs; index_r++)
12730 {
12731 for (index_e = 0; index_e < f_elem; index_e++)
12732 {
12733 record_buf_mem[index_m++] = f_ebytes;
12734 record_buf_mem[index_m++] = address;
12735 address = address + f_ebytes;
12736 thumb2_insn_r->mem_rec_count += 1;
12737 }
12738 }
12739 }
12740 /* Handle VST2. */
12741 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12742 {
12743 if (b_bits == 0x09 || b_bits == 0x08)
12744 bf_regs = 1;
12745 else if (b_bits == 0x03)
12746 bf_regs = 2;
12747 else
12748 bf_regs = 0;
12749
12750 for (index_r = 0; index_r < bf_regs; index_r++)
12751 for (index_e = 0; index_e < f_elem; index_e++)
12752 {
12753 for (loop_t = 0; loop_t < 2; loop_t++)
12754 {
12755 record_buf_mem[index_m++] = f_ebytes;
12756 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12757 thumb2_insn_r->mem_rec_count += 1;
12758 }
12759 address = address + (2 * f_ebytes);
12760 }
12761 }
12762 /* Handle VST3. */
12763 else if ((b_bits & 0x0e) == 0x04)
12764 {
12765 for (index_e = 0; index_e < f_elem; index_e++)
12766 {
12767 for (loop_t = 0; loop_t < 3; loop_t++)
12768 {
12769 record_buf_mem[index_m++] = f_ebytes;
12770 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12771 thumb2_insn_r->mem_rec_count += 1;
12772 }
12773 address = address + (3 * f_ebytes);
12774 }
12775 }
12776 /* Handle VST4. */
12777 else if (!(b_bits & 0x0e))
12778 {
12779 for (index_e = 0; index_e < f_elem; index_e++)
12780 {
12781 for (loop_t = 0; loop_t < 4; loop_t++)
12782 {
12783 record_buf_mem[index_m++] = f_ebytes;
12784 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12785 thumb2_insn_r->mem_rec_count += 1;
12786 }
12787 address = address + (4 * f_ebytes);
12788 }
12789 }
12790 }
12791 else
12792 {
12793 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12794
12795 if (bft_size == 0x00)
12796 f_ebytes = 1;
12797 else if (bft_size == 0x01)
12798 f_ebytes = 2;
12799 else if (bft_size == 0x02)
12800 f_ebytes = 4;
12801 else
12802 f_ebytes = 0;
12803
12804 /* Handle VST1. */
12805 if (!(b_bits & 0x0b) || b_bits == 0x08)
12806 thumb2_insn_r->mem_rec_count = 1;
12807 /* Handle VST2. */
12808 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12809 thumb2_insn_r->mem_rec_count = 2;
12810 /* Handle VST3. */
12811 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12812 thumb2_insn_r->mem_rec_count = 3;
12813 /* Handle VST4. */
12814 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12815 thumb2_insn_r->mem_rec_count = 4;
12816
12817 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12818 {
12819 record_buf_mem[index_m] = f_ebytes;
12820 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12821 }
12822 }
12823 }
12824 else
12825 {
12826 if (!a_bit)
12827 {
12828 /* Handle VLD1. */
12829 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12830 thumb2_insn_r->reg_rec_count = 1;
12831 /* Handle VLD2. */
12832 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12833 thumb2_insn_r->reg_rec_count = 2;
12834 /* Handle VLD3. */
12835 else if ((b_bits & 0x0e) == 0x04)
12836 thumb2_insn_r->reg_rec_count = 3;
12837 /* Handle VLD4. */
12838 else if (!(b_bits & 0x0e))
12839 thumb2_insn_r->reg_rec_count = 4;
12840 }
12841 else
12842 {
12843 /* Handle VLD1. */
12844 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12845 thumb2_insn_r->reg_rec_count = 1;
12846 /* Handle VLD2. */
12847 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12848 thumb2_insn_r->reg_rec_count = 2;
12849 /* Handle VLD3. */
12850 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12851 thumb2_insn_r->reg_rec_count = 3;
12852 /* Handle VLD4. */
12853 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12854 thumb2_insn_r->reg_rec_count = 4;
12855
12856 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12857 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12858 }
12859 }
12860
12861 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12862 {
12863 record_buf[index_r] = reg_rn;
12864 thumb2_insn_r->reg_rec_count += 1;
12865 }
12866
12867 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12868 record_buf);
12869 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12870 record_buf_mem);
12871 return 0;
12872}
12873
c6ec2b30
OJ
12874/* Decodes thumb2 instruction type and invokes its record handler. */
12875
12876static unsigned int
12877thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12878{
12879 uint32_t op, op1, op2;
12880
12881 op = bit (thumb2_insn_r->arm_insn, 15);
12882 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12883 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12884
12885 if (op1 == 0x01)
12886 {
12887 if (!(op2 & 0x64 ))
12888 {
12889 /* Load/store multiple instruction. */
12890 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12891 }
b121eeb9 12892 else if ((op2 & 0x64) == 0x4)
c6ec2b30
OJ
12893 {
12894 /* Load/store (dual/exclusive) and table branch instruction. */
12895 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12896 }
b121eeb9 12897 else if ((op2 & 0x60) == 0x20)
c6ec2b30
OJ
12898 {
12899 /* Data-processing (shifted register). */
12900 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12901 }
12902 else if (op2 & 0x40)
12903 {
12904 /* Co-processor instructions. */
60cc5e93 12905 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12906 }
12907 }
12908 else if (op1 == 0x02)
12909 {
12910 if (op)
12911 {
12912 /* Branches and miscellaneous control instructions. */
12913 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12914 }
12915 else if (op2 & 0x20)
12916 {
12917 /* Data-processing (plain binary immediate) instruction. */
12918 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12919 }
12920 else
12921 {
12922 /* Data-processing (modified immediate). */
12923 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12924 }
12925 }
12926 else if (op1 == 0x03)
12927 {
12928 if (!(op2 & 0x71 ))
12929 {
12930 /* Store single data item. */
12931 return thumb2_record_str_single_data (thumb2_insn_r);
12932 }
12933 else if (!((op2 & 0x71) ^ 0x10))
12934 {
12935 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12936 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12937 }
12938 else if (!((op2 & 0x67) ^ 0x01))
12939 {
12940 /* Load byte, memory hints instruction. */
12941 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12942 }
12943 else if (!((op2 & 0x67) ^ 0x03))
12944 {
12945 /* Load halfword, memory hints instruction. */
12946 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12947 }
12948 else if (!((op2 & 0x67) ^ 0x05))
12949 {
12950 /* Load word instruction. */
12951 return thumb2_record_ld_word (thumb2_insn_r);
12952 }
12953 else if (!((op2 & 0x70) ^ 0x20))
12954 {
12955 /* Data-processing (register) instruction. */
12956 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12957 }
12958 else if (!((op2 & 0x78) ^ 0x30))
12959 {
12960 /* Multiply, multiply accumulate, abs diff instruction. */
12961 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12962 }
12963 else if (!((op2 & 0x78) ^ 0x38))
12964 {
12965 /* Long multiply, long multiply accumulate, and divide. */
12966 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12967 }
12968 else if (op2 & 0x40)
12969 {
12970 /* Co-processor instructions. */
60cc5e93 12971 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12972 }
12973 }
12974
12975 return -1;
12976}
72508ac0 12977
ffdbe864 12978namespace {
728a7913
YQ
12979/* Abstract memory reader. */
12980
12981class abstract_memory_reader
12982{
12983public:
12984 /* Read LEN bytes of target memory at address MEMADDR, placing the
12985 results in GDB's memory at BUF. Return true on success. */
12986
12987 virtual bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) = 0;
12988};
12989
12990/* Instruction reader from real target. */
12991
12992class instruction_reader : public abstract_memory_reader
12993{
12994 public:
632e107b 12995 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) override
728a7913
YQ
12996 {
12997 if (target_read_memory (memaddr, buf, len))
12998 return false;
12999 else
13000 return true;
13001 }
13002};
13003
ffdbe864
YQ
13004} // namespace
13005
72508ac0
PO
13006/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
13007and positive val on fauilure. */
13008
13009static int
728a7913
YQ
13010extract_arm_insn (abstract_memory_reader& reader,
13011 insn_decode_record *insn_record, uint32_t insn_size)
72508ac0
PO
13012{
13013 gdb_byte buf[insn_size];
13014
13015 memset (&buf[0], 0, insn_size);
13016
728a7913 13017 if (!reader.read (insn_record->this_addr, buf, insn_size))
72508ac0
PO
13018 return 1;
13019 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
13020 insn_size,
2959fed9 13021 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
13022 return 0;
13023}
13024
13025typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
13026
13027/* Decode arm/thumb insn depending on condition cods and opcodes; and
13028 dispatch it. */
13029
13030static int
728a7913
YQ
13031decode_insn (abstract_memory_reader &reader, insn_decode_record *arm_record,
13032 record_type_t record_type, uint32_t insn_size)
72508ac0
PO
13033{
13034
01e57735
YQ
13035 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
13036 instruction. */
0fa9c223 13037 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
13038 {
13039 arm_record_data_proc_misc_ld_str, /* 000. */
13040 arm_record_data_proc_imm, /* 001. */
13041 arm_record_ld_st_imm_offset, /* 010. */
13042 arm_record_ld_st_reg_offset, /* 011. */
13043 arm_record_ld_st_multiple, /* 100. */
13044 arm_record_b_bl, /* 101. */
60cc5e93 13045 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
13046 arm_record_coproc_data_proc /* 111. */
13047 };
13048
01e57735
YQ
13049 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
13050 instruction. */
0fa9c223 13051 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
13052 { \
13053 thumb_record_shift_add_sub, /* 000. */
13054 thumb_record_add_sub_cmp_mov, /* 001. */
13055 thumb_record_ld_st_reg_offset, /* 010. */
13056 thumb_record_ld_st_imm_offset, /* 011. */
13057 thumb_record_ld_st_stack, /* 100. */
13058 thumb_record_misc, /* 101. */
13059 thumb_record_ldm_stm_swi, /* 110. */
13060 thumb_record_branch /* 111. */
13061 };
13062
13063 uint32_t ret = 0; /* return value: negative:failure 0:success. */
13064 uint32_t insn_id = 0;
13065
728a7913 13066 if (extract_arm_insn (reader, arm_record, insn_size))
72508ac0
PO
13067 {
13068 if (record_debug)
01e57735
YQ
13069 {
13070 printf_unfiltered (_("Process record: error reading memory at "
13071 "addr %s len = %d.\n"),
13072 paddress (arm_record->gdbarch,
13073 arm_record->this_addr), insn_size);
13074 }
72508ac0
PO
13075 return -1;
13076 }
13077 else if (ARM_RECORD == record_type)
13078 {
13079 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
13080 insn_id = bits (arm_record->arm_insn, 25, 27);
ca92db2d
YQ
13081
13082 if (arm_record->cond == 0xf)
13083 ret = arm_record_extension_space (arm_record);
13084 else
01e57735 13085 {
ca92db2d
YQ
13086 /* If this insn has fallen into extension space
13087 then we need not decode it anymore. */
01e57735
YQ
13088 ret = arm_handle_insn[insn_id] (arm_record);
13089 }
ca92db2d
YQ
13090 if (ret != ARM_RECORD_SUCCESS)
13091 {
13092 arm_record_unsupported_insn (arm_record);
13093 ret = -1;
13094 }
72508ac0
PO
13095 }
13096 else if (THUMB_RECORD == record_type)
13097 {
13098 /* As thumb does not have condition codes, we set negative. */
13099 arm_record->cond = -1;
13100 insn_id = bits (arm_record->arm_insn, 13, 15);
13101 ret = thumb_handle_insn[insn_id] (arm_record);
ca92db2d
YQ
13102 if (ret != ARM_RECORD_SUCCESS)
13103 {
13104 arm_record_unsupported_insn (arm_record);
13105 ret = -1;
13106 }
72508ac0
PO
13107 }
13108 else if (THUMB2_RECORD == record_type)
13109 {
c6ec2b30
OJ
13110 /* As thumb does not have condition codes, we set negative. */
13111 arm_record->cond = -1;
13112
13113 /* Swap first half of 32bit thumb instruction with second half. */
13114 arm_record->arm_insn
01e57735 13115 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
c6ec2b30 13116
ca92db2d 13117 ret = thumb2_record_decode_insn_handler (arm_record);
c6ec2b30 13118
ca92db2d 13119 if (ret != ARM_RECORD_SUCCESS)
01e57735
YQ
13120 {
13121 arm_record_unsupported_insn (arm_record);
13122 ret = -1;
13123 }
72508ac0
PO
13124 }
13125 else
13126 {
13127 /* Throw assertion. */
13128 gdb_assert_not_reached ("not a valid instruction, could not decode");
13129 }
13130
13131 return ret;
13132}
13133
b121eeb9
YQ
13134#if GDB_SELF_TEST
13135namespace selftests {
13136
13137/* Provide both 16-bit and 32-bit thumb instructions. */
13138
13139class instruction_reader_thumb : public abstract_memory_reader
13140{
13141public:
13142 template<size_t SIZE>
13143 instruction_reader_thumb (enum bfd_endian endian,
13144 const uint16_t (&insns)[SIZE])
13145 : m_endian (endian), m_insns (insns), m_insns_size (SIZE)
13146 {}
13147
632e107b 13148 bool read (CORE_ADDR memaddr, gdb_byte *buf, const size_t len) override
b121eeb9
YQ
13149 {
13150 SELF_CHECK (len == 4 || len == 2);
13151 SELF_CHECK (memaddr % 2 == 0);
13152 SELF_CHECK ((memaddr / 2) < m_insns_size);
13153
13154 store_unsigned_integer (buf, 2, m_endian, m_insns[memaddr / 2]);
13155 if (len == 4)
13156 {
13157 store_unsigned_integer (&buf[2], 2, m_endian,
13158 m_insns[memaddr / 2 + 1]);
13159 }
13160 return true;
13161 }
13162
13163private:
13164 enum bfd_endian m_endian;
13165 const uint16_t *m_insns;
13166 size_t m_insns_size;
13167};
13168
13169static void
13170arm_record_test (void)
13171{
13172 struct gdbarch_info info;
13173 gdbarch_info_init (&info);
13174 info.bfd_arch_info = bfd_scan_arch ("arm");
13175
13176 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
13177
13178 SELF_CHECK (gdbarch != NULL);
13179
13180 /* 16-bit Thumb instructions. */
13181 {
13182 insn_decode_record arm_record;
13183
13184 memset (&arm_record, 0, sizeof (insn_decode_record));
13185 arm_record.gdbarch = gdbarch;
13186
13187 static const uint16_t insns[] = {
13188 /* db b2 uxtb r3, r3 */
13189 0xb2db,
13190 /* cd 58 ldr r5, [r1, r3] */
13191 0x58cd,
13192 };
13193
13194 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13195 instruction_reader_thumb reader (endian, insns);
13196 int ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13197 THUMB_INSN_SIZE_BYTES);
13198
13199 SELF_CHECK (ret == 0);
13200 SELF_CHECK (arm_record.mem_rec_count == 0);
13201 SELF_CHECK (arm_record.reg_rec_count == 1);
13202 SELF_CHECK (arm_record.arm_regs[0] == 3);
13203
13204 arm_record.this_addr += 2;
13205 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13206 THUMB_INSN_SIZE_BYTES);
13207
13208 SELF_CHECK (ret == 0);
13209 SELF_CHECK (arm_record.mem_rec_count == 0);
13210 SELF_CHECK (arm_record.reg_rec_count == 1);
13211 SELF_CHECK (arm_record.arm_regs[0] == 5);
13212 }
13213
13214 /* 32-bit Thumb-2 instructions. */
13215 {
13216 insn_decode_record arm_record;
13217
13218 memset (&arm_record, 0, sizeof (insn_decode_record));
13219 arm_record.gdbarch = gdbarch;
13220
13221 static const uint16_t insns[] = {
13222 /* 1d ee 70 7f mrc 15, 0, r7, cr13, cr0, {3} */
13223 0xee1d, 0x7f70,
13224 };
13225
13226 enum bfd_endian endian = gdbarch_byte_order_for_code (arm_record.gdbarch);
13227 instruction_reader_thumb reader (endian, insns);
13228 int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
13229 THUMB2_INSN_SIZE_BYTES);
13230
13231 SELF_CHECK (ret == 0);
13232 SELF_CHECK (arm_record.mem_rec_count == 0);
13233 SELF_CHECK (arm_record.reg_rec_count == 1);
13234 SELF_CHECK (arm_record.arm_regs[0] == 7);
13235 }
13236}
13237} // namespace selftests
13238#endif /* GDB_SELF_TEST */
72508ac0
PO
13239
13240/* Cleans up local record registers and memory allocations. */
13241
13242static void
13243deallocate_reg_mem (insn_decode_record *record)
13244{
13245 xfree (record->arm_regs);
13246 xfree (record->arm_mems);
13247}
13248
13249
01e57735 13250/* Parse the current instruction and record the values of the registers and
72508ac0
PO
13251 memory that will be changed in current instruction to record_arch_list".
13252 Return -1 if something is wrong. */
13253
13254int
01e57735
YQ
13255arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
13256 CORE_ADDR insn_addr)
72508ac0
PO
13257{
13258
72508ac0
PO
13259 uint32_t no_of_rec = 0;
13260 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
13261 ULONGEST t_bit = 0, insn_id = 0;
13262
13263 ULONGEST u_regval = 0;
13264
13265 insn_decode_record arm_record;
13266
13267 memset (&arm_record, 0, sizeof (insn_decode_record));
13268 arm_record.regcache = regcache;
13269 arm_record.this_addr = insn_addr;
13270 arm_record.gdbarch = gdbarch;
13271
13272
13273 if (record_debug > 1)
13274 {
13275 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
01e57735 13276 "addr = %s\n",
72508ac0
PO
13277 paddress (gdbarch, arm_record.this_addr));
13278 }
13279
728a7913
YQ
13280 instruction_reader reader;
13281 if (extract_arm_insn (reader, &arm_record, 2))
72508ac0
PO
13282 {
13283 if (record_debug)
01e57735
YQ
13284 {
13285 printf_unfiltered (_("Process record: error reading memory at "
13286 "addr %s len = %d.\n"),
13287 paddress (arm_record.gdbarch,
13288 arm_record.this_addr), 2);
13289 }
72508ac0
PO
13290 return -1;
13291 }
13292
13293 /* Check the insn, whether it is thumb or arm one. */
13294
13295 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
13296 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
13297
13298
13299 if (!(u_regval & t_bit))
13300 {
13301 /* We are decoding arm insn. */
728a7913 13302 ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
72508ac0
PO
13303 }
13304 else
13305 {
13306 insn_id = bits (arm_record.arm_insn, 11, 15);
13307 /* is it thumb2 insn? */
13308 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
01e57735 13309 {
728a7913 13310 ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
01e57735
YQ
13311 THUMB2_INSN_SIZE_BYTES);
13312 }
72508ac0 13313 else
01e57735
YQ
13314 {
13315 /* We are decoding thumb insn. */
728a7913
YQ
13316 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
13317 THUMB_INSN_SIZE_BYTES);
01e57735 13318 }
72508ac0
PO
13319 }
13320
13321 if (0 == ret)
13322 {
13323 /* Record registers. */
25ea693b 13324 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0 13325 if (arm_record.arm_regs)
01e57735
YQ
13326 {
13327 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
13328 {
13329 if (record_full_arch_list_add_reg
25ea693b 13330 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
01e57735
YQ
13331 ret = -1;
13332 }
13333 }
72508ac0
PO
13334 /* Record memories. */
13335 if (arm_record.arm_mems)
01e57735
YQ
13336 {
13337 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
13338 {
13339 if (record_full_arch_list_add_mem
13340 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 13341 arm_record.arm_mems[no_of_rec].len))
01e57735
YQ
13342 ret = -1;
13343 }
13344 }
72508ac0 13345
25ea693b 13346 if (record_full_arch_list_add_end ())
01e57735 13347 ret = -1;
72508ac0
PO
13348 }
13349
13350
13351 deallocate_reg_mem (&arm_record);
13352
13353 return ret;
13354}
This page took 2.329968 seconds and 4 git commands to generate.