[gdbserver] disable Elf32_auxv_t/Elf64_auxv_t AC_CHECK_TYPES check on Android
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
CommitLineData
ed9a39eb 1/* Common target dependent code for GDB on ARM systems.
0fd88904 2
32d0add0 3 Copyright (C) 1988-2015 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
0963b4bd 22#include <ctype.h> /* XXX for isupper (). */
34e8f22d 23
c906108c
SS
24#include "frame.h"
25#include "inferior.h"
45741a9c 26#include "infrun.h"
c906108c
SS
27#include "gdbcmd.h"
28#include "gdbcore.h"
0963b4bd 29#include "dis-asm.h" /* For register styles. */
4e052eda 30#include "regcache.h"
54483882 31#include "reggroups.h"
d16aafd8 32#include "doublest.h"
fd0407d6 33#include "value.h"
34e8f22d 34#include "arch-utils.h"
4be87837 35#include "osabi.h"
eb5492fa
DJ
36#include "frame-unwind.h"
37#include "frame-base.h"
38#include "trad-frame.h"
842e1f1e
DJ
39#include "objfiles.h"
40#include "dwarf2-frame.h"
e4c16157 41#include "gdbtypes.h"
29d73ae4 42#include "prologue-value.h"
25f8c692 43#include "remote.h"
123dc839
DJ
44#include "target-descriptions.h"
45#include "user-regs.h"
0e9e9abd 46#include "observer.h"
34e8f22d 47
8689682c 48#include "arch/arm.h"
34e8f22d 49#include "arm-tdep.h"
26216b98 50#include "gdb/sim-arm.h"
34e8f22d 51
082fc60d
RE
52#include "elf-bfd.h"
53#include "coff/internal.h"
97e03143 54#include "elf/arm.h"
c906108c 55
60c5725c 56#include "vec.h"
26216b98 57
72508ac0 58#include "record.h"
d02ed0bb 59#include "record-full.h"
72508ac0 60
9779414d 61#include "features/arm-with-m.c"
25f8c692 62#include "features/arm-with-m-fpa-layout.c"
3184d3f9 63#include "features/arm-with-m-vfp-d16.c"
ef7e8358
UW
64#include "features/arm-with-iwmmxt.c"
65#include "features/arm-with-vfpv2.c"
66#include "features/arm-with-vfpv3.c"
67#include "features/arm-with-neon.c"
9779414d 68
6529d2dd
AC
69static int arm_debug;
70
082fc60d
RE
71/* Macros for setting and testing a bit in a minimal symbol that marks
72 it as Thumb function. The MSB of the minimal symbol's "info" field
f594e5e9 73 is used for this purpose.
082fc60d
RE
74
75 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
f594e5e9 76 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
082fc60d 77
0963b4bd 78#define MSYMBOL_SET_SPECIAL(msym) \
b887350f 79 MSYMBOL_TARGET_FLAG_1 (msym) = 1
082fc60d
RE
80
81#define MSYMBOL_IS_SPECIAL(msym) \
b887350f 82 MSYMBOL_TARGET_FLAG_1 (msym)
082fc60d 83
60c5725c
DJ
84/* Per-objfile data used for mapping symbols. */
85static const struct objfile_data *arm_objfile_data_key;
86
87struct arm_mapping_symbol
88{
89 bfd_vma value;
90 char type;
91};
92typedef struct arm_mapping_symbol arm_mapping_symbol_s;
93DEF_VEC_O(arm_mapping_symbol_s);
94
95struct arm_per_objfile
96{
97 VEC(arm_mapping_symbol_s) **section_maps;
98};
99
afd7eef0
RE
100/* The list of available "set arm ..." and "show arm ..." commands. */
101static struct cmd_list_element *setarmcmdlist = NULL;
102static struct cmd_list_element *showarmcmdlist = NULL;
103
fd50bc42
RE
104/* The type of floating-point to use. Keep this in sync with enum
105 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 106static const char *const fp_model_strings[] =
fd50bc42
RE
107{
108 "auto",
109 "softfpa",
110 "fpa",
111 "softvfp",
28e97307
DJ
112 "vfp",
113 NULL
fd50bc42
RE
114};
115
116/* A variable that can be configured by the user. */
117static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
118static const char *current_fp_model = "auto";
119
28e97307 120/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 121static const char *const arm_abi_strings[] =
28e97307
DJ
122{
123 "auto",
124 "APCS",
125 "AAPCS",
126 NULL
127};
128
129/* A variable that can be configured by the user. */
130static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
131static const char *arm_abi_string = "auto";
132
0428b8f5 133/* The execution mode to assume. */
40478521 134static const char *const arm_mode_strings[] =
0428b8f5
DJ
135 {
136 "auto",
137 "arm",
68770265
MGD
138 "thumb",
139 NULL
0428b8f5
DJ
140 };
141
142static const char *arm_fallback_mode_string = "auto";
143static const char *arm_force_mode_string = "auto";
144
18819fa6
UW
145/* Internal override of the execution mode. -1 means no override,
146 0 means override to ARM mode, 1 means override to Thumb mode.
147 The effect is the same as if arm_force_mode has been set by the
148 user (except the internal override has precedence over a user's
149 arm_force_mode override). */
150static int arm_override_mode = -1;
151
94c30b78 152/* Number of different reg name sets (options). */
afd7eef0 153static int num_disassembly_options;
bc90b915 154
f32bf4a4
YQ
155/* The standard register names, and all the valid aliases for them. Note
156 that `fp', `sp' and `pc' are not added in this alias list, because they
157 have been added as builtin user registers in
158 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
159static const struct
160{
161 const char *name;
162 int regnum;
163} arm_register_aliases[] = {
164 /* Basic register numbers. */
165 { "r0", 0 },
166 { "r1", 1 },
167 { "r2", 2 },
168 { "r3", 3 },
169 { "r4", 4 },
170 { "r5", 5 },
171 { "r6", 6 },
172 { "r7", 7 },
173 { "r8", 8 },
174 { "r9", 9 },
175 { "r10", 10 },
176 { "r11", 11 },
177 { "r12", 12 },
178 { "r13", 13 },
179 { "r14", 14 },
180 { "r15", 15 },
181 /* Synonyms (argument and variable registers). */
182 { "a1", 0 },
183 { "a2", 1 },
184 { "a3", 2 },
185 { "a4", 3 },
186 { "v1", 4 },
187 { "v2", 5 },
188 { "v3", 6 },
189 { "v4", 7 },
190 { "v5", 8 },
191 { "v6", 9 },
192 { "v7", 10 },
193 { "v8", 11 },
194 /* Other platform-specific names for r9. */
195 { "sb", 9 },
196 { "tr", 9 },
197 /* Special names. */
198 { "ip", 12 },
123dc839 199 { "lr", 14 },
123dc839
DJ
200 /* Names used by GCC (not listed in the ARM EABI). */
201 { "sl", 10 },
123dc839
DJ
202 /* A special name from the older ATPCS. */
203 { "wr", 7 },
204};
bc90b915 205
123dc839 206static const char *const arm_register_names[] =
da59e081
JM
207{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
208 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
209 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
210 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
211 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
212 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 213 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 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
RE
222 style. */
223static void set_disassembly_style_sfunc(char *, int,
ed9a39eb 224 struct cmd_list_element *);
afd7eef0 225static void set_disassembly_style (void);
ed9a39eb 226
b508a996 227static void convert_from_extended (const struct floatformat *, const void *,
be8626e0 228 void *, int);
b508a996 229static void convert_to_extended (const struct floatformat *, void *,
be8626e0 230 const void *, int);
ed9a39eb 231
05d1431c
PA
232static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
233 struct regcache *regcache,
234 int regnum, gdb_byte *buf);
58d6951d
DJ
235static void arm_neon_quad_write (struct gdbarch *gdbarch,
236 struct regcache *regcache,
237 int regnum, const gdb_byte *buf);
238
9b8d791a 239struct arm_prologue_cache
c3b4394c 240{
eb5492fa
DJ
241 /* The stack pointer at the time this frame was created; i.e. the
242 caller's stack pointer when this function was called. It is used
243 to identify this frame. */
244 CORE_ADDR prev_sp;
245
4be43953
DJ
246 /* The frame base for this frame is just prev_sp - frame size.
247 FRAMESIZE is the distance from the frame pointer to the
248 initial stack pointer. */
eb5492fa 249
c3b4394c 250 int framesize;
eb5492fa
DJ
251
252 /* The register used to hold the frame pointer for this frame. */
c3b4394c 253 int framereg;
eb5492fa
DJ
254
255 /* Saved register offsets. */
256 struct trad_frame_saved_reg *saved_regs;
c3b4394c 257};
ed9a39eb 258
0d39a070
DJ
259static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
260 CORE_ADDR prologue_start,
261 CORE_ADDR prologue_end,
262 struct arm_prologue_cache *cache);
263
cca44b1b
JB
264/* Architecture version for displaced stepping. This effects the behaviour of
265 certain instructions, and really should not be hard-wired. */
266
267#define DISPLACED_STEPPING_ARCH_VERSION 5
268
94c30b78 269/* Set to true if the 32-bit mode is in use. */
c906108c
SS
270
271int arm_apcs_32 = 1;
272
9779414d
DJ
273/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
274
478fd957 275int
9779414d
DJ
276arm_psr_thumb_bit (struct gdbarch *gdbarch)
277{
278 if (gdbarch_tdep (gdbarch)->is_m)
279 return XPSR_T;
280 else
281 return CPSR_T;
282}
283
b39cc962
DJ
284/* Determine if FRAME is executing in Thumb mode. */
285
25b41d01 286int
b39cc962
DJ
287arm_frame_is_thumb (struct frame_info *frame)
288{
289 CORE_ADDR cpsr;
9779414d 290 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
291
292 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
293 directly (from a signal frame or dummy frame) or by interpreting
294 the saved LR (from a prologue or DWARF frame). So consult it and
295 trust the unwinders. */
296 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
297
9779414d 298 return (cpsr & t_bit) != 0;
b39cc962
DJ
299}
300
60c5725c
DJ
301/* Callback for VEC_lower_bound. */
302
303static inline int
304arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
305 const struct arm_mapping_symbol *rhs)
306{
307 return lhs->value < rhs->value;
308}
309
f9d67f43
DJ
310/* Search for the mapping symbol covering MEMADDR. If one is found,
311 return its type. Otherwise, return 0. If START is non-NULL,
312 set *START to the location of the mapping symbol. */
c906108c 313
f9d67f43
DJ
314static char
315arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 316{
60c5725c 317 struct obj_section *sec;
0428b8f5 318
60c5725c
DJ
319 /* If there are mapping symbols, consult them. */
320 sec = find_pc_section (memaddr);
321 if (sec != NULL)
322 {
323 struct arm_per_objfile *data;
324 VEC(arm_mapping_symbol_s) *map;
aded6f54
PA
325 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
326 0 };
60c5725c
DJ
327 unsigned int idx;
328
9a3c8263
SM
329 data = (struct arm_per_objfile *) objfile_data (sec->objfile,
330 arm_objfile_data_key);
60c5725c
DJ
331 if (data != NULL)
332 {
333 map = data->section_maps[sec->the_bfd_section->index];
334 if (!VEC_empty (arm_mapping_symbol_s, map))
335 {
336 struct arm_mapping_symbol *map_sym;
337
338 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
339 arm_compare_mapping_symbols);
340
341 /* VEC_lower_bound finds the earliest ordered insertion
342 point. If the following symbol starts at this exact
343 address, we use that; otherwise, the preceding
344 mapping symbol covers this address. */
345 if (idx < VEC_length (arm_mapping_symbol_s, map))
346 {
347 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
348 if (map_sym->value == map_key.value)
f9d67f43
DJ
349 {
350 if (start)
351 *start = map_sym->value + obj_section_addr (sec);
352 return map_sym->type;
353 }
60c5725c
DJ
354 }
355
356 if (idx > 0)
357 {
358 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
f9d67f43
DJ
359 if (start)
360 *start = map_sym->value + obj_section_addr (sec);
361 return map_sym->type;
60c5725c
DJ
362 }
363 }
364 }
365 }
366
f9d67f43
DJ
367 return 0;
368}
369
370/* Determine if the program counter specified in MEMADDR is in a Thumb
371 function. This function should be called for addresses unrelated to
372 any executing frame; otherwise, prefer arm_frame_is_thumb. */
373
e3039479 374int
9779414d 375arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 376{
7cbd4a93 377 struct bound_minimal_symbol sym;
f9d67f43 378 char type;
a42244db
YQ
379 struct displaced_step_closure* dsc
380 = get_displaced_step_closure_by_addr(memaddr);
381
382 /* If checking the mode of displaced instruction in copy area, the mode
383 should be determined by instruction on the original address. */
384 if (dsc)
385 {
386 if (debug_displaced)
387 fprintf_unfiltered (gdb_stdlog,
388 "displaced: check mode of %.8lx instead of %.8lx\n",
389 (unsigned long) dsc->insn_addr,
390 (unsigned long) memaddr);
391 memaddr = dsc->insn_addr;
392 }
f9d67f43
DJ
393
394 /* If bit 0 of the address is set, assume this is a Thumb address. */
395 if (IS_THUMB_ADDR (memaddr))
396 return 1;
397
18819fa6
UW
398 /* Respect internal mode override if active. */
399 if (arm_override_mode != -1)
400 return arm_override_mode;
401
f9d67f43
DJ
402 /* If the user wants to override the symbol table, let him. */
403 if (strcmp (arm_force_mode_string, "arm") == 0)
404 return 0;
405 if (strcmp (arm_force_mode_string, "thumb") == 0)
406 return 1;
407
9779414d
DJ
408 /* ARM v6-M and v7-M are always in Thumb mode. */
409 if (gdbarch_tdep (gdbarch)->is_m)
410 return 1;
411
f9d67f43
DJ
412 /* If there are mapping symbols, consult them. */
413 type = arm_find_mapping_symbol (memaddr, NULL);
414 if (type)
415 return type == 't';
416
ed9a39eb 417 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c 418 sym = lookup_minimal_symbol_by_pc (memaddr);
7cbd4a93
TT
419 if (sym.minsym)
420 return (MSYMBOL_IS_SPECIAL (sym.minsym));
0428b8f5
DJ
421
422 /* If the user wants to override the fallback mode, let them. */
423 if (strcmp (arm_fallback_mode_string, "arm") == 0)
424 return 0;
425 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
426 return 1;
427
428 /* If we couldn't find any symbol, but we're talking to a running
429 target, then trust the current value of $cpsr. This lets
430 "display/i $pc" always show the correct mode (though if there is
431 a symbol table we will not reach here, so it still may not be
18819fa6 432 displayed in the mode it will be executed). */
0428b8f5 433 if (target_has_registers)
18819fa6 434 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
435
436 /* Otherwise we're out of luck; we assume ARM. */
437 return 0;
c906108c
SS
438}
439
181c1381 440/* Remove useless bits from addresses in a running program. */
34e8f22d 441static CORE_ADDR
24568a2c 442arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 443{
2ae28aa9
YQ
444 /* On M-profile devices, do not strip the low bit from EXC_RETURN
445 (the magic exception return address). */
446 if (gdbarch_tdep (gdbarch)->is_m
447 && (val & 0xfffffff0) == 0xfffffff0)
448 return val;
449
a3a2ee65 450 if (arm_apcs_32)
dd6be234 451 return UNMAKE_THUMB_ADDR (val);
c906108c 452 else
a3a2ee65 453 return (val & 0x03fffffc);
c906108c
SS
454}
455
0d39a070 456/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
457 can be safely ignored during prologue skipping. IS_THUMB is true
458 if the function is known to be a Thumb function due to the way it
459 is being called. */
0d39a070 460static int
e0634ccf 461skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 462{
e0634ccf 463 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7cbd4a93 464 struct bound_minimal_symbol msym;
0d39a070
DJ
465
466 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 467 if (msym.minsym != NULL
77e371c0 468 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
efd66ac6 469 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
e0634ccf 470 {
efd66ac6 471 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
0d39a070 472
e0634ccf
UW
473 /* The GNU linker's Thumb call stub to foo is named
474 __foo_from_thumb. */
475 if (strstr (name, "_from_thumb") != NULL)
476 name += 2;
0d39a070 477
e0634ccf
UW
478 /* On soft-float targets, __truncdfsf2 is called to convert promoted
479 arguments to their argument types in non-prototyped
480 functions. */
61012eef 481 if (startswith (name, "__truncdfsf2"))
e0634ccf 482 return 1;
61012eef 483 if (startswith (name, "__aeabi_d2f"))
e0634ccf 484 return 1;
0d39a070 485
e0634ccf 486 /* Internal functions related to thread-local storage. */
61012eef 487 if (startswith (name, "__tls_get_addr"))
e0634ccf 488 return 1;
61012eef 489 if (startswith (name, "__aeabi_read_tp"))
e0634ccf
UW
490 return 1;
491 }
492 else
493 {
494 /* If we run against a stripped glibc, we may be unable to identify
495 special functions by name. Check for one important case,
496 __aeabi_read_tp, by comparing the *code* against the default
497 implementation (this is hand-written ARM assembler in glibc). */
498
499 if (!is_thumb
500 && read_memory_unsigned_integer (pc, 4, byte_order_for_code)
501 == 0xe3e00a0f /* mov r0, #0xffff0fff */
502 && read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code)
503 == 0xe240f01f) /* sub pc, r0, #31 */
504 return 1;
505 }
ec3d575a 506
0d39a070
DJ
507 return 0;
508}
509
510/* Support routines for instruction parsing. */
511#define submask(x) ((1L << ((x) + 1)) - 1)
512#define bit(obj,st) (((obj) >> (st)) & 1)
513#define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
514#define sbits(obj,st,fn) \
515 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
516#define BranchDest(addr,instr) \
9991b207 517 ((CORE_ADDR) (((unsigned long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
0d39a070 518
621c6d5b
YQ
519/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
520 the first 16-bit of instruction, and INSN2 is the second 16-bit of
521 instruction. */
522#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
523 ((bits ((insn1), 0, 3) << 12) \
524 | (bits ((insn1), 10, 10) << 11) \
525 | (bits ((insn2), 12, 14) << 8) \
526 | bits ((insn2), 0, 7))
527
528/* Extract the immediate from instruction movw/movt of encoding A. INSN is
529 the 32-bit instruction. */
530#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
531 ((bits ((insn), 16, 19) << 12) \
532 | bits ((insn), 0, 11))
533
ec3d575a
UW
534/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
535
536static unsigned int
537thumb_expand_immediate (unsigned int imm)
538{
539 unsigned int count = imm >> 7;
540
541 if (count < 8)
542 switch (count / 2)
543 {
544 case 0:
545 return imm & 0xff;
546 case 1:
547 return (imm & 0xff) | ((imm & 0xff) << 16);
548 case 2:
549 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
550 case 3:
551 return (imm & 0xff) | ((imm & 0xff) << 8)
552 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
553 }
554
555 return (0x80 | (imm & 0x7f)) << (32 - count);
556}
557
558/* Return 1 if the 16-bit Thumb instruction INST might change
559 control flow, 0 otherwise. */
560
561static int
562thumb_instruction_changes_pc (unsigned short inst)
563{
564 if ((inst & 0xff00) == 0xbd00) /* pop {rlist, pc} */
565 return 1;
566
567 if ((inst & 0xf000) == 0xd000) /* conditional branch */
568 return 1;
569
570 if ((inst & 0xf800) == 0xe000) /* unconditional branch */
571 return 1;
572
573 if ((inst & 0xff00) == 0x4700) /* bx REG, blx REG */
574 return 1;
575
ad8b5167
UW
576 if ((inst & 0xff87) == 0x4687) /* mov pc, REG */
577 return 1;
578
ec3d575a
UW
579 if ((inst & 0xf500) == 0xb100) /* CBNZ or CBZ. */
580 return 1;
581
582 return 0;
583}
584
585/* Return 1 if the 32-bit Thumb instruction in INST1 and INST2
586 might change control flow, 0 otherwise. */
587
588static int
589thumb2_instruction_changes_pc (unsigned short inst1, unsigned short inst2)
590{
591 if ((inst1 & 0xf800) == 0xf000 && (inst2 & 0x8000) == 0x8000)
592 {
593 /* Branches and miscellaneous control instructions. */
594
595 if ((inst2 & 0x1000) != 0 || (inst2 & 0xd001) == 0xc000)
596 {
597 /* B, BL, BLX. */
598 return 1;
599 }
600 else if (inst1 == 0xf3de && (inst2 & 0xff00) == 0x3f00)
601 {
602 /* SUBS PC, LR, #imm8. */
603 return 1;
604 }
605 else if ((inst2 & 0xd000) == 0x8000 && (inst1 & 0x0380) != 0x0380)
606 {
607 /* Conditional branch. */
608 return 1;
609 }
610
611 return 0;
612 }
613
614 if ((inst1 & 0xfe50) == 0xe810)
615 {
616 /* Load multiple or RFE. */
617
618 if (bit (inst1, 7) && !bit (inst1, 8))
619 {
620 /* LDMIA or POP */
621 if (bit (inst2, 15))
622 return 1;
623 }
624 else if (!bit (inst1, 7) && bit (inst1, 8))
625 {
626 /* LDMDB */
627 if (bit (inst2, 15))
628 return 1;
629 }
630 else if (bit (inst1, 7) && bit (inst1, 8))
631 {
632 /* RFEIA */
633 return 1;
634 }
635 else if (!bit (inst1, 7) && !bit (inst1, 8))
636 {
637 /* RFEDB */
638 return 1;
639 }
640
641 return 0;
642 }
643
644 if ((inst1 & 0xffef) == 0xea4f && (inst2 & 0xfff0) == 0x0f00)
645 {
646 /* MOV PC or MOVS PC. */
647 return 1;
648 }
649
650 if ((inst1 & 0xff70) == 0xf850 && (inst2 & 0xf000) == 0xf000)
651 {
652 /* LDR PC. */
653 if (bits (inst1, 0, 3) == 15)
654 return 1;
655 if (bit (inst1, 7))
656 return 1;
657 if (bit (inst2, 11))
658 return 1;
659 if ((inst2 & 0x0fc0) == 0x0000)
660 return 1;
661
662 return 0;
663 }
664
665 if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
666 {
667 /* TBB. */
668 return 1;
669 }
670
671 if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010)
672 {
673 /* TBH. */
674 return 1;
675 }
676
677 return 0;
678}
679
540314bd
YQ
680/* Return 1 if the 16-bit Thumb instruction INSN restores SP in
681 epilogue, 0 otherwise. */
682
683static int
684thumb_instruction_restores_sp (unsigned short insn)
685{
686 return (insn == 0x46bd /* mov sp, r7 */
687 || (insn & 0xff80) == 0xb000 /* add sp, imm */
688 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
689}
690
29d73ae4
DJ
691/* Analyze a Thumb prologue, looking for a recognizable stack frame
692 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
693 clobber the stack frame unexpectedly, or an unknown instruction.
694 Return the last address which is definitely safe to skip for an
695 initial breakpoint. */
c906108c
SS
696
697static CORE_ADDR
29d73ae4
DJ
698thumb_analyze_prologue (struct gdbarch *gdbarch,
699 CORE_ADDR start, CORE_ADDR limit,
700 struct arm_prologue_cache *cache)
c906108c 701{
0d39a070 702 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 703 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
704 int i;
705 pv_t regs[16];
706 struct pv_area *stack;
707 struct cleanup *back_to;
708 CORE_ADDR offset;
ec3d575a 709 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 710
29d73ae4
DJ
711 for (i = 0; i < 16; i++)
712 regs[i] = pv_register (i, 0);
55f960e1 713 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4
DJ
714 back_to = make_cleanup_free_pv_area (stack);
715
29d73ae4 716 while (start < limit)
c906108c 717 {
29d73ae4
DJ
718 unsigned short insn;
719
e17a4113 720 insn = read_memory_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 721
94c30b78 722 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 723 {
29d73ae4
DJ
724 int regno;
725 int mask;
4be43953
DJ
726
727 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
728 break;
29d73ae4
DJ
729
730 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
731 whether to save LR (R14). */
732 mask = (insn & 0xff) | ((insn & 0x100) << 6);
733
734 /* Calculate offsets of saved R0-R7 and LR. */
735 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
736 if (mask & (1 << regno))
737 {
29d73ae4
DJ
738 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
739 -4);
740 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
741 }
da59e081 742 }
1db01f22 743 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
da59e081 744 {
29d73ae4 745 offset = (insn & 0x7f) << 2; /* get scaled offset */
1db01f22
YQ
746 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
747 -offset);
da59e081 748 }
808f7ab1
YQ
749 else if (thumb_instruction_restores_sp (insn))
750 {
751 /* Don't scan past the epilogue. */
752 break;
753 }
0d39a070
DJ
754 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
755 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
756 (insn & 0xff) << 2);
757 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
758 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
759 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
760 bits (insn, 6, 8));
761 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
762 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
763 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
764 bits (insn, 0, 7));
765 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
766 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
767 && pv_is_constant (regs[bits (insn, 3, 5)]))
768 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
769 regs[bits (insn, 6, 8)]);
770 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
771 && pv_is_constant (regs[bits (insn, 3, 6)]))
772 {
773 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
774 int rm = bits (insn, 3, 6);
775 regs[rd] = pv_add (regs[rd], regs[rm]);
776 }
29d73ae4 777 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 778 {
29d73ae4
DJ
779 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
780 int src_reg = (insn & 0x78) >> 3;
781 regs[dst_reg] = regs[src_reg];
da59e081 782 }
29d73ae4 783 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 784 {
29d73ae4
DJ
785 /* Handle stores to the stack. Normally pushes are used,
786 but with GCC -mtpcs-frame, there may be other stores
787 in the prologue to create the frame. */
788 int regno = (insn >> 8) & 0x7;
789 pv_t addr;
790
791 offset = (insn & 0xff) << 2;
792 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
793
794 if (pv_area_store_would_trash (stack, addr))
795 break;
796
797 pv_area_store (stack, addr, 4, regs[regno]);
da59e081 798 }
0d39a070
DJ
799 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
800 {
801 int rd = bits (insn, 0, 2);
802 int rn = bits (insn, 3, 5);
803 pv_t addr;
804
805 offset = bits (insn, 6, 10) << 2;
806 addr = pv_add_constant (regs[rn], offset);
807
808 if (pv_area_store_would_trash (stack, addr))
809 break;
810
811 pv_area_store (stack, addr, 4, regs[rd]);
812 }
813 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
814 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
815 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
816 /* Ignore stores of argument registers to the stack. */
817 ;
818 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
819 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
820 /* Ignore block loads from the stack, potentially copying
821 parameters from memory. */
822 ;
823 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
824 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
825 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
826 /* Similarly ignore single loads from the stack. */
827 ;
828 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
829 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
830 /* Skip register copies, i.e. saves to another register
831 instead of the stack. */
832 ;
833 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
834 /* Recognize constant loads; even with small stacks these are necessary
835 on Thumb. */
836 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
837 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
838 {
839 /* Constant pool loads, for the same reason. */
840 unsigned int constant;
841 CORE_ADDR loc;
842
843 loc = start + 4 + bits (insn, 0, 7) * 4;
844 constant = read_memory_unsigned_integer (loc, 4, byte_order);
845 regs[bits (insn, 8, 10)] = pv_constant (constant);
846 }
db24da6d 847 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 848 {
0d39a070
DJ
849 unsigned short inst2;
850
851 inst2 = read_memory_unsigned_integer (start + 2, 2,
852 byte_order_for_code);
853
854 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
855 {
856 /* BL, BLX. Allow some special function calls when
857 skipping the prologue; GCC generates these before
858 storing arguments to the stack. */
859 CORE_ADDR nextpc;
860 int j1, j2, imm1, imm2;
861
862 imm1 = sbits (insn, 0, 10);
863 imm2 = bits (inst2, 0, 10);
864 j1 = bit (inst2, 13);
865 j2 = bit (inst2, 11);
866
867 offset = ((imm1 << 12) + (imm2 << 1));
868 offset ^= ((!j2) << 22) | ((!j1) << 23);
869
870 nextpc = start + 4 + offset;
871 /* For BLX make sure to clear the low bits. */
872 if (bit (inst2, 12) == 0)
873 nextpc = nextpc & 0xfffffffc;
874
e0634ccf
UW
875 if (!skip_prologue_function (gdbarch, nextpc,
876 bit (inst2, 12) != 0))
0d39a070
DJ
877 break;
878 }
ec3d575a 879
0963b4bd
MS
880 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
881 { registers } */
ec3d575a
UW
882 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
883 {
884 pv_t addr = regs[bits (insn, 0, 3)];
885 int regno;
886
887 if (pv_area_store_would_trash (stack, addr))
888 break;
889
890 /* Calculate offsets of saved registers. */
891 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
892 if (inst2 & (1 << regno))
893 {
894 addr = pv_add_constant (addr, -4);
895 pv_area_store (stack, addr, 4, regs[regno]);
896 }
897
898 if (insn & 0x0020)
899 regs[bits (insn, 0, 3)] = addr;
900 }
901
0963b4bd
MS
902 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
903 [Rn, #+/-imm]{!} */
ec3d575a
UW
904 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
905 {
906 int regno1 = bits (inst2, 12, 15);
907 int regno2 = bits (inst2, 8, 11);
908 pv_t addr = regs[bits (insn, 0, 3)];
909
910 offset = inst2 & 0xff;
911 if (insn & 0x0080)
912 addr = pv_add_constant (addr, offset);
913 else
914 addr = pv_add_constant (addr, -offset);
915
916 if (pv_area_store_would_trash (stack, addr))
917 break;
918
919 pv_area_store (stack, addr, 4, regs[regno1]);
920 pv_area_store (stack, pv_add_constant (addr, 4),
921 4, regs[regno2]);
922
923 if (insn & 0x0020)
924 regs[bits (insn, 0, 3)] = addr;
925 }
926
927 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
928 && (inst2 & 0x0c00) == 0x0c00
929 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
930 {
931 int regno = bits (inst2, 12, 15);
932 pv_t addr = regs[bits (insn, 0, 3)];
933
934 offset = inst2 & 0xff;
935 if (inst2 & 0x0200)
936 addr = pv_add_constant (addr, offset);
937 else
938 addr = pv_add_constant (addr, -offset);
939
940 if (pv_area_store_would_trash (stack, addr))
941 break;
942
943 pv_area_store (stack, addr, 4, regs[regno]);
944
945 if (inst2 & 0x0100)
946 regs[bits (insn, 0, 3)] = addr;
947 }
948
949 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
950 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
951 {
952 int regno = bits (inst2, 12, 15);
953 pv_t addr;
954
955 offset = inst2 & 0xfff;
956 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
957
958 if (pv_area_store_would_trash (stack, addr))
959 break;
960
961 pv_area_store (stack, addr, 4, regs[regno]);
962 }
963
964 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 965 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 966 /* Ignore stores of argument registers to the stack. */
0d39a070 967 ;
ec3d575a
UW
968
969 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
970 && (inst2 & 0x0d00) == 0x0c00
0d39a070 971 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 972 /* Ignore stores of argument registers to the stack. */
0d39a070 973 ;
ec3d575a 974
0963b4bd
MS
975 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
976 { registers } */
ec3d575a
UW
977 && (inst2 & 0x8000) == 0x0000
978 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
979 /* Ignore block loads from the stack, potentially copying
980 parameters from memory. */
0d39a070 981 ;
ec3d575a 982
0963b4bd
MS
983 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
984 [Rn, #+/-imm] */
0d39a070 985 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 986 /* Similarly ignore dual loads from the stack. */
0d39a070 987 ;
ec3d575a
UW
988
989 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
990 && (inst2 & 0x0d00) == 0x0c00
0d39a070 991 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 992 /* Similarly ignore single loads from the stack. */
0d39a070 993 ;
ec3d575a
UW
994
995 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
0d39a070 996 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 997 /* Similarly ignore single loads from the stack. */
0d39a070 998 ;
ec3d575a
UW
999
1000 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
1001 && (inst2 & 0x8000) == 0x0000)
1002 {
1003 unsigned int imm = ((bits (insn, 10, 10) << 11)
1004 | (bits (inst2, 12, 14) << 8)
1005 | bits (inst2, 0, 7));
1006
1007 regs[bits (inst2, 8, 11)]
1008 = pv_add_constant (regs[bits (insn, 0, 3)],
1009 thumb_expand_immediate (imm));
1010 }
1011
1012 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
1013 && (inst2 & 0x8000) == 0x0000)
0d39a070 1014 {
ec3d575a
UW
1015 unsigned int imm = ((bits (insn, 10, 10) << 11)
1016 | (bits (inst2, 12, 14) << 8)
1017 | bits (inst2, 0, 7));
1018
1019 regs[bits (inst2, 8, 11)]
1020 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
1021 }
1022
1023 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
1024 && (inst2 & 0x8000) == 0x0000)
1025 {
1026 unsigned int imm = ((bits (insn, 10, 10) << 11)
1027 | (bits (inst2, 12, 14) << 8)
1028 | bits (inst2, 0, 7));
1029
1030 regs[bits (inst2, 8, 11)]
1031 = pv_add_constant (regs[bits (insn, 0, 3)],
1032 - (CORE_ADDR) thumb_expand_immediate (imm));
1033 }
1034
1035 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
1036 && (inst2 & 0x8000) == 0x0000)
1037 {
1038 unsigned int imm = ((bits (insn, 10, 10) << 11)
1039 | (bits (inst2, 12, 14) << 8)
1040 | bits (inst2, 0, 7));
1041
1042 regs[bits (inst2, 8, 11)]
1043 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1044 }
1045
1046 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
1047 {
1048 unsigned int imm = ((bits (insn, 10, 10) << 11)
1049 | (bits (inst2, 12, 14) << 8)
1050 | bits (inst2, 0, 7));
1051
1052 regs[bits (inst2, 8, 11)]
1053 = pv_constant (thumb_expand_immediate (imm));
1054 }
1055
1056 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
1057 {
621c6d5b
YQ
1058 unsigned int imm
1059 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
1060
1061 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1062 }
1063
1064 else if (insn == 0xea5f /* mov.w Rd,Rm */
1065 && (inst2 & 0xf0f0) == 0)
1066 {
1067 int dst_reg = (inst2 & 0x0f00) >> 8;
1068 int src_reg = inst2 & 0xf;
1069 regs[dst_reg] = regs[src_reg];
1070 }
1071
1072 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1073 {
1074 /* Constant pool loads. */
1075 unsigned int constant;
1076 CORE_ADDR loc;
1077
cac395ea 1078 offset = bits (inst2, 0, 11);
ec3d575a
UW
1079 if (insn & 0x0080)
1080 loc = start + 4 + offset;
1081 else
1082 loc = start + 4 - offset;
1083
1084 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1085 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1086 }
1087
1088 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1089 {
1090 /* Constant pool loads. */
1091 unsigned int constant;
1092 CORE_ADDR loc;
1093
cac395ea 1094 offset = bits (inst2, 0, 7) << 2;
ec3d575a
UW
1095 if (insn & 0x0080)
1096 loc = start + 4 + offset;
1097 else
1098 loc = start + 4 - offset;
1099
1100 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1101 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1102
1103 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1104 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1105 }
1106
1107 else if (thumb2_instruction_changes_pc (insn, inst2))
1108 {
1109 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1110 break;
1111 }
ec3d575a
UW
1112 else
1113 {
1114 /* The optimizer might shove anything into the prologue,
1115 so we just skip what we don't recognize. */
1116 unrecognized_pc = start;
1117 }
0d39a070
DJ
1118
1119 start += 2;
1120 }
ec3d575a 1121 else if (thumb_instruction_changes_pc (insn))
3d74b771 1122 {
ec3d575a 1123 /* Don't scan past anything that might change control flow. */
da3c6d4a 1124 break;
3d74b771 1125 }
ec3d575a
UW
1126 else
1127 {
1128 /* The optimizer might shove anything into the prologue,
1129 so we just skip what we don't recognize. */
1130 unrecognized_pc = start;
1131 }
29d73ae4
DJ
1132
1133 start += 2;
c906108c
SS
1134 }
1135
0d39a070
DJ
1136 if (arm_debug)
1137 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1138 paddress (gdbarch, start));
1139
ec3d575a
UW
1140 if (unrecognized_pc == 0)
1141 unrecognized_pc = start;
1142
29d73ae4
DJ
1143 if (cache == NULL)
1144 {
1145 do_cleanups (back_to);
ec3d575a 1146 return unrecognized_pc;
29d73ae4
DJ
1147 }
1148
29d73ae4
DJ
1149 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1150 {
1151 /* Frame pointer is fp. Frame size is constant. */
1152 cache->framereg = ARM_FP_REGNUM;
1153 cache->framesize = -regs[ARM_FP_REGNUM].k;
1154 }
1155 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1156 {
1157 /* Frame pointer is r7. Frame size is constant. */
1158 cache->framereg = THUMB_FP_REGNUM;
1159 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1160 }
72a2e3dc 1161 else
29d73ae4
DJ
1162 {
1163 /* Try the stack pointer... this is a bit desperate. */
1164 cache->framereg = ARM_SP_REGNUM;
1165 cache->framesize = -regs[ARM_SP_REGNUM].k;
1166 }
29d73ae4
DJ
1167
1168 for (i = 0; i < 16; i++)
1169 if (pv_area_find_reg (stack, gdbarch, i, &offset))
1170 cache->saved_regs[i].addr = offset;
1171
1172 do_cleanups (back_to);
ec3d575a 1173 return unrecognized_pc;
c906108c
SS
1174}
1175
621c6d5b
YQ
1176
1177/* Try to analyze the instructions starting from PC, which load symbol
1178 __stack_chk_guard. Return the address of instruction after loading this
1179 symbol, set the dest register number to *BASEREG, and set the size of
1180 instructions for loading symbol in OFFSET. Return 0 if instructions are
1181 not recognized. */
1182
1183static CORE_ADDR
1184arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1185 unsigned int *destreg, int *offset)
1186{
1187 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1188 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1189 unsigned int low, high, address;
1190
1191 address = 0;
1192 if (is_thumb)
1193 {
1194 unsigned short insn1
1195 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
1196
1197 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1198 {
1199 *destreg = bits (insn1, 8, 10);
1200 *offset = 2;
6ae274b7
YQ
1201 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1202 address = read_memory_unsigned_integer (address, 4,
1203 byte_order_for_code);
621c6d5b
YQ
1204 }
1205 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1206 {
1207 unsigned short insn2
1208 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
1209
1210 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1211
1212 insn1
1213 = read_memory_unsigned_integer (pc + 4, 2, byte_order_for_code);
1214 insn2
1215 = read_memory_unsigned_integer (pc + 6, 2, byte_order_for_code);
1216
1217 /* movt Rd, #const */
1218 if ((insn1 & 0xfbc0) == 0xf2c0)
1219 {
1220 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1221 *destreg = bits (insn2, 8, 11);
1222 *offset = 8;
1223 address = (high << 16 | low);
1224 }
1225 }
1226 }
1227 else
1228 {
2e9e421f
UW
1229 unsigned int insn
1230 = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
1231
6ae274b7 1232 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
2e9e421f 1233 {
6ae274b7
YQ
1234 address = bits (insn, 0, 11) + pc + 8;
1235 address = read_memory_unsigned_integer (address, 4,
1236 byte_order_for_code);
1237
2e9e421f
UW
1238 *destreg = bits (insn, 12, 15);
1239 *offset = 4;
1240 }
1241 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1242 {
1243 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1244
1245 insn
1246 = read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code);
1247
1248 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1249 {
1250 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1251 *destreg = bits (insn, 12, 15);
1252 *offset = 8;
1253 address = (high << 16 | low);
1254 }
1255 }
621c6d5b
YQ
1256 }
1257
1258 return address;
1259}
1260
1261/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1262 points to the first instruction of this sequence, return the address of
1263 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1264
1265 On arm, this sequence of instructions is composed of mainly three steps,
1266 Step 1: load symbol __stack_chk_guard,
1267 Step 2: load from address of __stack_chk_guard,
1268 Step 3: store it to somewhere else.
1269
1270 Usually, instructions on step 2 and step 3 are the same on various ARM
1271 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1272 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1273 instructions in step 1 vary from different ARM architectures. On ARMv7,
1274 they are,
1275
1276 movw Rn, #:lower16:__stack_chk_guard
1277 movt Rn, #:upper16:__stack_chk_guard
1278
1279 On ARMv5t, it is,
1280
1281 ldr Rn, .Label
1282 ....
1283 .Lable:
1284 .word __stack_chk_guard
1285
1286 Since ldr/str is a very popular instruction, we can't use them as
1287 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1288 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1289 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1290
1291static CORE_ADDR
1292arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1293{
1294 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1295 unsigned int basereg;
7cbd4a93 1296 struct bound_minimal_symbol stack_chk_guard;
621c6d5b
YQ
1297 int offset;
1298 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1299 CORE_ADDR addr;
1300
1301 /* Try to parse the instructions in Step 1. */
1302 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1303 &basereg, &offset);
1304 if (!addr)
1305 return pc;
1306
1307 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
6041179a
JB
1308 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1309 Otherwise, this sequence cannot be for stack protector. */
1310 if (stack_chk_guard.minsym == NULL
61012eef 1311 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
621c6d5b
YQ
1312 return pc;
1313
1314 if (is_thumb)
1315 {
1316 unsigned int destreg;
1317 unsigned short insn
1318 = read_memory_unsigned_integer (pc + offset, 2, byte_order_for_code);
1319
1320 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1321 if ((insn & 0xf800) != 0x6800)
1322 return pc;
1323 if (bits (insn, 3, 5) != basereg)
1324 return pc;
1325 destreg = bits (insn, 0, 2);
1326
1327 insn = read_memory_unsigned_integer (pc + offset + 2, 2,
1328 byte_order_for_code);
1329 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1330 if ((insn & 0xf800) != 0x6000)
1331 return pc;
1332 if (destreg != bits (insn, 0, 2))
1333 return pc;
1334 }
1335 else
1336 {
1337 unsigned int destreg;
1338 unsigned int insn
1339 = read_memory_unsigned_integer (pc + offset, 4, byte_order_for_code);
1340
1341 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1342 if ((insn & 0x0e500000) != 0x04100000)
1343 return pc;
1344 if (bits (insn, 16, 19) != basereg)
1345 return pc;
1346 destreg = bits (insn, 12, 15);
1347 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1348 insn = read_memory_unsigned_integer (pc + offset + 4,
1349 4, byte_order_for_code);
1350 if ((insn & 0x0e500000) != 0x04000000)
1351 return pc;
1352 if (bits (insn, 12, 15) != destreg)
1353 return pc;
1354 }
1355 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1356 on arm. */
1357 if (is_thumb)
1358 return pc + offset + 4;
1359 else
1360 return pc + offset + 8;
1361}
1362
da3c6d4a
MS
1363/* Advance the PC across any function entry prologue instructions to
1364 reach some "real" code.
34e8f22d
RE
1365
1366 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1367 prologue:
c906108c 1368
c5aa993b
JM
1369 mov ip, sp
1370 [stmfd sp!, {a1,a2,a3,a4}]
1371 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1372 [stfe f7, [sp, #-12]!]
1373 [stfe f6, [sp, #-12]!]
1374 [stfe f5, [sp, #-12]!]
1375 [stfe f4, [sp, #-12]!]
0963b4bd 1376 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1377
34e8f22d 1378static CORE_ADDR
6093d2eb 1379arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1380{
e17a4113 1381 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c 1382 unsigned long inst;
a89fea3c 1383 CORE_ADDR func_addr, limit_pc;
c906108c 1384
a89fea3c
JL
1385 /* See if we can determine the end of the prologue via the symbol table.
1386 If so, then return either PC, or the PC after the prologue, whichever
1387 is greater. */
1388 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1389 {
d80b854b
UW
1390 CORE_ADDR post_prologue_pc
1391 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1392 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1393
621c6d5b
YQ
1394 if (post_prologue_pc)
1395 post_prologue_pc
1396 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1397
1398
0d39a070
DJ
1399 /* GCC always emits a line note before the prologue and another
1400 one after, even if the two are at the same address or on the
1401 same line. Take advantage of this so that we do not need to
1402 know every instruction that might appear in the prologue. We
1403 will have producer information for most binaries; if it is
1404 missing (e.g. for -gstabs), assuming the GNU tools. */
1405 if (post_prologue_pc
43f3e411
DE
1406 && (cust == NULL
1407 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1408 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1409 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1410 return post_prologue_pc;
1411
a89fea3c 1412 if (post_prologue_pc != 0)
0d39a070
DJ
1413 {
1414 CORE_ADDR analyzed_limit;
1415
1416 /* For non-GCC compilers, make sure the entire line is an
1417 acceptable prologue; GDB will round this function's
1418 return value up to the end of the following line so we
1419 can not skip just part of a line (and we do not want to).
1420
1421 RealView does not treat the prologue specially, but does
1422 associate prologue code with the opening brace; so this
1423 lets us skip the first line if we think it is the opening
1424 brace. */
9779414d 1425 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1426 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1427 post_prologue_pc, NULL);
1428 else
1429 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1430 post_prologue_pc, NULL);
1431
1432 if (analyzed_limit != post_prologue_pc)
1433 return func_addr;
1434
1435 return post_prologue_pc;
1436 }
c906108c
SS
1437 }
1438
a89fea3c
JL
1439 /* Can't determine prologue from the symbol table, need to examine
1440 instructions. */
c906108c 1441
a89fea3c
JL
1442 /* Find an upper limit on the function prologue using the debug
1443 information. If the debug information could not be used to provide
1444 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1445 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1446 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1447 if (limit_pc == 0)
1448 limit_pc = pc + 64; /* Magic. */
1449
c906108c 1450
29d73ae4 1451 /* Check if this is Thumb code. */
9779414d 1452 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1453 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1454 else
1455 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1456}
94c30b78 1457
c5aa993b 1458/* *INDENT-OFF* */
c906108c
SS
1459/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1460 This function decodes a Thumb function prologue to determine:
1461 1) the size of the stack frame
1462 2) which registers are saved on it
1463 3) the offsets of saved regs
1464 4) the offset from the stack pointer to the frame pointer
c906108c 1465
da59e081
JM
1466 A typical Thumb function prologue would create this stack frame
1467 (offsets relative to FP)
c906108c
SS
1468 old SP -> 24 stack parameters
1469 20 LR
1470 16 R7
1471 R7 -> 0 local variables (16 bytes)
1472 SP -> -12 additional stack space (12 bytes)
1473 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1474 12 bytes. The frame register is R7.
da59e081 1475
da3c6d4a
MS
1476 The comments for thumb_skip_prolog() describe the algorithm we use
1477 to detect the end of the prolog. */
c5aa993b
JM
1478/* *INDENT-ON* */
1479
c906108c 1480static void
be8626e0 1481thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1482 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1483{
1484 CORE_ADDR prologue_start;
1485 CORE_ADDR prologue_end;
c906108c 1486
b39cc962
DJ
1487 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1488 &prologue_end))
c906108c 1489 {
ec3d575a
UW
1490 /* See comment in arm_scan_prologue for an explanation of
1491 this heuristics. */
1492 if (prologue_end > prologue_start + 64)
1493 {
1494 prologue_end = prologue_start + 64;
1495 }
c906108c
SS
1496 }
1497 else
f7060f85
DJ
1498 /* We're in the boondocks: we have no idea where the start of the
1499 function is. */
1500 return;
c906108c 1501
eb5492fa 1502 prologue_end = min (prologue_end, prev_pc);
c906108c 1503
be8626e0 1504 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1505}
1506
0d39a070 1507/* Return 1 if THIS_INSTR might change control flow, 0 otherwise. */
c906108c 1508
0d39a070
DJ
1509static int
1510arm_instruction_changes_pc (uint32_t this_instr)
c906108c 1511{
0d39a070
DJ
1512 if (bits (this_instr, 28, 31) == INST_NV)
1513 /* Unconditional instructions. */
1514 switch (bits (this_instr, 24, 27))
1515 {
1516 case 0xa:
1517 case 0xb:
1518 /* Branch with Link and change to Thumb. */
1519 return 1;
1520 case 0xc:
1521 case 0xd:
1522 case 0xe:
1523 /* Coprocessor register transfer. */
1524 if (bits (this_instr, 12, 15) == 15)
1525 error (_("Invalid update to pc in instruction"));
1526 return 0;
1527 default:
1528 return 0;
1529 }
1530 else
1531 switch (bits (this_instr, 25, 27))
1532 {
1533 case 0x0:
1534 if (bits (this_instr, 23, 24) == 2 && bit (this_instr, 20) == 0)
1535 {
1536 /* Multiplies and extra load/stores. */
1537 if (bit (this_instr, 4) == 1 && bit (this_instr, 7) == 1)
1538 /* Neither multiplies nor extension load/stores are allowed
1539 to modify PC. */
1540 return 0;
1541
1542 /* Otherwise, miscellaneous instructions. */
1543
1544 /* BX <reg>, BXJ <reg>, BLX <reg> */
1545 if (bits (this_instr, 4, 27) == 0x12fff1
1546 || bits (this_instr, 4, 27) == 0x12fff2
1547 || bits (this_instr, 4, 27) == 0x12fff3)
1548 return 1;
1549
1550 /* Other miscellaneous instructions are unpredictable if they
1551 modify PC. */
1552 return 0;
1553 }
1554 /* Data processing instruction. Fall through. */
c906108c 1555
0d39a070
DJ
1556 case 0x1:
1557 if (bits (this_instr, 12, 15) == 15)
1558 return 1;
1559 else
1560 return 0;
c906108c 1561
0d39a070
DJ
1562 case 0x2:
1563 case 0x3:
1564 /* Media instructions and architecturally undefined instructions. */
1565 if (bits (this_instr, 25, 27) == 3 && bit (this_instr, 4) == 1)
1566 return 0;
c906108c 1567
0d39a070
DJ
1568 /* Stores. */
1569 if (bit (this_instr, 20) == 0)
1570 return 0;
2a451106 1571
0d39a070
DJ
1572 /* Loads. */
1573 if (bits (this_instr, 12, 15) == ARM_PC_REGNUM)
1574 return 1;
1575 else
1576 return 0;
2a451106 1577
0d39a070
DJ
1578 case 0x4:
1579 /* Load/store multiple. */
1580 if (bit (this_instr, 20) == 1 && bit (this_instr, 15) == 1)
1581 return 1;
1582 else
1583 return 0;
2a451106 1584
0d39a070
DJ
1585 case 0x5:
1586 /* Branch and branch with link. */
1587 return 1;
2a451106 1588
0d39a070
DJ
1589 case 0x6:
1590 case 0x7:
1591 /* Coprocessor transfers or SWIs can not affect PC. */
1592 return 0;
eb5492fa 1593
0d39a070 1594 default:
9b20d036 1595 internal_error (__FILE__, __LINE__, _("bad value in switch"));
0d39a070
DJ
1596 }
1597}
c906108c 1598
f303bc3e
YQ
1599/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1600 otherwise. */
1601
1602static int
1603arm_instruction_restores_sp (unsigned int insn)
1604{
1605 if (bits (insn, 28, 31) != INST_NV)
1606 {
1607 if ((insn & 0x0df0f000) == 0x0080d000
1608 /* ADD SP (register or immediate). */
1609 || (insn & 0x0df0f000) == 0x0040d000
1610 /* SUB SP (register or immediate). */
1611 || (insn & 0x0ffffff0) == 0x01a0d000
1612 /* MOV SP. */
1613 || (insn & 0x0fff0000) == 0x08bd0000
1614 /* POP (LDMIA). */
1615 || (insn & 0x0fff0000) == 0x049d0000)
1616 /* POP of a single register. */
1617 return 1;
1618 }
1619
1620 return 0;
1621}
1622
0d39a070
DJ
1623/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1624 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1625 fill it in. Return the first address not recognized as a prologue
1626 instruction.
eb5492fa 1627
0d39a070
DJ
1628 We recognize all the instructions typically found in ARM prologues,
1629 plus harmless instructions which can be skipped (either for analysis
1630 purposes, or a more restrictive set that can be skipped when finding
1631 the end of the prologue). */
1632
1633static CORE_ADDR
1634arm_analyze_prologue (struct gdbarch *gdbarch,
1635 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1636 struct arm_prologue_cache *cache)
1637{
1638 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1639 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1640 int regno;
1641 CORE_ADDR offset, current_pc;
1642 pv_t regs[ARM_FPS_REGNUM];
1643 struct pv_area *stack;
1644 struct cleanup *back_to;
0d39a070
DJ
1645 CORE_ADDR unrecognized_pc = 0;
1646
1647 /* Search the prologue looking for instructions that set up the
96baa820 1648 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1649
96baa820
JM
1650 Be careful, however, and if it doesn't look like a prologue,
1651 don't try to scan it. If, for instance, a frameless function
1652 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1653 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1654 and other operations that rely on a knowledge of the stack
0d39a070 1655 traceback. */
d4473757 1656
4be43953
DJ
1657 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1658 regs[regno] = pv_register (regno, 0);
55f960e1 1659 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953
DJ
1660 back_to = make_cleanup_free_pv_area (stack);
1661
94c30b78
MS
1662 for (current_pc = prologue_start;
1663 current_pc < prologue_end;
f43845b3 1664 current_pc += 4)
96baa820 1665 {
e17a4113
UW
1666 unsigned int insn
1667 = read_memory_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1668
94c30b78 1669 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1670 {
4be43953 1671 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1672 continue;
1673 }
0d39a070
DJ
1674 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1675 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1676 {
1677 unsigned imm = insn & 0xff; /* immediate value */
1678 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1679 int rd = bits (insn, 12, 15);
28cd8767 1680 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1681 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1682 continue;
1683 }
0d39a070
DJ
1684 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1685 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1686 {
1687 unsigned imm = insn & 0xff; /* immediate value */
1688 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1689 int rd = bits (insn, 12, 15);
28cd8767 1690 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1691 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1692 continue;
1693 }
0963b4bd
MS
1694 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1695 [sp, #-4]! */
f43845b3 1696 {
4be43953
DJ
1697 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1698 break;
1699 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
0d39a070
DJ
1700 pv_area_store (stack, regs[ARM_SP_REGNUM], 4,
1701 regs[bits (insn, 12, 15)]);
f43845b3
MS
1702 continue;
1703 }
1704 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1705 /* stmfd sp!, {..., fp, ip, lr, pc}
1706 or
1707 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1708 {
d4473757 1709 int mask = insn & 0xffff;
ed9a39eb 1710
4be43953
DJ
1711 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1712 break;
1713
94c30b78 1714 /* Calculate offsets of saved registers. */
34e8f22d 1715 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1716 if (mask & (1 << regno))
1717 {
0963b4bd
MS
1718 regs[ARM_SP_REGNUM]
1719 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
4be43953 1720 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1721 }
1722 }
0d39a070
DJ
1723 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1724 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1725 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1726 {
1727 /* No need to add this to saved_regs -- it's just an arg reg. */
1728 continue;
1729 }
0d39a070
DJ
1730 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1731 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1732 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1733 {
1734 /* No need to add this to saved_regs -- it's just an arg reg. */
1735 continue;
1736 }
0963b4bd
MS
1737 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1738 { registers } */
0d39a070
DJ
1739 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1740 {
1741 /* No need to add this to saved_regs -- it's just arg regs. */
1742 continue;
1743 }
d4473757
KB
1744 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1745 {
94c30b78
MS
1746 unsigned imm = insn & 0xff; /* immediate value */
1747 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1748 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1749 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1750 }
1751 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1752 {
94c30b78
MS
1753 unsigned imm = insn & 0xff; /* immediate value */
1754 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1755 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1756 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1757 }
0963b4bd
MS
1758 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1759 [sp, -#c]! */
2af46ca0 1760 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1761 {
4be43953
DJ
1762 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1763 break;
1764
1765 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1766 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
4be43953 1767 pv_area_store (stack, regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1768 }
0963b4bd
MS
1769 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1770 [sp!] */
2af46ca0 1771 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1772 {
1773 int n_saved_fp_regs;
1774 unsigned int fp_start_reg, fp_bound_reg;
1775
4be43953
DJ
1776 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1777 break;
1778
94c30b78 1779 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1780 {
d4473757
KB
1781 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1782 n_saved_fp_regs = 3;
1783 else
1784 n_saved_fp_regs = 1;
96baa820 1785 }
d4473757 1786 else
96baa820 1787 {
d4473757
KB
1788 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1789 n_saved_fp_regs = 2;
1790 else
1791 n_saved_fp_regs = 4;
96baa820 1792 }
d4473757 1793
34e8f22d 1794 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1795 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1796 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1797 {
4be43953
DJ
1798 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1799 pv_area_store (stack, regs[ARM_SP_REGNUM], 12,
1800 regs[fp_start_reg++]);
96baa820 1801 }
c906108c 1802 }
0d39a070
DJ
1803 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1804 {
1805 /* Allow some special function calls when skipping the
1806 prologue; GCC generates these before storing arguments to
1807 the stack. */
1808 CORE_ADDR dest = BranchDest (current_pc, insn);
1809
e0634ccf 1810 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1811 continue;
1812 else
1813 break;
1814 }
d4473757 1815 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1816 break; /* Condition not true, exit early. */
0d39a070
DJ
1817 else if (arm_instruction_changes_pc (insn))
1818 /* Don't scan past anything that might change control flow. */
1819 break;
f303bc3e
YQ
1820 else if (arm_instruction_restores_sp (insn))
1821 {
1822 /* Don't scan past the epilogue. */
1823 break;
1824 }
d19f7eee
UW
1825 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1826 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1827 /* Ignore block loads from the stack, potentially copying
1828 parameters from memory. */
1829 continue;
1830 else if ((insn & 0xfc500000) == 0xe4100000
1831 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1832 /* Similarly ignore single loads from the stack. */
1833 continue;
0d39a070
DJ
1834 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1835 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1836 register instead of the stack. */
d4473757 1837 continue;
0d39a070
DJ
1838 else
1839 {
21daaaaf
YQ
1840 /* The optimizer might shove anything into the prologue, if
1841 we build up cache (cache != NULL) from scanning prologue,
1842 we just skip what we don't recognize and scan further to
1843 make cache as complete as possible. However, if we skip
1844 prologue, we'll stop immediately on unrecognized
1845 instruction. */
0d39a070 1846 unrecognized_pc = current_pc;
21daaaaf
YQ
1847 if (cache != NULL)
1848 continue;
1849 else
1850 break;
0d39a070 1851 }
c906108c
SS
1852 }
1853
0d39a070
DJ
1854 if (unrecognized_pc == 0)
1855 unrecognized_pc = current_pc;
1856
0d39a070
DJ
1857 if (cache)
1858 {
4072f920
YQ
1859 int framereg, framesize;
1860
1861 /* The frame size is just the distance from the frame register
1862 to the original stack pointer. */
1863 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1864 {
1865 /* Frame pointer is fp. */
1866 framereg = ARM_FP_REGNUM;
1867 framesize = -regs[ARM_FP_REGNUM].k;
1868 }
1869 else
1870 {
1871 /* Try the stack pointer... this is a bit desperate. */
1872 framereg = ARM_SP_REGNUM;
1873 framesize = -regs[ARM_SP_REGNUM].k;
1874 }
1875
0d39a070
DJ
1876 cache->framereg = framereg;
1877 cache->framesize = framesize;
1878
1879 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1880 if (pv_area_find_reg (stack, gdbarch, regno, &offset))
1881 cache->saved_regs[regno].addr = offset;
1882 }
1883
1884 if (arm_debug)
1885 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1886 paddress (gdbarch, unrecognized_pc));
4be43953
DJ
1887
1888 do_cleanups (back_to);
0d39a070
DJ
1889 return unrecognized_pc;
1890}
1891
1892static void
1893arm_scan_prologue (struct frame_info *this_frame,
1894 struct arm_prologue_cache *cache)
1895{
1896 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1897 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1898 int regno;
1899 CORE_ADDR prologue_start, prologue_end, current_pc;
1900 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1901 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
1902 pv_t regs[ARM_FPS_REGNUM];
1903 struct pv_area *stack;
1904 struct cleanup *back_to;
1905 CORE_ADDR offset;
1906
1907 /* Assume there is no frame until proven otherwise. */
1908 cache->framereg = ARM_SP_REGNUM;
1909 cache->framesize = 0;
1910
1911 /* Check for Thumb prologue. */
1912 if (arm_frame_is_thumb (this_frame))
1913 {
1914 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1915 return;
1916 }
1917
1918 /* Find the function prologue. If we can't find the function in
1919 the symbol table, peek in the stack frame to find the PC. */
1920 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1921 &prologue_end))
1922 {
1923 /* One way to find the end of the prologue (which works well
1924 for unoptimized code) is to do the following:
1925
1926 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1927
1928 if (sal.line == 0)
1929 prologue_end = prev_pc;
1930 else if (sal.end < prologue_end)
1931 prologue_end = sal.end;
1932
1933 This mechanism is very accurate so long as the optimizer
1934 doesn't move any instructions from the function body into the
1935 prologue. If this happens, sal.end will be the last
1936 instruction in the first hunk of prologue code just before
1937 the first instruction that the scheduler has moved from
1938 the body to the prologue.
1939
1940 In order to make sure that we scan all of the prologue
1941 instructions, we use a slightly less accurate mechanism which
1942 may scan more than necessary. To help compensate for this
1943 lack of accuracy, the prologue scanning loop below contains
1944 several clauses which'll cause the loop to terminate early if
1945 an implausible prologue instruction is encountered.
1946
1947 The expression
1948
1949 prologue_start + 64
1950
1951 is a suitable endpoint since it accounts for the largest
1952 possible prologue plus up to five instructions inserted by
1953 the scheduler. */
1954
1955 if (prologue_end > prologue_start + 64)
1956 {
1957 prologue_end = prologue_start + 64; /* See above. */
1958 }
1959 }
1960 else
1961 {
1962 /* We have no symbol information. Our only option is to assume this
1963 function has a standard stack frame and the normal frame register.
1964 Then, we can find the value of our frame pointer on entrance to
1965 the callee (or at the present moment if this is the innermost frame).
1966 The value stored there should be the address of the stmfd + 8. */
1967 CORE_ADDR frame_loc;
1968 LONGEST return_value;
1969
1970 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1971 if (!safe_read_memory_integer (frame_loc, 4, byte_order, &return_value))
1972 return;
1973 else
1974 {
1975 prologue_start = gdbarch_addr_bits_remove
1976 (gdbarch, return_value) - 8;
1977 prologue_end = prologue_start + 64; /* See above. */
1978 }
1979 }
1980
1981 if (prev_pc < prologue_end)
1982 prologue_end = prev_pc;
1983
1984 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1985}
1986
eb5492fa 1987static struct arm_prologue_cache *
a262aec2 1988arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1989{
eb5492fa
DJ
1990 int reg;
1991 struct arm_prologue_cache *cache;
1992 CORE_ADDR unwound_fp;
c5aa993b 1993
35d5d4ee 1994 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1995 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1996
a262aec2 1997 arm_scan_prologue (this_frame, cache);
848cfffb 1998
a262aec2 1999 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
2000 if (unwound_fp == 0)
2001 return cache;
c906108c 2002
4be43953 2003 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 2004
eb5492fa
DJ
2005 /* Calculate actual addresses of saved registers using offsets
2006 determined by arm_scan_prologue. */
a262aec2 2007 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 2008 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
2009 cache->saved_regs[reg].addr += cache->prev_sp;
2010
2011 return cache;
c906108c
SS
2012}
2013
c1ee9414
LM
2014/* Implementation of the stop_reason hook for arm_prologue frames. */
2015
2016static enum unwind_stop_reason
2017arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
2018 void **this_cache)
2019{
2020 struct arm_prologue_cache *cache;
2021 CORE_ADDR pc;
2022
2023 if (*this_cache == NULL)
2024 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2025 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
2026
2027 /* This is meant to halt the backtrace at "_start". */
2028 pc = get_frame_pc (this_frame);
2029 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
2030 return UNWIND_OUTERMOST;
2031
2032 /* If we've hit a wall, stop. */
2033 if (cache->prev_sp == 0)
2034 return UNWIND_OUTERMOST;
2035
2036 return UNWIND_NO_REASON;
2037}
2038
eb5492fa
DJ
2039/* Our frame ID for a normal frame is the current function's starting PC
2040 and the caller's SP when we were called. */
c906108c 2041
148754e5 2042static void
a262aec2 2043arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
2044 void **this_cache,
2045 struct frame_id *this_id)
c906108c 2046{
eb5492fa
DJ
2047 struct arm_prologue_cache *cache;
2048 struct frame_id id;
2c404490 2049 CORE_ADDR pc, func;
f079148d 2050
eb5492fa 2051 if (*this_cache == NULL)
a262aec2 2052 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2053 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 2054
0e9e9abd
UW
2055 /* Use function start address as part of the frame ID. If we cannot
2056 identify the start address (due to missing symbol information),
2057 fall back to just using the current PC. */
c1ee9414 2058 pc = get_frame_pc (this_frame);
2c404490 2059 func = get_frame_func (this_frame);
0e9e9abd
UW
2060 if (!func)
2061 func = pc;
2062
eb5492fa 2063 id = frame_id_build (cache->prev_sp, func);
eb5492fa 2064 *this_id = id;
c906108c
SS
2065}
2066
a262aec2
DJ
2067static struct value *
2068arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 2069 void **this_cache,
a262aec2 2070 int prev_regnum)
24de872b 2071{
24568a2c 2072 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
2073 struct arm_prologue_cache *cache;
2074
eb5492fa 2075 if (*this_cache == NULL)
a262aec2 2076 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2077 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 2078
eb5492fa 2079 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
2080 instead. The prologue may save PC, but it will point into this
2081 frame's prologue, not the next frame's resume location. Also
2082 strip the saved T bit. A valid LR may have the low bit set, but
2083 a valid PC never does. */
eb5492fa 2084 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
2085 {
2086 CORE_ADDR lr;
2087
2088 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2089 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 2090 arm_addr_bits_remove (gdbarch, lr));
b39cc962 2091 }
24de872b 2092
eb5492fa 2093 /* SP is generally not saved to the stack, but this frame is
a262aec2 2094 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
2095 The value was already reconstructed into PREV_SP. */
2096 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 2097 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 2098
b39cc962
DJ
2099 /* The CPSR may have been changed by the call instruction and by the
2100 called function. The only bit we can reconstruct is the T bit,
2101 by checking the low bit of LR as of the call. This is a reliable
2102 indicator of Thumb-ness except for some ARM v4T pre-interworking
2103 Thumb code, which could get away with a clear low bit as long as
2104 the called function did not use bx. Guess that all other
2105 bits are unchanged; the condition flags are presumably lost,
2106 but the processor status is likely valid. */
2107 if (prev_regnum == ARM_PS_REGNUM)
2108 {
2109 CORE_ADDR lr, cpsr;
9779414d 2110 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2111
2112 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
2113 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2114 if (IS_THUMB_ADDR (lr))
9779414d 2115 cpsr |= t_bit;
b39cc962 2116 else
9779414d 2117 cpsr &= ~t_bit;
b39cc962
DJ
2118 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
2119 }
2120
a262aec2
DJ
2121 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2122 prev_regnum);
eb5492fa
DJ
2123}
2124
2125struct frame_unwind arm_prologue_unwind = {
2126 NORMAL_FRAME,
c1ee9414 2127 arm_prologue_unwind_stop_reason,
eb5492fa 2128 arm_prologue_this_id,
a262aec2
DJ
2129 arm_prologue_prev_register,
2130 NULL,
2131 default_frame_sniffer
eb5492fa
DJ
2132};
2133
0e9e9abd
UW
2134/* Maintain a list of ARM exception table entries per objfile, similar to the
2135 list of mapping symbols. We only cache entries for standard ARM-defined
2136 personality routines; the cache will contain only the frame unwinding
2137 instructions associated with the entry (not the descriptors). */
2138
2139static const struct objfile_data *arm_exidx_data_key;
2140
2141struct arm_exidx_entry
2142{
2143 bfd_vma addr;
2144 gdb_byte *entry;
2145};
2146typedef struct arm_exidx_entry arm_exidx_entry_s;
2147DEF_VEC_O(arm_exidx_entry_s);
2148
2149struct arm_exidx_data
2150{
2151 VEC(arm_exidx_entry_s) **section_maps;
2152};
2153
2154static void
2155arm_exidx_data_free (struct objfile *objfile, void *arg)
2156{
9a3c8263 2157 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
0e9e9abd
UW
2158 unsigned int i;
2159
2160 for (i = 0; i < objfile->obfd->section_count; i++)
2161 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
2162}
2163
2164static inline int
2165arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
2166 const struct arm_exidx_entry *rhs)
2167{
2168 return lhs->addr < rhs->addr;
2169}
2170
2171static struct obj_section *
2172arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2173{
2174 struct obj_section *osect;
2175
2176 ALL_OBJFILE_OSECTIONS (objfile, osect)
2177 if (bfd_get_section_flags (objfile->obfd,
2178 osect->the_bfd_section) & SEC_ALLOC)
2179 {
2180 bfd_vma start, size;
2181 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
2182 size = bfd_get_section_size (osect->the_bfd_section);
2183
2184 if (start <= vma && vma < start + size)
2185 return osect;
2186 }
2187
2188 return NULL;
2189}
2190
2191/* Parse contents of exception table and exception index sections
2192 of OBJFILE, and fill in the exception table entry cache.
2193
2194 For each entry that refers to a standard ARM-defined personality
2195 routine, extract the frame unwinding instructions (from either
2196 the index or the table section). The unwinding instructions
2197 are normalized by:
2198 - extracting them from the rest of the table data
2199 - converting to host endianness
2200 - appending the implicit 0xb0 ("Finish") code
2201
2202 The extracted and normalized instructions are stored for later
2203 retrieval by the arm_find_exidx_entry routine. */
2204
2205static void
2206arm_exidx_new_objfile (struct objfile *objfile)
2207{
3bb47e8b 2208 struct cleanup *cleanups;
0e9e9abd
UW
2209 struct arm_exidx_data *data;
2210 asection *exidx, *extab;
2211 bfd_vma exidx_vma = 0, extab_vma = 0;
2212 bfd_size_type exidx_size = 0, extab_size = 0;
2213 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2214 LONGEST i;
2215
2216 /* If we've already touched this file, do nothing. */
2217 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2218 return;
3bb47e8b 2219 cleanups = make_cleanup (null_cleanup, NULL);
0e9e9abd
UW
2220
2221 /* Read contents of exception table and index. */
a5eda10c 2222 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
0e9e9abd
UW
2223 if (exidx)
2224 {
2225 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2226 exidx_size = bfd_get_section_size (exidx);
224c3ddb 2227 exidx_data = (gdb_byte *) xmalloc (exidx_size);
0e9e9abd
UW
2228 make_cleanup (xfree, exidx_data);
2229
2230 if (!bfd_get_section_contents (objfile->obfd, exidx,
2231 exidx_data, 0, exidx_size))
2232 {
2233 do_cleanups (cleanups);
2234 return;
2235 }
2236 }
2237
2238 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2239 if (extab)
2240 {
2241 extab_vma = bfd_section_vma (objfile->obfd, extab);
2242 extab_size = bfd_get_section_size (extab);
224c3ddb 2243 extab_data = (gdb_byte *) xmalloc (extab_size);
0e9e9abd
UW
2244 make_cleanup (xfree, extab_data);
2245
2246 if (!bfd_get_section_contents (objfile->obfd, extab,
2247 extab_data, 0, extab_size))
2248 {
2249 do_cleanups (cleanups);
2250 return;
2251 }
2252 }
2253
2254 /* Allocate exception table data structure. */
2255 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2256 set_objfile_data (objfile, arm_exidx_data_key, data);
2257 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2258 objfile->obfd->section_count,
2259 VEC(arm_exidx_entry_s) *);
2260
2261 /* Fill in exception table. */
2262 for (i = 0; i < exidx_size / 8; i++)
2263 {
2264 struct arm_exidx_entry new_exidx_entry;
2265 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2266 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2267 bfd_vma addr = 0, word = 0;
2268 int n_bytes = 0, n_words = 0;
2269 struct obj_section *sec;
2270 gdb_byte *entry = NULL;
2271
2272 /* Extract address of start of function. */
2273 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2274 idx += exidx_vma + i * 8;
2275
2276 /* Find section containing function and compute section offset. */
2277 sec = arm_obj_section_from_vma (objfile, idx);
2278 if (sec == NULL)
2279 continue;
2280 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2281
2282 /* Determine address of exception table entry. */
2283 if (val == 1)
2284 {
2285 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2286 }
2287 else if ((val & 0xff000000) == 0x80000000)
2288 {
2289 /* Exception table entry embedded in .ARM.exidx
2290 -- must be short form. */
2291 word = val;
2292 n_bytes = 3;
2293 }
2294 else if (!(val & 0x80000000))
2295 {
2296 /* Exception table entry in .ARM.extab. */
2297 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2298 addr += exidx_vma + i * 8 + 4;
2299
2300 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2301 {
2302 word = bfd_h_get_32 (objfile->obfd,
2303 extab_data + addr - extab_vma);
2304 addr += 4;
2305
2306 if ((word & 0xff000000) == 0x80000000)
2307 {
2308 /* Short form. */
2309 n_bytes = 3;
2310 }
2311 else if ((word & 0xff000000) == 0x81000000
2312 || (word & 0xff000000) == 0x82000000)
2313 {
2314 /* Long form. */
2315 n_bytes = 2;
2316 n_words = ((word >> 16) & 0xff);
2317 }
2318 else if (!(word & 0x80000000))
2319 {
2320 bfd_vma pers;
2321 struct obj_section *pers_sec;
2322 int gnu_personality = 0;
2323
2324 /* Custom personality routine. */
2325 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2326 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2327
2328 /* Check whether we've got one of the variants of the
2329 GNU personality routines. */
2330 pers_sec = arm_obj_section_from_vma (objfile, pers);
2331 if (pers_sec)
2332 {
2333 static const char *personality[] =
2334 {
2335 "__gcc_personality_v0",
2336 "__gxx_personality_v0",
2337 "__gcj_personality_v0",
2338 "__gnu_objc_personality_v0",
2339 NULL
2340 };
2341
2342 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2343 int k;
2344
2345 for (k = 0; personality[k]; k++)
2346 if (lookup_minimal_symbol_by_pc_name
2347 (pc, personality[k], objfile))
2348 {
2349 gnu_personality = 1;
2350 break;
2351 }
2352 }
2353
2354 /* If so, the next word contains a word count in the high
2355 byte, followed by the same unwind instructions as the
2356 pre-defined forms. */
2357 if (gnu_personality
2358 && addr + 4 <= extab_vma + extab_size)
2359 {
2360 word = bfd_h_get_32 (objfile->obfd,
2361 extab_data + addr - extab_vma);
2362 addr += 4;
2363 n_bytes = 3;
2364 n_words = ((word >> 24) & 0xff);
2365 }
2366 }
2367 }
2368 }
2369
2370 /* Sanity check address. */
2371 if (n_words)
2372 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2373 n_words = n_bytes = 0;
2374
2375 /* The unwind instructions reside in WORD (only the N_BYTES least
2376 significant bytes are valid), followed by N_WORDS words in the
2377 extab section starting at ADDR. */
2378 if (n_bytes || n_words)
2379 {
224c3ddb
SM
2380 gdb_byte *p = entry
2381 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2382 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2383
2384 while (n_bytes--)
2385 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2386
2387 while (n_words--)
2388 {
2389 word = bfd_h_get_32 (objfile->obfd,
2390 extab_data + addr - extab_vma);
2391 addr += 4;
2392
2393 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2394 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2395 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2396 *p++ = (gdb_byte) (word & 0xff);
2397 }
2398
2399 /* Implied "Finish" to terminate the list. */
2400 *p++ = 0xb0;
2401 }
2402
2403 /* Push entry onto vector. They are guaranteed to always
2404 appear in order of increasing addresses. */
2405 new_exidx_entry.addr = idx;
2406 new_exidx_entry.entry = entry;
2407 VEC_safe_push (arm_exidx_entry_s,
2408 data->section_maps[sec->the_bfd_section->index],
2409 &new_exidx_entry);
2410 }
2411
2412 do_cleanups (cleanups);
2413}
2414
2415/* Search for the exception table entry covering MEMADDR. If one is found,
2416 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2417 set *START to the start of the region covered by this entry. */
2418
2419static gdb_byte *
2420arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2421{
2422 struct obj_section *sec;
2423
2424 sec = find_pc_section (memaddr);
2425 if (sec != NULL)
2426 {
2427 struct arm_exidx_data *data;
2428 VEC(arm_exidx_entry_s) *map;
2429 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2430 unsigned int idx;
2431
9a3c8263
SM
2432 data = ((struct arm_exidx_data *)
2433 objfile_data (sec->objfile, arm_exidx_data_key));
0e9e9abd
UW
2434 if (data != NULL)
2435 {
2436 map = data->section_maps[sec->the_bfd_section->index];
2437 if (!VEC_empty (arm_exidx_entry_s, map))
2438 {
2439 struct arm_exidx_entry *map_sym;
2440
2441 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2442 arm_compare_exidx_entries);
2443
2444 /* VEC_lower_bound finds the earliest ordered insertion
2445 point. If the following symbol starts at this exact
2446 address, we use that; otherwise, the preceding
2447 exception table entry covers this address. */
2448 if (idx < VEC_length (arm_exidx_entry_s, map))
2449 {
2450 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2451 if (map_sym->addr == map_key.addr)
2452 {
2453 if (start)
2454 *start = map_sym->addr + obj_section_addr (sec);
2455 return map_sym->entry;
2456 }
2457 }
2458
2459 if (idx > 0)
2460 {
2461 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2462 if (start)
2463 *start = map_sym->addr + obj_section_addr (sec);
2464 return map_sym->entry;
2465 }
2466 }
2467 }
2468 }
2469
2470 return NULL;
2471}
2472
2473/* Given the current frame THIS_FRAME, and its associated frame unwinding
2474 instruction list from the ARM exception table entry ENTRY, allocate and
2475 return a prologue cache structure describing how to unwind this frame.
2476
2477 Return NULL if the unwinding instruction list contains a "spare",
2478 "reserved" or "refuse to unwind" instruction as defined in section
2479 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2480 for the ARM Architecture" document. */
2481
2482static struct arm_prologue_cache *
2483arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2484{
2485 CORE_ADDR vsp = 0;
2486 int vsp_valid = 0;
2487
2488 struct arm_prologue_cache *cache;
2489 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2490 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2491
2492 for (;;)
2493 {
2494 gdb_byte insn;
2495
2496 /* Whenever we reload SP, we actually have to retrieve its
2497 actual value in the current frame. */
2498 if (!vsp_valid)
2499 {
2500 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2501 {
2502 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2503 vsp = get_frame_register_unsigned (this_frame, reg);
2504 }
2505 else
2506 {
2507 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2508 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2509 }
2510
2511 vsp_valid = 1;
2512 }
2513
2514 /* Decode next unwind instruction. */
2515 insn = *entry++;
2516
2517 if ((insn & 0xc0) == 0)
2518 {
2519 int offset = insn & 0x3f;
2520 vsp += (offset << 2) + 4;
2521 }
2522 else if ((insn & 0xc0) == 0x40)
2523 {
2524 int offset = insn & 0x3f;
2525 vsp -= (offset << 2) + 4;
2526 }
2527 else if ((insn & 0xf0) == 0x80)
2528 {
2529 int mask = ((insn & 0xf) << 8) | *entry++;
2530 int i;
2531
2532 /* The special case of an all-zero mask identifies
2533 "Refuse to unwind". We return NULL to fall back
2534 to the prologue analyzer. */
2535 if (mask == 0)
2536 return NULL;
2537
2538 /* Pop registers r4..r15 under mask. */
2539 for (i = 0; i < 12; i++)
2540 if (mask & (1 << i))
2541 {
2542 cache->saved_regs[4 + i].addr = vsp;
2543 vsp += 4;
2544 }
2545
2546 /* Special-case popping SP -- we need to reload vsp. */
2547 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2548 vsp_valid = 0;
2549 }
2550 else if ((insn & 0xf0) == 0x90)
2551 {
2552 int reg = insn & 0xf;
2553
2554 /* Reserved cases. */
2555 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2556 return NULL;
2557
2558 /* Set SP from another register and mark VSP for reload. */
2559 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2560 vsp_valid = 0;
2561 }
2562 else if ((insn & 0xf0) == 0xa0)
2563 {
2564 int count = insn & 0x7;
2565 int pop_lr = (insn & 0x8) != 0;
2566 int i;
2567
2568 /* Pop r4..r[4+count]. */
2569 for (i = 0; i <= count; i++)
2570 {
2571 cache->saved_regs[4 + i].addr = vsp;
2572 vsp += 4;
2573 }
2574
2575 /* If indicated by flag, pop LR as well. */
2576 if (pop_lr)
2577 {
2578 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2579 vsp += 4;
2580 }
2581 }
2582 else if (insn == 0xb0)
2583 {
2584 /* We could only have updated PC by popping into it; if so, it
2585 will show up as address. Otherwise, copy LR into PC. */
2586 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2587 cache->saved_regs[ARM_PC_REGNUM]
2588 = cache->saved_regs[ARM_LR_REGNUM];
2589
2590 /* We're done. */
2591 break;
2592 }
2593 else if (insn == 0xb1)
2594 {
2595 int mask = *entry++;
2596 int i;
2597
2598 /* All-zero mask and mask >= 16 is "spare". */
2599 if (mask == 0 || mask >= 16)
2600 return NULL;
2601
2602 /* Pop r0..r3 under mask. */
2603 for (i = 0; i < 4; i++)
2604 if (mask & (1 << i))
2605 {
2606 cache->saved_regs[i].addr = vsp;
2607 vsp += 4;
2608 }
2609 }
2610 else if (insn == 0xb2)
2611 {
2612 ULONGEST offset = 0;
2613 unsigned shift = 0;
2614
2615 do
2616 {
2617 offset |= (*entry & 0x7f) << shift;
2618 shift += 7;
2619 }
2620 while (*entry++ & 0x80);
2621
2622 vsp += 0x204 + (offset << 2);
2623 }
2624 else if (insn == 0xb3)
2625 {
2626 int start = *entry >> 4;
2627 int count = (*entry++) & 0xf;
2628 int i;
2629
2630 /* Only registers D0..D15 are valid here. */
2631 if (start + count >= 16)
2632 return NULL;
2633
2634 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2635 for (i = 0; i <= count; i++)
2636 {
2637 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2638 vsp += 8;
2639 }
2640
2641 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2642 vsp += 4;
2643 }
2644 else if ((insn & 0xf8) == 0xb8)
2645 {
2646 int count = insn & 0x7;
2647 int i;
2648
2649 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2650 for (i = 0; i <= count; i++)
2651 {
2652 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2653 vsp += 8;
2654 }
2655
2656 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2657 vsp += 4;
2658 }
2659 else if (insn == 0xc6)
2660 {
2661 int start = *entry >> 4;
2662 int count = (*entry++) & 0xf;
2663 int i;
2664
2665 /* Only registers WR0..WR15 are valid. */
2666 if (start + count >= 16)
2667 return NULL;
2668
2669 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2670 for (i = 0; i <= count; i++)
2671 {
2672 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2673 vsp += 8;
2674 }
2675 }
2676 else if (insn == 0xc7)
2677 {
2678 int mask = *entry++;
2679 int i;
2680
2681 /* All-zero mask and mask >= 16 is "spare". */
2682 if (mask == 0 || mask >= 16)
2683 return NULL;
2684
2685 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2686 for (i = 0; i < 4; i++)
2687 if (mask & (1 << i))
2688 {
2689 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2690 vsp += 4;
2691 }
2692 }
2693 else if ((insn & 0xf8) == 0xc0)
2694 {
2695 int count = insn & 0x7;
2696 int i;
2697
2698 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2699 for (i = 0; i <= count; i++)
2700 {
2701 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2702 vsp += 8;
2703 }
2704 }
2705 else if (insn == 0xc8)
2706 {
2707 int start = *entry >> 4;
2708 int count = (*entry++) & 0xf;
2709 int i;
2710
2711 /* Only registers D0..D31 are valid. */
2712 if (start + count >= 16)
2713 return NULL;
2714
2715 /* Pop VFP double-precision registers
2716 D[16+start]..D[16+start+count]. */
2717 for (i = 0; i <= count; i++)
2718 {
2719 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2720 vsp += 8;
2721 }
2722 }
2723 else if (insn == 0xc9)
2724 {
2725 int start = *entry >> 4;
2726 int count = (*entry++) & 0xf;
2727 int i;
2728
2729 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2730 for (i = 0; i <= count; i++)
2731 {
2732 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2733 vsp += 8;
2734 }
2735 }
2736 else if ((insn & 0xf8) == 0xd0)
2737 {
2738 int count = insn & 0x7;
2739 int i;
2740
2741 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2742 for (i = 0; i <= count; i++)
2743 {
2744 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2745 vsp += 8;
2746 }
2747 }
2748 else
2749 {
2750 /* Everything else is "spare". */
2751 return NULL;
2752 }
2753 }
2754
2755 /* If we restore SP from a register, assume this was the frame register.
2756 Otherwise just fall back to SP as frame register. */
2757 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2758 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2759 else
2760 cache->framereg = ARM_SP_REGNUM;
2761
2762 /* Determine offset to previous frame. */
2763 cache->framesize
2764 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2765
2766 /* We already got the previous SP. */
2767 cache->prev_sp = vsp;
2768
2769 return cache;
2770}
2771
2772/* Unwinding via ARM exception table entries. Note that the sniffer
2773 already computes a filled-in prologue cache, which is then used
2774 with the same arm_prologue_this_id and arm_prologue_prev_register
2775 routines also used for prologue-parsing based unwinding. */
2776
2777static int
2778arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2779 struct frame_info *this_frame,
2780 void **this_prologue_cache)
2781{
2782 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2783 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2784 CORE_ADDR addr_in_block, exidx_region, func_start;
2785 struct arm_prologue_cache *cache;
2786 gdb_byte *entry;
2787
2788 /* See if we have an ARM exception table entry covering this address. */
2789 addr_in_block = get_frame_address_in_block (this_frame);
2790 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2791 if (!entry)
2792 return 0;
2793
2794 /* The ARM exception table does not describe unwind information
2795 for arbitrary PC values, but is guaranteed to be correct only
2796 at call sites. We have to decide here whether we want to use
2797 ARM exception table information for this frame, or fall back
2798 to using prologue parsing. (Note that if we have DWARF CFI,
2799 this sniffer isn't even called -- CFI is always preferred.)
2800
2801 Before we make this decision, however, we check whether we
2802 actually have *symbol* information for the current frame.
2803 If not, prologue parsing would not work anyway, so we might
2804 as well use the exception table and hope for the best. */
2805 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2806 {
2807 int exc_valid = 0;
2808
2809 /* If the next frame is "normal", we are at a call site in this
2810 frame, so exception information is guaranteed to be valid. */
2811 if (get_next_frame (this_frame)
2812 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2813 exc_valid = 1;
2814
2815 /* We also assume exception information is valid if we're currently
2816 blocked in a system call. The system library is supposed to
2817 ensure this, so that e.g. pthread cancellation works. */
2818 if (arm_frame_is_thumb (this_frame))
2819 {
2820 LONGEST insn;
2821
2822 if (safe_read_memory_integer (get_frame_pc (this_frame) - 2, 2,
2823 byte_order_for_code, &insn)
2824 && (insn & 0xff00) == 0xdf00 /* svc */)
2825 exc_valid = 1;
2826 }
2827 else
2828 {
2829 LONGEST insn;
2830
2831 if (safe_read_memory_integer (get_frame_pc (this_frame) - 4, 4,
2832 byte_order_for_code, &insn)
2833 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2834 exc_valid = 1;
2835 }
2836
2837 /* Bail out if we don't know that exception information is valid. */
2838 if (!exc_valid)
2839 return 0;
2840
2841 /* The ARM exception index does not mark the *end* of the region
2842 covered by the entry, and some functions will not have any entry.
2843 To correctly recognize the end of the covered region, the linker
2844 should have inserted dummy records with a CANTUNWIND marker.
2845
2846 Unfortunately, current versions of GNU ld do not reliably do
2847 this, and thus we may have found an incorrect entry above.
2848 As a (temporary) sanity check, we only use the entry if it
2849 lies *within* the bounds of the function. Note that this check
2850 might reject perfectly valid entries that just happen to cover
2851 multiple functions; therefore this check ought to be removed
2852 once the linker is fixed. */
2853 if (func_start > exidx_region)
2854 return 0;
2855 }
2856
2857 /* Decode the list of unwinding instructions into a prologue cache.
2858 Note that this may fail due to e.g. a "refuse to unwind" code. */
2859 cache = arm_exidx_fill_cache (this_frame, entry);
2860 if (!cache)
2861 return 0;
2862
2863 *this_prologue_cache = cache;
2864 return 1;
2865}
2866
2867struct frame_unwind arm_exidx_unwind = {
2868 NORMAL_FRAME,
8fbca658 2869 default_frame_unwind_stop_reason,
0e9e9abd
UW
2870 arm_prologue_this_id,
2871 arm_prologue_prev_register,
2872 NULL,
2873 arm_exidx_unwind_sniffer
2874};
2875
80d8d390
YQ
2876/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2877 trampoline, return the target PC. Otherwise return 0.
2878
2879 void call0a (char c, short s, int i, long l) {}
2880
2881 int main (void)
2882 {
2883 (*pointer_to_call0a) (c, s, i, l);
2884 }
2885
2886 Instead of calling a stub library function _call_via_xx (xx is
2887 the register name), GCC may inline the trampoline in the object
2888 file as below (register r2 has the address of call0a).
2889
2890 .global main
2891 .type main, %function
2892 ...
2893 bl .L1
2894 ...
2895 .size main, .-main
2896
2897 .L1:
2898 bx r2
2899
2900 The trampoline 'bx r2' doesn't belong to main. */
2901
2902static CORE_ADDR
2903arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2904{
2905 /* The heuristics of recognizing such trampoline is that FRAME is
2906 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2907 if (arm_frame_is_thumb (frame))
2908 {
2909 gdb_byte buf[2];
2910
2911 if (target_read_memory (pc, buf, 2) == 0)
2912 {
2913 struct gdbarch *gdbarch = get_frame_arch (frame);
2914 enum bfd_endian byte_order_for_code
2915 = gdbarch_byte_order_for_code (gdbarch);
2916 uint16_t insn
2917 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2918
2919 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2920 {
2921 CORE_ADDR dest
2922 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2923
2924 /* Clear the LSB so that gdb core sets step-resume
2925 breakpoint at the right address. */
2926 return UNMAKE_THUMB_ADDR (dest);
2927 }
2928 }
2929 }
2930
2931 return 0;
2932}
2933
909cf6ea 2934static struct arm_prologue_cache *
a262aec2 2935arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2936{
909cf6ea 2937 struct arm_prologue_cache *cache;
909cf6ea 2938
35d5d4ee 2939 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2940 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2941
a262aec2 2942 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2943
2944 return cache;
2945}
2946
2947/* Our frame ID for a stub frame is the current SP and LR. */
2948
2949static void
a262aec2 2950arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2951 void **this_cache,
2952 struct frame_id *this_id)
2953{
2954 struct arm_prologue_cache *cache;
2955
2956 if (*this_cache == NULL)
a262aec2 2957 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2958 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2959
a262aec2 2960 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2961}
2962
a262aec2
DJ
2963static int
2964arm_stub_unwind_sniffer (const struct frame_unwind *self,
2965 struct frame_info *this_frame,
2966 void **this_prologue_cache)
909cf6ea 2967{
93d42b30 2968 CORE_ADDR addr_in_block;
948f8e3d 2969 gdb_byte dummy[4];
18d18ac8
YQ
2970 CORE_ADDR pc, start_addr;
2971 const char *name;
909cf6ea 2972
a262aec2 2973 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2974 pc = get_frame_pc (this_frame);
3e5d3a5a 2975 if (in_plt_section (addr_in_block)
fc36e839
DE
2976 /* We also use the stub winder if the target memory is unreadable
2977 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2978 || target_read_memory (pc, dummy, 4) != 0)
2979 return 1;
2980
2981 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2982 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2983 return 1;
909cf6ea 2984
a262aec2 2985 return 0;
909cf6ea
DJ
2986}
2987
a262aec2
DJ
2988struct frame_unwind arm_stub_unwind = {
2989 NORMAL_FRAME,
8fbca658 2990 default_frame_unwind_stop_reason,
a262aec2
DJ
2991 arm_stub_this_id,
2992 arm_prologue_prev_register,
2993 NULL,
2994 arm_stub_unwind_sniffer
2995};
2996
2ae28aa9
YQ
2997/* Put here the code to store, into CACHE->saved_regs, the addresses
2998 of the saved registers of frame described by THIS_FRAME. CACHE is
2999 returned. */
3000
3001static struct arm_prologue_cache *
3002arm_m_exception_cache (struct frame_info *this_frame)
3003{
3004 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3005 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3006 struct arm_prologue_cache *cache;
3007 CORE_ADDR unwound_sp;
3008 LONGEST xpsr;
3009
3010 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3011 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
3012
3013 unwound_sp = get_frame_register_unsigned (this_frame,
3014 ARM_SP_REGNUM);
3015
3016 /* The hardware saves eight 32-bit words, comprising xPSR,
3017 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
3018 "B1.5.6 Exception entry behavior" in
3019 "ARMv7-M Architecture Reference Manual". */
3020 cache->saved_regs[0].addr = unwound_sp;
3021 cache->saved_regs[1].addr = unwound_sp + 4;
3022 cache->saved_regs[2].addr = unwound_sp + 8;
3023 cache->saved_regs[3].addr = unwound_sp + 12;
3024 cache->saved_regs[12].addr = unwound_sp + 16;
3025 cache->saved_regs[14].addr = unwound_sp + 20;
3026 cache->saved_regs[15].addr = unwound_sp + 24;
3027 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
3028
3029 /* If bit 9 of the saved xPSR is set, then there is a four-byte
3030 aligner between the top of the 32-byte stack frame and the
3031 previous context's stack pointer. */
3032 cache->prev_sp = unwound_sp + 32;
3033 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
3034 && (xpsr & (1 << 9)) != 0)
3035 cache->prev_sp += 4;
3036
3037 return cache;
3038}
3039
3040/* Implementation of function hook 'this_id' in
3041 'struct frame_uwnind'. */
3042
3043static void
3044arm_m_exception_this_id (struct frame_info *this_frame,
3045 void **this_cache,
3046 struct frame_id *this_id)
3047{
3048 struct arm_prologue_cache *cache;
3049
3050 if (*this_cache == NULL)
3051 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 3052 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
3053
3054 /* Our frame ID for a stub frame is the current SP and LR. */
3055 *this_id = frame_id_build (cache->prev_sp,
3056 get_frame_pc (this_frame));
3057}
3058
3059/* Implementation of function hook 'prev_register' in
3060 'struct frame_uwnind'. */
3061
3062static struct value *
3063arm_m_exception_prev_register (struct frame_info *this_frame,
3064 void **this_cache,
3065 int prev_regnum)
3066{
3067 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3068 struct arm_prologue_cache *cache;
3069
3070 if (*this_cache == NULL)
3071 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 3072 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
3073
3074 /* The value was already reconstructed into PREV_SP. */
3075 if (prev_regnum == ARM_SP_REGNUM)
3076 return frame_unwind_got_constant (this_frame, prev_regnum,
3077 cache->prev_sp);
3078
3079 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3080 prev_regnum);
3081}
3082
3083/* Implementation of function hook 'sniffer' in
3084 'struct frame_uwnind'. */
3085
3086static int
3087arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3088 struct frame_info *this_frame,
3089 void **this_prologue_cache)
3090{
3091 CORE_ADDR this_pc = get_frame_pc (this_frame);
3092
3093 /* No need to check is_m; this sniffer is only registered for
3094 M-profile architectures. */
3095
3096 /* Exception frames return to one of these magic PCs. Other values
3097 are not defined as of v7-M. See details in "B1.5.8 Exception
3098 return behavior" in "ARMv7-M Architecture Reference Manual". */
3099 if (this_pc == 0xfffffff1 || this_pc == 0xfffffff9
3100 || this_pc == 0xfffffffd)
3101 return 1;
3102
3103 return 0;
3104}
3105
3106/* Frame unwinder for M-profile exceptions. */
3107
3108struct frame_unwind arm_m_exception_unwind =
3109{
3110 SIGTRAMP_FRAME,
3111 default_frame_unwind_stop_reason,
3112 arm_m_exception_this_id,
3113 arm_m_exception_prev_register,
3114 NULL,
3115 arm_m_exception_unwind_sniffer
3116};
3117
24de872b 3118static CORE_ADDR
a262aec2 3119arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
3120{
3121 struct arm_prologue_cache *cache;
3122
eb5492fa 3123 if (*this_cache == NULL)
a262aec2 3124 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 3125 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 3126
4be43953 3127 return cache->prev_sp - cache->framesize;
24de872b
DJ
3128}
3129
eb5492fa
DJ
3130struct frame_base arm_normal_base = {
3131 &arm_prologue_unwind,
3132 arm_normal_frame_base,
3133 arm_normal_frame_base,
3134 arm_normal_frame_base
3135};
3136
a262aec2 3137/* Assuming THIS_FRAME is a dummy, return the frame ID of that
eb5492fa
DJ
3138 dummy frame. The frame ID's base needs to match the TOS value
3139 saved by save_dummy_frame_tos() and returned from
3140 arm_push_dummy_call, and the PC needs to match the dummy frame's
3141 breakpoint. */
c906108c 3142
eb5492fa 3143static struct frame_id
a262aec2 3144arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
c906108c 3145{
0963b4bd
MS
3146 return frame_id_build (get_frame_register_unsigned (this_frame,
3147 ARM_SP_REGNUM),
a262aec2 3148 get_frame_pc (this_frame));
eb5492fa 3149}
c3b4394c 3150
eb5492fa
DJ
3151/* Given THIS_FRAME, find the previous frame's resume PC (which will
3152 be used to construct the previous frame's ID, after looking up the
3153 containing function). */
c3b4394c 3154
eb5492fa
DJ
3155static CORE_ADDR
3156arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
3157{
3158 CORE_ADDR pc;
3159 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
24568a2c 3160 return arm_addr_bits_remove (gdbarch, pc);
eb5492fa
DJ
3161}
3162
3163static CORE_ADDR
3164arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
3165{
3166 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
c906108c
SS
3167}
3168
b39cc962
DJ
3169static struct value *
3170arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
3171 int regnum)
3172{
24568a2c 3173 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 3174 CORE_ADDR lr, cpsr;
9779414d 3175 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
3176
3177 switch (regnum)
3178 {
3179 case ARM_PC_REGNUM:
3180 /* The PC is normally copied from the return column, which
3181 describes saves of LR. However, that version may have an
3182 extra bit set to indicate Thumb state. The bit is not
3183 part of the PC. */
3184 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3185 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 3186 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
3187
3188 case ARM_PS_REGNUM:
3189 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 3190 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
3191 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3192 if (IS_THUMB_ADDR (lr))
9779414d 3193 cpsr |= t_bit;
b39cc962 3194 else
9779414d 3195 cpsr &= ~t_bit;
ca38c58e 3196 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
3197
3198 default:
3199 internal_error (__FILE__, __LINE__,
3200 _("Unexpected register %d"), regnum);
3201 }
3202}
3203
3204static void
3205arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3206 struct dwarf2_frame_state_reg *reg,
3207 struct frame_info *this_frame)
3208{
3209 switch (regnum)
3210 {
3211 case ARM_PC_REGNUM:
3212 case ARM_PS_REGNUM:
3213 reg->how = DWARF2_FRAME_REG_FN;
3214 reg->loc.fn = arm_dwarf2_prev_register;
3215 break;
3216 case ARM_SP_REGNUM:
3217 reg->how = DWARF2_FRAME_REG_CFA;
3218 break;
3219 }
3220}
3221
c9cf6e20 3222/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3223
3224static int
c9cf6e20 3225thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3226{
3227 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3228 unsigned int insn, insn2;
3229 int found_return = 0, found_stack_adjust = 0;
3230 CORE_ADDR func_start, func_end;
3231 CORE_ADDR scan_pc;
3232 gdb_byte buf[4];
3233
3234 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3235 return 0;
3236
3237 /* The epilogue is a sequence of instructions along the following lines:
3238
3239 - add stack frame size to SP or FP
3240 - [if frame pointer used] restore SP from FP
3241 - restore registers from SP [may include PC]
3242 - a return-type instruction [if PC wasn't already restored]
3243
3244 In a first pass, we scan forward from the current PC and verify the
3245 instructions we find as compatible with this sequence, ending in a
3246 return instruction.
3247
3248 However, this is not sufficient to distinguish indirect function calls
3249 within a function from indirect tail calls in the epilogue in some cases.
3250 Therefore, if we didn't already find any SP-changing instruction during
3251 forward scan, we add a backward scanning heuristic to ensure we actually
3252 are in the epilogue. */
3253
3254 scan_pc = pc;
3255 while (scan_pc < func_end && !found_return)
3256 {
3257 if (target_read_memory (scan_pc, buf, 2))
3258 break;
3259
3260 scan_pc += 2;
3261 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3262
3263 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3264 found_return = 1;
3265 else if (insn == 0x46f7) /* mov pc, lr */
3266 found_return = 1;
540314bd 3267 else if (thumb_instruction_restores_sp (insn))
4024ca99 3268 {
b7576e5c 3269 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3270 found_return = 1;
3271 }
db24da6d 3272 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3273 {
3274 if (target_read_memory (scan_pc, buf, 2))
3275 break;
3276
3277 scan_pc += 2;
3278 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3279
3280 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3281 {
4024ca99
UW
3282 if (insn2 & 0x8000) /* <registers> include PC. */
3283 found_return = 1;
3284 }
3285 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3286 && (insn2 & 0x0fff) == 0x0b04)
3287 {
4024ca99
UW
3288 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3289 found_return = 1;
3290 }
3291 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3292 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3293 ;
4024ca99
UW
3294 else
3295 break;
3296 }
3297 else
3298 break;
3299 }
3300
3301 if (!found_return)
3302 return 0;
3303
3304 /* Since any instruction in the epilogue sequence, with the possible
3305 exception of return itself, updates the stack pointer, we need to
3306 scan backwards for at most one instruction. Try either a 16-bit or
3307 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3308 too much about false positives. */
4024ca99 3309
6b65d1b6
YQ
3310 if (pc - 4 < func_start)
3311 return 0;
3312 if (target_read_memory (pc - 4, buf, 4))
3313 return 0;
4024ca99 3314
6b65d1b6
YQ
3315 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3316 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3317
3318 if (thumb_instruction_restores_sp (insn2))
3319 found_stack_adjust = 1;
3320 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3321 found_stack_adjust = 1;
3322 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3323 && (insn2 & 0x0fff) == 0x0b04)
3324 found_stack_adjust = 1;
3325 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3326 && (insn2 & 0x0e00) == 0x0a00)
3327 found_stack_adjust = 1;
4024ca99
UW
3328
3329 return found_stack_adjust;
3330}
3331
c9cf6e20 3332/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3333
3334static int
c9cf6e20 3335arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3336{
3337 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3338 unsigned int insn;
f303bc3e 3339 int found_return;
4024ca99
UW
3340 CORE_ADDR func_start, func_end;
3341
3342 if (arm_pc_is_thumb (gdbarch, pc))
c9cf6e20 3343 return thumb_stack_frame_destroyed_p (gdbarch, pc);
4024ca99
UW
3344
3345 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3346 return 0;
3347
3348 /* We are in the epilogue if the previous instruction was a stack
3349 adjustment and the next instruction is a possible return (bx, mov
3350 pc, or pop). We could have to scan backwards to find the stack
3351 adjustment, or forwards to find the return, but this is a decent
3352 approximation. First scan forwards. */
3353
3354 found_return = 0;
3355 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3356 if (bits (insn, 28, 31) != INST_NV)
3357 {
3358 if ((insn & 0x0ffffff0) == 0x012fff10)
3359 /* BX. */
3360 found_return = 1;
3361 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3362 /* MOV PC. */
3363 found_return = 1;
3364 else if ((insn & 0x0fff0000) == 0x08bd0000
3365 && (insn & 0x0000c000) != 0)
3366 /* POP (LDMIA), including PC or LR. */
3367 found_return = 1;
3368 }
3369
3370 if (!found_return)
3371 return 0;
3372
3373 /* Scan backwards. This is just a heuristic, so do not worry about
3374 false positives from mode changes. */
3375
3376 if (pc < func_start + 4)
3377 return 0;
3378
3379 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3380 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3381 return 1;
3382
3383 return 0;
3384}
3385
3386
2dd604e7
RE
3387/* When arguments must be pushed onto the stack, they go on in reverse
3388 order. The code below implements a FILO (stack) to do this. */
3389
3390struct stack_item
3391{
3392 int len;
3393 struct stack_item *prev;
7c543f7b 3394 gdb_byte *data;
2dd604e7
RE
3395};
3396
3397static struct stack_item *
df3b6708 3398push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3399{
3400 struct stack_item *si;
8d749320 3401 si = XNEW (struct stack_item);
7c543f7b 3402 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3403 si->len = len;
3404 si->prev = prev;
3405 memcpy (si->data, contents, len);
3406 return si;
3407}
3408
3409static struct stack_item *
3410pop_stack_item (struct stack_item *si)
3411{
3412 struct stack_item *dead = si;
3413 si = si->prev;
3414 xfree (dead->data);
3415 xfree (dead);
3416 return si;
3417}
3418
2af48f68
PB
3419
3420/* Return the alignment (in bytes) of the given type. */
3421
3422static int
3423arm_type_align (struct type *t)
3424{
3425 int n;
3426 int align;
3427 int falign;
3428
3429 t = check_typedef (t);
3430 switch (TYPE_CODE (t))
3431 {
3432 default:
3433 /* Should never happen. */
3434 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3435 return 4;
3436
3437 case TYPE_CODE_PTR:
3438 case TYPE_CODE_ENUM:
3439 case TYPE_CODE_INT:
3440 case TYPE_CODE_FLT:
3441 case TYPE_CODE_SET:
3442 case TYPE_CODE_RANGE:
2af48f68
PB
3443 case TYPE_CODE_REF:
3444 case TYPE_CODE_CHAR:
3445 case TYPE_CODE_BOOL:
3446 return TYPE_LENGTH (t);
3447
3448 case TYPE_CODE_ARRAY:
c4312b19
YQ
3449 if (TYPE_VECTOR (t))
3450 {
3451 /* Use the natural alignment for vector types (the same for
3452 scalar type), but the maximum alignment is 64-bit. */
3453 if (TYPE_LENGTH (t) > 8)
3454 return 8;
3455 else
3456 return TYPE_LENGTH (t);
3457 }
3458 else
3459 return arm_type_align (TYPE_TARGET_TYPE (t));
2af48f68 3460 case TYPE_CODE_COMPLEX:
2af48f68
PB
3461 return arm_type_align (TYPE_TARGET_TYPE (t));
3462
3463 case TYPE_CODE_STRUCT:
3464 case TYPE_CODE_UNION:
3465 align = 1;
3466 for (n = 0; n < TYPE_NFIELDS (t); n++)
3467 {
3468 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3469 if (falign > align)
3470 align = falign;
3471 }
3472 return align;
3473 }
3474}
3475
90445bd3
DJ
3476/* Possible base types for a candidate for passing and returning in
3477 VFP registers. */
3478
3479enum arm_vfp_cprc_base_type
3480{
3481 VFP_CPRC_UNKNOWN,
3482 VFP_CPRC_SINGLE,
3483 VFP_CPRC_DOUBLE,
3484 VFP_CPRC_VEC64,
3485 VFP_CPRC_VEC128
3486};
3487
3488/* The length of one element of base type B. */
3489
3490static unsigned
3491arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3492{
3493 switch (b)
3494 {
3495 case VFP_CPRC_SINGLE:
3496 return 4;
3497 case VFP_CPRC_DOUBLE:
3498 return 8;
3499 case VFP_CPRC_VEC64:
3500 return 8;
3501 case VFP_CPRC_VEC128:
3502 return 16;
3503 default:
3504 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3505 (int) b);
3506 }
3507}
3508
3509/* The character ('s', 'd' or 'q') for the type of VFP register used
3510 for passing base type B. */
3511
3512static int
3513arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3514{
3515 switch (b)
3516 {
3517 case VFP_CPRC_SINGLE:
3518 return 's';
3519 case VFP_CPRC_DOUBLE:
3520 return 'd';
3521 case VFP_CPRC_VEC64:
3522 return 'd';
3523 case VFP_CPRC_VEC128:
3524 return 'q';
3525 default:
3526 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3527 (int) b);
3528 }
3529}
3530
3531/* Determine whether T may be part of a candidate for passing and
3532 returning in VFP registers, ignoring the limit on the total number
3533 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3534 classification of the first valid component found; if it is not
3535 VFP_CPRC_UNKNOWN, all components must have the same classification
3536 as *BASE_TYPE. If it is found that T contains a type not permitted
3537 for passing and returning in VFP registers, a type differently
3538 classified from *BASE_TYPE, or two types differently classified
3539 from each other, return -1, otherwise return the total number of
3540 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3541 array). Vector types are not currently supported, matching the
3542 generic AAPCS support. */
90445bd3
DJ
3543
3544static int
3545arm_vfp_cprc_sub_candidate (struct type *t,
3546 enum arm_vfp_cprc_base_type *base_type)
3547{
3548 t = check_typedef (t);
3549 switch (TYPE_CODE (t))
3550 {
3551 case TYPE_CODE_FLT:
3552 switch (TYPE_LENGTH (t))
3553 {
3554 case 4:
3555 if (*base_type == VFP_CPRC_UNKNOWN)
3556 *base_type = VFP_CPRC_SINGLE;
3557 else if (*base_type != VFP_CPRC_SINGLE)
3558 return -1;
3559 return 1;
3560
3561 case 8:
3562 if (*base_type == VFP_CPRC_UNKNOWN)
3563 *base_type = VFP_CPRC_DOUBLE;
3564 else if (*base_type != VFP_CPRC_DOUBLE)
3565 return -1;
3566 return 1;
3567
3568 default:
3569 return -1;
3570 }
3571 break;
3572
817e0957
YQ
3573 case TYPE_CODE_COMPLEX:
3574 /* Arguments of complex T where T is one of the types float or
3575 double get treated as if they are implemented as:
3576
3577 struct complexT
3578 {
3579 T real;
3580 T imag;
5f52445b
YQ
3581 };
3582
3583 */
817e0957
YQ
3584 switch (TYPE_LENGTH (t))
3585 {
3586 case 8:
3587 if (*base_type == VFP_CPRC_UNKNOWN)
3588 *base_type = VFP_CPRC_SINGLE;
3589 else if (*base_type != VFP_CPRC_SINGLE)
3590 return -1;
3591 return 2;
3592
3593 case 16:
3594 if (*base_type == VFP_CPRC_UNKNOWN)
3595 *base_type = VFP_CPRC_DOUBLE;
3596 else if (*base_type != VFP_CPRC_DOUBLE)
3597 return -1;
3598 return 2;
3599
3600 default:
3601 return -1;
3602 }
3603 break;
3604
90445bd3
DJ
3605 case TYPE_CODE_ARRAY:
3606 {
c4312b19 3607 if (TYPE_VECTOR (t))
90445bd3 3608 {
c4312b19
YQ
3609 /* A 64-bit or 128-bit containerized vector type are VFP
3610 CPRCs. */
3611 switch (TYPE_LENGTH (t))
3612 {
3613 case 8:
3614 if (*base_type == VFP_CPRC_UNKNOWN)
3615 *base_type = VFP_CPRC_VEC64;
3616 return 1;
3617 case 16:
3618 if (*base_type == VFP_CPRC_UNKNOWN)
3619 *base_type = VFP_CPRC_VEC128;
3620 return 1;
3621 default:
3622 return -1;
3623 }
3624 }
3625 else
3626 {
3627 int count;
3628 unsigned unitlen;
3629
3630 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3631 base_type);
3632 if (count == -1)
3633 return -1;
3634 if (TYPE_LENGTH (t) == 0)
3635 {
3636 gdb_assert (count == 0);
3637 return 0;
3638 }
3639 else if (count == 0)
3640 return -1;
3641 unitlen = arm_vfp_cprc_unit_length (*base_type);
3642 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3643 return TYPE_LENGTH (t) / unitlen;
90445bd3 3644 }
90445bd3
DJ
3645 }
3646 break;
3647
3648 case TYPE_CODE_STRUCT:
3649 {
3650 int count = 0;
3651 unsigned unitlen;
3652 int i;
3653 for (i = 0; i < TYPE_NFIELDS (t); i++)
3654 {
3655 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3656 base_type);
3657 if (sub_count == -1)
3658 return -1;
3659 count += sub_count;
3660 }
3661 if (TYPE_LENGTH (t) == 0)
3662 {
3663 gdb_assert (count == 0);
3664 return 0;
3665 }
3666 else if (count == 0)
3667 return -1;
3668 unitlen = arm_vfp_cprc_unit_length (*base_type);
3669 if (TYPE_LENGTH (t) != unitlen * count)
3670 return -1;
3671 return count;
3672 }
3673
3674 case TYPE_CODE_UNION:
3675 {
3676 int count = 0;
3677 unsigned unitlen;
3678 int i;
3679 for (i = 0; i < TYPE_NFIELDS (t); i++)
3680 {
3681 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3682 base_type);
3683 if (sub_count == -1)
3684 return -1;
3685 count = (count > sub_count ? count : sub_count);
3686 }
3687 if (TYPE_LENGTH (t) == 0)
3688 {
3689 gdb_assert (count == 0);
3690 return 0;
3691 }
3692 else if (count == 0)
3693 return -1;
3694 unitlen = arm_vfp_cprc_unit_length (*base_type);
3695 if (TYPE_LENGTH (t) != unitlen * count)
3696 return -1;
3697 return count;
3698 }
3699
3700 default:
3701 break;
3702 }
3703
3704 return -1;
3705}
3706
3707/* Determine whether T is a VFP co-processor register candidate (CPRC)
3708 if passed to or returned from a non-variadic function with the VFP
3709 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3710 *BASE_TYPE to the base type for T and *COUNT to the number of
3711 elements of that base type before returning. */
3712
3713static int
3714arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3715 int *count)
3716{
3717 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3718 int c = arm_vfp_cprc_sub_candidate (t, &b);
3719 if (c <= 0 || c > 4)
3720 return 0;
3721 *base_type = b;
3722 *count = c;
3723 return 1;
3724}
3725
3726/* Return 1 if the VFP ABI should be used for passing arguments to and
3727 returning values from a function of type FUNC_TYPE, 0
3728 otherwise. */
3729
3730static int
3731arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3732{
3733 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3734 /* Variadic functions always use the base ABI. Assume that functions
3735 without debug info are not variadic. */
3736 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3737 return 0;
3738 /* The VFP ABI is only supported as a variant of AAPCS. */
3739 if (tdep->arm_abi != ARM_ABI_AAPCS)
3740 return 0;
3741 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3742}
3743
3744/* We currently only support passing parameters in integer registers, which
3745 conforms with GCC's default model, and VFP argument passing following
3746 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3747 we should probably support some of them based on the selected ABI. */
3748
3749static CORE_ADDR
7d9b040b 3750arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
3751 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3752 struct value **args, CORE_ADDR sp, int struct_return,
3753 CORE_ADDR struct_addr)
2dd604e7 3754{
e17a4113 3755 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3756 int argnum;
3757 int argreg;
3758 int nstack;
3759 struct stack_item *si = NULL;
90445bd3
DJ
3760 int use_vfp_abi;
3761 struct type *ftype;
3762 unsigned vfp_regs_free = (1 << 16) - 1;
3763
3764 /* Determine the type of this function and whether the VFP ABI
3765 applies. */
3766 ftype = check_typedef (value_type (function));
3767 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3768 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3769 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3770
6a65450a
AC
3771 /* Set the return address. For the ARM, the return breakpoint is
3772 always at BP_ADDR. */
9779414d 3773 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3774 bp_addr |= 1;
6a65450a 3775 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3776
3777 /* Walk through the list of args and determine how large a temporary
3778 stack is required. Need to take care here as structs may be
7a9dd1b2 3779 passed on the stack, and we have to push them. */
2dd604e7
RE
3780 nstack = 0;
3781
3782 argreg = ARM_A1_REGNUM;
3783 nstack = 0;
3784
2dd604e7
RE
3785 /* The struct_return pointer occupies the first parameter
3786 passing register. */
3787 if (struct_return)
3788 {
3789 if (arm_debug)
5af949e3 3790 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3791 gdbarch_register_name (gdbarch, argreg),
5af949e3 3792 paddress (gdbarch, struct_addr));
2dd604e7
RE
3793 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3794 argreg++;
3795 }
3796
3797 for (argnum = 0; argnum < nargs; argnum++)
3798 {
3799 int len;
3800 struct type *arg_type;
3801 struct type *target_type;
3802 enum type_code typecode;
8c6363cf 3803 const bfd_byte *val;
2af48f68 3804 int align;
90445bd3
DJ
3805 enum arm_vfp_cprc_base_type vfp_base_type;
3806 int vfp_base_count;
3807 int may_use_core_reg = 1;
2dd604e7 3808
df407dfe 3809 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3810 len = TYPE_LENGTH (arg_type);
3811 target_type = TYPE_TARGET_TYPE (arg_type);
3812 typecode = TYPE_CODE (arg_type);
8c6363cf 3813 val = value_contents (args[argnum]);
2dd604e7 3814
2af48f68
PB
3815 align = arm_type_align (arg_type);
3816 /* Round alignment up to a whole number of words. */
3817 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3818 /* Different ABIs have different maximum alignments. */
3819 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3820 {
3821 /* The APCS ABI only requires word alignment. */
3822 align = INT_REGISTER_SIZE;
3823 }
3824 else
3825 {
3826 /* The AAPCS requires at most doubleword alignment. */
3827 if (align > INT_REGISTER_SIZE * 2)
3828 align = INT_REGISTER_SIZE * 2;
3829 }
3830
90445bd3
DJ
3831 if (use_vfp_abi
3832 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3833 &vfp_base_count))
3834 {
3835 int regno;
3836 int unit_length;
3837 int shift;
3838 unsigned mask;
3839
3840 /* Because this is a CPRC it cannot go in a core register or
3841 cause a core register to be skipped for alignment.
3842 Either it goes in VFP registers and the rest of this loop
3843 iteration is skipped for this argument, or it goes on the
3844 stack (and the stack alignment code is correct for this
3845 case). */
3846 may_use_core_reg = 0;
3847
3848 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3849 shift = unit_length / 4;
3850 mask = (1 << (shift * vfp_base_count)) - 1;
3851 for (regno = 0; regno < 16; regno += shift)
3852 if (((vfp_regs_free >> regno) & mask) == mask)
3853 break;
3854
3855 if (regno < 16)
3856 {
3857 int reg_char;
3858 int reg_scaled;
3859 int i;
3860
3861 vfp_regs_free &= ~(mask << regno);
3862 reg_scaled = regno / shift;
3863 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3864 for (i = 0; i < vfp_base_count; i++)
3865 {
3866 char name_buf[4];
3867 int regnum;
58d6951d
DJ
3868 if (reg_char == 'q')
3869 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3870 val + i * unit_length);
58d6951d
DJ
3871 else
3872 {
8c042590
PM
3873 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3874 reg_char, reg_scaled + i);
58d6951d
DJ
3875 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3876 strlen (name_buf));
3877 regcache_cooked_write (regcache, regnum,
3878 val + i * unit_length);
3879 }
90445bd3
DJ
3880 }
3881 continue;
3882 }
3883 else
3884 {
3885 /* This CPRC could not go in VFP registers, so all VFP
3886 registers are now marked as used. */
3887 vfp_regs_free = 0;
3888 }
3889 }
3890
2af48f68
PB
3891 /* Push stack padding for dowubleword alignment. */
3892 if (nstack & (align - 1))
3893 {
3894 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3895 nstack += INT_REGISTER_SIZE;
3896 }
3897
3898 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3899 if (may_use_core_reg
3900 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3901 && align > INT_REGISTER_SIZE
3902 && argreg & 1)
3903 argreg++;
3904
2dd604e7
RE
3905 /* If the argument is a pointer to a function, and it is a
3906 Thumb function, create a LOCAL copy of the value and set
3907 the THUMB bit in it. */
3908 if (TYPE_CODE_PTR == typecode
3909 && target_type != NULL
f96b8fa0 3910 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3911 {
e17a4113 3912 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3913 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3914 {
224c3ddb 3915 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3916 store_unsigned_integer (copy, len, byte_order,
e17a4113 3917 MAKE_THUMB_ADDR (regval));
8c6363cf 3918 val = copy;
2dd604e7
RE
3919 }
3920 }
3921
3922 /* Copy the argument to general registers or the stack in
3923 register-sized pieces. Large arguments are split between
3924 registers and stack. */
3925 while (len > 0)
3926 {
f0c9063c 3927 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
ef9bd0b8
YQ
3928 CORE_ADDR regval
3929 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3930
90445bd3 3931 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3932 {
3933 /* The argument is being passed in a general purpose
3934 register. */
e17a4113 3935 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3936 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3937 if (arm_debug)
3938 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3939 argnum,
3940 gdbarch_register_name
2af46ca0 3941 (gdbarch, argreg),
f0c9063c 3942 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3943 regcache_cooked_write_unsigned (regcache, argreg, regval);
3944 argreg++;
3945 }
3946 else
3947 {
ef9bd0b8
YQ
3948 gdb_byte buf[INT_REGISTER_SIZE];
3949
3950 memset (buf, 0, sizeof (buf));
3951 store_unsigned_integer (buf, partial_len, byte_order, regval);
3952
2dd604e7
RE
3953 /* Push the arguments onto the stack. */
3954 if (arm_debug)
3955 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3956 argnum, nstack);
ef9bd0b8 3957 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
f0c9063c 3958 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3959 }
3960
3961 len -= partial_len;
3962 val += partial_len;
3963 }
3964 }
3965 /* If we have an odd number of words to push, then decrement the stack
3966 by one word now, so first stack argument will be dword aligned. */
3967 if (nstack & 4)
3968 sp -= 4;
3969
3970 while (si)
3971 {
3972 sp -= si->len;
3973 write_memory (sp, si->data, si->len);
3974 si = pop_stack_item (si);
3975 }
3976
3977 /* Finally, update teh SP register. */
3978 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3979
3980 return sp;
3981}
3982
f53f0d0b
PB
3983
3984/* Always align the frame to an 8-byte boundary. This is required on
3985 some platforms and harmless on the rest. */
3986
3987static CORE_ADDR
3988arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3989{
3990 /* Align the stack to eight bytes. */
3991 return sp & ~ (CORE_ADDR) 7;
3992}
3993
c906108c 3994static void
12b27276 3995print_fpu_flags (struct ui_file *file, int flags)
c906108c 3996{
c5aa993b 3997 if (flags & (1 << 0))
12b27276 3998 fputs_filtered ("IVO ", file);
c5aa993b 3999 if (flags & (1 << 1))
12b27276 4000 fputs_filtered ("DVZ ", file);
c5aa993b 4001 if (flags & (1 << 2))
12b27276 4002 fputs_filtered ("OFL ", file);
c5aa993b 4003 if (flags & (1 << 3))
12b27276 4004 fputs_filtered ("UFL ", file);
c5aa993b 4005 if (flags & (1 << 4))
12b27276
WN
4006 fputs_filtered ("INX ", file);
4007 fputc_filtered ('\n', file);
c906108c
SS
4008}
4009
5e74b15c
RE
4010/* Print interesting information about the floating point processor
4011 (if present) or emulator. */
34e8f22d 4012static void
d855c300 4013arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 4014 struct frame_info *frame, const char *args)
c906108c 4015{
9c9acae0 4016 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
4017 int type;
4018
4019 type = (status >> 24) & 127;
edefbb7c 4020 if (status & (1 << 31))
12b27276 4021 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 4022 else
12b27276 4023 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 4024 /* i18n: [floating point unit] mask */
12b27276
WN
4025 fputs_filtered (_("mask: "), file);
4026 print_fpu_flags (file, status >> 16);
edefbb7c 4027 /* i18n: [floating point unit] flags */
12b27276
WN
4028 fputs_filtered (_("flags: "), file);
4029 print_fpu_flags (file, status);
c906108c
SS
4030}
4031
27067745
UW
4032/* Construct the ARM extended floating point type. */
4033static struct type *
4034arm_ext_type (struct gdbarch *gdbarch)
4035{
4036 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4037
4038 if (!tdep->arm_ext_type)
4039 tdep->arm_ext_type
e9bb382b 4040 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
4041 floatformats_arm_ext);
4042
4043 return tdep->arm_ext_type;
4044}
4045
58d6951d
DJ
4046static struct type *
4047arm_neon_double_type (struct gdbarch *gdbarch)
4048{
4049 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4050
4051 if (tdep->neon_double_type == NULL)
4052 {
4053 struct type *t, *elem;
4054
4055 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
4056 TYPE_CODE_UNION);
4057 elem = builtin_type (gdbarch)->builtin_uint8;
4058 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
4059 elem = builtin_type (gdbarch)->builtin_uint16;
4060 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
4061 elem = builtin_type (gdbarch)->builtin_uint32;
4062 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
4063 elem = builtin_type (gdbarch)->builtin_uint64;
4064 append_composite_type_field (t, "u64", elem);
4065 elem = builtin_type (gdbarch)->builtin_float;
4066 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
4067 elem = builtin_type (gdbarch)->builtin_double;
4068 append_composite_type_field (t, "f64", elem);
4069
4070 TYPE_VECTOR (t) = 1;
4071 TYPE_NAME (t) = "neon_d";
4072 tdep->neon_double_type = t;
4073 }
4074
4075 return tdep->neon_double_type;
4076}
4077
4078/* FIXME: The vector types are not correctly ordered on big-endian
4079 targets. Just as s0 is the low bits of d0, d0[0] is also the low
4080 bits of d0 - regardless of what unit size is being held in d0. So
4081 the offset of the first uint8 in d0 is 7, but the offset of the
4082 first float is 4. This code works as-is for little-endian
4083 targets. */
4084
4085static struct type *
4086arm_neon_quad_type (struct gdbarch *gdbarch)
4087{
4088 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4089
4090 if (tdep->neon_quad_type == NULL)
4091 {
4092 struct type *t, *elem;
4093
4094 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
4095 TYPE_CODE_UNION);
4096 elem = builtin_type (gdbarch)->builtin_uint8;
4097 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
4098 elem = builtin_type (gdbarch)->builtin_uint16;
4099 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
4100 elem = builtin_type (gdbarch)->builtin_uint32;
4101 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
4102 elem = builtin_type (gdbarch)->builtin_uint64;
4103 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
4104 elem = builtin_type (gdbarch)->builtin_float;
4105 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
4106 elem = builtin_type (gdbarch)->builtin_double;
4107 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
4108
4109 TYPE_VECTOR (t) = 1;
4110 TYPE_NAME (t) = "neon_q";
4111 tdep->neon_quad_type = t;
4112 }
4113
4114 return tdep->neon_quad_type;
4115}
4116
34e8f22d
RE
4117/* Return the GDB type object for the "standard" data type of data in
4118 register N. */
4119
4120static struct type *
7a5ea0d4 4121arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 4122{
58d6951d
DJ
4123 int num_regs = gdbarch_num_regs (gdbarch);
4124
4125 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
4126 && regnum >= num_regs && regnum < num_regs + 32)
4127 return builtin_type (gdbarch)->builtin_float;
4128
4129 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
4130 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
4131 return arm_neon_quad_type (gdbarch);
4132
4133 /* If the target description has register information, we are only
4134 in this function so that we can override the types of
4135 double-precision registers for NEON. */
4136 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
4137 {
4138 struct type *t = tdesc_register_type (gdbarch, regnum);
4139
4140 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
4141 && TYPE_CODE (t) == TYPE_CODE_FLT
4142 && gdbarch_tdep (gdbarch)->have_neon)
4143 return arm_neon_double_type (gdbarch);
4144 else
4145 return t;
4146 }
4147
34e8f22d 4148 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
4149 {
4150 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
4151 return builtin_type (gdbarch)->builtin_void;
4152
4153 return arm_ext_type (gdbarch);
4154 }
e4c16157 4155 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 4156 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 4157 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 4158 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
4159 else if (regnum >= ARRAY_SIZE (arm_register_names))
4160 /* These registers are only supported on targets which supply
4161 an XML description. */
df4df182 4162 return builtin_type (gdbarch)->builtin_int0;
032758dc 4163 else
df4df182 4164 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
4165}
4166
ff6f572f
DJ
4167/* Map a DWARF register REGNUM onto the appropriate GDB register
4168 number. */
4169
4170static int
d3f73121 4171arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
4172{
4173 /* Core integer regs. */
4174 if (reg >= 0 && reg <= 15)
4175 return reg;
4176
4177 /* Legacy FPA encoding. These were once used in a way which
4178 overlapped with VFP register numbering, so their use is
4179 discouraged, but GDB doesn't support the ARM toolchain
4180 which used them for VFP. */
4181 if (reg >= 16 && reg <= 23)
4182 return ARM_F0_REGNUM + reg - 16;
4183
4184 /* New assignments for the FPA registers. */
4185 if (reg >= 96 && reg <= 103)
4186 return ARM_F0_REGNUM + reg - 96;
4187
4188 /* WMMX register assignments. */
4189 if (reg >= 104 && reg <= 111)
4190 return ARM_WCGR0_REGNUM + reg - 104;
4191
4192 if (reg >= 112 && reg <= 127)
4193 return ARM_WR0_REGNUM + reg - 112;
4194
4195 if (reg >= 192 && reg <= 199)
4196 return ARM_WC0_REGNUM + reg - 192;
4197
58d6951d
DJ
4198 /* VFP v2 registers. A double precision value is actually
4199 in d1 rather than s2, but the ABI only defines numbering
4200 for the single precision registers. This will "just work"
4201 in GDB for little endian targets (we'll read eight bytes,
4202 starting in s0 and then progressing to s1), but will be
4203 reversed on big endian targets with VFP. This won't
4204 be a problem for the new Neon quad registers; you're supposed
4205 to use DW_OP_piece for those. */
4206 if (reg >= 64 && reg <= 95)
4207 {
4208 char name_buf[4];
4209
8c042590 4210 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4211 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4212 strlen (name_buf));
4213 }
4214
4215 /* VFP v3 / Neon registers. This range is also used for VFP v2
4216 registers, except that it now describes d0 instead of s0. */
4217 if (reg >= 256 && reg <= 287)
4218 {
4219 char name_buf[4];
4220
8c042590 4221 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4222 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4223 strlen (name_buf));
4224 }
4225
ff6f572f
DJ
4226 return -1;
4227}
4228
26216b98
AC
4229/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4230static int
e7faf938 4231arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4232{
4233 int reg = regnum;
e7faf938 4234 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4235
ff6f572f
DJ
4236 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4237 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4238
4239 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4240 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4241
4242 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4243 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4244
26216b98
AC
4245 if (reg < NUM_GREGS)
4246 return SIM_ARM_R0_REGNUM + reg;
4247 reg -= NUM_GREGS;
4248
4249 if (reg < NUM_FREGS)
4250 return SIM_ARM_FP0_REGNUM + reg;
4251 reg -= NUM_FREGS;
4252
4253 if (reg < NUM_SREGS)
4254 return SIM_ARM_FPS_REGNUM + reg;
4255 reg -= NUM_SREGS;
4256
edefbb7c 4257 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4258}
34e8f22d 4259
a37b3cc0
AC
4260/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
4261 convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
4262 It is thought that this is is the floating-point register format on
4263 little-endian systems. */
c906108c 4264
ed9a39eb 4265static void
b508a996 4266convert_from_extended (const struct floatformat *fmt, const void *ptr,
be8626e0 4267 void *dbl, int endianess)
c906108c 4268{
a37b3cc0 4269 DOUBLEST d;
be8626e0
MD
4270
4271 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4272 floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
4273 else
4274 floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
4275 ptr, &d);
b508a996 4276 floatformat_from_doublest (fmt, &d, dbl);
c906108c
SS
4277}
4278
34e8f22d 4279static void
be8626e0
MD
4280convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
4281 int endianess)
c906108c 4282{
a37b3cc0 4283 DOUBLEST d;
be8626e0 4284
b508a996 4285 floatformat_to_doublest (fmt, ptr, &d);
be8626e0 4286 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4287 floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
4288 else
4289 floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
4290 &d, dbl);
c906108c 4291}
ed9a39eb 4292
c906108c 4293static int
ed9a39eb 4294condition_true (unsigned long cond, unsigned long status_reg)
c906108c
SS
4295{
4296 if (cond == INST_AL || cond == INST_NV)
4297 return 1;
4298
4299 switch (cond)
4300 {
4301 case INST_EQ:
4302 return ((status_reg & FLAG_Z) != 0);
4303 case INST_NE:
4304 return ((status_reg & FLAG_Z) == 0);
4305 case INST_CS:
4306 return ((status_reg & FLAG_C) != 0);
4307 case INST_CC:
4308 return ((status_reg & FLAG_C) == 0);
4309 case INST_MI:
4310 return ((status_reg & FLAG_N) != 0);
4311 case INST_PL:
4312 return ((status_reg & FLAG_N) == 0);
4313 case INST_VS:
4314 return ((status_reg & FLAG_V) != 0);
4315 case INST_VC:
4316 return ((status_reg & FLAG_V) == 0);
4317 case INST_HI:
4318 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
4319 case INST_LS:
4320 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
4321 case INST_GE:
4322 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
4323 case INST_LT:
4324 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
4325 case INST_GT:
f8bf5763
PM
4326 return (((status_reg & FLAG_Z) == 0)
4327 && (((status_reg & FLAG_N) == 0)
4328 == ((status_reg & FLAG_V) == 0)));
c906108c 4329 case INST_LE:
f8bf5763
PM
4330 return (((status_reg & FLAG_Z) != 0)
4331 || (((status_reg & FLAG_N) == 0)
4332 != ((status_reg & FLAG_V) == 0)));
c906108c
SS
4333 }
4334 return 1;
4335}
4336
c906108c 4337static unsigned long
0b1b3e42
UW
4338shifted_reg_val (struct frame_info *frame, unsigned long inst, int carry,
4339 unsigned long pc_val, unsigned long status_reg)
c906108c
SS
4340{
4341 unsigned long res, shift;
4342 int rm = bits (inst, 0, 3);
4343 unsigned long shifttype = bits (inst, 5, 6);
c5aa993b
JM
4344
4345 if (bit (inst, 4))
c906108c
SS
4346 {
4347 int rs = bits (inst, 8, 11);
0b1b3e42
UW
4348 shift = (rs == 15 ? pc_val + 8
4349 : get_frame_register_unsigned (frame, rs)) & 0xFF;
c906108c
SS
4350 }
4351 else
4352 shift = bits (inst, 7, 11);
c5aa993b 4353
bf9f652a 4354 res = (rm == ARM_PC_REGNUM
0d39a070 4355 ? (pc_val + (bit (inst, 4) ? 12 : 8))
0b1b3e42 4356 : get_frame_register_unsigned (frame, rm));
c906108c
SS
4357
4358 switch (shifttype)
4359 {
c5aa993b 4360 case 0: /* LSL */
c906108c
SS
4361 res = shift >= 32 ? 0 : res << shift;
4362 break;
c5aa993b
JM
4363
4364 case 1: /* LSR */
c906108c
SS
4365 res = shift >= 32 ? 0 : res >> shift;
4366 break;
4367
c5aa993b
JM
4368 case 2: /* ASR */
4369 if (shift >= 32)
4370 shift = 31;
c906108c
SS
4371 res = ((res & 0x80000000L)
4372 ? ~((~res) >> shift) : res >> shift);
4373 break;
4374
c5aa993b 4375 case 3: /* ROR/RRX */
c906108c
SS
4376 shift &= 31;
4377 if (shift == 0)
4378 res = (res >> 1) | (carry ? 0x80000000L : 0);
4379 else
c5aa993b 4380 res = (res >> shift) | (res << (32 - shift));
c906108c
SS
4381 break;
4382 }
4383
4384 return res & 0xffffffff;
4385}
4386
c906108c
SS
4387/* Return number of 1-bits in VAL. */
4388
4389static int
ed9a39eb 4390bitcount (unsigned long val)
c906108c
SS
4391{
4392 int nbits;
4393 for (nbits = 0; val != 0; nbits++)
0963b4bd 4394 val &= val - 1; /* Delete rightmost 1-bit in val. */
c906108c
SS
4395 return nbits;
4396}
4397
177321bd
DJ
4398static int
4399thumb_advance_itstate (unsigned int itstate)
4400{
4401 /* Preserve IT[7:5], the first three bits of the condition. Shift
4402 the upcoming condition flags left by one bit. */
4403 itstate = (itstate & 0xe0) | ((itstate << 1) & 0x1f);
4404
4405 /* If we have finished the IT block, clear the state. */
4406 if ((itstate & 0x0f) == 0)
4407 itstate = 0;
4408
4409 return itstate;
4410}
4411
4412/* Find the next PC after the current instruction executes. In some
4413 cases we can not statically determine the answer (see the IT state
4414 handling in this function); in that case, a breakpoint may be
4415 inserted in addition to the returned PC, which will be used to set
4416 another breakpoint by our caller. */
4417
ad527d2e 4418static CORE_ADDR
18819fa6 4419thumb_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc)
c906108c 4420{
2af46ca0 4421 struct gdbarch *gdbarch = get_frame_arch (frame);
177321bd 4422 struct address_space *aspace = get_frame_address_space (frame);
e17a4113
UW
4423 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4424 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c5aa993b 4425 unsigned long pc_val = ((unsigned long) pc) + 4; /* PC after prefetch */
e17a4113 4426 unsigned short inst1;
0963b4bd 4427 CORE_ADDR nextpc = pc + 2; /* Default is next instruction. */
c906108c 4428 unsigned long offset;
177321bd 4429 ULONGEST status, itstate;
c906108c 4430
50e98be4
DJ
4431 nextpc = MAKE_THUMB_ADDR (nextpc);
4432 pc_val = MAKE_THUMB_ADDR (pc_val);
4433
e17a4113 4434 inst1 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
9d4fde75 4435
9dca5578
DJ
4436 /* Thumb-2 conditional execution support. There are eight bits in
4437 the CPSR which describe conditional execution state. Once
4438 reconstructed (they're in a funny order), the low five bits
4439 describe the low bit of the condition for each instruction and
4440 how many instructions remain. The high three bits describe the
4441 base condition. One of the low four bits will be set if an IT
4442 block is active. These bits read as zero on earlier
4443 processors. */
4444 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
177321bd 4445 itstate = ((status >> 8) & 0xfc) | ((status >> 25) & 0x3);
9dca5578 4446
177321bd
DJ
4447 /* If-Then handling. On GNU/Linux, where this routine is used, we
4448 use an undefined instruction as a breakpoint. Unlike BKPT, IT
4449 can disable execution of the undefined instruction. So we might
4450 miss the breakpoint if we set it on a skipped conditional
4451 instruction. Because conditional instructions can change the
4452 flags, affecting the execution of further instructions, we may
4453 need to set two breakpoints. */
9dca5578 4454
177321bd
DJ
4455 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint != NULL)
4456 {
4457 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4458 {
4459 /* An IT instruction. Because this instruction does not
4460 modify the flags, we can accurately predict the next
4461 executed instruction. */
4462 itstate = inst1 & 0x00ff;
4463 pc += thumb_insn_size (inst1);
4464
4465 while (itstate != 0 && ! condition_true (itstate >> 4, status))
4466 {
0963b4bd
MS
4467 inst1 = read_memory_unsigned_integer (pc, 2,
4468 byte_order_for_code);
177321bd
DJ
4469 pc += thumb_insn_size (inst1);
4470 itstate = thumb_advance_itstate (itstate);
4471 }
4472
50e98be4 4473 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4474 }
4475 else if (itstate != 0)
4476 {
4477 /* We are in a conditional block. Check the condition. */
4478 if (! condition_true (itstate >> 4, status))
4479 {
4480 /* Advance to the next executed instruction. */
4481 pc += thumb_insn_size (inst1);
4482 itstate = thumb_advance_itstate (itstate);
4483
4484 while (itstate != 0 && ! condition_true (itstate >> 4, status))
4485 {
0963b4bd
MS
4486 inst1 = read_memory_unsigned_integer (pc, 2,
4487 byte_order_for_code);
177321bd
DJ
4488 pc += thumb_insn_size (inst1);
4489 itstate = thumb_advance_itstate (itstate);
4490 }
4491
50e98be4 4492 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4493 }
4494 else if ((itstate & 0x0f) == 0x08)
4495 {
4496 /* This is the last instruction of the conditional
4497 block, and it is executed. We can handle it normally
4498 because the following instruction is not conditional,
4499 and we must handle it normally because it is
4500 permitted to branch. Fall through. */
4501 }
4502 else
4503 {
4504 int cond_negated;
4505
4506 /* There are conditional instructions after this one.
4507 If this instruction modifies the flags, then we can
4508 not predict what the next executed instruction will
4509 be. Fortunately, this instruction is architecturally
4510 forbidden to branch; we know it will fall through.
4511 Start by skipping past it. */
4512 pc += thumb_insn_size (inst1);
4513 itstate = thumb_advance_itstate (itstate);
4514
4515 /* Set a breakpoint on the following instruction. */
4516 gdb_assert ((itstate & 0x0f) != 0);
18819fa6
UW
4517 arm_insert_single_step_breakpoint (gdbarch, aspace,
4518 MAKE_THUMB_ADDR (pc));
177321bd
DJ
4519 cond_negated = (itstate >> 4) & 1;
4520
4521 /* Skip all following instructions with the same
4522 condition. If there is a later instruction in the IT
4523 block with the opposite condition, set the other
4524 breakpoint there. If not, then set a breakpoint on
4525 the instruction after the IT block. */
4526 do
4527 {
0963b4bd
MS
4528 inst1 = read_memory_unsigned_integer (pc, 2,
4529 byte_order_for_code);
177321bd
DJ
4530 pc += thumb_insn_size (inst1);
4531 itstate = thumb_advance_itstate (itstate);
4532 }
4533 while (itstate != 0 && ((itstate >> 4) & 1) == cond_negated);
4534
50e98be4 4535 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4536 }
4537 }
4538 }
4539 else if (itstate & 0x0f)
9dca5578
DJ
4540 {
4541 /* We are in a conditional block. Check the condition. */
177321bd 4542 int cond = itstate >> 4;
9dca5578
DJ
4543
4544 if (! condition_true (cond, status))
db24da6d
YQ
4545 /* Advance to the next instruction. All the 32-bit
4546 instructions share a common prefix. */
4547 return MAKE_THUMB_ADDR (pc + thumb_insn_size (inst1));
177321bd
DJ
4548
4549 /* Otherwise, handle the instruction normally. */
9dca5578
DJ
4550 }
4551
c906108c
SS
4552 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
4553 {
4554 CORE_ADDR sp;
4555
4556 /* Fetch the saved PC from the stack. It's stored above
4557 all of the other registers. */
f0c9063c 4558 offset = bitcount (bits (inst1, 0, 7)) * INT_REGISTER_SIZE;
0b1b3e42 4559 sp = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
e17a4113 4560 nextpc = read_memory_unsigned_integer (sp + offset, 4, byte_order);
c906108c
SS
4561 }
4562 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
4563 {
c5aa993b 4564 unsigned long cond = bits (inst1, 8, 11);
25b41d01
YQ
4565 if (cond == 0x0f) /* 0x0f = SWI */
4566 {
4567 struct gdbarch_tdep *tdep;
4568 tdep = gdbarch_tdep (gdbarch);
4569
4570 if (tdep->syscall_next_pc != NULL)
4571 nextpc = tdep->syscall_next_pc (frame);
4572
4573 }
4574 else if (cond != 0x0f && condition_true (cond, status))
c906108c
SS
4575 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
4576 }
4577 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
4578 {
4579 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
4580 }
db24da6d 4581 else if (thumb_insn_size (inst1) == 4) /* 32-bit instruction */
c906108c 4582 {
e17a4113
UW
4583 unsigned short inst2;
4584 inst2 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
9dca5578
DJ
4585
4586 /* Default to the next instruction. */
4587 nextpc = pc + 4;
50e98be4 4588 nextpc = MAKE_THUMB_ADDR (nextpc);
9dca5578
DJ
4589
4590 if ((inst1 & 0xf800) == 0xf000 && (inst2 & 0x8000) == 0x8000)
4591 {
4592 /* Branches and miscellaneous control instructions. */
4593
4594 if ((inst2 & 0x1000) != 0 || (inst2 & 0xd001) == 0xc000)
4595 {
4596 /* B, BL, BLX. */
4597 int j1, j2, imm1, imm2;
4598
4599 imm1 = sbits (inst1, 0, 10);
4600 imm2 = bits (inst2, 0, 10);
4601 j1 = bit (inst2, 13);
4602 j2 = bit (inst2, 11);
4603
4604 offset = ((imm1 << 12) + (imm2 << 1));
4605 offset ^= ((!j2) << 22) | ((!j1) << 23);
4606
4607 nextpc = pc_val + offset;
4608 /* For BLX make sure to clear the low bits. */
4609 if (bit (inst2, 12) == 0)
4610 nextpc = nextpc & 0xfffffffc;
4611 }
4612 else if (inst1 == 0xf3de && (inst2 & 0xff00) == 0x3f00)
4613 {
4614 /* SUBS PC, LR, #imm8. */
4615 nextpc = get_frame_register_unsigned (frame, ARM_LR_REGNUM);
4616 nextpc -= inst2 & 0x00ff;
4617 }
4069ebbe 4618 else if ((inst2 & 0xd000) == 0x8000 && (inst1 & 0x0380) != 0x0380)
9dca5578
DJ
4619 {
4620 /* Conditional branch. */
4621 if (condition_true (bits (inst1, 6, 9), status))
4622 {
4623 int sign, j1, j2, imm1, imm2;
4624
4625 sign = sbits (inst1, 10, 10);
4626 imm1 = bits (inst1, 0, 5);
4627 imm2 = bits (inst2, 0, 10);
4628 j1 = bit (inst2, 13);
4629 j2 = bit (inst2, 11);
4630
4631 offset = (sign << 20) + (j2 << 19) + (j1 << 18);
4632 offset += (imm1 << 12) + (imm2 << 1);
4633
4634 nextpc = pc_val + offset;
4635 }
4636 }
4637 }
4638 else if ((inst1 & 0xfe50) == 0xe810)
4639 {
4640 /* Load multiple or RFE. */
4641 int rn, offset, load_pc = 1;
4642
4643 rn = bits (inst1, 0, 3);
4644 if (bit (inst1, 7) && !bit (inst1, 8))
4645 {
4646 /* LDMIA or POP */
4647 if (!bit (inst2, 15))
4648 load_pc = 0;
4649 offset = bitcount (inst2) * 4 - 4;
4650 }
4651 else if (!bit (inst1, 7) && bit (inst1, 8))
4652 {
4653 /* LDMDB */
4654 if (!bit (inst2, 15))
4655 load_pc = 0;
4656 offset = -4;
4657 }
4658 else if (bit (inst1, 7) && bit (inst1, 8))
4659 {
4660 /* RFEIA */
4661 offset = 0;
4662 }
4663 else if (!bit (inst1, 7) && !bit (inst1, 8))
4664 {
4665 /* RFEDB */
4666 offset = -8;
4667 }
4668 else
4669 load_pc = 0;
4670
4671 if (load_pc)
4672 {
4673 CORE_ADDR addr = get_frame_register_unsigned (frame, rn);
4674 nextpc = get_frame_memory_unsigned (frame, addr + offset, 4);
4675 }
4676 }
4677 else if ((inst1 & 0xffef) == 0xea4f && (inst2 & 0xfff0) == 0x0f00)
4678 {
4679 /* MOV PC or MOVS PC. */
4680 nextpc = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
50e98be4 4681 nextpc = MAKE_THUMB_ADDR (nextpc);
9dca5578
DJ
4682 }
4683 else if ((inst1 & 0xff70) == 0xf850 && (inst2 & 0xf000) == 0xf000)
4684 {
4685 /* LDR PC. */
4686 CORE_ADDR base;
4687 int rn, load_pc = 1;
4688
4689 rn = bits (inst1, 0, 3);
4690 base = get_frame_register_unsigned (frame, rn);
bf9f652a 4691 if (rn == ARM_PC_REGNUM)
9dca5578
DJ
4692 {
4693 base = (base + 4) & ~(CORE_ADDR) 0x3;
4694 if (bit (inst1, 7))
4695 base += bits (inst2, 0, 11);
4696 else
4697 base -= bits (inst2, 0, 11);
4698 }
4699 else if (bit (inst1, 7))
4700 base += bits (inst2, 0, 11);
4701 else if (bit (inst2, 11))
4702 {
4703 if (bit (inst2, 10))
4704 {
4705 if (bit (inst2, 9))
4706 base += bits (inst2, 0, 7);
4707 else
4708 base -= bits (inst2, 0, 7);
4709 }
4710 }
4711 else if ((inst2 & 0x0fc0) == 0x0000)
4712 {
4713 int shift = bits (inst2, 4, 5), rm = bits (inst2, 0, 3);
4714 base += get_frame_register_unsigned (frame, rm) << shift;
4715 }
4716 else
4717 /* Reserved. */
4718 load_pc = 0;
4719
4720 if (load_pc)
4721 nextpc = get_frame_memory_unsigned (frame, base, 4);
4722 }
4723 else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
4724 {
4725 /* TBB. */
d476da0e
RE
4726 CORE_ADDR tbl_reg, table, offset, length;
4727
4728 tbl_reg = bits (inst1, 0, 3);
4729 if (tbl_reg == 0x0f)
4730 table = pc + 4; /* Regcache copy of PC isn't right yet. */
4731 else
4732 table = get_frame_register_unsigned (frame, tbl_reg);
9dca5578 4733
9dca5578
DJ
4734 offset = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
4735 length = 2 * get_frame_memory_unsigned (frame, table + offset, 1);
4736 nextpc = pc_val + length;
4737 }
d476da0e 4738 else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010)
9dca5578
DJ
4739 {
4740 /* TBH. */
d476da0e
RE
4741 CORE_ADDR tbl_reg, table, offset, length;
4742
4743 tbl_reg = bits (inst1, 0, 3);
4744 if (tbl_reg == 0x0f)
4745 table = pc + 4; /* Regcache copy of PC isn't right yet. */
4746 else
4747 table = get_frame_register_unsigned (frame, tbl_reg);
9dca5578 4748
9dca5578
DJ
4749 offset = 2 * get_frame_register_unsigned (frame, bits (inst2, 0, 3));
4750 length = 2 * get_frame_memory_unsigned (frame, table + offset, 2);
4751 nextpc = pc_val + length;
4752 }
c906108c 4753 }
aa17d93e 4754 else if ((inst1 & 0xff00) == 0x4700) /* bx REG, blx REG */
9498281f
DJ
4755 {
4756 if (bits (inst1, 3, 6) == 0x0f)
6ca1b147 4757 nextpc = UNMAKE_THUMB_ADDR (pc_val);
9498281f 4758 else
0b1b3e42 4759 nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
9498281f 4760 }
ad8b5167
UW
4761 else if ((inst1 & 0xff87) == 0x4687) /* mov pc, REG */
4762 {
4763 if (bits (inst1, 3, 6) == 0x0f)
4764 nextpc = pc_val;
4765 else
4766 nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
4767
4768 nextpc = MAKE_THUMB_ADDR (nextpc);
4769 }
9dca5578
DJ
4770 else if ((inst1 & 0xf500) == 0xb100)
4771 {
4772 /* CBNZ or CBZ. */
4773 int imm = (bit (inst1, 9) << 6) + (bits (inst1, 3, 7) << 1);
4774 ULONGEST reg = get_frame_register_unsigned (frame, bits (inst1, 0, 2));
4775
4776 if (bit (inst1, 11) && reg != 0)
4777 nextpc = pc_val + imm;
4778 else if (!bit (inst1, 11) && reg == 0)
4779 nextpc = pc_val + imm;
4780 }
c906108c
SS
4781 return nextpc;
4782}
4783
50e98be4 4784/* Get the raw next address. PC is the current program counter, in
18819fa6 4785 FRAME, which is assumed to be executing in ARM mode.
50e98be4
DJ
4786
4787 The value returned has the execution state of the next instruction
4788 encoded in it. Use IS_THUMB_ADDR () to see whether the instruction is
4789 in Thumb-State, and gdbarch_addr_bits_remove () to get the plain memory
0963b4bd
MS
4790 address. */
4791
50e98be4 4792static CORE_ADDR
18819fa6 4793arm_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc)
c906108c 4794{
2af46ca0 4795 struct gdbarch *gdbarch = get_frame_arch (frame);
e17a4113
UW
4796 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4797 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c
SS
4798 unsigned long pc_val;
4799 unsigned long this_instr;
4800 unsigned long status;
4801 CORE_ADDR nextpc;
4802
c906108c 4803 pc_val = (unsigned long) pc;
e17a4113 4804 this_instr = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
9d4fde75 4805
0b1b3e42 4806 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
c5aa993b 4807 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
c906108c 4808
daddc3c1
DJ
4809 if (bits (this_instr, 28, 31) == INST_NV)
4810 switch (bits (this_instr, 24, 27))
4811 {
4812 case 0xa:
4813 case 0xb:
4814 {
4815 /* Branch with Link and change to Thumb. */
4816 nextpc = BranchDest (pc, this_instr);
4817 nextpc |= bit (this_instr, 24) << 1;
50e98be4 4818 nextpc = MAKE_THUMB_ADDR (nextpc);
daddc3c1
DJ
4819 break;
4820 }
4821 case 0xc:
4822 case 0xd:
4823 case 0xe:
4824 /* Coprocessor register transfer. */
4825 if (bits (this_instr, 12, 15) == 15)
4826 error (_("Invalid update to pc in instruction"));
4827 break;
4828 }
4829 else if (condition_true (bits (this_instr, 28, 31), status))
c906108c
SS
4830 {
4831 switch (bits (this_instr, 24, 27))
4832 {
c5aa993b 4833 case 0x0:
94c30b78 4834 case 0x1: /* data processing */
c5aa993b
JM
4835 case 0x2:
4836 case 0x3:
c906108c
SS
4837 {
4838 unsigned long operand1, operand2, result = 0;
4839 unsigned long rn;
4840 int c;
c5aa993b 4841
c906108c
SS
4842 if (bits (this_instr, 12, 15) != 15)
4843 break;
4844
4845 if (bits (this_instr, 22, 25) == 0
c5aa993b 4846 && bits (this_instr, 4, 7) == 9) /* multiply */
edefbb7c 4847 error (_("Invalid update to pc in instruction"));
c906108c 4848
9498281f 4849 /* BX <reg>, BLX <reg> */
e150acc7
PB
4850 if (bits (this_instr, 4, 27) == 0x12fff1
4851 || bits (this_instr, 4, 27) == 0x12fff3)
9498281f
DJ
4852 {
4853 rn = bits (this_instr, 0, 3);
bf9f652a
YQ
4854 nextpc = ((rn == ARM_PC_REGNUM)
4855 ? (pc_val + 8)
4856 : get_frame_register_unsigned (frame, rn));
4857
9498281f
DJ
4858 return nextpc;
4859 }
4860
0963b4bd 4861 /* Multiply into PC. */
c906108c
SS
4862 c = (status & FLAG_C) ? 1 : 0;
4863 rn = bits (this_instr, 16, 19);
bf9f652a
YQ
4864 operand1 = ((rn == ARM_PC_REGNUM)
4865 ? (pc_val + 8)
4866 : get_frame_register_unsigned (frame, rn));
c5aa993b 4867
c906108c
SS
4868 if (bit (this_instr, 25))
4869 {
4870 unsigned long immval = bits (this_instr, 0, 7);
4871 unsigned long rotate = 2 * bits (this_instr, 8, 11);
c5aa993b
JM
4872 operand2 = ((immval >> rotate) | (immval << (32 - rotate)))
4873 & 0xffffffff;
c906108c 4874 }
0963b4bd
MS
4875 else /* operand 2 is a shifted register. */
4876 operand2 = shifted_reg_val (frame, this_instr, c,
4877 pc_val, status);
c5aa993b 4878
c906108c
SS
4879 switch (bits (this_instr, 21, 24))
4880 {
c5aa993b 4881 case 0x0: /*and */
c906108c
SS
4882 result = operand1 & operand2;
4883 break;
4884
c5aa993b 4885 case 0x1: /*eor */
c906108c
SS
4886 result = operand1 ^ operand2;
4887 break;
4888
c5aa993b 4889 case 0x2: /*sub */
c906108c
SS
4890 result = operand1 - operand2;
4891 break;
4892
c5aa993b 4893 case 0x3: /*rsb */
c906108c
SS
4894 result = operand2 - operand1;
4895 break;
4896
c5aa993b 4897 case 0x4: /*add */
c906108c
SS
4898 result = operand1 + operand2;
4899 break;
4900
c5aa993b 4901 case 0x5: /*adc */
c906108c
SS
4902 result = operand1 + operand2 + c;
4903 break;
4904
c5aa993b 4905 case 0x6: /*sbc */
c906108c
SS
4906 result = operand1 - operand2 + c;
4907 break;
4908
c5aa993b 4909 case 0x7: /*rsc */
c906108c
SS
4910 result = operand2 - operand1 + c;
4911 break;
4912
c5aa993b
JM
4913 case 0x8:
4914 case 0x9:
4915 case 0xa:
4916 case 0xb: /* tst, teq, cmp, cmn */
c906108c
SS
4917 result = (unsigned long) nextpc;
4918 break;
4919
c5aa993b 4920 case 0xc: /*orr */
c906108c
SS
4921 result = operand1 | operand2;
4922 break;
4923
c5aa993b 4924 case 0xd: /*mov */
c906108c
SS
4925 /* Always step into a function. */
4926 result = operand2;
c5aa993b 4927 break;
c906108c 4928
c5aa993b 4929 case 0xe: /*bic */
c906108c
SS
4930 result = operand1 & ~operand2;
4931 break;
4932
c5aa993b 4933 case 0xf: /*mvn */
c906108c
SS
4934 result = ~operand2;
4935 break;
4936 }
c906108c 4937
50e98be4
DJ
4938 /* In 26-bit APCS the bottom two bits of the result are
4939 ignored, and we always end up in ARM state. */
4940 if (!arm_apcs_32)
4941 nextpc = arm_addr_bits_remove (gdbarch, result);
4942 else
4943 nextpc = result;
4944
c906108c
SS
4945 break;
4946 }
c5aa993b
JM
4947
4948 case 0x4:
4949 case 0x5: /* data transfer */
4950 case 0x6:
4951 case 0x7:
7b9be803
YQ
4952 if (bits (this_instr, 25, 27) == 0x3 && bit (this_instr, 4) == 1)
4953 {
4954 /* Media instructions and architecturally undefined
4955 instructions. */
4956 break;
4957 }
4958
c906108c
SS
4959 if (bit (this_instr, 20))
4960 {
4961 /* load */
4962 if (bits (this_instr, 12, 15) == 15)
4963 {
4964 /* rd == pc */
c5aa993b 4965 unsigned long rn;
c906108c 4966 unsigned long base;
c5aa993b 4967
c906108c 4968 if (bit (this_instr, 22))
edefbb7c 4969 error (_("Invalid update to pc in instruction"));
c906108c
SS
4970
4971 /* byte write to PC */
4972 rn = bits (this_instr, 16, 19);
bf9f652a
YQ
4973 base = ((rn == ARM_PC_REGNUM)
4974 ? (pc_val + 8)
4975 : get_frame_register_unsigned (frame, rn));
4976
c906108c
SS
4977 if (bit (this_instr, 24))
4978 {
4979 /* pre-indexed */
4980 int c = (status & FLAG_C) ? 1 : 0;
4981 unsigned long offset =
c5aa993b 4982 (bit (this_instr, 25)
0b1b3e42 4983 ? shifted_reg_val (frame, this_instr, c, pc_val, status)
c5aa993b 4984 : bits (this_instr, 0, 11));
c906108c
SS
4985
4986 if (bit (this_instr, 23))
4987 base += offset;
4988 else
4989 base -= offset;
4990 }
51370a33
YQ
4991 nextpc =
4992 (CORE_ADDR) read_memory_unsigned_integer ((CORE_ADDR) base,
4993 4, byte_order);
c906108c
SS
4994 }
4995 }
4996 break;
c5aa993b
JM
4997
4998 case 0x8:
4999 case 0x9: /* block transfer */
c906108c
SS
5000 if (bit (this_instr, 20))
5001 {
5002 /* LDM */
5003 if (bit (this_instr, 15))
5004 {
5005 /* loading pc */
5006 int offset = 0;
51370a33
YQ
5007 unsigned long rn_val
5008 = get_frame_register_unsigned (frame,
5009 bits (this_instr, 16, 19));
c906108c
SS
5010
5011 if (bit (this_instr, 23))
5012 {
5013 /* up */
5014 unsigned long reglist = bits (this_instr, 0, 14);
5015 offset = bitcount (reglist) * 4;
c5aa993b 5016 if (bit (this_instr, 24)) /* pre */
c906108c
SS
5017 offset += 4;
5018 }
5019 else if (bit (this_instr, 24))
5020 offset = -4;
c5aa993b 5021
51370a33
YQ
5022 nextpc =
5023 (CORE_ADDR) read_memory_unsigned_integer ((CORE_ADDR)
5024 (rn_val + offset),
5025 4, byte_order);
c906108c
SS
5026 }
5027 }
5028 break;
c5aa993b
JM
5029
5030 case 0xb: /* branch & link */
5031 case 0xa: /* branch */
c906108c
SS
5032 {
5033 nextpc = BranchDest (pc, this_instr);
c906108c
SS
5034 break;
5035 }
c5aa993b
JM
5036
5037 case 0xc:
5038 case 0xd:
5039 case 0xe: /* coproc ops */
25b41d01 5040 break;
c5aa993b 5041 case 0xf: /* SWI */
25b41d01
YQ
5042 {
5043 struct gdbarch_tdep *tdep;
5044 tdep = gdbarch_tdep (gdbarch);
5045
5046 if (tdep->syscall_next_pc != NULL)
5047 nextpc = tdep->syscall_next_pc (frame);
5048
5049 }
c906108c
SS
5050 break;
5051
5052 default:
edefbb7c 5053 fprintf_filtered (gdb_stderr, _("Bad bit-field extraction\n"));
c906108c
SS
5054 return (pc);
5055 }
5056 }
5057
5058 return nextpc;
5059}
5060
18819fa6
UW
5061/* Determine next PC after current instruction executes. Will call either
5062 arm_get_next_pc_raw or thumb_get_next_pc_raw. Error out if infinite
5063 loop is detected. */
5064
50e98be4
DJ
5065CORE_ADDR
5066arm_get_next_pc (struct frame_info *frame, CORE_ADDR pc)
5067{
18819fa6
UW
5068 CORE_ADDR nextpc;
5069
5070 if (arm_frame_is_thumb (frame))
2b59118e 5071 nextpc = thumb_get_next_pc_raw (frame, pc);
18819fa6 5072 else
2b59118e 5073 nextpc = arm_get_next_pc_raw (frame, pc);
18819fa6 5074
50e98be4
DJ
5075 return nextpc;
5076}
5077
18819fa6
UW
5078/* Like insert_single_step_breakpoint, but make sure we use a breakpoint
5079 of the appropriate mode (as encoded in the PC value), even if this
5080 differs from what would be expected according to the symbol tables. */
5081
5082void
5083arm_insert_single_step_breakpoint (struct gdbarch *gdbarch,
5084 struct address_space *aspace,
5085 CORE_ADDR pc)
5086{
5087 struct cleanup *old_chain
5088 = make_cleanup_restore_integer (&arm_override_mode);
5089
5090 arm_override_mode = IS_THUMB_ADDR (pc);
5091 pc = gdbarch_addr_bits_remove (gdbarch, pc);
5092
5093 insert_single_step_breakpoint (gdbarch, aspace, pc);
5094
5095 do_cleanups (old_chain);
5096}
5097
35f73cfc
UW
5098/* Checks for an atomic sequence of instructions beginning with a LDREX{,B,H,D}
5099 instruction and ending with a STREX{,B,H,D} instruction. If such a sequence
5100 is found, attempt to step through it. A breakpoint is placed at the end of
5101 the sequence. */
5102
5103static int
5104thumb_deal_with_atomic_sequence_raw (struct frame_info *frame)
5105{
5106 struct gdbarch *gdbarch = get_frame_arch (frame);
5107 struct address_space *aspace = get_frame_address_space (frame);
5108 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
5109 CORE_ADDR pc = get_frame_pc (frame);
5110 CORE_ADDR breaks[2] = {-1, -1};
5111 CORE_ADDR loc = pc;
5112 unsigned short insn1, insn2;
5113 int insn_count;
5114 int index;
5115 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
5116 const int atomic_sequence_length = 16; /* Instruction sequence length. */
5117 ULONGEST status, itstate;
5118
5119 /* We currently do not support atomic sequences within an IT block. */
5120 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
5121 itstate = ((status >> 8) & 0xfc) | ((status >> 25) & 0x3);
5122 if (itstate & 0x0f)
5123 return 0;
5124
5125 /* Assume all atomic sequences start with a ldrex{,b,h,d} instruction. */
5126 insn1 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
5127 loc += 2;
5128 if (thumb_insn_size (insn1) != 4)
5129 return 0;
5130
5131 insn2 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
5132 loc += 2;
5133 if (!((insn1 & 0xfff0) == 0xe850
5134 || ((insn1 & 0xfff0) == 0xe8d0 && (insn2 & 0x00c0) == 0x0040)))
5135 return 0;
5136
5137 /* Assume that no atomic sequence is longer than "atomic_sequence_length"
5138 instructions. */
5139 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
5140 {
5141 insn1 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
5142 loc += 2;
5143
5144 if (thumb_insn_size (insn1) != 4)
5145 {
5146 /* Assume that there is at most one conditional branch in the
5147 atomic sequence. If a conditional branch is found, put a
5148 breakpoint in its destination address. */
5149 if ((insn1 & 0xf000) == 0xd000 && bits (insn1, 8, 11) != 0x0f)
5150 {
5151 if (last_breakpoint > 0)
5152 return 0; /* More than one conditional branch found,
5153 fallback to the standard code. */
5154
5155 breaks[1] = loc + 2 + (sbits (insn1, 0, 7) << 1);
5156 last_breakpoint++;
5157 }
5158
5159 /* We do not support atomic sequences that use any *other*
5160 instructions but conditional branches to change the PC.
5161 Fall back to standard code to avoid losing control of
5162 execution. */
5163 else if (thumb_instruction_changes_pc (insn1))
5164 return 0;
5165 }
5166 else
5167 {
5168 insn2 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
5169 loc += 2;
5170
5171 /* Assume that there is at most one conditional branch in the
5172 atomic sequence. If a conditional branch is found, put a
5173 breakpoint in its destination address. */
5174 if ((insn1 & 0xf800) == 0xf000
5175 && (insn2 & 0xd000) == 0x8000
5176 && (insn1 & 0x0380) != 0x0380)
5177 {
5178 int sign, j1, j2, imm1, imm2;
5179 unsigned int offset;
5180
5181 sign = sbits (insn1, 10, 10);
5182 imm1 = bits (insn1, 0, 5);
5183 imm2 = bits (insn2, 0, 10);
5184 j1 = bit (insn2, 13);
5185 j2 = bit (insn2, 11);
5186
5187 offset = (sign << 20) + (j2 << 19) + (j1 << 18);
5188 offset += (imm1 << 12) + (imm2 << 1);
5189
5190 if (last_breakpoint > 0)
5191 return 0; /* More than one conditional branch found,
5192 fallback to the standard code. */
5193
5194 breaks[1] = loc + offset;
5195 last_breakpoint++;
5196 }
5197
5198 /* We do not support atomic sequences that use any *other*
5199 instructions but conditional branches to change the PC.
5200 Fall back to standard code to avoid losing control of
5201 execution. */
5202 else if (thumb2_instruction_changes_pc (insn1, insn2))
5203 return 0;
5204
5205 /* If we find a strex{,b,h,d}, we're done. */
5206 if ((insn1 & 0xfff0) == 0xe840
5207 || ((insn1 & 0xfff0) == 0xe8c0 && (insn2 & 0x00c0) == 0x0040))
5208 break;
5209 }
5210 }
5211
5212 /* If we didn't find the strex{,b,h,d}, we cannot handle the sequence. */
5213 if (insn_count == atomic_sequence_length)
5214 return 0;
5215
5216 /* Insert a breakpoint right after the end of the atomic sequence. */
5217 breaks[0] = loc;
5218
5219 /* Check for duplicated breakpoints. Check also for a breakpoint
5220 placed (branch instruction's destination) anywhere in sequence. */
5221 if (last_breakpoint
5222 && (breaks[1] == breaks[0]
5223 || (breaks[1] >= pc && breaks[1] < loc)))
5224 last_breakpoint = 0;
5225
5226 /* Effectively inserts the breakpoints. */
5227 for (index = 0; index <= last_breakpoint; index++)
5228 arm_insert_single_step_breakpoint (gdbarch, aspace,
5229 MAKE_THUMB_ADDR (breaks[index]));
5230
5231 return 1;
5232}
5233
5234static int
5235arm_deal_with_atomic_sequence_raw (struct frame_info *frame)
5236{
5237 struct gdbarch *gdbarch = get_frame_arch (frame);
5238 struct address_space *aspace = get_frame_address_space (frame);
5239 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
5240 CORE_ADDR pc = get_frame_pc (frame);
5241 CORE_ADDR breaks[2] = {-1, -1};
5242 CORE_ADDR loc = pc;
5243 unsigned int insn;
5244 int insn_count;
5245 int index;
5246 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
5247 const int atomic_sequence_length = 16; /* Instruction sequence length. */
5248
5249 /* Assume all atomic sequences start with a ldrex{,b,h,d} instruction.
5250 Note that we do not currently support conditionally executed atomic
5251 instructions. */
5252 insn = read_memory_unsigned_integer (loc, 4, byte_order_for_code);
5253 loc += 4;
5254 if ((insn & 0xff9000f0) != 0xe1900090)
5255 return 0;
5256
5257 /* Assume that no atomic sequence is longer than "atomic_sequence_length"
5258 instructions. */
5259 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
5260 {
5261 insn = read_memory_unsigned_integer (loc, 4, byte_order_for_code);
5262 loc += 4;
5263
5264 /* Assume that there is at most one conditional branch in the atomic
5265 sequence. If a conditional branch is found, put a breakpoint in
5266 its destination address. */
5267 if (bits (insn, 24, 27) == 0xa)
5268 {
5269 if (last_breakpoint > 0)
5270 return 0; /* More than one conditional branch found, fallback
5271 to the standard single-step code. */
5272
5273 breaks[1] = BranchDest (loc - 4, insn);
5274 last_breakpoint++;
5275 }
5276
5277 /* We do not support atomic sequences that use any *other* instructions
5278 but conditional branches to change the PC. Fall back to standard
5279 code to avoid losing control of execution. */
5280 else if (arm_instruction_changes_pc (insn))
5281 return 0;
5282
5283 /* If we find a strex{,b,h,d}, we're done. */
5284 if ((insn & 0xff9000f0) == 0xe1800090)
5285 break;
5286 }
5287
5288 /* If we didn't find the strex{,b,h,d}, we cannot handle the sequence. */
5289 if (insn_count == atomic_sequence_length)
5290 return 0;
5291
5292 /* Insert a breakpoint right after the end of the atomic sequence. */
5293 breaks[0] = loc;
5294
5295 /* Check for duplicated breakpoints. Check also for a breakpoint
5296 placed (branch instruction's destination) anywhere in sequence. */
5297 if (last_breakpoint
5298 && (breaks[1] == breaks[0]
5299 || (breaks[1] >= pc && breaks[1] < loc)))
5300 last_breakpoint = 0;
5301
5302 /* Effectively inserts the breakpoints. */
5303 for (index = 0; index <= last_breakpoint; index++)
5304 arm_insert_single_step_breakpoint (gdbarch, aspace, breaks[index]);
5305
5306 return 1;
5307}
5308
5309int
5310arm_deal_with_atomic_sequence (struct frame_info *frame)
5311{
5312 if (arm_frame_is_thumb (frame))
5313 return thumb_deal_with_atomic_sequence_raw (frame);
5314 else
5315 return arm_deal_with_atomic_sequence_raw (frame);
5316}
5317
9512d7fd
FN
5318/* single_step() is called just before we want to resume the inferior,
5319 if we want to single-step it but there is no hardware or kernel
5320 single-step support. We find the target of the coming instruction
e0cd558a 5321 and breakpoint it. */
9512d7fd 5322
190dce09 5323int
0b1b3e42 5324arm_software_single_step (struct frame_info *frame)
9512d7fd 5325{
a6d9a66e 5326 struct gdbarch *gdbarch = get_frame_arch (frame);
6c95b8df 5327 struct address_space *aspace = get_frame_address_space (frame);
35f73cfc
UW
5328 CORE_ADDR next_pc;
5329
5330 if (arm_deal_with_atomic_sequence (frame))
5331 return 1;
18819fa6 5332
35f73cfc 5333 next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
18819fa6 5334 arm_insert_single_step_breakpoint (gdbarch, aspace, next_pc);
e6590a1b
UW
5335
5336 return 1;
9512d7fd 5337}
9512d7fd 5338
f9d67f43
DJ
5339/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
5340 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
5341 NULL if an error occurs. BUF is freed. */
5342
5343static gdb_byte *
5344extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
5345 int old_len, int new_len)
5346{
22e048c9 5347 gdb_byte *new_buf;
f9d67f43
DJ
5348 int bytes_to_read = new_len - old_len;
5349
224c3ddb 5350 new_buf = (gdb_byte *) xmalloc (new_len);
f9d67f43
DJ
5351 memcpy (new_buf + bytes_to_read, buf, old_len);
5352 xfree (buf);
5353 if (target_read_memory (endaddr - new_len, new_buf, bytes_to_read) != 0)
5354 {
5355 xfree (new_buf);
5356 return NULL;
5357 }
5358 return new_buf;
5359}
5360
5361/* An IT block is at most the 2-byte IT instruction followed by
5362 four 4-byte instructions. The furthest back we must search to
5363 find an IT block that affects the current instruction is thus
5364 2 + 3 * 4 == 14 bytes. */
5365#define MAX_IT_BLOCK_PREFIX 14
5366
5367/* Use a quick scan if there are more than this many bytes of
5368 code. */
5369#define IT_SCAN_THRESHOLD 32
5370
5371/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
5372 A breakpoint in an IT block may not be hit, depending on the
5373 condition flags. */
5374static CORE_ADDR
5375arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
5376{
5377 gdb_byte *buf;
5378 char map_type;
5379 CORE_ADDR boundary, func_start;
22e048c9 5380 int buf_len;
f9d67f43
DJ
5381 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
5382 int i, any, last_it, last_it_count;
5383
5384 /* If we are using BKPT breakpoints, none of this is necessary. */
5385 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
5386 return bpaddr;
5387
5388 /* ARM mode does not have this problem. */
9779414d 5389 if (!arm_pc_is_thumb (gdbarch, bpaddr))
f9d67f43
DJ
5390 return bpaddr;
5391
5392 /* We are setting a breakpoint in Thumb code that could potentially
5393 contain an IT block. The first step is to find how much Thumb
5394 code there is; we do not need to read outside of known Thumb
5395 sequences. */
5396 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
5397 if (map_type == 0)
5398 /* Thumb-2 code must have mapping symbols to have a chance. */
5399 return bpaddr;
5400
5401 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
5402
5403 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
5404 && func_start > boundary)
5405 boundary = func_start;
5406
5407 /* Search for a candidate IT instruction. We have to do some fancy
5408 footwork to distinguish a real IT instruction from the second
5409 half of a 32-bit instruction, but there is no need for that if
5410 there's no candidate. */
5411 buf_len = min (bpaddr - boundary, MAX_IT_BLOCK_PREFIX);
5412 if (buf_len == 0)
5413 /* No room for an IT instruction. */
5414 return bpaddr;
5415
224c3ddb 5416 buf = (gdb_byte *) xmalloc (buf_len);
f9d67f43
DJ
5417 if (target_read_memory (bpaddr - buf_len, buf, buf_len) != 0)
5418 return bpaddr;
5419 any = 0;
5420 for (i = 0; i < buf_len; i += 2)
5421 {
5422 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5423 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5424 {
5425 any = 1;
5426 break;
5427 }
5428 }
5429 if (any == 0)
5430 {
5431 xfree (buf);
5432 return bpaddr;
5433 }
5434
5435 /* OK, the code bytes before this instruction contain at least one
5436 halfword which resembles an IT instruction. We know that it's
5437 Thumb code, but there are still two possibilities. Either the
5438 halfword really is an IT instruction, or it is the second half of
5439 a 32-bit Thumb instruction. The only way we can tell is to
5440 scan forwards from a known instruction boundary. */
5441 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
5442 {
5443 int definite;
5444
5445 /* There's a lot of code before this instruction. Start with an
5446 optimistic search; it's easy to recognize halfwords that can
5447 not be the start of a 32-bit instruction, and use that to
5448 lock on to the instruction boundaries. */
5449 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
5450 if (buf == NULL)
5451 return bpaddr;
5452 buf_len = IT_SCAN_THRESHOLD;
5453
5454 definite = 0;
5455 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
5456 {
5457 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5458 if (thumb_insn_size (inst1) == 2)
5459 {
5460 definite = 1;
5461 break;
5462 }
5463 }
5464
5465 /* At this point, if DEFINITE, BUF[I] is the first place we
5466 are sure that we know the instruction boundaries, and it is far
5467 enough from BPADDR that we could not miss an IT instruction
5468 affecting BPADDR. If ! DEFINITE, give up - start from a
5469 known boundary. */
5470 if (! definite)
5471 {
0963b4bd
MS
5472 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
5473 bpaddr - boundary);
f9d67f43
DJ
5474 if (buf == NULL)
5475 return bpaddr;
5476 buf_len = bpaddr - boundary;
5477 i = 0;
5478 }
5479 }
5480 else
5481 {
5482 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
5483 if (buf == NULL)
5484 return bpaddr;
5485 buf_len = bpaddr - boundary;
5486 i = 0;
5487 }
5488
5489 /* Scan forwards. Find the last IT instruction before BPADDR. */
5490 last_it = -1;
5491 last_it_count = 0;
5492 while (i < buf_len)
5493 {
5494 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5495 last_it_count--;
5496 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5497 {
5498 last_it = i;
5499 if (inst1 & 0x0001)
5500 last_it_count = 4;
5501 else if (inst1 & 0x0002)
5502 last_it_count = 3;
5503 else if (inst1 & 0x0004)
5504 last_it_count = 2;
5505 else
5506 last_it_count = 1;
5507 }
5508 i += thumb_insn_size (inst1);
5509 }
5510
5511 xfree (buf);
5512
5513 if (last_it == -1)
5514 /* There wasn't really an IT instruction after all. */
5515 return bpaddr;
5516
5517 if (last_it_count < 1)
5518 /* It was too far away. */
5519 return bpaddr;
5520
5521 /* This really is a trouble spot. Move the breakpoint to the IT
5522 instruction. */
5523 return bpaddr - buf_len + last_it;
5524}
5525
cca44b1b 5526/* ARM displaced stepping support.
c906108c 5527
cca44b1b 5528 Generally ARM displaced stepping works as follows:
c906108c 5529
cca44b1b
JB
5530 1. When an instruction is to be single-stepped, it is first decoded by
5531 arm_process_displaced_insn (called from arm_displaced_step_copy_insn).
5532 Depending on the type of instruction, it is then copied to a scratch
5533 location, possibly in a modified form. The copy_* set of functions
0963b4bd 5534 performs such modification, as necessary. A breakpoint is placed after
cca44b1b
JB
5535 the modified instruction in the scratch space to return control to GDB.
5536 Note in particular that instructions which modify the PC will no longer
5537 do so after modification.
c5aa993b 5538
cca44b1b
JB
5539 2. The instruction is single-stepped, by setting the PC to the scratch
5540 location address, and resuming. Control returns to GDB when the
5541 breakpoint is hit.
c5aa993b 5542
cca44b1b
JB
5543 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
5544 function used for the current instruction. This function's job is to
5545 put the CPU/memory state back to what it would have been if the
5546 instruction had been executed unmodified in its original location. */
c5aa993b 5547
cca44b1b
JB
5548/* NOP instruction (mov r0, r0). */
5549#define ARM_NOP 0xe1a00000
34518530 5550#define THUMB_NOP 0x4600
cca44b1b
JB
5551
5552/* Helper for register reads for displaced stepping. In particular, this
5553 returns the PC as it would be seen by the instruction at its original
5554 location. */
5555
5556ULONGEST
36073a92
YQ
5557displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
5558 int regno)
cca44b1b
JB
5559{
5560 ULONGEST ret;
36073a92 5561 CORE_ADDR from = dsc->insn_addr;
cca44b1b 5562
bf9f652a 5563 if (regno == ARM_PC_REGNUM)
cca44b1b 5564 {
4db71c0b
YQ
5565 /* Compute pipeline offset:
5566 - When executing an ARM instruction, PC reads as the address of the
5567 current instruction plus 8.
5568 - When executing a Thumb instruction, PC reads as the address of the
5569 current instruction plus 4. */
5570
36073a92 5571 if (!dsc->is_thumb)
4db71c0b
YQ
5572 from += 8;
5573 else
5574 from += 4;
5575
cca44b1b
JB
5576 if (debug_displaced)
5577 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
5578 (unsigned long) from);
5579 return (ULONGEST) from;
cca44b1b 5580 }
c906108c 5581 else
cca44b1b
JB
5582 {
5583 regcache_cooked_read_unsigned (regs, regno, &ret);
5584 if (debug_displaced)
5585 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
5586 regno, (unsigned long) ret);
5587 return ret;
5588 }
c906108c
SS
5589}
5590
cca44b1b
JB
5591static int
5592displaced_in_arm_mode (struct regcache *regs)
5593{
5594 ULONGEST ps;
9779414d 5595 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
66e810cd 5596
cca44b1b 5597 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 5598
9779414d 5599 return (ps & t_bit) == 0;
cca44b1b 5600}
66e810cd 5601
cca44b1b 5602/* Write to the PC as from a branch instruction. */
c906108c 5603
cca44b1b 5604static void
36073a92
YQ
5605branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5606 ULONGEST val)
c906108c 5607{
36073a92 5608 if (!dsc->is_thumb)
cca44b1b
JB
5609 /* Note: If bits 0/1 are set, this branch would be unpredictable for
5610 architecture versions < 6. */
0963b4bd
MS
5611 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5612 val & ~(ULONGEST) 0x3);
cca44b1b 5613 else
0963b4bd
MS
5614 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5615 val & ~(ULONGEST) 0x1);
cca44b1b 5616}
66e810cd 5617
cca44b1b
JB
5618/* Write to the PC as from a branch-exchange instruction. */
5619
5620static void
5621bx_write_pc (struct regcache *regs, ULONGEST val)
5622{
5623 ULONGEST ps;
9779414d 5624 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
cca44b1b
JB
5625
5626 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5627
5628 if ((val & 1) == 1)
c906108c 5629 {
9779414d 5630 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
5631 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
5632 }
5633 else if ((val & 2) == 0)
5634 {
9779414d 5635 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 5636 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
5637 }
5638 else
5639 {
cca44b1b
JB
5640 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
5641 mode, align dest to 4 bytes). */
5642 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 5643 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 5644 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
5645 }
5646}
ed9a39eb 5647
cca44b1b 5648/* Write to the PC as if from a load instruction. */
ed9a39eb 5649
34e8f22d 5650static void
36073a92
YQ
5651load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5652 ULONGEST val)
ed9a39eb 5653{
cca44b1b
JB
5654 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
5655 bx_write_pc (regs, val);
5656 else
36073a92 5657 branch_write_pc (regs, dsc, val);
cca44b1b 5658}
be8626e0 5659
cca44b1b
JB
5660/* Write to the PC as if from an ALU instruction. */
5661
5662static void
36073a92
YQ
5663alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5664 ULONGEST val)
cca44b1b 5665{
36073a92 5666 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
5667 bx_write_pc (regs, val);
5668 else
36073a92 5669 branch_write_pc (regs, dsc, val);
cca44b1b
JB
5670}
5671
5672/* Helper for writing to registers for displaced stepping. Writing to the PC
5673 has a varying effects depending on the instruction which does the write:
5674 this is controlled by the WRITE_PC argument. */
5675
5676void
5677displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
5678 int regno, ULONGEST val, enum pc_write_style write_pc)
5679{
bf9f652a 5680 if (regno == ARM_PC_REGNUM)
08216dd7 5681 {
cca44b1b
JB
5682 if (debug_displaced)
5683 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
5684 (unsigned long) val);
5685 switch (write_pc)
08216dd7 5686 {
cca44b1b 5687 case BRANCH_WRITE_PC:
36073a92 5688 branch_write_pc (regs, dsc, val);
08216dd7
RE
5689 break;
5690
cca44b1b
JB
5691 case BX_WRITE_PC:
5692 bx_write_pc (regs, val);
5693 break;
5694
5695 case LOAD_WRITE_PC:
36073a92 5696 load_write_pc (regs, dsc, val);
cca44b1b
JB
5697 break;
5698
5699 case ALU_WRITE_PC:
36073a92 5700 alu_write_pc (regs, dsc, val);
cca44b1b
JB
5701 break;
5702
5703 case CANNOT_WRITE_PC:
5704 warning (_("Instruction wrote to PC in an unexpected way when "
5705 "single-stepping"));
08216dd7
RE
5706 break;
5707
5708 default:
97b9747c
JB
5709 internal_error (__FILE__, __LINE__,
5710 _("Invalid argument to displaced_write_reg"));
08216dd7 5711 }
b508a996 5712
cca44b1b 5713 dsc->wrote_to_pc = 1;
b508a996 5714 }
ed9a39eb 5715 else
b508a996 5716 {
cca44b1b
JB
5717 if (debug_displaced)
5718 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
5719 regno, (unsigned long) val);
5720 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 5721 }
34e8f22d
RE
5722}
5723
cca44b1b
JB
5724/* This function is used to concisely determine if an instruction INSN
5725 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
5726 corresponding fields of BITMASK set to 0b1111. The function
5727 returns return 1 if any of these fields in INSN reference the PC
5728 (also 0b1111, r15), else it returns 0. */
67255d04
RE
5729
5730static int
cca44b1b 5731insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 5732{
cca44b1b 5733 uint32_t lowbit = 1;
67255d04 5734
cca44b1b
JB
5735 while (bitmask != 0)
5736 {
5737 uint32_t mask;
44e1a9eb 5738
cca44b1b
JB
5739 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
5740 ;
67255d04 5741
cca44b1b
JB
5742 if (!lowbit)
5743 break;
67255d04 5744
cca44b1b 5745 mask = lowbit * 0xf;
67255d04 5746
cca44b1b
JB
5747 if ((insn & mask) == mask)
5748 return 1;
5749
5750 bitmask &= ~mask;
67255d04
RE
5751 }
5752
cca44b1b
JB
5753 return 0;
5754}
2af48f68 5755
cca44b1b
JB
5756/* The simplest copy function. Many instructions have the same effect no
5757 matter what address they are executed at: in those cases, use this. */
67255d04 5758
cca44b1b 5759static int
7ff120b4
YQ
5760arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
5761 const char *iname, struct displaced_step_closure *dsc)
cca44b1b
JB
5762{
5763 if (debug_displaced)
5764 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
5765 "opcode/class '%s' unmodified\n", (unsigned long) insn,
5766 iname);
67255d04 5767
cca44b1b 5768 dsc->modinsn[0] = insn;
67255d04 5769
cca44b1b
JB
5770 return 0;
5771}
5772
34518530
YQ
5773static int
5774thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
5775 uint16_t insn2, const char *iname,
5776 struct displaced_step_closure *dsc)
5777{
5778 if (debug_displaced)
5779 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
5780 "opcode/class '%s' unmodified\n", insn1, insn2,
5781 iname);
5782
5783 dsc->modinsn[0] = insn1;
5784 dsc->modinsn[1] = insn2;
5785 dsc->numinsns = 2;
5786
5787 return 0;
5788}
5789
5790/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
5791 modification. */
5792static int
5793thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, unsigned int insn,
5794 const char *iname,
5795 struct displaced_step_closure *dsc)
5796{
5797 if (debug_displaced)
5798 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
5799 "opcode/class '%s' unmodified\n", insn,
5800 iname);
5801
5802 dsc->modinsn[0] = insn;
5803
5804 return 0;
5805}
5806
cca44b1b
JB
5807/* Preload instructions with immediate offset. */
5808
5809static void
6e39997a 5810cleanup_preload (struct gdbarch *gdbarch,
cca44b1b
JB
5811 struct regcache *regs, struct displaced_step_closure *dsc)
5812{
5813 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5814 if (!dsc->u.preload.immed)
5815 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5816}
5817
7ff120b4
YQ
5818static void
5819install_preload (struct gdbarch *gdbarch, struct regcache *regs,
5820 struct displaced_step_closure *dsc, unsigned int rn)
cca44b1b 5821{
cca44b1b 5822 ULONGEST rn_val;
cca44b1b
JB
5823 /* Preload instructions:
5824
5825 {pli/pld} [rn, #+/-imm]
5826 ->
5827 {pli/pld} [r0, #+/-imm]. */
5828
36073a92
YQ
5829 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5830 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5831 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
5832 dsc->u.preload.immed = 1;
5833
cca44b1b 5834 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
5835}
5836
cca44b1b 5837static int
7ff120b4 5838arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cca44b1b
JB
5839 struct displaced_step_closure *dsc)
5840{
5841 unsigned int rn = bits (insn, 16, 19);
cca44b1b 5842
7ff120b4
YQ
5843 if (!insn_references_pc (insn, 0x000f0000ul))
5844 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
5845
5846 if (debug_displaced)
5847 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
5848 (unsigned long) insn);
5849
7ff120b4
YQ
5850 dsc->modinsn[0] = insn & 0xfff0ffff;
5851
5852 install_preload (gdbarch, regs, dsc, rn);
5853
5854 return 0;
5855}
5856
34518530
YQ
5857static int
5858thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
5859 struct regcache *regs, struct displaced_step_closure *dsc)
5860{
5861 unsigned int rn = bits (insn1, 0, 3);
5862 unsigned int u_bit = bit (insn1, 7);
5863 int imm12 = bits (insn2, 0, 11);
5864 ULONGEST pc_val;
5865
5866 if (rn != ARM_PC_REGNUM)
5867 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
5868
5869 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
5870 PLD (literal) Encoding T1. */
5871 if (debug_displaced)
5872 fprintf_unfiltered (gdb_stdlog,
5873 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
5874 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
5875 imm12);
5876
5877 if (!u_bit)
5878 imm12 = -1 * imm12;
5879
5880 /* Rewrite instruction {pli/pld} PC imm12 into:
5881 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
5882
5883 {pli/pld} [r0, r1]
5884
5885 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
5886
5887 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5888 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5889
5890 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5891
5892 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
5893 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
5894 dsc->u.preload.immed = 0;
5895
5896 /* {pli/pld} [r0, r1] */
5897 dsc->modinsn[0] = insn1 & 0xfff0;
5898 dsc->modinsn[1] = 0xf001;
5899 dsc->numinsns = 2;
5900
5901 dsc->cleanup = &cleanup_preload;
5902 return 0;
5903}
5904
7ff120b4
YQ
5905/* Preload instructions with register offset. */
5906
5907static void
5908install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
5909 struct displaced_step_closure *dsc, unsigned int rn,
5910 unsigned int rm)
5911{
5912 ULONGEST rn_val, rm_val;
5913
cca44b1b
JB
5914 /* Preload register-offset instructions:
5915
5916 {pli/pld} [rn, rm {, shift}]
5917 ->
5918 {pli/pld} [r0, r1 {, shift}]. */
5919
36073a92
YQ
5920 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5921 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5922 rn_val = displaced_read_reg (regs, dsc, rn);
5923 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5924 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5925 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
5926 dsc->u.preload.immed = 0;
5927
cca44b1b 5928 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
5929}
5930
5931static int
5932arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
5933 struct regcache *regs,
5934 struct displaced_step_closure *dsc)
5935{
5936 unsigned int rn = bits (insn, 16, 19);
5937 unsigned int rm = bits (insn, 0, 3);
5938
5939
5940 if (!insn_references_pc (insn, 0x000f000ful))
5941 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
5942
5943 if (debug_displaced)
5944 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
5945 (unsigned long) insn);
5946
5947 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 5948
7ff120b4 5949 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
5950 return 0;
5951}
5952
5953/* Copy/cleanup coprocessor load and store instructions. */
5954
5955static void
6e39997a 5956cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b
JB
5957 struct regcache *regs,
5958 struct displaced_step_closure *dsc)
5959{
36073a92 5960 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5961
5962 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5963
5964 if (dsc->u.ldst.writeback)
5965 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
5966}
5967
7ff120b4
YQ
5968static void
5969install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5970 struct displaced_step_closure *dsc,
5971 int writeback, unsigned int rn)
cca44b1b 5972{
cca44b1b 5973 ULONGEST rn_val;
cca44b1b 5974
cca44b1b
JB
5975 /* Coprocessor load/store instructions:
5976
5977 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
5978 ->
5979 {stc/stc2} [r0, #+/-imm].
5980
5981 ldc/ldc2 are handled identically. */
5982
36073a92
YQ
5983 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5984 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
5985 /* PC should be 4-byte aligned. */
5986 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
5987 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5988
7ff120b4 5989 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5990 dsc->u.ldst.rn = rn;
5991
7ff120b4
YQ
5992 dsc->cleanup = &cleanup_copro_load_store;
5993}
5994
5995static int
5996arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
5997 struct regcache *regs,
5998 struct displaced_step_closure *dsc)
5999{
6000 unsigned int rn = bits (insn, 16, 19);
6001
6002 if (!insn_references_pc (insn, 0x000f0000ul))
6003 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
6004
6005 if (debug_displaced)
6006 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
6007 "load/store insn %.8lx\n", (unsigned long) insn);
6008
cca44b1b
JB
6009 dsc->modinsn[0] = insn & 0xfff0ffff;
6010
7ff120b4 6011 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
6012
6013 return 0;
6014}
6015
34518530
YQ
6016static int
6017thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
6018 uint16_t insn2, struct regcache *regs,
6019 struct displaced_step_closure *dsc)
6020{
6021 unsigned int rn = bits (insn1, 0, 3);
6022
6023 if (rn != ARM_PC_REGNUM)
6024 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6025 "copro load/store", dsc);
6026
6027 if (debug_displaced)
6028 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
6029 "load/store insn %.4x%.4x\n", insn1, insn2);
6030
6031 dsc->modinsn[0] = insn1 & 0xfff0;
6032 dsc->modinsn[1] = insn2;
6033 dsc->numinsns = 2;
6034
6035 /* This function is called for copying instruction LDC/LDC2/VLDR, which
6036 doesn't support writeback, so pass 0. */
6037 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
6038
6039 return 0;
6040}
6041
cca44b1b
JB
6042/* Clean up branch instructions (actually perform the branch, by setting
6043 PC). */
6044
6045static void
6e39997a 6046cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
6047 struct displaced_step_closure *dsc)
6048{
36073a92 6049 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
6050 int branch_taken = condition_true (dsc->u.branch.cond, status);
6051 enum pc_write_style write_pc = dsc->u.branch.exchange
6052 ? BX_WRITE_PC : BRANCH_WRITE_PC;
6053
6054 if (!branch_taken)
6055 return;
6056
6057 if (dsc->u.branch.link)
6058 {
8c8dba6d
YQ
6059 /* The value of LR should be the next insn of current one. In order
6060 not to confuse logic hanlding later insn `bx lr', if current insn mode
6061 is Thumb, the bit 0 of LR value should be set to 1. */
6062 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
6063
6064 if (dsc->is_thumb)
6065 next_insn_addr |= 0x1;
6066
6067 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
6068 CANNOT_WRITE_PC);
cca44b1b
JB
6069 }
6070
bf9f652a 6071 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
6072}
6073
6074/* Copy B/BL/BLX instructions with immediate destinations. */
6075
7ff120b4
YQ
6076static void
6077install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
6078 struct displaced_step_closure *dsc,
6079 unsigned int cond, int exchange, int link, long offset)
6080{
6081 /* Implement "BL<cond> <label>" as:
6082
6083 Preparation: cond <- instruction condition
6084 Insn: mov r0, r0 (nop)
6085 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
6086
6087 B<cond> similar, but don't set r14 in cleanup. */
6088
6089 dsc->u.branch.cond = cond;
6090 dsc->u.branch.link = link;
6091 dsc->u.branch.exchange = exchange;
6092
2b16b2e3
YQ
6093 dsc->u.branch.dest = dsc->insn_addr;
6094 if (link && exchange)
6095 /* For BLX, offset is computed from the Align (PC, 4). */
6096 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
6097
7ff120b4 6098 if (dsc->is_thumb)
2b16b2e3 6099 dsc->u.branch.dest += 4 + offset;
7ff120b4 6100 else
2b16b2e3 6101 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
6102
6103 dsc->cleanup = &cleanup_branch;
6104}
cca44b1b 6105static int
7ff120b4
YQ
6106arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
6107 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6108{
6109 unsigned int cond = bits (insn, 28, 31);
6110 int exchange = (cond == 0xf);
6111 int link = exchange || bit (insn, 24);
cca44b1b
JB
6112 long offset;
6113
6114 if (debug_displaced)
6115 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
6116 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
6117 (unsigned long) insn);
cca44b1b
JB
6118 if (exchange)
6119 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
6120 then arrange the switch into Thumb mode. */
6121 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
6122 else
6123 offset = bits (insn, 0, 23) << 2;
6124
6125 if (bit (offset, 25))
6126 offset = offset | ~0x3ffffff;
6127
cca44b1b
JB
6128 dsc->modinsn[0] = ARM_NOP;
6129
7ff120b4 6130 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
6131 return 0;
6132}
6133
34518530
YQ
6134static int
6135thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
6136 uint16_t insn2, struct regcache *regs,
6137 struct displaced_step_closure *dsc)
6138{
6139 int link = bit (insn2, 14);
6140 int exchange = link && !bit (insn2, 12);
6141 int cond = INST_AL;
6142 long offset = 0;
6143 int j1 = bit (insn2, 13);
6144 int j2 = bit (insn2, 11);
6145 int s = sbits (insn1, 10, 10);
6146 int i1 = !(j1 ^ bit (insn1, 10));
6147 int i2 = !(j2 ^ bit (insn1, 10));
6148
6149 if (!link && !exchange) /* B */
6150 {
6151 offset = (bits (insn2, 0, 10) << 1);
6152 if (bit (insn2, 12)) /* Encoding T4 */
6153 {
6154 offset |= (bits (insn1, 0, 9) << 12)
6155 | (i2 << 22)
6156 | (i1 << 23)
6157 | (s << 24);
6158 cond = INST_AL;
6159 }
6160 else /* Encoding T3 */
6161 {
6162 offset |= (bits (insn1, 0, 5) << 12)
6163 | (j1 << 18)
6164 | (j2 << 19)
6165 | (s << 20);
6166 cond = bits (insn1, 6, 9);
6167 }
6168 }
6169 else
6170 {
6171 offset = (bits (insn1, 0, 9) << 12);
6172 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
6173 offset |= exchange ?
6174 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
6175 }
6176
6177 if (debug_displaced)
6178 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
6179 "%.4x %.4x with offset %.8lx\n",
6180 link ? (exchange) ? "blx" : "bl" : "b",
6181 insn1, insn2, offset);
6182
6183 dsc->modinsn[0] = THUMB_NOP;
6184
6185 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
6186 return 0;
6187}
6188
6189/* Copy B Thumb instructions. */
6190static int
6191thumb_copy_b (struct gdbarch *gdbarch, unsigned short insn,
6192 struct displaced_step_closure *dsc)
6193{
6194 unsigned int cond = 0;
6195 int offset = 0;
6196 unsigned short bit_12_15 = bits (insn, 12, 15);
6197 CORE_ADDR from = dsc->insn_addr;
6198
6199 if (bit_12_15 == 0xd)
6200 {
6201 /* offset = SignExtend (imm8:0, 32) */
6202 offset = sbits ((insn << 1), 0, 8);
6203 cond = bits (insn, 8, 11);
6204 }
6205 else if (bit_12_15 == 0xe) /* Encoding T2 */
6206 {
6207 offset = sbits ((insn << 1), 0, 11);
6208 cond = INST_AL;
6209 }
6210
6211 if (debug_displaced)
6212 fprintf_unfiltered (gdb_stdlog,
6213 "displaced: copying b immediate insn %.4x "
6214 "with offset %d\n", insn, offset);
6215
6216 dsc->u.branch.cond = cond;
6217 dsc->u.branch.link = 0;
6218 dsc->u.branch.exchange = 0;
6219 dsc->u.branch.dest = from + 4 + offset;
6220
6221 dsc->modinsn[0] = THUMB_NOP;
6222
6223 dsc->cleanup = &cleanup_branch;
6224
6225 return 0;
6226}
6227
cca44b1b
JB
6228/* Copy BX/BLX with register-specified destinations. */
6229
7ff120b4
YQ
6230static void
6231install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
6232 struct displaced_step_closure *dsc, int link,
6233 unsigned int cond, unsigned int rm)
cca44b1b 6234{
cca44b1b
JB
6235 /* Implement {BX,BLX}<cond> <reg>" as:
6236
6237 Preparation: cond <- instruction condition
6238 Insn: mov r0, r0 (nop)
6239 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
6240
6241 Don't set r14 in cleanup for BX. */
6242
36073a92 6243 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6244
6245 dsc->u.branch.cond = cond;
6246 dsc->u.branch.link = link;
cca44b1b 6247
7ff120b4 6248 dsc->u.branch.exchange = 1;
cca44b1b
JB
6249
6250 dsc->cleanup = &cleanup_branch;
7ff120b4 6251}
cca44b1b 6252
7ff120b4
YQ
6253static int
6254arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
6255 struct regcache *regs, struct displaced_step_closure *dsc)
6256{
6257 unsigned int cond = bits (insn, 28, 31);
6258 /* BX: x12xxx1x
6259 BLX: x12xxx3x. */
6260 int link = bit (insn, 5);
6261 unsigned int rm = bits (insn, 0, 3);
6262
6263 if (debug_displaced)
6264 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
6265 (unsigned long) insn);
6266
6267 dsc->modinsn[0] = ARM_NOP;
6268
6269 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
6270 return 0;
6271}
6272
34518530
YQ
6273static int
6274thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
6275 struct regcache *regs,
6276 struct displaced_step_closure *dsc)
6277{
6278 int link = bit (insn, 7);
6279 unsigned int rm = bits (insn, 3, 6);
6280
6281 if (debug_displaced)
6282 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
6283 (unsigned short) insn);
6284
6285 dsc->modinsn[0] = THUMB_NOP;
6286
6287 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
6288
6289 return 0;
6290}
6291
6292
0963b4bd 6293/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
6294
6295static void
6e39997a 6296cleanup_alu_imm (struct gdbarch *gdbarch,
cca44b1b
JB
6297 struct regcache *regs, struct displaced_step_closure *dsc)
6298{
36073a92 6299 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6300 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6301 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6302 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6303}
6304
6305static int
7ff120b4
YQ
6306arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6307 struct displaced_step_closure *dsc)
cca44b1b
JB
6308{
6309 unsigned int rn = bits (insn, 16, 19);
6310 unsigned int rd = bits (insn, 12, 15);
6311 unsigned int op = bits (insn, 21, 24);
6312 int is_mov = (op == 0xd);
6313 ULONGEST rd_val, rn_val;
cca44b1b
JB
6314
6315 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 6316 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
6317
6318 if (debug_displaced)
6319 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
6320 "%.8lx\n", is_mov ? "move" : "ALU",
6321 (unsigned long) insn);
6322
6323 /* Instruction is of form:
6324
6325 <op><cond> rd, [rn,] #imm
6326
6327 Rewrite as:
6328
6329 Preparation: tmp1, tmp2 <- r0, r1;
6330 r0, r1 <- rd, rn
6331 Insn: <op><cond> r0, r1, #imm
6332 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6333 */
6334
36073a92
YQ
6335 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6336 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6337 rn_val = displaced_read_reg (regs, dsc, rn);
6338 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
6339 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6340 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6341 dsc->rd = rd;
6342
6343 if (is_mov)
6344 dsc->modinsn[0] = insn & 0xfff00fff;
6345 else
6346 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
6347
6348 dsc->cleanup = &cleanup_alu_imm;
6349
6350 return 0;
6351}
6352
34518530
YQ
6353static int
6354thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
6355 uint16_t insn2, struct regcache *regs,
6356 struct displaced_step_closure *dsc)
6357{
6358 unsigned int op = bits (insn1, 5, 8);
6359 unsigned int rn, rm, rd;
6360 ULONGEST rd_val, rn_val;
6361
6362 rn = bits (insn1, 0, 3); /* Rn */
6363 rm = bits (insn2, 0, 3); /* Rm */
6364 rd = bits (insn2, 8, 11); /* Rd */
6365
6366 /* This routine is only called for instruction MOV. */
6367 gdb_assert (op == 0x2 && rn == 0xf);
6368
6369 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
6370 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
6371
6372 if (debug_displaced)
6373 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
6374 "ALU", insn1, insn2);
6375
6376 /* Instruction is of form:
6377
6378 <op><cond> rd, [rn,] #imm
6379
6380 Rewrite as:
6381
6382 Preparation: tmp1, tmp2 <- r0, r1;
6383 r0, r1 <- rd, rn
6384 Insn: <op><cond> r0, r1, #imm
6385 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6386 */
6387
6388 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6389 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6390 rn_val = displaced_read_reg (regs, dsc, rn);
6391 rd_val = displaced_read_reg (regs, dsc, rd);
6392 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6393 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6394 dsc->rd = rd;
6395
6396 dsc->modinsn[0] = insn1;
6397 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
6398 dsc->numinsns = 2;
6399
6400 dsc->cleanup = &cleanup_alu_imm;
6401
6402 return 0;
6403}
6404
cca44b1b
JB
6405/* Copy/cleanup arithmetic/logic insns with register RHS. */
6406
6407static void
6e39997a 6408cleanup_alu_reg (struct gdbarch *gdbarch,
cca44b1b
JB
6409 struct regcache *regs, struct displaced_step_closure *dsc)
6410{
6411 ULONGEST rd_val;
6412 int i;
6413
36073a92 6414 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6415
6416 for (i = 0; i < 3; i++)
6417 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6418
6419 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6420}
6421
7ff120b4
YQ
6422static void
6423install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
6424 struct displaced_step_closure *dsc,
6425 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 6426{
cca44b1b 6427 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 6428
cca44b1b
JB
6429 /* Instruction is of form:
6430
6431 <op><cond> rd, [rn,] rm [, <shift>]
6432
6433 Rewrite as:
6434
6435 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
6436 r0, r1, r2 <- rd, rn, rm
ef713951 6437 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
6438 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
6439 */
6440
36073a92
YQ
6441 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6442 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6443 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6444 rd_val = displaced_read_reg (regs, dsc, rd);
6445 rn_val = displaced_read_reg (regs, dsc, rn);
6446 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6447 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6448 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6449 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6450 dsc->rd = rd;
6451
7ff120b4
YQ
6452 dsc->cleanup = &cleanup_alu_reg;
6453}
6454
6455static int
6456arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6457 struct displaced_step_closure *dsc)
6458{
6459 unsigned int op = bits (insn, 21, 24);
6460 int is_mov = (op == 0xd);
6461
6462 if (!insn_references_pc (insn, 0x000ff00ful))
6463 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
6464
6465 if (debug_displaced)
6466 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
6467 is_mov ? "move" : "ALU", (unsigned long) insn);
6468
cca44b1b
JB
6469 if (is_mov)
6470 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
6471 else
6472 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
6473
7ff120b4
YQ
6474 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
6475 bits (insn, 0, 3));
cca44b1b
JB
6476 return 0;
6477}
6478
34518530
YQ
6479static int
6480thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
6481 struct regcache *regs,
6482 struct displaced_step_closure *dsc)
6483{
ef713951 6484 unsigned rm, rd;
34518530 6485
ef713951
YQ
6486 rm = bits (insn, 3, 6);
6487 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 6488
ef713951 6489 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
6490 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
6491
6492 if (debug_displaced)
ef713951
YQ
6493 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
6494 (unsigned short) insn);
34518530 6495
ef713951 6496 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 6497
ef713951 6498 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
6499
6500 return 0;
6501}
6502
cca44b1b
JB
6503/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
6504
6505static void
6e39997a 6506cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b
JB
6507 struct regcache *regs,
6508 struct displaced_step_closure *dsc)
6509{
36073a92 6510 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6511 int i;
6512
6513 for (i = 0; i < 4; i++)
6514 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6515
6516 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6517}
6518
7ff120b4
YQ
6519static void
6520install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
6521 struct displaced_step_closure *dsc,
6522 unsigned int rd, unsigned int rn, unsigned int rm,
6523 unsigned rs)
cca44b1b 6524{
7ff120b4 6525 int i;
cca44b1b 6526 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 6527
cca44b1b
JB
6528 /* Instruction is of form:
6529
6530 <op><cond> rd, [rn,] rm, <shift> rs
6531
6532 Rewrite as:
6533
6534 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
6535 r0, r1, r2, r3 <- rd, rn, rm, rs
6536 Insn: <op><cond> r0, r1, r2, <shift> r3
6537 Cleanup: tmp5 <- r0
6538 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
6539 rd <- tmp5
6540 */
6541
6542 for (i = 0; i < 4; i++)
36073a92 6543 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 6544
36073a92
YQ
6545 rd_val = displaced_read_reg (regs, dsc, rd);
6546 rn_val = displaced_read_reg (regs, dsc, rn);
6547 rm_val = displaced_read_reg (regs, dsc, rm);
6548 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
6549 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6550 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6551 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6552 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
6553 dsc->rd = rd;
7ff120b4
YQ
6554 dsc->cleanup = &cleanup_alu_shifted_reg;
6555}
6556
6557static int
6558arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
6559 struct regcache *regs,
6560 struct displaced_step_closure *dsc)
6561{
6562 unsigned int op = bits (insn, 21, 24);
6563 int is_mov = (op == 0xd);
6564 unsigned int rd, rn, rm, rs;
6565
6566 if (!insn_references_pc (insn, 0x000fff0ful))
6567 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
6568
6569 if (debug_displaced)
6570 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
6571 "%.8lx\n", is_mov ? "move" : "ALU",
6572 (unsigned long) insn);
6573
6574 rn = bits (insn, 16, 19);
6575 rm = bits (insn, 0, 3);
6576 rs = bits (insn, 8, 11);
6577 rd = bits (insn, 12, 15);
cca44b1b
JB
6578
6579 if (is_mov)
6580 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
6581 else
6582 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
6583
7ff120b4 6584 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
6585
6586 return 0;
6587}
6588
6589/* Clean up load instructions. */
6590
6591static void
6e39997a 6592cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
6593 struct displaced_step_closure *dsc)
6594{
6595 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 6596
36073a92 6597 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 6598 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
6599 rt_val2 = displaced_read_reg (regs, dsc, 1);
6600 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
6601
6602 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6603 if (dsc->u.ldst.xfersize > 4)
6604 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6605 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6606 if (!dsc->u.ldst.immed)
6607 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6608
6609 /* Handle register writeback. */
6610 if (dsc->u.ldst.writeback)
6611 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6612 /* Put result in right place. */
6613 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
6614 if (dsc->u.ldst.xfersize == 8)
6615 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
6616}
6617
6618/* Clean up store instructions. */
6619
6620static void
6e39997a 6621cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
6622 struct displaced_step_closure *dsc)
6623{
36073a92 6624 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
6625
6626 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6627 if (dsc->u.ldst.xfersize > 4)
6628 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6629 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6630 if (!dsc->u.ldst.immed)
6631 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6632 if (!dsc->u.ldst.restore_r4)
6633 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
6634
6635 /* Writeback. */
6636 if (dsc->u.ldst.writeback)
6637 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6638}
6639
6640/* Copy "extra" load/store instructions. These are halfword/doubleword
6641 transfers, which have a different encoding to byte/word transfers. */
6642
6643static int
7ff120b4
YQ
6644arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unpriveleged,
6645 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6646{
6647 unsigned int op1 = bits (insn, 20, 24);
6648 unsigned int op2 = bits (insn, 5, 6);
6649 unsigned int rt = bits (insn, 12, 15);
6650 unsigned int rn = bits (insn, 16, 19);
6651 unsigned int rm = bits (insn, 0, 3);
6652 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
6653 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
6654 int immed = (op1 & 0x4) != 0;
6655 int opcode;
6656 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
6657
6658 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 6659 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
6660
6661 if (debug_displaced)
6662 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
6663 "insn %.8lx\n", unpriveleged ? "unpriveleged " : "",
6664 (unsigned long) insn);
6665
6666 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
6667
6668 if (opcode < 0)
6669 internal_error (__FILE__, __LINE__,
6670 _("copy_extra_ld_st: instruction decode error"));
6671
36073a92
YQ
6672 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6673 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6674 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 6675 if (!immed)
36073a92 6676 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 6677
36073a92 6678 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 6679 if (bytesize[opcode] == 8)
36073a92
YQ
6680 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
6681 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 6682 if (!immed)
36073a92 6683 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6684
6685 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6686 if (bytesize[opcode] == 8)
6687 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
6688 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6689 if (!immed)
6690 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
6691
6692 dsc->rd = rt;
6693 dsc->u.ldst.xfersize = bytesize[opcode];
6694 dsc->u.ldst.rn = rn;
6695 dsc->u.ldst.immed = immed;
6696 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
6697 dsc->u.ldst.restore_r4 = 0;
6698
6699 if (immed)
6700 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
6701 ->
6702 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
6703 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6704 else
6705 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
6706 ->
6707 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
6708 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6709
6710 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
6711
6712 return 0;
6713}
6714
0f6f04ba 6715/* Copy byte/half word/word loads and stores. */
cca44b1b 6716
7ff120b4 6717static void
0f6f04ba
YQ
6718install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
6719 struct displaced_step_closure *dsc, int load,
6720 int immed, int writeback, int size, int usermode,
6721 int rt, int rm, int rn)
cca44b1b 6722{
cca44b1b 6723 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 6724
36073a92
YQ
6725 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6726 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 6727 if (!immed)
36073a92 6728 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 6729 if (!load)
36073a92 6730 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 6731
36073a92
YQ
6732 rt_val = displaced_read_reg (regs, dsc, rt);
6733 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 6734 if (!immed)
36073a92 6735 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6736
6737 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6738 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6739 if (!immed)
6740 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 6741 dsc->rd = rt;
0f6f04ba 6742 dsc->u.ldst.xfersize = size;
cca44b1b
JB
6743 dsc->u.ldst.rn = rn;
6744 dsc->u.ldst.immed = immed;
7ff120b4 6745 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
6746
6747 /* To write PC we can do:
6748
494e194e
YQ
6749 Before this sequence of instructions:
6750 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
6751 r2 is the Rn value got from dispalced_read_reg.
6752
6753 Insn1: push {pc} Write address of STR instruction + offset on stack
6754 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
6755 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
6756 = addr(Insn1) + offset - addr(Insn3) - 8
6757 = offset - 16
6758 Insn4: add r4, r4, #8 r4 = offset - 8
6759 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
6760 = from + offset
6761 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
6762
6763 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
6764 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
6765 of this can be found in Section "Saving from r15" in
6766 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 6767
7ff120b4
YQ
6768 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6769}
6770
34518530
YQ
6771
6772static int
6773thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
6774 uint16_t insn2, struct regcache *regs,
6775 struct displaced_step_closure *dsc, int size)
6776{
6777 unsigned int u_bit = bit (insn1, 7);
6778 unsigned int rt = bits (insn2, 12, 15);
6779 int imm12 = bits (insn2, 0, 11);
6780 ULONGEST pc_val;
6781
6782 if (debug_displaced)
6783 fprintf_unfiltered (gdb_stdlog,
6784 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
6785 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
6786 imm12);
6787
6788 if (!u_bit)
6789 imm12 = -1 * imm12;
6790
6791 /* Rewrite instruction LDR Rt imm12 into:
6792
6793 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
6794
6795 LDR R0, R2, R3,
6796
6797 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
6798
6799
6800 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6801 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6802 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6803
6804 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6805
6806 pc_val = pc_val & 0xfffffffc;
6807
6808 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
6809 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
6810
6811 dsc->rd = rt;
6812
6813 dsc->u.ldst.xfersize = size;
6814 dsc->u.ldst.immed = 0;
6815 dsc->u.ldst.writeback = 0;
6816 dsc->u.ldst.restore_r4 = 0;
6817
6818 /* LDR R0, R2, R3 */
6819 dsc->modinsn[0] = 0xf852;
6820 dsc->modinsn[1] = 0x3;
6821 dsc->numinsns = 2;
6822
6823 dsc->cleanup = &cleanup_load;
6824
6825 return 0;
6826}
6827
6828static int
6829thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
6830 uint16_t insn2, struct regcache *regs,
6831 struct displaced_step_closure *dsc,
6832 int writeback, int immed)
6833{
6834 unsigned int rt = bits (insn2, 12, 15);
6835 unsigned int rn = bits (insn1, 0, 3);
6836 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
6837 /* In LDR (register), there is also a register Rm, which is not allowed to
6838 be PC, so we don't have to check it. */
6839
6840 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
6841 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
6842 dsc);
6843
6844 if (debug_displaced)
6845 fprintf_unfiltered (gdb_stdlog,
6846 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
6847 rt, rn, insn1, insn2);
6848
6849 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
6850 0, rt, rm, rn);
6851
6852 dsc->u.ldst.restore_r4 = 0;
6853
6854 if (immed)
6855 /* ldr[b]<cond> rt, [rn, #imm], etc.
6856 ->
6857 ldr[b]<cond> r0, [r2, #imm]. */
6858 {
6859 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6860 dsc->modinsn[1] = insn2 & 0x0fff;
6861 }
6862 else
6863 /* ldr[b]<cond> rt, [rn, rm], etc.
6864 ->
6865 ldr[b]<cond> r0, [r2, r3]. */
6866 {
6867 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6868 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
6869 }
6870
6871 dsc->numinsns = 2;
6872
6873 return 0;
6874}
6875
6876
7ff120b4
YQ
6877static int
6878arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
6879 struct regcache *regs,
6880 struct displaced_step_closure *dsc,
0f6f04ba 6881 int load, int size, int usermode)
7ff120b4
YQ
6882{
6883 int immed = !bit (insn, 25);
6884 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
6885 unsigned int rt = bits (insn, 12, 15);
6886 unsigned int rn = bits (insn, 16, 19);
6887 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
6888
6889 if (!insn_references_pc (insn, 0x000ff00ful))
6890 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
6891
6892 if (debug_displaced)
6893 fprintf_unfiltered (gdb_stdlog,
6894 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
6895 load ? (size == 1 ? "ldrb" : "ldr")
6896 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
6897 rt, rn,
6898 (unsigned long) insn);
6899
0f6f04ba
YQ
6900 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
6901 usermode, rt, rm, rn);
7ff120b4 6902
bf9f652a 6903 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
6904 {
6905 dsc->u.ldst.restore_r4 = 0;
6906
6907 if (immed)
6908 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
6909 ->
6910 {ldr,str}[b]<cond> r0, [r2, #imm]. */
6911 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6912 else
6913 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
6914 ->
6915 {ldr,str}[b]<cond> r0, [r2, r3]. */
6916 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6917 }
6918 else
6919 {
6920 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
6921 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
6922 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
6923 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
6924 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
6925 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
6926 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
6927
6928 /* As above. */
6929 if (immed)
6930 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
6931 else
6932 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
6933
cca44b1b
JB
6934 dsc->numinsns = 6;
6935 }
6936
6937 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6938
6939 return 0;
6940}
6941
6942/* Cleanup LDM instructions with fully-populated register list. This is an
6943 unfortunate corner case: it's impossible to implement correctly by modifying
6944 the instruction. The issue is as follows: we have an instruction,
6945
6946 ldm rN, {r0-r15}
6947
6948 which we must rewrite to avoid loading PC. A possible solution would be to
6949 do the load in two halves, something like (with suitable cleanup
6950 afterwards):
6951
6952 mov r8, rN
6953 ldm[id][ab] r8!, {r0-r7}
6954 str r7, <temp>
6955 ldm[id][ab] r8, {r7-r14}
6956 <bkpt>
6957
6958 but at present there's no suitable place for <temp>, since the scratch space
6959 is overwritten before the cleanup routine is called. For now, we simply
6960 emulate the instruction. */
6961
6962static void
6963cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
6964 struct displaced_step_closure *dsc)
6965{
cca44b1b
JB
6966 int inc = dsc->u.block.increment;
6967 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
6968 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
6969 uint32_t regmask = dsc->u.block.regmask;
6970 int regno = inc ? 0 : 15;
6971 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
6972 int exception_return = dsc->u.block.load && dsc->u.block.user
6973 && (regmask & 0x8000) != 0;
36073a92 6974 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
6975 int do_transfer = condition_true (dsc->u.block.cond, status);
6976 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6977
6978 if (!do_transfer)
6979 return;
6980
6981 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
6982 sensible we can do here. Complain loudly. */
6983 if (exception_return)
6984 error (_("Cannot single-step exception return"));
6985
6986 /* We don't handle any stores here for now. */
6987 gdb_assert (dsc->u.block.load != 0);
6988
6989 if (debug_displaced)
6990 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
6991 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
6992 dsc->u.block.increment ? "inc" : "dec",
6993 dsc->u.block.before ? "before" : "after");
6994
6995 while (regmask)
6996 {
6997 uint32_t memword;
6998
6999 if (inc)
bf9f652a 7000 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
7001 regno++;
7002 else
7003 while (regno >= 0 && (regmask & (1 << regno)) == 0)
7004 regno--;
7005
7006 xfer_addr += bump_before;
7007
7008 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
7009 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
7010
7011 xfer_addr += bump_after;
7012
7013 regmask &= ~(1 << regno);
7014 }
7015
7016 if (dsc->u.block.writeback)
7017 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
7018 CANNOT_WRITE_PC);
7019}
7020
7021/* Clean up an STM which included the PC in the register list. */
7022
7023static void
7024cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
7025 struct displaced_step_closure *dsc)
7026{
36073a92 7027 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
7028 int store_executed = condition_true (dsc->u.block.cond, status);
7029 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
7030 CORE_ADDR stm_insn_addr;
7031 uint32_t pc_val;
7032 long offset;
7033 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7034
7035 /* If condition code fails, there's nothing else to do. */
7036 if (!store_executed)
7037 return;
7038
7039 if (dsc->u.block.increment)
7040 {
7041 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
7042
7043 if (dsc->u.block.before)
7044 pc_stored_at += 4;
7045 }
7046 else
7047 {
7048 pc_stored_at = dsc->u.block.xfer_addr;
7049
7050 if (dsc->u.block.before)
7051 pc_stored_at -= 4;
7052 }
7053
7054 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
7055 stm_insn_addr = dsc->scratch_base;
7056 offset = pc_val - stm_insn_addr;
7057
7058 if (debug_displaced)
7059 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
7060 "STM instruction\n", offset);
7061
7062 /* Rewrite the stored PC to the proper value for the non-displaced original
7063 instruction. */
7064 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
7065 dsc->insn_addr + offset);
7066}
7067
7068/* Clean up an LDM which includes the PC in the register list. We clumped all
7069 the registers in the transferred list into a contiguous range r0...rX (to
7070 avoid loading PC directly and losing control of the debugged program), so we
7071 must undo that here. */
7072
7073static void
6e39997a 7074cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b
JB
7075 struct regcache *regs,
7076 struct displaced_step_closure *dsc)
7077{
36073a92 7078 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 7079 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 7080 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
7081 unsigned int regs_loaded = bitcount (mask);
7082 unsigned int num_to_shuffle = regs_loaded, clobbered;
7083
7084 /* The method employed here will fail if the register list is fully populated
7085 (we need to avoid loading PC directly). */
7086 gdb_assert (num_to_shuffle < 16);
7087
7088 if (!load_executed)
7089 return;
7090
7091 clobbered = (1 << num_to_shuffle) - 1;
7092
7093 while (num_to_shuffle > 0)
7094 {
7095 if ((mask & (1 << write_reg)) != 0)
7096 {
7097 unsigned int read_reg = num_to_shuffle - 1;
7098
7099 if (read_reg != write_reg)
7100 {
36073a92 7101 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
7102 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
7103 if (debug_displaced)
7104 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
7105 "loaded register r%d to r%d\n"), read_reg,
7106 write_reg);
7107 }
7108 else if (debug_displaced)
7109 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
7110 "r%d already in the right place\n"),
7111 write_reg);
7112
7113 clobbered &= ~(1 << write_reg);
7114
7115 num_to_shuffle--;
7116 }
7117
7118 write_reg--;
7119 }
7120
7121 /* Restore any registers we scribbled over. */
7122 for (write_reg = 0; clobbered != 0; write_reg++)
7123 {
7124 if ((clobbered & (1 << write_reg)) != 0)
7125 {
7126 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
7127 CANNOT_WRITE_PC);
7128 if (debug_displaced)
7129 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
7130 "clobbered register r%d\n"), write_reg);
7131 clobbered &= ~(1 << write_reg);
7132 }
7133 }
7134
7135 /* Perform register writeback manually. */
7136 if (dsc->u.block.writeback)
7137 {
7138 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
7139
7140 if (dsc->u.block.increment)
7141 new_rn_val += regs_loaded * 4;
7142 else
7143 new_rn_val -= regs_loaded * 4;
7144
7145 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
7146 CANNOT_WRITE_PC);
7147 }
7148}
7149
7150/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
7151 in user-level code (in particular exception return, ldm rn, {...pc}^). */
7152
7153static int
7ff120b4
YQ
7154arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
7155 struct regcache *regs,
7156 struct displaced_step_closure *dsc)
cca44b1b
JB
7157{
7158 int load = bit (insn, 20);
7159 int user = bit (insn, 22);
7160 int increment = bit (insn, 23);
7161 int before = bit (insn, 24);
7162 int writeback = bit (insn, 21);
7163 int rn = bits (insn, 16, 19);
cca44b1b 7164
0963b4bd
MS
7165 /* Block transfers which don't mention PC can be run directly
7166 out-of-line. */
bf9f652a 7167 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 7168 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 7169
bf9f652a 7170 if (rn == ARM_PC_REGNUM)
cca44b1b 7171 {
0963b4bd
MS
7172 warning (_("displaced: Unpredictable LDM or STM with "
7173 "base register r15"));
7ff120b4 7174 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
7175 }
7176
7177 if (debug_displaced)
7178 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
7179 "%.8lx\n", (unsigned long) insn);
7180
36073a92 7181 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
7182 dsc->u.block.rn = rn;
7183
7184 dsc->u.block.load = load;
7185 dsc->u.block.user = user;
7186 dsc->u.block.increment = increment;
7187 dsc->u.block.before = before;
7188 dsc->u.block.writeback = writeback;
7189 dsc->u.block.cond = bits (insn, 28, 31);
7190
7191 dsc->u.block.regmask = insn & 0xffff;
7192
7193 if (load)
7194 {
7195 if ((insn & 0xffff) == 0xffff)
7196 {
7197 /* LDM with a fully-populated register list. This case is
7198 particularly tricky. Implement for now by fully emulating the
7199 instruction (which might not behave perfectly in all cases, but
7200 these instructions should be rare enough for that not to matter
7201 too much). */
7202 dsc->modinsn[0] = ARM_NOP;
7203
7204 dsc->cleanup = &cleanup_block_load_all;
7205 }
7206 else
7207 {
7208 /* LDM of a list of registers which includes PC. Implement by
7209 rewriting the list of registers to be transferred into a
7210 contiguous chunk r0...rX before doing the transfer, then shuffling
7211 registers into the correct places in the cleanup routine. */
7212 unsigned int regmask = insn & 0xffff;
7213 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
7214 unsigned int to = 0, from = 0, i, new_rn;
7215
7216 for (i = 0; i < num_in_list; i++)
36073a92 7217 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
7218
7219 /* Writeback makes things complicated. We need to avoid clobbering
7220 the base register with one of the registers in our modified
7221 register list, but just using a different register can't work in
7222 all cases, e.g.:
7223
7224 ldm r14!, {r0-r13,pc}
7225
7226 which would need to be rewritten as:
7227
7228 ldm rN!, {r0-r14}
7229
7230 but that can't work, because there's no free register for N.
7231
7232 Solve this by turning off the writeback bit, and emulating
7233 writeback manually in the cleanup routine. */
7234
7235 if (writeback)
7236 insn &= ~(1 << 21);
7237
7238 new_regmask = (1 << num_in_list) - 1;
7239
7240 if (debug_displaced)
7241 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
7242 "{..., pc}: original reg list %.4x, modified "
7243 "list %.4x\n"), rn, writeback ? "!" : "",
7244 (int) insn & 0xffff, new_regmask);
7245
7246 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
7247
7248 dsc->cleanup = &cleanup_block_load_pc;
7249 }
7250 }
7251 else
7252 {
7253 /* STM of a list of registers which includes PC. Run the instruction
7254 as-is, but out of line: this will store the wrong value for the PC,
7255 so we must manually fix up the memory in the cleanup routine.
7256 Doing things this way has the advantage that we can auto-detect
7257 the offset of the PC write (which is architecture-dependent) in
7258 the cleanup routine. */
7259 dsc->modinsn[0] = insn;
7260
7261 dsc->cleanup = &cleanup_block_store_pc;
7262 }
7263
7264 return 0;
7265}
7266
34518530
YQ
7267static int
7268thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7269 struct regcache *regs,
7270 struct displaced_step_closure *dsc)
cca44b1b 7271{
34518530
YQ
7272 int rn = bits (insn1, 0, 3);
7273 int load = bit (insn1, 4);
7274 int writeback = bit (insn1, 5);
cca44b1b 7275
34518530
YQ
7276 /* Block transfers which don't mention PC can be run directly
7277 out-of-line. */
7278 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
7279 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 7280
34518530
YQ
7281 if (rn == ARM_PC_REGNUM)
7282 {
7283 warning (_("displaced: Unpredictable LDM or STM with "
7284 "base register r15"));
7285 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7286 "unpredictable ldm/stm", dsc);
7287 }
cca44b1b
JB
7288
7289 if (debug_displaced)
34518530
YQ
7290 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
7291 "%.4x%.4x\n", insn1, insn2);
cca44b1b 7292
34518530
YQ
7293 /* Clear bit 13, since it should be always zero. */
7294 dsc->u.block.regmask = (insn2 & 0xdfff);
7295 dsc->u.block.rn = rn;
cca44b1b 7296
34518530
YQ
7297 dsc->u.block.load = load;
7298 dsc->u.block.user = 0;
7299 dsc->u.block.increment = bit (insn1, 7);
7300 dsc->u.block.before = bit (insn1, 8);
7301 dsc->u.block.writeback = writeback;
7302 dsc->u.block.cond = INST_AL;
7303 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 7304
34518530
YQ
7305 if (load)
7306 {
7307 if (dsc->u.block.regmask == 0xffff)
7308 {
7309 /* This branch is impossible to happen. */
7310 gdb_assert (0);
7311 }
7312 else
7313 {
7314 unsigned int regmask = dsc->u.block.regmask;
7315 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
7316 unsigned int to = 0, from = 0, i, new_rn;
7317
7318 for (i = 0; i < num_in_list; i++)
7319 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7320
7321 if (writeback)
7322 insn1 &= ~(1 << 5);
7323
7324 new_regmask = (1 << num_in_list) - 1;
7325
7326 if (debug_displaced)
7327 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
7328 "{..., pc}: original reg list %.4x, modified "
7329 "list %.4x\n"), rn, writeback ? "!" : "",
7330 (int) dsc->u.block.regmask, new_regmask);
7331
7332 dsc->modinsn[0] = insn1;
7333 dsc->modinsn[1] = (new_regmask & 0xffff);
7334 dsc->numinsns = 2;
7335
7336 dsc->cleanup = &cleanup_block_load_pc;
7337 }
7338 }
7339 else
7340 {
7341 dsc->modinsn[0] = insn1;
7342 dsc->modinsn[1] = insn2;
7343 dsc->numinsns = 2;
7344 dsc->cleanup = &cleanup_block_store_pc;
7345 }
7346 return 0;
7347}
7348
7349/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
7350 for Linux, where some SVC instructions must be treated specially. */
7351
7352static void
7353cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
7354 struct displaced_step_closure *dsc)
7355{
7356 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
7357
7358 if (debug_displaced)
7359 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
7360 "%.8lx\n", (unsigned long) resume_addr);
7361
7362 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
7363}
7364
7365
7366/* Common copy routine for svc instruciton. */
7367
7368static int
7369install_svc (struct gdbarch *gdbarch, struct regcache *regs,
7370 struct displaced_step_closure *dsc)
7371{
7372 /* Preparation: none.
7373 Insn: unmodified svc.
7374 Cleanup: pc <- insn_addr + insn_size. */
7375
7376 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
7377 instruction. */
7378 dsc->wrote_to_pc = 1;
7379
7380 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
7381 if (dsc->u.svc.copy_svc_os)
7382 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
7383 else
7384 {
7385 dsc->cleanup = &cleanup_svc;
7386 return 0;
7387 }
34518530
YQ
7388}
7389
7390static int
7391arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
7392 struct regcache *regs, struct displaced_step_closure *dsc)
7393{
7394
7395 if (debug_displaced)
7396 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
7397 (unsigned long) insn);
7398
7399 dsc->modinsn[0] = insn;
7400
7401 return install_svc (gdbarch, regs, dsc);
7402}
7403
7404static int
7405thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
7406 struct regcache *regs, struct displaced_step_closure *dsc)
7407{
7408
7409 if (debug_displaced)
7410 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
7411 insn);
bd18283a 7412
34518530
YQ
7413 dsc->modinsn[0] = insn;
7414
7415 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
7416}
7417
7418/* Copy undefined instructions. */
7419
7420static int
7ff120b4
YQ
7421arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
7422 struct displaced_step_closure *dsc)
cca44b1b
JB
7423{
7424 if (debug_displaced)
0963b4bd
MS
7425 fprintf_unfiltered (gdb_stdlog,
7426 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
7427 (unsigned long) insn);
7428
7429 dsc->modinsn[0] = insn;
7430
7431 return 0;
7432}
7433
34518530
YQ
7434static int
7435thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7436 struct displaced_step_closure *dsc)
7437{
7438
7439 if (debug_displaced)
7440 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
7441 "%.4x %.4x\n", (unsigned short) insn1,
7442 (unsigned short) insn2);
7443
7444 dsc->modinsn[0] = insn1;
7445 dsc->modinsn[1] = insn2;
7446 dsc->numinsns = 2;
7447
7448 return 0;
7449}
7450
cca44b1b
JB
7451/* Copy unpredictable instructions. */
7452
7453static int
7ff120b4
YQ
7454arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
7455 struct displaced_step_closure *dsc)
cca44b1b
JB
7456{
7457 if (debug_displaced)
7458 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
7459 "%.8lx\n", (unsigned long) insn);
7460
7461 dsc->modinsn[0] = insn;
7462
7463 return 0;
7464}
7465
7466/* The decode_* functions are instruction decoding helpers. They mostly follow
7467 the presentation in the ARM ARM. */
7468
7469static int
7ff120b4
YQ
7470arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
7471 struct regcache *regs,
7472 struct displaced_step_closure *dsc)
cca44b1b
JB
7473{
7474 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
7475 unsigned int rn = bits (insn, 16, 19);
7476
7477 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 7478 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 7479 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 7480 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 7481 else if ((op1 & 0x60) == 0x20)
7ff120b4 7482 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 7483 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
7484 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
7485 dsc);
cca44b1b 7486 else if ((op1 & 0x77) == 0x41)
7ff120b4 7487 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 7488 else if ((op1 & 0x77) == 0x45)
7ff120b4 7489 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
7490 else if ((op1 & 0x77) == 0x51)
7491 {
7492 if (rn != 0xf)
7ff120b4 7493 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 7494 else
7ff120b4 7495 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7496 }
7497 else if ((op1 & 0x77) == 0x55)
7ff120b4 7498 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
7499 else if (op1 == 0x57)
7500 switch (op2)
7501 {
7ff120b4
YQ
7502 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
7503 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
7504 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
7505 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
7506 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7507 }
7508 else if ((op1 & 0x63) == 0x43)
7ff120b4 7509 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7510 else if ((op2 & 0x1) == 0x0)
7511 switch (op1 & ~0x80)
7512 {
7513 case 0x61:
7ff120b4 7514 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 7515 case 0x65:
7ff120b4 7516 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
7517 case 0x71: case 0x75:
7518 /* pld/pldw reg. */
7ff120b4 7519 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 7520 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 7521 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 7522 default:
7ff120b4 7523 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7524 }
7525 else
7ff120b4 7526 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
7527}
7528
7529static int
7ff120b4
YQ
7530arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
7531 struct regcache *regs,
7532 struct displaced_step_closure *dsc)
cca44b1b
JB
7533{
7534 if (bit (insn, 27) == 0)
7ff120b4 7535 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
7536 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
7537 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
7538 {
7539 case 0x0: case 0x2:
7ff120b4 7540 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
7541
7542 case 0x1: case 0x3:
7ff120b4 7543 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
7544
7545 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 7546 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
7547
7548 case 0x8:
7549 switch ((insn & 0xe00000) >> 21)
7550 {
7551 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
7552 /* stc/stc2. */
7ff120b4 7553 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7554
7555 case 0x2:
7ff120b4 7556 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
7557
7558 default:
7ff120b4 7559 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7560 }
7561
7562 case 0x9:
7563 {
7564 int rn_f = (bits (insn, 16, 19) == 0xf);
7565 switch ((insn & 0xe00000) >> 21)
7566 {
7567 case 0x1: case 0x3:
7568 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
7569 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
7570 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7571
7572 case 0x2:
7ff120b4 7573 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
7574
7575 case 0x4: case 0x5: case 0x6: case 0x7:
7576 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
7577 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
7578 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7579
7580 default:
7ff120b4 7581 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7582 }
7583 }
7584
7585 case 0xa:
7ff120b4 7586 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
7587
7588 case 0xb:
7589 if (bits (insn, 16, 19) == 0xf)
7590 /* ldc/ldc2 lit. */
7ff120b4 7591 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 7592 else
7ff120b4 7593 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7594
7595 case 0xc:
7596 if (bit (insn, 4))
7ff120b4 7597 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 7598 else
7ff120b4 7599 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7600
7601 case 0xd:
7602 if (bit (insn, 4))
7ff120b4 7603 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 7604 else
7ff120b4 7605 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7606
7607 default:
7ff120b4 7608 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7609 }
7610}
7611
7612/* Decode miscellaneous instructions in dp/misc encoding space. */
7613
7614static int
7ff120b4
YQ
7615arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
7616 struct regcache *regs,
7617 struct displaced_step_closure *dsc)
cca44b1b
JB
7618{
7619 unsigned int op2 = bits (insn, 4, 6);
7620 unsigned int op = bits (insn, 21, 22);
7621 unsigned int op1 = bits (insn, 16, 19);
7622
7623 switch (op2)
7624 {
7625 case 0x0:
7ff120b4 7626 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
7627
7628 case 0x1:
7629 if (op == 0x1) /* bx. */
7ff120b4 7630 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 7631 else if (op == 0x3)
7ff120b4 7632 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 7633 else
7ff120b4 7634 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7635
7636 case 0x2:
7637 if (op == 0x1)
7638 /* Not really supported. */
7ff120b4 7639 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 7640 else
7ff120b4 7641 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7642
7643 case 0x3:
7644 if (op == 0x1)
7ff120b4 7645 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 7646 regs, dsc); /* blx register. */
cca44b1b 7647 else
7ff120b4 7648 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7649
7650 case 0x5:
7ff120b4 7651 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
7652
7653 case 0x7:
7654 if (op == 0x1)
7ff120b4 7655 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
7656 else if (op == 0x3)
7657 /* Not really supported. */
7ff120b4 7658 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
7659
7660 default:
7ff120b4 7661 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7662 }
7663}
7664
7665static int
7ff120b4
YQ
7666arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
7667 struct regcache *regs,
7668 struct displaced_step_closure *dsc)
cca44b1b
JB
7669{
7670 if (bit (insn, 25))
7671 switch (bits (insn, 20, 24))
7672 {
7673 case 0x10:
7ff120b4 7674 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
7675
7676 case 0x14:
7ff120b4 7677 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
7678
7679 case 0x12: case 0x16:
7ff120b4 7680 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
7681
7682 default:
7ff120b4 7683 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7684 }
7685 else
7686 {
7687 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
7688
7689 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 7690 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 7691 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 7692 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 7693 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 7694 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 7695 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 7696 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 7697 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 7698 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 7699 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 7700 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b
JB
7701 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
7702 /* 2nd arg means "unpriveleged". */
7ff120b4
YQ
7703 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
7704 dsc);
cca44b1b
JB
7705 }
7706
7707 /* Should be unreachable. */
7708 return 1;
7709}
7710
7711static int
7ff120b4
YQ
7712arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
7713 struct regcache *regs,
7714 struct displaced_step_closure *dsc)
cca44b1b
JB
7715{
7716 int a = bit (insn, 25), b = bit (insn, 4);
7717 uint32_t op1 = bits (insn, 20, 24);
7718 int rn_f = bits (insn, 16, 19) == 0xf;
7719
7720 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
7721 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 7722 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
7723 else if ((!a && (op1 & 0x17) == 0x02)
7724 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 7725 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
7726 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
7727 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 7728 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
7729 else if ((!a && (op1 & 0x17) == 0x03)
7730 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 7731 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
7732 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
7733 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 7734 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
7735 else if ((!a && (op1 & 0x17) == 0x06)
7736 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 7737 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
7738 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
7739 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 7740 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
7741 else if ((!a && (op1 & 0x17) == 0x07)
7742 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 7743 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
7744
7745 /* Should be unreachable. */
7746 return 1;
7747}
7748
7749static int
7ff120b4
YQ
7750arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
7751 struct displaced_step_closure *dsc)
cca44b1b
JB
7752{
7753 switch (bits (insn, 20, 24))
7754 {
7755 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 7756 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
7757
7758 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 7759 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
7760
7761 case 0x08: case 0x09: case 0x0a: case 0x0b:
7762 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 7763 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
7764 "decode/pack/unpack/saturate/reverse", dsc);
7765
7766 case 0x18:
7767 if (bits (insn, 5, 7) == 0) /* op2. */
7768 {
7769 if (bits (insn, 12, 15) == 0xf)
7ff120b4 7770 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 7771 else
7ff120b4 7772 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
7773 }
7774 else
7ff120b4 7775 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7776
7777 case 0x1a: case 0x1b:
7778 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 7779 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 7780 else
7ff120b4 7781 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7782
7783 case 0x1c: case 0x1d:
7784 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
7785 {
7786 if (bits (insn, 0, 3) == 0xf)
7ff120b4 7787 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 7788 else
7ff120b4 7789 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
7790 }
7791 else
7ff120b4 7792 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7793
7794 case 0x1e: case 0x1f:
7795 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 7796 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 7797 else
7ff120b4 7798 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7799 }
7800
7801 /* Should be unreachable. */
7802 return 1;
7803}
7804
7805static int
7ff120b4
YQ
7806arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, int32_t insn,
7807 struct regcache *regs,
7808 struct displaced_step_closure *dsc)
cca44b1b
JB
7809{
7810 if (bit (insn, 25))
7ff120b4 7811 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 7812 else
7ff120b4 7813 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
7814}
7815
7816static int
7ff120b4
YQ
7817arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
7818 struct regcache *regs,
7819 struct displaced_step_closure *dsc)
cca44b1b
JB
7820{
7821 unsigned int opcode = bits (insn, 20, 24);
7822
7823 switch (opcode)
7824 {
7825 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 7826 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
7827
7828 case 0x08: case 0x0a: case 0x0c: case 0x0e:
7829 case 0x12: case 0x16:
7ff120b4 7830 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
7831
7832 case 0x09: case 0x0b: case 0x0d: case 0x0f:
7833 case 0x13: case 0x17:
7ff120b4 7834 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
7835
7836 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7837 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7838 /* Note: no writeback for these instructions. Bit 25 will always be
7839 zero though (via caller), so the following works OK. */
7ff120b4 7840 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7841 }
7842
7843 /* Should be unreachable. */
7844 return 1;
7845}
7846
34518530
YQ
7847/* Decode shifted register instructions. */
7848
7849static int
7850thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
7851 uint16_t insn2, struct regcache *regs,
7852 struct displaced_step_closure *dsc)
7853{
7854 /* PC is only allowed to be used in instruction MOV. */
7855
7856 unsigned int op = bits (insn1, 5, 8);
7857 unsigned int rn = bits (insn1, 0, 3);
7858
7859 if (op == 0x2 && rn == 0xf) /* MOV */
7860 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
7861 else
7862 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7863 "dp (shift reg)", dsc);
7864}
7865
7866
7867/* Decode extension register load/store. Exactly the same as
7868 arm_decode_ext_reg_ld_st. */
7869
7870static int
7871thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
7872 uint16_t insn2, struct regcache *regs,
7873 struct displaced_step_closure *dsc)
7874{
7875 unsigned int opcode = bits (insn1, 4, 8);
7876
7877 switch (opcode)
7878 {
7879 case 0x04: case 0x05:
7880 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7881 "vfp/neon vmov", dsc);
7882
7883 case 0x08: case 0x0c: /* 01x00 */
7884 case 0x0a: case 0x0e: /* 01x10 */
7885 case 0x12: case 0x16: /* 10x10 */
7886 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7887 "vfp/neon vstm/vpush", dsc);
7888
7889 case 0x09: case 0x0d: /* 01x01 */
7890 case 0x0b: case 0x0f: /* 01x11 */
7891 case 0x13: case 0x17: /* 10x11 */
7892 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7893 "vfp/neon vldm/vpop", dsc);
7894
7895 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7896 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7897 "vstr", dsc);
7898 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7899 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
7900 }
7901
7902 /* Should be unreachable. */
7903 return 1;
7904}
7905
cca44b1b 7906static int
7ff120b4
YQ
7907arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
7908 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
7909{
7910 unsigned int op1 = bits (insn, 20, 25);
7911 int op = bit (insn, 4);
7912 unsigned int coproc = bits (insn, 8, 11);
7913 unsigned int rn = bits (insn, 16, 19);
7914
7915 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 7916 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
7917 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
7918 && (coproc & 0xe) != 0xa)
7919 /* stc/stc2. */
7ff120b4 7920 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7921 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
7922 && (coproc & 0xe) != 0xa)
7923 /* ldc/ldc2 imm/lit. */
7ff120b4 7924 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 7925 else if ((op1 & 0x3e) == 0x00)
7ff120b4 7926 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 7927 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 7928 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 7929 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 7930 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 7931 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 7932 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
7933 else if ((op1 & 0x30) == 0x20 && !op)
7934 {
7935 if ((coproc & 0xe) == 0xa)
7ff120b4 7936 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 7937 else
7ff120b4 7938 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7939 }
7940 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 7941 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 7942 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 7943 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 7944 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 7945 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 7946 else if ((op1 & 0x30) == 0x30)
7ff120b4 7947 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 7948 else
7ff120b4 7949 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
7950}
7951
34518530
YQ
7952static int
7953thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
7954 uint16_t insn2, struct regcache *regs,
7955 struct displaced_step_closure *dsc)
7956{
7957 unsigned int coproc = bits (insn2, 8, 11);
7958 unsigned int op1 = bits (insn1, 4, 9);
7959 unsigned int bit_5_8 = bits (insn1, 5, 8);
7960 unsigned int bit_9 = bit (insn1, 9);
7961 unsigned int bit_4 = bit (insn1, 4);
7962 unsigned int rn = bits (insn1, 0, 3);
7963
7964 if (bit_9 == 0)
7965 {
7966 if (bit_5_8 == 2)
7967 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7968 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
7969 dsc);
7970 else if (bit_5_8 == 0) /* UNDEFINED. */
7971 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7972 else
7973 {
7974 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
7975 if ((coproc & 0xe) == 0xa)
7976 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
7977 dsc);
7978 else /* coproc is not 101x. */
7979 {
7980 if (bit_4 == 0) /* STC/STC2. */
7981 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7982 "stc/stc2", dsc);
7983 else /* LDC/LDC2 {literal, immeidate}. */
7984 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
7985 regs, dsc);
7986 }
7987 }
7988 }
7989 else
7990 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
7991
7992 return 0;
7993}
7994
7995static void
7996install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
7997 struct displaced_step_closure *dsc, int rd)
7998{
7999 /* ADR Rd, #imm
8000
8001 Rewrite as:
8002
8003 Preparation: Rd <- PC
8004 Insn: ADD Rd, #imm
8005 Cleanup: Null.
8006 */
8007
8008 /* Rd <- PC */
8009 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
8010 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
8011}
8012
8013static int
8014thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
8015 struct displaced_step_closure *dsc,
8016 int rd, unsigned int imm)
8017{
8018
8019 /* Encoding T2: ADDS Rd, #imm */
8020 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
8021
8022 install_pc_relative (gdbarch, regs, dsc, rd);
8023
8024 return 0;
8025}
8026
8027static int
8028thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
8029 struct regcache *regs,
8030 struct displaced_step_closure *dsc)
8031{
8032 unsigned int rd = bits (insn, 8, 10);
8033 unsigned int imm8 = bits (insn, 0, 7);
8034
8035 if (debug_displaced)
8036 fprintf_unfiltered (gdb_stdlog,
8037 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
8038 rd, imm8, insn);
8039
8040 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
8041}
8042
8043static int
8044thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
8045 uint16_t insn2, struct regcache *regs,
8046 struct displaced_step_closure *dsc)
8047{
8048 unsigned int rd = bits (insn2, 8, 11);
8049 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
8050 extract raw immediate encoding rather than computing immediate. When
8051 generating ADD or SUB instruction, we can simply perform OR operation to
8052 set immediate into ADD. */
8053 unsigned int imm_3_8 = insn2 & 0x70ff;
8054 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
8055
8056 if (debug_displaced)
8057 fprintf_unfiltered (gdb_stdlog,
8058 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
8059 rd, imm_i, imm_3_8, insn1, insn2);
8060
8061 if (bit (insn1, 7)) /* Encoding T2 */
8062 {
8063 /* Encoding T3: SUB Rd, Rd, #imm */
8064 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
8065 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8066 }
8067 else /* Encoding T3 */
8068 {
8069 /* Encoding T3: ADD Rd, Rd, #imm */
8070 dsc->modinsn[0] = (0xf100 | rd | imm_i);
8071 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8072 }
8073 dsc->numinsns = 2;
8074
8075 install_pc_relative (gdbarch, regs, dsc, rd);
8076
8077 return 0;
8078}
8079
8080static int
8081thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, unsigned short insn1,
8082 struct regcache *regs,
8083 struct displaced_step_closure *dsc)
8084{
8085 unsigned int rt = bits (insn1, 8, 10);
8086 unsigned int pc;
8087 int imm8 = (bits (insn1, 0, 7) << 2);
8088 CORE_ADDR from = dsc->insn_addr;
8089
8090 /* LDR Rd, #imm8
8091
8092 Rwrite as:
8093
8094 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
8095
8096 Insn: LDR R0, [R2, R3];
8097 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
8098
8099 if (debug_displaced)
8100 fprintf_unfiltered (gdb_stdlog,
8101 "displaced: copying thumb ldr r%d [pc #%d]\n"
8102 , rt, imm8);
8103
8104 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
8105 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
8106 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
8107 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
8108 /* The assembler calculates the required value of the offset from the
8109 Align(PC,4) value of this instruction to the label. */
8110 pc = pc & 0xfffffffc;
8111
8112 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
8113 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
8114
8115 dsc->rd = rt;
8116 dsc->u.ldst.xfersize = 4;
8117 dsc->u.ldst.rn = 0;
8118 dsc->u.ldst.immed = 0;
8119 dsc->u.ldst.writeback = 0;
8120 dsc->u.ldst.restore_r4 = 0;
8121
8122 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
8123
8124 dsc->cleanup = &cleanup_load;
8125
8126 return 0;
8127}
8128
8129/* Copy Thumb cbnz/cbz insruction. */
8130
8131static int
8132thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
8133 struct regcache *regs,
8134 struct displaced_step_closure *dsc)
8135{
8136 int non_zero = bit (insn1, 11);
8137 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
8138 CORE_ADDR from = dsc->insn_addr;
8139 int rn = bits (insn1, 0, 2);
8140 int rn_val = displaced_read_reg (regs, dsc, rn);
8141
8142 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
8143 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
8144 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
8145 condition is false, let it be, cleanup_branch will do nothing. */
8146 if (dsc->u.branch.cond)
8147 {
8148 dsc->u.branch.cond = INST_AL;
8149 dsc->u.branch.dest = from + 4 + imm5;
8150 }
8151 else
8152 dsc->u.branch.dest = from + 2;
8153
8154 dsc->u.branch.link = 0;
8155 dsc->u.branch.exchange = 0;
8156
8157 if (debug_displaced)
8158 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
8159 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
8160 rn, rn_val, insn1, dsc->u.branch.dest);
8161
8162 dsc->modinsn[0] = THUMB_NOP;
8163
8164 dsc->cleanup = &cleanup_branch;
8165 return 0;
8166}
8167
8168/* Copy Table Branch Byte/Halfword */
8169static int
8170thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
8171 uint16_t insn2, struct regcache *regs,
8172 struct displaced_step_closure *dsc)
8173{
8174 ULONGEST rn_val, rm_val;
8175 int is_tbh = bit (insn2, 4);
8176 CORE_ADDR halfwords = 0;
8177 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8178
8179 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
8180 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
8181
8182 if (is_tbh)
8183 {
8184 gdb_byte buf[2];
8185
8186 target_read_memory (rn_val + 2 * rm_val, buf, 2);
8187 halfwords = extract_unsigned_integer (buf, 2, byte_order);
8188 }
8189 else
8190 {
8191 gdb_byte buf[1];
8192
8193 target_read_memory (rn_val + rm_val, buf, 1);
8194 halfwords = extract_unsigned_integer (buf, 1, byte_order);
8195 }
8196
8197 if (debug_displaced)
8198 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
8199 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
8200 (unsigned int) rn_val, (unsigned int) rm_val,
8201 (unsigned int) halfwords);
8202
8203 dsc->u.branch.cond = INST_AL;
8204 dsc->u.branch.link = 0;
8205 dsc->u.branch.exchange = 0;
8206 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
8207
8208 dsc->cleanup = &cleanup_branch;
8209
8210 return 0;
8211}
8212
8213static void
8214cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
8215 struct displaced_step_closure *dsc)
8216{
8217 /* PC <- r7 */
8218 int val = displaced_read_reg (regs, dsc, 7);
8219 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
8220
8221 /* r7 <- r8 */
8222 val = displaced_read_reg (regs, dsc, 8);
8223 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
8224
8225 /* r8 <- tmp[0] */
8226 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
8227
8228}
8229
8230static int
8231thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, unsigned short insn1,
8232 struct regcache *regs,
8233 struct displaced_step_closure *dsc)
8234{
8235 dsc->u.block.regmask = insn1 & 0x00ff;
8236
8237 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
8238 to :
8239
8240 (1) register list is full, that is, r0-r7 are used.
8241 Prepare: tmp[0] <- r8
8242
8243 POP {r0, r1, ...., r6, r7}; remove PC from reglist
8244 MOV r8, r7; Move value of r7 to r8;
8245 POP {r7}; Store PC value into r7.
8246
8247 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
8248
8249 (2) register list is not full, supposing there are N registers in
8250 register list (except PC, 0 <= N <= 7).
8251 Prepare: for each i, 0 - N, tmp[i] <- ri.
8252
8253 POP {r0, r1, ...., rN};
8254
8255 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
8256 from tmp[] properly.
8257 */
8258 if (debug_displaced)
8259 fprintf_unfiltered (gdb_stdlog,
8260 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
8261 dsc->u.block.regmask, insn1);
8262
8263 if (dsc->u.block.regmask == 0xff)
8264 {
8265 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
8266
8267 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
8268 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
8269 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
8270
8271 dsc->numinsns = 3;
8272 dsc->cleanup = &cleanup_pop_pc_16bit_all;
8273 }
8274 else
8275 {
8276 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
8277 unsigned int new_regmask, bit = 1;
8278 unsigned int to = 0, from = 0, i, new_rn;
8279
8280 for (i = 0; i < num_in_list + 1; i++)
8281 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
8282
8283 new_regmask = (1 << (num_in_list + 1)) - 1;
8284
8285 if (debug_displaced)
8286 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
8287 "{..., pc}: original reg list %.4x,"
8288 " modified list %.4x\n"),
8289 (int) dsc->u.block.regmask, new_regmask);
8290
8291 dsc->u.block.regmask |= 0x8000;
8292 dsc->u.block.writeback = 0;
8293 dsc->u.block.cond = INST_AL;
8294
8295 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
8296
8297 dsc->cleanup = &cleanup_block_load_pc;
8298 }
8299
8300 return 0;
8301}
8302
8303static void
8304thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8305 struct regcache *regs,
8306 struct displaced_step_closure *dsc)
8307{
8308 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
8309 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
8310 int err = 0;
8311
8312 /* 16-bit thumb instructions. */
8313 switch (op_bit_12_15)
8314 {
8315 /* Shift (imme), add, subtract, move and compare. */
8316 case 0: case 1: case 2: case 3:
8317 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8318 "shift/add/sub/mov/cmp",
8319 dsc);
8320 break;
8321 case 4:
8322 switch (op_bit_10_11)
8323 {
8324 case 0: /* Data-processing */
8325 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8326 "data-processing",
8327 dsc);
8328 break;
8329 case 1: /* Special data instructions and branch and exchange. */
8330 {
8331 unsigned short op = bits (insn1, 7, 9);
8332 if (op == 6 || op == 7) /* BX or BLX */
8333 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
8334 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
8335 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
8336 else
8337 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
8338 dsc);
8339 }
8340 break;
8341 default: /* LDR (literal) */
8342 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
8343 }
8344 break;
8345 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
8346 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
8347 break;
8348 case 10:
8349 if (op_bit_10_11 < 2) /* Generate PC-relative address */
8350 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
8351 else /* Generate SP-relative address */
8352 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
8353 break;
8354 case 11: /* Misc 16-bit instructions */
8355 {
8356 switch (bits (insn1, 8, 11))
8357 {
8358 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
8359 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
8360 break;
8361 case 12: case 13: /* POP */
8362 if (bit (insn1, 8)) /* PC is in register list. */
8363 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
8364 else
8365 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
8366 break;
8367 case 15: /* If-Then, and hints */
8368 if (bits (insn1, 0, 3))
8369 /* If-Then makes up to four following instructions conditional.
8370 IT instruction itself is not conditional, so handle it as a
8371 common unmodified instruction. */
8372 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
8373 dsc);
8374 else
8375 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
8376 break;
8377 default:
8378 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
8379 }
8380 }
8381 break;
8382 case 12:
8383 if (op_bit_10_11 < 2) /* Store multiple registers */
8384 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
8385 else /* Load multiple registers */
8386 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
8387 break;
8388 case 13: /* Conditional branch and supervisor call */
8389 if (bits (insn1, 9, 11) != 7) /* conditional branch */
8390 err = thumb_copy_b (gdbarch, insn1, dsc);
8391 else
8392 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
8393 break;
8394 case 14: /* Unconditional branch */
8395 err = thumb_copy_b (gdbarch, insn1, dsc);
8396 break;
8397 default:
8398 err = 1;
8399 }
8400
8401 if (err)
8402 internal_error (__FILE__, __LINE__,
8403 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
8404}
8405
8406static int
8407decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
8408 uint16_t insn1, uint16_t insn2,
8409 struct regcache *regs,
8410 struct displaced_step_closure *dsc)
8411{
8412 int rt = bits (insn2, 12, 15);
8413 int rn = bits (insn1, 0, 3);
8414 int op1 = bits (insn1, 7, 8);
8415 int err = 0;
8416
8417 switch (bits (insn1, 5, 6))
8418 {
8419 case 0: /* Load byte and memory hints */
8420 if (rt == 0xf) /* PLD/PLI */
8421 {
8422 if (rn == 0xf)
8423 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
8424 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
8425 else
8426 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8427 "pli/pld", dsc);
8428 }
8429 else
8430 {
8431 if (rn == 0xf) /* LDRB/LDRSB (literal) */
8432 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8433 1);
8434 else
8435 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8436 "ldrb{reg, immediate}/ldrbt",
8437 dsc);
8438 }
8439
8440 break;
8441 case 1: /* Load halfword and memory hints. */
8442 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
8443 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8444 "pld/unalloc memhint", dsc);
8445 else
8446 {
8447 if (rn == 0xf)
8448 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8449 2);
8450 else
8451 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8452 "ldrh/ldrht", dsc);
8453 }
8454 break;
8455 case 2: /* Load word */
8456 {
8457 int insn2_bit_8_11 = bits (insn2, 8, 11);
8458
8459 if (rn == 0xf)
8460 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
8461 else if (op1 == 0x1) /* Encoding T3 */
8462 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
8463 0, 1);
8464 else /* op1 == 0x0 */
8465 {
8466 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
8467 /* LDR (immediate) */
8468 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8469 dsc, bit (insn2, 8), 1);
8470 else if (insn2_bit_8_11 == 0xe) /* LDRT */
8471 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8472 "ldrt", dsc);
8473 else
8474 /* LDR (register) */
8475 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8476 dsc, 0, 0);
8477 }
8478 break;
8479 }
8480 default:
8481 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
8482 break;
8483 }
8484 return 0;
8485}
8486
8487static void
8488thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8489 uint16_t insn2, struct regcache *regs,
8490 struct displaced_step_closure *dsc)
8491{
8492 int err = 0;
8493 unsigned short op = bit (insn2, 15);
8494 unsigned int op1 = bits (insn1, 11, 12);
8495
8496 switch (op1)
8497 {
8498 case 1:
8499 {
8500 switch (bits (insn1, 9, 10))
8501 {
8502 case 0:
8503 if (bit (insn1, 6))
8504 {
8505 /* Load/store {dual, execlusive}, table branch. */
8506 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
8507 && bits (insn2, 5, 7) == 0)
8508 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
8509 dsc);
8510 else
8511 /* PC is not allowed to use in load/store {dual, exclusive}
8512 instructions. */
8513 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8514 "load/store dual/ex", dsc);
8515 }
8516 else /* load/store multiple */
8517 {
8518 switch (bits (insn1, 7, 8))
8519 {
8520 case 0: case 3: /* SRS, RFE */
8521 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8522 "srs/rfe", dsc);
8523 break;
8524 case 1: case 2: /* LDM/STM/PUSH/POP */
8525 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
8526 break;
8527 }
8528 }
8529 break;
8530
8531 case 1:
8532 /* Data-processing (shift register). */
8533 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
8534 dsc);
8535 break;
8536 default: /* Coprocessor instructions. */
8537 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8538 break;
8539 }
8540 break;
8541 }
8542 case 2: /* op1 = 2 */
8543 if (op) /* Branch and misc control. */
8544 {
8545 if (bit (insn2, 14) /* BLX/BL */
8546 || bit (insn2, 12) /* Unconditional branch */
8547 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
8548 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
8549 else
8550 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8551 "misc ctrl", dsc);
8552 }
8553 else
8554 {
8555 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
8556 {
8557 int op = bits (insn1, 4, 8);
8558 int rn = bits (insn1, 0, 3);
8559 if ((op == 0 || op == 0xa) && rn == 0xf)
8560 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
8561 regs, dsc);
8562 else
8563 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8564 "dp/pb", dsc);
8565 }
8566 else /* Data processing (modified immeidate) */
8567 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8568 "dp/mi", dsc);
8569 }
8570 break;
8571 case 3: /* op1 = 3 */
8572 switch (bits (insn1, 9, 10))
8573 {
8574 case 0:
8575 if (bit (insn1, 4))
8576 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
8577 regs, dsc);
8578 else /* NEON Load/Store and Store single data item */
8579 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8580 "neon elt/struct load/store",
8581 dsc);
8582 break;
8583 case 1: /* op1 = 3, bits (9, 10) == 1 */
8584 switch (bits (insn1, 7, 8))
8585 {
8586 case 0: case 1: /* Data processing (register) */
8587 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8588 "dp(reg)", dsc);
8589 break;
8590 case 2: /* Multiply and absolute difference */
8591 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8592 "mul/mua/diff", dsc);
8593 break;
8594 case 3: /* Long multiply and divide */
8595 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8596 "lmul/lmua", dsc);
8597 break;
8598 }
8599 break;
8600 default: /* Coprocessor instructions */
8601 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8602 break;
8603 }
8604 break;
8605 default:
8606 err = 1;
8607 }
8608
8609 if (err)
8610 internal_error (__FILE__, __LINE__,
8611 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
8612
8613}
8614
b434a28f
YQ
8615static void
8616thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8617 CORE_ADDR to, struct regcache *regs,
8618 struct displaced_step_closure *dsc)
8619{
34518530
YQ
8620 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8621 uint16_t insn1
8622 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
8623
8624 if (debug_displaced)
8625 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
8626 "at %.8lx\n", insn1, (unsigned long) from);
8627
8628 dsc->is_thumb = 1;
8629 dsc->insn_size = thumb_insn_size (insn1);
8630 if (thumb_insn_size (insn1) == 4)
8631 {
8632 uint16_t insn2
8633 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
8634 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
8635 }
8636 else
8637 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
8638}
8639
cca44b1b 8640void
b434a28f
YQ
8641arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8642 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
8643 struct displaced_step_closure *dsc)
8644{
8645 int err = 0;
b434a28f
YQ
8646 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8647 uint32_t insn;
cca44b1b
JB
8648
8649 /* Most displaced instructions use a 1-instruction scratch space, so set this
8650 here and override below if/when necessary. */
8651 dsc->numinsns = 1;
8652 dsc->insn_addr = from;
8653 dsc->scratch_base = to;
8654 dsc->cleanup = NULL;
8655 dsc->wrote_to_pc = 0;
8656
b434a28f
YQ
8657 if (!displaced_in_arm_mode (regs))
8658 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
8659
4db71c0b
YQ
8660 dsc->is_thumb = 0;
8661 dsc->insn_size = 4;
b434a28f
YQ
8662 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
8663 if (debug_displaced)
8664 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
8665 "at %.8lx\n", (unsigned long) insn,
8666 (unsigned long) from);
8667
cca44b1b 8668 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 8669 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
8670 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
8671 {
8672 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 8673 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
8674 break;
8675
8676 case 0x4: case 0x5: case 0x6:
7ff120b4 8677 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
8678 break;
8679
8680 case 0x7:
7ff120b4 8681 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
8682 break;
8683
8684 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 8685 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
8686 break;
8687
8688 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 8689 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
8690 break;
8691 }
8692
8693 if (err)
8694 internal_error (__FILE__, __LINE__,
8695 _("arm_process_displaced_insn: Instruction decode error"));
8696}
8697
8698/* Actually set up the scratch space for a displaced instruction. */
8699
8700void
8701arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
8702 CORE_ADDR to, struct displaced_step_closure *dsc)
8703{
8704 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 8705 unsigned int i, len, offset;
cca44b1b 8706 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 8707 int size = dsc->is_thumb? 2 : 4;
948f8e3d 8708 const gdb_byte *bkp_insn;
cca44b1b 8709
4db71c0b 8710 offset = 0;
cca44b1b
JB
8711 /* Poke modified instruction(s). */
8712 for (i = 0; i < dsc->numinsns; i++)
8713 {
8714 if (debug_displaced)
4db71c0b
YQ
8715 {
8716 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
8717 if (size == 4)
8718 fprintf_unfiltered (gdb_stdlog, "%.8lx",
8719 dsc->modinsn[i]);
8720 else if (size == 2)
8721 fprintf_unfiltered (gdb_stdlog, "%.4x",
8722 (unsigned short)dsc->modinsn[i]);
8723
8724 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
8725 (unsigned long) to + offset);
8726
8727 }
8728 write_memory_unsigned_integer (to + offset, size,
8729 byte_order_for_code,
cca44b1b 8730 dsc->modinsn[i]);
4db71c0b
YQ
8731 offset += size;
8732 }
8733
8734 /* Choose the correct breakpoint instruction. */
8735 if (dsc->is_thumb)
8736 {
8737 bkp_insn = tdep->thumb_breakpoint;
8738 len = tdep->thumb_breakpoint_size;
8739 }
8740 else
8741 {
8742 bkp_insn = tdep->arm_breakpoint;
8743 len = tdep->arm_breakpoint_size;
cca44b1b
JB
8744 }
8745
8746 /* Put breakpoint afterwards. */
4db71c0b 8747 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
8748
8749 if (debug_displaced)
8750 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
8751 paddress (gdbarch, from), paddress (gdbarch, to));
8752}
8753
8754/* Entry point for copying an instruction into scratch space for displaced
8755 stepping. */
8756
8757struct displaced_step_closure *
8758arm_displaced_step_copy_insn (struct gdbarch *gdbarch,
8759 CORE_ADDR from, CORE_ADDR to,
8760 struct regcache *regs)
8761{
8d749320
SM
8762 struct displaced_step_closure *dsc = XNEW (struct displaced_step_closure);
8763
b434a28f 8764 arm_process_displaced_insn (gdbarch, from, to, regs, dsc);
cca44b1b
JB
8765 arm_displaced_init_closure (gdbarch, from, to, dsc);
8766
8767 return dsc;
8768}
8769
8770/* Entry point for cleaning things up after a displaced instruction has been
8771 single-stepped. */
8772
8773void
8774arm_displaced_step_fixup (struct gdbarch *gdbarch,
8775 struct displaced_step_closure *dsc,
8776 CORE_ADDR from, CORE_ADDR to,
8777 struct regcache *regs)
8778{
8779 if (dsc->cleanup)
8780 dsc->cleanup (gdbarch, regs, dsc);
8781
8782 if (!dsc->wrote_to_pc)
4db71c0b
YQ
8783 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
8784 dsc->insn_addr + dsc->insn_size);
8785
cca44b1b
JB
8786}
8787
8788#include "bfd-in2.h"
8789#include "libcoff.h"
8790
8791static int
8792gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
8793{
9a3c8263 8794 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
9779414d
DJ
8795
8796 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
8797 {
8798 static asymbol *asym;
8799 static combined_entry_type ce;
8800 static struct coff_symbol_struct csym;
8801 static struct bfd fake_bfd;
8802 static bfd_target fake_target;
8803
8804 if (csym.native == NULL)
8805 {
8806 /* Create a fake symbol vector containing a Thumb symbol.
8807 This is solely so that the code in print_insn_little_arm()
8808 and print_insn_big_arm() in opcodes/arm-dis.c will detect
8809 the presence of a Thumb symbol and switch to decoding
8810 Thumb instructions. */
8811
8812 fake_target.flavour = bfd_target_coff_flavour;
8813 fake_bfd.xvec = &fake_target;
8814 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
8815 csym.native = &ce;
8816 csym.symbol.the_bfd = &fake_bfd;
8817 csym.symbol.name = "fake";
8818 asym = (asymbol *) & csym;
8819 }
8820
8821 memaddr = UNMAKE_THUMB_ADDR (memaddr);
8822 info->symbols = &asym;
8823 }
8824 else
8825 info->symbols = NULL;
8826
8827 if (info->endian == BFD_ENDIAN_BIG)
8828 return print_insn_big_arm (memaddr, info);
8829 else
8830 return print_insn_little_arm (memaddr, info);
8831}
8832
8833/* The following define instruction sequences that will cause ARM
8834 cpu's to take an undefined instruction trap. These are used to
8835 signal a breakpoint to GDB.
8836
8837 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
8838 modes. A different instruction is required for each mode. The ARM
8839 cpu's can also be big or little endian. Thus four different
8840 instructions are needed to support all cases.
8841
8842 Note: ARMv4 defines several new instructions that will take the
8843 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
8844 not in fact add the new instructions. The new undefined
8845 instructions in ARMv4 are all instructions that had no defined
8846 behaviour in earlier chips. There is no guarantee that they will
8847 raise an exception, but may be treated as NOP's. In practice, it
8848 may only safe to rely on instructions matching:
8849
8850 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
8851 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
8852 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
8853
0963b4bd 8854 Even this may only true if the condition predicate is true. The
cca44b1b
JB
8855 following use a condition predicate of ALWAYS so it is always TRUE.
8856
8857 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
8858 and NetBSD all use a software interrupt rather than an undefined
8859 instruction to force a trap. This can be handled by by the
8860 abi-specific code during establishment of the gdbarch vector. */
8861
8862#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
8863#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
8864#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
8865#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
8866
948f8e3d
PA
8867static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
8868static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
8869static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
8870static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b
JB
8871
8872/* Determine the type and size of breakpoint to insert at PCPTR. Uses
8873 the program counter value to determine whether a 16-bit or 32-bit
8874 breakpoint should be used. It returns a pointer to a string of
8875 bytes that encode a breakpoint instruction, stores the length of
8876 the string to *lenptr, and adjusts the program counter (if
8877 necessary) to point to the actual memory location where the
8878 breakpoint should be inserted. */
8879
8880static const unsigned char *
8881arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
8882{
8883 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 8884 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 8885
9779414d 8886 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
8887 {
8888 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
8889
8890 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
8891 check whether we are replacing a 32-bit instruction. */
8892 if (tdep->thumb2_breakpoint != NULL)
8893 {
8894 gdb_byte buf[2];
8895 if (target_read_memory (*pcptr, buf, 2) == 0)
8896 {
8897 unsigned short inst1;
8898 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 8899 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
8900 {
8901 *lenptr = tdep->thumb2_breakpoint_size;
8902 return tdep->thumb2_breakpoint;
8903 }
8904 }
8905 }
8906
cca44b1b
JB
8907 *lenptr = tdep->thumb_breakpoint_size;
8908 return tdep->thumb_breakpoint;
8909 }
8910 else
8911 {
8912 *lenptr = tdep->arm_breakpoint_size;
8913 return tdep->arm_breakpoint;
8914 }
8915}
8916
177321bd
DJ
8917static void
8918arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
8919 int *kindptr)
8920{
177321bd
DJ
8921 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
8922
9779414d 8923 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
8924 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
8925 that this is not confused with a 32-bit ARM breakpoint. */
8926 *kindptr = 3;
8927}
8928
cca44b1b
JB
8929/* Extract from an array REGBUF containing the (raw) register state a
8930 function return value of type TYPE, and copy that, in virtual
8931 format, into VALBUF. */
8932
8933static void
8934arm_extract_return_value (struct type *type, struct regcache *regs,
8935 gdb_byte *valbuf)
8936{
8937 struct gdbarch *gdbarch = get_regcache_arch (regs);
8938 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8939
8940 if (TYPE_CODE_FLT == TYPE_CODE (type))
8941 {
8942 switch (gdbarch_tdep (gdbarch)->fp_model)
8943 {
8944 case ARM_FLOAT_FPA:
8945 {
8946 /* The value is in register F0 in internal format. We need to
8947 extract the raw value and then convert it to the desired
8948 internal type. */
8949 bfd_byte tmpbuf[FP_REGISTER_SIZE];
8950
8951 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
8952 convert_from_extended (floatformat_from_type (type), tmpbuf,
8953 valbuf, gdbarch_byte_order (gdbarch));
8954 }
8955 break;
8956
8957 case ARM_FLOAT_SOFT_FPA:
8958 case ARM_FLOAT_SOFT_VFP:
8959 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8960 not using the VFP ABI code. */
8961 case ARM_FLOAT_VFP:
8962 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
8963 if (TYPE_LENGTH (type) > 4)
8964 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
8965 valbuf + INT_REGISTER_SIZE);
8966 break;
8967
8968 default:
0963b4bd
MS
8969 internal_error (__FILE__, __LINE__,
8970 _("arm_extract_return_value: "
8971 "Floating point model not supported"));
cca44b1b
JB
8972 break;
8973 }
8974 }
8975 else if (TYPE_CODE (type) == TYPE_CODE_INT
8976 || TYPE_CODE (type) == TYPE_CODE_CHAR
8977 || TYPE_CODE (type) == TYPE_CODE_BOOL
8978 || TYPE_CODE (type) == TYPE_CODE_PTR
8979 || TYPE_CODE (type) == TYPE_CODE_REF
8980 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8981 {
b021a221
MS
8982 /* If the type is a plain integer, then the access is
8983 straight-forward. Otherwise we have to play around a bit
8984 more. */
cca44b1b
JB
8985 int len = TYPE_LENGTH (type);
8986 int regno = ARM_A1_REGNUM;
8987 ULONGEST tmp;
8988
8989 while (len > 0)
8990 {
8991 /* By using store_unsigned_integer we avoid having to do
8992 anything special for small big-endian values. */
8993 regcache_cooked_read_unsigned (regs, regno++, &tmp);
8994 store_unsigned_integer (valbuf,
8995 (len > INT_REGISTER_SIZE
8996 ? INT_REGISTER_SIZE : len),
8997 byte_order, tmp);
8998 len -= INT_REGISTER_SIZE;
8999 valbuf += INT_REGISTER_SIZE;
9000 }
9001 }
9002 else
9003 {
9004 /* For a structure or union the behaviour is as if the value had
9005 been stored to word-aligned memory and then loaded into
9006 registers with 32-bit load instruction(s). */
9007 int len = TYPE_LENGTH (type);
9008 int regno = ARM_A1_REGNUM;
9009 bfd_byte tmpbuf[INT_REGISTER_SIZE];
9010
9011 while (len > 0)
9012 {
9013 regcache_cooked_read (regs, regno++, tmpbuf);
9014 memcpy (valbuf, tmpbuf,
9015 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
9016 len -= INT_REGISTER_SIZE;
9017 valbuf += INT_REGISTER_SIZE;
9018 }
9019 }
9020}
9021
9022
9023/* Will a function return an aggregate type in memory or in a
9024 register? Return 0 if an aggregate type can be returned in a
9025 register, 1 if it must be returned in memory. */
9026
9027static int
9028arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
9029{
cca44b1b
JB
9030 enum type_code code;
9031
f168693b 9032 type = check_typedef (type);
cca44b1b 9033
b13c8ab2
YQ
9034 /* Simple, non-aggregate types (ie not including vectors and
9035 complex) are always returned in a register (or registers). */
9036 code = TYPE_CODE (type);
9037 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
9038 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
9039 return 0;
cca44b1b 9040
c4312b19
YQ
9041 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
9042 {
9043 /* Vector values should be returned using ARM registers if they
9044 are not over 16 bytes. */
9045 return (TYPE_LENGTH (type) > 16);
9046 }
9047
b13c8ab2 9048 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 9049 {
b13c8ab2
YQ
9050 /* The AAPCS says all aggregates not larger than a word are returned
9051 in a register. */
9052 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
9053 return 0;
9054
cca44b1b
JB
9055 return 1;
9056 }
b13c8ab2
YQ
9057 else
9058 {
9059 int nRc;
cca44b1b 9060
b13c8ab2
YQ
9061 /* All aggregate types that won't fit in a register must be returned
9062 in memory. */
9063 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
9064 return 1;
cca44b1b 9065
b13c8ab2
YQ
9066 /* In the ARM ABI, "integer" like aggregate types are returned in
9067 registers. For an aggregate type to be integer like, its size
9068 must be less than or equal to INT_REGISTER_SIZE and the
9069 offset of each addressable subfield must be zero. Note that bit
9070 fields are not addressable, and all addressable subfields of
9071 unions always start at offset zero.
cca44b1b 9072
b13c8ab2
YQ
9073 This function is based on the behaviour of GCC 2.95.1.
9074 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 9075
b13c8ab2
YQ
9076 Note: All versions of GCC before GCC 2.95.2 do not set up the
9077 parameters correctly for a function returning the following
9078 structure: struct { float f;}; This should be returned in memory,
9079 not a register. Richard Earnshaw sent me a patch, but I do not
9080 know of any way to detect if a function like the above has been
9081 compiled with the correct calling convention. */
9082
9083 /* Assume all other aggregate types can be returned in a register.
9084 Run a check for structures, unions and arrays. */
9085 nRc = 0;
67255d04 9086
b13c8ab2
YQ
9087 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
9088 {
9089 int i;
9090 /* Need to check if this struct/union is "integer" like. For
9091 this to be true, its size must be less than or equal to
9092 INT_REGISTER_SIZE and the offset of each addressable
9093 subfield must be zero. Note that bit fields are not
9094 addressable, and unions always start at offset zero. If any
9095 of the subfields is a floating point type, the struct/union
9096 cannot be an integer type. */
9097
9098 /* For each field in the object, check:
9099 1) Is it FP? --> yes, nRc = 1;
9100 2) Is it addressable (bitpos != 0) and
9101 not packed (bitsize == 0)?
9102 --> yes, nRc = 1
9103 */
9104
9105 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 9106 {
b13c8ab2
YQ
9107 enum type_code field_type_code;
9108
9109 field_type_code
9110 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
9111 i)));
9112
9113 /* Is it a floating point type field? */
9114 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
9115 {
9116 nRc = 1;
9117 break;
9118 }
b13c8ab2
YQ
9119
9120 /* If bitpos != 0, then we have to care about it. */
9121 if (TYPE_FIELD_BITPOS (type, i) != 0)
9122 {
9123 /* Bitfields are not addressable. If the field bitsize is
9124 zero, then the field is not packed. Hence it cannot be
9125 a bitfield or any other packed type. */
9126 if (TYPE_FIELD_BITSIZE (type, i) == 0)
9127 {
9128 nRc = 1;
9129 break;
9130 }
9131 }
67255d04
RE
9132 }
9133 }
67255d04 9134
b13c8ab2
YQ
9135 return nRc;
9136 }
67255d04
RE
9137}
9138
34e8f22d
RE
9139/* Write into appropriate registers a function return value of type
9140 TYPE, given in virtual format. */
9141
9142static void
b508a996 9143arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 9144 const gdb_byte *valbuf)
34e8f22d 9145{
be8626e0 9146 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 9147 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 9148
34e8f22d
RE
9149 if (TYPE_CODE (type) == TYPE_CODE_FLT)
9150 {
e362b510 9151 gdb_byte buf[MAX_REGISTER_SIZE];
34e8f22d 9152
be8626e0 9153 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
9154 {
9155 case ARM_FLOAT_FPA:
9156
be8626e0
MD
9157 convert_to_extended (floatformat_from_type (type), buf, valbuf,
9158 gdbarch_byte_order (gdbarch));
b508a996 9159 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
9160 break;
9161
fd50bc42 9162 case ARM_FLOAT_SOFT_FPA:
08216dd7 9163 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
9164 /* ARM_FLOAT_VFP can arise if this is a variadic function so
9165 not using the VFP ABI code. */
9166 case ARM_FLOAT_VFP:
b508a996
RE
9167 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
9168 if (TYPE_LENGTH (type) > 4)
9169 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 9170 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
9171 break;
9172
9173 default:
9b20d036
MS
9174 internal_error (__FILE__, __LINE__,
9175 _("arm_store_return_value: Floating "
9176 "point model not supported"));
08216dd7
RE
9177 break;
9178 }
34e8f22d 9179 }
b508a996
RE
9180 else if (TYPE_CODE (type) == TYPE_CODE_INT
9181 || TYPE_CODE (type) == TYPE_CODE_CHAR
9182 || TYPE_CODE (type) == TYPE_CODE_BOOL
9183 || TYPE_CODE (type) == TYPE_CODE_PTR
9184 || TYPE_CODE (type) == TYPE_CODE_REF
9185 || TYPE_CODE (type) == TYPE_CODE_ENUM)
9186 {
9187 if (TYPE_LENGTH (type) <= 4)
9188 {
9189 /* Values of one word or less are zero/sign-extended and
9190 returned in r0. */
7a5ea0d4 9191 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
9192 LONGEST val = unpack_long (type, valbuf);
9193
e17a4113 9194 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
9195 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
9196 }
9197 else
9198 {
9199 /* Integral values greater than one word are stored in consecutive
9200 registers starting with r0. This will always be a multiple of
9201 the regiser size. */
9202 int len = TYPE_LENGTH (type);
9203 int regno = ARM_A1_REGNUM;
9204
9205 while (len > 0)
9206 {
9207 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
9208 len -= INT_REGISTER_SIZE;
9209 valbuf += INT_REGISTER_SIZE;
b508a996
RE
9210 }
9211 }
9212 }
34e8f22d 9213 else
b508a996
RE
9214 {
9215 /* For a structure or union the behaviour is as if the value had
9216 been stored to word-aligned memory and then loaded into
9217 registers with 32-bit load instruction(s). */
9218 int len = TYPE_LENGTH (type);
9219 int regno = ARM_A1_REGNUM;
7a5ea0d4 9220 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
9221
9222 while (len > 0)
9223 {
9224 memcpy (tmpbuf, valbuf,
7a5ea0d4 9225 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 9226 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
9227 len -= INT_REGISTER_SIZE;
9228 valbuf += INT_REGISTER_SIZE;
b508a996
RE
9229 }
9230 }
34e8f22d
RE
9231}
9232
2af48f68
PB
9233
9234/* Handle function return values. */
9235
9236static enum return_value_convention
6a3a010b 9237arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
9238 struct type *valtype, struct regcache *regcache,
9239 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 9240{
7c00367c 9241 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 9242 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
9243 enum arm_vfp_cprc_base_type vfp_base_type;
9244 int vfp_base_count;
9245
9246 if (arm_vfp_abi_for_function (gdbarch, func_type)
9247 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
9248 {
9249 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
9250 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
9251 int i;
9252 for (i = 0; i < vfp_base_count; i++)
9253 {
58d6951d
DJ
9254 if (reg_char == 'q')
9255 {
9256 if (writebuf)
9257 arm_neon_quad_write (gdbarch, regcache, i,
9258 writebuf + i * unit_length);
9259
9260 if (readbuf)
9261 arm_neon_quad_read (gdbarch, regcache, i,
9262 readbuf + i * unit_length);
9263 }
9264 else
9265 {
9266 char name_buf[4];
9267 int regnum;
9268
8c042590 9269 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
9270 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9271 strlen (name_buf));
9272 if (writebuf)
9273 regcache_cooked_write (regcache, regnum,
9274 writebuf + i * unit_length);
9275 if (readbuf)
9276 regcache_cooked_read (regcache, regnum,
9277 readbuf + i * unit_length);
9278 }
90445bd3
DJ
9279 }
9280 return RETURN_VALUE_REGISTER_CONVENTION;
9281 }
7c00367c 9282
2af48f68
PB
9283 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
9284 || TYPE_CODE (valtype) == TYPE_CODE_UNION
9285 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
9286 {
7c00367c
MK
9287 if (tdep->struct_return == pcc_struct_return
9288 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
9289 return RETURN_VALUE_STRUCT_CONVENTION;
9290 }
b13c8ab2
YQ
9291 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
9292 {
9293 if (arm_return_in_memory (gdbarch, valtype))
9294 return RETURN_VALUE_STRUCT_CONVENTION;
9295 }
7052e42c 9296
2af48f68
PB
9297 if (writebuf)
9298 arm_store_return_value (valtype, regcache, writebuf);
9299
9300 if (readbuf)
9301 arm_extract_return_value (valtype, regcache, readbuf);
9302
9303 return RETURN_VALUE_REGISTER_CONVENTION;
9304}
9305
9306
9df628e0 9307static int
60ade65d 9308arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 9309{
e17a4113
UW
9310 struct gdbarch *gdbarch = get_frame_arch (frame);
9311 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9312 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 9313 CORE_ADDR jb_addr;
e362b510 9314 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 9315
60ade65d 9316 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
9317
9318 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 9319 INT_REGISTER_SIZE))
9df628e0
RE
9320 return 0;
9321
e17a4113 9322 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
9323 return 1;
9324}
9325
faa95490
DJ
9326/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
9327 return the target PC. Otherwise return 0. */
c906108c
SS
9328
9329CORE_ADDR
52f729a7 9330arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 9331{
2c02bd72 9332 const char *name;
faa95490 9333 int namelen;
c906108c
SS
9334 CORE_ADDR start_addr;
9335
9336 /* Find the starting address and name of the function containing the PC. */
9337 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
9338 {
9339 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
9340 check here. */
9341 start_addr = arm_skip_bx_reg (frame, pc);
9342 if (start_addr != 0)
9343 return start_addr;
9344
9345 return 0;
9346 }
c906108c 9347
faa95490
DJ
9348 /* If PC is in a Thumb call or return stub, return the address of the
9349 target PC, which is in a register. The thunk functions are called
9350 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
9351 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
9352 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
9353 if (startswith (name, "_call_via_")
9354 || startswith (name, "__ARM_call_via_"))
c906108c 9355 {
ed9a39eb
JM
9356 /* Use the name suffix to determine which register contains the
9357 target PC. */
c5aa993b
JM
9358 static char *table[15] =
9359 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9360 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
9361 };
c906108c 9362 int regno;
faa95490 9363 int offset = strlen (name) - 2;
c906108c
SS
9364
9365 for (regno = 0; regno <= 14; regno++)
faa95490 9366 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 9367 return get_frame_register_unsigned (frame, regno);
c906108c 9368 }
ed9a39eb 9369
faa95490
DJ
9370 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
9371 non-interworking calls to foo. We could decode the stubs
9372 to find the target but it's easier to use the symbol table. */
9373 namelen = strlen (name);
9374 if (name[0] == '_' && name[1] == '_'
9375 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 9376 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 9377 || (namelen > 2 + strlen ("_from_arm")
61012eef 9378 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
9379 {
9380 char *target_name;
9381 int target_len = namelen - 2;
3b7344d5 9382 struct bound_minimal_symbol minsym;
faa95490
DJ
9383 struct objfile *objfile;
9384 struct obj_section *sec;
9385
9386 if (name[namelen - 1] == 'b')
9387 target_len -= strlen ("_from_thumb");
9388 else
9389 target_len -= strlen ("_from_arm");
9390
224c3ddb 9391 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
9392 memcpy (target_name, name + 2, target_len);
9393 target_name[target_len] = '\0';
9394
9395 sec = find_pc_section (pc);
9396 objfile = (sec == NULL) ? NULL : sec->objfile;
9397 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 9398 if (minsym.minsym != NULL)
77e371c0 9399 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
9400 else
9401 return 0;
9402 }
9403
c5aa993b 9404 return 0; /* not a stub */
c906108c
SS
9405}
9406
afd7eef0
RE
9407static void
9408set_arm_command (char *args, int from_tty)
9409{
edefbb7c
AC
9410 printf_unfiltered (_("\
9411\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
9412 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
9413}
9414
9415static void
9416show_arm_command (char *args, int from_tty)
9417{
26304000 9418 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
9419}
9420
28e97307
DJ
9421static void
9422arm_update_current_architecture (void)
fd50bc42 9423{
28e97307 9424 struct gdbarch_info info;
fd50bc42 9425
28e97307 9426 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 9427 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 9428 return;
fd50bc42 9429
28e97307
DJ
9430 /* Update the architecture. */
9431 gdbarch_info_init (&info);
fd50bc42 9432
28e97307 9433 if (!gdbarch_update_p (info))
9b20d036 9434 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
9435}
9436
9437static void
9438set_fp_model_sfunc (char *args, int from_tty,
9439 struct cmd_list_element *c)
9440{
570dc176 9441 int fp_model;
fd50bc42
RE
9442
9443 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
9444 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
9445 {
aead7601 9446 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
9447 break;
9448 }
9449
9450 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 9451 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
9452 current_fp_model);
9453
28e97307 9454 arm_update_current_architecture ();
fd50bc42
RE
9455}
9456
9457static void
08546159
AC
9458show_fp_model (struct ui_file *file, int from_tty,
9459 struct cmd_list_element *c, const char *value)
fd50bc42 9460{
f5656ead 9461 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 9462
28e97307 9463 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 9464 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
9465 fprintf_filtered (file, _("\
9466The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
9467 fp_model_strings[tdep->fp_model]);
9468 else
9469 fprintf_filtered (file, _("\
9470The current ARM floating point model is \"%s\".\n"),
9471 fp_model_strings[arm_fp_model]);
9472}
9473
9474static void
9475arm_set_abi (char *args, int from_tty,
9476 struct cmd_list_element *c)
9477{
570dc176 9478 int arm_abi;
28e97307
DJ
9479
9480 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
9481 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
9482 {
aead7601 9483 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
9484 break;
9485 }
9486
9487 if (arm_abi == ARM_ABI_LAST)
9488 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
9489 arm_abi_string);
9490
9491 arm_update_current_architecture ();
9492}
9493
9494static void
9495arm_show_abi (struct ui_file *file, int from_tty,
9496 struct cmd_list_element *c, const char *value)
9497{
f5656ead 9498 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
9499
9500 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 9501 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
9502 fprintf_filtered (file, _("\
9503The current ARM ABI is \"auto\" (currently \"%s\").\n"),
9504 arm_abi_strings[tdep->arm_abi]);
9505 else
9506 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
9507 arm_abi_string);
fd50bc42
RE
9508}
9509
0428b8f5
DJ
9510static void
9511arm_show_fallback_mode (struct ui_file *file, int from_tty,
9512 struct cmd_list_element *c, const char *value)
9513{
0963b4bd
MS
9514 fprintf_filtered (file,
9515 _("The current execution mode assumed "
9516 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
9517 arm_fallback_mode_string);
9518}
9519
9520static void
9521arm_show_force_mode (struct ui_file *file, int from_tty,
9522 struct cmd_list_element *c, const char *value)
9523{
f5656ead 9524 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
0428b8f5 9525
0963b4bd
MS
9526 fprintf_filtered (file,
9527 _("The current execution mode assumed "
9528 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
9529 arm_force_mode_string);
9530}
9531
afd7eef0
RE
9532/* If the user changes the register disassembly style used for info
9533 register and other commands, we have to also switch the style used
9534 in opcodes for disassembly output. This function is run in the "set
9535 arm disassembly" command, and does that. */
bc90b915
FN
9536
9537static void
afd7eef0 9538set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
9539 struct cmd_list_element *c)
9540{
afd7eef0 9541 set_disassembly_style ();
bc90b915
FN
9542}
9543\f
966fbf70 9544/* Return the ARM register name corresponding to register I. */
a208b0cb 9545static const char *
d93859e2 9546arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 9547{
58d6951d
DJ
9548 const int num_regs = gdbarch_num_regs (gdbarch);
9549
9550 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
9551 && i >= num_regs && i < num_regs + 32)
9552 {
9553 static const char *const vfp_pseudo_names[] = {
9554 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
9555 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
9556 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
9557 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
9558 };
9559
9560 return vfp_pseudo_names[i - num_regs];
9561 }
9562
9563 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
9564 && i >= num_regs + 32 && i < num_regs + 32 + 16)
9565 {
9566 static const char *const neon_pseudo_names[] = {
9567 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
9568 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
9569 };
9570
9571 return neon_pseudo_names[i - num_regs - 32];
9572 }
9573
ff6f572f
DJ
9574 if (i >= ARRAY_SIZE (arm_register_names))
9575 /* These registers are only supported on targets which supply
9576 an XML description. */
9577 return "";
9578
966fbf70
RE
9579 return arm_register_names[i];
9580}
9581
bc90b915 9582static void
afd7eef0 9583set_disassembly_style (void)
bc90b915 9584{
123dc839 9585 int current;
bc90b915 9586
123dc839
DJ
9587 /* Find the style that the user wants. */
9588 for (current = 0; current < num_disassembly_options; current++)
9589 if (disassembly_style == valid_disassembly_styles[current])
9590 break;
9591 gdb_assert (current < num_disassembly_options);
bc90b915 9592
94c30b78 9593 /* Synchronize the disassembler. */
bc90b915
FN
9594 set_arm_regname_option (current);
9595}
9596
082fc60d
RE
9597/* Test whether the coff symbol specific value corresponds to a Thumb
9598 function. */
9599
9600static int
9601coff_sym_is_thumb (int val)
9602{
f8bf5763
PM
9603 return (val == C_THUMBEXT
9604 || val == C_THUMBSTAT
9605 || val == C_THUMBEXTFUNC
9606 || val == C_THUMBSTATFUNC
9607 || val == C_THUMBLABEL);
082fc60d
RE
9608}
9609
9610/* arm_coff_make_msymbol_special()
9611 arm_elf_make_msymbol_special()
9612
9613 These functions test whether the COFF or ELF symbol corresponds to
9614 an address in thumb code, and set a "special" bit in a minimal
9615 symbol to indicate that it does. */
9616
34e8f22d 9617static void
082fc60d
RE
9618arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
9619{
467d42c4
UW
9620 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
9621 == ST_BRANCH_TO_THUMB)
082fc60d
RE
9622 MSYMBOL_SET_SPECIAL (msym);
9623}
9624
34e8f22d 9625static void
082fc60d
RE
9626arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
9627{
9628 if (coff_sym_is_thumb (val))
9629 MSYMBOL_SET_SPECIAL (msym);
9630}
9631
60c5725c 9632static void
c1bd65d0 9633arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 9634{
9a3c8263 9635 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
9636 unsigned int i;
9637
9638 for (i = 0; i < objfile->obfd->section_count; i++)
9639 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
9640}
9641
9642static void
9643arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
9644 asymbol *sym)
9645{
9646 const char *name = bfd_asymbol_name (sym);
9647 struct arm_per_objfile *data;
9648 VEC(arm_mapping_symbol_s) **map_p;
9649 struct arm_mapping_symbol new_map_sym;
9650
9651 gdb_assert (name[0] == '$');
9652 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
9653 return;
9654
9a3c8263
SM
9655 data = (struct arm_per_objfile *) objfile_data (objfile,
9656 arm_objfile_data_key);
60c5725c
DJ
9657 if (data == NULL)
9658 {
9659 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
9660 struct arm_per_objfile);
9661 set_objfile_data (objfile, arm_objfile_data_key, data);
9662 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
9663 objfile->obfd->section_count,
9664 VEC(arm_mapping_symbol_s) *);
9665 }
9666 map_p = &data->section_maps[bfd_get_section (sym)->index];
9667
9668 new_map_sym.value = sym->value;
9669 new_map_sym.type = name[1];
9670
9671 /* Assume that most mapping symbols appear in order of increasing
9672 value. If they were randomly distributed, it would be faster to
9673 always push here and then sort at first use. */
9674 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
9675 {
9676 struct arm_mapping_symbol *prev_map_sym;
9677
9678 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
9679 if (prev_map_sym->value >= sym->value)
9680 {
9681 unsigned int idx;
9682 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
9683 arm_compare_mapping_symbols);
9684 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
9685 return;
9686 }
9687 }
9688
9689 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
9690}
9691
756fe439 9692static void
61a1198a 9693arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 9694{
9779414d 9695 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 9696 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
9697
9698 /* If necessary, set the T bit. */
9699 if (arm_apcs_32)
9700 {
9779414d 9701 ULONGEST val, t_bit;
61a1198a 9702 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
9703 t_bit = arm_psr_thumb_bit (gdbarch);
9704 if (arm_pc_is_thumb (gdbarch, pc))
9705 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9706 val | t_bit);
756fe439 9707 else
61a1198a 9708 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 9709 val & ~t_bit);
756fe439
DJ
9710 }
9711}
123dc839 9712
58d6951d
DJ
9713/* Read the contents of a NEON quad register, by reading from two
9714 double registers. This is used to implement the quad pseudo
9715 registers, and for argument passing in case the quad registers are
9716 missing; vectors are passed in quad registers when using the VFP
9717 ABI, even if a NEON unit is not present. REGNUM is the index of
9718 the quad register, in [0, 15]. */
9719
05d1431c 9720static enum register_status
58d6951d
DJ
9721arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
9722 int regnum, gdb_byte *buf)
9723{
9724 char name_buf[4];
9725 gdb_byte reg_buf[8];
9726 int offset, double_regnum;
05d1431c 9727 enum register_status status;
58d6951d 9728
8c042590 9729 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
9730 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9731 strlen (name_buf));
9732
9733 /* d0 is always the least significant half of q0. */
9734 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9735 offset = 8;
9736 else
9737 offset = 0;
9738
05d1431c
PA
9739 status = regcache_raw_read (regcache, double_regnum, reg_buf);
9740 if (status != REG_VALID)
9741 return status;
58d6951d
DJ
9742 memcpy (buf + offset, reg_buf, 8);
9743
9744 offset = 8 - offset;
05d1431c
PA
9745 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
9746 if (status != REG_VALID)
9747 return status;
58d6951d 9748 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
9749
9750 return REG_VALID;
58d6951d
DJ
9751}
9752
05d1431c 9753static enum register_status
58d6951d
DJ
9754arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
9755 int regnum, gdb_byte *buf)
9756{
9757 const int num_regs = gdbarch_num_regs (gdbarch);
9758 char name_buf[4];
9759 gdb_byte reg_buf[8];
9760 int offset, double_regnum;
9761
9762 gdb_assert (regnum >= num_regs);
9763 regnum -= num_regs;
9764
9765 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
9766 /* Quad-precision register. */
05d1431c 9767 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
9768 else
9769 {
05d1431c
PA
9770 enum register_status status;
9771
58d6951d
DJ
9772 /* Single-precision register. */
9773 gdb_assert (regnum < 32);
9774
9775 /* s0 is always the least significant half of d0. */
9776 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9777 offset = (regnum & 1) ? 0 : 4;
9778 else
9779 offset = (regnum & 1) ? 4 : 0;
9780
8c042590 9781 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
9782 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9783 strlen (name_buf));
9784
05d1431c
PA
9785 status = regcache_raw_read (regcache, double_regnum, reg_buf);
9786 if (status == REG_VALID)
9787 memcpy (buf, reg_buf + offset, 4);
9788 return status;
58d6951d
DJ
9789 }
9790}
9791
9792/* Store the contents of BUF to a NEON quad register, by writing to
9793 two double registers. This is used to implement the quad pseudo
9794 registers, and for argument passing in case the quad registers are
9795 missing; vectors are passed in quad registers when using the VFP
9796 ABI, even if a NEON unit is not present. REGNUM is the index
9797 of the quad register, in [0, 15]. */
9798
9799static void
9800arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
9801 int regnum, const gdb_byte *buf)
9802{
9803 char name_buf[4];
58d6951d
DJ
9804 int offset, double_regnum;
9805
8c042590 9806 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
9807 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9808 strlen (name_buf));
9809
9810 /* d0 is always the least significant half of q0. */
9811 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9812 offset = 8;
9813 else
9814 offset = 0;
9815
9816 regcache_raw_write (regcache, double_regnum, buf + offset);
9817 offset = 8 - offset;
9818 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
9819}
9820
9821static void
9822arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
9823 int regnum, const gdb_byte *buf)
9824{
9825 const int num_regs = gdbarch_num_regs (gdbarch);
9826 char name_buf[4];
9827 gdb_byte reg_buf[8];
9828 int offset, double_regnum;
9829
9830 gdb_assert (regnum >= num_regs);
9831 regnum -= num_regs;
9832
9833 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
9834 /* Quad-precision register. */
9835 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
9836 else
9837 {
9838 /* Single-precision register. */
9839 gdb_assert (regnum < 32);
9840
9841 /* s0 is always the least significant half of d0. */
9842 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9843 offset = (regnum & 1) ? 0 : 4;
9844 else
9845 offset = (regnum & 1) ? 4 : 0;
9846
8c042590 9847 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
9848 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9849 strlen (name_buf));
9850
9851 regcache_raw_read (regcache, double_regnum, reg_buf);
9852 memcpy (reg_buf + offset, buf, 4);
9853 regcache_raw_write (regcache, double_regnum, reg_buf);
9854 }
9855}
9856
123dc839
DJ
9857static struct value *
9858value_of_arm_user_reg (struct frame_info *frame, const void *baton)
9859{
9a3c8263 9860 const int *reg_p = (const int *) baton;
123dc839
DJ
9861 return value_of_register (*reg_p, frame);
9862}
97e03143 9863\f
70f80edf
JT
9864static enum gdb_osabi
9865arm_elf_osabi_sniffer (bfd *abfd)
97e03143 9866{
2af48f68 9867 unsigned int elfosabi;
70f80edf 9868 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 9869
70f80edf 9870 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 9871
28e97307
DJ
9872 if (elfosabi == ELFOSABI_ARM)
9873 /* GNU tools use this value. Check note sections in this case,
9874 as well. */
9875 bfd_map_over_sections (abfd,
9876 generic_elf_osabi_sniff_abi_tag_sections,
9877 &osabi);
97e03143 9878
28e97307 9879 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 9880 return osabi;
97e03143
RE
9881}
9882
54483882
YQ
9883static int
9884arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
9885 struct reggroup *group)
9886{
2c291032
YQ
9887 /* FPS register's type is INT, but belongs to float_reggroup. Beside
9888 this, FPS register belongs to save_regroup, restore_reggroup, and
9889 all_reggroup, of course. */
54483882 9890 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
9891 return (group == float_reggroup
9892 || group == save_reggroup
9893 || group == restore_reggroup
9894 || group == all_reggroup);
54483882
YQ
9895 else
9896 return default_register_reggroup_p (gdbarch, regnum, group);
9897}
9898
25f8c692
JL
9899\f
9900/* For backward-compatibility we allow two 'g' packet lengths with
9901 the remote protocol depending on whether FPA registers are
9902 supplied. M-profile targets do not have FPA registers, but some
9903 stubs already exist in the wild which use a 'g' packet which
9904 supplies them albeit with dummy values. The packet format which
9905 includes FPA registers should be considered deprecated for
9906 M-profile targets. */
9907
9908static void
9909arm_register_g_packet_guesses (struct gdbarch *gdbarch)
9910{
9911 if (gdbarch_tdep (gdbarch)->is_m)
9912 {
9913 /* If we know from the executable this is an M-profile target,
9914 cater for remote targets whose register set layout is the
9915 same as the FPA layout. */
9916 register_remote_g_packet_guess (gdbarch,
03145bf4 9917 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
9918 (16 * INT_REGISTER_SIZE)
9919 + (8 * FP_REGISTER_SIZE)
9920 + (2 * INT_REGISTER_SIZE),
9921 tdesc_arm_with_m_fpa_layout);
9922
9923 /* The regular M-profile layout. */
9924 register_remote_g_packet_guess (gdbarch,
9925 /* r0-r12,sp,lr,pc; xpsr */
9926 (16 * INT_REGISTER_SIZE)
9927 + INT_REGISTER_SIZE,
9928 tdesc_arm_with_m);
3184d3f9
JL
9929
9930 /* M-profile plus M4F VFP. */
9931 register_remote_g_packet_guess (gdbarch,
9932 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
9933 (16 * INT_REGISTER_SIZE)
9934 + (16 * VFP_REGISTER_SIZE)
9935 + (2 * INT_REGISTER_SIZE),
9936 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
9937 }
9938
9939 /* Otherwise we don't have a useful guess. */
9940}
9941
70f80edf 9942\f
da3c6d4a
MS
9943/* Initialize the current architecture based on INFO. If possible,
9944 re-use an architecture from ARCHES, which is a list of
9945 architectures already created during this debugging session.
97e03143 9946
da3c6d4a
MS
9947 Called e.g. at program startup, when reading a core file, and when
9948 reading a binary file. */
97e03143 9949
39bbf761
RE
9950static struct gdbarch *
9951arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
9952{
97e03143 9953 struct gdbarch_tdep *tdep;
39bbf761 9954 struct gdbarch *gdbarch;
28e97307
DJ
9955 struct gdbarch_list *best_arch;
9956 enum arm_abi_kind arm_abi = arm_abi_global;
9957 enum arm_float_model fp_model = arm_fp_model;
123dc839 9958 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 9959 int i, is_m = 0;
330c6ca9 9960 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 9961 int have_wmmx_registers = 0;
58d6951d 9962 int have_neon = 0;
ff6f572f 9963 int have_fpa_registers = 1;
9779414d
DJ
9964 const struct target_desc *tdesc = info.target_desc;
9965
9966 /* If we have an object to base this architecture on, try to determine
9967 its ABI. */
9968
9969 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
9970 {
9971 int ei_osabi, e_flags;
9972
9973 switch (bfd_get_flavour (info.abfd))
9974 {
9975 case bfd_target_aout_flavour:
9976 /* Assume it's an old APCS-style ABI. */
9977 arm_abi = ARM_ABI_APCS;
9978 break;
9979
9980 case bfd_target_coff_flavour:
9981 /* Assume it's an old APCS-style ABI. */
9982 /* XXX WinCE? */
9983 arm_abi = ARM_ABI_APCS;
9984 break;
9985
9986 case bfd_target_elf_flavour:
9987 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
9988 e_flags = elf_elfheader (info.abfd)->e_flags;
9989
9990 if (ei_osabi == ELFOSABI_ARM)
9991 {
9992 /* GNU tools used to use this value, but do not for EABI
9993 objects. There's nowhere to tag an EABI version
9994 anyway, so assume APCS. */
9995 arm_abi = ARM_ABI_APCS;
9996 }
d403db27 9997 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
9998 {
9999 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
10000 int attr_arch, attr_profile;
10001
10002 switch (eabi_ver)
10003 {
10004 case EF_ARM_EABI_UNKNOWN:
10005 /* Assume GNU tools. */
10006 arm_abi = ARM_ABI_APCS;
10007 break;
10008
10009 case EF_ARM_EABI_VER4:
10010 case EF_ARM_EABI_VER5:
10011 arm_abi = ARM_ABI_AAPCS;
10012 /* EABI binaries default to VFP float ordering.
10013 They may also contain build attributes that can
10014 be used to identify if the VFP argument-passing
10015 ABI is in use. */
10016 if (fp_model == ARM_FLOAT_AUTO)
10017 {
10018#ifdef HAVE_ELF
10019 switch (bfd_elf_get_obj_attr_int (info.abfd,
10020 OBJ_ATTR_PROC,
10021 Tag_ABI_VFP_args))
10022 {
b35b0298 10023 case AEABI_VFP_args_base:
9779414d
DJ
10024 /* "The user intended FP parameter/result
10025 passing to conform to AAPCS, base
10026 variant". */
10027 fp_model = ARM_FLOAT_SOFT_VFP;
10028 break;
b35b0298 10029 case AEABI_VFP_args_vfp:
9779414d
DJ
10030 /* "The user intended FP parameter/result
10031 passing to conform to AAPCS, VFP
10032 variant". */
10033 fp_model = ARM_FLOAT_VFP;
10034 break;
b35b0298 10035 case AEABI_VFP_args_toolchain:
9779414d
DJ
10036 /* "The user intended FP parameter/result
10037 passing to conform to tool chain-specific
10038 conventions" - we don't know any such
10039 conventions, so leave it as "auto". */
10040 break;
b35b0298 10041 case AEABI_VFP_args_compatible:
5c294fee
TG
10042 /* "Code is compatible with both the base
10043 and VFP variants; the user did not permit
10044 non-variadic functions to pass FP
10045 parameters/results" - leave it as
10046 "auto". */
10047 break;
9779414d
DJ
10048 default:
10049 /* Attribute value not mentioned in the
5c294fee 10050 November 2012 ABI, so leave it as
9779414d
DJ
10051 "auto". */
10052 break;
10053 }
10054#else
10055 fp_model = ARM_FLOAT_SOFT_VFP;
10056#endif
10057 }
10058 break;
10059
10060 default:
10061 /* Leave it as "auto". */
10062 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
10063 break;
10064 }
10065
10066#ifdef HAVE_ELF
10067 /* Detect M-profile programs. This only works if the
10068 executable file includes build attributes; GCC does
10069 copy them to the executable, but e.g. RealView does
10070 not. */
10071 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10072 Tag_CPU_arch);
0963b4bd
MS
10073 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
10074 OBJ_ATTR_PROC,
9779414d
DJ
10075 Tag_CPU_arch_profile);
10076 /* GCC specifies the profile for v6-M; RealView only
10077 specifies the profile for architectures starting with
10078 V7 (as opposed to architectures with a tag
10079 numerically greater than TAG_CPU_ARCH_V7). */
10080 if (!tdesc_has_registers (tdesc)
10081 && (attr_arch == TAG_CPU_ARCH_V6_M
10082 || attr_arch == TAG_CPU_ARCH_V6S_M
10083 || attr_profile == 'M'))
25f8c692 10084 is_m = 1;
9779414d
DJ
10085#endif
10086 }
10087
10088 if (fp_model == ARM_FLOAT_AUTO)
10089 {
10090 int e_flags = elf_elfheader (info.abfd)->e_flags;
10091
10092 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
10093 {
10094 case 0:
10095 /* Leave it as "auto". Strictly speaking this case
10096 means FPA, but almost nobody uses that now, and
10097 many toolchains fail to set the appropriate bits
10098 for the floating-point model they use. */
10099 break;
10100 case EF_ARM_SOFT_FLOAT:
10101 fp_model = ARM_FLOAT_SOFT_FPA;
10102 break;
10103 case EF_ARM_VFP_FLOAT:
10104 fp_model = ARM_FLOAT_VFP;
10105 break;
10106 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
10107 fp_model = ARM_FLOAT_SOFT_VFP;
10108 break;
10109 }
10110 }
10111
10112 if (e_flags & EF_ARM_BE8)
10113 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
10114
10115 break;
10116
10117 default:
10118 /* Leave it as "auto". */
10119 break;
10120 }
10121 }
123dc839
DJ
10122
10123 /* Check any target description for validity. */
9779414d 10124 if (tdesc_has_registers (tdesc))
123dc839
DJ
10125 {
10126 /* For most registers we require GDB's default names; but also allow
10127 the numeric names for sp / lr / pc, as a convenience. */
10128 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
10129 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
10130 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
10131
10132 const struct tdesc_feature *feature;
58d6951d 10133 int valid_p;
123dc839 10134
9779414d 10135 feature = tdesc_find_feature (tdesc,
123dc839
DJ
10136 "org.gnu.gdb.arm.core");
10137 if (feature == NULL)
9779414d
DJ
10138 {
10139 feature = tdesc_find_feature (tdesc,
10140 "org.gnu.gdb.arm.m-profile");
10141 if (feature == NULL)
10142 return NULL;
10143 else
10144 is_m = 1;
10145 }
123dc839
DJ
10146
10147 tdesc_data = tdesc_data_alloc ();
10148
10149 valid_p = 1;
10150 for (i = 0; i < ARM_SP_REGNUM; i++)
10151 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
10152 arm_register_names[i]);
10153 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
10154 ARM_SP_REGNUM,
10155 arm_sp_names);
10156 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
10157 ARM_LR_REGNUM,
10158 arm_lr_names);
10159 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
10160 ARM_PC_REGNUM,
10161 arm_pc_names);
9779414d
DJ
10162 if (is_m)
10163 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10164 ARM_PS_REGNUM, "xpsr");
10165 else
10166 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10167 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
10168
10169 if (!valid_p)
10170 {
10171 tdesc_data_cleanup (tdesc_data);
10172 return NULL;
10173 }
10174
9779414d 10175 feature = tdesc_find_feature (tdesc,
123dc839
DJ
10176 "org.gnu.gdb.arm.fpa");
10177 if (feature != NULL)
10178 {
10179 valid_p = 1;
10180 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
10181 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
10182 arm_register_names[i]);
10183 if (!valid_p)
10184 {
10185 tdesc_data_cleanup (tdesc_data);
10186 return NULL;
10187 }
10188 }
ff6f572f
DJ
10189 else
10190 have_fpa_registers = 0;
10191
9779414d 10192 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
10193 "org.gnu.gdb.xscale.iwmmxt");
10194 if (feature != NULL)
10195 {
10196 static const char *const iwmmxt_names[] = {
10197 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
10198 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
10199 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
10200 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
10201 };
10202
10203 valid_p = 1;
10204 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
10205 valid_p
10206 &= tdesc_numbered_register (feature, tdesc_data, i,
10207 iwmmxt_names[i - ARM_WR0_REGNUM]);
10208
10209 /* Check for the control registers, but do not fail if they
10210 are missing. */
10211 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
10212 tdesc_numbered_register (feature, tdesc_data, i,
10213 iwmmxt_names[i - ARM_WR0_REGNUM]);
10214
10215 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
10216 valid_p
10217 &= tdesc_numbered_register (feature, tdesc_data, i,
10218 iwmmxt_names[i - ARM_WR0_REGNUM]);
10219
10220 if (!valid_p)
10221 {
10222 tdesc_data_cleanup (tdesc_data);
10223 return NULL;
10224 }
a56cc1ce
YQ
10225
10226 have_wmmx_registers = 1;
ff6f572f 10227 }
58d6951d
DJ
10228
10229 /* If we have a VFP unit, check whether the single precision registers
10230 are present. If not, then we will synthesize them as pseudo
10231 registers. */
9779414d 10232 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
10233 "org.gnu.gdb.arm.vfp");
10234 if (feature != NULL)
10235 {
10236 static const char *const vfp_double_names[] = {
10237 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
10238 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
10239 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
10240 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
10241 };
10242
10243 /* Require the double precision registers. There must be either
10244 16 or 32. */
10245 valid_p = 1;
10246 for (i = 0; i < 32; i++)
10247 {
10248 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10249 ARM_D0_REGNUM + i,
10250 vfp_double_names[i]);
10251 if (!valid_p)
10252 break;
10253 }
2b9e5ea6
UW
10254 if (!valid_p && i == 16)
10255 valid_p = 1;
58d6951d 10256
2b9e5ea6
UW
10257 /* Also require FPSCR. */
10258 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10259 ARM_FPSCR_REGNUM, "fpscr");
10260 if (!valid_p)
58d6951d
DJ
10261 {
10262 tdesc_data_cleanup (tdesc_data);
10263 return NULL;
10264 }
10265
10266 if (tdesc_unnumbered_register (feature, "s0") == 0)
10267 have_vfp_pseudos = 1;
10268
330c6ca9 10269 vfp_register_count = i;
58d6951d
DJ
10270
10271 /* If we have VFP, also check for NEON. The architecture allows
10272 NEON without VFP (integer vector operations only), but GDB
10273 does not support that. */
9779414d 10274 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
10275 "org.gnu.gdb.arm.neon");
10276 if (feature != NULL)
10277 {
10278 /* NEON requires 32 double-precision registers. */
10279 if (i != 32)
10280 {
10281 tdesc_data_cleanup (tdesc_data);
10282 return NULL;
10283 }
10284
10285 /* If there are quad registers defined by the stub, use
10286 their type; otherwise (normally) provide them with
10287 the default type. */
10288 if (tdesc_unnumbered_register (feature, "q0") == 0)
10289 have_neon_pseudos = 1;
10290
10291 have_neon = 1;
10292 }
10293 }
123dc839 10294 }
39bbf761 10295
28e97307
DJ
10296 /* If there is already a candidate, use it. */
10297 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
10298 best_arch != NULL;
10299 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
10300 {
b8926edc
DJ
10301 if (arm_abi != ARM_ABI_AUTO
10302 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
10303 continue;
10304
b8926edc
DJ
10305 if (fp_model != ARM_FLOAT_AUTO
10306 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
10307 continue;
10308
58d6951d
DJ
10309 /* There are various other properties in tdep that we do not
10310 need to check here: those derived from a target description,
10311 since gdbarches with a different target description are
10312 automatically disqualified. */
10313
9779414d
DJ
10314 /* Do check is_m, though, since it might come from the binary. */
10315 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
10316 continue;
10317
28e97307
DJ
10318 /* Found a match. */
10319 break;
10320 }
97e03143 10321
28e97307 10322 if (best_arch != NULL)
123dc839
DJ
10323 {
10324 if (tdesc_data != NULL)
10325 tdesc_data_cleanup (tdesc_data);
10326 return best_arch->gdbarch;
10327 }
28e97307 10328
8d749320 10329 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
10330 gdbarch = gdbarch_alloc (&info, tdep);
10331
28e97307
DJ
10332 /* Record additional information about the architecture we are defining.
10333 These are gdbarch discriminators, like the OSABI. */
10334 tdep->arm_abi = arm_abi;
10335 tdep->fp_model = fp_model;
9779414d 10336 tdep->is_m = is_m;
ff6f572f 10337 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 10338 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
10339 gdb_assert (vfp_register_count == 0
10340 || vfp_register_count == 16
10341 || vfp_register_count == 32);
10342 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
10343 tdep->have_vfp_pseudos = have_vfp_pseudos;
10344 tdep->have_neon_pseudos = have_neon_pseudos;
10345 tdep->have_neon = have_neon;
08216dd7 10346
25f8c692
JL
10347 arm_register_g_packet_guesses (gdbarch);
10348
08216dd7 10349 /* Breakpoints. */
9d4fde75 10350 switch (info.byte_order_for_code)
67255d04
RE
10351 {
10352 case BFD_ENDIAN_BIG:
66e810cd
RE
10353 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
10354 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
10355 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
10356 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
10357
67255d04
RE
10358 break;
10359
10360 case BFD_ENDIAN_LITTLE:
66e810cd
RE
10361 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
10362 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
10363 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
10364 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
10365
67255d04
RE
10366 break;
10367
10368 default:
10369 internal_error (__FILE__, __LINE__,
edefbb7c 10370 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
10371 }
10372
d7b486e7
RE
10373 /* On ARM targets char defaults to unsigned. */
10374 set_gdbarch_char_signed (gdbarch, 0);
10375
cca44b1b
JB
10376 /* Note: for displaced stepping, this includes the breakpoint, and one word
10377 of additional scratch space. This setting isn't used for anything beside
10378 displaced stepping at present. */
10379 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
10380
9df628e0 10381 /* This should be low enough for everything. */
97e03143 10382 tdep->lowest_pc = 0x20;
94c30b78 10383 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 10384
7c00367c
MK
10385 /* The default, for both APCS and AAPCS, is to return small
10386 structures in registers. */
10387 tdep->struct_return = reg_struct_return;
10388
2dd604e7 10389 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 10390 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 10391
756fe439
DJ
10392 set_gdbarch_write_pc (gdbarch, arm_write_pc);
10393
148754e5 10394 /* Frame handling. */
a262aec2 10395 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
10396 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
10397 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
10398
eb5492fa 10399 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 10400
34e8f22d 10401 /* Address manipulation. */
34e8f22d
RE
10402 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
10403
34e8f22d
RE
10404 /* Advance PC across function entry code. */
10405 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
10406
c9cf6e20
MG
10407 /* Detect whether PC is at a point where the stack has been destroyed. */
10408 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 10409
190dce09
UW
10410 /* Skip trampolines. */
10411 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
10412
34e8f22d
RE
10413 /* The stack grows downward. */
10414 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
10415
10416 /* Breakpoint manipulation. */
10417 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
10418 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
10419 arm_remote_breakpoint_from_pc);
34e8f22d
RE
10420
10421 /* Information about registers, etc. */
34e8f22d
RE
10422 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
10423 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 10424 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 10425 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 10426 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 10427
ff6f572f
DJ
10428 /* This "info float" is FPA-specific. Use the generic version if we
10429 do not have FPA. */
10430 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
10431 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
10432
26216b98 10433 /* Internal <-> external register number maps. */
ff6f572f 10434 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
10435 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
10436
34e8f22d
RE
10437 set_gdbarch_register_name (gdbarch, arm_register_name);
10438
10439 /* Returning results. */
2af48f68 10440 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 10441
03d48a7d
RE
10442 /* Disassembly. */
10443 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
10444
34e8f22d
RE
10445 /* Minsymbol frobbing. */
10446 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
10447 set_gdbarch_coff_make_msymbol_special (gdbarch,
10448 arm_coff_make_msymbol_special);
60c5725c 10449 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 10450
f9d67f43
DJ
10451 /* Thumb-2 IT block support. */
10452 set_gdbarch_adjust_breakpoint_address (gdbarch,
10453 arm_adjust_breakpoint_address);
10454
0d5de010
DJ
10455 /* Virtual tables. */
10456 set_gdbarch_vbit_in_delta (gdbarch, 1);
10457
97e03143 10458 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 10459 gdbarch_init_osabi (info, gdbarch);
97e03143 10460
b39cc962
DJ
10461 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
10462
eb5492fa 10463 /* Add some default predicates. */
2ae28aa9
YQ
10464 if (is_m)
10465 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
10466 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
10467 dwarf2_append_unwinders (gdbarch);
0e9e9abd 10468 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 10469 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 10470
97e03143
RE
10471 /* Now we have tuned the configuration, set a few final things,
10472 based on what the OS ABI has told us. */
10473
b8926edc
DJ
10474 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
10475 binaries are always marked. */
10476 if (tdep->arm_abi == ARM_ABI_AUTO)
10477 tdep->arm_abi = ARM_ABI_APCS;
10478
e3039479
UW
10479 /* Watchpoints are not steppable. */
10480 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
10481
b8926edc
DJ
10482 /* We used to default to FPA for generic ARM, but almost nobody
10483 uses that now, and we now provide a way for the user to force
10484 the model. So default to the most useful variant. */
10485 if (tdep->fp_model == ARM_FLOAT_AUTO)
10486 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
10487
9df628e0
RE
10488 if (tdep->jb_pc >= 0)
10489 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
10490
08216dd7 10491 /* Floating point sizes and format. */
8da61cc4 10492 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 10493 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 10494 {
8da61cc4
DJ
10495 set_gdbarch_double_format
10496 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10497 set_gdbarch_long_double_format
10498 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10499 }
10500 else
10501 {
10502 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
10503 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
10504 }
10505
58d6951d
DJ
10506 if (have_vfp_pseudos)
10507 {
10508 /* NOTE: These are the only pseudo registers used by
10509 the ARM target at the moment. If more are added, a
10510 little more care in numbering will be needed. */
10511
10512 int num_pseudos = 32;
10513 if (have_neon_pseudos)
10514 num_pseudos += 16;
10515 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
10516 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
10517 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
10518 }
10519
123dc839 10520 if (tdesc_data)
58d6951d
DJ
10521 {
10522 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
10523
9779414d 10524 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
10525
10526 /* Override tdesc_register_type to adjust the types of VFP
10527 registers for NEON. */
10528 set_gdbarch_register_type (gdbarch, arm_register_type);
10529 }
123dc839
DJ
10530
10531 /* Add standard register aliases. We add aliases even for those
10532 nanes which are used by the current architecture - it's simpler,
10533 and does no harm, since nothing ever lists user registers. */
10534 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
10535 user_reg_add (gdbarch, arm_register_aliases[i].name,
10536 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
10537
39bbf761
RE
10538 return gdbarch;
10539}
10540
97e03143 10541static void
2af46ca0 10542arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 10543{
2af46ca0 10544 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
10545
10546 if (tdep == NULL)
10547 return;
10548
edefbb7c 10549 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
10550 (unsigned long) tdep->lowest_pc);
10551}
10552
a78f21af
AC
10553extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
10554
c906108c 10555void
ed9a39eb 10556_initialize_arm_tdep (void)
c906108c 10557{
bc90b915
FN
10558 struct ui_file *stb;
10559 long length;
26304000 10560 struct cmd_list_element *new_set, *new_show;
53904c9e
AC
10561 const char *setname;
10562 const char *setdesc;
4bd7b427 10563 const char *const *regnames;
bc90b915
FN
10564 int numregs, i, j;
10565 static char *helptext;
edefbb7c
AC
10566 char regdesc[1024], *rdptr = regdesc;
10567 size_t rest = sizeof (regdesc);
085dd6e6 10568
42cf1509 10569 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 10570
60c5725c 10571 arm_objfile_data_key
c1bd65d0 10572 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 10573
0e9e9abd
UW
10574 /* Add ourselves to objfile event chain. */
10575 observer_attach_new_objfile (arm_exidx_new_objfile);
10576 arm_exidx_data_key
10577 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
10578
70f80edf
JT
10579 /* Register an ELF OS ABI sniffer for ARM binaries. */
10580 gdbarch_register_osabi_sniffer (bfd_arch_arm,
10581 bfd_target_elf_flavour,
10582 arm_elf_osabi_sniffer);
10583
9779414d
DJ
10584 /* Initialize the standard target descriptions. */
10585 initialize_tdesc_arm_with_m ();
25f8c692 10586 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 10587 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
10588 initialize_tdesc_arm_with_iwmmxt ();
10589 initialize_tdesc_arm_with_vfpv2 ();
10590 initialize_tdesc_arm_with_vfpv3 ();
10591 initialize_tdesc_arm_with_neon ();
9779414d 10592
94c30b78 10593 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
10594 num_disassembly_options = get_arm_regname_num_options ();
10595
10596 /* Add root prefix command for all "set arm"/"show arm" commands. */
10597 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 10598 _("Various ARM-specific commands."),
afd7eef0
RE
10599 &setarmcmdlist, "set arm ", 0, &setlist);
10600
10601 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 10602 _("Various ARM-specific commands."),
afd7eef0 10603 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 10604
94c30b78 10605 /* Sync the opcode insn printer with our register viewer. */
bc90b915 10606 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 10607
eefe576e
AC
10608 /* Initialize the array that will be passed to
10609 add_setshow_enum_cmd(). */
8d749320
SM
10610 valid_disassembly_styles = XNEWVEC (const char *,
10611 num_disassembly_options + 1);
afd7eef0 10612 for (i = 0; i < num_disassembly_options; i++)
bc90b915
FN
10613 {
10614 numregs = get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 10615 valid_disassembly_styles[i] = setname;
edefbb7c
AC
10616 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
10617 rdptr += length;
10618 rest -= length;
123dc839
DJ
10619 /* When we find the default names, tell the disassembler to use
10620 them. */
bc90b915
FN
10621 if (!strcmp (setname, "std"))
10622 {
afd7eef0 10623 disassembly_style = setname;
bc90b915
FN
10624 set_arm_regname_option (i);
10625 }
10626 }
94c30b78 10627 /* Mark the end of valid options. */
afd7eef0 10628 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 10629
edefbb7c
AC
10630 /* Create the help text. */
10631 stb = mem_fileopen ();
10632 fprintf_unfiltered (stb, "%s%s%s",
10633 _("The valid values are:\n"),
10634 regdesc,
10635 _("The default is \"std\"."));
759ef836 10636 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 10637 ui_file_delete (stb);
ed9a39eb 10638
edefbb7c
AC
10639 add_setshow_enum_cmd("disassembler", no_class,
10640 valid_disassembly_styles, &disassembly_style,
10641 _("Set the disassembly style."),
10642 _("Show the disassembly style."),
10643 helptext,
2c5b56ce 10644 set_disassembly_style_sfunc,
0963b4bd
MS
10645 NULL, /* FIXME: i18n: The disassembly style is
10646 \"%s\". */
7376b4c2 10647 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
10648
10649 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
10650 _("Set usage of ARM 32-bit mode."),
10651 _("Show usage of ARM 32-bit mode."),
10652 _("When off, a 26-bit PC will be used."),
2c5b56ce 10653 NULL,
0963b4bd
MS
10654 NULL, /* FIXME: i18n: Usage of ARM 32-bit
10655 mode is %s. */
26304000 10656 &setarmcmdlist, &showarmcmdlist);
c906108c 10657
fd50bc42 10658 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
10659 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
10660 _("Set the floating point type."),
10661 _("Show the floating point type."),
10662 _("auto - Determine the FP typefrom the OS-ABI.\n\
10663softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
10664fpa - FPA co-processor (GCC compiled).\n\
10665softvfp - Software FP with pure-endian doubles.\n\
10666vfp - VFP co-processor."),
edefbb7c 10667 set_fp_model_sfunc, show_fp_model,
7376b4c2 10668 &setarmcmdlist, &showarmcmdlist);
fd50bc42 10669
28e97307
DJ
10670 /* Add a command to allow the user to force the ABI. */
10671 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
10672 _("Set the ABI."),
10673 _("Show the ABI."),
10674 NULL, arm_set_abi, arm_show_abi,
10675 &setarmcmdlist, &showarmcmdlist);
10676
0428b8f5
DJ
10677 /* Add two commands to allow the user to force the assumed
10678 execution mode. */
10679 add_setshow_enum_cmd ("fallback-mode", class_support,
10680 arm_mode_strings, &arm_fallback_mode_string,
10681 _("Set the mode assumed when symbols are unavailable."),
10682 _("Show the mode assumed when symbols are unavailable."),
10683 NULL, NULL, arm_show_fallback_mode,
10684 &setarmcmdlist, &showarmcmdlist);
10685 add_setshow_enum_cmd ("force-mode", class_support,
10686 arm_mode_strings, &arm_force_mode_string,
10687 _("Set the mode assumed even when symbols are available."),
10688 _("Show the mode assumed even when symbols are available."),
10689 NULL, NULL, arm_show_force_mode,
10690 &setarmcmdlist, &showarmcmdlist);
10691
6529d2dd 10692 /* Debugging flag. */
edefbb7c
AC
10693 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
10694 _("Set ARM debugging."),
10695 _("Show ARM debugging."),
10696 _("When on, arm-specific debugging is enabled."),
2c5b56ce 10697 NULL,
7915a72c 10698 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 10699 &setdebuglist, &showdebuglist);
c906108c 10700}
72508ac0
PO
10701
10702/* ARM-reversible process record data structures. */
10703
10704#define ARM_INSN_SIZE_BYTES 4
10705#define THUMB_INSN_SIZE_BYTES 2
10706#define THUMB2_INSN_SIZE_BYTES 4
10707
10708
71e396f9
LM
10709/* Position of the bit within a 32-bit ARM instruction
10710 that defines whether the instruction is a load or store. */
72508ac0
PO
10711#define INSN_S_L_BIT_NUM 20
10712
10713#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
10714 do \
10715 { \
10716 unsigned int reg_len = LENGTH; \
10717 if (reg_len) \
10718 { \
10719 REGS = XNEWVEC (uint32_t, reg_len); \
10720 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
10721 } \
10722 } \
10723 while (0)
10724
10725#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
10726 do \
10727 { \
10728 unsigned int mem_len = LENGTH; \
10729 if (mem_len) \
10730 { \
10731 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
10732 memcpy(&MEMS->len, &RECORD_BUF[0], \
10733 sizeof(struct arm_mem_r) * LENGTH); \
10734 } \
10735 } \
10736 while (0)
10737
10738/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
10739#define INSN_RECORDED(ARM_RECORD) \
10740 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
10741
10742/* ARM memory record structure. */
10743struct arm_mem_r
10744{
10745 uint32_t len; /* Record length. */
bfbbec00 10746 uint32_t addr; /* Memory address. */
72508ac0
PO
10747};
10748
10749/* ARM instruction record contains opcode of current insn
10750 and execution state (before entry to decode_insn()),
10751 contains list of to-be-modified registers and
10752 memory blocks (on return from decode_insn()). */
10753
10754typedef struct insn_decode_record_t
10755{
10756 struct gdbarch *gdbarch;
10757 struct regcache *regcache;
10758 CORE_ADDR this_addr; /* Address of the insn being decoded. */
10759 uint32_t arm_insn; /* Should accommodate thumb. */
10760 uint32_t cond; /* Condition code. */
10761 uint32_t opcode; /* Insn opcode. */
10762 uint32_t decode; /* Insn decode bits. */
10763 uint32_t mem_rec_count; /* No of mem records. */
10764 uint32_t reg_rec_count; /* No of reg records. */
10765 uint32_t *arm_regs; /* Registers to be saved for this record. */
10766 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
10767} insn_decode_record;
10768
10769
10770/* Checks ARM SBZ and SBO mandatory fields. */
10771
10772static int
10773sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
10774{
10775 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
10776
10777 if (!len)
10778 return 1;
10779
10780 if (!sbo)
10781 ones = ~ones;
10782
10783 while (ones)
10784 {
10785 if (!(ones & sbo))
10786 {
10787 return 0;
10788 }
10789 ones = ones >> 1;
10790 }
10791 return 1;
10792}
10793
c6ec2b30
OJ
10794enum arm_record_result
10795{
10796 ARM_RECORD_SUCCESS = 0,
10797 ARM_RECORD_FAILURE = 1
10798};
10799
72508ac0
PO
10800typedef enum
10801{
10802 ARM_RECORD_STRH=1,
10803 ARM_RECORD_STRD
10804} arm_record_strx_t;
10805
10806typedef enum
10807{
10808 ARM_RECORD=1,
10809 THUMB_RECORD,
10810 THUMB2_RECORD
10811} record_type_t;
10812
10813
10814static int
10815arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
10816 uint32_t *record_buf_mem, arm_record_strx_t str_type)
10817{
10818
10819 struct regcache *reg_cache = arm_insn_r->regcache;
10820 ULONGEST u_regval[2]= {0};
10821
10822 uint32_t reg_src1 = 0, reg_src2 = 0;
10823 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
10824 uint32_t opcode1 = 0;
10825
10826 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10827 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10828 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10829
10830
10831 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10832 {
10833 /* 1) Handle misc store, immediate offset. */
10834 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
10835 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
10836 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10837 regcache_raw_read_unsigned (reg_cache, reg_src1,
10838 &u_regval[0]);
10839 if (ARM_PC_REGNUM == reg_src1)
10840 {
10841 /* If R15 was used as Rn, hence current PC+8. */
10842 u_regval[0] = u_regval[0] + 8;
10843 }
10844 offset_8 = (immed_high << 4) | immed_low;
10845 /* Calculate target store address. */
10846 if (14 == arm_insn_r->opcode)
10847 {
10848 tgt_mem_addr = u_regval[0] + offset_8;
10849 }
10850 else
10851 {
10852 tgt_mem_addr = u_regval[0] - offset_8;
10853 }
10854 if (ARM_RECORD_STRH == str_type)
10855 {
10856 record_buf_mem[0] = 2;
10857 record_buf_mem[1] = tgt_mem_addr;
10858 arm_insn_r->mem_rec_count = 1;
10859 }
10860 else if (ARM_RECORD_STRD == str_type)
10861 {
10862 record_buf_mem[0] = 4;
10863 record_buf_mem[1] = tgt_mem_addr;
10864 record_buf_mem[2] = 4;
10865 record_buf_mem[3] = tgt_mem_addr + 4;
10866 arm_insn_r->mem_rec_count = 2;
10867 }
10868 }
10869 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
10870 {
10871 /* 2) Store, register offset. */
10872 /* Get Rm. */
10873 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10874 /* Get Rn. */
10875 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10876 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10877 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10878 if (15 == reg_src2)
10879 {
10880 /* If R15 was used as Rn, hence current PC+8. */
10881 u_regval[0] = u_regval[0] + 8;
10882 }
10883 /* Calculate target store address, Rn +/- Rm, register offset. */
10884 if (12 == arm_insn_r->opcode)
10885 {
10886 tgt_mem_addr = u_regval[0] + u_regval[1];
10887 }
10888 else
10889 {
10890 tgt_mem_addr = u_regval[1] - u_regval[0];
10891 }
10892 if (ARM_RECORD_STRH == str_type)
10893 {
10894 record_buf_mem[0] = 2;
10895 record_buf_mem[1] = tgt_mem_addr;
10896 arm_insn_r->mem_rec_count = 1;
10897 }
10898 else if (ARM_RECORD_STRD == str_type)
10899 {
10900 record_buf_mem[0] = 4;
10901 record_buf_mem[1] = tgt_mem_addr;
10902 record_buf_mem[2] = 4;
10903 record_buf_mem[3] = tgt_mem_addr + 4;
10904 arm_insn_r->mem_rec_count = 2;
10905 }
10906 }
10907 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10908 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
10909 {
10910 /* 3) Store, immediate pre-indexed. */
10911 /* 5) Store, immediate post-indexed. */
10912 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
10913 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
10914 offset_8 = (immed_high << 4) | immed_low;
10915 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10916 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10917 /* Calculate target store address, Rn +/- Rm, register offset. */
10918 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
10919 {
10920 tgt_mem_addr = u_regval[0] + offset_8;
10921 }
10922 else
10923 {
10924 tgt_mem_addr = u_regval[0] - offset_8;
10925 }
10926 if (ARM_RECORD_STRH == str_type)
10927 {
10928 record_buf_mem[0] = 2;
10929 record_buf_mem[1] = tgt_mem_addr;
10930 arm_insn_r->mem_rec_count = 1;
10931 }
10932 else if (ARM_RECORD_STRD == str_type)
10933 {
10934 record_buf_mem[0] = 4;
10935 record_buf_mem[1] = tgt_mem_addr;
10936 record_buf_mem[2] = 4;
10937 record_buf_mem[3] = tgt_mem_addr + 4;
10938 arm_insn_r->mem_rec_count = 2;
10939 }
10940 /* Record Rn also as it changes. */
10941 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
10942 arm_insn_r->reg_rec_count = 1;
10943 }
10944 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
10945 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
10946 {
10947 /* 4) Store, register pre-indexed. */
10948 /* 6) Store, register post -indexed. */
10949 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10950 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10951 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10952 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10953 /* Calculate target store address, Rn +/- Rm, register offset. */
10954 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
10955 {
10956 tgt_mem_addr = u_regval[0] + u_regval[1];
10957 }
10958 else
10959 {
10960 tgt_mem_addr = u_regval[1] - u_regval[0];
10961 }
10962 if (ARM_RECORD_STRH == str_type)
10963 {
10964 record_buf_mem[0] = 2;
10965 record_buf_mem[1] = tgt_mem_addr;
10966 arm_insn_r->mem_rec_count = 1;
10967 }
10968 else if (ARM_RECORD_STRD == str_type)
10969 {
10970 record_buf_mem[0] = 4;
10971 record_buf_mem[1] = tgt_mem_addr;
10972 record_buf_mem[2] = 4;
10973 record_buf_mem[3] = tgt_mem_addr + 4;
10974 arm_insn_r->mem_rec_count = 2;
10975 }
10976 /* Record Rn also as it changes. */
10977 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
10978 arm_insn_r->reg_rec_count = 1;
10979 }
10980 return 0;
10981}
10982
10983/* Handling ARM extension space insns. */
10984
10985static int
10986arm_record_extension_space (insn_decode_record *arm_insn_r)
10987{
10988 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
10989 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
10990 uint32_t record_buf[8], record_buf_mem[8];
10991 uint32_t reg_src1 = 0;
10992 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
10993 struct regcache *reg_cache = arm_insn_r->regcache;
10994 ULONGEST u_regval = 0;
10995
10996 gdb_assert (!INSN_RECORDED(arm_insn_r));
10997 /* Handle unconditional insn extension space. */
10998
10999 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
11000 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11001 if (arm_insn_r->cond)
11002 {
11003 /* PLD has no affect on architectural state, it just affects
11004 the caches. */
11005 if (5 == ((opcode1 & 0xE0) >> 5))
11006 {
11007 /* BLX(1) */
11008 record_buf[0] = ARM_PS_REGNUM;
11009 record_buf[1] = ARM_LR_REGNUM;
11010 arm_insn_r->reg_rec_count = 2;
11011 }
11012 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
11013 }
11014
11015
11016 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11017 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
11018 {
11019 ret = -1;
11020 /* Undefined instruction on ARM V5; need to handle if later
11021 versions define it. */
11022 }
11023
11024 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
11025 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11026 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
11027
11028 /* Handle arithmetic insn extension space. */
11029 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
11030 && !INSN_RECORDED(arm_insn_r))
11031 {
11032 /* Handle MLA(S) and MUL(S). */
11033 if (0 <= insn_op1 && 3 >= insn_op1)
11034 {
11035 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11036 record_buf[1] = ARM_PS_REGNUM;
11037 arm_insn_r->reg_rec_count = 2;
11038 }
11039 else if (4 <= insn_op1 && 15 >= insn_op1)
11040 {
11041 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
11042 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11043 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11044 record_buf[2] = ARM_PS_REGNUM;
11045 arm_insn_r->reg_rec_count = 3;
11046 }
11047 }
11048
11049 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
11050 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
11051 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
11052
11053 /* Handle control insn extension space. */
11054
11055 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
11056 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
11057 {
11058 if (!bit (arm_insn_r->arm_insn,25))
11059 {
11060 if (!bits (arm_insn_r->arm_insn, 4, 7))
11061 {
11062 if ((0 == insn_op1) || (2 == insn_op1))
11063 {
11064 /* MRS. */
11065 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11066 arm_insn_r->reg_rec_count = 1;
11067 }
11068 else if (1 == insn_op1)
11069 {
11070 /* CSPR is going to be changed. */
11071 record_buf[0] = ARM_PS_REGNUM;
11072 arm_insn_r->reg_rec_count = 1;
11073 }
11074 else if (3 == insn_op1)
11075 {
11076 /* SPSR is going to be changed. */
11077 /* We need to get SPSR value, which is yet to be done. */
11078 printf_unfiltered (_("Process record does not support "
11079 "instruction 0x%0x at address %s.\n"),
11080 arm_insn_r->arm_insn,
11081 paddress (arm_insn_r->gdbarch,
11082 arm_insn_r->this_addr));
11083 return -1;
11084 }
11085 }
11086 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
11087 {
11088 if (1 == insn_op1)
11089 {
11090 /* BX. */
11091 record_buf[0] = ARM_PS_REGNUM;
11092 arm_insn_r->reg_rec_count = 1;
11093 }
11094 else if (3 == insn_op1)
11095 {
11096 /* CLZ. */
11097 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11098 arm_insn_r->reg_rec_count = 1;
11099 }
11100 }
11101 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
11102 {
11103 /* BLX. */
11104 record_buf[0] = ARM_PS_REGNUM;
11105 record_buf[1] = ARM_LR_REGNUM;
11106 arm_insn_r->reg_rec_count = 2;
11107 }
11108 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
11109 {
11110 /* QADD, QSUB, QDADD, QDSUB */
11111 record_buf[0] = ARM_PS_REGNUM;
11112 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11113 arm_insn_r->reg_rec_count = 2;
11114 }
11115 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
11116 {
11117 /* BKPT. */
11118 record_buf[0] = ARM_PS_REGNUM;
11119 record_buf[1] = ARM_LR_REGNUM;
11120 arm_insn_r->reg_rec_count = 2;
11121
11122 /* Save SPSR also;how? */
11123 printf_unfiltered (_("Process record does not support "
11124 "instruction 0x%0x at address %s.\n"),
11125 arm_insn_r->arm_insn,
11126 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11127 return -1;
11128 }
11129 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
11130 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
11131 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
11132 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
11133 )
11134 {
11135 if (0 == insn_op1 || 1 == insn_op1)
11136 {
11137 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
11138 /* We dont do optimization for SMULW<y> where we
11139 need only Rd. */
11140 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11141 record_buf[1] = ARM_PS_REGNUM;
11142 arm_insn_r->reg_rec_count = 2;
11143 }
11144 else if (2 == insn_op1)
11145 {
11146 /* SMLAL<x><y>. */
11147 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11148 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11149 arm_insn_r->reg_rec_count = 2;
11150 }
11151 else if (3 == insn_op1)
11152 {
11153 /* SMUL<x><y>. */
11154 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11155 arm_insn_r->reg_rec_count = 1;
11156 }
11157 }
11158 }
11159 else
11160 {
11161 /* MSR : immediate form. */
11162 if (1 == insn_op1)
11163 {
11164 /* CSPR is going to be changed. */
11165 record_buf[0] = ARM_PS_REGNUM;
11166 arm_insn_r->reg_rec_count = 1;
11167 }
11168 else if (3 == insn_op1)
11169 {
11170 /* SPSR is going to be changed. */
11171 /* we need to get SPSR value, which is yet to be done */
11172 printf_unfiltered (_("Process record does not support "
11173 "instruction 0x%0x at address %s.\n"),
11174 arm_insn_r->arm_insn,
11175 paddress (arm_insn_r->gdbarch,
11176 arm_insn_r->this_addr));
11177 return -1;
11178 }
11179 }
11180 }
11181
11182 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11183 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
11184 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
11185
11186 /* Handle load/store insn extension space. */
11187
11188 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
11189 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
11190 && !INSN_RECORDED(arm_insn_r))
11191 {
11192 /* SWP/SWPB. */
11193 if (0 == insn_op1)
11194 {
11195 /* These insn, changes register and memory as well. */
11196 /* SWP or SWPB insn. */
11197 /* Get memory address given by Rn. */
11198 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11199 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11200 /* SWP insn ?, swaps word. */
11201 if (8 == arm_insn_r->opcode)
11202 {
11203 record_buf_mem[0] = 4;
11204 }
11205 else
11206 {
11207 /* SWPB insn, swaps only byte. */
11208 record_buf_mem[0] = 1;
11209 }
11210 record_buf_mem[1] = u_regval;
11211 arm_insn_r->mem_rec_count = 1;
11212 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11213 arm_insn_r->reg_rec_count = 1;
11214 }
11215 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11216 {
11217 /* STRH. */
11218 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11219 ARM_RECORD_STRH);
11220 }
11221 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11222 {
11223 /* LDRD. */
11224 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11225 record_buf[1] = record_buf[0] + 1;
11226 arm_insn_r->reg_rec_count = 2;
11227 }
11228 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11229 {
11230 /* STRD. */
11231 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11232 ARM_RECORD_STRD);
11233 }
11234 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
11235 {
11236 /* LDRH, LDRSB, LDRSH. */
11237 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11238 arm_insn_r->reg_rec_count = 1;
11239 }
11240
11241 }
11242
11243 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
11244 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
11245 && !INSN_RECORDED(arm_insn_r))
11246 {
11247 ret = -1;
11248 /* Handle coprocessor insn extension space. */
11249 }
11250
11251 /* To be done for ARMv5 and later; as of now we return -1. */
11252 if (-1 == ret)
11253 printf_unfiltered (_("Process record does not support instruction x%0x "
11254 "at address %s.\n"),arm_insn_r->arm_insn,
11255 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11256
11257
11258 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11259 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11260
11261 return ret;
11262}
11263
11264/* Handling opcode 000 insns. */
11265
11266static int
11267arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
11268{
11269 struct regcache *reg_cache = arm_insn_r->regcache;
11270 uint32_t record_buf[8], record_buf_mem[8];
11271 ULONGEST u_regval[2] = {0};
11272
11273 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
11274 uint32_t immed_high = 0, immed_low = 0, offset_8 = 0, tgt_mem_addr = 0;
11275 uint32_t opcode1 = 0;
11276
11277 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11278 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11279 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
11280
11281 /* Data processing insn /multiply insn. */
11282 if (9 == arm_insn_r->decode
11283 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11284 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
11285 {
11286 /* Handle multiply instructions. */
11287 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
11288 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
11289 {
11290 /* Handle MLA and MUL. */
11291 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11292 record_buf[1] = ARM_PS_REGNUM;
11293 arm_insn_r->reg_rec_count = 2;
11294 }
11295 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11296 {
11297 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
11298 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11299 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11300 record_buf[2] = ARM_PS_REGNUM;
11301 arm_insn_r->reg_rec_count = 3;
11302 }
11303 }
11304 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11305 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
11306 {
11307 /* Handle misc load insns, as 20th bit (L = 1). */
11308 /* LDR insn has a capability to do branching, if
11309 MOV LR, PC is precceded by LDR insn having Rn as R15
11310 in that case, it emulates branch and link insn, and hence we
11311 need to save CSPR and PC as well. I am not sure this is right
11312 place; as opcode = 010 LDR insn make this happen, if R15 was
11313 used. */
11314 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
11315 if (15 != reg_dest)
11316 {
11317 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11318 arm_insn_r->reg_rec_count = 1;
11319 }
11320 else
11321 {
11322 record_buf[0] = reg_dest;
11323 record_buf[1] = ARM_PS_REGNUM;
11324 arm_insn_r->reg_rec_count = 2;
11325 }
11326 }
11327 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
11328 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
11329 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
11330 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
11331 {
11332 /* Handle MSR insn. */
11333 if (9 == arm_insn_r->opcode)
11334 {
11335 /* CSPR is going to be changed. */
11336 record_buf[0] = ARM_PS_REGNUM;
11337 arm_insn_r->reg_rec_count = 1;
11338 }
11339 else
11340 {
11341 /* SPSR is going to be changed. */
11342 /* How to read SPSR value? */
11343 printf_unfiltered (_("Process record does not support instruction "
11344 "0x%0x at address %s.\n"),
11345 arm_insn_r->arm_insn,
11346 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11347 return -1;
11348 }
11349 }
11350 else if (9 == arm_insn_r->decode
11351 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11352 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11353 {
11354 /* Handling SWP, SWPB. */
11355 /* These insn, changes register and memory as well. */
11356 /* SWP or SWPB insn. */
11357
11358 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11359 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11360 /* SWP insn ?, swaps word. */
11361 if (8 == arm_insn_r->opcode)
11362 {
11363 record_buf_mem[0] = 4;
11364 }
11365 else
11366 {
11367 /* SWPB insn, swaps only byte. */
11368 record_buf_mem[0] = 1;
11369 }
11370 record_buf_mem[1] = u_regval[0];
11371 arm_insn_r->mem_rec_count = 1;
11372 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11373 arm_insn_r->reg_rec_count = 1;
11374 }
11375 else if (3 == arm_insn_r->decode && 0x12 == opcode1
11376 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11377 {
11378 /* Handle BLX, branch and link/exchange. */
11379 if (9 == arm_insn_r->opcode)
11380 {
11381 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
11382 and R14 stores the return address. */
11383 record_buf[0] = ARM_PS_REGNUM;
11384 record_buf[1] = ARM_LR_REGNUM;
11385 arm_insn_r->reg_rec_count = 2;
11386 }
11387 }
11388 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
11389 {
11390 /* Handle enhanced software breakpoint insn, BKPT. */
11391 /* CPSR is changed to be executed in ARM state, disabling normal
11392 interrupts, entering abort mode. */
11393 /* According to high vector configuration PC is set. */
11394 /* user hit breakpoint and type reverse, in
11395 that case, we need to go back with previous CPSR and
11396 Program Counter. */
11397 record_buf[0] = ARM_PS_REGNUM;
11398 record_buf[1] = ARM_LR_REGNUM;
11399 arm_insn_r->reg_rec_count = 2;
11400
11401 /* Save SPSR also; how? */
11402 printf_unfiltered (_("Process record does not support instruction "
11403 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11404 paddress (arm_insn_r->gdbarch,
11405 arm_insn_r->this_addr));
11406 return -1;
11407 }
11408 else if (11 == arm_insn_r->decode
11409 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11410 {
11411 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
11412
11413 /* Handle str(x) insn */
11414 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11415 ARM_RECORD_STRH);
11416 }
11417 else if (1 == arm_insn_r->decode && 0x12 == opcode1
11418 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11419 {
11420 /* Handle BX, branch and link/exchange. */
11421 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
11422 record_buf[0] = ARM_PS_REGNUM;
11423 arm_insn_r->reg_rec_count = 1;
11424 }
11425 else if (1 == arm_insn_r->decode && 0x16 == opcode1
11426 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
11427 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
11428 {
11429 /* Count leading zeros: CLZ. */
11430 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11431 arm_insn_r->reg_rec_count = 1;
11432 }
11433 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11434 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11435 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
11436 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
11437 )
11438 {
11439 /* Handle MRS insn. */
11440 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11441 arm_insn_r->reg_rec_count = 1;
11442 }
11443 else if (arm_insn_r->opcode <= 15)
11444 {
11445 /* Normal data processing insns. */
11446 /* Out of 11 shifter operands mode, all the insn modifies destination
11447 register, which is specified by 13-16 decode. */
11448 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11449 record_buf[1] = ARM_PS_REGNUM;
11450 arm_insn_r->reg_rec_count = 2;
11451 }
11452 else
11453 {
11454 return -1;
11455 }
11456
11457 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11458 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11459 return 0;
11460}
11461
11462/* Handling opcode 001 insns. */
11463
11464static int
11465arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
11466{
11467 uint32_t record_buf[8], record_buf_mem[8];
11468
11469 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11470 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11471
11472 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
11473 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
11474 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
11475 )
11476 {
11477 /* Handle MSR insn. */
11478 if (9 == arm_insn_r->opcode)
11479 {
11480 /* CSPR is going to be changed. */
11481 record_buf[0] = ARM_PS_REGNUM;
11482 arm_insn_r->reg_rec_count = 1;
11483 }
11484 else
11485 {
11486 /* SPSR is going to be changed. */
11487 }
11488 }
11489 else if (arm_insn_r->opcode <= 15)
11490 {
11491 /* Normal data processing insns. */
11492 /* Out of 11 shifter operands mode, all the insn modifies destination
11493 register, which is specified by 13-16 decode. */
11494 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11495 record_buf[1] = ARM_PS_REGNUM;
11496 arm_insn_r->reg_rec_count = 2;
11497 }
11498 else
11499 {
11500 return -1;
11501 }
11502
11503 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11504 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11505 return 0;
11506}
11507
71e396f9 11508/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
11509
11510static int
11511arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
11512{
11513 struct regcache *reg_cache = arm_insn_r->regcache;
11514
71e396f9
LM
11515 uint32_t reg_base , reg_dest;
11516 uint32_t offset_12, tgt_mem_addr;
72508ac0 11517 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
11518 unsigned char wback;
11519 ULONGEST u_regval;
72508ac0 11520
71e396f9
LM
11521 /* Calculate wback. */
11522 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
11523 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 11524
71e396f9
LM
11525 arm_insn_r->reg_rec_count = 0;
11526 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
11527
11528 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11529 {
71e396f9
LM
11530 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
11531 and LDRT. */
11532
72508ac0 11533 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
11534 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
11535
11536 /* The LDR instruction is capable of doing branching. If MOV LR, PC
11537 preceeds a LDR instruction having R15 as reg_base, it
11538 emulates a branch and link instruction, and hence we need to save
11539 CPSR and PC as well. */
11540 if (ARM_PC_REGNUM == reg_dest)
11541 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
11542
11543 /* If wback is true, also save the base register, which is going to be
11544 written to. */
11545 if (wback)
11546 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
11547 }
11548 else
11549 {
71e396f9
LM
11550 /* STR (immediate), STRB (immediate), STRBT and STRT. */
11551
72508ac0 11552 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
11553 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
11554
11555 /* Handle bit U. */
72508ac0 11556 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
11557 {
11558 /* U == 1: Add the offset. */
11559 tgt_mem_addr = (uint32_t) u_regval + offset_12;
11560 }
72508ac0 11561 else
71e396f9
LM
11562 {
11563 /* U == 0: subtract the offset. */
11564 tgt_mem_addr = (uint32_t) u_regval - offset_12;
11565 }
11566
11567 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
11568 bytes. */
11569 if (bit (arm_insn_r->arm_insn, 22))
11570 {
11571 /* STRB and STRBT: 1 byte. */
11572 record_buf_mem[0] = 1;
11573 }
11574 else
11575 {
11576 /* STR and STRT: 4 bytes. */
11577 record_buf_mem[0] = 4;
11578 }
11579
11580 /* Handle bit P. */
11581 if (bit (arm_insn_r->arm_insn, 24))
11582 record_buf_mem[1] = tgt_mem_addr;
11583 else
11584 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 11585
72508ac0
PO
11586 arm_insn_r->mem_rec_count = 1;
11587
71e396f9
LM
11588 /* If wback is true, also save the base register, which is going to be
11589 written to. */
11590 if (wback)
11591 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
11592 }
11593
11594 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11595 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11596 return 0;
11597}
11598
11599/* Handling opcode 011 insns. */
11600
11601static int
11602arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
11603{
11604 struct regcache *reg_cache = arm_insn_r->regcache;
11605
11606 uint32_t shift_imm = 0;
11607 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
11608 uint32_t offset_12 = 0, tgt_mem_addr = 0;
11609 uint32_t record_buf[8], record_buf_mem[8];
11610
11611 LONGEST s_word;
11612 ULONGEST u_regval[2];
11613
11614 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11615 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11616
11617 /* Handle enhanced store insns and LDRD DSP insn,
11618 order begins according to addressing modes for store insns
11619 STRH insn. */
11620
11621 /* LDR or STR? */
11622 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11623 {
11624 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
11625 /* LDR insn has a capability to do branching, if
11626 MOV LR, PC is precedded by LDR insn having Rn as R15
11627 in that case, it emulates branch and link insn, and hence we
11628 need to save CSPR and PC as well. */
11629 if (15 != reg_dest)
11630 {
11631 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11632 arm_insn_r->reg_rec_count = 1;
11633 }
11634 else
11635 {
11636 record_buf[0] = reg_dest;
11637 record_buf[1] = ARM_PS_REGNUM;
11638 arm_insn_r->reg_rec_count = 2;
11639 }
11640 }
11641 else
11642 {
11643 if (! bits (arm_insn_r->arm_insn, 4, 11))
11644 {
11645 /* Store insn, register offset and register pre-indexed,
11646 register post-indexed. */
11647 /* Get Rm. */
11648 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11649 /* Get Rn. */
11650 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11651 regcache_raw_read_unsigned (reg_cache, reg_src1
11652 , &u_regval[0]);
11653 regcache_raw_read_unsigned (reg_cache, reg_src2
11654 , &u_regval[1]);
11655 if (15 == reg_src2)
11656 {
11657 /* If R15 was used as Rn, hence current PC+8. */
11658 /* Pre-indexed mode doesnt reach here ; illegal insn. */
11659 u_regval[0] = u_regval[0] + 8;
11660 }
11661 /* Calculate target store address, Rn +/- Rm, register offset. */
11662 /* U == 1. */
11663 if (bit (arm_insn_r->arm_insn, 23))
11664 {
11665 tgt_mem_addr = u_regval[0] + u_regval[1];
11666 }
11667 else
11668 {
11669 tgt_mem_addr = u_regval[1] - u_regval[0];
11670 }
11671
11672 switch (arm_insn_r->opcode)
11673 {
11674 /* STR. */
11675 case 8:
11676 case 12:
11677 /* STR. */
11678 case 9:
11679 case 13:
11680 /* STRT. */
11681 case 1:
11682 case 5:
11683 /* STR. */
11684 case 0:
11685 case 4:
11686 record_buf_mem[0] = 4;
11687 break;
11688
11689 /* STRB. */
11690 case 10:
11691 case 14:
11692 /* STRB. */
11693 case 11:
11694 case 15:
11695 /* STRBT. */
11696 case 3:
11697 case 7:
11698 /* STRB. */
11699 case 2:
11700 case 6:
11701 record_buf_mem[0] = 1;
11702 break;
11703
11704 default:
11705 gdb_assert_not_reached ("no decoding pattern found");
11706 break;
11707 }
11708 record_buf_mem[1] = tgt_mem_addr;
11709 arm_insn_r->mem_rec_count = 1;
11710
11711 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
11712 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11713 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
11714 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
11715 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
11716 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
11717 )
11718 {
11719 /* Rn is going to be changed in pre-indexed mode and
11720 post-indexed mode as well. */
11721 record_buf[0] = reg_src2;
11722 arm_insn_r->reg_rec_count = 1;
11723 }
11724 }
11725 else
11726 {
11727 /* Store insn, scaled register offset; scaled pre-indexed. */
11728 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
11729 /* Get Rm. */
11730 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11731 /* Get Rn. */
11732 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11733 /* Get shift_imm. */
11734 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
11735 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11736 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
11737 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11738 /* Offset_12 used as shift. */
11739 switch (offset_12)
11740 {
11741 case 0:
11742 /* Offset_12 used as index. */
11743 offset_12 = u_regval[0] << shift_imm;
11744 break;
11745
11746 case 1:
11747 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
11748 break;
11749
11750 case 2:
11751 if (!shift_imm)
11752 {
11753 if (bit (u_regval[0], 31))
11754 {
11755 offset_12 = 0xFFFFFFFF;
11756 }
11757 else
11758 {
11759 offset_12 = 0;
11760 }
11761 }
11762 else
11763 {
11764 /* This is arithmetic shift. */
11765 offset_12 = s_word >> shift_imm;
11766 }
11767 break;
11768
11769 case 3:
11770 if (!shift_imm)
11771 {
11772 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
11773 &u_regval[1]);
11774 /* Get C flag value and shift it by 31. */
11775 offset_12 = (((bit (u_regval[1], 29)) << 31) \
11776 | (u_regval[0]) >> 1);
11777 }
11778 else
11779 {
11780 offset_12 = (u_regval[0] >> shift_imm) \
11781 | (u_regval[0] <<
11782 (sizeof(uint32_t) - shift_imm));
11783 }
11784 break;
11785
11786 default:
11787 gdb_assert_not_reached ("no decoding pattern found");
11788 break;
11789 }
11790
11791 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11792 /* bit U set. */
11793 if (bit (arm_insn_r->arm_insn, 23))
11794 {
11795 tgt_mem_addr = u_regval[1] + offset_12;
11796 }
11797 else
11798 {
11799 tgt_mem_addr = u_regval[1] - offset_12;
11800 }
11801
11802 switch (arm_insn_r->opcode)
11803 {
11804 /* STR. */
11805 case 8:
11806 case 12:
11807 /* STR. */
11808 case 9:
11809 case 13:
11810 /* STRT. */
11811 case 1:
11812 case 5:
11813 /* STR. */
11814 case 0:
11815 case 4:
11816 record_buf_mem[0] = 4;
11817 break;
11818
11819 /* STRB. */
11820 case 10:
11821 case 14:
11822 /* STRB. */
11823 case 11:
11824 case 15:
11825 /* STRBT. */
11826 case 3:
11827 case 7:
11828 /* STRB. */
11829 case 2:
11830 case 6:
11831 record_buf_mem[0] = 1;
11832 break;
11833
11834 default:
11835 gdb_assert_not_reached ("no decoding pattern found");
11836 break;
11837 }
11838 record_buf_mem[1] = tgt_mem_addr;
11839 arm_insn_r->mem_rec_count = 1;
11840
11841 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
11842 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11843 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
11844 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
11845 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
11846 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
11847 )
11848 {
11849 /* Rn is going to be changed in register scaled pre-indexed
11850 mode,and scaled post indexed mode. */
11851 record_buf[0] = reg_src2;
11852 arm_insn_r->reg_rec_count = 1;
11853 }
11854 }
11855 }
11856
11857 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11858 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11859 return 0;
11860}
11861
71e396f9 11862/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
11863
11864static int
11865arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
11866{
11867 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
11868 uint32_t register_count = 0, register_bits;
11869 uint32_t reg_base, addr_mode;
72508ac0 11870 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
11871 uint32_t wback;
11872 ULONGEST u_regval;
72508ac0 11873
71e396f9
LM
11874 /* Fetch the list of registers. */
11875 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
11876 arm_insn_r->reg_rec_count = 0;
11877
11878 /* Fetch the base register that contains the address we are loading data
11879 to. */
11880 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 11881
71e396f9
LM
11882 /* Calculate wback. */
11883 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
11884
11885 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11886 {
71e396f9 11887 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 11888
71e396f9 11889 /* Find out which registers are going to be loaded from memory. */
72508ac0 11890 while (register_bits)
71e396f9
LM
11891 {
11892 if (register_bits & 0x00000001)
11893 record_buf[arm_insn_r->reg_rec_count++] = register_count;
11894 register_bits = register_bits >> 1;
11895 register_count++;
11896 }
72508ac0 11897
71e396f9
LM
11898
11899 /* If wback is true, also save the base register, which is going to be
11900 written to. */
11901 if (wback)
11902 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
11903
11904 /* Save the CPSR register. */
11905 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
11906 }
11907 else
11908 {
71e396f9 11909 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 11910
71e396f9
LM
11911 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
11912
11913 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
11914
11915 /* Find out how many registers are going to be stored to memory. */
72508ac0 11916 while (register_bits)
71e396f9
LM
11917 {
11918 if (register_bits & 0x00000001)
11919 register_count++;
11920 register_bits = register_bits >> 1;
11921 }
72508ac0
PO
11922
11923 switch (addr_mode)
71e396f9
LM
11924 {
11925 /* STMDA (STMED): Decrement after. */
11926 case 0:
11927 record_buf_mem[1] = (uint32_t) u_regval
11928 - register_count * INT_REGISTER_SIZE + 4;
11929 break;
11930 /* STM (STMIA, STMEA): Increment after. */
11931 case 1:
11932 record_buf_mem[1] = (uint32_t) u_regval;
11933 break;
11934 /* STMDB (STMFD): Decrement before. */
11935 case 2:
11936 record_buf_mem[1] = (uint32_t) u_regval
11937 - register_count * INT_REGISTER_SIZE;
11938 break;
11939 /* STMIB (STMFA): Increment before. */
11940 case 3:
11941 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
11942 break;
11943 default:
11944 gdb_assert_not_reached ("no decoding pattern found");
11945 break;
11946 }
72508ac0 11947
71e396f9
LM
11948 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
11949 arm_insn_r->mem_rec_count = 1;
11950
11951 /* If wback is true, also save the base register, which is going to be
11952 written to. */
11953 if (wback)
11954 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
11955 }
11956
11957 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11958 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11959 return 0;
11960}
11961
11962/* Handling opcode 101 insns. */
11963
11964static int
11965arm_record_b_bl (insn_decode_record *arm_insn_r)
11966{
11967 uint32_t record_buf[8];
11968
11969 /* Handle B, BL, BLX(1) insns. */
11970 /* B simply branches so we do nothing here. */
11971 /* Note: BLX(1) doesnt fall here but instead it falls into
11972 extension space. */
11973 if (bit (arm_insn_r->arm_insn, 24))
11974 {
11975 record_buf[0] = ARM_LR_REGNUM;
11976 arm_insn_r->reg_rec_count = 1;
11977 }
11978
11979 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11980
11981 return 0;
11982}
11983
11984/* Handling opcode 110 insns. */
11985
11986static int
c6ec2b30 11987arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
11988{
11989 printf_unfiltered (_("Process record does not support instruction "
11990 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11991 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11992
11993 return -1;
11994}
11995
5a578da5
OJ
11996/* Record handler for vector data transfer instructions. */
11997
11998static int
11999arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
12000{
12001 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
12002 uint32_t record_buf[4];
12003
12004 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
12005 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
12006 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
12007 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
12008 bit_l = bit (arm_insn_r->arm_insn, 20);
12009 bit_c = bit (arm_insn_r->arm_insn, 8);
12010
12011 /* Handle VMOV instruction. */
12012 if (bit_l && bit_c)
12013 {
12014 record_buf[0] = reg_t;
12015 arm_insn_r->reg_rec_count = 1;
12016 }
12017 else if (bit_l && !bit_c)
12018 {
12019 /* Handle VMOV instruction. */
12020 if (bits_a == 0x00)
12021 {
12022 if (bit (arm_insn_r->arm_insn, 20))
12023 record_buf[0] = reg_t;
12024 else
12025 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
12026 (reg_v << 1));
12027
12028 arm_insn_r->reg_rec_count = 1;
12029 }
12030 /* Handle VMRS instruction. */
12031 else if (bits_a == 0x07)
12032 {
12033 if (reg_t == 15)
12034 reg_t = ARM_PS_REGNUM;
12035
12036 record_buf[0] = reg_t;
12037 arm_insn_r->reg_rec_count = 1;
12038 }
12039 }
12040 else if (!bit_l && !bit_c)
12041 {
12042 /* Handle VMOV instruction. */
12043 if (bits_a == 0x00)
12044 {
12045 if (bit (arm_insn_r->arm_insn, 20))
12046 record_buf[0] = reg_t;
12047 else
12048 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
12049 (reg_v << 1));
12050
12051 arm_insn_r->reg_rec_count = 1;
12052 }
12053 /* Handle VMSR instruction. */
12054 else if (bits_a == 0x07)
12055 {
12056 record_buf[0] = ARM_FPSCR_REGNUM;
12057 arm_insn_r->reg_rec_count = 1;
12058 }
12059 }
12060 else if (!bit_l && bit_c)
12061 {
12062 /* Handle VMOV instruction. */
12063 if (!(bits_a & 0x04))
12064 {
12065 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
12066 + ARM_D0_REGNUM;
12067 arm_insn_r->reg_rec_count = 1;
12068 }
12069 /* Handle VDUP instruction. */
12070 else
12071 {
12072 if (bit (arm_insn_r->arm_insn, 21))
12073 {
12074 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12075 record_buf[0] = reg_v + ARM_D0_REGNUM;
12076 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
12077 arm_insn_r->reg_rec_count = 2;
12078 }
12079 else
12080 {
12081 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12082 record_buf[0] = reg_v + ARM_D0_REGNUM;
12083 arm_insn_r->reg_rec_count = 1;
12084 }
12085 }
12086 }
12087
12088 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12089 return 0;
12090}
12091
f20f80dd
OJ
12092/* Record handler for extension register load/store instructions. */
12093
12094static int
12095arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
12096{
12097 uint32_t opcode, single_reg;
12098 uint8_t op_vldm_vstm;
12099 uint32_t record_buf[8], record_buf_mem[128];
12100 ULONGEST u_regval = 0;
12101
12102 struct regcache *reg_cache = arm_insn_r->regcache;
12103 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
12104
12105 opcode = bits (arm_insn_r->arm_insn, 20, 24);
12106 single_reg = bit (arm_insn_r->arm_insn, 8);
12107 op_vldm_vstm = opcode & 0x1b;
12108
12109 /* Handle VMOV instructions. */
12110 if ((opcode & 0x1e) == 0x04)
12111 {
12112 if (bit (arm_insn_r->arm_insn, 4))
12113 {
12114 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12115 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
12116 arm_insn_r->reg_rec_count = 2;
12117 }
12118 else
12119 {
12120 uint8_t reg_m = (bits (arm_insn_r->arm_insn, 0, 3) << 1)
12121 | bit (arm_insn_r->arm_insn, 5);
12122
12123 if (!single_reg)
12124 {
12125 record_buf[0] = num_regs + reg_m;
12126 record_buf[1] = num_regs + reg_m + 1;
12127 arm_insn_r->reg_rec_count = 2;
12128 }
12129 else
12130 {
12131 record_buf[0] = reg_m + ARM_D0_REGNUM;
12132 arm_insn_r->reg_rec_count = 1;
12133 }
12134 }
12135 }
12136 /* Handle VSTM and VPUSH instructions. */
12137 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
12138 || op_vldm_vstm == 0x12)
12139 {
12140 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
12141 uint32_t memory_index = 0;
12142
12143 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12144 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12145 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12146 imm_off32 = imm_off8 << 24;
12147 memory_count = imm_off8;
12148
12149 if (bit (arm_insn_r->arm_insn, 23))
12150 start_address = u_regval;
12151 else
12152 start_address = u_regval - imm_off32;
12153
12154 if (bit (arm_insn_r->arm_insn, 21))
12155 {
12156 record_buf[0] = reg_rn;
12157 arm_insn_r->reg_rec_count = 1;
12158 }
12159
12160 while (memory_count > 0)
12161 {
12162 if (!single_reg)
12163 {
12164 record_buf_mem[memory_index] = start_address;
12165 record_buf_mem[memory_index + 1] = 4;
12166 start_address = start_address + 4;
12167 memory_index = memory_index + 2;
12168 }
12169 else
12170 {
12171 record_buf_mem[memory_index] = start_address;
12172 record_buf_mem[memory_index + 1] = 4;
12173 record_buf_mem[memory_index + 2] = start_address + 4;
12174 record_buf_mem[memory_index + 3] = 4;
12175 start_address = start_address + 8;
12176 memory_index = memory_index + 4;
12177 }
12178 memory_count--;
12179 }
12180 arm_insn_r->mem_rec_count = (memory_index >> 1);
12181 }
12182 /* Handle VLDM instructions. */
12183 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
12184 || op_vldm_vstm == 0x13)
12185 {
12186 uint32_t reg_count, reg_vd;
12187 uint32_t reg_index = 0;
12188
12189 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12190 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
12191
12192 if (single_reg)
12193 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
12194 else
12195 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
12196
12197 if (bit (arm_insn_r->arm_insn, 21))
12198 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
12199
12200 while (reg_count > 0)
12201 {
12202 if (single_reg)
12203 record_buf[reg_index++] = num_regs + reg_vd + reg_count - 1;
12204 else
12205 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
12206
12207 reg_count--;
12208 }
12209 arm_insn_r->reg_rec_count = reg_index;
12210 }
12211 /* VSTR Vector store register. */
12212 else if ((opcode & 0x13) == 0x10)
12213 {
12214 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
12215 uint32_t memory_index = 0;
12216
12217 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12218 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12219 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12220 imm_off32 = imm_off8 << 24;
12221 memory_count = imm_off8;
12222
12223 if (bit (arm_insn_r->arm_insn, 23))
12224 start_address = u_regval + imm_off32;
12225 else
12226 start_address = u_regval - imm_off32;
12227
12228 if (single_reg)
12229 {
12230 record_buf_mem[memory_index] = start_address;
12231 record_buf_mem[memory_index + 1] = 4;
12232 arm_insn_r->mem_rec_count = 1;
12233 }
12234 else
12235 {
12236 record_buf_mem[memory_index] = start_address;
12237 record_buf_mem[memory_index + 1] = 4;
12238 record_buf_mem[memory_index + 2] = start_address + 4;
12239 record_buf_mem[memory_index + 3] = 4;
12240 arm_insn_r->mem_rec_count = 2;
12241 }
12242 }
12243 /* VLDR Vector load register. */
12244 else if ((opcode & 0x13) == 0x11)
12245 {
12246 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12247
12248 if (!single_reg)
12249 {
12250 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
12251 record_buf[0] = ARM_D0_REGNUM + reg_vd;
12252 }
12253 else
12254 {
12255 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
12256 record_buf[0] = num_regs + reg_vd;
12257 }
12258 arm_insn_r->reg_rec_count = 1;
12259 }
12260
12261 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12262 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12263 return 0;
12264}
12265
851f26ae
OJ
12266/* Record handler for arm/thumb mode VFP data processing instructions. */
12267
12268static int
12269arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
12270{
12271 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
12272 uint32_t record_buf[4];
12273 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
12274 enum insn_types curr_insn_type = INSN_INV;
12275
12276 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12277 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
12278 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
12279 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
12280 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
12281 bit_d = bit (arm_insn_r->arm_insn, 22);
12282 opc1 = opc1 & 0x04;
12283
12284 /* Handle VMLA, VMLS. */
12285 if (opc1 == 0x00)
12286 {
12287 if (bit (arm_insn_r->arm_insn, 10))
12288 {
12289 if (bit (arm_insn_r->arm_insn, 6))
12290 curr_insn_type = INSN_T0;
12291 else
12292 curr_insn_type = INSN_T1;
12293 }
12294 else
12295 {
12296 if (dp_op_sz)
12297 curr_insn_type = INSN_T1;
12298 else
12299 curr_insn_type = INSN_T2;
12300 }
12301 }
12302 /* Handle VNMLA, VNMLS, VNMUL. */
12303 else if (opc1 == 0x01)
12304 {
12305 if (dp_op_sz)
12306 curr_insn_type = INSN_T1;
12307 else
12308 curr_insn_type = INSN_T2;
12309 }
12310 /* Handle VMUL. */
12311 else if (opc1 == 0x02 && !(opc3 & 0x01))
12312 {
12313 if (bit (arm_insn_r->arm_insn, 10))
12314 {
12315 if (bit (arm_insn_r->arm_insn, 6))
12316 curr_insn_type = INSN_T0;
12317 else
12318 curr_insn_type = INSN_T1;
12319 }
12320 else
12321 {
12322 if (dp_op_sz)
12323 curr_insn_type = INSN_T1;
12324 else
12325 curr_insn_type = INSN_T2;
12326 }
12327 }
12328 /* Handle VADD, VSUB. */
12329 else if (opc1 == 0x03)
12330 {
12331 if (!bit (arm_insn_r->arm_insn, 9))
12332 {
12333 if (bit (arm_insn_r->arm_insn, 6))
12334 curr_insn_type = INSN_T0;
12335 else
12336 curr_insn_type = INSN_T1;
12337 }
12338 else
12339 {
12340 if (dp_op_sz)
12341 curr_insn_type = INSN_T1;
12342 else
12343 curr_insn_type = INSN_T2;
12344 }
12345 }
12346 /* Handle VDIV. */
12347 else if (opc1 == 0x0b)
12348 {
12349 if (dp_op_sz)
12350 curr_insn_type = INSN_T1;
12351 else
12352 curr_insn_type = INSN_T2;
12353 }
12354 /* Handle all other vfp data processing instructions. */
12355 else if (opc1 == 0x0b)
12356 {
12357 /* Handle VMOV. */
12358 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
12359 {
12360 if (bit (arm_insn_r->arm_insn, 4))
12361 {
12362 if (bit (arm_insn_r->arm_insn, 6))
12363 curr_insn_type = INSN_T0;
12364 else
12365 curr_insn_type = INSN_T1;
12366 }
12367 else
12368 {
12369 if (dp_op_sz)
12370 curr_insn_type = INSN_T1;
12371 else
12372 curr_insn_type = INSN_T2;
12373 }
12374 }
12375 /* Handle VNEG and VABS. */
12376 else if ((opc2 == 0x01 && opc3 == 0x01)
12377 || (opc2 == 0x00 && opc3 == 0x03))
12378 {
12379 if (!bit (arm_insn_r->arm_insn, 11))
12380 {
12381 if (bit (arm_insn_r->arm_insn, 6))
12382 curr_insn_type = INSN_T0;
12383 else
12384 curr_insn_type = INSN_T1;
12385 }
12386 else
12387 {
12388 if (dp_op_sz)
12389 curr_insn_type = INSN_T1;
12390 else
12391 curr_insn_type = INSN_T2;
12392 }
12393 }
12394 /* Handle VSQRT. */
12395 else if (opc2 == 0x01 && opc3 == 0x03)
12396 {
12397 if (dp_op_sz)
12398 curr_insn_type = INSN_T1;
12399 else
12400 curr_insn_type = INSN_T2;
12401 }
12402 /* Handle VCVT. */
12403 else if (opc2 == 0x07 && opc3 == 0x03)
12404 {
12405 if (!dp_op_sz)
12406 curr_insn_type = INSN_T1;
12407 else
12408 curr_insn_type = INSN_T2;
12409 }
12410 else if (opc3 & 0x01)
12411 {
12412 /* Handle VCVT. */
12413 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
12414 {
12415 if (!bit (arm_insn_r->arm_insn, 18))
12416 curr_insn_type = INSN_T2;
12417 else
12418 {
12419 if (dp_op_sz)
12420 curr_insn_type = INSN_T1;
12421 else
12422 curr_insn_type = INSN_T2;
12423 }
12424 }
12425 /* Handle VCVT. */
12426 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
12427 {
12428 if (dp_op_sz)
12429 curr_insn_type = INSN_T1;
12430 else
12431 curr_insn_type = INSN_T2;
12432 }
12433 /* Handle VCVTB, VCVTT. */
12434 else if ((opc2 & 0x0e) == 0x02)
12435 curr_insn_type = INSN_T2;
12436 /* Handle VCMP, VCMPE. */
12437 else if ((opc2 & 0x0e) == 0x04)
12438 curr_insn_type = INSN_T3;
12439 }
12440 }
12441
12442 switch (curr_insn_type)
12443 {
12444 case INSN_T0:
12445 reg_vd = reg_vd | (bit_d << 4);
12446 record_buf[0] = reg_vd + ARM_D0_REGNUM;
12447 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
12448 arm_insn_r->reg_rec_count = 2;
12449 break;
12450
12451 case INSN_T1:
12452 reg_vd = reg_vd | (bit_d << 4);
12453 record_buf[0] = reg_vd + ARM_D0_REGNUM;
12454 arm_insn_r->reg_rec_count = 1;
12455 break;
12456
12457 case INSN_T2:
12458 reg_vd = (reg_vd << 1) | bit_d;
12459 record_buf[0] = reg_vd + ARM_D0_REGNUM;
12460 arm_insn_r->reg_rec_count = 1;
12461 break;
12462
12463 case INSN_T3:
12464 record_buf[0] = ARM_FPSCR_REGNUM;
12465 arm_insn_r->reg_rec_count = 1;
12466 break;
12467
12468 default:
12469 gdb_assert_not_reached ("no decoding pattern found");
12470 break;
12471 }
12472
12473 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12474 return 0;
12475}
12476
60cc5e93
OJ
12477/* Handling opcode 110 insns. */
12478
12479static int
12480arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
12481{
12482 uint32_t op, op1, op1_sbit, op1_ebit, coproc;
12483
12484 coproc = bits (arm_insn_r->arm_insn, 8, 11);
12485 op1 = bits (arm_insn_r->arm_insn, 20, 25);
12486 op1_ebit = bit (arm_insn_r->arm_insn, 20);
12487
12488 if ((coproc & 0x0e) == 0x0a)
12489 {
12490 /* Handle extension register ld/st instructions. */
12491 if (!(op1 & 0x20))
f20f80dd 12492 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
12493
12494 /* 64-bit transfers between arm core and extension registers. */
12495 if ((op1 & 0x3e) == 0x04)
f20f80dd 12496 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
12497 }
12498 else
12499 {
12500 /* Handle coprocessor ld/st instructions. */
12501 if (!(op1 & 0x3a))
12502 {
12503 /* Store. */
12504 if (!op1_ebit)
12505 return arm_record_unsupported_insn (arm_insn_r);
12506 else
12507 /* Load. */
12508 return arm_record_unsupported_insn (arm_insn_r);
12509 }
12510
12511 /* Move to coprocessor from two arm core registers. */
12512 if (op1 == 0x4)
12513 return arm_record_unsupported_insn (arm_insn_r);
12514
12515 /* Move to two arm core registers from coprocessor. */
12516 if (op1 == 0x5)
12517 {
12518 uint32_t reg_t[2];
12519
12520 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
12521 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
12522 arm_insn_r->reg_rec_count = 2;
12523
12524 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
12525 return 0;
12526 }
12527 }
12528 return arm_record_unsupported_insn (arm_insn_r);
12529}
12530
72508ac0
PO
12531/* Handling opcode 111 insns. */
12532
12533static int
12534arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
12535{
60cc5e93 12536 uint32_t op, op1_sbit, op1_ebit, coproc;
72508ac0
PO
12537 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
12538 struct regcache *reg_cache = arm_insn_r->regcache;
97dfe206 12539 ULONGEST u_regval = 0;
72508ac0
PO
12540
12541 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93
OJ
12542 coproc = bits (arm_insn_r->arm_insn, 8, 11);
12543 op1_sbit = bit (arm_insn_r->arm_insn, 24);
12544 op1_ebit = bit (arm_insn_r->arm_insn, 20);
12545 op = bit (arm_insn_r->arm_insn, 4);
97dfe206
OJ
12546
12547 /* Handle arm SWI/SVC system call instructions. */
60cc5e93 12548 if (op1_sbit)
97dfe206
OJ
12549 {
12550 if (tdep->arm_syscall_record != NULL)
12551 {
12552 ULONGEST svc_operand, svc_number;
12553
12554 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
12555
12556 if (svc_operand) /* OABI. */
12557 svc_number = svc_operand - 0x900000;
12558 else /* EABI. */
12559 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
12560
60cc5e93 12561 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
12562 }
12563 else
12564 {
12565 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 12566 return -1;
97dfe206
OJ
12567 }
12568 }
60cc5e93
OJ
12569
12570 if ((coproc & 0x0e) == 0x0a)
12571 {
12572 /* VFP data-processing instructions. */
12573 if (!op1_sbit && !op)
851f26ae 12574 return arm_record_vfp_data_proc_insn (arm_insn_r);
60cc5e93
OJ
12575
12576 /* Advanced SIMD, VFP instructions. */
12577 if (!op1_sbit && op)
5a578da5 12578 return arm_record_vdata_transfer_insn (arm_insn_r);
60cc5e93 12579 }
97dfe206
OJ
12580 else
12581 {
60cc5e93
OJ
12582 /* Coprocessor data operations. */
12583 if (!op1_sbit && !op)
12584 return arm_record_unsupported_insn (arm_insn_r);
12585
12586 /* Move to Coprocessor from ARM core register. */
12587 if (!op1_sbit && !op1_ebit && op)
12588 return arm_record_unsupported_insn (arm_insn_r);
12589
12590 /* Move to arm core register from coprocessor. */
12591 if (!op1_sbit && op1_ebit && op)
12592 {
12593 uint32_t record_buf[1];
12594
12595 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12596 if (record_buf[0] == 15)
12597 record_buf[0] = ARM_PS_REGNUM;
12598
12599 arm_insn_r->reg_rec_count = 1;
12600 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
12601 record_buf);
12602 return 0;
12603 }
97dfe206 12604 }
72508ac0 12605
60cc5e93 12606 return arm_record_unsupported_insn (arm_insn_r);
72508ac0
PO
12607}
12608
12609/* Handling opcode 000 insns. */
12610
12611static int
12612thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
12613{
12614 uint32_t record_buf[8];
12615 uint32_t reg_src1 = 0;
12616
12617 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12618
12619 record_buf[0] = ARM_PS_REGNUM;
12620 record_buf[1] = reg_src1;
12621 thumb_insn_r->reg_rec_count = 2;
12622
12623 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12624
12625 return 0;
12626}
12627
12628
12629/* Handling opcode 001 insns. */
12630
12631static int
12632thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
12633{
12634 uint32_t record_buf[8];
12635 uint32_t reg_src1 = 0;
12636
12637 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12638
12639 record_buf[0] = ARM_PS_REGNUM;
12640 record_buf[1] = reg_src1;
12641 thumb_insn_r->reg_rec_count = 2;
12642
12643 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12644
12645 return 0;
12646}
12647
12648/* Handling opcode 010 insns. */
12649
12650static int
12651thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
12652{
12653 struct regcache *reg_cache = thumb_insn_r->regcache;
12654 uint32_t record_buf[8], record_buf_mem[8];
12655
12656 uint32_t reg_src1 = 0, reg_src2 = 0;
12657 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
12658
12659 ULONGEST u_regval[2] = {0};
12660
12661 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
12662
12663 if (bit (thumb_insn_r->arm_insn, 12))
12664 {
12665 /* Handle load/store register offset. */
12666 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
12667 if (opcode2 >= 12 && opcode2 <= 15)
12668 {
12669 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
12670 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
12671 record_buf[0] = reg_src1;
12672 thumb_insn_r->reg_rec_count = 1;
12673 }
12674 else if (opcode2 >= 8 && opcode2 <= 10)
12675 {
12676 /* STR(2), STRB(2), STRH(2) . */
12677 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
12678 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
12679 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
12680 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12681 if (8 == opcode2)
12682 record_buf_mem[0] = 4; /* STR (2). */
12683 else if (10 == opcode2)
12684 record_buf_mem[0] = 1; /* STRB (2). */
12685 else if (9 == opcode2)
12686 record_buf_mem[0] = 2; /* STRH (2). */
12687 record_buf_mem[1] = u_regval[0] + u_regval[1];
12688 thumb_insn_r->mem_rec_count = 1;
12689 }
12690 }
12691 else if (bit (thumb_insn_r->arm_insn, 11))
12692 {
12693 /* Handle load from literal pool. */
12694 /* LDR(3). */
12695 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12696 record_buf[0] = reg_src1;
12697 thumb_insn_r->reg_rec_count = 1;
12698 }
12699 else if (opcode1)
12700 {
12701 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
12702 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
12703 if ((3 == opcode2) && (!opcode3))
12704 {
12705 /* Branch with exchange. */
12706 record_buf[0] = ARM_PS_REGNUM;
12707 thumb_insn_r->reg_rec_count = 1;
12708 }
12709 else
12710 {
12711 /* Format 8; special data processing insns. */
12712 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12713 record_buf[0] = ARM_PS_REGNUM;
12714 record_buf[1] = reg_src1;
12715 thumb_insn_r->reg_rec_count = 2;
12716 }
12717 }
12718 else
12719 {
12720 /* Format 5; data processing insns. */
12721 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12722 if (bit (thumb_insn_r->arm_insn, 7))
12723 {
12724 reg_src1 = reg_src1 + 8;
12725 }
12726 record_buf[0] = ARM_PS_REGNUM;
12727 record_buf[1] = reg_src1;
12728 thumb_insn_r->reg_rec_count = 2;
12729 }
12730
12731 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12732 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12733 record_buf_mem);
12734
12735 return 0;
12736}
12737
12738/* Handling opcode 001 insns. */
12739
12740static int
12741thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
12742{
12743 struct regcache *reg_cache = thumb_insn_r->regcache;
12744 uint32_t record_buf[8], record_buf_mem[8];
12745
12746 uint32_t reg_src1 = 0;
12747 uint32_t opcode = 0, immed_5 = 0;
12748
12749 ULONGEST u_regval = 0;
12750
12751 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
12752
12753 if (opcode)
12754 {
12755 /* LDR(1). */
12756 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12757 record_buf[0] = reg_src1;
12758 thumb_insn_r->reg_rec_count = 1;
12759 }
12760 else
12761 {
12762 /* STR(1). */
12763 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
12764 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
12765 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12766 record_buf_mem[0] = 4;
12767 record_buf_mem[1] = u_regval + (immed_5 * 4);
12768 thumb_insn_r->mem_rec_count = 1;
12769 }
12770
12771 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12772 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12773 record_buf_mem);
12774
12775 return 0;
12776}
12777
12778/* Handling opcode 100 insns. */
12779
12780static int
12781thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
12782{
12783 struct regcache *reg_cache = thumb_insn_r->regcache;
12784 uint32_t record_buf[8], record_buf_mem[8];
12785
12786 uint32_t reg_src1 = 0;
12787 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
12788
12789 ULONGEST u_regval = 0;
12790
12791 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
12792
12793 if (3 == opcode)
12794 {
12795 /* LDR(4). */
12796 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12797 record_buf[0] = reg_src1;
12798 thumb_insn_r->reg_rec_count = 1;
12799 }
12800 else if (1 == opcode)
12801 {
12802 /* LDRH(1). */
12803 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12804 record_buf[0] = reg_src1;
12805 thumb_insn_r->reg_rec_count = 1;
12806 }
12807 else if (2 == opcode)
12808 {
12809 /* STR(3). */
12810 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
12811 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
12812 record_buf_mem[0] = 4;
12813 record_buf_mem[1] = u_regval + (immed_8 * 4);
12814 thumb_insn_r->mem_rec_count = 1;
12815 }
12816 else if (0 == opcode)
12817 {
12818 /* STRH(1). */
12819 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
12820 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
12821 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12822 record_buf_mem[0] = 2;
12823 record_buf_mem[1] = u_regval + (immed_5 * 2);
12824 thumb_insn_r->mem_rec_count = 1;
12825 }
12826
12827 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12828 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12829 record_buf_mem);
12830
12831 return 0;
12832}
12833
12834/* Handling opcode 101 insns. */
12835
12836static int
12837thumb_record_misc (insn_decode_record *thumb_insn_r)
12838{
12839 struct regcache *reg_cache = thumb_insn_r->regcache;
12840
12841 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
12842 uint32_t register_bits = 0, register_count = 0;
12843 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
12844 uint32_t record_buf[24], record_buf_mem[48];
12845 uint32_t reg_src1;
12846
12847 ULONGEST u_regval = 0;
12848
12849 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
12850 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12851 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
12852
12853 if (14 == opcode2)
12854 {
12855 /* POP. */
12856 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12857 while (register_bits)
f969241e
OJ
12858 {
12859 if (register_bits & 0x00000001)
12860 record_buf[index++] = register_count;
12861 register_bits = register_bits >> 1;
12862 register_count++;
12863 }
12864 record_buf[index++] = ARM_PS_REGNUM;
12865 record_buf[index++] = ARM_SP_REGNUM;
12866 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
12867 }
12868 else if (10 == opcode2)
12869 {
12870 /* PUSH. */
12871 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
9904a494 12872 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
72508ac0
PO
12873 while (register_bits)
12874 {
12875 if (register_bits & 0x00000001)
12876 register_count++;
12877 register_bits = register_bits >> 1;
12878 }
12879 start_address = u_regval - \
12880 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
12881 thumb_insn_r->mem_rec_count = register_count;
12882 while (register_count)
12883 {
12884 record_buf_mem[(register_count * 2) - 1] = start_address;
12885 record_buf_mem[(register_count * 2) - 2] = 4;
12886 start_address = start_address + 4;
12887 register_count--;
12888 }
12889 record_buf[0] = ARM_SP_REGNUM;
12890 thumb_insn_r->reg_rec_count = 1;
12891 }
12892 else if (0x1E == opcode1)
12893 {
12894 /* BKPT insn. */
12895 /* Handle enhanced software breakpoint insn, BKPT. */
12896 /* CPSR is changed to be executed in ARM state, disabling normal
12897 interrupts, entering abort mode. */
12898 /* According to high vector configuration PC is set. */
12899 /* User hits breakpoint and type reverse, in that case, we need to go back with
12900 previous CPSR and Program Counter. */
12901 record_buf[0] = ARM_PS_REGNUM;
12902 record_buf[1] = ARM_LR_REGNUM;
12903 thumb_insn_r->reg_rec_count = 2;
12904 /* We need to save SPSR value, which is not yet done. */
12905 printf_unfiltered (_("Process record does not support instruction "
12906 "0x%0x at address %s.\n"),
12907 thumb_insn_r->arm_insn,
12908 paddress (thumb_insn_r->gdbarch,
12909 thumb_insn_r->this_addr));
12910 return -1;
12911 }
12912 else if ((0 == opcode) || (1 == opcode))
12913 {
12914 /* ADD(5), ADD(6). */
12915 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12916 record_buf[0] = reg_src1;
12917 thumb_insn_r->reg_rec_count = 1;
12918 }
12919 else if (2 == opcode)
12920 {
12921 /* ADD(7), SUB(4). */
12922 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12923 record_buf[0] = ARM_SP_REGNUM;
12924 thumb_insn_r->reg_rec_count = 1;
12925 }
12926
12927 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12928 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12929 record_buf_mem);
12930
12931 return 0;
12932}
12933
12934/* Handling opcode 110 insns. */
12935
12936static int
12937thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
12938{
12939 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
12940 struct regcache *reg_cache = thumb_insn_r->regcache;
12941
12942 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
12943 uint32_t reg_src1 = 0;
12944 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
12945 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
12946 uint32_t record_buf[24], record_buf_mem[48];
12947
12948 ULONGEST u_regval = 0;
12949
12950 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12951 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
12952
12953 if (1 == opcode2)
12954 {
12955
12956 /* LDMIA. */
12957 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12958 /* Get Rn. */
12959 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12960 while (register_bits)
12961 {
12962 if (register_bits & 0x00000001)
f969241e 12963 record_buf[index++] = register_count;
72508ac0 12964 register_bits = register_bits >> 1;
f969241e 12965 register_count++;
72508ac0 12966 }
f969241e
OJ
12967 record_buf[index++] = reg_src1;
12968 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
12969 }
12970 else if (0 == opcode2)
12971 {
12972 /* It handles both STMIA. */
12973 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12974 /* Get Rn. */
12975 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12976 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12977 while (register_bits)
12978 {
12979 if (register_bits & 0x00000001)
12980 register_count++;
12981 register_bits = register_bits >> 1;
12982 }
12983 start_address = u_regval;
12984 thumb_insn_r->mem_rec_count = register_count;
12985 while (register_count)
12986 {
12987 record_buf_mem[(register_count * 2) - 1] = start_address;
12988 record_buf_mem[(register_count * 2) - 2] = 4;
12989 start_address = start_address + 4;
12990 register_count--;
12991 }
12992 }
12993 else if (0x1F == opcode1)
12994 {
12995 /* Handle arm syscall insn. */
97dfe206 12996 if (tdep->arm_syscall_record != NULL)
72508ac0 12997 {
97dfe206
OJ
12998 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
12999 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
13000 }
13001 else
13002 {
13003 printf_unfiltered (_("no syscall record support\n"));
13004 return -1;
13005 }
13006 }
13007
13008 /* B (1), conditional branch is automatically taken care in process_record,
13009 as PC is saved there. */
13010
13011 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13012 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13013 record_buf_mem);
13014
13015 return ret;
13016}
13017
13018/* Handling opcode 111 insns. */
13019
13020static int
13021thumb_record_branch (insn_decode_record *thumb_insn_r)
13022{
13023 uint32_t record_buf[8];
13024 uint32_t bits_h = 0;
13025
13026 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
13027
13028 if (2 == bits_h || 3 == bits_h)
13029 {
13030 /* BL */
13031 record_buf[0] = ARM_LR_REGNUM;
13032 thumb_insn_r->reg_rec_count = 1;
13033 }
13034 else if (1 == bits_h)
13035 {
13036 /* BLX(1). */
13037 record_buf[0] = ARM_PS_REGNUM;
13038 record_buf[1] = ARM_LR_REGNUM;
13039 thumb_insn_r->reg_rec_count = 2;
13040 }
13041
13042 /* B(2) is automatically taken care in process_record, as PC is
13043 saved there. */
13044
13045 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13046
13047 return 0;
13048}
13049
c6ec2b30
OJ
13050/* Handler for thumb2 load/store multiple instructions. */
13051
13052static int
13053thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
13054{
13055 struct regcache *reg_cache = thumb2_insn_r->regcache;
13056
13057 uint32_t reg_rn, op;
13058 uint32_t register_bits = 0, register_count = 0;
13059 uint32_t index = 0, start_address = 0;
13060 uint32_t record_buf[24], record_buf_mem[48];
13061
13062 ULONGEST u_regval = 0;
13063
13064 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13065 op = bits (thumb2_insn_r->arm_insn, 23, 24);
13066
13067 if (0 == op || 3 == op)
13068 {
13069 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13070 {
13071 /* Handle RFE instruction. */
13072 record_buf[0] = ARM_PS_REGNUM;
13073 thumb2_insn_r->reg_rec_count = 1;
13074 }
13075 else
13076 {
13077 /* Handle SRS instruction after reading banked SP. */
13078 return arm_record_unsupported_insn (thumb2_insn_r);
13079 }
13080 }
13081 else if (1 == op || 2 == op)
13082 {
13083 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13084 {
13085 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
13086 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13087 while (register_bits)
13088 {
13089 if (register_bits & 0x00000001)
13090 record_buf[index++] = register_count;
13091
13092 register_count++;
13093 register_bits = register_bits >> 1;
13094 }
13095 record_buf[index++] = reg_rn;
13096 record_buf[index++] = ARM_PS_REGNUM;
13097 thumb2_insn_r->reg_rec_count = index;
13098 }
13099 else
13100 {
13101 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
13102 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13103 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
13104 while (register_bits)
13105 {
13106 if (register_bits & 0x00000001)
13107 register_count++;
13108
13109 register_bits = register_bits >> 1;
13110 }
13111
13112 if (1 == op)
13113 {
13114 /* Start address calculation for LDMDB/LDMEA. */
13115 start_address = u_regval;
13116 }
13117 else if (2 == op)
13118 {
13119 /* Start address calculation for LDMDB/LDMEA. */
13120 start_address = u_regval - register_count * 4;
13121 }
13122
13123 thumb2_insn_r->mem_rec_count = register_count;
13124 while (register_count)
13125 {
13126 record_buf_mem[register_count * 2 - 1] = start_address;
13127 record_buf_mem[register_count * 2 - 2] = 4;
13128 start_address = start_address + 4;
13129 register_count--;
13130 }
13131 record_buf[0] = reg_rn;
13132 record_buf[1] = ARM_PS_REGNUM;
13133 thumb2_insn_r->reg_rec_count = 2;
13134 }
13135 }
13136
13137 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13138 record_buf_mem);
13139 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13140 record_buf);
13141 return ARM_RECORD_SUCCESS;
13142}
13143
13144/* Handler for thumb2 load/store (dual/exclusive) and table branch
13145 instructions. */
13146
13147static int
13148thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
13149{
13150 struct regcache *reg_cache = thumb2_insn_r->regcache;
13151
13152 uint32_t reg_rd, reg_rn, offset_imm;
13153 uint32_t reg_dest1, reg_dest2;
13154 uint32_t address, offset_addr;
13155 uint32_t record_buf[8], record_buf_mem[8];
13156 uint32_t op1, op2, op3;
13157 LONGEST s_word;
13158
13159 ULONGEST u_regval[2];
13160
13161 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
13162 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
13163 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
13164
13165 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13166 {
13167 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
13168 {
13169 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
13170 record_buf[0] = reg_dest1;
13171 record_buf[1] = ARM_PS_REGNUM;
13172 thumb2_insn_r->reg_rec_count = 2;
13173 }
13174
13175 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
13176 {
13177 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
13178 record_buf[2] = reg_dest2;
13179 thumb2_insn_r->reg_rec_count = 3;
13180 }
13181 }
13182 else
13183 {
13184 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13185 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
13186
13187 if (0 == op1 && 0 == op2)
13188 {
13189 /* Handle STREX. */
13190 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13191 address = u_regval[0] + (offset_imm * 4);
13192 record_buf_mem[0] = 4;
13193 record_buf_mem[1] = address;
13194 thumb2_insn_r->mem_rec_count = 1;
13195 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13196 record_buf[0] = reg_rd;
13197 thumb2_insn_r->reg_rec_count = 1;
13198 }
13199 else if (1 == op1 && 0 == op2)
13200 {
13201 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13202 record_buf[0] = reg_rd;
13203 thumb2_insn_r->reg_rec_count = 1;
13204 address = u_regval[0];
13205 record_buf_mem[1] = address;
13206
13207 if (4 == op3)
13208 {
13209 /* Handle STREXB. */
13210 record_buf_mem[0] = 1;
13211 thumb2_insn_r->mem_rec_count = 1;
13212 }
13213 else if (5 == op3)
13214 {
13215 /* Handle STREXH. */
13216 record_buf_mem[0] = 2 ;
13217 thumb2_insn_r->mem_rec_count = 1;
13218 }
13219 else if (7 == op3)
13220 {
13221 /* Handle STREXD. */
13222 address = u_regval[0];
13223 record_buf_mem[0] = 4;
13224 record_buf_mem[2] = 4;
13225 record_buf_mem[3] = address + 4;
13226 thumb2_insn_r->mem_rec_count = 2;
13227 }
13228 }
13229 else
13230 {
13231 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13232
13233 if (bit (thumb2_insn_r->arm_insn, 24))
13234 {
13235 if (bit (thumb2_insn_r->arm_insn, 23))
13236 offset_addr = u_regval[0] + (offset_imm * 4);
13237 else
13238 offset_addr = u_regval[0] - (offset_imm * 4);
13239
13240 address = offset_addr;
13241 }
13242 else
13243 address = u_regval[0];
13244
13245 record_buf_mem[0] = 4;
13246 record_buf_mem[1] = address;
13247 record_buf_mem[2] = 4;
13248 record_buf_mem[3] = address + 4;
13249 thumb2_insn_r->mem_rec_count = 2;
13250 record_buf[0] = reg_rn;
13251 thumb2_insn_r->reg_rec_count = 1;
13252 }
13253 }
13254
13255 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13256 record_buf);
13257 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13258 record_buf_mem);
13259 return ARM_RECORD_SUCCESS;
13260}
13261
13262/* Handler for thumb2 data processing (shift register and modified immediate)
13263 instructions. */
13264
13265static int
13266thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
13267{
13268 uint32_t reg_rd, op;
13269 uint32_t record_buf[8];
13270
13271 op = bits (thumb2_insn_r->arm_insn, 21, 24);
13272 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
13273
13274 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
13275 {
13276 record_buf[0] = ARM_PS_REGNUM;
13277 thumb2_insn_r->reg_rec_count = 1;
13278 }
13279 else
13280 {
13281 record_buf[0] = reg_rd;
13282 record_buf[1] = ARM_PS_REGNUM;
13283 thumb2_insn_r->reg_rec_count = 2;
13284 }
13285
13286 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13287 record_buf);
13288 return ARM_RECORD_SUCCESS;
13289}
13290
13291/* Generic handler for thumb2 instructions which effect destination and PS
13292 registers. */
13293
13294static int
13295thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
13296{
13297 uint32_t reg_rd;
13298 uint32_t record_buf[8];
13299
13300 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
13301
13302 record_buf[0] = reg_rd;
13303 record_buf[1] = ARM_PS_REGNUM;
13304 thumb2_insn_r->reg_rec_count = 2;
13305
13306 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13307 record_buf);
13308 return ARM_RECORD_SUCCESS;
13309}
13310
13311/* Handler for thumb2 branch and miscellaneous control instructions. */
13312
13313static int
13314thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
13315{
13316 uint32_t op, op1, op2;
13317 uint32_t record_buf[8];
13318
13319 op = bits (thumb2_insn_r->arm_insn, 20, 26);
13320 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
13321 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
13322
13323 /* Handle MSR insn. */
13324 if (!(op1 & 0x2) && 0x38 == op)
13325 {
13326 if (!(op2 & 0x3))
13327 {
13328 /* CPSR is going to be changed. */
13329 record_buf[0] = ARM_PS_REGNUM;
13330 thumb2_insn_r->reg_rec_count = 1;
13331 }
13332 else
13333 {
13334 arm_record_unsupported_insn(thumb2_insn_r);
13335 return -1;
13336 }
13337 }
13338 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
13339 {
13340 /* BLX. */
13341 record_buf[0] = ARM_PS_REGNUM;
13342 record_buf[1] = ARM_LR_REGNUM;
13343 thumb2_insn_r->reg_rec_count = 2;
13344 }
13345
13346 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13347 record_buf);
13348 return ARM_RECORD_SUCCESS;
13349}
13350
13351/* Handler for thumb2 store single data item instructions. */
13352
13353static int
13354thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
13355{
13356 struct regcache *reg_cache = thumb2_insn_r->regcache;
13357
13358 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
13359 uint32_t address, offset_addr;
13360 uint32_t record_buf[8], record_buf_mem[8];
13361 uint32_t op1, op2;
13362
13363 ULONGEST u_regval[2];
13364
13365 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
13366 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
13367 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13368 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
13369
13370 if (bit (thumb2_insn_r->arm_insn, 23))
13371 {
13372 /* T2 encoding. */
13373 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
13374 offset_addr = u_regval[0] + offset_imm;
13375 address = offset_addr;
13376 }
13377 else
13378 {
13379 /* T3 encoding. */
13380 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
13381 {
13382 /* Handle STRB (register). */
13383 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
13384 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
13385 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
13386 offset_addr = u_regval[1] << shift_imm;
13387 address = u_regval[0] + offset_addr;
13388 }
13389 else
13390 {
13391 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13392 if (bit (thumb2_insn_r->arm_insn, 10))
13393 {
13394 if (bit (thumb2_insn_r->arm_insn, 9))
13395 offset_addr = u_regval[0] + offset_imm;
13396 else
13397 offset_addr = u_regval[0] - offset_imm;
13398
13399 address = offset_addr;
13400 }
13401 else
13402 address = u_regval[0];
13403 }
13404 }
13405
13406 switch (op1)
13407 {
13408 /* Store byte instructions. */
13409 case 4:
13410 case 0:
13411 record_buf_mem[0] = 1;
13412 break;
13413 /* Store half word instructions. */
13414 case 1:
13415 case 5:
13416 record_buf_mem[0] = 2;
13417 break;
13418 /* Store word instructions. */
13419 case 2:
13420 case 6:
13421 record_buf_mem[0] = 4;
13422 break;
13423
13424 default:
13425 gdb_assert_not_reached ("no decoding pattern found");
13426 break;
13427 }
13428
13429 record_buf_mem[1] = address;
13430 thumb2_insn_r->mem_rec_count = 1;
13431 record_buf[0] = reg_rn;
13432 thumb2_insn_r->reg_rec_count = 1;
13433
13434 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13435 record_buf);
13436 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13437 record_buf_mem);
13438 return ARM_RECORD_SUCCESS;
13439}
13440
13441/* Handler for thumb2 load memory hints instructions. */
13442
13443static int
13444thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
13445{
13446 uint32_t record_buf[8];
13447 uint32_t reg_rt, reg_rn;
13448
13449 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
13450 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13451
13452 if (ARM_PC_REGNUM != reg_rt)
13453 {
13454 record_buf[0] = reg_rt;
13455 record_buf[1] = reg_rn;
13456 record_buf[2] = ARM_PS_REGNUM;
13457 thumb2_insn_r->reg_rec_count = 3;
13458
13459 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13460 record_buf);
13461 return ARM_RECORD_SUCCESS;
13462 }
13463
13464 return ARM_RECORD_FAILURE;
13465}
13466
13467/* Handler for thumb2 load word instructions. */
13468
13469static int
13470thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
13471{
13472 uint32_t opcode1 = 0, opcode2 = 0;
13473 uint32_t record_buf[8];
13474
13475 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
13476 record_buf[1] = ARM_PS_REGNUM;
13477 thumb2_insn_r->reg_rec_count = 2;
13478
13479 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13480 record_buf);
13481 return ARM_RECORD_SUCCESS;
13482}
13483
13484/* Handler for thumb2 long multiply, long multiply accumulate, and
13485 divide instructions. */
13486
13487static int
13488thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
13489{
13490 uint32_t opcode1 = 0, opcode2 = 0;
13491 uint32_t record_buf[8];
13492 uint32_t reg_src1 = 0;
13493
13494 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
13495 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
13496
13497 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
13498 {
13499 /* Handle SMULL, UMULL, SMULAL. */
13500 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
13501 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
13502 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
13503 record_buf[2] = ARM_PS_REGNUM;
13504 thumb2_insn_r->reg_rec_count = 3;
13505 }
13506 else if (1 == opcode1 || 3 == opcode2)
13507 {
13508 /* Handle SDIV and UDIV. */
13509 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
13510 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
13511 record_buf[2] = ARM_PS_REGNUM;
13512 thumb2_insn_r->reg_rec_count = 3;
13513 }
13514 else
13515 return ARM_RECORD_FAILURE;
13516
13517 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13518 record_buf);
13519 return ARM_RECORD_SUCCESS;
13520}
13521
60cc5e93
OJ
13522/* Record handler for thumb32 coprocessor instructions. */
13523
13524static int
13525thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
13526{
13527 if (bit (thumb2_insn_r->arm_insn, 25))
13528 return arm_record_coproc_data_proc (thumb2_insn_r);
13529 else
13530 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
13531}
13532
1e1b6563
OJ
13533/* Record handler for advance SIMD structure load/store instructions. */
13534
13535static int
13536thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
13537{
13538 struct regcache *reg_cache = thumb2_insn_r->regcache;
13539 uint32_t l_bit, a_bit, b_bits;
13540 uint32_t record_buf[128], record_buf_mem[128];
13541 uint32_t reg_rn, reg_vd, address, f_esize, f_elem;
13542 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
13543 uint8_t f_ebytes;
13544
13545 l_bit = bit (thumb2_insn_r->arm_insn, 21);
13546 a_bit = bit (thumb2_insn_r->arm_insn, 23);
13547 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
13548 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13549 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
13550 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
13551 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
13552 f_esize = 8 * f_ebytes;
13553 f_elem = 8 / f_ebytes;
13554
13555 if (!l_bit)
13556 {
13557 ULONGEST u_regval = 0;
13558 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
13559 address = u_regval;
13560
13561 if (!a_bit)
13562 {
13563 /* Handle VST1. */
13564 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
13565 {
13566 if (b_bits == 0x07)
13567 bf_regs = 1;
13568 else if (b_bits == 0x0a)
13569 bf_regs = 2;
13570 else if (b_bits == 0x06)
13571 bf_regs = 3;
13572 else if (b_bits == 0x02)
13573 bf_regs = 4;
13574 else
13575 bf_regs = 0;
13576
13577 for (index_r = 0; index_r < bf_regs; index_r++)
13578 {
13579 for (index_e = 0; index_e < f_elem; index_e++)
13580 {
13581 record_buf_mem[index_m++] = f_ebytes;
13582 record_buf_mem[index_m++] = address;
13583 address = address + f_ebytes;
13584 thumb2_insn_r->mem_rec_count += 1;
13585 }
13586 }
13587 }
13588 /* Handle VST2. */
13589 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
13590 {
13591 if (b_bits == 0x09 || b_bits == 0x08)
13592 bf_regs = 1;
13593 else if (b_bits == 0x03)
13594 bf_regs = 2;
13595 else
13596 bf_regs = 0;
13597
13598 for (index_r = 0; index_r < bf_regs; index_r++)
13599 for (index_e = 0; index_e < f_elem; index_e++)
13600 {
13601 for (loop_t = 0; loop_t < 2; loop_t++)
13602 {
13603 record_buf_mem[index_m++] = f_ebytes;
13604 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
13605 thumb2_insn_r->mem_rec_count += 1;
13606 }
13607 address = address + (2 * f_ebytes);
13608 }
13609 }
13610 /* Handle VST3. */
13611 else if ((b_bits & 0x0e) == 0x04)
13612 {
13613 for (index_e = 0; index_e < f_elem; index_e++)
13614 {
13615 for (loop_t = 0; loop_t < 3; loop_t++)
13616 {
13617 record_buf_mem[index_m++] = f_ebytes;
13618 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
13619 thumb2_insn_r->mem_rec_count += 1;
13620 }
13621 address = address + (3 * f_ebytes);
13622 }
13623 }
13624 /* Handle VST4. */
13625 else if (!(b_bits & 0x0e))
13626 {
13627 for (index_e = 0; index_e < f_elem; index_e++)
13628 {
13629 for (loop_t = 0; loop_t < 4; loop_t++)
13630 {
13631 record_buf_mem[index_m++] = f_ebytes;
13632 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
13633 thumb2_insn_r->mem_rec_count += 1;
13634 }
13635 address = address + (4 * f_ebytes);
13636 }
13637 }
13638 }
13639 else
13640 {
13641 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
13642
13643 if (bft_size == 0x00)
13644 f_ebytes = 1;
13645 else if (bft_size == 0x01)
13646 f_ebytes = 2;
13647 else if (bft_size == 0x02)
13648 f_ebytes = 4;
13649 else
13650 f_ebytes = 0;
13651
13652 /* Handle VST1. */
13653 if (!(b_bits & 0x0b) || b_bits == 0x08)
13654 thumb2_insn_r->mem_rec_count = 1;
13655 /* Handle VST2. */
13656 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
13657 thumb2_insn_r->mem_rec_count = 2;
13658 /* Handle VST3. */
13659 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
13660 thumb2_insn_r->mem_rec_count = 3;
13661 /* Handle VST4. */
13662 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
13663 thumb2_insn_r->mem_rec_count = 4;
13664
13665 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
13666 {
13667 record_buf_mem[index_m] = f_ebytes;
13668 record_buf_mem[index_m] = address + (index_m * f_ebytes);
13669 }
13670 }
13671 }
13672 else
13673 {
13674 if (!a_bit)
13675 {
13676 /* Handle VLD1. */
13677 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
13678 thumb2_insn_r->reg_rec_count = 1;
13679 /* Handle VLD2. */
13680 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
13681 thumb2_insn_r->reg_rec_count = 2;
13682 /* Handle VLD3. */
13683 else if ((b_bits & 0x0e) == 0x04)
13684 thumb2_insn_r->reg_rec_count = 3;
13685 /* Handle VLD4. */
13686 else if (!(b_bits & 0x0e))
13687 thumb2_insn_r->reg_rec_count = 4;
13688 }
13689 else
13690 {
13691 /* Handle VLD1. */
13692 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
13693 thumb2_insn_r->reg_rec_count = 1;
13694 /* Handle VLD2. */
13695 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
13696 thumb2_insn_r->reg_rec_count = 2;
13697 /* Handle VLD3. */
13698 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
13699 thumb2_insn_r->reg_rec_count = 3;
13700 /* Handle VLD4. */
13701 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
13702 thumb2_insn_r->reg_rec_count = 4;
13703
13704 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
13705 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
13706 }
13707 }
13708
13709 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
13710 {
13711 record_buf[index_r] = reg_rn;
13712 thumb2_insn_r->reg_rec_count += 1;
13713 }
13714
13715 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13716 record_buf);
13717 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13718 record_buf_mem);
13719 return 0;
13720}
13721
c6ec2b30
OJ
13722/* Decodes thumb2 instruction type and invokes its record handler. */
13723
13724static unsigned int
13725thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
13726{
13727 uint32_t op, op1, op2;
13728
13729 op = bit (thumb2_insn_r->arm_insn, 15);
13730 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
13731 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
13732
13733 if (op1 == 0x01)
13734 {
13735 if (!(op2 & 0x64 ))
13736 {
13737 /* Load/store multiple instruction. */
13738 return thumb2_record_ld_st_multiple (thumb2_insn_r);
13739 }
13740 else if (!((op2 & 0x64) ^ 0x04))
13741 {
13742 /* Load/store (dual/exclusive) and table branch instruction. */
13743 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
13744 }
13745 else if (!((op2 & 0x20) ^ 0x20))
13746 {
13747 /* Data-processing (shifted register). */
13748 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
13749 }
13750 else if (op2 & 0x40)
13751 {
13752 /* Co-processor instructions. */
60cc5e93 13753 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
13754 }
13755 }
13756 else if (op1 == 0x02)
13757 {
13758 if (op)
13759 {
13760 /* Branches and miscellaneous control instructions. */
13761 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
13762 }
13763 else if (op2 & 0x20)
13764 {
13765 /* Data-processing (plain binary immediate) instruction. */
13766 return thumb2_record_ps_dest_generic (thumb2_insn_r);
13767 }
13768 else
13769 {
13770 /* Data-processing (modified immediate). */
13771 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
13772 }
13773 }
13774 else if (op1 == 0x03)
13775 {
13776 if (!(op2 & 0x71 ))
13777 {
13778 /* Store single data item. */
13779 return thumb2_record_str_single_data (thumb2_insn_r);
13780 }
13781 else if (!((op2 & 0x71) ^ 0x10))
13782 {
13783 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 13784 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
13785 }
13786 else if (!((op2 & 0x67) ^ 0x01))
13787 {
13788 /* Load byte, memory hints instruction. */
13789 return thumb2_record_ld_mem_hints (thumb2_insn_r);
13790 }
13791 else if (!((op2 & 0x67) ^ 0x03))
13792 {
13793 /* Load halfword, memory hints instruction. */
13794 return thumb2_record_ld_mem_hints (thumb2_insn_r);
13795 }
13796 else if (!((op2 & 0x67) ^ 0x05))
13797 {
13798 /* Load word instruction. */
13799 return thumb2_record_ld_word (thumb2_insn_r);
13800 }
13801 else if (!((op2 & 0x70) ^ 0x20))
13802 {
13803 /* Data-processing (register) instruction. */
13804 return thumb2_record_ps_dest_generic (thumb2_insn_r);
13805 }
13806 else if (!((op2 & 0x78) ^ 0x30))
13807 {
13808 /* Multiply, multiply accumulate, abs diff instruction. */
13809 return thumb2_record_ps_dest_generic (thumb2_insn_r);
13810 }
13811 else if (!((op2 & 0x78) ^ 0x38))
13812 {
13813 /* Long multiply, long multiply accumulate, and divide. */
13814 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
13815 }
13816 else if (op2 & 0x40)
13817 {
13818 /* Co-processor instructions. */
60cc5e93 13819 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
13820 }
13821 }
13822
13823 return -1;
13824}
72508ac0
PO
13825
13826/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
13827and positive val on fauilure. */
13828
13829static int
13830extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
13831{
13832 gdb_byte buf[insn_size];
13833
13834 memset (&buf[0], 0, insn_size);
13835
13836 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
13837 return 1;
13838 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
13839 insn_size,
2959fed9 13840 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
13841 return 0;
13842}
13843
13844typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
13845
13846/* Decode arm/thumb insn depending on condition cods and opcodes; and
13847 dispatch it. */
13848
13849static int
13850decode_insn (insn_decode_record *arm_record, record_type_t record_type,
13851 uint32_t insn_size)
13852{
13853
13854 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
0fa9c223 13855 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
13856 {
13857 arm_record_data_proc_misc_ld_str, /* 000. */
13858 arm_record_data_proc_imm, /* 001. */
13859 arm_record_ld_st_imm_offset, /* 010. */
13860 arm_record_ld_st_reg_offset, /* 011. */
13861 arm_record_ld_st_multiple, /* 100. */
13862 arm_record_b_bl, /* 101. */
60cc5e93 13863 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
13864 arm_record_coproc_data_proc /* 111. */
13865 };
13866
13867 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
0fa9c223 13868 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
13869 { \
13870 thumb_record_shift_add_sub, /* 000. */
13871 thumb_record_add_sub_cmp_mov, /* 001. */
13872 thumb_record_ld_st_reg_offset, /* 010. */
13873 thumb_record_ld_st_imm_offset, /* 011. */
13874 thumb_record_ld_st_stack, /* 100. */
13875 thumb_record_misc, /* 101. */
13876 thumb_record_ldm_stm_swi, /* 110. */
13877 thumb_record_branch /* 111. */
13878 };
13879
13880 uint32_t ret = 0; /* return value: negative:failure 0:success. */
13881 uint32_t insn_id = 0;
13882
13883 if (extract_arm_insn (arm_record, insn_size))
13884 {
13885 if (record_debug)
13886 {
13887 printf_unfiltered (_("Process record: error reading memory at "
13888 "addr %s len = %d.\n"),
13889 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
13890 }
13891 return -1;
13892 }
13893 else if (ARM_RECORD == record_type)
13894 {
13895 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
13896 insn_id = bits (arm_record->arm_insn, 25, 27);
13897 ret = arm_record_extension_space (arm_record);
13898 /* If this insn has fallen into extension space
13899 then we need not decode it anymore. */
13900 if (ret != -1 && !INSN_RECORDED(arm_record))
13901 {
13902 ret = arm_handle_insn[insn_id] (arm_record);
13903 }
13904 }
13905 else if (THUMB_RECORD == record_type)
13906 {
13907 /* As thumb does not have condition codes, we set negative. */
13908 arm_record->cond = -1;
13909 insn_id = bits (arm_record->arm_insn, 13, 15);
13910 ret = thumb_handle_insn[insn_id] (arm_record);
13911 }
13912 else if (THUMB2_RECORD == record_type)
13913 {
c6ec2b30
OJ
13914 /* As thumb does not have condition codes, we set negative. */
13915 arm_record->cond = -1;
13916
13917 /* Swap first half of 32bit thumb instruction with second half. */
13918 arm_record->arm_insn
13919 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
13920
13921 insn_id = thumb2_record_decode_insn_handler (arm_record);
13922
13923 if (insn_id != ARM_RECORD_SUCCESS)
13924 {
13925 arm_record_unsupported_insn (arm_record);
13926 ret = -1;
13927 }
72508ac0
PO
13928 }
13929 else
13930 {
13931 /* Throw assertion. */
13932 gdb_assert_not_reached ("not a valid instruction, could not decode");
13933 }
13934
13935 return ret;
13936}
13937
13938
13939/* Cleans up local record registers and memory allocations. */
13940
13941static void
13942deallocate_reg_mem (insn_decode_record *record)
13943{
13944 xfree (record->arm_regs);
13945 xfree (record->arm_mems);
13946}
13947
13948
13949/* Parse the current instruction and record the values of the registers and
13950 memory that will be changed in current instruction to record_arch_list".
13951 Return -1 if something is wrong. */
13952
13953int
13954arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
13955 CORE_ADDR insn_addr)
13956{
13957
13958 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
13959 uint32_t no_of_rec = 0;
13960 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
13961 ULONGEST t_bit = 0, insn_id = 0;
13962
13963 ULONGEST u_regval = 0;
13964
13965 insn_decode_record arm_record;
13966
13967 memset (&arm_record, 0, sizeof (insn_decode_record));
13968 arm_record.regcache = regcache;
13969 arm_record.this_addr = insn_addr;
13970 arm_record.gdbarch = gdbarch;
13971
13972
13973 if (record_debug > 1)
13974 {
13975 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
13976 "addr = %s\n",
13977 paddress (gdbarch, arm_record.this_addr));
13978 }
13979
13980 if (extract_arm_insn (&arm_record, 2))
13981 {
13982 if (record_debug)
13983 {
13984 printf_unfiltered (_("Process record: error reading memory at "
13985 "addr %s len = %d.\n"),
13986 paddress (arm_record.gdbarch,
13987 arm_record.this_addr), 2);
13988 }
13989 return -1;
13990 }
13991
13992 /* Check the insn, whether it is thumb or arm one. */
13993
13994 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
13995 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
13996
13997
13998 if (!(u_regval & t_bit))
13999 {
14000 /* We are decoding arm insn. */
14001 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
14002 }
14003 else
14004 {
14005 insn_id = bits (arm_record.arm_insn, 11, 15);
14006 /* is it thumb2 insn? */
14007 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
14008 {
14009 ret = decode_insn (&arm_record, THUMB2_RECORD,
14010 THUMB2_INSN_SIZE_BYTES);
14011 }
14012 else
14013 {
14014 /* We are decoding thumb insn. */
14015 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
14016 }
14017 }
14018
14019 if (0 == ret)
14020 {
14021 /* Record registers. */
25ea693b 14022 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0
PO
14023 if (arm_record.arm_regs)
14024 {
14025 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
14026 {
25ea693b
MM
14027 if (record_full_arch_list_add_reg
14028 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
72508ac0
PO
14029 ret = -1;
14030 }
14031 }
14032 /* Record memories. */
14033 if (arm_record.arm_mems)
14034 {
14035 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
14036 {
25ea693b 14037 if (record_full_arch_list_add_mem
72508ac0 14038 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 14039 arm_record.arm_mems[no_of_rec].len))
72508ac0
PO
14040 ret = -1;
14041 }
14042 }
14043
25ea693b 14044 if (record_full_arch_list_add_end ())
72508ac0
PO
14045 ret = -1;
14046 }
14047
14048
14049 deallocate_reg_mem (&arm_record);
14050
14051 return ret;
14052}
14053
This page took 2.161331 seconds and 4 git commands to generate.