arm-tdep.c: Remove unused arm_displaced_step_copy_insn
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
CommitLineData
ed9a39eb 1/* Common target dependent code for GDB on ARM systems.
0fd88904 2
618f726f 3 Copyright (C) 1988-2016 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"
d9311bfa 49#include "arch/arm-get-next-pcs.h"
34e8f22d 50#include "arm-tdep.h"
26216b98 51#include "gdb/sim-arm.h"
34e8f22d 52
082fc60d
RE
53#include "elf-bfd.h"
54#include "coff/internal.h"
97e03143 55#include "elf/arm.h"
c906108c 56
60c5725c 57#include "vec.h"
26216b98 58
72508ac0 59#include "record.h"
d02ed0bb 60#include "record-full.h"
72508ac0 61
9779414d 62#include "features/arm-with-m.c"
25f8c692 63#include "features/arm-with-m-fpa-layout.c"
3184d3f9 64#include "features/arm-with-m-vfp-d16.c"
ef7e8358
UW
65#include "features/arm-with-iwmmxt.c"
66#include "features/arm-with-vfpv2.c"
67#include "features/arm-with-vfpv3.c"
68#include "features/arm-with-neon.c"
9779414d 69
6529d2dd
AC
70static int arm_debug;
71
082fc60d
RE
72/* Macros for setting and testing a bit in a minimal symbol that marks
73 it as Thumb function. The MSB of the minimal symbol's "info" field
f594e5e9 74 is used for this purpose.
082fc60d
RE
75
76 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
f594e5e9 77 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
082fc60d 78
0963b4bd 79#define MSYMBOL_SET_SPECIAL(msym) \
b887350f 80 MSYMBOL_TARGET_FLAG_1 (msym) = 1
082fc60d
RE
81
82#define MSYMBOL_IS_SPECIAL(msym) \
b887350f 83 MSYMBOL_TARGET_FLAG_1 (msym)
082fc60d 84
60c5725c
DJ
85/* Per-objfile data used for mapping symbols. */
86static const struct objfile_data *arm_objfile_data_key;
87
88struct arm_mapping_symbol
89{
90 bfd_vma value;
91 char type;
92};
93typedef struct arm_mapping_symbol arm_mapping_symbol_s;
94DEF_VEC_O(arm_mapping_symbol_s);
95
96struct arm_per_objfile
97{
98 VEC(arm_mapping_symbol_s) **section_maps;
99};
100
afd7eef0
RE
101/* The list of available "set arm ..." and "show arm ..." commands. */
102static struct cmd_list_element *setarmcmdlist = NULL;
103static struct cmd_list_element *showarmcmdlist = NULL;
104
fd50bc42
RE
105/* The type of floating-point to use. Keep this in sync with enum
106 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 107static const char *const fp_model_strings[] =
fd50bc42
RE
108{
109 "auto",
110 "softfpa",
111 "fpa",
112 "softvfp",
28e97307
DJ
113 "vfp",
114 NULL
fd50bc42
RE
115};
116
117/* A variable that can be configured by the user. */
118static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
119static const char *current_fp_model = "auto";
120
28e97307 121/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 122static const char *const arm_abi_strings[] =
28e97307
DJ
123{
124 "auto",
125 "APCS",
126 "AAPCS",
127 NULL
128};
129
130/* A variable that can be configured by the user. */
131static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
132static const char *arm_abi_string = "auto";
133
0428b8f5 134/* The execution mode to assume. */
40478521 135static const char *const arm_mode_strings[] =
0428b8f5
DJ
136 {
137 "auto",
138 "arm",
68770265
MGD
139 "thumb",
140 NULL
0428b8f5
DJ
141 };
142
143static const char *arm_fallback_mode_string = "auto";
144static const char *arm_force_mode_string = "auto";
145
18819fa6
UW
146/* Internal override of the execution mode. -1 means no override,
147 0 means override to ARM mode, 1 means override to Thumb mode.
148 The effect is the same as if arm_force_mode has been set by the
149 user (except the internal override has precedence over a user's
150 arm_force_mode override). */
151static int arm_override_mode = -1;
152
94c30b78 153/* Number of different reg name sets (options). */
afd7eef0 154static int num_disassembly_options;
bc90b915 155
f32bf4a4
YQ
156/* The standard register names, and all the valid aliases for them. Note
157 that `fp', `sp' and `pc' are not added in this alias list, because they
158 have been added as builtin user registers in
159 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
160static const struct
161{
162 const char *name;
163 int regnum;
164} arm_register_aliases[] = {
165 /* Basic register numbers. */
166 { "r0", 0 },
167 { "r1", 1 },
168 { "r2", 2 },
169 { "r3", 3 },
170 { "r4", 4 },
171 { "r5", 5 },
172 { "r6", 6 },
173 { "r7", 7 },
174 { "r8", 8 },
175 { "r9", 9 },
176 { "r10", 10 },
177 { "r11", 11 },
178 { "r12", 12 },
179 { "r13", 13 },
180 { "r14", 14 },
181 { "r15", 15 },
182 /* Synonyms (argument and variable registers). */
183 { "a1", 0 },
184 { "a2", 1 },
185 { "a3", 2 },
186 { "a4", 3 },
187 { "v1", 4 },
188 { "v2", 5 },
189 { "v3", 6 },
190 { "v4", 7 },
191 { "v5", 8 },
192 { "v6", 9 },
193 { "v7", 10 },
194 { "v8", 11 },
195 /* Other platform-specific names for r9. */
196 { "sb", 9 },
197 { "tr", 9 },
198 /* Special names. */
199 { "ip", 12 },
123dc839 200 { "lr", 14 },
123dc839
DJ
201 /* Names used by GCC (not listed in the ARM EABI). */
202 { "sl", 10 },
123dc839
DJ
203 /* A special name from the older ATPCS. */
204 { "wr", 7 },
205};
bc90b915 206
123dc839 207static const char *const arm_register_names[] =
da59e081
JM
208{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
209 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
210 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
211 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
212 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
213 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 214 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 215
afd7eef0
RE
216/* Valid register name styles. */
217static const char **valid_disassembly_styles;
ed9a39eb 218
afd7eef0
RE
219/* Disassembly style to use. Default to "std" register names. */
220static const char *disassembly_style;
96baa820 221
ed9a39eb 222/* This is used to keep the bfd arch_info in sync with the disassembly
afd7eef0
RE
223 style. */
224static void set_disassembly_style_sfunc(char *, int,
ed9a39eb 225 struct cmd_list_element *);
afd7eef0 226static void set_disassembly_style (void);
ed9a39eb 227
b508a996 228static void convert_from_extended (const struct floatformat *, const void *,
be8626e0 229 void *, int);
b508a996 230static void convert_to_extended (const struct floatformat *, void *,
be8626e0 231 const void *, int);
ed9a39eb 232
05d1431c
PA
233static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
234 struct regcache *regcache,
235 int regnum, gdb_byte *buf);
58d6951d
DJ
236static void arm_neon_quad_write (struct gdbarch *gdbarch,
237 struct regcache *regcache,
238 int regnum, const gdb_byte *buf);
239
e7cf25a8
YQ
240static CORE_ADDR
241 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
242 CORE_ADDR pc);
243
244
d9311bfa
AT
245/* get_next_pcs operations. */
246static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
247 arm_get_next_pcs_read_memory_unsigned_integer,
248 arm_get_next_pcs_syscall_next_pc,
249 arm_get_next_pcs_addr_bits_remove,
250 arm_get_next_pcs_is_thumb
251};
252
9b8d791a 253struct arm_prologue_cache
c3b4394c 254{
eb5492fa
DJ
255 /* The stack pointer at the time this frame was created; i.e. the
256 caller's stack pointer when this function was called. It is used
257 to identify this frame. */
258 CORE_ADDR prev_sp;
259
4be43953
DJ
260 /* The frame base for this frame is just prev_sp - frame size.
261 FRAMESIZE is the distance from the frame pointer to the
262 initial stack pointer. */
eb5492fa 263
c3b4394c 264 int framesize;
eb5492fa
DJ
265
266 /* The register used to hold the frame pointer for this frame. */
c3b4394c 267 int framereg;
eb5492fa
DJ
268
269 /* Saved register offsets. */
270 struct trad_frame_saved_reg *saved_regs;
c3b4394c 271};
ed9a39eb 272
0d39a070
DJ
273static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
274 CORE_ADDR prologue_start,
275 CORE_ADDR prologue_end,
276 struct arm_prologue_cache *cache);
277
cca44b1b
JB
278/* Architecture version for displaced stepping. This effects the behaviour of
279 certain instructions, and really should not be hard-wired. */
280
281#define DISPLACED_STEPPING_ARCH_VERSION 5
282
94c30b78 283/* Set to true if the 32-bit mode is in use. */
c906108c
SS
284
285int arm_apcs_32 = 1;
286
9779414d
DJ
287/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
288
478fd957 289int
9779414d
DJ
290arm_psr_thumb_bit (struct gdbarch *gdbarch)
291{
292 if (gdbarch_tdep (gdbarch)->is_m)
293 return XPSR_T;
294 else
295 return CPSR_T;
296}
297
d0e59a68
AT
298/* Determine if the processor is currently executing in Thumb mode. */
299
300int
301arm_is_thumb (struct regcache *regcache)
302{
303 ULONGEST cpsr;
304 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regcache));
305
306 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
307
308 return (cpsr & t_bit) != 0;
309}
310
b39cc962
DJ
311/* Determine if FRAME is executing in Thumb mode. */
312
25b41d01 313int
b39cc962
DJ
314arm_frame_is_thumb (struct frame_info *frame)
315{
316 CORE_ADDR cpsr;
9779414d 317 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
318
319 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
320 directly (from a signal frame or dummy frame) or by interpreting
321 the saved LR (from a prologue or DWARF frame). So consult it and
322 trust the unwinders. */
323 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
324
9779414d 325 return (cpsr & t_bit) != 0;
b39cc962
DJ
326}
327
60c5725c
DJ
328/* Callback for VEC_lower_bound. */
329
330static inline int
331arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
332 const struct arm_mapping_symbol *rhs)
333{
334 return lhs->value < rhs->value;
335}
336
f9d67f43
DJ
337/* Search for the mapping symbol covering MEMADDR. If one is found,
338 return its type. Otherwise, return 0. If START is non-NULL,
339 set *START to the location of the mapping symbol. */
c906108c 340
f9d67f43
DJ
341static char
342arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 343{
60c5725c 344 struct obj_section *sec;
0428b8f5 345
60c5725c
DJ
346 /* If there are mapping symbols, consult them. */
347 sec = find_pc_section (memaddr);
348 if (sec != NULL)
349 {
350 struct arm_per_objfile *data;
351 VEC(arm_mapping_symbol_s) *map;
aded6f54
PA
352 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
353 0 };
60c5725c
DJ
354 unsigned int idx;
355
9a3c8263
SM
356 data = (struct arm_per_objfile *) objfile_data (sec->objfile,
357 arm_objfile_data_key);
60c5725c
DJ
358 if (data != NULL)
359 {
360 map = data->section_maps[sec->the_bfd_section->index];
361 if (!VEC_empty (arm_mapping_symbol_s, map))
362 {
363 struct arm_mapping_symbol *map_sym;
364
365 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
366 arm_compare_mapping_symbols);
367
368 /* VEC_lower_bound finds the earliest ordered insertion
369 point. If the following symbol starts at this exact
370 address, we use that; otherwise, the preceding
371 mapping symbol covers this address. */
372 if (idx < VEC_length (arm_mapping_symbol_s, map))
373 {
374 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
375 if (map_sym->value == map_key.value)
f9d67f43
DJ
376 {
377 if (start)
378 *start = map_sym->value + obj_section_addr (sec);
379 return map_sym->type;
380 }
60c5725c
DJ
381 }
382
383 if (idx > 0)
384 {
385 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
f9d67f43
DJ
386 if (start)
387 *start = map_sym->value + obj_section_addr (sec);
388 return map_sym->type;
60c5725c
DJ
389 }
390 }
391 }
392 }
393
f9d67f43
DJ
394 return 0;
395}
396
397/* Determine if the program counter specified in MEMADDR is in a Thumb
398 function. This function should be called for addresses unrelated to
399 any executing frame; otherwise, prefer arm_frame_is_thumb. */
400
e3039479 401int
9779414d 402arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 403{
7cbd4a93 404 struct bound_minimal_symbol sym;
f9d67f43 405 char type;
a42244db
YQ
406 struct displaced_step_closure* dsc
407 = get_displaced_step_closure_by_addr(memaddr);
408
409 /* If checking the mode of displaced instruction in copy area, the mode
410 should be determined by instruction on the original address. */
411 if (dsc)
412 {
413 if (debug_displaced)
414 fprintf_unfiltered (gdb_stdlog,
415 "displaced: check mode of %.8lx instead of %.8lx\n",
416 (unsigned long) dsc->insn_addr,
417 (unsigned long) memaddr);
418 memaddr = dsc->insn_addr;
419 }
f9d67f43
DJ
420
421 /* If bit 0 of the address is set, assume this is a Thumb address. */
422 if (IS_THUMB_ADDR (memaddr))
423 return 1;
424
18819fa6
UW
425 /* Respect internal mode override if active. */
426 if (arm_override_mode != -1)
427 return arm_override_mode;
428
f9d67f43
DJ
429 /* If the user wants to override the symbol table, let him. */
430 if (strcmp (arm_force_mode_string, "arm") == 0)
431 return 0;
432 if (strcmp (arm_force_mode_string, "thumb") == 0)
433 return 1;
434
9779414d
DJ
435 /* ARM v6-M and v7-M are always in Thumb mode. */
436 if (gdbarch_tdep (gdbarch)->is_m)
437 return 1;
438
f9d67f43
DJ
439 /* If there are mapping symbols, consult them. */
440 type = arm_find_mapping_symbol (memaddr, NULL);
441 if (type)
442 return type == 't';
443
ed9a39eb 444 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c 445 sym = lookup_minimal_symbol_by_pc (memaddr);
7cbd4a93
TT
446 if (sym.minsym)
447 return (MSYMBOL_IS_SPECIAL (sym.minsym));
0428b8f5
DJ
448
449 /* If the user wants to override the fallback mode, let them. */
450 if (strcmp (arm_fallback_mode_string, "arm") == 0)
451 return 0;
452 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
453 return 1;
454
455 /* If we couldn't find any symbol, but we're talking to a running
456 target, then trust the current value of $cpsr. This lets
457 "display/i $pc" always show the correct mode (though if there is
458 a symbol table we will not reach here, so it still may not be
18819fa6 459 displayed in the mode it will be executed). */
0428b8f5 460 if (target_has_registers)
18819fa6 461 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
462
463 /* Otherwise we're out of luck; we assume ARM. */
464 return 0;
c906108c
SS
465}
466
181c1381 467/* Remove useless bits from addresses in a running program. */
34e8f22d 468static CORE_ADDR
24568a2c 469arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 470{
2ae28aa9
YQ
471 /* On M-profile devices, do not strip the low bit from EXC_RETURN
472 (the magic exception return address). */
473 if (gdbarch_tdep (gdbarch)->is_m
474 && (val & 0xfffffff0) == 0xfffffff0)
475 return val;
476
a3a2ee65 477 if (arm_apcs_32)
dd6be234 478 return UNMAKE_THUMB_ADDR (val);
c906108c 479 else
a3a2ee65 480 return (val & 0x03fffffc);
c906108c
SS
481}
482
0d39a070 483/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
484 can be safely ignored during prologue skipping. IS_THUMB is true
485 if the function is known to be a Thumb function due to the way it
486 is being called. */
0d39a070 487static int
e0634ccf 488skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 489{
e0634ccf 490 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7cbd4a93 491 struct bound_minimal_symbol msym;
0d39a070
DJ
492
493 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 494 if (msym.minsym != NULL
77e371c0 495 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
efd66ac6 496 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
e0634ccf 497 {
efd66ac6 498 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
0d39a070 499
e0634ccf
UW
500 /* The GNU linker's Thumb call stub to foo is named
501 __foo_from_thumb. */
502 if (strstr (name, "_from_thumb") != NULL)
503 name += 2;
0d39a070 504
e0634ccf
UW
505 /* On soft-float targets, __truncdfsf2 is called to convert promoted
506 arguments to their argument types in non-prototyped
507 functions. */
61012eef 508 if (startswith (name, "__truncdfsf2"))
e0634ccf 509 return 1;
61012eef 510 if (startswith (name, "__aeabi_d2f"))
e0634ccf 511 return 1;
0d39a070 512
e0634ccf 513 /* Internal functions related to thread-local storage. */
61012eef 514 if (startswith (name, "__tls_get_addr"))
e0634ccf 515 return 1;
61012eef 516 if (startswith (name, "__aeabi_read_tp"))
e0634ccf
UW
517 return 1;
518 }
519 else
520 {
521 /* If we run against a stripped glibc, we may be unable to identify
522 special functions by name. Check for one important case,
523 __aeabi_read_tp, by comparing the *code* against the default
524 implementation (this is hand-written ARM assembler in glibc). */
525
526 if (!is_thumb
527 && read_memory_unsigned_integer (pc, 4, byte_order_for_code)
528 == 0xe3e00a0f /* mov r0, #0xffff0fff */
529 && read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code)
530 == 0xe240f01f) /* sub pc, r0, #31 */
531 return 1;
532 }
ec3d575a 533
0d39a070
DJ
534 return 0;
535}
536
621c6d5b
YQ
537/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
538 the first 16-bit of instruction, and INSN2 is the second 16-bit of
539 instruction. */
540#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
541 ((bits ((insn1), 0, 3) << 12) \
542 | (bits ((insn1), 10, 10) << 11) \
543 | (bits ((insn2), 12, 14) << 8) \
544 | bits ((insn2), 0, 7))
545
546/* Extract the immediate from instruction movw/movt of encoding A. INSN is
547 the 32-bit instruction. */
548#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
549 ((bits ((insn), 16, 19) << 12) \
550 | bits ((insn), 0, 11))
551
ec3d575a
UW
552/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
553
554static unsigned int
555thumb_expand_immediate (unsigned int imm)
556{
557 unsigned int count = imm >> 7;
558
559 if (count < 8)
560 switch (count / 2)
561 {
562 case 0:
563 return imm & 0xff;
564 case 1:
565 return (imm & 0xff) | ((imm & 0xff) << 16);
566 case 2:
567 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
568 case 3:
569 return (imm & 0xff) | ((imm & 0xff) << 8)
570 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
571 }
572
573 return (0x80 | (imm & 0x7f)) << (32 - count);
574}
575
540314bd
YQ
576/* Return 1 if the 16-bit Thumb instruction INSN restores SP in
577 epilogue, 0 otherwise. */
578
579static int
580thumb_instruction_restores_sp (unsigned short insn)
581{
582 return (insn == 0x46bd /* mov sp, r7 */
583 || (insn & 0xff80) == 0xb000 /* add sp, imm */
584 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
585}
586
29d73ae4
DJ
587/* Analyze a Thumb prologue, looking for a recognizable stack frame
588 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
589 clobber the stack frame unexpectedly, or an unknown instruction.
590 Return the last address which is definitely safe to skip for an
591 initial breakpoint. */
c906108c
SS
592
593static CORE_ADDR
29d73ae4
DJ
594thumb_analyze_prologue (struct gdbarch *gdbarch,
595 CORE_ADDR start, CORE_ADDR limit,
596 struct arm_prologue_cache *cache)
c906108c 597{
0d39a070 598 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 599 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
600 int i;
601 pv_t regs[16];
602 struct pv_area *stack;
603 struct cleanup *back_to;
604 CORE_ADDR offset;
ec3d575a 605 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 606
29d73ae4
DJ
607 for (i = 0; i < 16; i++)
608 regs[i] = pv_register (i, 0);
55f960e1 609 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4
DJ
610 back_to = make_cleanup_free_pv_area (stack);
611
29d73ae4 612 while (start < limit)
c906108c 613 {
29d73ae4
DJ
614 unsigned short insn;
615
e17a4113 616 insn = read_memory_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 617
94c30b78 618 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 619 {
29d73ae4
DJ
620 int regno;
621 int mask;
4be43953
DJ
622
623 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
624 break;
29d73ae4
DJ
625
626 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
627 whether to save LR (R14). */
628 mask = (insn & 0xff) | ((insn & 0x100) << 6);
629
630 /* Calculate offsets of saved R0-R7 and LR. */
631 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
632 if (mask & (1 << regno))
633 {
29d73ae4
DJ
634 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
635 -4);
636 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
637 }
da59e081 638 }
1db01f22 639 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
da59e081 640 {
29d73ae4 641 offset = (insn & 0x7f) << 2; /* get scaled offset */
1db01f22
YQ
642 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
643 -offset);
da59e081 644 }
808f7ab1
YQ
645 else if (thumb_instruction_restores_sp (insn))
646 {
647 /* Don't scan past the epilogue. */
648 break;
649 }
0d39a070
DJ
650 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
651 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
652 (insn & 0xff) << 2);
653 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
654 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
655 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
656 bits (insn, 6, 8));
657 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
658 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
659 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
660 bits (insn, 0, 7));
661 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
662 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
663 && pv_is_constant (regs[bits (insn, 3, 5)]))
664 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
665 regs[bits (insn, 6, 8)]);
666 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
667 && pv_is_constant (regs[bits (insn, 3, 6)]))
668 {
669 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
670 int rm = bits (insn, 3, 6);
671 regs[rd] = pv_add (regs[rd], regs[rm]);
672 }
29d73ae4 673 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 674 {
29d73ae4
DJ
675 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
676 int src_reg = (insn & 0x78) >> 3;
677 regs[dst_reg] = regs[src_reg];
da59e081 678 }
29d73ae4 679 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 680 {
29d73ae4
DJ
681 /* Handle stores to the stack. Normally pushes are used,
682 but with GCC -mtpcs-frame, there may be other stores
683 in the prologue to create the frame. */
684 int regno = (insn >> 8) & 0x7;
685 pv_t addr;
686
687 offset = (insn & 0xff) << 2;
688 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
689
690 if (pv_area_store_would_trash (stack, addr))
691 break;
692
693 pv_area_store (stack, addr, 4, regs[regno]);
da59e081 694 }
0d39a070
DJ
695 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
696 {
697 int rd = bits (insn, 0, 2);
698 int rn = bits (insn, 3, 5);
699 pv_t addr;
700
701 offset = bits (insn, 6, 10) << 2;
702 addr = pv_add_constant (regs[rn], offset);
703
704 if (pv_area_store_would_trash (stack, addr))
705 break;
706
707 pv_area_store (stack, addr, 4, regs[rd]);
708 }
709 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
710 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
711 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
712 /* Ignore stores of argument registers to the stack. */
713 ;
714 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
715 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
716 /* Ignore block loads from the stack, potentially copying
717 parameters from memory. */
718 ;
719 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
720 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
721 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
722 /* Similarly ignore single loads from the stack. */
723 ;
724 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
725 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
726 /* Skip register copies, i.e. saves to another register
727 instead of the stack. */
728 ;
729 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
730 /* Recognize constant loads; even with small stacks these are necessary
731 on Thumb. */
732 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
733 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
734 {
735 /* Constant pool loads, for the same reason. */
736 unsigned int constant;
737 CORE_ADDR loc;
738
739 loc = start + 4 + bits (insn, 0, 7) * 4;
740 constant = read_memory_unsigned_integer (loc, 4, byte_order);
741 regs[bits (insn, 8, 10)] = pv_constant (constant);
742 }
db24da6d 743 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 744 {
0d39a070
DJ
745 unsigned short inst2;
746
747 inst2 = read_memory_unsigned_integer (start + 2, 2,
748 byte_order_for_code);
749
750 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
751 {
752 /* BL, BLX. Allow some special function calls when
753 skipping the prologue; GCC generates these before
754 storing arguments to the stack. */
755 CORE_ADDR nextpc;
756 int j1, j2, imm1, imm2;
757
758 imm1 = sbits (insn, 0, 10);
759 imm2 = bits (inst2, 0, 10);
760 j1 = bit (inst2, 13);
761 j2 = bit (inst2, 11);
762
763 offset = ((imm1 << 12) + (imm2 << 1));
764 offset ^= ((!j2) << 22) | ((!j1) << 23);
765
766 nextpc = start + 4 + offset;
767 /* For BLX make sure to clear the low bits. */
768 if (bit (inst2, 12) == 0)
769 nextpc = nextpc & 0xfffffffc;
770
e0634ccf
UW
771 if (!skip_prologue_function (gdbarch, nextpc,
772 bit (inst2, 12) != 0))
0d39a070
DJ
773 break;
774 }
ec3d575a 775
0963b4bd
MS
776 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
777 { registers } */
ec3d575a
UW
778 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
779 {
780 pv_t addr = regs[bits (insn, 0, 3)];
781 int regno;
782
783 if (pv_area_store_would_trash (stack, addr))
784 break;
785
786 /* Calculate offsets of saved registers. */
787 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
788 if (inst2 & (1 << regno))
789 {
790 addr = pv_add_constant (addr, -4);
791 pv_area_store (stack, addr, 4, regs[regno]);
792 }
793
794 if (insn & 0x0020)
795 regs[bits (insn, 0, 3)] = addr;
796 }
797
0963b4bd
MS
798 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
799 [Rn, #+/-imm]{!} */
ec3d575a
UW
800 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
801 {
802 int regno1 = bits (inst2, 12, 15);
803 int regno2 = bits (inst2, 8, 11);
804 pv_t addr = regs[bits (insn, 0, 3)];
805
806 offset = inst2 & 0xff;
807 if (insn & 0x0080)
808 addr = pv_add_constant (addr, offset);
809 else
810 addr = pv_add_constant (addr, -offset);
811
812 if (pv_area_store_would_trash (stack, addr))
813 break;
814
815 pv_area_store (stack, addr, 4, regs[regno1]);
816 pv_area_store (stack, pv_add_constant (addr, 4),
817 4, regs[regno2]);
818
819 if (insn & 0x0020)
820 regs[bits (insn, 0, 3)] = addr;
821 }
822
823 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
824 && (inst2 & 0x0c00) == 0x0c00
825 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
826 {
827 int regno = bits (inst2, 12, 15);
828 pv_t addr = regs[bits (insn, 0, 3)];
829
830 offset = inst2 & 0xff;
831 if (inst2 & 0x0200)
832 addr = pv_add_constant (addr, offset);
833 else
834 addr = pv_add_constant (addr, -offset);
835
836 if (pv_area_store_would_trash (stack, addr))
837 break;
838
839 pv_area_store (stack, addr, 4, regs[regno]);
840
841 if (inst2 & 0x0100)
842 regs[bits (insn, 0, 3)] = addr;
843 }
844
845 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
846 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
847 {
848 int regno = bits (inst2, 12, 15);
849 pv_t addr;
850
851 offset = inst2 & 0xfff;
852 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
853
854 if (pv_area_store_would_trash (stack, addr))
855 break;
856
857 pv_area_store (stack, addr, 4, regs[regno]);
858 }
859
860 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 861 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 862 /* Ignore stores of argument registers to the stack. */
0d39a070 863 ;
ec3d575a
UW
864
865 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
866 && (inst2 & 0x0d00) == 0x0c00
0d39a070 867 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 868 /* Ignore stores of argument registers to the stack. */
0d39a070 869 ;
ec3d575a 870
0963b4bd
MS
871 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
872 { registers } */
ec3d575a
UW
873 && (inst2 & 0x8000) == 0x0000
874 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
875 /* Ignore block loads from the stack, potentially copying
876 parameters from memory. */
0d39a070 877 ;
ec3d575a 878
0963b4bd
MS
879 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
880 [Rn, #+/-imm] */
0d39a070 881 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 882 /* Similarly ignore dual loads from the stack. */
0d39a070 883 ;
ec3d575a
UW
884
885 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
886 && (inst2 & 0x0d00) == 0x0c00
0d39a070 887 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 888 /* Similarly ignore single loads from the stack. */
0d39a070 889 ;
ec3d575a
UW
890
891 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
0d39a070 892 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 893 /* Similarly ignore single loads from the stack. */
0d39a070 894 ;
ec3d575a
UW
895
896 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
897 && (inst2 & 0x8000) == 0x0000)
898 {
899 unsigned int imm = ((bits (insn, 10, 10) << 11)
900 | (bits (inst2, 12, 14) << 8)
901 | bits (inst2, 0, 7));
902
903 regs[bits (inst2, 8, 11)]
904 = pv_add_constant (regs[bits (insn, 0, 3)],
905 thumb_expand_immediate (imm));
906 }
907
908 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
909 && (inst2 & 0x8000) == 0x0000)
0d39a070 910 {
ec3d575a
UW
911 unsigned int imm = ((bits (insn, 10, 10) << 11)
912 | (bits (inst2, 12, 14) << 8)
913 | bits (inst2, 0, 7));
914
915 regs[bits (inst2, 8, 11)]
916 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
917 }
918
919 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
920 && (inst2 & 0x8000) == 0x0000)
921 {
922 unsigned int imm = ((bits (insn, 10, 10) << 11)
923 | (bits (inst2, 12, 14) << 8)
924 | bits (inst2, 0, 7));
925
926 regs[bits (inst2, 8, 11)]
927 = pv_add_constant (regs[bits (insn, 0, 3)],
928 - (CORE_ADDR) thumb_expand_immediate (imm));
929 }
930
931 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
932 && (inst2 & 0x8000) == 0x0000)
933 {
934 unsigned int imm = ((bits (insn, 10, 10) << 11)
935 | (bits (inst2, 12, 14) << 8)
936 | bits (inst2, 0, 7));
937
938 regs[bits (inst2, 8, 11)]
939 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
940 }
941
942 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
943 {
944 unsigned int imm = ((bits (insn, 10, 10) << 11)
945 | (bits (inst2, 12, 14) << 8)
946 | bits (inst2, 0, 7));
947
948 regs[bits (inst2, 8, 11)]
949 = pv_constant (thumb_expand_immediate (imm));
950 }
951
952 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
953 {
621c6d5b
YQ
954 unsigned int imm
955 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
956
957 regs[bits (inst2, 8, 11)] = pv_constant (imm);
958 }
959
960 else if (insn == 0xea5f /* mov.w Rd,Rm */
961 && (inst2 & 0xf0f0) == 0)
962 {
963 int dst_reg = (inst2 & 0x0f00) >> 8;
964 int src_reg = inst2 & 0xf;
965 regs[dst_reg] = regs[src_reg];
966 }
967
968 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
969 {
970 /* Constant pool loads. */
971 unsigned int constant;
972 CORE_ADDR loc;
973
cac395ea 974 offset = bits (inst2, 0, 11);
ec3d575a
UW
975 if (insn & 0x0080)
976 loc = start + 4 + offset;
977 else
978 loc = start + 4 - offset;
979
980 constant = read_memory_unsigned_integer (loc, 4, byte_order);
981 regs[bits (inst2, 12, 15)] = pv_constant (constant);
982 }
983
984 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
985 {
986 /* Constant pool loads. */
987 unsigned int constant;
988 CORE_ADDR loc;
989
cac395ea 990 offset = bits (inst2, 0, 7) << 2;
ec3d575a
UW
991 if (insn & 0x0080)
992 loc = start + 4 + offset;
993 else
994 loc = start + 4 - offset;
995
996 constant = read_memory_unsigned_integer (loc, 4, byte_order);
997 regs[bits (inst2, 12, 15)] = pv_constant (constant);
998
999 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1000 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1001 }
1002
1003 else if (thumb2_instruction_changes_pc (insn, inst2))
1004 {
1005 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1006 break;
1007 }
ec3d575a
UW
1008 else
1009 {
1010 /* The optimizer might shove anything into the prologue,
1011 so we just skip what we don't recognize. */
1012 unrecognized_pc = start;
1013 }
0d39a070
DJ
1014
1015 start += 2;
1016 }
ec3d575a 1017 else if (thumb_instruction_changes_pc (insn))
3d74b771 1018 {
ec3d575a 1019 /* Don't scan past anything that might change control flow. */
da3c6d4a 1020 break;
3d74b771 1021 }
ec3d575a
UW
1022 else
1023 {
1024 /* The optimizer might shove anything into the prologue,
1025 so we just skip what we don't recognize. */
1026 unrecognized_pc = start;
1027 }
29d73ae4
DJ
1028
1029 start += 2;
c906108c
SS
1030 }
1031
0d39a070
DJ
1032 if (arm_debug)
1033 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1034 paddress (gdbarch, start));
1035
ec3d575a
UW
1036 if (unrecognized_pc == 0)
1037 unrecognized_pc = start;
1038
29d73ae4
DJ
1039 if (cache == NULL)
1040 {
1041 do_cleanups (back_to);
ec3d575a 1042 return unrecognized_pc;
29d73ae4
DJ
1043 }
1044
29d73ae4
DJ
1045 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1046 {
1047 /* Frame pointer is fp. Frame size is constant. */
1048 cache->framereg = ARM_FP_REGNUM;
1049 cache->framesize = -regs[ARM_FP_REGNUM].k;
1050 }
1051 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1052 {
1053 /* Frame pointer is r7. Frame size is constant. */
1054 cache->framereg = THUMB_FP_REGNUM;
1055 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1056 }
72a2e3dc 1057 else
29d73ae4
DJ
1058 {
1059 /* Try the stack pointer... this is a bit desperate. */
1060 cache->framereg = ARM_SP_REGNUM;
1061 cache->framesize = -regs[ARM_SP_REGNUM].k;
1062 }
29d73ae4
DJ
1063
1064 for (i = 0; i < 16; i++)
1065 if (pv_area_find_reg (stack, gdbarch, i, &offset))
1066 cache->saved_regs[i].addr = offset;
1067
1068 do_cleanups (back_to);
ec3d575a 1069 return unrecognized_pc;
c906108c
SS
1070}
1071
621c6d5b
YQ
1072
1073/* Try to analyze the instructions starting from PC, which load symbol
1074 __stack_chk_guard. Return the address of instruction after loading this
1075 symbol, set the dest register number to *BASEREG, and set the size of
1076 instructions for loading symbol in OFFSET. Return 0 if instructions are
1077 not recognized. */
1078
1079static CORE_ADDR
1080arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1081 unsigned int *destreg, int *offset)
1082{
1083 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1084 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1085 unsigned int low, high, address;
1086
1087 address = 0;
1088 if (is_thumb)
1089 {
1090 unsigned short insn1
1091 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
1092
1093 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1094 {
1095 *destreg = bits (insn1, 8, 10);
1096 *offset = 2;
6ae274b7
YQ
1097 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1098 address = read_memory_unsigned_integer (address, 4,
1099 byte_order_for_code);
621c6d5b
YQ
1100 }
1101 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1102 {
1103 unsigned short insn2
1104 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
1105
1106 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1107
1108 insn1
1109 = read_memory_unsigned_integer (pc + 4, 2, byte_order_for_code);
1110 insn2
1111 = read_memory_unsigned_integer (pc + 6, 2, byte_order_for_code);
1112
1113 /* movt Rd, #const */
1114 if ((insn1 & 0xfbc0) == 0xf2c0)
1115 {
1116 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1117 *destreg = bits (insn2, 8, 11);
1118 *offset = 8;
1119 address = (high << 16 | low);
1120 }
1121 }
1122 }
1123 else
1124 {
2e9e421f
UW
1125 unsigned int insn
1126 = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
1127
6ae274b7 1128 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
2e9e421f 1129 {
6ae274b7
YQ
1130 address = bits (insn, 0, 11) + pc + 8;
1131 address = read_memory_unsigned_integer (address, 4,
1132 byte_order_for_code);
1133
2e9e421f
UW
1134 *destreg = bits (insn, 12, 15);
1135 *offset = 4;
1136 }
1137 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1138 {
1139 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1140
1141 insn
1142 = read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code);
1143
1144 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1145 {
1146 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1147 *destreg = bits (insn, 12, 15);
1148 *offset = 8;
1149 address = (high << 16 | low);
1150 }
1151 }
621c6d5b
YQ
1152 }
1153
1154 return address;
1155}
1156
1157/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1158 points to the first instruction of this sequence, return the address of
1159 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1160
1161 On arm, this sequence of instructions is composed of mainly three steps,
1162 Step 1: load symbol __stack_chk_guard,
1163 Step 2: load from address of __stack_chk_guard,
1164 Step 3: store it to somewhere else.
1165
1166 Usually, instructions on step 2 and step 3 are the same on various ARM
1167 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1168 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1169 instructions in step 1 vary from different ARM architectures. On ARMv7,
1170 they are,
1171
1172 movw Rn, #:lower16:__stack_chk_guard
1173 movt Rn, #:upper16:__stack_chk_guard
1174
1175 On ARMv5t, it is,
1176
1177 ldr Rn, .Label
1178 ....
1179 .Lable:
1180 .word __stack_chk_guard
1181
1182 Since ldr/str is a very popular instruction, we can't use them as
1183 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1184 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1185 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1186
1187static CORE_ADDR
1188arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1189{
1190 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1191 unsigned int basereg;
7cbd4a93 1192 struct bound_minimal_symbol stack_chk_guard;
621c6d5b
YQ
1193 int offset;
1194 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1195 CORE_ADDR addr;
1196
1197 /* Try to parse the instructions in Step 1. */
1198 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1199 &basereg, &offset);
1200 if (!addr)
1201 return pc;
1202
1203 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
6041179a
JB
1204 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1205 Otherwise, this sequence cannot be for stack protector. */
1206 if (stack_chk_guard.minsym == NULL
61012eef 1207 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
621c6d5b
YQ
1208 return pc;
1209
1210 if (is_thumb)
1211 {
1212 unsigned int destreg;
1213 unsigned short insn
1214 = read_memory_unsigned_integer (pc + offset, 2, byte_order_for_code);
1215
1216 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1217 if ((insn & 0xf800) != 0x6800)
1218 return pc;
1219 if (bits (insn, 3, 5) != basereg)
1220 return pc;
1221 destreg = bits (insn, 0, 2);
1222
1223 insn = read_memory_unsigned_integer (pc + offset + 2, 2,
1224 byte_order_for_code);
1225 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1226 if ((insn & 0xf800) != 0x6000)
1227 return pc;
1228 if (destreg != bits (insn, 0, 2))
1229 return pc;
1230 }
1231 else
1232 {
1233 unsigned int destreg;
1234 unsigned int insn
1235 = read_memory_unsigned_integer (pc + offset, 4, byte_order_for_code);
1236
1237 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1238 if ((insn & 0x0e500000) != 0x04100000)
1239 return pc;
1240 if (bits (insn, 16, 19) != basereg)
1241 return pc;
1242 destreg = bits (insn, 12, 15);
1243 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1244 insn = read_memory_unsigned_integer (pc + offset + 4,
1245 4, byte_order_for_code);
1246 if ((insn & 0x0e500000) != 0x04000000)
1247 return pc;
1248 if (bits (insn, 12, 15) != destreg)
1249 return pc;
1250 }
1251 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1252 on arm. */
1253 if (is_thumb)
1254 return pc + offset + 4;
1255 else
1256 return pc + offset + 8;
1257}
1258
da3c6d4a
MS
1259/* Advance the PC across any function entry prologue instructions to
1260 reach some "real" code.
34e8f22d
RE
1261
1262 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1263 prologue:
c906108c 1264
c5aa993b
JM
1265 mov ip, sp
1266 [stmfd sp!, {a1,a2,a3,a4}]
1267 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1268 [stfe f7, [sp, #-12]!]
1269 [stfe f6, [sp, #-12]!]
1270 [stfe f5, [sp, #-12]!]
1271 [stfe f4, [sp, #-12]!]
0963b4bd 1272 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1273
34e8f22d 1274static CORE_ADDR
6093d2eb 1275arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1276{
e17a4113 1277 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c 1278 unsigned long inst;
a89fea3c 1279 CORE_ADDR func_addr, limit_pc;
c906108c 1280
a89fea3c
JL
1281 /* See if we can determine the end of the prologue via the symbol table.
1282 If so, then return either PC, or the PC after the prologue, whichever
1283 is greater. */
1284 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1285 {
d80b854b
UW
1286 CORE_ADDR post_prologue_pc
1287 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1288 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1289
621c6d5b
YQ
1290 if (post_prologue_pc)
1291 post_prologue_pc
1292 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1293
1294
0d39a070
DJ
1295 /* GCC always emits a line note before the prologue and another
1296 one after, even if the two are at the same address or on the
1297 same line. Take advantage of this so that we do not need to
1298 know every instruction that might appear in the prologue. We
1299 will have producer information for most binaries; if it is
1300 missing (e.g. for -gstabs), assuming the GNU tools. */
1301 if (post_prologue_pc
43f3e411
DE
1302 && (cust == NULL
1303 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1304 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1305 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1306 return post_prologue_pc;
1307
a89fea3c 1308 if (post_prologue_pc != 0)
0d39a070
DJ
1309 {
1310 CORE_ADDR analyzed_limit;
1311
1312 /* For non-GCC compilers, make sure the entire line is an
1313 acceptable prologue; GDB will round this function's
1314 return value up to the end of the following line so we
1315 can not skip just part of a line (and we do not want to).
1316
1317 RealView does not treat the prologue specially, but does
1318 associate prologue code with the opening brace; so this
1319 lets us skip the first line if we think it is the opening
1320 brace. */
9779414d 1321 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1322 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1323 post_prologue_pc, NULL);
1324 else
1325 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1326 post_prologue_pc, NULL);
1327
1328 if (analyzed_limit != post_prologue_pc)
1329 return func_addr;
1330
1331 return post_prologue_pc;
1332 }
c906108c
SS
1333 }
1334
a89fea3c
JL
1335 /* Can't determine prologue from the symbol table, need to examine
1336 instructions. */
c906108c 1337
a89fea3c
JL
1338 /* Find an upper limit on the function prologue using the debug
1339 information. If the debug information could not be used to provide
1340 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1341 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1342 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1343 if (limit_pc == 0)
1344 limit_pc = pc + 64; /* Magic. */
1345
c906108c 1346
29d73ae4 1347 /* Check if this is Thumb code. */
9779414d 1348 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1349 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1350 else
1351 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1352}
94c30b78 1353
c5aa993b 1354/* *INDENT-OFF* */
c906108c
SS
1355/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1356 This function decodes a Thumb function prologue to determine:
1357 1) the size of the stack frame
1358 2) which registers are saved on it
1359 3) the offsets of saved regs
1360 4) the offset from the stack pointer to the frame pointer
c906108c 1361
da59e081
JM
1362 A typical Thumb function prologue would create this stack frame
1363 (offsets relative to FP)
c906108c
SS
1364 old SP -> 24 stack parameters
1365 20 LR
1366 16 R7
1367 R7 -> 0 local variables (16 bytes)
1368 SP -> -12 additional stack space (12 bytes)
1369 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1370 12 bytes. The frame register is R7.
da59e081 1371
da3c6d4a
MS
1372 The comments for thumb_skip_prolog() describe the algorithm we use
1373 to detect the end of the prolog. */
c5aa993b
JM
1374/* *INDENT-ON* */
1375
c906108c 1376static void
be8626e0 1377thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1378 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1379{
1380 CORE_ADDR prologue_start;
1381 CORE_ADDR prologue_end;
c906108c 1382
b39cc962
DJ
1383 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1384 &prologue_end))
c906108c 1385 {
ec3d575a
UW
1386 /* See comment in arm_scan_prologue for an explanation of
1387 this heuristics. */
1388 if (prologue_end > prologue_start + 64)
1389 {
1390 prologue_end = prologue_start + 64;
1391 }
c906108c
SS
1392 }
1393 else
f7060f85
DJ
1394 /* We're in the boondocks: we have no idea where the start of the
1395 function is. */
1396 return;
c906108c 1397
eb5492fa 1398 prologue_end = min (prologue_end, prev_pc);
c906108c 1399
be8626e0 1400 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1401}
1402
f303bc3e
YQ
1403/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1404 otherwise. */
1405
1406static int
1407arm_instruction_restores_sp (unsigned int insn)
1408{
1409 if (bits (insn, 28, 31) != INST_NV)
1410 {
1411 if ((insn & 0x0df0f000) == 0x0080d000
1412 /* ADD SP (register or immediate). */
1413 || (insn & 0x0df0f000) == 0x0040d000
1414 /* SUB SP (register or immediate). */
1415 || (insn & 0x0ffffff0) == 0x01a0d000
1416 /* MOV SP. */
1417 || (insn & 0x0fff0000) == 0x08bd0000
1418 /* POP (LDMIA). */
1419 || (insn & 0x0fff0000) == 0x049d0000)
1420 /* POP of a single register. */
1421 return 1;
1422 }
1423
1424 return 0;
1425}
1426
0d39a070
DJ
1427/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1428 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1429 fill it in. Return the first address not recognized as a prologue
1430 instruction.
eb5492fa 1431
0d39a070
DJ
1432 We recognize all the instructions typically found in ARM prologues,
1433 plus harmless instructions which can be skipped (either for analysis
1434 purposes, or a more restrictive set that can be skipped when finding
1435 the end of the prologue). */
1436
1437static CORE_ADDR
1438arm_analyze_prologue (struct gdbarch *gdbarch,
1439 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1440 struct arm_prologue_cache *cache)
1441{
1442 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1443 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1444 int regno;
1445 CORE_ADDR offset, current_pc;
1446 pv_t regs[ARM_FPS_REGNUM];
1447 struct pv_area *stack;
1448 struct cleanup *back_to;
0d39a070
DJ
1449 CORE_ADDR unrecognized_pc = 0;
1450
1451 /* Search the prologue looking for instructions that set up the
96baa820 1452 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1453
96baa820
JM
1454 Be careful, however, and if it doesn't look like a prologue,
1455 don't try to scan it. If, for instance, a frameless function
1456 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1457 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1458 and other operations that rely on a knowledge of the stack
0d39a070 1459 traceback. */
d4473757 1460
4be43953
DJ
1461 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1462 regs[regno] = pv_register (regno, 0);
55f960e1 1463 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953
DJ
1464 back_to = make_cleanup_free_pv_area (stack);
1465
94c30b78
MS
1466 for (current_pc = prologue_start;
1467 current_pc < prologue_end;
f43845b3 1468 current_pc += 4)
96baa820 1469 {
e17a4113
UW
1470 unsigned int insn
1471 = read_memory_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1472
94c30b78 1473 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1474 {
4be43953 1475 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1476 continue;
1477 }
0d39a070
DJ
1478 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1479 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1480 {
1481 unsigned imm = insn & 0xff; /* immediate value */
1482 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1483 int rd = bits (insn, 12, 15);
28cd8767 1484 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1485 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1486 continue;
1487 }
0d39a070
DJ
1488 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1489 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1490 {
1491 unsigned imm = insn & 0xff; /* immediate value */
1492 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1493 int rd = bits (insn, 12, 15);
28cd8767 1494 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1495 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1496 continue;
1497 }
0963b4bd
MS
1498 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1499 [sp, #-4]! */
f43845b3 1500 {
4be43953
DJ
1501 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1502 break;
1503 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
0d39a070
DJ
1504 pv_area_store (stack, regs[ARM_SP_REGNUM], 4,
1505 regs[bits (insn, 12, 15)]);
f43845b3
MS
1506 continue;
1507 }
1508 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1509 /* stmfd sp!, {..., fp, ip, lr, pc}
1510 or
1511 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1512 {
d4473757 1513 int mask = insn & 0xffff;
ed9a39eb 1514
4be43953
DJ
1515 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1516 break;
1517
94c30b78 1518 /* Calculate offsets of saved registers. */
34e8f22d 1519 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1520 if (mask & (1 << regno))
1521 {
0963b4bd
MS
1522 regs[ARM_SP_REGNUM]
1523 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
4be43953 1524 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1525 }
1526 }
0d39a070
DJ
1527 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1528 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1529 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1530 {
1531 /* No need to add this to saved_regs -- it's just an arg reg. */
1532 continue;
1533 }
0d39a070
DJ
1534 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1535 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1536 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1537 {
1538 /* No need to add this to saved_regs -- it's just an arg reg. */
1539 continue;
1540 }
0963b4bd
MS
1541 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1542 { registers } */
0d39a070
DJ
1543 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1544 {
1545 /* No need to add this to saved_regs -- it's just arg regs. */
1546 continue;
1547 }
d4473757
KB
1548 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1549 {
94c30b78
MS
1550 unsigned imm = insn & 0xff; /* immediate value */
1551 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1552 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1553 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1554 }
1555 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1556 {
94c30b78
MS
1557 unsigned imm = insn & 0xff; /* immediate value */
1558 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1559 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1560 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1561 }
0963b4bd
MS
1562 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1563 [sp, -#c]! */
2af46ca0 1564 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1565 {
4be43953
DJ
1566 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1567 break;
1568
1569 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1570 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
4be43953 1571 pv_area_store (stack, regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1572 }
0963b4bd
MS
1573 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1574 [sp!] */
2af46ca0 1575 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1576 {
1577 int n_saved_fp_regs;
1578 unsigned int fp_start_reg, fp_bound_reg;
1579
4be43953
DJ
1580 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1581 break;
1582
94c30b78 1583 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1584 {
d4473757
KB
1585 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1586 n_saved_fp_regs = 3;
1587 else
1588 n_saved_fp_regs = 1;
96baa820 1589 }
d4473757 1590 else
96baa820 1591 {
d4473757
KB
1592 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1593 n_saved_fp_regs = 2;
1594 else
1595 n_saved_fp_regs = 4;
96baa820 1596 }
d4473757 1597
34e8f22d 1598 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1599 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1600 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1601 {
4be43953
DJ
1602 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1603 pv_area_store (stack, regs[ARM_SP_REGNUM], 12,
1604 regs[fp_start_reg++]);
96baa820 1605 }
c906108c 1606 }
0d39a070
DJ
1607 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1608 {
1609 /* Allow some special function calls when skipping the
1610 prologue; GCC generates these before storing arguments to
1611 the stack. */
1612 CORE_ADDR dest = BranchDest (current_pc, insn);
1613
e0634ccf 1614 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1615 continue;
1616 else
1617 break;
1618 }
d4473757 1619 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1620 break; /* Condition not true, exit early. */
0d39a070
DJ
1621 else if (arm_instruction_changes_pc (insn))
1622 /* Don't scan past anything that might change control flow. */
1623 break;
f303bc3e
YQ
1624 else if (arm_instruction_restores_sp (insn))
1625 {
1626 /* Don't scan past the epilogue. */
1627 break;
1628 }
d19f7eee
UW
1629 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1630 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1631 /* Ignore block loads from the stack, potentially copying
1632 parameters from memory. */
1633 continue;
1634 else if ((insn & 0xfc500000) == 0xe4100000
1635 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1636 /* Similarly ignore single loads from the stack. */
1637 continue;
0d39a070
DJ
1638 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1639 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1640 register instead of the stack. */
d4473757 1641 continue;
0d39a070
DJ
1642 else
1643 {
21daaaaf
YQ
1644 /* The optimizer might shove anything into the prologue, if
1645 we build up cache (cache != NULL) from scanning prologue,
1646 we just skip what we don't recognize and scan further to
1647 make cache as complete as possible. However, if we skip
1648 prologue, we'll stop immediately on unrecognized
1649 instruction. */
0d39a070 1650 unrecognized_pc = current_pc;
21daaaaf
YQ
1651 if (cache != NULL)
1652 continue;
1653 else
1654 break;
0d39a070 1655 }
c906108c
SS
1656 }
1657
0d39a070
DJ
1658 if (unrecognized_pc == 0)
1659 unrecognized_pc = current_pc;
1660
0d39a070
DJ
1661 if (cache)
1662 {
4072f920
YQ
1663 int framereg, framesize;
1664
1665 /* The frame size is just the distance from the frame register
1666 to the original stack pointer. */
1667 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1668 {
1669 /* Frame pointer is fp. */
1670 framereg = ARM_FP_REGNUM;
1671 framesize = -regs[ARM_FP_REGNUM].k;
1672 }
1673 else
1674 {
1675 /* Try the stack pointer... this is a bit desperate. */
1676 framereg = ARM_SP_REGNUM;
1677 framesize = -regs[ARM_SP_REGNUM].k;
1678 }
1679
0d39a070
DJ
1680 cache->framereg = framereg;
1681 cache->framesize = framesize;
1682
1683 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1684 if (pv_area_find_reg (stack, gdbarch, regno, &offset))
1685 cache->saved_regs[regno].addr = offset;
1686 }
1687
1688 if (arm_debug)
1689 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1690 paddress (gdbarch, unrecognized_pc));
4be43953
DJ
1691
1692 do_cleanups (back_to);
0d39a070
DJ
1693 return unrecognized_pc;
1694}
1695
1696static void
1697arm_scan_prologue (struct frame_info *this_frame,
1698 struct arm_prologue_cache *cache)
1699{
1700 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1701 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1702 int regno;
1703 CORE_ADDR prologue_start, prologue_end, current_pc;
1704 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1705 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
1706 pv_t regs[ARM_FPS_REGNUM];
1707 struct pv_area *stack;
1708 struct cleanup *back_to;
1709 CORE_ADDR offset;
1710
1711 /* Assume there is no frame until proven otherwise. */
1712 cache->framereg = ARM_SP_REGNUM;
1713 cache->framesize = 0;
1714
1715 /* Check for Thumb prologue. */
1716 if (arm_frame_is_thumb (this_frame))
1717 {
1718 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1719 return;
1720 }
1721
1722 /* Find the function prologue. If we can't find the function in
1723 the symbol table, peek in the stack frame to find the PC. */
1724 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1725 &prologue_end))
1726 {
1727 /* One way to find the end of the prologue (which works well
1728 for unoptimized code) is to do the following:
1729
1730 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1731
1732 if (sal.line == 0)
1733 prologue_end = prev_pc;
1734 else if (sal.end < prologue_end)
1735 prologue_end = sal.end;
1736
1737 This mechanism is very accurate so long as the optimizer
1738 doesn't move any instructions from the function body into the
1739 prologue. If this happens, sal.end will be the last
1740 instruction in the first hunk of prologue code just before
1741 the first instruction that the scheduler has moved from
1742 the body to the prologue.
1743
1744 In order to make sure that we scan all of the prologue
1745 instructions, we use a slightly less accurate mechanism which
1746 may scan more than necessary. To help compensate for this
1747 lack of accuracy, the prologue scanning loop below contains
1748 several clauses which'll cause the loop to terminate early if
1749 an implausible prologue instruction is encountered.
1750
1751 The expression
1752
1753 prologue_start + 64
1754
1755 is a suitable endpoint since it accounts for the largest
1756 possible prologue plus up to five instructions inserted by
1757 the scheduler. */
1758
1759 if (prologue_end > prologue_start + 64)
1760 {
1761 prologue_end = prologue_start + 64; /* See above. */
1762 }
1763 }
1764 else
1765 {
1766 /* We have no symbol information. Our only option is to assume this
1767 function has a standard stack frame and the normal frame register.
1768 Then, we can find the value of our frame pointer on entrance to
1769 the callee (or at the present moment if this is the innermost frame).
1770 The value stored there should be the address of the stmfd + 8. */
1771 CORE_ADDR frame_loc;
1772 LONGEST return_value;
1773
1774 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1775 if (!safe_read_memory_integer (frame_loc, 4, byte_order, &return_value))
1776 return;
1777 else
1778 {
1779 prologue_start = gdbarch_addr_bits_remove
1780 (gdbarch, return_value) - 8;
1781 prologue_end = prologue_start + 64; /* See above. */
1782 }
1783 }
1784
1785 if (prev_pc < prologue_end)
1786 prologue_end = prev_pc;
1787
1788 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1789}
1790
eb5492fa 1791static struct arm_prologue_cache *
a262aec2 1792arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1793{
eb5492fa
DJ
1794 int reg;
1795 struct arm_prologue_cache *cache;
1796 CORE_ADDR unwound_fp;
c5aa993b 1797
35d5d4ee 1798 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1799 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1800
a262aec2 1801 arm_scan_prologue (this_frame, cache);
848cfffb 1802
a262aec2 1803 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
1804 if (unwound_fp == 0)
1805 return cache;
c906108c 1806
4be43953 1807 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 1808
eb5492fa
DJ
1809 /* Calculate actual addresses of saved registers using offsets
1810 determined by arm_scan_prologue. */
a262aec2 1811 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 1812 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
1813 cache->saved_regs[reg].addr += cache->prev_sp;
1814
1815 return cache;
c906108c
SS
1816}
1817
c1ee9414
LM
1818/* Implementation of the stop_reason hook for arm_prologue frames. */
1819
1820static enum unwind_stop_reason
1821arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1822 void **this_cache)
1823{
1824 struct arm_prologue_cache *cache;
1825 CORE_ADDR pc;
1826
1827 if (*this_cache == NULL)
1828 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1829 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
1830
1831 /* This is meant to halt the backtrace at "_start". */
1832 pc = get_frame_pc (this_frame);
1833 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1834 return UNWIND_OUTERMOST;
1835
1836 /* If we've hit a wall, stop. */
1837 if (cache->prev_sp == 0)
1838 return UNWIND_OUTERMOST;
1839
1840 return UNWIND_NO_REASON;
1841}
1842
eb5492fa
DJ
1843/* Our frame ID for a normal frame is the current function's starting PC
1844 and the caller's SP when we were called. */
c906108c 1845
148754e5 1846static void
a262aec2 1847arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
1848 void **this_cache,
1849 struct frame_id *this_id)
c906108c 1850{
eb5492fa
DJ
1851 struct arm_prologue_cache *cache;
1852 struct frame_id id;
2c404490 1853 CORE_ADDR pc, func;
f079148d 1854
eb5492fa 1855 if (*this_cache == NULL)
a262aec2 1856 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1857 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 1858
0e9e9abd
UW
1859 /* Use function start address as part of the frame ID. If we cannot
1860 identify the start address (due to missing symbol information),
1861 fall back to just using the current PC. */
c1ee9414 1862 pc = get_frame_pc (this_frame);
2c404490 1863 func = get_frame_func (this_frame);
0e9e9abd
UW
1864 if (!func)
1865 func = pc;
1866
eb5492fa 1867 id = frame_id_build (cache->prev_sp, func);
eb5492fa 1868 *this_id = id;
c906108c
SS
1869}
1870
a262aec2
DJ
1871static struct value *
1872arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 1873 void **this_cache,
a262aec2 1874 int prev_regnum)
24de872b 1875{
24568a2c 1876 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
1877 struct arm_prologue_cache *cache;
1878
eb5492fa 1879 if (*this_cache == NULL)
a262aec2 1880 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1881 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 1882
eb5492fa 1883 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
1884 instead. The prologue may save PC, but it will point into this
1885 frame's prologue, not the next frame's resume location. Also
1886 strip the saved T bit. A valid LR may have the low bit set, but
1887 a valid PC never does. */
eb5492fa 1888 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
1889 {
1890 CORE_ADDR lr;
1891
1892 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1893 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 1894 arm_addr_bits_remove (gdbarch, lr));
b39cc962 1895 }
24de872b 1896
eb5492fa 1897 /* SP is generally not saved to the stack, but this frame is
a262aec2 1898 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
1899 The value was already reconstructed into PREV_SP. */
1900 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 1901 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 1902
b39cc962
DJ
1903 /* The CPSR may have been changed by the call instruction and by the
1904 called function. The only bit we can reconstruct is the T bit,
1905 by checking the low bit of LR as of the call. This is a reliable
1906 indicator of Thumb-ness except for some ARM v4T pre-interworking
1907 Thumb code, which could get away with a clear low bit as long as
1908 the called function did not use bx. Guess that all other
1909 bits are unchanged; the condition flags are presumably lost,
1910 but the processor status is likely valid. */
1911 if (prev_regnum == ARM_PS_REGNUM)
1912 {
1913 CORE_ADDR lr, cpsr;
9779414d 1914 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
1915
1916 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1917 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1918 if (IS_THUMB_ADDR (lr))
9779414d 1919 cpsr |= t_bit;
b39cc962 1920 else
9779414d 1921 cpsr &= ~t_bit;
b39cc962
DJ
1922 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1923 }
1924
a262aec2
DJ
1925 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1926 prev_regnum);
eb5492fa
DJ
1927}
1928
1929struct frame_unwind arm_prologue_unwind = {
1930 NORMAL_FRAME,
c1ee9414 1931 arm_prologue_unwind_stop_reason,
eb5492fa 1932 arm_prologue_this_id,
a262aec2
DJ
1933 arm_prologue_prev_register,
1934 NULL,
1935 default_frame_sniffer
eb5492fa
DJ
1936};
1937
0e9e9abd
UW
1938/* Maintain a list of ARM exception table entries per objfile, similar to the
1939 list of mapping symbols. We only cache entries for standard ARM-defined
1940 personality routines; the cache will contain only the frame unwinding
1941 instructions associated with the entry (not the descriptors). */
1942
1943static const struct objfile_data *arm_exidx_data_key;
1944
1945struct arm_exidx_entry
1946{
1947 bfd_vma addr;
1948 gdb_byte *entry;
1949};
1950typedef struct arm_exidx_entry arm_exidx_entry_s;
1951DEF_VEC_O(arm_exidx_entry_s);
1952
1953struct arm_exidx_data
1954{
1955 VEC(arm_exidx_entry_s) **section_maps;
1956};
1957
1958static void
1959arm_exidx_data_free (struct objfile *objfile, void *arg)
1960{
9a3c8263 1961 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
0e9e9abd
UW
1962 unsigned int i;
1963
1964 for (i = 0; i < objfile->obfd->section_count; i++)
1965 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
1966}
1967
1968static inline int
1969arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
1970 const struct arm_exidx_entry *rhs)
1971{
1972 return lhs->addr < rhs->addr;
1973}
1974
1975static struct obj_section *
1976arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
1977{
1978 struct obj_section *osect;
1979
1980 ALL_OBJFILE_OSECTIONS (objfile, osect)
1981 if (bfd_get_section_flags (objfile->obfd,
1982 osect->the_bfd_section) & SEC_ALLOC)
1983 {
1984 bfd_vma start, size;
1985 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
1986 size = bfd_get_section_size (osect->the_bfd_section);
1987
1988 if (start <= vma && vma < start + size)
1989 return osect;
1990 }
1991
1992 return NULL;
1993}
1994
1995/* Parse contents of exception table and exception index sections
1996 of OBJFILE, and fill in the exception table entry cache.
1997
1998 For each entry that refers to a standard ARM-defined personality
1999 routine, extract the frame unwinding instructions (from either
2000 the index or the table section). The unwinding instructions
2001 are normalized by:
2002 - extracting them from the rest of the table data
2003 - converting to host endianness
2004 - appending the implicit 0xb0 ("Finish") code
2005
2006 The extracted and normalized instructions are stored for later
2007 retrieval by the arm_find_exidx_entry routine. */
2008
2009static void
2010arm_exidx_new_objfile (struct objfile *objfile)
2011{
3bb47e8b 2012 struct cleanup *cleanups;
0e9e9abd
UW
2013 struct arm_exidx_data *data;
2014 asection *exidx, *extab;
2015 bfd_vma exidx_vma = 0, extab_vma = 0;
2016 bfd_size_type exidx_size = 0, extab_size = 0;
2017 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2018 LONGEST i;
2019
2020 /* If we've already touched this file, do nothing. */
2021 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2022 return;
3bb47e8b 2023 cleanups = make_cleanup (null_cleanup, NULL);
0e9e9abd
UW
2024
2025 /* Read contents of exception table and index. */
a5eda10c 2026 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
0e9e9abd
UW
2027 if (exidx)
2028 {
2029 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2030 exidx_size = bfd_get_section_size (exidx);
224c3ddb 2031 exidx_data = (gdb_byte *) xmalloc (exidx_size);
0e9e9abd
UW
2032 make_cleanup (xfree, exidx_data);
2033
2034 if (!bfd_get_section_contents (objfile->obfd, exidx,
2035 exidx_data, 0, exidx_size))
2036 {
2037 do_cleanups (cleanups);
2038 return;
2039 }
2040 }
2041
2042 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2043 if (extab)
2044 {
2045 extab_vma = bfd_section_vma (objfile->obfd, extab);
2046 extab_size = bfd_get_section_size (extab);
224c3ddb 2047 extab_data = (gdb_byte *) xmalloc (extab_size);
0e9e9abd
UW
2048 make_cleanup (xfree, extab_data);
2049
2050 if (!bfd_get_section_contents (objfile->obfd, extab,
2051 extab_data, 0, extab_size))
2052 {
2053 do_cleanups (cleanups);
2054 return;
2055 }
2056 }
2057
2058 /* Allocate exception table data structure. */
2059 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2060 set_objfile_data (objfile, arm_exidx_data_key, data);
2061 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2062 objfile->obfd->section_count,
2063 VEC(arm_exidx_entry_s) *);
2064
2065 /* Fill in exception table. */
2066 for (i = 0; i < exidx_size / 8; i++)
2067 {
2068 struct arm_exidx_entry new_exidx_entry;
2069 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2070 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2071 bfd_vma addr = 0, word = 0;
2072 int n_bytes = 0, n_words = 0;
2073 struct obj_section *sec;
2074 gdb_byte *entry = NULL;
2075
2076 /* Extract address of start of function. */
2077 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2078 idx += exidx_vma + i * 8;
2079
2080 /* Find section containing function and compute section offset. */
2081 sec = arm_obj_section_from_vma (objfile, idx);
2082 if (sec == NULL)
2083 continue;
2084 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2085
2086 /* Determine address of exception table entry. */
2087 if (val == 1)
2088 {
2089 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2090 }
2091 else if ((val & 0xff000000) == 0x80000000)
2092 {
2093 /* Exception table entry embedded in .ARM.exidx
2094 -- must be short form. */
2095 word = val;
2096 n_bytes = 3;
2097 }
2098 else if (!(val & 0x80000000))
2099 {
2100 /* Exception table entry in .ARM.extab. */
2101 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2102 addr += exidx_vma + i * 8 + 4;
2103
2104 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2105 {
2106 word = bfd_h_get_32 (objfile->obfd,
2107 extab_data + addr - extab_vma);
2108 addr += 4;
2109
2110 if ((word & 0xff000000) == 0x80000000)
2111 {
2112 /* Short form. */
2113 n_bytes = 3;
2114 }
2115 else if ((word & 0xff000000) == 0x81000000
2116 || (word & 0xff000000) == 0x82000000)
2117 {
2118 /* Long form. */
2119 n_bytes = 2;
2120 n_words = ((word >> 16) & 0xff);
2121 }
2122 else if (!(word & 0x80000000))
2123 {
2124 bfd_vma pers;
2125 struct obj_section *pers_sec;
2126 int gnu_personality = 0;
2127
2128 /* Custom personality routine. */
2129 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2130 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2131
2132 /* Check whether we've got one of the variants of the
2133 GNU personality routines. */
2134 pers_sec = arm_obj_section_from_vma (objfile, pers);
2135 if (pers_sec)
2136 {
2137 static const char *personality[] =
2138 {
2139 "__gcc_personality_v0",
2140 "__gxx_personality_v0",
2141 "__gcj_personality_v0",
2142 "__gnu_objc_personality_v0",
2143 NULL
2144 };
2145
2146 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2147 int k;
2148
2149 for (k = 0; personality[k]; k++)
2150 if (lookup_minimal_symbol_by_pc_name
2151 (pc, personality[k], objfile))
2152 {
2153 gnu_personality = 1;
2154 break;
2155 }
2156 }
2157
2158 /* If so, the next word contains a word count in the high
2159 byte, followed by the same unwind instructions as the
2160 pre-defined forms. */
2161 if (gnu_personality
2162 && addr + 4 <= extab_vma + extab_size)
2163 {
2164 word = bfd_h_get_32 (objfile->obfd,
2165 extab_data + addr - extab_vma);
2166 addr += 4;
2167 n_bytes = 3;
2168 n_words = ((word >> 24) & 0xff);
2169 }
2170 }
2171 }
2172 }
2173
2174 /* Sanity check address. */
2175 if (n_words)
2176 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2177 n_words = n_bytes = 0;
2178
2179 /* The unwind instructions reside in WORD (only the N_BYTES least
2180 significant bytes are valid), followed by N_WORDS words in the
2181 extab section starting at ADDR. */
2182 if (n_bytes || n_words)
2183 {
224c3ddb
SM
2184 gdb_byte *p = entry
2185 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2186 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2187
2188 while (n_bytes--)
2189 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2190
2191 while (n_words--)
2192 {
2193 word = bfd_h_get_32 (objfile->obfd,
2194 extab_data + addr - extab_vma);
2195 addr += 4;
2196
2197 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2198 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2199 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2200 *p++ = (gdb_byte) (word & 0xff);
2201 }
2202
2203 /* Implied "Finish" to terminate the list. */
2204 *p++ = 0xb0;
2205 }
2206
2207 /* Push entry onto vector. They are guaranteed to always
2208 appear in order of increasing addresses. */
2209 new_exidx_entry.addr = idx;
2210 new_exidx_entry.entry = entry;
2211 VEC_safe_push (arm_exidx_entry_s,
2212 data->section_maps[sec->the_bfd_section->index],
2213 &new_exidx_entry);
2214 }
2215
2216 do_cleanups (cleanups);
2217}
2218
2219/* Search for the exception table entry covering MEMADDR. If one is found,
2220 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2221 set *START to the start of the region covered by this entry. */
2222
2223static gdb_byte *
2224arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2225{
2226 struct obj_section *sec;
2227
2228 sec = find_pc_section (memaddr);
2229 if (sec != NULL)
2230 {
2231 struct arm_exidx_data *data;
2232 VEC(arm_exidx_entry_s) *map;
2233 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2234 unsigned int idx;
2235
9a3c8263
SM
2236 data = ((struct arm_exidx_data *)
2237 objfile_data (sec->objfile, arm_exidx_data_key));
0e9e9abd
UW
2238 if (data != NULL)
2239 {
2240 map = data->section_maps[sec->the_bfd_section->index];
2241 if (!VEC_empty (arm_exidx_entry_s, map))
2242 {
2243 struct arm_exidx_entry *map_sym;
2244
2245 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2246 arm_compare_exidx_entries);
2247
2248 /* VEC_lower_bound finds the earliest ordered insertion
2249 point. If the following symbol starts at this exact
2250 address, we use that; otherwise, the preceding
2251 exception table entry covers this address. */
2252 if (idx < VEC_length (arm_exidx_entry_s, map))
2253 {
2254 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2255 if (map_sym->addr == map_key.addr)
2256 {
2257 if (start)
2258 *start = map_sym->addr + obj_section_addr (sec);
2259 return map_sym->entry;
2260 }
2261 }
2262
2263 if (idx > 0)
2264 {
2265 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2266 if (start)
2267 *start = map_sym->addr + obj_section_addr (sec);
2268 return map_sym->entry;
2269 }
2270 }
2271 }
2272 }
2273
2274 return NULL;
2275}
2276
2277/* Given the current frame THIS_FRAME, and its associated frame unwinding
2278 instruction list from the ARM exception table entry ENTRY, allocate and
2279 return a prologue cache structure describing how to unwind this frame.
2280
2281 Return NULL if the unwinding instruction list contains a "spare",
2282 "reserved" or "refuse to unwind" instruction as defined in section
2283 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2284 for the ARM Architecture" document. */
2285
2286static struct arm_prologue_cache *
2287arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2288{
2289 CORE_ADDR vsp = 0;
2290 int vsp_valid = 0;
2291
2292 struct arm_prologue_cache *cache;
2293 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2294 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2295
2296 for (;;)
2297 {
2298 gdb_byte insn;
2299
2300 /* Whenever we reload SP, we actually have to retrieve its
2301 actual value in the current frame. */
2302 if (!vsp_valid)
2303 {
2304 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2305 {
2306 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2307 vsp = get_frame_register_unsigned (this_frame, reg);
2308 }
2309 else
2310 {
2311 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2312 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2313 }
2314
2315 vsp_valid = 1;
2316 }
2317
2318 /* Decode next unwind instruction. */
2319 insn = *entry++;
2320
2321 if ((insn & 0xc0) == 0)
2322 {
2323 int offset = insn & 0x3f;
2324 vsp += (offset << 2) + 4;
2325 }
2326 else if ((insn & 0xc0) == 0x40)
2327 {
2328 int offset = insn & 0x3f;
2329 vsp -= (offset << 2) + 4;
2330 }
2331 else if ((insn & 0xf0) == 0x80)
2332 {
2333 int mask = ((insn & 0xf) << 8) | *entry++;
2334 int i;
2335
2336 /* The special case of an all-zero mask identifies
2337 "Refuse to unwind". We return NULL to fall back
2338 to the prologue analyzer. */
2339 if (mask == 0)
2340 return NULL;
2341
2342 /* Pop registers r4..r15 under mask. */
2343 for (i = 0; i < 12; i++)
2344 if (mask & (1 << i))
2345 {
2346 cache->saved_regs[4 + i].addr = vsp;
2347 vsp += 4;
2348 }
2349
2350 /* Special-case popping SP -- we need to reload vsp. */
2351 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2352 vsp_valid = 0;
2353 }
2354 else if ((insn & 0xf0) == 0x90)
2355 {
2356 int reg = insn & 0xf;
2357
2358 /* Reserved cases. */
2359 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2360 return NULL;
2361
2362 /* Set SP from another register and mark VSP for reload. */
2363 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2364 vsp_valid = 0;
2365 }
2366 else if ((insn & 0xf0) == 0xa0)
2367 {
2368 int count = insn & 0x7;
2369 int pop_lr = (insn & 0x8) != 0;
2370 int i;
2371
2372 /* Pop r4..r[4+count]. */
2373 for (i = 0; i <= count; i++)
2374 {
2375 cache->saved_regs[4 + i].addr = vsp;
2376 vsp += 4;
2377 }
2378
2379 /* If indicated by flag, pop LR as well. */
2380 if (pop_lr)
2381 {
2382 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2383 vsp += 4;
2384 }
2385 }
2386 else if (insn == 0xb0)
2387 {
2388 /* We could only have updated PC by popping into it; if so, it
2389 will show up as address. Otherwise, copy LR into PC. */
2390 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2391 cache->saved_regs[ARM_PC_REGNUM]
2392 = cache->saved_regs[ARM_LR_REGNUM];
2393
2394 /* We're done. */
2395 break;
2396 }
2397 else if (insn == 0xb1)
2398 {
2399 int mask = *entry++;
2400 int i;
2401
2402 /* All-zero mask and mask >= 16 is "spare". */
2403 if (mask == 0 || mask >= 16)
2404 return NULL;
2405
2406 /* Pop r0..r3 under mask. */
2407 for (i = 0; i < 4; i++)
2408 if (mask & (1 << i))
2409 {
2410 cache->saved_regs[i].addr = vsp;
2411 vsp += 4;
2412 }
2413 }
2414 else if (insn == 0xb2)
2415 {
2416 ULONGEST offset = 0;
2417 unsigned shift = 0;
2418
2419 do
2420 {
2421 offset |= (*entry & 0x7f) << shift;
2422 shift += 7;
2423 }
2424 while (*entry++ & 0x80);
2425
2426 vsp += 0x204 + (offset << 2);
2427 }
2428 else if (insn == 0xb3)
2429 {
2430 int start = *entry >> 4;
2431 int count = (*entry++) & 0xf;
2432 int i;
2433
2434 /* Only registers D0..D15 are valid here. */
2435 if (start + count >= 16)
2436 return NULL;
2437
2438 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2439 for (i = 0; i <= count; i++)
2440 {
2441 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2442 vsp += 8;
2443 }
2444
2445 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2446 vsp += 4;
2447 }
2448 else if ((insn & 0xf8) == 0xb8)
2449 {
2450 int count = insn & 0x7;
2451 int i;
2452
2453 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2454 for (i = 0; i <= count; i++)
2455 {
2456 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2457 vsp += 8;
2458 }
2459
2460 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2461 vsp += 4;
2462 }
2463 else if (insn == 0xc6)
2464 {
2465 int start = *entry >> 4;
2466 int count = (*entry++) & 0xf;
2467 int i;
2468
2469 /* Only registers WR0..WR15 are valid. */
2470 if (start + count >= 16)
2471 return NULL;
2472
2473 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2474 for (i = 0; i <= count; i++)
2475 {
2476 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2477 vsp += 8;
2478 }
2479 }
2480 else if (insn == 0xc7)
2481 {
2482 int mask = *entry++;
2483 int i;
2484
2485 /* All-zero mask and mask >= 16 is "spare". */
2486 if (mask == 0 || mask >= 16)
2487 return NULL;
2488
2489 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2490 for (i = 0; i < 4; i++)
2491 if (mask & (1 << i))
2492 {
2493 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2494 vsp += 4;
2495 }
2496 }
2497 else if ((insn & 0xf8) == 0xc0)
2498 {
2499 int count = insn & 0x7;
2500 int i;
2501
2502 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2503 for (i = 0; i <= count; i++)
2504 {
2505 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2506 vsp += 8;
2507 }
2508 }
2509 else if (insn == 0xc8)
2510 {
2511 int start = *entry >> 4;
2512 int count = (*entry++) & 0xf;
2513 int i;
2514
2515 /* Only registers D0..D31 are valid. */
2516 if (start + count >= 16)
2517 return NULL;
2518
2519 /* Pop VFP double-precision registers
2520 D[16+start]..D[16+start+count]. */
2521 for (i = 0; i <= count; i++)
2522 {
2523 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2524 vsp += 8;
2525 }
2526 }
2527 else if (insn == 0xc9)
2528 {
2529 int start = *entry >> 4;
2530 int count = (*entry++) & 0xf;
2531 int i;
2532
2533 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2534 for (i = 0; i <= count; i++)
2535 {
2536 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2537 vsp += 8;
2538 }
2539 }
2540 else if ((insn & 0xf8) == 0xd0)
2541 {
2542 int count = insn & 0x7;
2543 int i;
2544
2545 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2546 for (i = 0; i <= count; i++)
2547 {
2548 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2549 vsp += 8;
2550 }
2551 }
2552 else
2553 {
2554 /* Everything else is "spare". */
2555 return NULL;
2556 }
2557 }
2558
2559 /* If we restore SP from a register, assume this was the frame register.
2560 Otherwise just fall back to SP as frame register. */
2561 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2562 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2563 else
2564 cache->framereg = ARM_SP_REGNUM;
2565
2566 /* Determine offset to previous frame. */
2567 cache->framesize
2568 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2569
2570 /* We already got the previous SP. */
2571 cache->prev_sp = vsp;
2572
2573 return cache;
2574}
2575
2576/* Unwinding via ARM exception table entries. Note that the sniffer
2577 already computes a filled-in prologue cache, which is then used
2578 with the same arm_prologue_this_id and arm_prologue_prev_register
2579 routines also used for prologue-parsing based unwinding. */
2580
2581static int
2582arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2583 struct frame_info *this_frame,
2584 void **this_prologue_cache)
2585{
2586 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2587 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2588 CORE_ADDR addr_in_block, exidx_region, func_start;
2589 struct arm_prologue_cache *cache;
2590 gdb_byte *entry;
2591
2592 /* See if we have an ARM exception table entry covering this address. */
2593 addr_in_block = get_frame_address_in_block (this_frame);
2594 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2595 if (!entry)
2596 return 0;
2597
2598 /* The ARM exception table does not describe unwind information
2599 for arbitrary PC values, but is guaranteed to be correct only
2600 at call sites. We have to decide here whether we want to use
2601 ARM exception table information for this frame, or fall back
2602 to using prologue parsing. (Note that if we have DWARF CFI,
2603 this sniffer isn't even called -- CFI is always preferred.)
2604
2605 Before we make this decision, however, we check whether we
2606 actually have *symbol* information for the current frame.
2607 If not, prologue parsing would not work anyway, so we might
2608 as well use the exception table and hope for the best. */
2609 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2610 {
2611 int exc_valid = 0;
2612
2613 /* If the next frame is "normal", we are at a call site in this
2614 frame, so exception information is guaranteed to be valid. */
2615 if (get_next_frame (this_frame)
2616 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2617 exc_valid = 1;
2618
2619 /* We also assume exception information is valid if we're currently
2620 blocked in a system call. The system library is supposed to
d9311bfa
AT
2621 ensure this, so that e.g. pthread cancellation works. */
2622 if (arm_frame_is_thumb (this_frame))
0e9e9abd 2623 {
d9311bfa 2624 LONGEST insn;
416dc9c6 2625
d9311bfa
AT
2626 if (safe_read_memory_integer (get_frame_pc (this_frame) - 2, 2,
2627 byte_order_for_code, &insn)
2628 && (insn & 0xff00) == 0xdf00 /* svc */)
2629 exc_valid = 1;
0e9e9abd 2630 }
d9311bfa
AT
2631 else
2632 {
2633 LONGEST insn;
416dc9c6 2634
d9311bfa
AT
2635 if (safe_read_memory_integer (get_frame_pc (this_frame) - 4, 4,
2636 byte_order_for_code, &insn)
2637 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2638 exc_valid = 1;
2639 }
2640
0e9e9abd
UW
2641 /* Bail out if we don't know that exception information is valid. */
2642 if (!exc_valid)
2643 return 0;
2644
2645 /* The ARM exception index does not mark the *end* of the region
2646 covered by the entry, and some functions will not have any entry.
2647 To correctly recognize the end of the covered region, the linker
2648 should have inserted dummy records with a CANTUNWIND marker.
2649
2650 Unfortunately, current versions of GNU ld do not reliably do
2651 this, and thus we may have found an incorrect entry above.
2652 As a (temporary) sanity check, we only use the entry if it
2653 lies *within* the bounds of the function. Note that this check
2654 might reject perfectly valid entries that just happen to cover
2655 multiple functions; therefore this check ought to be removed
2656 once the linker is fixed. */
2657 if (func_start > exidx_region)
2658 return 0;
2659 }
2660
2661 /* Decode the list of unwinding instructions into a prologue cache.
2662 Note that this may fail due to e.g. a "refuse to unwind" code. */
2663 cache = arm_exidx_fill_cache (this_frame, entry);
2664 if (!cache)
2665 return 0;
2666
2667 *this_prologue_cache = cache;
2668 return 1;
2669}
2670
2671struct frame_unwind arm_exidx_unwind = {
2672 NORMAL_FRAME,
8fbca658 2673 default_frame_unwind_stop_reason,
0e9e9abd
UW
2674 arm_prologue_this_id,
2675 arm_prologue_prev_register,
2676 NULL,
2677 arm_exidx_unwind_sniffer
2678};
2679
80d8d390
YQ
2680/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2681 trampoline, return the target PC. Otherwise return 0.
2682
2683 void call0a (char c, short s, int i, long l) {}
2684
2685 int main (void)
2686 {
2687 (*pointer_to_call0a) (c, s, i, l);
2688 }
2689
2690 Instead of calling a stub library function _call_via_xx (xx is
2691 the register name), GCC may inline the trampoline in the object
2692 file as below (register r2 has the address of call0a).
2693
2694 .global main
2695 .type main, %function
2696 ...
2697 bl .L1
2698 ...
2699 .size main, .-main
2700
2701 .L1:
2702 bx r2
2703
2704 The trampoline 'bx r2' doesn't belong to main. */
2705
2706static CORE_ADDR
2707arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2708{
2709 /* The heuristics of recognizing such trampoline is that FRAME is
2710 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2711 if (arm_frame_is_thumb (frame))
2712 {
2713 gdb_byte buf[2];
2714
2715 if (target_read_memory (pc, buf, 2) == 0)
2716 {
2717 struct gdbarch *gdbarch = get_frame_arch (frame);
2718 enum bfd_endian byte_order_for_code
2719 = gdbarch_byte_order_for_code (gdbarch);
2720 uint16_t insn
2721 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2722
2723 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2724 {
2725 CORE_ADDR dest
2726 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2727
2728 /* Clear the LSB so that gdb core sets step-resume
2729 breakpoint at the right address. */
2730 return UNMAKE_THUMB_ADDR (dest);
2731 }
2732 }
2733 }
2734
2735 return 0;
2736}
2737
909cf6ea 2738static struct arm_prologue_cache *
a262aec2 2739arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2740{
909cf6ea 2741 struct arm_prologue_cache *cache;
909cf6ea 2742
35d5d4ee 2743 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2744 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2745
a262aec2 2746 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2747
2748 return cache;
2749}
2750
2751/* Our frame ID for a stub frame is the current SP and LR. */
2752
2753static void
a262aec2 2754arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2755 void **this_cache,
2756 struct frame_id *this_id)
2757{
2758 struct arm_prologue_cache *cache;
2759
2760 if (*this_cache == NULL)
a262aec2 2761 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2762 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2763
a262aec2 2764 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2765}
2766
a262aec2
DJ
2767static int
2768arm_stub_unwind_sniffer (const struct frame_unwind *self,
2769 struct frame_info *this_frame,
2770 void **this_prologue_cache)
909cf6ea 2771{
93d42b30 2772 CORE_ADDR addr_in_block;
948f8e3d 2773 gdb_byte dummy[4];
18d18ac8
YQ
2774 CORE_ADDR pc, start_addr;
2775 const char *name;
909cf6ea 2776
a262aec2 2777 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2778 pc = get_frame_pc (this_frame);
3e5d3a5a 2779 if (in_plt_section (addr_in_block)
fc36e839
DE
2780 /* We also use the stub winder if the target memory is unreadable
2781 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2782 || target_read_memory (pc, dummy, 4) != 0)
2783 return 1;
2784
2785 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2786 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2787 return 1;
909cf6ea 2788
a262aec2 2789 return 0;
909cf6ea
DJ
2790}
2791
a262aec2
DJ
2792struct frame_unwind arm_stub_unwind = {
2793 NORMAL_FRAME,
8fbca658 2794 default_frame_unwind_stop_reason,
a262aec2
DJ
2795 arm_stub_this_id,
2796 arm_prologue_prev_register,
2797 NULL,
2798 arm_stub_unwind_sniffer
2799};
2800
2ae28aa9
YQ
2801/* Put here the code to store, into CACHE->saved_regs, the addresses
2802 of the saved registers of frame described by THIS_FRAME. CACHE is
2803 returned. */
2804
2805static struct arm_prologue_cache *
2806arm_m_exception_cache (struct frame_info *this_frame)
2807{
2808 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2809 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2810 struct arm_prologue_cache *cache;
2811 CORE_ADDR unwound_sp;
2812 LONGEST xpsr;
2813
2814 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2815 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2816
2817 unwound_sp = get_frame_register_unsigned (this_frame,
2818 ARM_SP_REGNUM);
2819
2820 /* The hardware saves eight 32-bit words, comprising xPSR,
2821 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2822 "B1.5.6 Exception entry behavior" in
2823 "ARMv7-M Architecture Reference Manual". */
2824 cache->saved_regs[0].addr = unwound_sp;
2825 cache->saved_regs[1].addr = unwound_sp + 4;
2826 cache->saved_regs[2].addr = unwound_sp + 8;
2827 cache->saved_regs[3].addr = unwound_sp + 12;
2828 cache->saved_regs[12].addr = unwound_sp + 16;
2829 cache->saved_regs[14].addr = unwound_sp + 20;
2830 cache->saved_regs[15].addr = unwound_sp + 24;
2831 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2832
2833 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2834 aligner between the top of the 32-byte stack frame and the
2835 previous context's stack pointer. */
2836 cache->prev_sp = unwound_sp + 32;
2837 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2838 && (xpsr & (1 << 9)) != 0)
2839 cache->prev_sp += 4;
2840
2841 return cache;
2842}
2843
2844/* Implementation of function hook 'this_id' in
2845 'struct frame_uwnind'. */
2846
2847static void
2848arm_m_exception_this_id (struct frame_info *this_frame,
2849 void **this_cache,
2850 struct frame_id *this_id)
2851{
2852 struct arm_prologue_cache *cache;
2853
2854 if (*this_cache == NULL)
2855 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2856 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2857
2858 /* Our frame ID for a stub frame is the current SP and LR. */
2859 *this_id = frame_id_build (cache->prev_sp,
2860 get_frame_pc (this_frame));
2861}
2862
2863/* Implementation of function hook 'prev_register' in
2864 'struct frame_uwnind'. */
2865
2866static struct value *
2867arm_m_exception_prev_register (struct frame_info *this_frame,
2868 void **this_cache,
2869 int prev_regnum)
2870{
2871 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2872 struct arm_prologue_cache *cache;
2873
2874 if (*this_cache == NULL)
2875 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2876 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2877
2878 /* The value was already reconstructed into PREV_SP. */
2879 if (prev_regnum == ARM_SP_REGNUM)
2880 return frame_unwind_got_constant (this_frame, prev_regnum,
2881 cache->prev_sp);
2882
2883 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2884 prev_regnum);
2885}
2886
2887/* Implementation of function hook 'sniffer' in
2888 'struct frame_uwnind'. */
2889
2890static int
2891arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
2892 struct frame_info *this_frame,
2893 void **this_prologue_cache)
2894{
2895 CORE_ADDR this_pc = get_frame_pc (this_frame);
2896
2897 /* No need to check is_m; this sniffer is only registered for
2898 M-profile architectures. */
2899
2900 /* Exception frames return to one of these magic PCs. Other values
2901 are not defined as of v7-M. See details in "B1.5.8 Exception
2902 return behavior" in "ARMv7-M Architecture Reference Manual". */
2903 if (this_pc == 0xfffffff1 || this_pc == 0xfffffff9
2904 || this_pc == 0xfffffffd)
2905 return 1;
2906
2907 return 0;
2908}
2909
2910/* Frame unwinder for M-profile exceptions. */
2911
2912struct frame_unwind arm_m_exception_unwind =
2913{
2914 SIGTRAMP_FRAME,
2915 default_frame_unwind_stop_reason,
2916 arm_m_exception_this_id,
2917 arm_m_exception_prev_register,
2918 NULL,
2919 arm_m_exception_unwind_sniffer
2920};
2921
24de872b 2922static CORE_ADDR
a262aec2 2923arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
2924{
2925 struct arm_prologue_cache *cache;
2926
eb5492fa 2927 if (*this_cache == NULL)
a262aec2 2928 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2929 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 2930
4be43953 2931 return cache->prev_sp - cache->framesize;
24de872b
DJ
2932}
2933
eb5492fa
DJ
2934struct frame_base arm_normal_base = {
2935 &arm_prologue_unwind,
2936 arm_normal_frame_base,
2937 arm_normal_frame_base,
2938 arm_normal_frame_base
2939};
2940
a262aec2 2941/* Assuming THIS_FRAME is a dummy, return the frame ID of that
eb5492fa
DJ
2942 dummy frame. The frame ID's base needs to match the TOS value
2943 saved by save_dummy_frame_tos() and returned from
2944 arm_push_dummy_call, and the PC needs to match the dummy frame's
2945 breakpoint. */
c906108c 2946
eb5492fa 2947static struct frame_id
a262aec2 2948arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
c906108c 2949{
0963b4bd
MS
2950 return frame_id_build (get_frame_register_unsigned (this_frame,
2951 ARM_SP_REGNUM),
a262aec2 2952 get_frame_pc (this_frame));
eb5492fa 2953}
c3b4394c 2954
eb5492fa
DJ
2955/* Given THIS_FRAME, find the previous frame's resume PC (which will
2956 be used to construct the previous frame's ID, after looking up the
2957 containing function). */
c3b4394c 2958
eb5492fa
DJ
2959static CORE_ADDR
2960arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
2961{
2962 CORE_ADDR pc;
2963 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
24568a2c 2964 return arm_addr_bits_remove (gdbarch, pc);
eb5492fa
DJ
2965}
2966
2967static CORE_ADDR
2968arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
2969{
2970 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
c906108c
SS
2971}
2972
b39cc962
DJ
2973static struct value *
2974arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
2975 int regnum)
2976{
24568a2c 2977 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 2978 CORE_ADDR lr, cpsr;
9779414d 2979 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2980
2981 switch (regnum)
2982 {
2983 case ARM_PC_REGNUM:
2984 /* The PC is normally copied from the return column, which
2985 describes saves of LR. However, that version may have an
2986 extra bit set to indicate Thumb state. The bit is not
2987 part of the PC. */
2988 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2989 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 2990 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
2991
2992 case ARM_PS_REGNUM:
2993 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 2994 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
2995 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2996 if (IS_THUMB_ADDR (lr))
9779414d 2997 cpsr |= t_bit;
b39cc962 2998 else
9779414d 2999 cpsr &= ~t_bit;
ca38c58e 3000 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
3001
3002 default:
3003 internal_error (__FILE__, __LINE__,
3004 _("Unexpected register %d"), regnum);
3005 }
3006}
3007
3008static void
3009arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3010 struct dwarf2_frame_state_reg *reg,
3011 struct frame_info *this_frame)
3012{
3013 switch (regnum)
3014 {
3015 case ARM_PC_REGNUM:
3016 case ARM_PS_REGNUM:
3017 reg->how = DWARF2_FRAME_REG_FN;
3018 reg->loc.fn = arm_dwarf2_prev_register;
3019 break;
3020 case ARM_SP_REGNUM:
3021 reg->how = DWARF2_FRAME_REG_CFA;
3022 break;
3023 }
3024}
3025
c9cf6e20 3026/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3027
3028static int
c9cf6e20 3029thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3030{
3031 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3032 unsigned int insn, insn2;
3033 int found_return = 0, found_stack_adjust = 0;
3034 CORE_ADDR func_start, func_end;
3035 CORE_ADDR scan_pc;
3036 gdb_byte buf[4];
3037
3038 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3039 return 0;
3040
3041 /* The epilogue is a sequence of instructions along the following lines:
3042
3043 - add stack frame size to SP or FP
3044 - [if frame pointer used] restore SP from FP
3045 - restore registers from SP [may include PC]
3046 - a return-type instruction [if PC wasn't already restored]
3047
3048 In a first pass, we scan forward from the current PC and verify the
3049 instructions we find as compatible with this sequence, ending in a
3050 return instruction.
3051
3052 However, this is not sufficient to distinguish indirect function calls
3053 within a function from indirect tail calls in the epilogue in some cases.
3054 Therefore, if we didn't already find any SP-changing instruction during
3055 forward scan, we add a backward scanning heuristic to ensure we actually
3056 are in the epilogue. */
3057
3058 scan_pc = pc;
3059 while (scan_pc < func_end && !found_return)
3060 {
3061 if (target_read_memory (scan_pc, buf, 2))
3062 break;
3063
3064 scan_pc += 2;
3065 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3066
3067 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3068 found_return = 1;
3069 else if (insn == 0x46f7) /* mov pc, lr */
3070 found_return = 1;
540314bd 3071 else if (thumb_instruction_restores_sp (insn))
4024ca99 3072 {
b7576e5c 3073 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3074 found_return = 1;
3075 }
db24da6d 3076 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3077 {
3078 if (target_read_memory (scan_pc, buf, 2))
3079 break;
3080
3081 scan_pc += 2;
3082 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3083
3084 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3085 {
4024ca99
UW
3086 if (insn2 & 0x8000) /* <registers> include PC. */
3087 found_return = 1;
3088 }
3089 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3090 && (insn2 & 0x0fff) == 0x0b04)
3091 {
4024ca99
UW
3092 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3093 found_return = 1;
3094 }
3095 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3096 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3097 ;
4024ca99
UW
3098 else
3099 break;
3100 }
3101 else
3102 break;
3103 }
3104
3105 if (!found_return)
3106 return 0;
3107
3108 /* Since any instruction in the epilogue sequence, with the possible
3109 exception of return itself, updates the stack pointer, we need to
3110 scan backwards for at most one instruction. Try either a 16-bit or
3111 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3112 too much about false positives. */
4024ca99 3113
6b65d1b6
YQ
3114 if (pc - 4 < func_start)
3115 return 0;
3116 if (target_read_memory (pc - 4, buf, 4))
3117 return 0;
4024ca99 3118
6b65d1b6
YQ
3119 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3120 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3121
3122 if (thumb_instruction_restores_sp (insn2))
3123 found_stack_adjust = 1;
3124 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3125 found_stack_adjust = 1;
3126 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3127 && (insn2 & 0x0fff) == 0x0b04)
3128 found_stack_adjust = 1;
3129 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3130 && (insn2 & 0x0e00) == 0x0a00)
3131 found_stack_adjust = 1;
4024ca99
UW
3132
3133 return found_stack_adjust;
3134}
3135
c9cf6e20 3136/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3137
3138static int
c9cf6e20 3139arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3140{
3141 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3142 unsigned int insn;
f303bc3e 3143 int found_return;
4024ca99
UW
3144 CORE_ADDR func_start, func_end;
3145
3146 if (arm_pc_is_thumb (gdbarch, pc))
c9cf6e20 3147 return thumb_stack_frame_destroyed_p (gdbarch, pc);
4024ca99
UW
3148
3149 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3150 return 0;
3151
3152 /* We are in the epilogue if the previous instruction was a stack
3153 adjustment and the next instruction is a possible return (bx, mov
3154 pc, or pop). We could have to scan backwards to find the stack
3155 adjustment, or forwards to find the return, but this is a decent
3156 approximation. First scan forwards. */
3157
3158 found_return = 0;
3159 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3160 if (bits (insn, 28, 31) != INST_NV)
3161 {
3162 if ((insn & 0x0ffffff0) == 0x012fff10)
3163 /* BX. */
3164 found_return = 1;
3165 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3166 /* MOV PC. */
3167 found_return = 1;
3168 else if ((insn & 0x0fff0000) == 0x08bd0000
3169 && (insn & 0x0000c000) != 0)
3170 /* POP (LDMIA), including PC or LR. */
3171 found_return = 1;
3172 }
3173
3174 if (!found_return)
3175 return 0;
3176
3177 /* Scan backwards. This is just a heuristic, so do not worry about
3178 false positives from mode changes. */
3179
3180 if (pc < func_start + 4)
3181 return 0;
3182
3183 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3184 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3185 return 1;
3186
3187 return 0;
3188}
3189
3190
2dd604e7
RE
3191/* When arguments must be pushed onto the stack, they go on in reverse
3192 order. The code below implements a FILO (stack) to do this. */
3193
3194struct stack_item
3195{
3196 int len;
3197 struct stack_item *prev;
7c543f7b 3198 gdb_byte *data;
2dd604e7
RE
3199};
3200
3201static struct stack_item *
df3b6708 3202push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3203{
3204 struct stack_item *si;
8d749320 3205 si = XNEW (struct stack_item);
7c543f7b 3206 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3207 si->len = len;
3208 si->prev = prev;
3209 memcpy (si->data, contents, len);
3210 return si;
3211}
3212
3213static struct stack_item *
3214pop_stack_item (struct stack_item *si)
3215{
3216 struct stack_item *dead = si;
3217 si = si->prev;
3218 xfree (dead->data);
3219 xfree (dead);
3220 return si;
3221}
3222
2af48f68
PB
3223
3224/* Return the alignment (in bytes) of the given type. */
3225
3226static int
3227arm_type_align (struct type *t)
3228{
3229 int n;
3230 int align;
3231 int falign;
3232
3233 t = check_typedef (t);
3234 switch (TYPE_CODE (t))
3235 {
3236 default:
3237 /* Should never happen. */
3238 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3239 return 4;
3240
3241 case TYPE_CODE_PTR:
3242 case TYPE_CODE_ENUM:
3243 case TYPE_CODE_INT:
3244 case TYPE_CODE_FLT:
3245 case TYPE_CODE_SET:
3246 case TYPE_CODE_RANGE:
2af48f68
PB
3247 case TYPE_CODE_REF:
3248 case TYPE_CODE_CHAR:
3249 case TYPE_CODE_BOOL:
3250 return TYPE_LENGTH (t);
3251
3252 case TYPE_CODE_ARRAY:
c4312b19
YQ
3253 if (TYPE_VECTOR (t))
3254 {
3255 /* Use the natural alignment for vector types (the same for
3256 scalar type), but the maximum alignment is 64-bit. */
3257 if (TYPE_LENGTH (t) > 8)
3258 return 8;
3259 else
3260 return TYPE_LENGTH (t);
3261 }
3262 else
3263 return arm_type_align (TYPE_TARGET_TYPE (t));
2af48f68 3264 case TYPE_CODE_COMPLEX:
2af48f68
PB
3265 return arm_type_align (TYPE_TARGET_TYPE (t));
3266
3267 case TYPE_CODE_STRUCT:
3268 case TYPE_CODE_UNION:
3269 align = 1;
3270 for (n = 0; n < TYPE_NFIELDS (t); n++)
3271 {
3272 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3273 if (falign > align)
3274 align = falign;
3275 }
3276 return align;
3277 }
3278}
3279
90445bd3
DJ
3280/* Possible base types for a candidate for passing and returning in
3281 VFP registers. */
3282
3283enum arm_vfp_cprc_base_type
3284{
3285 VFP_CPRC_UNKNOWN,
3286 VFP_CPRC_SINGLE,
3287 VFP_CPRC_DOUBLE,
3288 VFP_CPRC_VEC64,
3289 VFP_CPRC_VEC128
3290};
3291
3292/* The length of one element of base type B. */
3293
3294static unsigned
3295arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3296{
3297 switch (b)
3298 {
3299 case VFP_CPRC_SINGLE:
3300 return 4;
3301 case VFP_CPRC_DOUBLE:
3302 return 8;
3303 case VFP_CPRC_VEC64:
3304 return 8;
3305 case VFP_CPRC_VEC128:
3306 return 16;
3307 default:
3308 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3309 (int) b);
3310 }
3311}
3312
3313/* The character ('s', 'd' or 'q') for the type of VFP register used
3314 for passing base type B. */
3315
3316static int
3317arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3318{
3319 switch (b)
3320 {
3321 case VFP_CPRC_SINGLE:
3322 return 's';
3323 case VFP_CPRC_DOUBLE:
3324 return 'd';
3325 case VFP_CPRC_VEC64:
3326 return 'd';
3327 case VFP_CPRC_VEC128:
3328 return 'q';
3329 default:
3330 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3331 (int) b);
3332 }
3333}
3334
3335/* Determine whether T may be part of a candidate for passing and
3336 returning in VFP registers, ignoring the limit on the total number
3337 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3338 classification of the first valid component found; if it is not
3339 VFP_CPRC_UNKNOWN, all components must have the same classification
3340 as *BASE_TYPE. If it is found that T contains a type not permitted
3341 for passing and returning in VFP registers, a type differently
3342 classified from *BASE_TYPE, or two types differently classified
3343 from each other, return -1, otherwise return the total number of
3344 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3345 array). Vector types are not currently supported, matching the
3346 generic AAPCS support. */
90445bd3
DJ
3347
3348static int
3349arm_vfp_cprc_sub_candidate (struct type *t,
3350 enum arm_vfp_cprc_base_type *base_type)
3351{
3352 t = check_typedef (t);
3353 switch (TYPE_CODE (t))
3354 {
3355 case TYPE_CODE_FLT:
3356 switch (TYPE_LENGTH (t))
3357 {
3358 case 4:
3359 if (*base_type == VFP_CPRC_UNKNOWN)
3360 *base_type = VFP_CPRC_SINGLE;
3361 else if (*base_type != VFP_CPRC_SINGLE)
3362 return -1;
3363 return 1;
3364
3365 case 8:
3366 if (*base_type == VFP_CPRC_UNKNOWN)
3367 *base_type = VFP_CPRC_DOUBLE;
3368 else if (*base_type != VFP_CPRC_DOUBLE)
3369 return -1;
3370 return 1;
3371
3372 default:
3373 return -1;
3374 }
3375 break;
3376
817e0957
YQ
3377 case TYPE_CODE_COMPLEX:
3378 /* Arguments of complex T where T is one of the types float or
3379 double get treated as if they are implemented as:
3380
3381 struct complexT
3382 {
3383 T real;
3384 T imag;
5f52445b
YQ
3385 };
3386
3387 */
817e0957
YQ
3388 switch (TYPE_LENGTH (t))
3389 {
3390 case 8:
3391 if (*base_type == VFP_CPRC_UNKNOWN)
3392 *base_type = VFP_CPRC_SINGLE;
3393 else if (*base_type != VFP_CPRC_SINGLE)
3394 return -1;
3395 return 2;
3396
3397 case 16:
3398 if (*base_type == VFP_CPRC_UNKNOWN)
3399 *base_type = VFP_CPRC_DOUBLE;
3400 else if (*base_type != VFP_CPRC_DOUBLE)
3401 return -1;
3402 return 2;
3403
3404 default:
3405 return -1;
3406 }
3407 break;
3408
90445bd3
DJ
3409 case TYPE_CODE_ARRAY:
3410 {
c4312b19 3411 if (TYPE_VECTOR (t))
90445bd3 3412 {
c4312b19
YQ
3413 /* A 64-bit or 128-bit containerized vector type are VFP
3414 CPRCs. */
3415 switch (TYPE_LENGTH (t))
3416 {
3417 case 8:
3418 if (*base_type == VFP_CPRC_UNKNOWN)
3419 *base_type = VFP_CPRC_VEC64;
3420 return 1;
3421 case 16:
3422 if (*base_type == VFP_CPRC_UNKNOWN)
3423 *base_type = VFP_CPRC_VEC128;
3424 return 1;
3425 default:
3426 return -1;
3427 }
3428 }
3429 else
3430 {
3431 int count;
3432 unsigned unitlen;
3433
3434 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3435 base_type);
3436 if (count == -1)
3437 return -1;
3438 if (TYPE_LENGTH (t) == 0)
3439 {
3440 gdb_assert (count == 0);
3441 return 0;
3442 }
3443 else if (count == 0)
3444 return -1;
3445 unitlen = arm_vfp_cprc_unit_length (*base_type);
3446 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3447 return TYPE_LENGTH (t) / unitlen;
90445bd3 3448 }
90445bd3
DJ
3449 }
3450 break;
3451
3452 case TYPE_CODE_STRUCT:
3453 {
3454 int count = 0;
3455 unsigned unitlen;
3456 int i;
3457 for (i = 0; i < TYPE_NFIELDS (t); i++)
3458 {
3459 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3460 base_type);
3461 if (sub_count == -1)
3462 return -1;
3463 count += sub_count;
3464 }
3465 if (TYPE_LENGTH (t) == 0)
3466 {
3467 gdb_assert (count == 0);
3468 return 0;
3469 }
3470 else if (count == 0)
3471 return -1;
3472 unitlen = arm_vfp_cprc_unit_length (*base_type);
3473 if (TYPE_LENGTH (t) != unitlen * count)
3474 return -1;
3475 return count;
3476 }
3477
3478 case TYPE_CODE_UNION:
3479 {
3480 int count = 0;
3481 unsigned unitlen;
3482 int i;
3483 for (i = 0; i < TYPE_NFIELDS (t); i++)
3484 {
3485 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3486 base_type);
3487 if (sub_count == -1)
3488 return -1;
3489 count = (count > sub_count ? count : sub_count);
3490 }
3491 if (TYPE_LENGTH (t) == 0)
3492 {
3493 gdb_assert (count == 0);
3494 return 0;
3495 }
3496 else if (count == 0)
3497 return -1;
3498 unitlen = arm_vfp_cprc_unit_length (*base_type);
3499 if (TYPE_LENGTH (t) != unitlen * count)
3500 return -1;
3501 return count;
3502 }
3503
3504 default:
3505 break;
3506 }
3507
3508 return -1;
3509}
3510
3511/* Determine whether T is a VFP co-processor register candidate (CPRC)
3512 if passed to or returned from a non-variadic function with the VFP
3513 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3514 *BASE_TYPE to the base type for T and *COUNT to the number of
3515 elements of that base type before returning. */
3516
3517static int
3518arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3519 int *count)
3520{
3521 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3522 int c = arm_vfp_cprc_sub_candidate (t, &b);
3523 if (c <= 0 || c > 4)
3524 return 0;
3525 *base_type = b;
3526 *count = c;
3527 return 1;
3528}
3529
3530/* Return 1 if the VFP ABI should be used for passing arguments to and
3531 returning values from a function of type FUNC_TYPE, 0
3532 otherwise. */
3533
3534static int
3535arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3536{
3537 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3538 /* Variadic functions always use the base ABI. Assume that functions
3539 without debug info are not variadic. */
3540 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3541 return 0;
3542 /* The VFP ABI is only supported as a variant of AAPCS. */
3543 if (tdep->arm_abi != ARM_ABI_AAPCS)
3544 return 0;
3545 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3546}
3547
3548/* We currently only support passing parameters in integer registers, which
3549 conforms with GCC's default model, and VFP argument passing following
3550 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3551 we should probably support some of them based on the selected ABI. */
3552
3553static CORE_ADDR
7d9b040b 3554arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
3555 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3556 struct value **args, CORE_ADDR sp, int struct_return,
3557 CORE_ADDR struct_addr)
2dd604e7 3558{
e17a4113 3559 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3560 int argnum;
3561 int argreg;
3562 int nstack;
3563 struct stack_item *si = NULL;
90445bd3
DJ
3564 int use_vfp_abi;
3565 struct type *ftype;
3566 unsigned vfp_regs_free = (1 << 16) - 1;
3567
3568 /* Determine the type of this function and whether the VFP ABI
3569 applies. */
3570 ftype = check_typedef (value_type (function));
3571 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3572 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3573 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3574
6a65450a
AC
3575 /* Set the return address. For the ARM, the return breakpoint is
3576 always at BP_ADDR. */
9779414d 3577 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3578 bp_addr |= 1;
6a65450a 3579 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3580
3581 /* Walk through the list of args and determine how large a temporary
3582 stack is required. Need to take care here as structs may be
7a9dd1b2 3583 passed on the stack, and we have to push them. */
2dd604e7
RE
3584 nstack = 0;
3585
3586 argreg = ARM_A1_REGNUM;
3587 nstack = 0;
3588
2dd604e7
RE
3589 /* The struct_return pointer occupies the first parameter
3590 passing register. */
3591 if (struct_return)
3592 {
3593 if (arm_debug)
5af949e3 3594 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3595 gdbarch_register_name (gdbarch, argreg),
5af949e3 3596 paddress (gdbarch, struct_addr));
2dd604e7
RE
3597 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3598 argreg++;
3599 }
3600
3601 for (argnum = 0; argnum < nargs; argnum++)
3602 {
3603 int len;
3604 struct type *arg_type;
3605 struct type *target_type;
3606 enum type_code typecode;
8c6363cf 3607 const bfd_byte *val;
2af48f68 3608 int align;
90445bd3
DJ
3609 enum arm_vfp_cprc_base_type vfp_base_type;
3610 int vfp_base_count;
3611 int may_use_core_reg = 1;
2dd604e7 3612
df407dfe 3613 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3614 len = TYPE_LENGTH (arg_type);
3615 target_type = TYPE_TARGET_TYPE (arg_type);
3616 typecode = TYPE_CODE (arg_type);
8c6363cf 3617 val = value_contents (args[argnum]);
2dd604e7 3618
2af48f68
PB
3619 align = arm_type_align (arg_type);
3620 /* Round alignment up to a whole number of words. */
3621 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3622 /* Different ABIs have different maximum alignments. */
3623 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3624 {
3625 /* The APCS ABI only requires word alignment. */
3626 align = INT_REGISTER_SIZE;
3627 }
3628 else
3629 {
3630 /* The AAPCS requires at most doubleword alignment. */
3631 if (align > INT_REGISTER_SIZE * 2)
3632 align = INT_REGISTER_SIZE * 2;
3633 }
3634
90445bd3
DJ
3635 if (use_vfp_abi
3636 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3637 &vfp_base_count))
3638 {
3639 int regno;
3640 int unit_length;
3641 int shift;
3642 unsigned mask;
3643
3644 /* Because this is a CPRC it cannot go in a core register or
3645 cause a core register to be skipped for alignment.
3646 Either it goes in VFP registers and the rest of this loop
3647 iteration is skipped for this argument, or it goes on the
3648 stack (and the stack alignment code is correct for this
3649 case). */
3650 may_use_core_reg = 0;
3651
3652 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3653 shift = unit_length / 4;
3654 mask = (1 << (shift * vfp_base_count)) - 1;
3655 for (regno = 0; regno < 16; regno += shift)
3656 if (((vfp_regs_free >> regno) & mask) == mask)
3657 break;
3658
3659 if (regno < 16)
3660 {
3661 int reg_char;
3662 int reg_scaled;
3663 int i;
3664
3665 vfp_regs_free &= ~(mask << regno);
3666 reg_scaled = regno / shift;
3667 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3668 for (i = 0; i < vfp_base_count; i++)
3669 {
3670 char name_buf[4];
3671 int regnum;
58d6951d
DJ
3672 if (reg_char == 'q')
3673 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3674 val + i * unit_length);
58d6951d
DJ
3675 else
3676 {
8c042590
PM
3677 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3678 reg_char, reg_scaled + i);
58d6951d
DJ
3679 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3680 strlen (name_buf));
3681 regcache_cooked_write (regcache, regnum,
3682 val + i * unit_length);
3683 }
90445bd3
DJ
3684 }
3685 continue;
3686 }
3687 else
3688 {
3689 /* This CPRC could not go in VFP registers, so all VFP
3690 registers are now marked as used. */
3691 vfp_regs_free = 0;
3692 }
3693 }
3694
2af48f68
PB
3695 /* Push stack padding for dowubleword alignment. */
3696 if (nstack & (align - 1))
3697 {
3698 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3699 nstack += INT_REGISTER_SIZE;
3700 }
3701
3702 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3703 if (may_use_core_reg
3704 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3705 && align > INT_REGISTER_SIZE
3706 && argreg & 1)
3707 argreg++;
3708
2dd604e7
RE
3709 /* If the argument is a pointer to a function, and it is a
3710 Thumb function, create a LOCAL copy of the value and set
3711 the THUMB bit in it. */
3712 if (TYPE_CODE_PTR == typecode
3713 && target_type != NULL
f96b8fa0 3714 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3715 {
e17a4113 3716 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3717 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3718 {
224c3ddb 3719 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3720 store_unsigned_integer (copy, len, byte_order,
e17a4113 3721 MAKE_THUMB_ADDR (regval));
8c6363cf 3722 val = copy;
2dd604e7
RE
3723 }
3724 }
3725
3726 /* Copy the argument to general registers or the stack in
3727 register-sized pieces. Large arguments are split between
3728 registers and stack. */
3729 while (len > 0)
3730 {
f0c9063c 3731 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
ef9bd0b8
YQ
3732 CORE_ADDR regval
3733 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3734
90445bd3 3735 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3736 {
3737 /* The argument is being passed in a general purpose
3738 register. */
e17a4113 3739 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3740 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3741 if (arm_debug)
3742 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3743 argnum,
3744 gdbarch_register_name
2af46ca0 3745 (gdbarch, argreg),
f0c9063c 3746 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3747 regcache_cooked_write_unsigned (regcache, argreg, regval);
3748 argreg++;
3749 }
3750 else
3751 {
ef9bd0b8
YQ
3752 gdb_byte buf[INT_REGISTER_SIZE];
3753
3754 memset (buf, 0, sizeof (buf));
3755 store_unsigned_integer (buf, partial_len, byte_order, regval);
3756
2dd604e7
RE
3757 /* Push the arguments onto the stack. */
3758 if (arm_debug)
3759 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3760 argnum, nstack);
ef9bd0b8 3761 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
f0c9063c 3762 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3763 }
3764
3765 len -= partial_len;
3766 val += partial_len;
3767 }
3768 }
3769 /* If we have an odd number of words to push, then decrement the stack
3770 by one word now, so first stack argument will be dword aligned. */
3771 if (nstack & 4)
3772 sp -= 4;
3773
3774 while (si)
3775 {
3776 sp -= si->len;
3777 write_memory (sp, si->data, si->len);
3778 si = pop_stack_item (si);
3779 }
3780
3781 /* Finally, update teh SP register. */
3782 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3783
3784 return sp;
3785}
3786
f53f0d0b
PB
3787
3788/* Always align the frame to an 8-byte boundary. This is required on
3789 some platforms and harmless on the rest. */
3790
3791static CORE_ADDR
3792arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3793{
3794 /* Align the stack to eight bytes. */
3795 return sp & ~ (CORE_ADDR) 7;
3796}
3797
c906108c 3798static void
12b27276 3799print_fpu_flags (struct ui_file *file, int flags)
c906108c 3800{
c5aa993b 3801 if (flags & (1 << 0))
12b27276 3802 fputs_filtered ("IVO ", file);
c5aa993b 3803 if (flags & (1 << 1))
12b27276 3804 fputs_filtered ("DVZ ", file);
c5aa993b 3805 if (flags & (1 << 2))
12b27276 3806 fputs_filtered ("OFL ", file);
c5aa993b 3807 if (flags & (1 << 3))
12b27276 3808 fputs_filtered ("UFL ", file);
c5aa993b 3809 if (flags & (1 << 4))
12b27276
WN
3810 fputs_filtered ("INX ", file);
3811 fputc_filtered ('\n', file);
c906108c
SS
3812}
3813
5e74b15c
RE
3814/* Print interesting information about the floating point processor
3815 (if present) or emulator. */
34e8f22d 3816static void
d855c300 3817arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3818 struct frame_info *frame, const char *args)
c906108c 3819{
9c9acae0 3820 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3821 int type;
3822
3823 type = (status >> 24) & 127;
edefbb7c 3824 if (status & (1 << 31))
12b27276 3825 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 3826 else
12b27276 3827 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 3828 /* i18n: [floating point unit] mask */
12b27276
WN
3829 fputs_filtered (_("mask: "), file);
3830 print_fpu_flags (file, status >> 16);
edefbb7c 3831 /* i18n: [floating point unit] flags */
12b27276
WN
3832 fputs_filtered (_("flags: "), file);
3833 print_fpu_flags (file, status);
c906108c
SS
3834}
3835
27067745
UW
3836/* Construct the ARM extended floating point type. */
3837static struct type *
3838arm_ext_type (struct gdbarch *gdbarch)
3839{
3840 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3841
3842 if (!tdep->arm_ext_type)
3843 tdep->arm_ext_type
e9bb382b 3844 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3845 floatformats_arm_ext);
3846
3847 return tdep->arm_ext_type;
3848}
3849
58d6951d
DJ
3850static struct type *
3851arm_neon_double_type (struct gdbarch *gdbarch)
3852{
3853 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3854
3855 if (tdep->neon_double_type == NULL)
3856 {
3857 struct type *t, *elem;
3858
3859 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3860 TYPE_CODE_UNION);
3861 elem = builtin_type (gdbarch)->builtin_uint8;
3862 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3863 elem = builtin_type (gdbarch)->builtin_uint16;
3864 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3865 elem = builtin_type (gdbarch)->builtin_uint32;
3866 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3867 elem = builtin_type (gdbarch)->builtin_uint64;
3868 append_composite_type_field (t, "u64", elem);
3869 elem = builtin_type (gdbarch)->builtin_float;
3870 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3871 elem = builtin_type (gdbarch)->builtin_double;
3872 append_composite_type_field (t, "f64", elem);
3873
3874 TYPE_VECTOR (t) = 1;
3875 TYPE_NAME (t) = "neon_d";
3876 tdep->neon_double_type = t;
3877 }
3878
3879 return tdep->neon_double_type;
3880}
3881
3882/* FIXME: The vector types are not correctly ordered on big-endian
3883 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3884 bits of d0 - regardless of what unit size is being held in d0. So
3885 the offset of the first uint8 in d0 is 7, but the offset of the
3886 first float is 4. This code works as-is for little-endian
3887 targets. */
3888
3889static struct type *
3890arm_neon_quad_type (struct gdbarch *gdbarch)
3891{
3892 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3893
3894 if (tdep->neon_quad_type == NULL)
3895 {
3896 struct type *t, *elem;
3897
3898 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3899 TYPE_CODE_UNION);
3900 elem = builtin_type (gdbarch)->builtin_uint8;
3901 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3902 elem = builtin_type (gdbarch)->builtin_uint16;
3903 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3904 elem = builtin_type (gdbarch)->builtin_uint32;
3905 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3906 elem = builtin_type (gdbarch)->builtin_uint64;
3907 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3908 elem = builtin_type (gdbarch)->builtin_float;
3909 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3910 elem = builtin_type (gdbarch)->builtin_double;
3911 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3912
3913 TYPE_VECTOR (t) = 1;
3914 TYPE_NAME (t) = "neon_q";
3915 tdep->neon_quad_type = t;
3916 }
3917
3918 return tdep->neon_quad_type;
3919}
3920
34e8f22d
RE
3921/* Return the GDB type object for the "standard" data type of data in
3922 register N. */
3923
3924static struct type *
7a5ea0d4 3925arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3926{
58d6951d
DJ
3927 int num_regs = gdbarch_num_regs (gdbarch);
3928
3929 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3930 && regnum >= num_regs && regnum < num_regs + 32)
3931 return builtin_type (gdbarch)->builtin_float;
3932
3933 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3934 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3935 return arm_neon_quad_type (gdbarch);
3936
3937 /* If the target description has register information, we are only
3938 in this function so that we can override the types of
3939 double-precision registers for NEON. */
3940 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
3941 {
3942 struct type *t = tdesc_register_type (gdbarch, regnum);
3943
3944 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
3945 && TYPE_CODE (t) == TYPE_CODE_FLT
3946 && gdbarch_tdep (gdbarch)->have_neon)
3947 return arm_neon_double_type (gdbarch);
3948 else
3949 return t;
3950 }
3951
34e8f22d 3952 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
3953 {
3954 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
3955 return builtin_type (gdbarch)->builtin_void;
3956
3957 return arm_ext_type (gdbarch);
3958 }
e4c16157 3959 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 3960 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 3961 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 3962 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
3963 else if (regnum >= ARRAY_SIZE (arm_register_names))
3964 /* These registers are only supported on targets which supply
3965 an XML description. */
df4df182 3966 return builtin_type (gdbarch)->builtin_int0;
032758dc 3967 else
df4df182 3968 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
3969}
3970
ff6f572f
DJ
3971/* Map a DWARF register REGNUM onto the appropriate GDB register
3972 number. */
3973
3974static int
d3f73121 3975arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
3976{
3977 /* Core integer regs. */
3978 if (reg >= 0 && reg <= 15)
3979 return reg;
3980
3981 /* Legacy FPA encoding. These were once used in a way which
3982 overlapped with VFP register numbering, so their use is
3983 discouraged, but GDB doesn't support the ARM toolchain
3984 which used them for VFP. */
3985 if (reg >= 16 && reg <= 23)
3986 return ARM_F0_REGNUM + reg - 16;
3987
3988 /* New assignments for the FPA registers. */
3989 if (reg >= 96 && reg <= 103)
3990 return ARM_F0_REGNUM + reg - 96;
3991
3992 /* WMMX register assignments. */
3993 if (reg >= 104 && reg <= 111)
3994 return ARM_WCGR0_REGNUM + reg - 104;
3995
3996 if (reg >= 112 && reg <= 127)
3997 return ARM_WR0_REGNUM + reg - 112;
3998
3999 if (reg >= 192 && reg <= 199)
4000 return ARM_WC0_REGNUM + reg - 192;
4001
58d6951d
DJ
4002 /* VFP v2 registers. A double precision value is actually
4003 in d1 rather than s2, but the ABI only defines numbering
4004 for the single precision registers. This will "just work"
4005 in GDB for little endian targets (we'll read eight bytes,
4006 starting in s0 and then progressing to s1), but will be
4007 reversed on big endian targets with VFP. This won't
4008 be a problem for the new Neon quad registers; you're supposed
4009 to use DW_OP_piece for those. */
4010 if (reg >= 64 && reg <= 95)
4011 {
4012 char name_buf[4];
4013
8c042590 4014 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4015 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4016 strlen (name_buf));
4017 }
4018
4019 /* VFP v3 / Neon registers. This range is also used for VFP v2
4020 registers, except that it now describes d0 instead of s0. */
4021 if (reg >= 256 && reg <= 287)
4022 {
4023 char name_buf[4];
4024
8c042590 4025 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4026 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4027 strlen (name_buf));
4028 }
4029
ff6f572f
DJ
4030 return -1;
4031}
4032
26216b98
AC
4033/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4034static int
e7faf938 4035arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4036{
4037 int reg = regnum;
e7faf938 4038 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4039
ff6f572f
DJ
4040 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4041 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4042
4043 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4044 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4045
4046 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4047 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4048
26216b98
AC
4049 if (reg < NUM_GREGS)
4050 return SIM_ARM_R0_REGNUM + reg;
4051 reg -= NUM_GREGS;
4052
4053 if (reg < NUM_FREGS)
4054 return SIM_ARM_FP0_REGNUM + reg;
4055 reg -= NUM_FREGS;
4056
4057 if (reg < NUM_SREGS)
4058 return SIM_ARM_FPS_REGNUM + reg;
4059 reg -= NUM_SREGS;
4060
edefbb7c 4061 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4062}
34e8f22d 4063
a37b3cc0
AC
4064/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
4065 convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
4066 It is thought that this is is the floating-point register format on
4067 little-endian systems. */
c906108c 4068
ed9a39eb 4069static void
b508a996 4070convert_from_extended (const struct floatformat *fmt, const void *ptr,
be8626e0 4071 void *dbl, int endianess)
c906108c 4072{
a37b3cc0 4073 DOUBLEST d;
be8626e0
MD
4074
4075 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4076 floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
4077 else
4078 floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
4079 ptr, &d);
b508a996 4080 floatformat_from_doublest (fmt, &d, dbl);
c906108c
SS
4081}
4082
34e8f22d 4083static void
be8626e0
MD
4084convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
4085 int endianess)
c906108c 4086{
a37b3cc0 4087 DOUBLEST d;
be8626e0 4088
b508a996 4089 floatformat_to_doublest (fmt, ptr, &d);
be8626e0 4090 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4091 floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
4092 else
4093 floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
4094 &d, dbl);
c906108c 4095}
ed9a39eb 4096
d9311bfa
AT
4097/* Like insert_single_step_breakpoint, but make sure we use a breakpoint
4098 of the appropriate mode (as encoded in the PC value), even if this
4099 differs from what would be expected according to the symbol tables. */
4100
4101void
4102arm_insert_single_step_breakpoint (struct gdbarch *gdbarch,
4103 struct address_space *aspace,
4104 CORE_ADDR pc)
c906108c 4105{
d9311bfa
AT
4106 struct cleanup *old_chain
4107 = make_cleanup_restore_integer (&arm_override_mode);
c5aa993b 4108
d9311bfa
AT
4109 arm_override_mode = IS_THUMB_ADDR (pc);
4110 pc = gdbarch_addr_bits_remove (gdbarch, pc);
c5aa993b 4111
d9311bfa 4112 insert_single_step_breakpoint (gdbarch, aspace, pc);
c906108c 4113
d9311bfa
AT
4114 do_cleanups (old_chain);
4115}
c5aa993b 4116
d9311bfa
AT
4117/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4118 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4119 NULL if an error occurs. BUF is freed. */
c906108c 4120
d9311bfa
AT
4121static gdb_byte *
4122extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4123 int old_len, int new_len)
4124{
4125 gdb_byte *new_buf;
4126 int bytes_to_read = new_len - old_len;
c906108c 4127
d9311bfa
AT
4128 new_buf = (gdb_byte *) xmalloc (new_len);
4129 memcpy (new_buf + bytes_to_read, buf, old_len);
4130 xfree (buf);
4131 if (target_read_memory (endaddr - new_len, new_buf, bytes_to_read) != 0)
4132 {
4133 xfree (new_buf);
4134 return NULL;
c906108c 4135 }
d9311bfa 4136 return new_buf;
c906108c
SS
4137}
4138
d9311bfa
AT
4139/* An IT block is at most the 2-byte IT instruction followed by
4140 four 4-byte instructions. The furthest back we must search to
4141 find an IT block that affects the current instruction is thus
4142 2 + 3 * 4 == 14 bytes. */
4143#define MAX_IT_BLOCK_PREFIX 14
177321bd 4144
d9311bfa
AT
4145/* Use a quick scan if there are more than this many bytes of
4146 code. */
4147#define IT_SCAN_THRESHOLD 32
177321bd 4148
d9311bfa
AT
4149/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4150 A breakpoint in an IT block may not be hit, depending on the
4151 condition flags. */
ad527d2e 4152static CORE_ADDR
d9311bfa 4153arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
c906108c 4154{
d9311bfa
AT
4155 gdb_byte *buf;
4156 char map_type;
4157 CORE_ADDR boundary, func_start;
4158 int buf_len;
4159 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4160 int i, any, last_it, last_it_count;
177321bd 4161
d9311bfa
AT
4162 /* If we are using BKPT breakpoints, none of this is necessary. */
4163 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4164 return bpaddr;
177321bd 4165
d9311bfa
AT
4166 /* ARM mode does not have this problem. */
4167 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4168 return bpaddr;
177321bd 4169
d9311bfa
AT
4170 /* We are setting a breakpoint in Thumb code that could potentially
4171 contain an IT block. The first step is to find how much Thumb
4172 code there is; we do not need to read outside of known Thumb
4173 sequences. */
4174 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4175 if (map_type == 0)
4176 /* Thumb-2 code must have mapping symbols to have a chance. */
4177 return bpaddr;
9dca5578 4178
d9311bfa 4179 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
177321bd 4180
d9311bfa
AT
4181 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4182 && func_start > boundary)
4183 boundary = func_start;
9dca5578 4184
d9311bfa
AT
4185 /* Search for a candidate IT instruction. We have to do some fancy
4186 footwork to distinguish a real IT instruction from the second
4187 half of a 32-bit instruction, but there is no need for that if
4188 there's no candidate. */
4189 buf_len = min (bpaddr - boundary, MAX_IT_BLOCK_PREFIX);
4190 if (buf_len == 0)
4191 /* No room for an IT instruction. */
4192 return bpaddr;
c906108c 4193
d9311bfa
AT
4194 buf = (gdb_byte *) xmalloc (buf_len);
4195 if (target_read_memory (bpaddr - buf_len, buf, buf_len) != 0)
4196 return bpaddr;
4197 any = 0;
4198 for (i = 0; i < buf_len; i += 2)
c906108c 4199 {
d9311bfa
AT
4200 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4201 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
25b41d01 4202 {
d9311bfa
AT
4203 any = 1;
4204 break;
25b41d01 4205 }
c906108c 4206 }
d9311bfa
AT
4207
4208 if (any == 0)
c906108c 4209 {
d9311bfa
AT
4210 xfree (buf);
4211 return bpaddr;
f9d67f43
DJ
4212 }
4213
4214 /* OK, the code bytes before this instruction contain at least one
4215 halfword which resembles an IT instruction. We know that it's
4216 Thumb code, but there are still two possibilities. Either the
4217 halfword really is an IT instruction, or it is the second half of
4218 a 32-bit Thumb instruction. The only way we can tell is to
4219 scan forwards from a known instruction boundary. */
4220 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4221 {
4222 int definite;
4223
4224 /* There's a lot of code before this instruction. Start with an
4225 optimistic search; it's easy to recognize halfwords that can
4226 not be the start of a 32-bit instruction, and use that to
4227 lock on to the instruction boundaries. */
4228 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4229 if (buf == NULL)
4230 return bpaddr;
4231 buf_len = IT_SCAN_THRESHOLD;
4232
4233 definite = 0;
4234 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4235 {
4236 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4237 if (thumb_insn_size (inst1) == 2)
4238 {
4239 definite = 1;
4240 break;
4241 }
4242 }
4243
4244 /* At this point, if DEFINITE, BUF[I] is the first place we
4245 are sure that we know the instruction boundaries, and it is far
4246 enough from BPADDR that we could not miss an IT instruction
4247 affecting BPADDR. If ! DEFINITE, give up - start from a
4248 known boundary. */
4249 if (! definite)
4250 {
0963b4bd
MS
4251 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4252 bpaddr - boundary);
f9d67f43
DJ
4253 if (buf == NULL)
4254 return bpaddr;
4255 buf_len = bpaddr - boundary;
4256 i = 0;
4257 }
4258 }
4259 else
4260 {
4261 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4262 if (buf == NULL)
4263 return bpaddr;
4264 buf_len = bpaddr - boundary;
4265 i = 0;
4266 }
4267
4268 /* Scan forwards. Find the last IT instruction before BPADDR. */
4269 last_it = -1;
4270 last_it_count = 0;
4271 while (i < buf_len)
4272 {
4273 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4274 last_it_count--;
4275 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4276 {
4277 last_it = i;
4278 if (inst1 & 0x0001)
4279 last_it_count = 4;
4280 else if (inst1 & 0x0002)
4281 last_it_count = 3;
4282 else if (inst1 & 0x0004)
4283 last_it_count = 2;
4284 else
4285 last_it_count = 1;
4286 }
4287 i += thumb_insn_size (inst1);
4288 }
4289
4290 xfree (buf);
4291
4292 if (last_it == -1)
4293 /* There wasn't really an IT instruction after all. */
4294 return bpaddr;
4295
4296 if (last_it_count < 1)
4297 /* It was too far away. */
4298 return bpaddr;
4299
4300 /* This really is a trouble spot. Move the breakpoint to the IT
4301 instruction. */
4302 return bpaddr - buf_len + last_it;
4303}
4304
cca44b1b 4305/* ARM displaced stepping support.
c906108c 4306
cca44b1b 4307 Generally ARM displaced stepping works as follows:
c906108c 4308
cca44b1b 4309 1. When an instruction is to be single-stepped, it is first decoded by
2ba163c8
SM
4310 arm_process_displaced_insn. Depending on the type of instruction, it is
4311 then copied to a scratch location, possibly in a modified form. The
4312 copy_* set of functions performs such modification, as necessary. A
4313 breakpoint is placed after the modified instruction in the scratch space
4314 to return control to GDB. Note in particular that instructions which
4315 modify the PC will no longer do so after modification.
c5aa993b 4316
cca44b1b
JB
4317 2. The instruction is single-stepped, by setting the PC to the scratch
4318 location address, and resuming. Control returns to GDB when the
4319 breakpoint is hit.
c5aa993b 4320
cca44b1b
JB
4321 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4322 function used for the current instruction. This function's job is to
4323 put the CPU/memory state back to what it would have been if the
4324 instruction had been executed unmodified in its original location. */
c5aa993b 4325
cca44b1b
JB
4326/* NOP instruction (mov r0, r0). */
4327#define ARM_NOP 0xe1a00000
34518530 4328#define THUMB_NOP 0x4600
cca44b1b
JB
4329
4330/* Helper for register reads for displaced stepping. In particular, this
4331 returns the PC as it would be seen by the instruction at its original
4332 location. */
4333
4334ULONGEST
36073a92
YQ
4335displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4336 int regno)
cca44b1b
JB
4337{
4338 ULONGEST ret;
36073a92 4339 CORE_ADDR from = dsc->insn_addr;
cca44b1b 4340
bf9f652a 4341 if (regno == ARM_PC_REGNUM)
cca44b1b 4342 {
4db71c0b
YQ
4343 /* Compute pipeline offset:
4344 - When executing an ARM instruction, PC reads as the address of the
4345 current instruction plus 8.
4346 - When executing a Thumb instruction, PC reads as the address of the
4347 current instruction plus 4. */
4348
36073a92 4349 if (!dsc->is_thumb)
4db71c0b
YQ
4350 from += 8;
4351 else
4352 from += 4;
4353
cca44b1b
JB
4354 if (debug_displaced)
4355 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
4356 (unsigned long) from);
4357 return (ULONGEST) from;
cca44b1b 4358 }
c906108c 4359 else
cca44b1b
JB
4360 {
4361 regcache_cooked_read_unsigned (regs, regno, &ret);
4362 if (debug_displaced)
4363 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4364 regno, (unsigned long) ret);
4365 return ret;
4366 }
c906108c
SS
4367}
4368
cca44b1b
JB
4369static int
4370displaced_in_arm_mode (struct regcache *regs)
4371{
4372 ULONGEST ps;
9779414d 4373 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
66e810cd 4374
cca44b1b 4375 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 4376
9779414d 4377 return (ps & t_bit) == 0;
cca44b1b 4378}
66e810cd 4379
cca44b1b 4380/* Write to the PC as from a branch instruction. */
c906108c 4381
cca44b1b 4382static void
36073a92
YQ
4383branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4384 ULONGEST val)
c906108c 4385{
36073a92 4386 if (!dsc->is_thumb)
cca44b1b
JB
4387 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4388 architecture versions < 6. */
0963b4bd
MS
4389 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4390 val & ~(ULONGEST) 0x3);
cca44b1b 4391 else
0963b4bd
MS
4392 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4393 val & ~(ULONGEST) 0x1);
cca44b1b 4394}
66e810cd 4395
cca44b1b
JB
4396/* Write to the PC as from a branch-exchange instruction. */
4397
4398static void
4399bx_write_pc (struct regcache *regs, ULONGEST val)
4400{
4401 ULONGEST ps;
9779414d 4402 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
cca44b1b
JB
4403
4404 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4405
4406 if ((val & 1) == 1)
c906108c 4407 {
9779414d 4408 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
4409 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4410 }
4411 else if ((val & 2) == 0)
4412 {
9779414d 4413 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4414 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
4415 }
4416 else
4417 {
cca44b1b
JB
4418 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4419 mode, align dest to 4 bytes). */
4420 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 4421 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4422 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
4423 }
4424}
ed9a39eb 4425
cca44b1b 4426/* Write to the PC as if from a load instruction. */
ed9a39eb 4427
34e8f22d 4428static void
36073a92
YQ
4429load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4430 ULONGEST val)
ed9a39eb 4431{
cca44b1b
JB
4432 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4433 bx_write_pc (regs, val);
4434 else
36073a92 4435 branch_write_pc (regs, dsc, val);
cca44b1b 4436}
be8626e0 4437
cca44b1b
JB
4438/* Write to the PC as if from an ALU instruction. */
4439
4440static void
36073a92
YQ
4441alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4442 ULONGEST val)
cca44b1b 4443{
36073a92 4444 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
4445 bx_write_pc (regs, val);
4446 else
36073a92 4447 branch_write_pc (regs, dsc, val);
cca44b1b
JB
4448}
4449
4450/* Helper for writing to registers for displaced stepping. Writing to the PC
4451 has a varying effects depending on the instruction which does the write:
4452 this is controlled by the WRITE_PC argument. */
4453
4454void
4455displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4456 int regno, ULONGEST val, enum pc_write_style write_pc)
4457{
bf9f652a 4458 if (regno == ARM_PC_REGNUM)
08216dd7 4459 {
cca44b1b
JB
4460 if (debug_displaced)
4461 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4462 (unsigned long) val);
4463 switch (write_pc)
08216dd7 4464 {
cca44b1b 4465 case BRANCH_WRITE_PC:
36073a92 4466 branch_write_pc (regs, dsc, val);
08216dd7
RE
4467 break;
4468
cca44b1b
JB
4469 case BX_WRITE_PC:
4470 bx_write_pc (regs, val);
4471 break;
4472
4473 case LOAD_WRITE_PC:
36073a92 4474 load_write_pc (regs, dsc, val);
cca44b1b
JB
4475 break;
4476
4477 case ALU_WRITE_PC:
36073a92 4478 alu_write_pc (regs, dsc, val);
cca44b1b
JB
4479 break;
4480
4481 case CANNOT_WRITE_PC:
4482 warning (_("Instruction wrote to PC in an unexpected way when "
4483 "single-stepping"));
08216dd7
RE
4484 break;
4485
4486 default:
97b9747c
JB
4487 internal_error (__FILE__, __LINE__,
4488 _("Invalid argument to displaced_write_reg"));
08216dd7 4489 }
b508a996 4490
cca44b1b 4491 dsc->wrote_to_pc = 1;
b508a996 4492 }
ed9a39eb 4493 else
b508a996 4494 {
cca44b1b
JB
4495 if (debug_displaced)
4496 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4497 regno, (unsigned long) val);
4498 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 4499 }
34e8f22d
RE
4500}
4501
cca44b1b
JB
4502/* This function is used to concisely determine if an instruction INSN
4503 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
4504 corresponding fields of BITMASK set to 0b1111. The function
4505 returns return 1 if any of these fields in INSN reference the PC
4506 (also 0b1111, r15), else it returns 0. */
67255d04
RE
4507
4508static int
cca44b1b 4509insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 4510{
cca44b1b 4511 uint32_t lowbit = 1;
67255d04 4512
cca44b1b
JB
4513 while (bitmask != 0)
4514 {
4515 uint32_t mask;
44e1a9eb 4516
cca44b1b
JB
4517 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4518 ;
67255d04 4519
cca44b1b
JB
4520 if (!lowbit)
4521 break;
67255d04 4522
cca44b1b 4523 mask = lowbit * 0xf;
67255d04 4524
cca44b1b
JB
4525 if ((insn & mask) == mask)
4526 return 1;
4527
4528 bitmask &= ~mask;
67255d04
RE
4529 }
4530
cca44b1b
JB
4531 return 0;
4532}
2af48f68 4533
cca44b1b
JB
4534/* The simplest copy function. Many instructions have the same effect no
4535 matter what address they are executed at: in those cases, use this. */
67255d04 4536
cca44b1b 4537static int
7ff120b4
YQ
4538arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
4539 const char *iname, struct displaced_step_closure *dsc)
cca44b1b
JB
4540{
4541 if (debug_displaced)
4542 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4543 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4544 iname);
67255d04 4545
cca44b1b 4546 dsc->modinsn[0] = insn;
67255d04 4547
cca44b1b
JB
4548 return 0;
4549}
4550
34518530
YQ
4551static int
4552thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4553 uint16_t insn2, const char *iname,
4554 struct displaced_step_closure *dsc)
4555{
4556 if (debug_displaced)
4557 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4558 "opcode/class '%s' unmodified\n", insn1, insn2,
4559 iname);
4560
4561 dsc->modinsn[0] = insn1;
4562 dsc->modinsn[1] = insn2;
4563 dsc->numinsns = 2;
4564
4565 return 0;
4566}
4567
4568/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4569 modification. */
4570static int
615234c1 4571thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
34518530
YQ
4572 const char *iname,
4573 struct displaced_step_closure *dsc)
4574{
4575 if (debug_displaced)
4576 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4577 "opcode/class '%s' unmodified\n", insn,
4578 iname);
4579
4580 dsc->modinsn[0] = insn;
4581
4582 return 0;
4583}
4584
cca44b1b
JB
4585/* Preload instructions with immediate offset. */
4586
4587static void
6e39997a 4588cleanup_preload (struct gdbarch *gdbarch,
cca44b1b
JB
4589 struct regcache *regs, struct displaced_step_closure *dsc)
4590{
4591 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4592 if (!dsc->u.preload.immed)
4593 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4594}
4595
7ff120b4
YQ
4596static void
4597install_preload (struct gdbarch *gdbarch, struct regcache *regs,
4598 struct displaced_step_closure *dsc, unsigned int rn)
cca44b1b 4599{
cca44b1b 4600 ULONGEST rn_val;
cca44b1b
JB
4601 /* Preload instructions:
4602
4603 {pli/pld} [rn, #+/-imm]
4604 ->
4605 {pli/pld} [r0, #+/-imm]. */
4606
36073a92
YQ
4607 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4608 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 4609 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
4610 dsc->u.preload.immed = 1;
4611
cca44b1b 4612 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
4613}
4614
cca44b1b 4615static int
7ff120b4 4616arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cca44b1b
JB
4617 struct displaced_step_closure *dsc)
4618{
4619 unsigned int rn = bits (insn, 16, 19);
cca44b1b 4620
7ff120b4
YQ
4621 if (!insn_references_pc (insn, 0x000f0000ul))
4622 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
4623
4624 if (debug_displaced)
4625 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4626 (unsigned long) insn);
4627
7ff120b4
YQ
4628 dsc->modinsn[0] = insn & 0xfff0ffff;
4629
4630 install_preload (gdbarch, regs, dsc, rn);
4631
4632 return 0;
4633}
4634
34518530
YQ
4635static int
4636thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
4637 struct regcache *regs, struct displaced_step_closure *dsc)
4638{
4639 unsigned int rn = bits (insn1, 0, 3);
4640 unsigned int u_bit = bit (insn1, 7);
4641 int imm12 = bits (insn2, 0, 11);
4642 ULONGEST pc_val;
4643
4644 if (rn != ARM_PC_REGNUM)
4645 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4646
4647 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4648 PLD (literal) Encoding T1. */
4649 if (debug_displaced)
4650 fprintf_unfiltered (gdb_stdlog,
4651 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4652 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4653 imm12);
4654
4655 if (!u_bit)
4656 imm12 = -1 * imm12;
4657
4658 /* Rewrite instruction {pli/pld} PC imm12 into:
4659 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4660
4661 {pli/pld} [r0, r1]
4662
4663 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4664
4665 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4666 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4667
4668 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4669
4670 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4671 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4672 dsc->u.preload.immed = 0;
4673
4674 /* {pli/pld} [r0, r1] */
4675 dsc->modinsn[0] = insn1 & 0xfff0;
4676 dsc->modinsn[1] = 0xf001;
4677 dsc->numinsns = 2;
4678
4679 dsc->cleanup = &cleanup_preload;
4680 return 0;
4681}
4682
7ff120b4
YQ
4683/* Preload instructions with register offset. */
4684
4685static void
4686install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
4687 struct displaced_step_closure *dsc, unsigned int rn,
4688 unsigned int rm)
4689{
4690 ULONGEST rn_val, rm_val;
4691
cca44b1b
JB
4692 /* Preload register-offset instructions:
4693
4694 {pli/pld} [rn, rm {, shift}]
4695 ->
4696 {pli/pld} [r0, r1 {, shift}]. */
4697
36073a92
YQ
4698 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4699 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4700 rn_val = displaced_read_reg (regs, dsc, rn);
4701 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
4702 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4703 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
4704 dsc->u.preload.immed = 0;
4705
cca44b1b 4706 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
4707}
4708
4709static int
4710arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4711 struct regcache *regs,
4712 struct displaced_step_closure *dsc)
4713{
4714 unsigned int rn = bits (insn, 16, 19);
4715 unsigned int rm = bits (insn, 0, 3);
4716
4717
4718 if (!insn_references_pc (insn, 0x000f000ful))
4719 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4720
4721 if (debug_displaced)
4722 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4723 (unsigned long) insn);
4724
4725 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 4726
7ff120b4 4727 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
4728 return 0;
4729}
4730
4731/* Copy/cleanup coprocessor load and store instructions. */
4732
4733static void
6e39997a 4734cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b
JB
4735 struct regcache *regs,
4736 struct displaced_step_closure *dsc)
4737{
36073a92 4738 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
4739
4740 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4741
4742 if (dsc->u.ldst.writeback)
4743 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4744}
4745
7ff120b4
YQ
4746static void
4747install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
4748 struct displaced_step_closure *dsc,
4749 int writeback, unsigned int rn)
cca44b1b 4750{
cca44b1b 4751 ULONGEST rn_val;
cca44b1b 4752
cca44b1b
JB
4753 /* Coprocessor load/store instructions:
4754
4755 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4756 ->
4757 {stc/stc2} [r0, #+/-imm].
4758
4759 ldc/ldc2 are handled identically. */
4760
36073a92
YQ
4761 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4762 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
4763 /* PC should be 4-byte aligned. */
4764 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
4765 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4766
7ff120b4 4767 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
4768 dsc->u.ldst.rn = rn;
4769
7ff120b4
YQ
4770 dsc->cleanup = &cleanup_copro_load_store;
4771}
4772
4773static int
4774arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4775 struct regcache *regs,
4776 struct displaced_step_closure *dsc)
4777{
4778 unsigned int rn = bits (insn, 16, 19);
4779
4780 if (!insn_references_pc (insn, 0x000f0000ul))
4781 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4782
4783 if (debug_displaced)
4784 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4785 "load/store insn %.8lx\n", (unsigned long) insn);
4786
cca44b1b
JB
4787 dsc->modinsn[0] = insn & 0xfff0ffff;
4788
7ff120b4 4789 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
4790
4791 return 0;
4792}
4793
34518530
YQ
4794static int
4795thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4796 uint16_t insn2, struct regcache *regs,
4797 struct displaced_step_closure *dsc)
4798{
4799 unsigned int rn = bits (insn1, 0, 3);
4800
4801 if (rn != ARM_PC_REGNUM)
4802 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4803 "copro load/store", dsc);
4804
4805 if (debug_displaced)
4806 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4807 "load/store insn %.4x%.4x\n", insn1, insn2);
4808
4809 dsc->modinsn[0] = insn1 & 0xfff0;
4810 dsc->modinsn[1] = insn2;
4811 dsc->numinsns = 2;
4812
4813 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4814 doesn't support writeback, so pass 0. */
4815 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4816
4817 return 0;
4818}
4819
cca44b1b
JB
4820/* Clean up branch instructions (actually perform the branch, by setting
4821 PC). */
4822
4823static void
6e39997a 4824cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
4825 struct displaced_step_closure *dsc)
4826{
36073a92 4827 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
4828 int branch_taken = condition_true (dsc->u.branch.cond, status);
4829 enum pc_write_style write_pc = dsc->u.branch.exchange
4830 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4831
4832 if (!branch_taken)
4833 return;
4834
4835 if (dsc->u.branch.link)
4836 {
8c8dba6d
YQ
4837 /* The value of LR should be the next insn of current one. In order
4838 not to confuse logic hanlding later insn `bx lr', if current insn mode
4839 is Thumb, the bit 0 of LR value should be set to 1. */
4840 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4841
4842 if (dsc->is_thumb)
4843 next_insn_addr |= 0x1;
4844
4845 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4846 CANNOT_WRITE_PC);
cca44b1b
JB
4847 }
4848
bf9f652a 4849 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
4850}
4851
4852/* Copy B/BL/BLX instructions with immediate destinations. */
4853
7ff120b4
YQ
4854static void
4855install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
4856 struct displaced_step_closure *dsc,
4857 unsigned int cond, int exchange, int link, long offset)
4858{
4859 /* Implement "BL<cond> <label>" as:
4860
4861 Preparation: cond <- instruction condition
4862 Insn: mov r0, r0 (nop)
4863 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4864
4865 B<cond> similar, but don't set r14 in cleanup. */
4866
4867 dsc->u.branch.cond = cond;
4868 dsc->u.branch.link = link;
4869 dsc->u.branch.exchange = exchange;
4870
2b16b2e3
YQ
4871 dsc->u.branch.dest = dsc->insn_addr;
4872 if (link && exchange)
4873 /* For BLX, offset is computed from the Align (PC, 4). */
4874 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4875
7ff120b4 4876 if (dsc->is_thumb)
2b16b2e3 4877 dsc->u.branch.dest += 4 + offset;
7ff120b4 4878 else
2b16b2e3 4879 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
4880
4881 dsc->cleanup = &cleanup_branch;
4882}
cca44b1b 4883static int
7ff120b4
YQ
4884arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
4885 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
4886{
4887 unsigned int cond = bits (insn, 28, 31);
4888 int exchange = (cond == 0xf);
4889 int link = exchange || bit (insn, 24);
cca44b1b
JB
4890 long offset;
4891
4892 if (debug_displaced)
4893 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4894 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4895 (unsigned long) insn);
cca44b1b
JB
4896 if (exchange)
4897 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4898 then arrange the switch into Thumb mode. */
4899 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4900 else
4901 offset = bits (insn, 0, 23) << 2;
4902
4903 if (bit (offset, 25))
4904 offset = offset | ~0x3ffffff;
4905
cca44b1b
JB
4906 dsc->modinsn[0] = ARM_NOP;
4907
7ff120b4 4908 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
4909 return 0;
4910}
4911
34518530
YQ
4912static int
4913thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4914 uint16_t insn2, struct regcache *regs,
4915 struct displaced_step_closure *dsc)
4916{
4917 int link = bit (insn2, 14);
4918 int exchange = link && !bit (insn2, 12);
4919 int cond = INST_AL;
4920 long offset = 0;
4921 int j1 = bit (insn2, 13);
4922 int j2 = bit (insn2, 11);
4923 int s = sbits (insn1, 10, 10);
4924 int i1 = !(j1 ^ bit (insn1, 10));
4925 int i2 = !(j2 ^ bit (insn1, 10));
4926
4927 if (!link && !exchange) /* B */
4928 {
4929 offset = (bits (insn2, 0, 10) << 1);
4930 if (bit (insn2, 12)) /* Encoding T4 */
4931 {
4932 offset |= (bits (insn1, 0, 9) << 12)
4933 | (i2 << 22)
4934 | (i1 << 23)
4935 | (s << 24);
4936 cond = INST_AL;
4937 }
4938 else /* Encoding T3 */
4939 {
4940 offset |= (bits (insn1, 0, 5) << 12)
4941 | (j1 << 18)
4942 | (j2 << 19)
4943 | (s << 20);
4944 cond = bits (insn1, 6, 9);
4945 }
4946 }
4947 else
4948 {
4949 offset = (bits (insn1, 0, 9) << 12);
4950 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
4951 offset |= exchange ?
4952 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
4953 }
4954
4955 if (debug_displaced)
4956 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
4957 "%.4x %.4x with offset %.8lx\n",
4958 link ? (exchange) ? "blx" : "bl" : "b",
4959 insn1, insn2, offset);
4960
4961 dsc->modinsn[0] = THUMB_NOP;
4962
4963 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4964 return 0;
4965}
4966
4967/* Copy B Thumb instructions. */
4968static int
615234c1 4969thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
34518530
YQ
4970 struct displaced_step_closure *dsc)
4971{
4972 unsigned int cond = 0;
4973 int offset = 0;
4974 unsigned short bit_12_15 = bits (insn, 12, 15);
4975 CORE_ADDR from = dsc->insn_addr;
4976
4977 if (bit_12_15 == 0xd)
4978 {
4979 /* offset = SignExtend (imm8:0, 32) */
4980 offset = sbits ((insn << 1), 0, 8);
4981 cond = bits (insn, 8, 11);
4982 }
4983 else if (bit_12_15 == 0xe) /* Encoding T2 */
4984 {
4985 offset = sbits ((insn << 1), 0, 11);
4986 cond = INST_AL;
4987 }
4988
4989 if (debug_displaced)
4990 fprintf_unfiltered (gdb_stdlog,
4991 "displaced: copying b immediate insn %.4x "
4992 "with offset %d\n", insn, offset);
4993
4994 dsc->u.branch.cond = cond;
4995 dsc->u.branch.link = 0;
4996 dsc->u.branch.exchange = 0;
4997 dsc->u.branch.dest = from + 4 + offset;
4998
4999 dsc->modinsn[0] = THUMB_NOP;
5000
5001 dsc->cleanup = &cleanup_branch;
5002
5003 return 0;
5004}
5005
cca44b1b
JB
5006/* Copy BX/BLX with register-specified destinations. */
5007
7ff120b4
YQ
5008static void
5009install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
5010 struct displaced_step_closure *dsc, int link,
5011 unsigned int cond, unsigned int rm)
cca44b1b 5012{
cca44b1b
JB
5013 /* Implement {BX,BLX}<cond> <reg>" as:
5014
5015 Preparation: cond <- instruction condition
5016 Insn: mov r0, r0 (nop)
5017 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5018
5019 Don't set r14 in cleanup for BX. */
5020
36073a92 5021 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5022
5023 dsc->u.branch.cond = cond;
5024 dsc->u.branch.link = link;
cca44b1b 5025
7ff120b4 5026 dsc->u.branch.exchange = 1;
cca44b1b
JB
5027
5028 dsc->cleanup = &cleanup_branch;
7ff120b4 5029}
cca44b1b 5030
7ff120b4
YQ
5031static int
5032arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
5033 struct regcache *regs, struct displaced_step_closure *dsc)
5034{
5035 unsigned int cond = bits (insn, 28, 31);
5036 /* BX: x12xxx1x
5037 BLX: x12xxx3x. */
5038 int link = bit (insn, 5);
5039 unsigned int rm = bits (insn, 0, 3);
5040
5041 if (debug_displaced)
5042 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5043 (unsigned long) insn);
5044
5045 dsc->modinsn[0] = ARM_NOP;
5046
5047 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
5048 return 0;
5049}
5050
34518530
YQ
5051static int
5052thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5053 struct regcache *regs,
5054 struct displaced_step_closure *dsc)
5055{
5056 int link = bit (insn, 7);
5057 unsigned int rm = bits (insn, 3, 6);
5058
5059 if (debug_displaced)
5060 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5061 (unsigned short) insn);
5062
5063 dsc->modinsn[0] = THUMB_NOP;
5064
5065 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5066
5067 return 0;
5068}
5069
5070
0963b4bd 5071/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
5072
5073static void
6e39997a 5074cleanup_alu_imm (struct gdbarch *gdbarch,
cca44b1b
JB
5075 struct regcache *regs, struct displaced_step_closure *dsc)
5076{
36073a92 5077 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5078 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5079 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5080 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5081}
5082
5083static int
7ff120b4
YQ
5084arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5085 struct displaced_step_closure *dsc)
cca44b1b
JB
5086{
5087 unsigned int rn = bits (insn, 16, 19);
5088 unsigned int rd = bits (insn, 12, 15);
5089 unsigned int op = bits (insn, 21, 24);
5090 int is_mov = (op == 0xd);
5091 ULONGEST rd_val, rn_val;
cca44b1b
JB
5092
5093 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 5094 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
5095
5096 if (debug_displaced)
5097 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5098 "%.8lx\n", is_mov ? "move" : "ALU",
5099 (unsigned long) insn);
5100
5101 /* Instruction is of form:
5102
5103 <op><cond> rd, [rn,] #imm
5104
5105 Rewrite as:
5106
5107 Preparation: tmp1, tmp2 <- r0, r1;
5108 r0, r1 <- rd, rn
5109 Insn: <op><cond> r0, r1, #imm
5110 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5111 */
5112
36073a92
YQ
5113 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5114 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5115 rn_val = displaced_read_reg (regs, dsc, rn);
5116 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
5117 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5118 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5119 dsc->rd = rd;
5120
5121 if (is_mov)
5122 dsc->modinsn[0] = insn & 0xfff00fff;
5123 else
5124 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5125
5126 dsc->cleanup = &cleanup_alu_imm;
5127
5128 return 0;
5129}
5130
34518530
YQ
5131static int
5132thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5133 uint16_t insn2, struct regcache *regs,
5134 struct displaced_step_closure *dsc)
5135{
5136 unsigned int op = bits (insn1, 5, 8);
5137 unsigned int rn, rm, rd;
5138 ULONGEST rd_val, rn_val;
5139
5140 rn = bits (insn1, 0, 3); /* Rn */
5141 rm = bits (insn2, 0, 3); /* Rm */
5142 rd = bits (insn2, 8, 11); /* Rd */
5143
5144 /* This routine is only called for instruction MOV. */
5145 gdb_assert (op == 0x2 && rn == 0xf);
5146
5147 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5148 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5149
5150 if (debug_displaced)
5151 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5152 "ALU", insn1, insn2);
5153
5154 /* Instruction is of form:
5155
5156 <op><cond> rd, [rn,] #imm
5157
5158 Rewrite as:
5159
5160 Preparation: tmp1, tmp2 <- r0, r1;
5161 r0, r1 <- rd, rn
5162 Insn: <op><cond> r0, r1, #imm
5163 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5164 */
5165
5166 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5167 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5168 rn_val = displaced_read_reg (regs, dsc, rn);
5169 rd_val = displaced_read_reg (regs, dsc, rd);
5170 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5171 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5172 dsc->rd = rd;
5173
5174 dsc->modinsn[0] = insn1;
5175 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5176 dsc->numinsns = 2;
5177
5178 dsc->cleanup = &cleanup_alu_imm;
5179
5180 return 0;
5181}
5182
cca44b1b
JB
5183/* Copy/cleanup arithmetic/logic insns with register RHS. */
5184
5185static void
6e39997a 5186cleanup_alu_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5187 struct regcache *regs, struct displaced_step_closure *dsc)
5188{
5189 ULONGEST rd_val;
5190 int i;
5191
36073a92 5192 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5193
5194 for (i = 0; i < 3; i++)
5195 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5196
5197 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5198}
5199
7ff120b4
YQ
5200static void
5201install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
5202 struct displaced_step_closure *dsc,
5203 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 5204{
cca44b1b 5205 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 5206
cca44b1b
JB
5207 /* Instruction is of form:
5208
5209 <op><cond> rd, [rn,] rm [, <shift>]
5210
5211 Rewrite as:
5212
5213 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5214 r0, r1, r2 <- rd, rn, rm
ef713951 5215 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
5216 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5217 */
5218
36073a92
YQ
5219 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5220 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5221 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5222 rd_val = displaced_read_reg (regs, dsc, rd);
5223 rn_val = displaced_read_reg (regs, dsc, rn);
5224 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5225 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5226 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5227 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5228 dsc->rd = rd;
5229
7ff120b4
YQ
5230 dsc->cleanup = &cleanup_alu_reg;
5231}
5232
5233static int
5234arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5235 struct displaced_step_closure *dsc)
5236{
5237 unsigned int op = bits (insn, 21, 24);
5238 int is_mov = (op == 0xd);
5239
5240 if (!insn_references_pc (insn, 0x000ff00ful))
5241 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5242
5243 if (debug_displaced)
5244 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5245 is_mov ? "move" : "ALU", (unsigned long) insn);
5246
cca44b1b
JB
5247 if (is_mov)
5248 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5249 else
5250 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5251
7ff120b4
YQ
5252 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5253 bits (insn, 0, 3));
cca44b1b
JB
5254 return 0;
5255}
5256
34518530
YQ
5257static int
5258thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5259 struct regcache *regs,
5260 struct displaced_step_closure *dsc)
5261{
ef713951 5262 unsigned rm, rd;
34518530 5263
ef713951
YQ
5264 rm = bits (insn, 3, 6);
5265 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 5266
ef713951 5267 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
5268 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5269
5270 if (debug_displaced)
ef713951
YQ
5271 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5272 (unsigned short) insn);
34518530 5273
ef713951 5274 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 5275
ef713951 5276 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
5277
5278 return 0;
5279}
5280
cca44b1b
JB
5281/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5282
5283static void
6e39997a 5284cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5285 struct regcache *regs,
5286 struct displaced_step_closure *dsc)
5287{
36073a92 5288 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5289 int i;
5290
5291 for (i = 0; i < 4; i++)
5292 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5293
5294 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5295}
5296
7ff120b4
YQ
5297static void
5298install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
5299 struct displaced_step_closure *dsc,
5300 unsigned int rd, unsigned int rn, unsigned int rm,
5301 unsigned rs)
cca44b1b 5302{
7ff120b4 5303 int i;
cca44b1b 5304 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 5305
cca44b1b
JB
5306 /* Instruction is of form:
5307
5308 <op><cond> rd, [rn,] rm, <shift> rs
5309
5310 Rewrite as:
5311
5312 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5313 r0, r1, r2, r3 <- rd, rn, rm, rs
5314 Insn: <op><cond> r0, r1, r2, <shift> r3
5315 Cleanup: tmp5 <- r0
5316 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5317 rd <- tmp5
5318 */
5319
5320 for (i = 0; i < 4; i++)
36073a92 5321 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 5322
36073a92
YQ
5323 rd_val = displaced_read_reg (regs, dsc, rd);
5324 rn_val = displaced_read_reg (regs, dsc, rn);
5325 rm_val = displaced_read_reg (regs, dsc, rm);
5326 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
5327 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5328 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5329 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5330 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5331 dsc->rd = rd;
7ff120b4
YQ
5332 dsc->cleanup = &cleanup_alu_shifted_reg;
5333}
5334
5335static int
5336arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5337 struct regcache *regs,
5338 struct displaced_step_closure *dsc)
5339{
5340 unsigned int op = bits (insn, 21, 24);
5341 int is_mov = (op == 0xd);
5342 unsigned int rd, rn, rm, rs;
5343
5344 if (!insn_references_pc (insn, 0x000fff0ful))
5345 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5346
5347 if (debug_displaced)
5348 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5349 "%.8lx\n", is_mov ? "move" : "ALU",
5350 (unsigned long) insn);
5351
5352 rn = bits (insn, 16, 19);
5353 rm = bits (insn, 0, 3);
5354 rs = bits (insn, 8, 11);
5355 rd = bits (insn, 12, 15);
cca44b1b
JB
5356
5357 if (is_mov)
5358 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5359 else
5360 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5361
7ff120b4 5362 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
5363
5364 return 0;
5365}
5366
5367/* Clean up load instructions. */
5368
5369static void
6e39997a 5370cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5371 struct displaced_step_closure *dsc)
5372{
5373 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 5374
36073a92 5375 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 5376 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
5377 rt_val2 = displaced_read_reg (regs, dsc, 1);
5378 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5379
5380 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5381 if (dsc->u.ldst.xfersize > 4)
5382 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5383 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5384 if (!dsc->u.ldst.immed)
5385 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5386
5387 /* Handle register writeback. */
5388 if (dsc->u.ldst.writeback)
5389 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5390 /* Put result in right place. */
5391 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5392 if (dsc->u.ldst.xfersize == 8)
5393 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5394}
5395
5396/* Clean up store instructions. */
5397
5398static void
6e39997a 5399cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5400 struct displaced_step_closure *dsc)
5401{
36073a92 5402 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5403
5404 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5405 if (dsc->u.ldst.xfersize > 4)
5406 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5407 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5408 if (!dsc->u.ldst.immed)
5409 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5410 if (!dsc->u.ldst.restore_r4)
5411 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5412
5413 /* Writeback. */
5414 if (dsc->u.ldst.writeback)
5415 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5416}
5417
5418/* Copy "extra" load/store instructions. These are halfword/doubleword
5419 transfers, which have a different encoding to byte/word transfers. */
5420
5421static int
550dc4e2 5422arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
7ff120b4 5423 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
5424{
5425 unsigned int op1 = bits (insn, 20, 24);
5426 unsigned int op2 = bits (insn, 5, 6);
5427 unsigned int rt = bits (insn, 12, 15);
5428 unsigned int rn = bits (insn, 16, 19);
5429 unsigned int rm = bits (insn, 0, 3);
5430 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5431 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5432 int immed = (op1 & 0x4) != 0;
5433 int opcode;
5434 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
5435
5436 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 5437 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
5438
5439 if (debug_displaced)
5440 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
550dc4e2 5441 "insn %.8lx\n", unprivileged ? "unprivileged " : "",
cca44b1b
JB
5442 (unsigned long) insn);
5443
5444 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5445
5446 if (opcode < 0)
5447 internal_error (__FILE__, __LINE__,
5448 _("copy_extra_ld_st: instruction decode error"));
5449
36073a92
YQ
5450 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5451 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5452 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5453 if (!immed)
36073a92 5454 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5455
36073a92 5456 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 5457 if (bytesize[opcode] == 8)
36073a92
YQ
5458 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5459 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5460 if (!immed)
36073a92 5461 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5462
5463 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5464 if (bytesize[opcode] == 8)
5465 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5466 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5467 if (!immed)
5468 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5469
5470 dsc->rd = rt;
5471 dsc->u.ldst.xfersize = bytesize[opcode];
5472 dsc->u.ldst.rn = rn;
5473 dsc->u.ldst.immed = immed;
5474 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5475 dsc->u.ldst.restore_r4 = 0;
5476
5477 if (immed)
5478 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5479 ->
5480 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5481 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5482 else
5483 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5484 ->
5485 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5486 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5487
5488 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5489
5490 return 0;
5491}
5492
0f6f04ba 5493/* Copy byte/half word/word loads and stores. */
cca44b1b 5494
7ff120b4 5495static void
0f6f04ba
YQ
5496install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5497 struct displaced_step_closure *dsc, int load,
5498 int immed, int writeback, int size, int usermode,
5499 int rt, int rm, int rn)
cca44b1b 5500{
cca44b1b 5501 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 5502
36073a92
YQ
5503 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5504 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5505 if (!immed)
36073a92 5506 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5507 if (!load)
36073a92 5508 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 5509
36073a92
YQ
5510 rt_val = displaced_read_reg (regs, dsc, rt);
5511 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5512 if (!immed)
36073a92 5513 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5514
5515 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5516 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5517 if (!immed)
5518 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 5519 dsc->rd = rt;
0f6f04ba 5520 dsc->u.ldst.xfersize = size;
cca44b1b
JB
5521 dsc->u.ldst.rn = rn;
5522 dsc->u.ldst.immed = immed;
7ff120b4 5523 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5524
5525 /* To write PC we can do:
5526
494e194e
YQ
5527 Before this sequence of instructions:
5528 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5529 r2 is the Rn value got from dispalced_read_reg.
5530
5531 Insn1: push {pc} Write address of STR instruction + offset on stack
5532 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5533 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5534 = addr(Insn1) + offset - addr(Insn3) - 8
5535 = offset - 16
5536 Insn4: add r4, r4, #8 r4 = offset - 8
5537 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5538 = from + offset
5539 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
5540
5541 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
5542 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5543 of this can be found in Section "Saving from r15" in
5544 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 5545
7ff120b4
YQ
5546 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5547}
5548
34518530
YQ
5549
5550static int
5551thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5552 uint16_t insn2, struct regcache *regs,
5553 struct displaced_step_closure *dsc, int size)
5554{
5555 unsigned int u_bit = bit (insn1, 7);
5556 unsigned int rt = bits (insn2, 12, 15);
5557 int imm12 = bits (insn2, 0, 11);
5558 ULONGEST pc_val;
5559
5560 if (debug_displaced)
5561 fprintf_unfiltered (gdb_stdlog,
5562 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5563 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5564 imm12);
5565
5566 if (!u_bit)
5567 imm12 = -1 * imm12;
5568
5569 /* Rewrite instruction LDR Rt imm12 into:
5570
5571 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5572
5573 LDR R0, R2, R3,
5574
5575 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5576
5577
5578 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5579 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5580 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5581
5582 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5583
5584 pc_val = pc_val & 0xfffffffc;
5585
5586 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5587 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5588
5589 dsc->rd = rt;
5590
5591 dsc->u.ldst.xfersize = size;
5592 dsc->u.ldst.immed = 0;
5593 dsc->u.ldst.writeback = 0;
5594 dsc->u.ldst.restore_r4 = 0;
5595
5596 /* LDR R0, R2, R3 */
5597 dsc->modinsn[0] = 0xf852;
5598 dsc->modinsn[1] = 0x3;
5599 dsc->numinsns = 2;
5600
5601 dsc->cleanup = &cleanup_load;
5602
5603 return 0;
5604}
5605
5606static int
5607thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5608 uint16_t insn2, struct regcache *regs,
5609 struct displaced_step_closure *dsc,
5610 int writeback, int immed)
5611{
5612 unsigned int rt = bits (insn2, 12, 15);
5613 unsigned int rn = bits (insn1, 0, 3);
5614 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5615 /* In LDR (register), there is also a register Rm, which is not allowed to
5616 be PC, so we don't have to check it. */
5617
5618 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5619 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5620 dsc);
5621
5622 if (debug_displaced)
5623 fprintf_unfiltered (gdb_stdlog,
5624 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5625 rt, rn, insn1, insn2);
5626
5627 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5628 0, rt, rm, rn);
5629
5630 dsc->u.ldst.restore_r4 = 0;
5631
5632 if (immed)
5633 /* ldr[b]<cond> rt, [rn, #imm], etc.
5634 ->
5635 ldr[b]<cond> r0, [r2, #imm]. */
5636 {
5637 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5638 dsc->modinsn[1] = insn2 & 0x0fff;
5639 }
5640 else
5641 /* ldr[b]<cond> rt, [rn, rm], etc.
5642 ->
5643 ldr[b]<cond> r0, [r2, r3]. */
5644 {
5645 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5646 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5647 }
5648
5649 dsc->numinsns = 2;
5650
5651 return 0;
5652}
5653
5654
7ff120b4
YQ
5655static int
5656arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5657 struct regcache *regs,
5658 struct displaced_step_closure *dsc,
0f6f04ba 5659 int load, int size, int usermode)
7ff120b4
YQ
5660{
5661 int immed = !bit (insn, 25);
5662 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5663 unsigned int rt = bits (insn, 12, 15);
5664 unsigned int rn = bits (insn, 16, 19);
5665 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5666
5667 if (!insn_references_pc (insn, 0x000ff00ful))
5668 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5669
5670 if (debug_displaced)
5671 fprintf_unfiltered (gdb_stdlog,
5672 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
5673 load ? (size == 1 ? "ldrb" : "ldr")
5674 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
5675 rt, rn,
5676 (unsigned long) insn);
5677
0f6f04ba
YQ
5678 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5679 usermode, rt, rm, rn);
7ff120b4 5680
bf9f652a 5681 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
5682 {
5683 dsc->u.ldst.restore_r4 = 0;
5684
5685 if (immed)
5686 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5687 ->
5688 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5689 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5690 else
5691 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5692 ->
5693 {ldr,str}[b]<cond> r0, [r2, r3]. */
5694 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5695 }
5696 else
5697 {
5698 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5699 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
5700 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5701 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
5702 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5703 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5704 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5705
5706 /* As above. */
5707 if (immed)
5708 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5709 else
5710 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5711
cca44b1b
JB
5712 dsc->numinsns = 6;
5713 }
5714
5715 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5716
5717 return 0;
5718}
5719
5720/* Cleanup LDM instructions with fully-populated register list. This is an
5721 unfortunate corner case: it's impossible to implement correctly by modifying
5722 the instruction. The issue is as follows: we have an instruction,
5723
5724 ldm rN, {r0-r15}
5725
5726 which we must rewrite to avoid loading PC. A possible solution would be to
5727 do the load in two halves, something like (with suitable cleanup
5728 afterwards):
5729
5730 mov r8, rN
5731 ldm[id][ab] r8!, {r0-r7}
5732 str r7, <temp>
5733 ldm[id][ab] r8, {r7-r14}
5734 <bkpt>
5735
5736 but at present there's no suitable place for <temp>, since the scratch space
5737 is overwritten before the cleanup routine is called. For now, we simply
5738 emulate the instruction. */
5739
5740static void
5741cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
5742 struct displaced_step_closure *dsc)
5743{
cca44b1b
JB
5744 int inc = dsc->u.block.increment;
5745 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5746 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5747 uint32_t regmask = dsc->u.block.regmask;
5748 int regno = inc ? 0 : 15;
5749 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5750 int exception_return = dsc->u.block.load && dsc->u.block.user
5751 && (regmask & 0x8000) != 0;
36073a92 5752 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5753 int do_transfer = condition_true (dsc->u.block.cond, status);
5754 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5755
5756 if (!do_transfer)
5757 return;
5758
5759 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5760 sensible we can do here. Complain loudly. */
5761 if (exception_return)
5762 error (_("Cannot single-step exception return"));
5763
5764 /* We don't handle any stores here for now. */
5765 gdb_assert (dsc->u.block.load != 0);
5766
5767 if (debug_displaced)
5768 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5769 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5770 dsc->u.block.increment ? "inc" : "dec",
5771 dsc->u.block.before ? "before" : "after");
5772
5773 while (regmask)
5774 {
5775 uint32_t memword;
5776
5777 if (inc)
bf9f652a 5778 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
5779 regno++;
5780 else
5781 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5782 regno--;
5783
5784 xfer_addr += bump_before;
5785
5786 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5787 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5788
5789 xfer_addr += bump_after;
5790
5791 regmask &= ~(1 << regno);
5792 }
5793
5794 if (dsc->u.block.writeback)
5795 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5796 CANNOT_WRITE_PC);
5797}
5798
5799/* Clean up an STM which included the PC in the register list. */
5800
5801static void
5802cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
5803 struct displaced_step_closure *dsc)
5804{
36073a92 5805 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5806 int store_executed = condition_true (dsc->u.block.cond, status);
5807 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5808 CORE_ADDR stm_insn_addr;
5809 uint32_t pc_val;
5810 long offset;
5811 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5812
5813 /* If condition code fails, there's nothing else to do. */
5814 if (!store_executed)
5815 return;
5816
5817 if (dsc->u.block.increment)
5818 {
5819 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5820
5821 if (dsc->u.block.before)
5822 pc_stored_at += 4;
5823 }
5824 else
5825 {
5826 pc_stored_at = dsc->u.block.xfer_addr;
5827
5828 if (dsc->u.block.before)
5829 pc_stored_at -= 4;
5830 }
5831
5832 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5833 stm_insn_addr = dsc->scratch_base;
5834 offset = pc_val - stm_insn_addr;
5835
5836 if (debug_displaced)
5837 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5838 "STM instruction\n", offset);
5839
5840 /* Rewrite the stored PC to the proper value for the non-displaced original
5841 instruction. */
5842 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5843 dsc->insn_addr + offset);
5844}
5845
5846/* Clean up an LDM which includes the PC in the register list. We clumped all
5847 the registers in the transferred list into a contiguous range r0...rX (to
5848 avoid loading PC directly and losing control of the debugged program), so we
5849 must undo that here. */
5850
5851static void
6e39997a 5852cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b
JB
5853 struct regcache *regs,
5854 struct displaced_step_closure *dsc)
5855{
36073a92 5856 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 5857 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 5858 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
5859 unsigned int regs_loaded = bitcount (mask);
5860 unsigned int num_to_shuffle = regs_loaded, clobbered;
5861
5862 /* The method employed here will fail if the register list is fully populated
5863 (we need to avoid loading PC directly). */
5864 gdb_assert (num_to_shuffle < 16);
5865
5866 if (!load_executed)
5867 return;
5868
5869 clobbered = (1 << num_to_shuffle) - 1;
5870
5871 while (num_to_shuffle > 0)
5872 {
5873 if ((mask & (1 << write_reg)) != 0)
5874 {
5875 unsigned int read_reg = num_to_shuffle - 1;
5876
5877 if (read_reg != write_reg)
5878 {
36073a92 5879 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
5880 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5881 if (debug_displaced)
5882 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5883 "loaded register r%d to r%d\n"), read_reg,
5884 write_reg);
5885 }
5886 else if (debug_displaced)
5887 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5888 "r%d already in the right place\n"),
5889 write_reg);
5890
5891 clobbered &= ~(1 << write_reg);
5892
5893 num_to_shuffle--;
5894 }
5895
5896 write_reg--;
5897 }
5898
5899 /* Restore any registers we scribbled over. */
5900 for (write_reg = 0; clobbered != 0; write_reg++)
5901 {
5902 if ((clobbered & (1 << write_reg)) != 0)
5903 {
5904 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5905 CANNOT_WRITE_PC);
5906 if (debug_displaced)
5907 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5908 "clobbered register r%d\n"), write_reg);
5909 clobbered &= ~(1 << write_reg);
5910 }
5911 }
5912
5913 /* Perform register writeback manually. */
5914 if (dsc->u.block.writeback)
5915 {
5916 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5917
5918 if (dsc->u.block.increment)
5919 new_rn_val += regs_loaded * 4;
5920 else
5921 new_rn_val -= regs_loaded * 4;
5922
5923 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
5924 CANNOT_WRITE_PC);
5925 }
5926}
5927
5928/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
5929 in user-level code (in particular exception return, ldm rn, {...pc}^). */
5930
5931static int
7ff120b4
YQ
5932arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
5933 struct regcache *regs,
5934 struct displaced_step_closure *dsc)
cca44b1b
JB
5935{
5936 int load = bit (insn, 20);
5937 int user = bit (insn, 22);
5938 int increment = bit (insn, 23);
5939 int before = bit (insn, 24);
5940 int writeback = bit (insn, 21);
5941 int rn = bits (insn, 16, 19);
cca44b1b 5942
0963b4bd
MS
5943 /* Block transfers which don't mention PC can be run directly
5944 out-of-line. */
bf9f652a 5945 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 5946 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 5947
bf9f652a 5948 if (rn == ARM_PC_REGNUM)
cca44b1b 5949 {
0963b4bd
MS
5950 warning (_("displaced: Unpredictable LDM or STM with "
5951 "base register r15"));
7ff120b4 5952 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
5953 }
5954
5955 if (debug_displaced)
5956 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
5957 "%.8lx\n", (unsigned long) insn);
5958
36073a92 5959 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
5960 dsc->u.block.rn = rn;
5961
5962 dsc->u.block.load = load;
5963 dsc->u.block.user = user;
5964 dsc->u.block.increment = increment;
5965 dsc->u.block.before = before;
5966 dsc->u.block.writeback = writeback;
5967 dsc->u.block.cond = bits (insn, 28, 31);
5968
5969 dsc->u.block.regmask = insn & 0xffff;
5970
5971 if (load)
5972 {
5973 if ((insn & 0xffff) == 0xffff)
5974 {
5975 /* LDM with a fully-populated register list. This case is
5976 particularly tricky. Implement for now by fully emulating the
5977 instruction (which might not behave perfectly in all cases, but
5978 these instructions should be rare enough for that not to matter
5979 too much). */
5980 dsc->modinsn[0] = ARM_NOP;
5981
5982 dsc->cleanup = &cleanup_block_load_all;
5983 }
5984 else
5985 {
5986 /* LDM of a list of registers which includes PC. Implement by
5987 rewriting the list of registers to be transferred into a
5988 contiguous chunk r0...rX before doing the transfer, then shuffling
5989 registers into the correct places in the cleanup routine. */
5990 unsigned int regmask = insn & 0xffff;
5991 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
5992 unsigned int to = 0, from = 0, i, new_rn;
5993
5994 for (i = 0; i < num_in_list; i++)
36073a92 5995 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
5996
5997 /* Writeback makes things complicated. We need to avoid clobbering
5998 the base register with one of the registers in our modified
5999 register list, but just using a different register can't work in
6000 all cases, e.g.:
6001
6002 ldm r14!, {r0-r13,pc}
6003
6004 which would need to be rewritten as:
6005
6006 ldm rN!, {r0-r14}
6007
6008 but that can't work, because there's no free register for N.
6009
6010 Solve this by turning off the writeback bit, and emulating
6011 writeback manually in the cleanup routine. */
6012
6013 if (writeback)
6014 insn &= ~(1 << 21);
6015
6016 new_regmask = (1 << num_in_list) - 1;
6017
6018 if (debug_displaced)
6019 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6020 "{..., pc}: original reg list %.4x, modified "
6021 "list %.4x\n"), rn, writeback ? "!" : "",
6022 (int) insn & 0xffff, new_regmask);
6023
6024 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6025
6026 dsc->cleanup = &cleanup_block_load_pc;
6027 }
6028 }
6029 else
6030 {
6031 /* STM of a list of registers which includes PC. Run the instruction
6032 as-is, but out of line: this will store the wrong value for the PC,
6033 so we must manually fix up the memory in the cleanup routine.
6034 Doing things this way has the advantage that we can auto-detect
6035 the offset of the PC write (which is architecture-dependent) in
6036 the cleanup routine. */
6037 dsc->modinsn[0] = insn;
6038
6039 dsc->cleanup = &cleanup_block_store_pc;
6040 }
6041
6042 return 0;
6043}
6044
34518530
YQ
6045static int
6046thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6047 struct regcache *regs,
6048 struct displaced_step_closure *dsc)
cca44b1b 6049{
34518530
YQ
6050 int rn = bits (insn1, 0, 3);
6051 int load = bit (insn1, 4);
6052 int writeback = bit (insn1, 5);
cca44b1b 6053
34518530
YQ
6054 /* Block transfers which don't mention PC can be run directly
6055 out-of-line. */
6056 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6057 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 6058
34518530
YQ
6059 if (rn == ARM_PC_REGNUM)
6060 {
6061 warning (_("displaced: Unpredictable LDM or STM with "
6062 "base register r15"));
6063 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6064 "unpredictable ldm/stm", dsc);
6065 }
cca44b1b
JB
6066
6067 if (debug_displaced)
34518530
YQ
6068 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6069 "%.4x%.4x\n", insn1, insn2);
cca44b1b 6070
34518530
YQ
6071 /* Clear bit 13, since it should be always zero. */
6072 dsc->u.block.regmask = (insn2 & 0xdfff);
6073 dsc->u.block.rn = rn;
cca44b1b 6074
34518530
YQ
6075 dsc->u.block.load = load;
6076 dsc->u.block.user = 0;
6077 dsc->u.block.increment = bit (insn1, 7);
6078 dsc->u.block.before = bit (insn1, 8);
6079 dsc->u.block.writeback = writeback;
6080 dsc->u.block.cond = INST_AL;
6081 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 6082
34518530
YQ
6083 if (load)
6084 {
6085 if (dsc->u.block.regmask == 0xffff)
6086 {
6087 /* This branch is impossible to happen. */
6088 gdb_assert (0);
6089 }
6090 else
6091 {
6092 unsigned int regmask = dsc->u.block.regmask;
6093 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
6094 unsigned int to = 0, from = 0, i, new_rn;
6095
6096 for (i = 0; i < num_in_list; i++)
6097 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6098
6099 if (writeback)
6100 insn1 &= ~(1 << 5);
6101
6102 new_regmask = (1 << num_in_list) - 1;
6103
6104 if (debug_displaced)
6105 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6106 "{..., pc}: original reg list %.4x, modified "
6107 "list %.4x\n"), rn, writeback ? "!" : "",
6108 (int) dsc->u.block.regmask, new_regmask);
6109
6110 dsc->modinsn[0] = insn1;
6111 dsc->modinsn[1] = (new_regmask & 0xffff);
6112 dsc->numinsns = 2;
6113
6114 dsc->cleanup = &cleanup_block_load_pc;
6115 }
6116 }
6117 else
6118 {
6119 dsc->modinsn[0] = insn1;
6120 dsc->modinsn[1] = insn2;
6121 dsc->numinsns = 2;
6122 dsc->cleanup = &cleanup_block_store_pc;
6123 }
6124 return 0;
6125}
6126
d9311bfa
AT
6127/* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6128 This is used to avoid a dependency on BFD's bfd_endian enum. */
6129
6130ULONGEST
6131arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6132 int byte_order)
6133{
5f2dfcfd
AT
6134 return read_memory_unsigned_integer (memaddr, len,
6135 (enum bfd_endian) byte_order);
d9311bfa
AT
6136}
6137
6138/* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6139
6140CORE_ADDR
6141arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6142 CORE_ADDR val)
6143{
6144 return gdbarch_addr_bits_remove (get_regcache_arch (self->regcache), val);
6145}
6146
6147/* Wrapper over syscall_next_pc for use in get_next_pcs. */
6148
e7cf25a8
YQ
6149static CORE_ADDR
6150arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
6151 CORE_ADDR pc)
d9311bfa 6152{
d9311bfa
AT
6153 return 0;
6154}
6155
6156/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6157
6158int
6159arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6160{
6161 return arm_is_thumb (self->regcache);
6162}
6163
6164/* single_step() is called just before we want to resume the inferior,
6165 if we want to single-step it but there is no hardware or kernel
6166 single-step support. We find the target of the coming instructions
6167 and breakpoint them. */
6168
6169int
6170arm_software_single_step (struct frame_info *frame)
6171{
6172 struct regcache *regcache = get_current_regcache ();
6173 struct gdbarch *gdbarch = get_regcache_arch (regcache);
6174 struct address_space *aspace = get_regcache_aspace (regcache);
6175 struct arm_get_next_pcs next_pcs_ctx;
6176 CORE_ADDR pc;
6177 int i;
6178 VEC (CORE_ADDR) *next_pcs = NULL;
6179 struct cleanup *old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
6180
6181 arm_get_next_pcs_ctor (&next_pcs_ctx,
6182 &arm_get_next_pcs_ops,
6183 gdbarch_byte_order (gdbarch),
6184 gdbarch_byte_order_for_code (gdbarch),
1b451dda 6185 0,
d9311bfa
AT
6186 regcache);
6187
4d18591b 6188 next_pcs = arm_get_next_pcs (&next_pcs_ctx);
d9311bfa
AT
6189
6190 for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); i++)
6191 arm_insert_single_step_breakpoint (gdbarch, aspace, pc);
6192
6193 do_cleanups (old_chain);
6194
6195 return 1;
6196}
6197
34518530
YQ
6198/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6199 for Linux, where some SVC instructions must be treated specially. */
6200
6201static void
6202cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
6203 struct displaced_step_closure *dsc)
6204{
6205 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6206
6207 if (debug_displaced)
6208 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6209 "%.8lx\n", (unsigned long) resume_addr);
6210
6211 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6212}
6213
6214
6215/* Common copy routine for svc instruciton. */
6216
6217static int
6218install_svc (struct gdbarch *gdbarch, struct regcache *regs,
6219 struct displaced_step_closure *dsc)
6220{
6221 /* Preparation: none.
6222 Insn: unmodified svc.
6223 Cleanup: pc <- insn_addr + insn_size. */
6224
6225 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6226 instruction. */
6227 dsc->wrote_to_pc = 1;
6228
6229 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6230 if (dsc->u.svc.copy_svc_os)
6231 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6232 else
6233 {
6234 dsc->cleanup = &cleanup_svc;
6235 return 0;
6236 }
34518530
YQ
6237}
6238
6239static int
6240arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
6241 struct regcache *regs, struct displaced_step_closure *dsc)
6242{
6243
6244 if (debug_displaced)
6245 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6246 (unsigned long) insn);
6247
6248 dsc->modinsn[0] = insn;
6249
6250 return install_svc (gdbarch, regs, dsc);
6251}
6252
6253static int
6254thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
6255 struct regcache *regs, struct displaced_step_closure *dsc)
6256{
6257
6258 if (debug_displaced)
6259 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6260 insn);
bd18283a 6261
34518530
YQ
6262 dsc->modinsn[0] = insn;
6263
6264 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6265}
6266
6267/* Copy undefined instructions. */
6268
6269static int
7ff120b4
YQ
6270arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
6271 struct displaced_step_closure *dsc)
cca44b1b
JB
6272{
6273 if (debug_displaced)
0963b4bd
MS
6274 fprintf_unfiltered (gdb_stdlog,
6275 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6276 (unsigned long) insn);
6277
6278 dsc->modinsn[0] = insn;
6279
6280 return 0;
6281}
6282
34518530
YQ
6283static int
6284thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6285 struct displaced_step_closure *dsc)
6286{
6287
6288 if (debug_displaced)
6289 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6290 "%.4x %.4x\n", (unsigned short) insn1,
6291 (unsigned short) insn2);
6292
6293 dsc->modinsn[0] = insn1;
6294 dsc->modinsn[1] = insn2;
6295 dsc->numinsns = 2;
6296
6297 return 0;
6298}
6299
cca44b1b
JB
6300/* Copy unpredictable instructions. */
6301
6302static int
7ff120b4
YQ
6303arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
6304 struct displaced_step_closure *dsc)
cca44b1b
JB
6305{
6306 if (debug_displaced)
6307 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6308 "%.8lx\n", (unsigned long) insn);
6309
6310 dsc->modinsn[0] = insn;
6311
6312 return 0;
6313}
6314
6315/* The decode_* functions are instruction decoding helpers. They mostly follow
6316 the presentation in the ARM ARM. */
6317
6318static int
7ff120b4
YQ
6319arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6320 struct regcache *regs,
6321 struct displaced_step_closure *dsc)
cca44b1b
JB
6322{
6323 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6324 unsigned int rn = bits (insn, 16, 19);
6325
6326 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 6327 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 6328 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 6329 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6330 else if ((op1 & 0x60) == 0x20)
7ff120b4 6331 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6332 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6333 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6334 dsc);
cca44b1b 6335 else if ((op1 & 0x77) == 0x41)
7ff120b4 6336 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6337 else if ((op1 & 0x77) == 0x45)
7ff120b4 6338 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6339 else if ((op1 & 0x77) == 0x51)
6340 {
6341 if (rn != 0xf)
7ff120b4 6342 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6343 else
7ff120b4 6344 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6345 }
6346 else if ((op1 & 0x77) == 0x55)
7ff120b4 6347 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6348 else if (op1 == 0x57)
6349 switch (op2)
6350 {
7ff120b4
YQ
6351 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6352 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6353 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6354 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6355 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6356 }
6357 else if ((op1 & 0x63) == 0x43)
7ff120b4 6358 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6359 else if ((op2 & 0x1) == 0x0)
6360 switch (op1 & ~0x80)
6361 {
6362 case 0x61:
7ff120b4 6363 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6364 case 0x65:
7ff120b4 6365 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6366 case 0x71: case 0x75:
6367 /* pld/pldw reg. */
7ff120b4 6368 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6369 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6370 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6371 default:
7ff120b4 6372 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6373 }
6374 else
7ff120b4 6375 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6376}
6377
6378static int
7ff120b4
YQ
6379arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6380 struct regcache *regs,
6381 struct displaced_step_closure *dsc)
cca44b1b
JB
6382{
6383 if (bit (insn, 27) == 0)
7ff120b4 6384 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6385 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6386 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6387 {
6388 case 0x0: case 0x2:
7ff120b4 6389 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6390
6391 case 0x1: case 0x3:
7ff120b4 6392 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6393
6394 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6395 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6396
6397 case 0x8:
6398 switch ((insn & 0xe00000) >> 21)
6399 {
6400 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6401 /* stc/stc2. */
7ff120b4 6402 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6403
6404 case 0x2:
7ff120b4 6405 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6406
6407 default:
7ff120b4 6408 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6409 }
6410
6411 case 0x9:
6412 {
6413 int rn_f = (bits (insn, 16, 19) == 0xf);
6414 switch ((insn & 0xe00000) >> 21)
6415 {
6416 case 0x1: case 0x3:
6417 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6418 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6419 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6420
6421 case 0x2:
7ff120b4 6422 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6423
6424 case 0x4: case 0x5: case 0x6: case 0x7:
6425 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6426 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6427 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6428
6429 default:
7ff120b4 6430 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6431 }
6432 }
6433
6434 case 0xa:
7ff120b4 6435 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6436
6437 case 0xb:
6438 if (bits (insn, 16, 19) == 0xf)
6439 /* ldc/ldc2 lit. */
7ff120b4 6440 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6441 else
7ff120b4 6442 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6443
6444 case 0xc:
6445 if (bit (insn, 4))
7ff120b4 6446 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6447 else
7ff120b4 6448 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6449
6450 case 0xd:
6451 if (bit (insn, 4))
7ff120b4 6452 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6453 else
7ff120b4 6454 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6455
6456 default:
7ff120b4 6457 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6458 }
6459}
6460
6461/* Decode miscellaneous instructions in dp/misc encoding space. */
6462
6463static int
7ff120b4
YQ
6464arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6465 struct regcache *regs,
6466 struct displaced_step_closure *dsc)
cca44b1b
JB
6467{
6468 unsigned int op2 = bits (insn, 4, 6);
6469 unsigned int op = bits (insn, 21, 22);
6470 unsigned int op1 = bits (insn, 16, 19);
6471
6472 switch (op2)
6473 {
6474 case 0x0:
7ff120b4 6475 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6476
6477 case 0x1:
6478 if (op == 0x1) /* bx. */
7ff120b4 6479 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6480 else if (op == 0x3)
7ff120b4 6481 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6482 else
7ff120b4 6483 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6484
6485 case 0x2:
6486 if (op == 0x1)
6487 /* Not really supported. */
7ff120b4 6488 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6489 else
7ff120b4 6490 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6491
6492 case 0x3:
6493 if (op == 0x1)
7ff120b4 6494 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6495 regs, dsc); /* blx register. */
cca44b1b 6496 else
7ff120b4 6497 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6498
6499 case 0x5:
7ff120b4 6500 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6501
6502 case 0x7:
6503 if (op == 0x1)
7ff120b4 6504 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6505 else if (op == 0x3)
6506 /* Not really supported. */
7ff120b4 6507 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
6508
6509 default:
7ff120b4 6510 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6511 }
6512}
6513
6514static int
7ff120b4
YQ
6515arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6516 struct regcache *regs,
6517 struct displaced_step_closure *dsc)
cca44b1b
JB
6518{
6519 if (bit (insn, 25))
6520 switch (bits (insn, 20, 24))
6521 {
6522 case 0x10:
7ff120b4 6523 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6524
6525 case 0x14:
7ff120b4 6526 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6527
6528 case 0x12: case 0x16:
7ff120b4 6529 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6530
6531 default:
7ff120b4 6532 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6533 }
6534 else
6535 {
6536 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6537
6538 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6539 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6540 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6541 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6542 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6543 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6544 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6545 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6546 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6547 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6548 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6549 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b 6550 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
550dc4e2 6551 /* 2nd arg means "unprivileged". */
7ff120b4
YQ
6552 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6553 dsc);
cca44b1b
JB
6554 }
6555
6556 /* Should be unreachable. */
6557 return 1;
6558}
6559
6560static int
7ff120b4
YQ
6561arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6562 struct regcache *regs,
6563 struct displaced_step_closure *dsc)
cca44b1b
JB
6564{
6565 int a = bit (insn, 25), b = bit (insn, 4);
6566 uint32_t op1 = bits (insn, 20, 24);
6567 int rn_f = bits (insn, 16, 19) == 0xf;
6568
6569 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6570 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6571 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6572 else if ((!a && (op1 & 0x17) == 0x02)
6573 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6574 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6575 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6576 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6577 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6578 else if ((!a && (op1 & 0x17) == 0x03)
6579 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6580 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6581 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6582 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6583 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6584 else if ((!a && (op1 & 0x17) == 0x06)
6585 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6586 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6587 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6588 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6589 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6590 else if ((!a && (op1 & 0x17) == 0x07)
6591 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6592 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6593
6594 /* Should be unreachable. */
6595 return 1;
6596}
6597
6598static int
7ff120b4
YQ
6599arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
6600 struct displaced_step_closure *dsc)
cca44b1b
JB
6601{
6602 switch (bits (insn, 20, 24))
6603 {
6604 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6605 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6606
6607 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6608 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6609
6610 case 0x08: case 0x09: case 0x0a: case 0x0b:
6611 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6612 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6613 "decode/pack/unpack/saturate/reverse", dsc);
6614
6615 case 0x18:
6616 if (bits (insn, 5, 7) == 0) /* op2. */
6617 {
6618 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6619 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6620 else
7ff120b4 6621 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6622 }
6623 else
7ff120b4 6624 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6625
6626 case 0x1a: case 0x1b:
6627 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6628 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6629 else
7ff120b4 6630 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6631
6632 case 0x1c: case 0x1d:
6633 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6634 {
6635 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6636 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6637 else
7ff120b4 6638 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6639 }
6640 else
7ff120b4 6641 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6642
6643 case 0x1e: case 0x1f:
6644 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6645 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6646 else
7ff120b4 6647 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6648 }
6649
6650 /* Should be unreachable. */
6651 return 1;
6652}
6653
6654static int
615234c1 6655arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7ff120b4
YQ
6656 struct regcache *regs,
6657 struct displaced_step_closure *dsc)
cca44b1b
JB
6658{
6659 if (bit (insn, 25))
7ff120b4 6660 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6661 else
7ff120b4 6662 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6663}
6664
6665static int
7ff120b4
YQ
6666arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6667 struct regcache *regs,
6668 struct displaced_step_closure *dsc)
cca44b1b
JB
6669{
6670 unsigned int opcode = bits (insn, 20, 24);
6671
6672 switch (opcode)
6673 {
6674 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6675 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6676
6677 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6678 case 0x12: case 0x16:
7ff120b4 6679 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6680
6681 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6682 case 0x13: case 0x17:
7ff120b4 6683 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6684
6685 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6686 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6687 /* Note: no writeback for these instructions. Bit 25 will always be
6688 zero though (via caller), so the following works OK. */
7ff120b4 6689 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6690 }
6691
6692 /* Should be unreachable. */
6693 return 1;
6694}
6695
34518530
YQ
6696/* Decode shifted register instructions. */
6697
6698static int
6699thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6700 uint16_t insn2, struct regcache *regs,
6701 struct displaced_step_closure *dsc)
6702{
6703 /* PC is only allowed to be used in instruction MOV. */
6704
6705 unsigned int op = bits (insn1, 5, 8);
6706 unsigned int rn = bits (insn1, 0, 3);
6707
6708 if (op == 0x2 && rn == 0xf) /* MOV */
6709 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6710 else
6711 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6712 "dp (shift reg)", dsc);
6713}
6714
6715
6716/* Decode extension register load/store. Exactly the same as
6717 arm_decode_ext_reg_ld_st. */
6718
6719static int
6720thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6721 uint16_t insn2, struct regcache *regs,
6722 struct displaced_step_closure *dsc)
6723{
6724 unsigned int opcode = bits (insn1, 4, 8);
6725
6726 switch (opcode)
6727 {
6728 case 0x04: case 0x05:
6729 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6730 "vfp/neon vmov", dsc);
6731
6732 case 0x08: case 0x0c: /* 01x00 */
6733 case 0x0a: case 0x0e: /* 01x10 */
6734 case 0x12: case 0x16: /* 10x10 */
6735 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6736 "vfp/neon vstm/vpush", dsc);
6737
6738 case 0x09: case 0x0d: /* 01x01 */
6739 case 0x0b: case 0x0f: /* 01x11 */
6740 case 0x13: case 0x17: /* 10x11 */
6741 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6742 "vfp/neon vldm/vpop", dsc);
6743
6744 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6745 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6746 "vstr", dsc);
6747 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6748 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6749 }
6750
6751 /* Should be unreachable. */
6752 return 1;
6753}
6754
cca44b1b 6755static int
7ff120b4
YQ
6756arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
6757 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6758{
6759 unsigned int op1 = bits (insn, 20, 25);
6760 int op = bit (insn, 4);
6761 unsigned int coproc = bits (insn, 8, 11);
6762 unsigned int rn = bits (insn, 16, 19);
6763
6764 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6765 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6766 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6767 && (coproc & 0xe) != 0xa)
6768 /* stc/stc2. */
7ff120b4 6769 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6770 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6771 && (coproc & 0xe) != 0xa)
6772 /* ldc/ldc2 imm/lit. */
7ff120b4 6773 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6774 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6775 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6776 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6777 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6778 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6779 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6780 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6781 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6782 else if ((op1 & 0x30) == 0x20 && !op)
6783 {
6784 if ((coproc & 0xe) == 0xa)
7ff120b4 6785 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6786 else
7ff120b4 6787 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6788 }
6789 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6790 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6791 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6792 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6793 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6794 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6795 else if ((op1 & 0x30) == 0x30)
7ff120b4 6796 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6797 else
7ff120b4 6798 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6799}
6800
34518530
YQ
6801static int
6802thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6803 uint16_t insn2, struct regcache *regs,
6804 struct displaced_step_closure *dsc)
6805{
6806 unsigned int coproc = bits (insn2, 8, 11);
6807 unsigned int op1 = bits (insn1, 4, 9);
6808 unsigned int bit_5_8 = bits (insn1, 5, 8);
6809 unsigned int bit_9 = bit (insn1, 9);
6810 unsigned int bit_4 = bit (insn1, 4);
6811 unsigned int rn = bits (insn1, 0, 3);
6812
6813 if (bit_9 == 0)
6814 {
6815 if (bit_5_8 == 2)
6816 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6817 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6818 dsc);
6819 else if (bit_5_8 == 0) /* UNDEFINED. */
6820 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6821 else
6822 {
6823 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6824 if ((coproc & 0xe) == 0xa)
6825 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6826 dsc);
6827 else /* coproc is not 101x. */
6828 {
6829 if (bit_4 == 0) /* STC/STC2. */
6830 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6831 "stc/stc2", dsc);
6832 else /* LDC/LDC2 {literal, immeidate}. */
6833 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6834 regs, dsc);
6835 }
6836 }
6837 }
6838 else
6839 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6840
6841 return 0;
6842}
6843
6844static void
6845install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
6846 struct displaced_step_closure *dsc, int rd)
6847{
6848 /* ADR Rd, #imm
6849
6850 Rewrite as:
6851
6852 Preparation: Rd <- PC
6853 Insn: ADD Rd, #imm
6854 Cleanup: Null.
6855 */
6856
6857 /* Rd <- PC */
6858 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6859 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6860}
6861
6862static int
6863thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
6864 struct displaced_step_closure *dsc,
6865 int rd, unsigned int imm)
6866{
6867
6868 /* Encoding T2: ADDS Rd, #imm */
6869 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6870
6871 install_pc_relative (gdbarch, regs, dsc, rd);
6872
6873 return 0;
6874}
6875
6876static int
6877thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6878 struct regcache *regs,
6879 struct displaced_step_closure *dsc)
6880{
6881 unsigned int rd = bits (insn, 8, 10);
6882 unsigned int imm8 = bits (insn, 0, 7);
6883
6884 if (debug_displaced)
6885 fprintf_unfiltered (gdb_stdlog,
6886 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6887 rd, imm8, insn);
6888
6889 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6890}
6891
6892static int
6893thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6894 uint16_t insn2, struct regcache *regs,
6895 struct displaced_step_closure *dsc)
6896{
6897 unsigned int rd = bits (insn2, 8, 11);
6898 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6899 extract raw immediate encoding rather than computing immediate. When
6900 generating ADD or SUB instruction, we can simply perform OR operation to
6901 set immediate into ADD. */
6902 unsigned int imm_3_8 = insn2 & 0x70ff;
6903 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6904
6905 if (debug_displaced)
6906 fprintf_unfiltered (gdb_stdlog,
6907 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6908 rd, imm_i, imm_3_8, insn1, insn2);
6909
6910 if (bit (insn1, 7)) /* Encoding T2 */
6911 {
6912 /* Encoding T3: SUB Rd, Rd, #imm */
6913 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6914 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6915 }
6916 else /* Encoding T3 */
6917 {
6918 /* Encoding T3: ADD Rd, Rd, #imm */
6919 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6920 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6921 }
6922 dsc->numinsns = 2;
6923
6924 install_pc_relative (gdbarch, regs, dsc, rd);
6925
6926 return 0;
6927}
6928
6929static int
615234c1 6930thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
6931 struct regcache *regs,
6932 struct displaced_step_closure *dsc)
6933{
6934 unsigned int rt = bits (insn1, 8, 10);
6935 unsigned int pc;
6936 int imm8 = (bits (insn1, 0, 7) << 2);
6937 CORE_ADDR from = dsc->insn_addr;
6938
6939 /* LDR Rd, #imm8
6940
6941 Rwrite as:
6942
6943 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6944
6945 Insn: LDR R0, [R2, R3];
6946 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6947
6948 if (debug_displaced)
6949 fprintf_unfiltered (gdb_stdlog,
6950 "displaced: copying thumb ldr r%d [pc #%d]\n"
6951 , rt, imm8);
6952
6953 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6954 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6955 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6956 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6957 /* The assembler calculates the required value of the offset from the
6958 Align(PC,4) value of this instruction to the label. */
6959 pc = pc & 0xfffffffc;
6960
6961 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6962 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6963
6964 dsc->rd = rt;
6965 dsc->u.ldst.xfersize = 4;
6966 dsc->u.ldst.rn = 0;
6967 dsc->u.ldst.immed = 0;
6968 dsc->u.ldst.writeback = 0;
6969 dsc->u.ldst.restore_r4 = 0;
6970
6971 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6972
6973 dsc->cleanup = &cleanup_load;
6974
6975 return 0;
6976}
6977
6978/* Copy Thumb cbnz/cbz insruction. */
6979
6980static int
6981thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6982 struct regcache *regs,
6983 struct displaced_step_closure *dsc)
6984{
6985 int non_zero = bit (insn1, 11);
6986 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6987 CORE_ADDR from = dsc->insn_addr;
6988 int rn = bits (insn1, 0, 2);
6989 int rn_val = displaced_read_reg (regs, dsc, rn);
6990
6991 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6992 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6993 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6994 condition is false, let it be, cleanup_branch will do nothing. */
6995 if (dsc->u.branch.cond)
6996 {
6997 dsc->u.branch.cond = INST_AL;
6998 dsc->u.branch.dest = from + 4 + imm5;
6999 }
7000 else
7001 dsc->u.branch.dest = from + 2;
7002
7003 dsc->u.branch.link = 0;
7004 dsc->u.branch.exchange = 0;
7005
7006 if (debug_displaced)
7007 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
7008 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
7009 rn, rn_val, insn1, dsc->u.branch.dest);
7010
7011 dsc->modinsn[0] = THUMB_NOP;
7012
7013 dsc->cleanup = &cleanup_branch;
7014 return 0;
7015}
7016
7017/* Copy Table Branch Byte/Halfword */
7018static int
7019thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7020 uint16_t insn2, struct regcache *regs,
7021 struct displaced_step_closure *dsc)
7022{
7023 ULONGEST rn_val, rm_val;
7024 int is_tbh = bit (insn2, 4);
7025 CORE_ADDR halfwords = 0;
7026 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7027
7028 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7029 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7030
7031 if (is_tbh)
7032 {
7033 gdb_byte buf[2];
7034
7035 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7036 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7037 }
7038 else
7039 {
7040 gdb_byte buf[1];
7041
7042 target_read_memory (rn_val + rm_val, buf, 1);
7043 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7044 }
7045
7046 if (debug_displaced)
7047 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7048 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7049 (unsigned int) rn_val, (unsigned int) rm_val,
7050 (unsigned int) halfwords);
7051
7052 dsc->u.branch.cond = INST_AL;
7053 dsc->u.branch.link = 0;
7054 dsc->u.branch.exchange = 0;
7055 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7056
7057 dsc->cleanup = &cleanup_branch;
7058
7059 return 0;
7060}
7061
7062static void
7063cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
7064 struct displaced_step_closure *dsc)
7065{
7066 /* PC <- r7 */
7067 int val = displaced_read_reg (regs, dsc, 7);
7068 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7069
7070 /* r7 <- r8 */
7071 val = displaced_read_reg (regs, dsc, 8);
7072 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7073
7074 /* r8 <- tmp[0] */
7075 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7076
7077}
7078
7079static int
615234c1 7080thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
7081 struct regcache *regs,
7082 struct displaced_step_closure *dsc)
7083{
7084 dsc->u.block.regmask = insn1 & 0x00ff;
7085
7086 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7087 to :
7088
7089 (1) register list is full, that is, r0-r7 are used.
7090 Prepare: tmp[0] <- r8
7091
7092 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7093 MOV r8, r7; Move value of r7 to r8;
7094 POP {r7}; Store PC value into r7.
7095
7096 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7097
7098 (2) register list is not full, supposing there are N registers in
7099 register list (except PC, 0 <= N <= 7).
7100 Prepare: for each i, 0 - N, tmp[i] <- ri.
7101
7102 POP {r0, r1, ...., rN};
7103
7104 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7105 from tmp[] properly.
7106 */
7107 if (debug_displaced)
7108 fprintf_unfiltered (gdb_stdlog,
7109 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7110 dsc->u.block.regmask, insn1);
7111
7112 if (dsc->u.block.regmask == 0xff)
7113 {
7114 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7115
7116 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7117 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7118 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7119
7120 dsc->numinsns = 3;
7121 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7122 }
7123 else
7124 {
7125 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
7126 unsigned int new_regmask, bit = 1;
7127 unsigned int to = 0, from = 0, i, new_rn;
7128
7129 for (i = 0; i < num_in_list + 1; i++)
7130 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7131
7132 new_regmask = (1 << (num_in_list + 1)) - 1;
7133
7134 if (debug_displaced)
7135 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7136 "{..., pc}: original reg list %.4x,"
7137 " modified list %.4x\n"),
7138 (int) dsc->u.block.regmask, new_regmask);
7139
7140 dsc->u.block.regmask |= 0x8000;
7141 dsc->u.block.writeback = 0;
7142 dsc->u.block.cond = INST_AL;
7143
7144 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7145
7146 dsc->cleanup = &cleanup_block_load_pc;
7147 }
7148
7149 return 0;
7150}
7151
7152static void
7153thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7154 struct regcache *regs,
7155 struct displaced_step_closure *dsc)
7156{
7157 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7158 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7159 int err = 0;
7160
7161 /* 16-bit thumb instructions. */
7162 switch (op_bit_12_15)
7163 {
7164 /* Shift (imme), add, subtract, move and compare. */
7165 case 0: case 1: case 2: case 3:
7166 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7167 "shift/add/sub/mov/cmp",
7168 dsc);
7169 break;
7170 case 4:
7171 switch (op_bit_10_11)
7172 {
7173 case 0: /* Data-processing */
7174 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7175 "data-processing",
7176 dsc);
7177 break;
7178 case 1: /* Special data instructions and branch and exchange. */
7179 {
7180 unsigned short op = bits (insn1, 7, 9);
7181 if (op == 6 || op == 7) /* BX or BLX */
7182 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7183 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7184 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7185 else
7186 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7187 dsc);
7188 }
7189 break;
7190 default: /* LDR (literal) */
7191 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7192 }
7193 break;
7194 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7195 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7196 break;
7197 case 10:
7198 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7199 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7200 else /* Generate SP-relative address */
7201 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7202 break;
7203 case 11: /* Misc 16-bit instructions */
7204 {
7205 switch (bits (insn1, 8, 11))
7206 {
7207 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7208 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7209 break;
7210 case 12: case 13: /* POP */
7211 if (bit (insn1, 8)) /* PC is in register list. */
7212 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7213 else
7214 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7215 break;
7216 case 15: /* If-Then, and hints */
7217 if (bits (insn1, 0, 3))
7218 /* If-Then makes up to four following instructions conditional.
7219 IT instruction itself is not conditional, so handle it as a
7220 common unmodified instruction. */
7221 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7222 dsc);
7223 else
7224 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7225 break;
7226 default:
7227 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7228 }
7229 }
7230 break;
7231 case 12:
7232 if (op_bit_10_11 < 2) /* Store multiple registers */
7233 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7234 else /* Load multiple registers */
7235 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7236 break;
7237 case 13: /* Conditional branch and supervisor call */
7238 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7239 err = thumb_copy_b (gdbarch, insn1, dsc);
7240 else
7241 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7242 break;
7243 case 14: /* Unconditional branch */
7244 err = thumb_copy_b (gdbarch, insn1, dsc);
7245 break;
7246 default:
7247 err = 1;
7248 }
7249
7250 if (err)
7251 internal_error (__FILE__, __LINE__,
7252 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7253}
7254
7255static int
7256decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7257 uint16_t insn1, uint16_t insn2,
7258 struct regcache *regs,
7259 struct displaced_step_closure *dsc)
7260{
7261 int rt = bits (insn2, 12, 15);
7262 int rn = bits (insn1, 0, 3);
7263 int op1 = bits (insn1, 7, 8);
7264 int err = 0;
7265
7266 switch (bits (insn1, 5, 6))
7267 {
7268 case 0: /* Load byte and memory hints */
7269 if (rt == 0xf) /* PLD/PLI */
7270 {
7271 if (rn == 0xf)
7272 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7273 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7274 else
7275 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7276 "pli/pld", dsc);
7277 }
7278 else
7279 {
7280 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7281 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7282 1);
7283 else
7284 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7285 "ldrb{reg, immediate}/ldrbt",
7286 dsc);
7287 }
7288
7289 break;
7290 case 1: /* Load halfword and memory hints. */
7291 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7292 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7293 "pld/unalloc memhint", dsc);
7294 else
7295 {
7296 if (rn == 0xf)
7297 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7298 2);
7299 else
7300 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7301 "ldrh/ldrht", dsc);
7302 }
7303 break;
7304 case 2: /* Load word */
7305 {
7306 int insn2_bit_8_11 = bits (insn2, 8, 11);
7307
7308 if (rn == 0xf)
7309 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7310 else if (op1 == 0x1) /* Encoding T3 */
7311 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7312 0, 1);
7313 else /* op1 == 0x0 */
7314 {
7315 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7316 /* LDR (immediate) */
7317 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7318 dsc, bit (insn2, 8), 1);
7319 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7320 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7321 "ldrt", dsc);
7322 else
7323 /* LDR (register) */
7324 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7325 dsc, 0, 0);
7326 }
7327 break;
7328 }
7329 default:
7330 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7331 break;
7332 }
7333 return 0;
7334}
7335
7336static void
7337thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7338 uint16_t insn2, struct regcache *regs,
7339 struct displaced_step_closure *dsc)
7340{
7341 int err = 0;
7342 unsigned short op = bit (insn2, 15);
7343 unsigned int op1 = bits (insn1, 11, 12);
7344
7345 switch (op1)
7346 {
7347 case 1:
7348 {
7349 switch (bits (insn1, 9, 10))
7350 {
7351 case 0:
7352 if (bit (insn1, 6))
7353 {
7354 /* Load/store {dual, execlusive}, table branch. */
7355 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7356 && bits (insn2, 5, 7) == 0)
7357 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7358 dsc);
7359 else
7360 /* PC is not allowed to use in load/store {dual, exclusive}
7361 instructions. */
7362 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7363 "load/store dual/ex", dsc);
7364 }
7365 else /* load/store multiple */
7366 {
7367 switch (bits (insn1, 7, 8))
7368 {
7369 case 0: case 3: /* SRS, RFE */
7370 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7371 "srs/rfe", dsc);
7372 break;
7373 case 1: case 2: /* LDM/STM/PUSH/POP */
7374 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7375 break;
7376 }
7377 }
7378 break;
7379
7380 case 1:
7381 /* Data-processing (shift register). */
7382 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7383 dsc);
7384 break;
7385 default: /* Coprocessor instructions. */
7386 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7387 break;
7388 }
7389 break;
7390 }
7391 case 2: /* op1 = 2 */
7392 if (op) /* Branch and misc control. */
7393 {
7394 if (bit (insn2, 14) /* BLX/BL */
7395 || bit (insn2, 12) /* Unconditional branch */
7396 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7397 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7398 else
7399 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7400 "misc ctrl", dsc);
7401 }
7402 else
7403 {
7404 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7405 {
7406 int op = bits (insn1, 4, 8);
7407 int rn = bits (insn1, 0, 3);
7408 if ((op == 0 || op == 0xa) && rn == 0xf)
7409 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7410 regs, dsc);
7411 else
7412 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7413 "dp/pb", dsc);
7414 }
7415 else /* Data processing (modified immeidate) */
7416 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7417 "dp/mi", dsc);
7418 }
7419 break;
7420 case 3: /* op1 = 3 */
7421 switch (bits (insn1, 9, 10))
7422 {
7423 case 0:
7424 if (bit (insn1, 4))
7425 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7426 regs, dsc);
7427 else /* NEON Load/Store and Store single data item */
7428 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7429 "neon elt/struct load/store",
7430 dsc);
7431 break;
7432 case 1: /* op1 = 3, bits (9, 10) == 1 */
7433 switch (bits (insn1, 7, 8))
7434 {
7435 case 0: case 1: /* Data processing (register) */
7436 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7437 "dp(reg)", dsc);
7438 break;
7439 case 2: /* Multiply and absolute difference */
7440 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7441 "mul/mua/diff", dsc);
7442 break;
7443 case 3: /* Long multiply and divide */
7444 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7445 "lmul/lmua", dsc);
7446 break;
7447 }
7448 break;
7449 default: /* Coprocessor instructions */
7450 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7451 break;
7452 }
7453 break;
7454 default:
7455 err = 1;
7456 }
7457
7458 if (err)
7459 internal_error (__FILE__, __LINE__,
7460 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7461
7462}
7463
b434a28f
YQ
7464static void
7465thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7466 CORE_ADDR to, struct regcache *regs,
7467 struct displaced_step_closure *dsc)
7468{
34518530
YQ
7469 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7470 uint16_t insn1
7471 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7472
7473 if (debug_displaced)
7474 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7475 "at %.8lx\n", insn1, (unsigned long) from);
7476
7477 dsc->is_thumb = 1;
7478 dsc->insn_size = thumb_insn_size (insn1);
7479 if (thumb_insn_size (insn1) == 4)
7480 {
7481 uint16_t insn2
7482 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7483 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7484 }
7485 else
7486 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7487}
7488
cca44b1b 7489void
b434a28f
YQ
7490arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7491 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
7492 struct displaced_step_closure *dsc)
7493{
7494 int err = 0;
b434a28f
YQ
7495 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7496 uint32_t insn;
cca44b1b
JB
7497
7498 /* Most displaced instructions use a 1-instruction scratch space, so set this
7499 here and override below if/when necessary. */
7500 dsc->numinsns = 1;
7501 dsc->insn_addr = from;
7502 dsc->scratch_base = to;
7503 dsc->cleanup = NULL;
7504 dsc->wrote_to_pc = 0;
7505
b434a28f
YQ
7506 if (!displaced_in_arm_mode (regs))
7507 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
7508
4db71c0b
YQ
7509 dsc->is_thumb = 0;
7510 dsc->insn_size = 4;
b434a28f
YQ
7511 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7512 if (debug_displaced)
7513 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7514 "at %.8lx\n", (unsigned long) insn,
7515 (unsigned long) from);
7516
cca44b1b 7517 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7518 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7519 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7520 {
7521 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7522 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7523 break;
7524
7525 case 0x4: case 0x5: case 0x6:
7ff120b4 7526 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7527 break;
7528
7529 case 0x7:
7ff120b4 7530 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7531 break;
7532
7533 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7534 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7535 break;
7536
7537 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 7538 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
7539 break;
7540 }
7541
7542 if (err)
7543 internal_error (__FILE__, __LINE__,
7544 _("arm_process_displaced_insn: Instruction decode error"));
7545}
7546
7547/* Actually set up the scratch space for a displaced instruction. */
7548
7549void
7550arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
7551 CORE_ADDR to, struct displaced_step_closure *dsc)
7552{
7553 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7554 unsigned int i, len, offset;
cca44b1b 7555 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7556 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7557 const gdb_byte *bkp_insn;
cca44b1b 7558
4db71c0b 7559 offset = 0;
cca44b1b
JB
7560 /* Poke modified instruction(s). */
7561 for (i = 0; i < dsc->numinsns; i++)
7562 {
7563 if (debug_displaced)
4db71c0b
YQ
7564 {
7565 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7566 if (size == 4)
7567 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7568 dsc->modinsn[i]);
7569 else if (size == 2)
7570 fprintf_unfiltered (gdb_stdlog, "%.4x",
7571 (unsigned short)dsc->modinsn[i]);
7572
7573 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7574 (unsigned long) to + offset);
7575
7576 }
7577 write_memory_unsigned_integer (to + offset, size,
7578 byte_order_for_code,
cca44b1b 7579 dsc->modinsn[i]);
4db71c0b
YQ
7580 offset += size;
7581 }
7582
7583 /* Choose the correct breakpoint instruction. */
7584 if (dsc->is_thumb)
7585 {
7586 bkp_insn = tdep->thumb_breakpoint;
7587 len = tdep->thumb_breakpoint_size;
7588 }
7589 else
7590 {
7591 bkp_insn = tdep->arm_breakpoint;
7592 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7593 }
7594
7595 /* Put breakpoint afterwards. */
4db71c0b 7596 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7597
7598 if (debug_displaced)
7599 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7600 paddress (gdbarch, from), paddress (gdbarch, to));
7601}
7602
cca44b1b
JB
7603/* Entry point for cleaning things up after a displaced instruction has been
7604 single-stepped. */
7605
7606void
7607arm_displaced_step_fixup (struct gdbarch *gdbarch,
7608 struct displaced_step_closure *dsc,
7609 CORE_ADDR from, CORE_ADDR to,
7610 struct regcache *regs)
7611{
7612 if (dsc->cleanup)
7613 dsc->cleanup (gdbarch, regs, dsc);
7614
7615 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7616 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7617 dsc->insn_addr + dsc->insn_size);
7618
cca44b1b
JB
7619}
7620
7621#include "bfd-in2.h"
7622#include "libcoff.h"
7623
7624static int
7625gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7626{
9a3c8263 7627 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
9779414d
DJ
7628
7629 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7630 {
7631 static asymbol *asym;
7632 static combined_entry_type ce;
7633 static struct coff_symbol_struct csym;
7634 static struct bfd fake_bfd;
7635 static bfd_target fake_target;
7636
7637 if (csym.native == NULL)
7638 {
7639 /* Create a fake symbol vector containing a Thumb symbol.
7640 This is solely so that the code in print_insn_little_arm()
7641 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7642 the presence of a Thumb symbol and switch to decoding
7643 Thumb instructions. */
7644
7645 fake_target.flavour = bfd_target_coff_flavour;
7646 fake_bfd.xvec = &fake_target;
7647 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7648 csym.native = &ce;
7649 csym.symbol.the_bfd = &fake_bfd;
7650 csym.symbol.name = "fake";
7651 asym = (asymbol *) & csym;
7652 }
7653
7654 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7655 info->symbols = &asym;
7656 }
7657 else
7658 info->symbols = NULL;
7659
7660 if (info->endian == BFD_ENDIAN_BIG)
7661 return print_insn_big_arm (memaddr, info);
7662 else
7663 return print_insn_little_arm (memaddr, info);
7664}
7665
7666/* The following define instruction sequences that will cause ARM
7667 cpu's to take an undefined instruction trap. These are used to
7668 signal a breakpoint to GDB.
7669
7670 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7671 modes. A different instruction is required for each mode. The ARM
7672 cpu's can also be big or little endian. Thus four different
7673 instructions are needed to support all cases.
7674
7675 Note: ARMv4 defines several new instructions that will take the
7676 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7677 not in fact add the new instructions. The new undefined
7678 instructions in ARMv4 are all instructions that had no defined
7679 behaviour in earlier chips. There is no guarantee that they will
7680 raise an exception, but may be treated as NOP's. In practice, it
7681 may only safe to rely on instructions matching:
7682
7683 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7684 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
7685 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
7686
0963b4bd 7687 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7688 following use a condition predicate of ALWAYS so it is always TRUE.
7689
7690 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7691 and NetBSD all use a software interrupt rather than an undefined
7692 instruction to force a trap. This can be handled by by the
7693 abi-specific code during establishment of the gdbarch vector. */
7694
7695#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7696#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7697#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7698#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7699
948f8e3d
PA
7700static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7701static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7702static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7703static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b
JB
7704
7705/* Determine the type and size of breakpoint to insert at PCPTR. Uses
7706 the program counter value to determine whether a 16-bit or 32-bit
7707 breakpoint should be used. It returns a pointer to a string of
7708 bytes that encode a breakpoint instruction, stores the length of
7709 the string to *lenptr, and adjusts the program counter (if
7710 necessary) to point to the actual memory location where the
7711 breakpoint should be inserted. */
7712
7713static const unsigned char *
7714arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
7715{
7716 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7717 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7718
9779414d 7719 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7720 {
7721 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7722
7723 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7724 check whether we are replacing a 32-bit instruction. */
7725 if (tdep->thumb2_breakpoint != NULL)
7726 {
7727 gdb_byte buf[2];
7728 if (target_read_memory (*pcptr, buf, 2) == 0)
7729 {
7730 unsigned short inst1;
7731 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7732 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
7733 {
7734 *lenptr = tdep->thumb2_breakpoint_size;
7735 return tdep->thumb2_breakpoint;
7736 }
7737 }
7738 }
7739
cca44b1b
JB
7740 *lenptr = tdep->thumb_breakpoint_size;
7741 return tdep->thumb_breakpoint;
7742 }
7743 else
7744 {
7745 *lenptr = tdep->arm_breakpoint_size;
7746 return tdep->arm_breakpoint;
7747 }
7748}
7749
177321bd
DJ
7750static void
7751arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
7752 int *kindptr)
7753{
177321bd
DJ
7754 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
7755
9779414d 7756 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
7757 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
7758 that this is not confused with a 32-bit ARM breakpoint. */
7759 *kindptr = 3;
7760}
7761
cca44b1b
JB
7762/* Extract from an array REGBUF containing the (raw) register state a
7763 function return value of type TYPE, and copy that, in virtual
7764 format, into VALBUF. */
7765
7766static void
7767arm_extract_return_value (struct type *type, struct regcache *regs,
7768 gdb_byte *valbuf)
7769{
7770 struct gdbarch *gdbarch = get_regcache_arch (regs);
7771 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7772
7773 if (TYPE_CODE_FLT == TYPE_CODE (type))
7774 {
7775 switch (gdbarch_tdep (gdbarch)->fp_model)
7776 {
7777 case ARM_FLOAT_FPA:
7778 {
7779 /* The value is in register F0 in internal format. We need to
7780 extract the raw value and then convert it to the desired
7781 internal type. */
7782 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7783
7784 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
7785 convert_from_extended (floatformat_from_type (type), tmpbuf,
7786 valbuf, gdbarch_byte_order (gdbarch));
7787 }
7788 break;
7789
7790 case ARM_FLOAT_SOFT_FPA:
7791 case ARM_FLOAT_SOFT_VFP:
7792 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7793 not using the VFP ABI code. */
7794 case ARM_FLOAT_VFP:
7795 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
7796 if (TYPE_LENGTH (type) > 4)
7797 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
7798 valbuf + INT_REGISTER_SIZE);
7799 break;
7800
7801 default:
0963b4bd
MS
7802 internal_error (__FILE__, __LINE__,
7803 _("arm_extract_return_value: "
7804 "Floating point model not supported"));
cca44b1b
JB
7805 break;
7806 }
7807 }
7808 else if (TYPE_CODE (type) == TYPE_CODE_INT
7809 || TYPE_CODE (type) == TYPE_CODE_CHAR
7810 || TYPE_CODE (type) == TYPE_CODE_BOOL
7811 || TYPE_CODE (type) == TYPE_CODE_PTR
7812 || TYPE_CODE (type) == TYPE_CODE_REF
7813 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7814 {
b021a221
MS
7815 /* If the type is a plain integer, then the access is
7816 straight-forward. Otherwise we have to play around a bit
7817 more. */
cca44b1b
JB
7818 int len = TYPE_LENGTH (type);
7819 int regno = ARM_A1_REGNUM;
7820 ULONGEST tmp;
7821
7822 while (len > 0)
7823 {
7824 /* By using store_unsigned_integer we avoid having to do
7825 anything special for small big-endian values. */
7826 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7827 store_unsigned_integer (valbuf,
7828 (len > INT_REGISTER_SIZE
7829 ? INT_REGISTER_SIZE : len),
7830 byte_order, tmp);
7831 len -= INT_REGISTER_SIZE;
7832 valbuf += INT_REGISTER_SIZE;
7833 }
7834 }
7835 else
7836 {
7837 /* For a structure or union the behaviour is as if the value had
7838 been stored to word-aligned memory and then loaded into
7839 registers with 32-bit load instruction(s). */
7840 int len = TYPE_LENGTH (type);
7841 int regno = ARM_A1_REGNUM;
7842 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7843
7844 while (len > 0)
7845 {
7846 regcache_cooked_read (regs, regno++, tmpbuf);
7847 memcpy (valbuf, tmpbuf,
7848 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7849 len -= INT_REGISTER_SIZE;
7850 valbuf += INT_REGISTER_SIZE;
7851 }
7852 }
7853}
7854
7855
7856/* Will a function return an aggregate type in memory or in a
7857 register? Return 0 if an aggregate type can be returned in a
7858 register, 1 if it must be returned in memory. */
7859
7860static int
7861arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7862{
cca44b1b
JB
7863 enum type_code code;
7864
f168693b 7865 type = check_typedef (type);
cca44b1b 7866
b13c8ab2
YQ
7867 /* Simple, non-aggregate types (ie not including vectors and
7868 complex) are always returned in a register (or registers). */
7869 code = TYPE_CODE (type);
7870 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7871 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7872 return 0;
cca44b1b 7873
c4312b19
YQ
7874 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7875 {
7876 /* Vector values should be returned using ARM registers if they
7877 are not over 16 bytes. */
7878 return (TYPE_LENGTH (type) > 16);
7879 }
7880
b13c8ab2 7881 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7882 {
b13c8ab2
YQ
7883 /* The AAPCS says all aggregates not larger than a word are returned
7884 in a register. */
7885 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
7886 return 0;
7887
cca44b1b
JB
7888 return 1;
7889 }
b13c8ab2
YQ
7890 else
7891 {
7892 int nRc;
cca44b1b 7893
b13c8ab2
YQ
7894 /* All aggregate types that won't fit in a register must be returned
7895 in memory. */
7896 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
7897 return 1;
cca44b1b 7898
b13c8ab2
YQ
7899 /* In the ARM ABI, "integer" like aggregate types are returned in
7900 registers. For an aggregate type to be integer like, its size
7901 must be less than or equal to INT_REGISTER_SIZE and the
7902 offset of each addressable subfield must be zero. Note that bit
7903 fields are not addressable, and all addressable subfields of
7904 unions always start at offset zero.
cca44b1b 7905
b13c8ab2
YQ
7906 This function is based on the behaviour of GCC 2.95.1.
7907 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7908
b13c8ab2
YQ
7909 Note: All versions of GCC before GCC 2.95.2 do not set up the
7910 parameters correctly for a function returning the following
7911 structure: struct { float f;}; This should be returned in memory,
7912 not a register. Richard Earnshaw sent me a patch, but I do not
7913 know of any way to detect if a function like the above has been
7914 compiled with the correct calling convention. */
7915
7916 /* Assume all other aggregate types can be returned in a register.
7917 Run a check for structures, unions and arrays. */
7918 nRc = 0;
67255d04 7919
b13c8ab2
YQ
7920 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7921 {
7922 int i;
7923 /* Need to check if this struct/union is "integer" like. For
7924 this to be true, its size must be less than or equal to
7925 INT_REGISTER_SIZE and the offset of each addressable
7926 subfield must be zero. Note that bit fields are not
7927 addressable, and unions always start at offset zero. If any
7928 of the subfields is a floating point type, the struct/union
7929 cannot be an integer type. */
7930
7931 /* For each field in the object, check:
7932 1) Is it FP? --> yes, nRc = 1;
7933 2) Is it addressable (bitpos != 0) and
7934 not packed (bitsize == 0)?
7935 --> yes, nRc = 1
7936 */
7937
7938 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7939 {
b13c8ab2
YQ
7940 enum type_code field_type_code;
7941
7942 field_type_code
7943 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7944 i)));
7945
7946 /* Is it a floating point type field? */
7947 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7948 {
7949 nRc = 1;
7950 break;
7951 }
b13c8ab2
YQ
7952
7953 /* If bitpos != 0, then we have to care about it. */
7954 if (TYPE_FIELD_BITPOS (type, i) != 0)
7955 {
7956 /* Bitfields are not addressable. If the field bitsize is
7957 zero, then the field is not packed. Hence it cannot be
7958 a bitfield or any other packed type. */
7959 if (TYPE_FIELD_BITSIZE (type, i) == 0)
7960 {
7961 nRc = 1;
7962 break;
7963 }
7964 }
67255d04
RE
7965 }
7966 }
67255d04 7967
b13c8ab2
YQ
7968 return nRc;
7969 }
67255d04
RE
7970}
7971
34e8f22d
RE
7972/* Write into appropriate registers a function return value of type
7973 TYPE, given in virtual format. */
7974
7975static void
b508a996 7976arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 7977 const gdb_byte *valbuf)
34e8f22d 7978{
be8626e0 7979 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 7980 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 7981
34e8f22d
RE
7982 if (TYPE_CODE (type) == TYPE_CODE_FLT)
7983 {
e362b510 7984 gdb_byte buf[MAX_REGISTER_SIZE];
34e8f22d 7985
be8626e0 7986 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
7987 {
7988 case ARM_FLOAT_FPA:
7989
be8626e0
MD
7990 convert_to_extended (floatformat_from_type (type), buf, valbuf,
7991 gdbarch_byte_order (gdbarch));
b508a996 7992 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
7993 break;
7994
fd50bc42 7995 case ARM_FLOAT_SOFT_FPA:
08216dd7 7996 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
7997 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7998 not using the VFP ABI code. */
7999 case ARM_FLOAT_VFP:
b508a996
RE
8000 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
8001 if (TYPE_LENGTH (type) > 4)
8002 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 8003 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
8004 break;
8005
8006 default:
9b20d036
MS
8007 internal_error (__FILE__, __LINE__,
8008 _("arm_store_return_value: Floating "
8009 "point model not supported"));
08216dd7
RE
8010 break;
8011 }
34e8f22d 8012 }
b508a996
RE
8013 else if (TYPE_CODE (type) == TYPE_CODE_INT
8014 || TYPE_CODE (type) == TYPE_CODE_CHAR
8015 || TYPE_CODE (type) == TYPE_CODE_BOOL
8016 || TYPE_CODE (type) == TYPE_CODE_PTR
8017 || TYPE_CODE (type) == TYPE_CODE_REF
8018 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8019 {
8020 if (TYPE_LENGTH (type) <= 4)
8021 {
8022 /* Values of one word or less are zero/sign-extended and
8023 returned in r0. */
7a5ea0d4 8024 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8025 LONGEST val = unpack_long (type, valbuf);
8026
e17a4113 8027 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
8028 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8029 }
8030 else
8031 {
8032 /* Integral values greater than one word are stored in consecutive
8033 registers starting with r0. This will always be a multiple of
8034 the regiser size. */
8035 int len = TYPE_LENGTH (type);
8036 int regno = ARM_A1_REGNUM;
8037
8038 while (len > 0)
8039 {
8040 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
8041 len -= INT_REGISTER_SIZE;
8042 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8043 }
8044 }
8045 }
34e8f22d 8046 else
b508a996
RE
8047 {
8048 /* For a structure or union the behaviour is as if the value had
8049 been stored to word-aligned memory and then loaded into
8050 registers with 32-bit load instruction(s). */
8051 int len = TYPE_LENGTH (type);
8052 int regno = ARM_A1_REGNUM;
7a5ea0d4 8053 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8054
8055 while (len > 0)
8056 {
8057 memcpy (tmpbuf, valbuf,
7a5ea0d4 8058 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 8059 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
8060 len -= INT_REGISTER_SIZE;
8061 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8062 }
8063 }
34e8f22d
RE
8064}
8065
2af48f68
PB
8066
8067/* Handle function return values. */
8068
8069static enum return_value_convention
6a3a010b 8070arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8071 struct type *valtype, struct regcache *regcache,
8072 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8073{
7c00367c 8074 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8075 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8076 enum arm_vfp_cprc_base_type vfp_base_type;
8077 int vfp_base_count;
8078
8079 if (arm_vfp_abi_for_function (gdbarch, func_type)
8080 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8081 {
8082 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8083 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8084 int i;
8085 for (i = 0; i < vfp_base_count; i++)
8086 {
58d6951d
DJ
8087 if (reg_char == 'q')
8088 {
8089 if (writebuf)
8090 arm_neon_quad_write (gdbarch, regcache, i,
8091 writebuf + i * unit_length);
8092
8093 if (readbuf)
8094 arm_neon_quad_read (gdbarch, regcache, i,
8095 readbuf + i * unit_length);
8096 }
8097 else
8098 {
8099 char name_buf[4];
8100 int regnum;
8101
8c042590 8102 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8103 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8104 strlen (name_buf));
8105 if (writebuf)
8106 regcache_cooked_write (regcache, regnum,
8107 writebuf + i * unit_length);
8108 if (readbuf)
8109 regcache_cooked_read (regcache, regnum,
8110 readbuf + i * unit_length);
8111 }
90445bd3
DJ
8112 }
8113 return RETURN_VALUE_REGISTER_CONVENTION;
8114 }
7c00367c 8115
2af48f68
PB
8116 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8117 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8118 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8119 {
7c00367c
MK
8120 if (tdep->struct_return == pcc_struct_return
8121 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8122 return RETURN_VALUE_STRUCT_CONVENTION;
8123 }
b13c8ab2
YQ
8124 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8125 {
8126 if (arm_return_in_memory (gdbarch, valtype))
8127 return RETURN_VALUE_STRUCT_CONVENTION;
8128 }
7052e42c 8129
2af48f68
PB
8130 if (writebuf)
8131 arm_store_return_value (valtype, regcache, writebuf);
8132
8133 if (readbuf)
8134 arm_extract_return_value (valtype, regcache, readbuf);
8135
8136 return RETURN_VALUE_REGISTER_CONVENTION;
8137}
8138
8139
9df628e0 8140static int
60ade65d 8141arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8142{
e17a4113
UW
8143 struct gdbarch *gdbarch = get_frame_arch (frame);
8144 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8145 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8146 CORE_ADDR jb_addr;
e362b510 8147 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 8148
60ade65d 8149 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8150
8151 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 8152 INT_REGISTER_SIZE))
9df628e0
RE
8153 return 0;
8154
e17a4113 8155 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8156 return 1;
8157}
8158
faa95490
DJ
8159/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8160 return the target PC. Otherwise return 0. */
c906108c
SS
8161
8162CORE_ADDR
52f729a7 8163arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8164{
2c02bd72 8165 const char *name;
faa95490 8166 int namelen;
c906108c
SS
8167 CORE_ADDR start_addr;
8168
8169 /* Find the starting address and name of the function containing the PC. */
8170 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8171 {
8172 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8173 check here. */
8174 start_addr = arm_skip_bx_reg (frame, pc);
8175 if (start_addr != 0)
8176 return start_addr;
8177
8178 return 0;
8179 }
c906108c 8180
faa95490
DJ
8181 /* If PC is in a Thumb call or return stub, return the address of the
8182 target PC, which is in a register. The thunk functions are called
8183 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8184 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8185 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8186 if (startswith (name, "_call_via_")
8187 || startswith (name, "__ARM_call_via_"))
c906108c 8188 {
ed9a39eb
JM
8189 /* Use the name suffix to determine which register contains the
8190 target PC. */
c5aa993b
JM
8191 static char *table[15] =
8192 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8193 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8194 };
c906108c 8195 int regno;
faa95490 8196 int offset = strlen (name) - 2;
c906108c
SS
8197
8198 for (regno = 0; regno <= 14; regno++)
faa95490 8199 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8200 return get_frame_register_unsigned (frame, regno);
c906108c 8201 }
ed9a39eb 8202
faa95490
DJ
8203 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8204 non-interworking calls to foo. We could decode the stubs
8205 to find the target but it's easier to use the symbol table. */
8206 namelen = strlen (name);
8207 if (name[0] == '_' && name[1] == '_'
8208 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8209 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8210 || (namelen > 2 + strlen ("_from_arm")
61012eef 8211 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8212 {
8213 char *target_name;
8214 int target_len = namelen - 2;
3b7344d5 8215 struct bound_minimal_symbol minsym;
faa95490
DJ
8216 struct objfile *objfile;
8217 struct obj_section *sec;
8218
8219 if (name[namelen - 1] == 'b')
8220 target_len -= strlen ("_from_thumb");
8221 else
8222 target_len -= strlen ("_from_arm");
8223
224c3ddb 8224 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8225 memcpy (target_name, name + 2, target_len);
8226 target_name[target_len] = '\0';
8227
8228 sec = find_pc_section (pc);
8229 objfile = (sec == NULL) ? NULL : sec->objfile;
8230 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8231 if (minsym.minsym != NULL)
77e371c0 8232 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8233 else
8234 return 0;
8235 }
8236
c5aa993b 8237 return 0; /* not a stub */
c906108c
SS
8238}
8239
afd7eef0
RE
8240static void
8241set_arm_command (char *args, int from_tty)
8242{
edefbb7c
AC
8243 printf_unfiltered (_("\
8244\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8245 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8246}
8247
8248static void
8249show_arm_command (char *args, int from_tty)
8250{
26304000 8251 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8252}
8253
28e97307
DJ
8254static void
8255arm_update_current_architecture (void)
fd50bc42 8256{
28e97307 8257 struct gdbarch_info info;
fd50bc42 8258
28e97307 8259 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8260 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8261 return;
fd50bc42 8262
28e97307
DJ
8263 /* Update the architecture. */
8264 gdbarch_info_init (&info);
fd50bc42 8265
28e97307 8266 if (!gdbarch_update_p (info))
9b20d036 8267 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8268}
8269
8270static void
8271set_fp_model_sfunc (char *args, int from_tty,
8272 struct cmd_list_element *c)
8273{
570dc176 8274 int fp_model;
fd50bc42
RE
8275
8276 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8277 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8278 {
aead7601 8279 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8280 break;
8281 }
8282
8283 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8284 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8285 current_fp_model);
8286
28e97307 8287 arm_update_current_architecture ();
fd50bc42
RE
8288}
8289
8290static void
08546159
AC
8291show_fp_model (struct ui_file *file, int from_tty,
8292 struct cmd_list_element *c, const char *value)
fd50bc42 8293{
f5656ead 8294 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8295
28e97307 8296 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8297 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8298 fprintf_filtered (file, _("\
8299The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8300 fp_model_strings[tdep->fp_model]);
8301 else
8302 fprintf_filtered (file, _("\
8303The current ARM floating point model is \"%s\".\n"),
8304 fp_model_strings[arm_fp_model]);
8305}
8306
8307static void
8308arm_set_abi (char *args, int from_tty,
8309 struct cmd_list_element *c)
8310{
570dc176 8311 int arm_abi;
28e97307
DJ
8312
8313 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8314 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8315 {
aead7601 8316 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8317 break;
8318 }
8319
8320 if (arm_abi == ARM_ABI_LAST)
8321 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8322 arm_abi_string);
8323
8324 arm_update_current_architecture ();
8325}
8326
8327static void
8328arm_show_abi (struct ui_file *file, int from_tty,
8329 struct cmd_list_element *c, const char *value)
8330{
f5656ead 8331 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8332
8333 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8334 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8335 fprintf_filtered (file, _("\
8336The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8337 arm_abi_strings[tdep->arm_abi]);
8338 else
8339 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8340 arm_abi_string);
fd50bc42
RE
8341}
8342
0428b8f5
DJ
8343static void
8344arm_show_fallback_mode (struct ui_file *file, int from_tty,
8345 struct cmd_list_element *c, const char *value)
8346{
0963b4bd
MS
8347 fprintf_filtered (file,
8348 _("The current execution mode assumed "
8349 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8350 arm_fallback_mode_string);
8351}
8352
8353static void
8354arm_show_force_mode (struct ui_file *file, int from_tty,
8355 struct cmd_list_element *c, const char *value)
8356{
f5656ead 8357 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
0428b8f5 8358
0963b4bd
MS
8359 fprintf_filtered (file,
8360 _("The current execution mode assumed "
8361 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8362 arm_force_mode_string);
8363}
8364
afd7eef0
RE
8365/* If the user changes the register disassembly style used for info
8366 register and other commands, we have to also switch the style used
8367 in opcodes for disassembly output. This function is run in the "set
8368 arm disassembly" command, and does that. */
bc90b915
FN
8369
8370static void
afd7eef0 8371set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
8372 struct cmd_list_element *c)
8373{
afd7eef0 8374 set_disassembly_style ();
bc90b915
FN
8375}
8376\f
966fbf70 8377/* Return the ARM register name corresponding to register I. */
a208b0cb 8378static const char *
d93859e2 8379arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8380{
58d6951d
DJ
8381 const int num_regs = gdbarch_num_regs (gdbarch);
8382
8383 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8384 && i >= num_regs && i < num_regs + 32)
8385 {
8386 static const char *const vfp_pseudo_names[] = {
8387 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8388 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8389 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8390 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8391 };
8392
8393 return vfp_pseudo_names[i - num_regs];
8394 }
8395
8396 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8397 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8398 {
8399 static const char *const neon_pseudo_names[] = {
8400 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8401 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8402 };
8403
8404 return neon_pseudo_names[i - num_regs - 32];
8405 }
8406
ff6f572f
DJ
8407 if (i >= ARRAY_SIZE (arm_register_names))
8408 /* These registers are only supported on targets which supply
8409 an XML description. */
8410 return "";
8411
966fbf70
RE
8412 return arm_register_names[i];
8413}
8414
bc90b915 8415static void
afd7eef0 8416set_disassembly_style (void)
bc90b915 8417{
123dc839 8418 int current;
bc90b915 8419
123dc839
DJ
8420 /* Find the style that the user wants. */
8421 for (current = 0; current < num_disassembly_options; current++)
8422 if (disassembly_style == valid_disassembly_styles[current])
8423 break;
8424 gdb_assert (current < num_disassembly_options);
bc90b915 8425
94c30b78 8426 /* Synchronize the disassembler. */
bc90b915
FN
8427 set_arm_regname_option (current);
8428}
8429
082fc60d
RE
8430/* Test whether the coff symbol specific value corresponds to a Thumb
8431 function. */
8432
8433static int
8434coff_sym_is_thumb (int val)
8435{
f8bf5763
PM
8436 return (val == C_THUMBEXT
8437 || val == C_THUMBSTAT
8438 || val == C_THUMBEXTFUNC
8439 || val == C_THUMBSTATFUNC
8440 || val == C_THUMBLABEL);
082fc60d
RE
8441}
8442
8443/* arm_coff_make_msymbol_special()
8444 arm_elf_make_msymbol_special()
8445
8446 These functions test whether the COFF or ELF symbol corresponds to
8447 an address in thumb code, and set a "special" bit in a minimal
8448 symbol to indicate that it does. */
8449
34e8f22d 8450static void
082fc60d
RE
8451arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8452{
467d42c4
UW
8453 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
8454 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8455 MSYMBOL_SET_SPECIAL (msym);
8456}
8457
34e8f22d 8458static void
082fc60d
RE
8459arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8460{
8461 if (coff_sym_is_thumb (val))
8462 MSYMBOL_SET_SPECIAL (msym);
8463}
8464
60c5725c 8465static void
c1bd65d0 8466arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 8467{
9a3c8263 8468 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
8469 unsigned int i;
8470
8471 for (i = 0; i < objfile->obfd->section_count; i++)
8472 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8473}
8474
8475static void
8476arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8477 asymbol *sym)
8478{
8479 const char *name = bfd_asymbol_name (sym);
8480 struct arm_per_objfile *data;
8481 VEC(arm_mapping_symbol_s) **map_p;
8482 struct arm_mapping_symbol new_map_sym;
8483
8484 gdb_assert (name[0] == '$');
8485 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8486 return;
8487
9a3c8263
SM
8488 data = (struct arm_per_objfile *) objfile_data (objfile,
8489 arm_objfile_data_key);
60c5725c
DJ
8490 if (data == NULL)
8491 {
8492 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8493 struct arm_per_objfile);
8494 set_objfile_data (objfile, arm_objfile_data_key, data);
8495 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8496 objfile->obfd->section_count,
8497 VEC(arm_mapping_symbol_s) *);
8498 }
8499 map_p = &data->section_maps[bfd_get_section (sym)->index];
8500
8501 new_map_sym.value = sym->value;
8502 new_map_sym.type = name[1];
8503
8504 /* Assume that most mapping symbols appear in order of increasing
8505 value. If they were randomly distributed, it would be faster to
8506 always push here and then sort at first use. */
8507 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8508 {
8509 struct arm_mapping_symbol *prev_map_sym;
8510
8511 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8512 if (prev_map_sym->value >= sym->value)
8513 {
8514 unsigned int idx;
8515 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8516 arm_compare_mapping_symbols);
8517 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8518 return;
8519 }
8520 }
8521
8522 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8523}
8524
756fe439 8525static void
61a1198a 8526arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8527{
9779414d 8528 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 8529 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8530
8531 /* If necessary, set the T bit. */
8532 if (arm_apcs_32)
8533 {
9779414d 8534 ULONGEST val, t_bit;
61a1198a 8535 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8536 t_bit = arm_psr_thumb_bit (gdbarch);
8537 if (arm_pc_is_thumb (gdbarch, pc))
8538 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8539 val | t_bit);
756fe439 8540 else
61a1198a 8541 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8542 val & ~t_bit);
756fe439
DJ
8543 }
8544}
123dc839 8545
58d6951d
DJ
8546/* Read the contents of a NEON quad register, by reading from two
8547 double registers. This is used to implement the quad pseudo
8548 registers, and for argument passing in case the quad registers are
8549 missing; vectors are passed in quad registers when using the VFP
8550 ABI, even if a NEON unit is not present. REGNUM is the index of
8551 the quad register, in [0, 15]. */
8552
05d1431c 8553static enum register_status
58d6951d
DJ
8554arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
8555 int regnum, gdb_byte *buf)
8556{
8557 char name_buf[4];
8558 gdb_byte reg_buf[8];
8559 int offset, double_regnum;
05d1431c 8560 enum register_status status;
58d6951d 8561
8c042590 8562 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8563 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8564 strlen (name_buf));
8565
8566 /* d0 is always the least significant half of q0. */
8567 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8568 offset = 8;
8569 else
8570 offset = 0;
8571
05d1431c
PA
8572 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8573 if (status != REG_VALID)
8574 return status;
58d6951d
DJ
8575 memcpy (buf + offset, reg_buf, 8);
8576
8577 offset = 8 - offset;
05d1431c
PA
8578 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
8579 if (status != REG_VALID)
8580 return status;
58d6951d 8581 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8582
8583 return REG_VALID;
58d6951d
DJ
8584}
8585
05d1431c 8586static enum register_status
58d6951d
DJ
8587arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
8588 int regnum, gdb_byte *buf)
8589{
8590 const int num_regs = gdbarch_num_regs (gdbarch);
8591 char name_buf[4];
8592 gdb_byte reg_buf[8];
8593 int offset, double_regnum;
8594
8595 gdb_assert (regnum >= num_regs);
8596 regnum -= num_regs;
8597
8598 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8599 /* Quad-precision register. */
05d1431c 8600 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8601 else
8602 {
05d1431c
PA
8603 enum register_status status;
8604
58d6951d
DJ
8605 /* Single-precision register. */
8606 gdb_assert (regnum < 32);
8607
8608 /* s0 is always the least significant half of d0. */
8609 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8610 offset = (regnum & 1) ? 0 : 4;
8611 else
8612 offset = (regnum & 1) ? 4 : 0;
8613
8c042590 8614 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8615 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8616 strlen (name_buf));
8617
05d1431c
PA
8618 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8619 if (status == REG_VALID)
8620 memcpy (buf, reg_buf + offset, 4);
8621 return status;
58d6951d
DJ
8622 }
8623}
8624
8625/* Store the contents of BUF to a NEON quad register, by writing to
8626 two double registers. This is used to implement the quad pseudo
8627 registers, and for argument passing in case the quad registers are
8628 missing; vectors are passed in quad registers when using the VFP
8629 ABI, even if a NEON unit is not present. REGNUM is the index
8630 of the quad register, in [0, 15]. */
8631
8632static void
8633arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8634 int regnum, const gdb_byte *buf)
8635{
8636 char name_buf[4];
58d6951d
DJ
8637 int offset, double_regnum;
8638
8c042590 8639 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8640 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8641 strlen (name_buf));
8642
8643 /* d0 is always the least significant half of q0. */
8644 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8645 offset = 8;
8646 else
8647 offset = 0;
8648
8649 regcache_raw_write (regcache, double_regnum, buf + offset);
8650 offset = 8 - offset;
8651 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
8652}
8653
8654static void
8655arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8656 int regnum, const gdb_byte *buf)
8657{
8658 const int num_regs = gdbarch_num_regs (gdbarch);
8659 char name_buf[4];
8660 gdb_byte reg_buf[8];
8661 int offset, double_regnum;
8662
8663 gdb_assert (regnum >= num_regs);
8664 regnum -= num_regs;
8665
8666 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8667 /* Quad-precision register. */
8668 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8669 else
8670 {
8671 /* Single-precision register. */
8672 gdb_assert (regnum < 32);
8673
8674 /* s0 is always the least significant half of d0. */
8675 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8676 offset = (regnum & 1) ? 0 : 4;
8677 else
8678 offset = (regnum & 1) ? 4 : 0;
8679
8c042590 8680 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8681 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8682 strlen (name_buf));
8683
8684 regcache_raw_read (regcache, double_regnum, reg_buf);
8685 memcpy (reg_buf + offset, buf, 4);
8686 regcache_raw_write (regcache, double_regnum, reg_buf);
8687 }
8688}
8689
123dc839
DJ
8690static struct value *
8691value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8692{
9a3c8263 8693 const int *reg_p = (const int *) baton;
123dc839
DJ
8694 return value_of_register (*reg_p, frame);
8695}
97e03143 8696\f
70f80edf
JT
8697static enum gdb_osabi
8698arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8699{
2af48f68 8700 unsigned int elfosabi;
70f80edf 8701 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8702
70f80edf 8703 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8704
28e97307
DJ
8705 if (elfosabi == ELFOSABI_ARM)
8706 /* GNU tools use this value. Check note sections in this case,
8707 as well. */
8708 bfd_map_over_sections (abfd,
8709 generic_elf_osabi_sniff_abi_tag_sections,
8710 &osabi);
97e03143 8711
28e97307 8712 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8713 return osabi;
97e03143
RE
8714}
8715
54483882
YQ
8716static int
8717arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8718 struct reggroup *group)
8719{
2c291032
YQ
8720 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8721 this, FPS register belongs to save_regroup, restore_reggroup, and
8722 all_reggroup, of course. */
54483882 8723 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8724 return (group == float_reggroup
8725 || group == save_reggroup
8726 || group == restore_reggroup
8727 || group == all_reggroup);
54483882
YQ
8728 else
8729 return default_register_reggroup_p (gdbarch, regnum, group);
8730}
8731
25f8c692
JL
8732\f
8733/* For backward-compatibility we allow two 'g' packet lengths with
8734 the remote protocol depending on whether FPA registers are
8735 supplied. M-profile targets do not have FPA registers, but some
8736 stubs already exist in the wild which use a 'g' packet which
8737 supplies them albeit with dummy values. The packet format which
8738 includes FPA registers should be considered deprecated for
8739 M-profile targets. */
8740
8741static void
8742arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8743{
8744 if (gdbarch_tdep (gdbarch)->is_m)
8745 {
8746 /* If we know from the executable this is an M-profile target,
8747 cater for remote targets whose register set layout is the
8748 same as the FPA layout. */
8749 register_remote_g_packet_guess (gdbarch,
03145bf4 8750 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
8751 (16 * INT_REGISTER_SIZE)
8752 + (8 * FP_REGISTER_SIZE)
8753 + (2 * INT_REGISTER_SIZE),
8754 tdesc_arm_with_m_fpa_layout);
8755
8756 /* The regular M-profile layout. */
8757 register_remote_g_packet_guess (gdbarch,
8758 /* r0-r12,sp,lr,pc; xpsr */
8759 (16 * INT_REGISTER_SIZE)
8760 + INT_REGISTER_SIZE,
8761 tdesc_arm_with_m);
3184d3f9
JL
8762
8763 /* M-profile plus M4F VFP. */
8764 register_remote_g_packet_guess (gdbarch,
8765 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8766 (16 * INT_REGISTER_SIZE)
8767 + (16 * VFP_REGISTER_SIZE)
8768 + (2 * INT_REGISTER_SIZE),
8769 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8770 }
8771
8772 /* Otherwise we don't have a useful guess. */
8773}
8774
70f80edf 8775\f
da3c6d4a
MS
8776/* Initialize the current architecture based on INFO. If possible,
8777 re-use an architecture from ARCHES, which is a list of
8778 architectures already created during this debugging session.
97e03143 8779
da3c6d4a
MS
8780 Called e.g. at program startup, when reading a core file, and when
8781 reading a binary file. */
97e03143 8782
39bbf761
RE
8783static struct gdbarch *
8784arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8785{
97e03143 8786 struct gdbarch_tdep *tdep;
39bbf761 8787 struct gdbarch *gdbarch;
28e97307
DJ
8788 struct gdbarch_list *best_arch;
8789 enum arm_abi_kind arm_abi = arm_abi_global;
8790 enum arm_float_model fp_model = arm_fp_model;
123dc839 8791 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8792 int i, is_m = 0;
330c6ca9 8793 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8794 int have_wmmx_registers = 0;
58d6951d 8795 int have_neon = 0;
ff6f572f 8796 int have_fpa_registers = 1;
9779414d
DJ
8797 const struct target_desc *tdesc = info.target_desc;
8798
8799 /* If we have an object to base this architecture on, try to determine
8800 its ABI. */
8801
8802 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8803 {
8804 int ei_osabi, e_flags;
8805
8806 switch (bfd_get_flavour (info.abfd))
8807 {
8808 case bfd_target_aout_flavour:
8809 /* Assume it's an old APCS-style ABI. */
8810 arm_abi = ARM_ABI_APCS;
8811 break;
8812
8813 case bfd_target_coff_flavour:
8814 /* Assume it's an old APCS-style ABI. */
8815 /* XXX WinCE? */
8816 arm_abi = ARM_ABI_APCS;
8817 break;
8818
8819 case bfd_target_elf_flavour:
8820 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8821 e_flags = elf_elfheader (info.abfd)->e_flags;
8822
8823 if (ei_osabi == ELFOSABI_ARM)
8824 {
8825 /* GNU tools used to use this value, but do not for EABI
8826 objects. There's nowhere to tag an EABI version
8827 anyway, so assume APCS. */
8828 arm_abi = ARM_ABI_APCS;
8829 }
d403db27 8830 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8831 {
8832 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8833 int attr_arch, attr_profile;
8834
8835 switch (eabi_ver)
8836 {
8837 case EF_ARM_EABI_UNKNOWN:
8838 /* Assume GNU tools. */
8839 arm_abi = ARM_ABI_APCS;
8840 break;
8841
8842 case EF_ARM_EABI_VER4:
8843 case EF_ARM_EABI_VER5:
8844 arm_abi = ARM_ABI_AAPCS;
8845 /* EABI binaries default to VFP float ordering.
8846 They may also contain build attributes that can
8847 be used to identify if the VFP argument-passing
8848 ABI is in use. */
8849 if (fp_model == ARM_FLOAT_AUTO)
8850 {
8851#ifdef HAVE_ELF
8852 switch (bfd_elf_get_obj_attr_int (info.abfd,
8853 OBJ_ATTR_PROC,
8854 Tag_ABI_VFP_args))
8855 {
b35b0298 8856 case AEABI_VFP_args_base:
9779414d
DJ
8857 /* "The user intended FP parameter/result
8858 passing to conform to AAPCS, base
8859 variant". */
8860 fp_model = ARM_FLOAT_SOFT_VFP;
8861 break;
b35b0298 8862 case AEABI_VFP_args_vfp:
9779414d
DJ
8863 /* "The user intended FP parameter/result
8864 passing to conform to AAPCS, VFP
8865 variant". */
8866 fp_model = ARM_FLOAT_VFP;
8867 break;
b35b0298 8868 case AEABI_VFP_args_toolchain:
9779414d
DJ
8869 /* "The user intended FP parameter/result
8870 passing to conform to tool chain-specific
8871 conventions" - we don't know any such
8872 conventions, so leave it as "auto". */
8873 break;
b35b0298 8874 case AEABI_VFP_args_compatible:
5c294fee
TG
8875 /* "Code is compatible with both the base
8876 and VFP variants; the user did not permit
8877 non-variadic functions to pass FP
8878 parameters/results" - leave it as
8879 "auto". */
8880 break;
9779414d
DJ
8881 default:
8882 /* Attribute value not mentioned in the
5c294fee 8883 November 2012 ABI, so leave it as
9779414d
DJ
8884 "auto". */
8885 break;
8886 }
8887#else
8888 fp_model = ARM_FLOAT_SOFT_VFP;
8889#endif
8890 }
8891 break;
8892
8893 default:
8894 /* Leave it as "auto". */
8895 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8896 break;
8897 }
8898
8899#ifdef HAVE_ELF
8900 /* Detect M-profile programs. This only works if the
8901 executable file includes build attributes; GCC does
8902 copy them to the executable, but e.g. RealView does
8903 not. */
8904 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8905 Tag_CPU_arch);
0963b4bd
MS
8906 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
8907 OBJ_ATTR_PROC,
9779414d
DJ
8908 Tag_CPU_arch_profile);
8909 /* GCC specifies the profile for v6-M; RealView only
8910 specifies the profile for architectures starting with
8911 V7 (as opposed to architectures with a tag
8912 numerically greater than TAG_CPU_ARCH_V7). */
8913 if (!tdesc_has_registers (tdesc)
8914 && (attr_arch == TAG_CPU_ARCH_V6_M
8915 || attr_arch == TAG_CPU_ARCH_V6S_M
8916 || attr_profile == 'M'))
25f8c692 8917 is_m = 1;
9779414d
DJ
8918#endif
8919 }
8920
8921 if (fp_model == ARM_FLOAT_AUTO)
8922 {
8923 int e_flags = elf_elfheader (info.abfd)->e_flags;
8924
8925 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8926 {
8927 case 0:
8928 /* Leave it as "auto". Strictly speaking this case
8929 means FPA, but almost nobody uses that now, and
8930 many toolchains fail to set the appropriate bits
8931 for the floating-point model they use. */
8932 break;
8933 case EF_ARM_SOFT_FLOAT:
8934 fp_model = ARM_FLOAT_SOFT_FPA;
8935 break;
8936 case EF_ARM_VFP_FLOAT:
8937 fp_model = ARM_FLOAT_VFP;
8938 break;
8939 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
8940 fp_model = ARM_FLOAT_SOFT_VFP;
8941 break;
8942 }
8943 }
8944
8945 if (e_flags & EF_ARM_BE8)
8946 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
8947
8948 break;
8949
8950 default:
8951 /* Leave it as "auto". */
8952 break;
8953 }
8954 }
123dc839
DJ
8955
8956 /* Check any target description for validity. */
9779414d 8957 if (tdesc_has_registers (tdesc))
123dc839
DJ
8958 {
8959 /* For most registers we require GDB's default names; but also allow
8960 the numeric names for sp / lr / pc, as a convenience. */
8961 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
8962 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
8963 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
8964
8965 const struct tdesc_feature *feature;
58d6951d 8966 int valid_p;
123dc839 8967
9779414d 8968 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8969 "org.gnu.gdb.arm.core");
8970 if (feature == NULL)
9779414d
DJ
8971 {
8972 feature = tdesc_find_feature (tdesc,
8973 "org.gnu.gdb.arm.m-profile");
8974 if (feature == NULL)
8975 return NULL;
8976 else
8977 is_m = 1;
8978 }
123dc839
DJ
8979
8980 tdesc_data = tdesc_data_alloc ();
8981
8982 valid_p = 1;
8983 for (i = 0; i < ARM_SP_REGNUM; i++)
8984 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
8985 arm_register_names[i]);
8986 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8987 ARM_SP_REGNUM,
8988 arm_sp_names);
8989 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8990 ARM_LR_REGNUM,
8991 arm_lr_names);
8992 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8993 ARM_PC_REGNUM,
8994 arm_pc_names);
9779414d
DJ
8995 if (is_m)
8996 valid_p &= tdesc_numbered_register (feature, tdesc_data,
8997 ARM_PS_REGNUM, "xpsr");
8998 else
8999 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9000 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
9001
9002 if (!valid_p)
9003 {
9004 tdesc_data_cleanup (tdesc_data);
9005 return NULL;
9006 }
9007
9779414d 9008 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9009 "org.gnu.gdb.arm.fpa");
9010 if (feature != NULL)
9011 {
9012 valid_p = 1;
9013 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9014 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9015 arm_register_names[i]);
9016 if (!valid_p)
9017 {
9018 tdesc_data_cleanup (tdesc_data);
9019 return NULL;
9020 }
9021 }
ff6f572f
DJ
9022 else
9023 have_fpa_registers = 0;
9024
9779414d 9025 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9026 "org.gnu.gdb.xscale.iwmmxt");
9027 if (feature != NULL)
9028 {
9029 static const char *const iwmmxt_names[] = {
9030 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9031 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9032 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9033 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9034 };
9035
9036 valid_p = 1;
9037 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9038 valid_p
9039 &= tdesc_numbered_register (feature, tdesc_data, i,
9040 iwmmxt_names[i - ARM_WR0_REGNUM]);
9041
9042 /* Check for the control registers, but do not fail if they
9043 are missing. */
9044 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9045 tdesc_numbered_register (feature, tdesc_data, i,
9046 iwmmxt_names[i - ARM_WR0_REGNUM]);
9047
9048 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9049 valid_p
9050 &= tdesc_numbered_register (feature, tdesc_data, i,
9051 iwmmxt_names[i - ARM_WR0_REGNUM]);
9052
9053 if (!valid_p)
9054 {
9055 tdesc_data_cleanup (tdesc_data);
9056 return NULL;
9057 }
a56cc1ce
YQ
9058
9059 have_wmmx_registers = 1;
ff6f572f 9060 }
58d6951d
DJ
9061
9062 /* If we have a VFP unit, check whether the single precision registers
9063 are present. If not, then we will synthesize them as pseudo
9064 registers. */
9779414d 9065 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9066 "org.gnu.gdb.arm.vfp");
9067 if (feature != NULL)
9068 {
9069 static const char *const vfp_double_names[] = {
9070 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9071 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9072 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9073 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9074 };
9075
9076 /* Require the double precision registers. There must be either
9077 16 or 32. */
9078 valid_p = 1;
9079 for (i = 0; i < 32; i++)
9080 {
9081 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9082 ARM_D0_REGNUM + i,
9083 vfp_double_names[i]);
9084 if (!valid_p)
9085 break;
9086 }
2b9e5ea6
UW
9087 if (!valid_p && i == 16)
9088 valid_p = 1;
58d6951d 9089
2b9e5ea6
UW
9090 /* Also require FPSCR. */
9091 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9092 ARM_FPSCR_REGNUM, "fpscr");
9093 if (!valid_p)
58d6951d
DJ
9094 {
9095 tdesc_data_cleanup (tdesc_data);
9096 return NULL;
9097 }
9098
9099 if (tdesc_unnumbered_register (feature, "s0") == 0)
9100 have_vfp_pseudos = 1;
9101
330c6ca9 9102 vfp_register_count = i;
58d6951d
DJ
9103
9104 /* If we have VFP, also check for NEON. The architecture allows
9105 NEON without VFP (integer vector operations only), but GDB
9106 does not support that. */
9779414d 9107 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9108 "org.gnu.gdb.arm.neon");
9109 if (feature != NULL)
9110 {
9111 /* NEON requires 32 double-precision registers. */
9112 if (i != 32)
9113 {
9114 tdesc_data_cleanup (tdesc_data);
9115 return NULL;
9116 }
9117
9118 /* If there are quad registers defined by the stub, use
9119 their type; otherwise (normally) provide them with
9120 the default type. */
9121 if (tdesc_unnumbered_register (feature, "q0") == 0)
9122 have_neon_pseudos = 1;
9123
9124 have_neon = 1;
9125 }
9126 }
123dc839 9127 }
39bbf761 9128
28e97307
DJ
9129 /* If there is already a candidate, use it. */
9130 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9131 best_arch != NULL;
9132 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9133 {
b8926edc
DJ
9134 if (arm_abi != ARM_ABI_AUTO
9135 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9136 continue;
9137
b8926edc
DJ
9138 if (fp_model != ARM_FLOAT_AUTO
9139 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9140 continue;
9141
58d6951d
DJ
9142 /* There are various other properties in tdep that we do not
9143 need to check here: those derived from a target description,
9144 since gdbarches with a different target description are
9145 automatically disqualified. */
9146
9779414d
DJ
9147 /* Do check is_m, though, since it might come from the binary. */
9148 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9149 continue;
9150
28e97307
DJ
9151 /* Found a match. */
9152 break;
9153 }
97e03143 9154
28e97307 9155 if (best_arch != NULL)
123dc839
DJ
9156 {
9157 if (tdesc_data != NULL)
9158 tdesc_data_cleanup (tdesc_data);
9159 return best_arch->gdbarch;
9160 }
28e97307 9161
8d749320 9162 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9163 gdbarch = gdbarch_alloc (&info, tdep);
9164
28e97307
DJ
9165 /* Record additional information about the architecture we are defining.
9166 These are gdbarch discriminators, like the OSABI. */
9167 tdep->arm_abi = arm_abi;
9168 tdep->fp_model = fp_model;
9779414d 9169 tdep->is_m = is_m;
ff6f572f 9170 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9171 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9172 gdb_assert (vfp_register_count == 0
9173 || vfp_register_count == 16
9174 || vfp_register_count == 32);
9175 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9176 tdep->have_vfp_pseudos = have_vfp_pseudos;
9177 tdep->have_neon_pseudos = have_neon_pseudos;
9178 tdep->have_neon = have_neon;
08216dd7 9179
25f8c692
JL
9180 arm_register_g_packet_guesses (gdbarch);
9181
08216dd7 9182 /* Breakpoints. */
9d4fde75 9183 switch (info.byte_order_for_code)
67255d04
RE
9184 {
9185 case BFD_ENDIAN_BIG:
66e810cd
RE
9186 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9187 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9188 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9189 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9190
67255d04
RE
9191 break;
9192
9193 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9194 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9195 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9196 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9197 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9198
67255d04
RE
9199 break;
9200
9201 default:
9202 internal_error (__FILE__, __LINE__,
edefbb7c 9203 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9204 }
9205
d7b486e7
RE
9206 /* On ARM targets char defaults to unsigned. */
9207 set_gdbarch_char_signed (gdbarch, 0);
9208
cca44b1b
JB
9209 /* Note: for displaced stepping, this includes the breakpoint, and one word
9210 of additional scratch space. This setting isn't used for anything beside
9211 displaced stepping at present. */
9212 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9213
9df628e0 9214 /* This should be low enough for everything. */
97e03143 9215 tdep->lowest_pc = 0x20;
94c30b78 9216 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9217
7c00367c
MK
9218 /* The default, for both APCS and AAPCS, is to return small
9219 structures in registers. */
9220 tdep->struct_return = reg_struct_return;
9221
2dd604e7 9222 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9223 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9224
756fe439
DJ
9225 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9226
148754e5 9227 /* Frame handling. */
a262aec2 9228 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
9229 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
9230 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
9231
eb5492fa 9232 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9233
34e8f22d 9234 /* Address manipulation. */
34e8f22d
RE
9235 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9236
34e8f22d
RE
9237 /* Advance PC across function entry code. */
9238 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9239
c9cf6e20
MG
9240 /* Detect whether PC is at a point where the stack has been destroyed. */
9241 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9242
190dce09
UW
9243 /* Skip trampolines. */
9244 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9245
34e8f22d
RE
9246 /* The stack grows downward. */
9247 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9248
9249 /* Breakpoint manipulation. */
9250 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
9251 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
9252 arm_remote_breakpoint_from_pc);
34e8f22d
RE
9253
9254 /* Information about registers, etc. */
34e8f22d
RE
9255 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9256 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9257 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9258 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9259 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9260
ff6f572f
DJ
9261 /* This "info float" is FPA-specific. Use the generic version if we
9262 do not have FPA. */
9263 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9264 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9265
26216b98 9266 /* Internal <-> external register number maps. */
ff6f572f 9267 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9268 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9269
34e8f22d
RE
9270 set_gdbarch_register_name (gdbarch, arm_register_name);
9271
9272 /* Returning results. */
2af48f68 9273 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9274
03d48a7d
RE
9275 /* Disassembly. */
9276 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9277
34e8f22d
RE
9278 /* Minsymbol frobbing. */
9279 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9280 set_gdbarch_coff_make_msymbol_special (gdbarch,
9281 arm_coff_make_msymbol_special);
60c5725c 9282 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9283
f9d67f43
DJ
9284 /* Thumb-2 IT block support. */
9285 set_gdbarch_adjust_breakpoint_address (gdbarch,
9286 arm_adjust_breakpoint_address);
9287
0d5de010
DJ
9288 /* Virtual tables. */
9289 set_gdbarch_vbit_in_delta (gdbarch, 1);
9290
97e03143 9291 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9292 gdbarch_init_osabi (info, gdbarch);
97e03143 9293
b39cc962
DJ
9294 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9295
eb5492fa 9296 /* Add some default predicates. */
2ae28aa9
YQ
9297 if (is_m)
9298 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9299 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9300 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9301 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 9302 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9303
97e03143
RE
9304 /* Now we have tuned the configuration, set a few final things,
9305 based on what the OS ABI has told us. */
9306
b8926edc
DJ
9307 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9308 binaries are always marked. */
9309 if (tdep->arm_abi == ARM_ABI_AUTO)
9310 tdep->arm_abi = ARM_ABI_APCS;
9311
e3039479
UW
9312 /* Watchpoints are not steppable. */
9313 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9314
b8926edc
DJ
9315 /* We used to default to FPA for generic ARM, but almost nobody
9316 uses that now, and we now provide a way for the user to force
9317 the model. So default to the most useful variant. */
9318 if (tdep->fp_model == ARM_FLOAT_AUTO)
9319 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9320
9df628e0
RE
9321 if (tdep->jb_pc >= 0)
9322 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9323
08216dd7 9324 /* Floating point sizes and format. */
8da61cc4 9325 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9326 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9327 {
8da61cc4
DJ
9328 set_gdbarch_double_format
9329 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9330 set_gdbarch_long_double_format
9331 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9332 }
9333 else
9334 {
9335 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9336 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9337 }
9338
58d6951d
DJ
9339 if (have_vfp_pseudos)
9340 {
9341 /* NOTE: These are the only pseudo registers used by
9342 the ARM target at the moment. If more are added, a
9343 little more care in numbering will be needed. */
9344
9345 int num_pseudos = 32;
9346 if (have_neon_pseudos)
9347 num_pseudos += 16;
9348 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9349 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9350 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9351 }
9352
123dc839 9353 if (tdesc_data)
58d6951d
DJ
9354 {
9355 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9356
9779414d 9357 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9358
9359 /* Override tdesc_register_type to adjust the types of VFP
9360 registers for NEON. */
9361 set_gdbarch_register_type (gdbarch, arm_register_type);
9362 }
123dc839
DJ
9363
9364 /* Add standard register aliases. We add aliases even for those
9365 nanes which are used by the current architecture - it's simpler,
9366 and does no harm, since nothing ever lists user registers. */
9367 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9368 user_reg_add (gdbarch, arm_register_aliases[i].name,
9369 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9370
39bbf761
RE
9371 return gdbarch;
9372}
9373
97e03143 9374static void
2af46ca0 9375arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9376{
2af46ca0 9377 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9378
9379 if (tdep == NULL)
9380 return;
9381
edefbb7c 9382 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9383 (unsigned long) tdep->lowest_pc);
9384}
9385
a78f21af
AC
9386extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
9387
c906108c 9388void
ed9a39eb 9389_initialize_arm_tdep (void)
c906108c 9390{
bc90b915
FN
9391 struct ui_file *stb;
9392 long length;
26304000 9393 struct cmd_list_element *new_set, *new_show;
53904c9e
AC
9394 const char *setname;
9395 const char *setdesc;
4bd7b427 9396 const char *const *regnames;
bc90b915
FN
9397 int numregs, i, j;
9398 static char *helptext;
edefbb7c
AC
9399 char regdesc[1024], *rdptr = regdesc;
9400 size_t rest = sizeof (regdesc);
085dd6e6 9401
42cf1509 9402 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9403
60c5725c 9404 arm_objfile_data_key
c1bd65d0 9405 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 9406
0e9e9abd
UW
9407 /* Add ourselves to objfile event chain. */
9408 observer_attach_new_objfile (arm_exidx_new_objfile);
9409 arm_exidx_data_key
9410 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9411
70f80edf
JT
9412 /* Register an ELF OS ABI sniffer for ARM binaries. */
9413 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9414 bfd_target_elf_flavour,
9415 arm_elf_osabi_sniffer);
9416
9779414d
DJ
9417 /* Initialize the standard target descriptions. */
9418 initialize_tdesc_arm_with_m ();
25f8c692 9419 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9420 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9421 initialize_tdesc_arm_with_iwmmxt ();
9422 initialize_tdesc_arm_with_vfpv2 ();
9423 initialize_tdesc_arm_with_vfpv3 ();
9424 initialize_tdesc_arm_with_neon ();
9779414d 9425
94c30b78 9426 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
9427 num_disassembly_options = get_arm_regname_num_options ();
9428
9429 /* Add root prefix command for all "set arm"/"show arm" commands. */
9430 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9431 _("Various ARM-specific commands."),
afd7eef0
RE
9432 &setarmcmdlist, "set arm ", 0, &setlist);
9433
9434 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9435 _("Various ARM-specific commands."),
afd7eef0 9436 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9437
94c30b78 9438 /* Sync the opcode insn printer with our register viewer. */
bc90b915 9439 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 9440
eefe576e
AC
9441 /* Initialize the array that will be passed to
9442 add_setshow_enum_cmd(). */
8d749320
SM
9443 valid_disassembly_styles = XNEWVEC (const char *,
9444 num_disassembly_options + 1);
afd7eef0 9445 for (i = 0; i < num_disassembly_options; i++)
bc90b915
FN
9446 {
9447 numregs = get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 9448 valid_disassembly_styles[i] = setname;
edefbb7c
AC
9449 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
9450 rdptr += length;
9451 rest -= length;
123dc839
DJ
9452 /* When we find the default names, tell the disassembler to use
9453 them. */
bc90b915
FN
9454 if (!strcmp (setname, "std"))
9455 {
afd7eef0 9456 disassembly_style = setname;
bc90b915
FN
9457 set_arm_regname_option (i);
9458 }
9459 }
94c30b78 9460 /* Mark the end of valid options. */
afd7eef0 9461 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 9462
edefbb7c
AC
9463 /* Create the help text. */
9464 stb = mem_fileopen ();
9465 fprintf_unfiltered (stb, "%s%s%s",
9466 _("The valid values are:\n"),
9467 regdesc,
9468 _("The default is \"std\"."));
759ef836 9469 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 9470 ui_file_delete (stb);
ed9a39eb 9471
edefbb7c
AC
9472 add_setshow_enum_cmd("disassembler", no_class,
9473 valid_disassembly_styles, &disassembly_style,
9474 _("Set the disassembly style."),
9475 _("Show the disassembly style."),
9476 helptext,
2c5b56ce 9477 set_disassembly_style_sfunc,
0963b4bd
MS
9478 NULL, /* FIXME: i18n: The disassembly style is
9479 \"%s\". */
7376b4c2 9480 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9481
9482 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9483 _("Set usage of ARM 32-bit mode."),
9484 _("Show usage of ARM 32-bit mode."),
9485 _("When off, a 26-bit PC will be used."),
2c5b56ce 9486 NULL,
0963b4bd
MS
9487 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9488 mode is %s. */
26304000 9489 &setarmcmdlist, &showarmcmdlist);
c906108c 9490
fd50bc42 9491 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9492 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9493 _("Set the floating point type."),
9494 _("Show the floating point type."),
9495 _("auto - Determine the FP typefrom the OS-ABI.\n\
9496softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9497fpa - FPA co-processor (GCC compiled).\n\
9498softvfp - Software FP with pure-endian doubles.\n\
9499vfp - VFP co-processor."),
edefbb7c 9500 set_fp_model_sfunc, show_fp_model,
7376b4c2 9501 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9502
28e97307
DJ
9503 /* Add a command to allow the user to force the ABI. */
9504 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9505 _("Set the ABI."),
9506 _("Show the ABI."),
9507 NULL, arm_set_abi, arm_show_abi,
9508 &setarmcmdlist, &showarmcmdlist);
9509
0428b8f5
DJ
9510 /* Add two commands to allow the user to force the assumed
9511 execution mode. */
9512 add_setshow_enum_cmd ("fallback-mode", class_support,
9513 arm_mode_strings, &arm_fallback_mode_string,
9514 _("Set the mode assumed when symbols are unavailable."),
9515 _("Show the mode assumed when symbols are unavailable."),
9516 NULL, NULL, arm_show_fallback_mode,
9517 &setarmcmdlist, &showarmcmdlist);
9518 add_setshow_enum_cmd ("force-mode", class_support,
9519 arm_mode_strings, &arm_force_mode_string,
9520 _("Set the mode assumed even when symbols are available."),
9521 _("Show the mode assumed even when symbols are available."),
9522 NULL, NULL, arm_show_force_mode,
9523 &setarmcmdlist, &showarmcmdlist);
9524
6529d2dd 9525 /* Debugging flag. */
edefbb7c
AC
9526 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9527 _("Set ARM debugging."),
9528 _("Show ARM debugging."),
9529 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9530 NULL,
7915a72c 9531 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9532 &setdebuglist, &showdebuglist);
c906108c 9533}
72508ac0
PO
9534
9535/* ARM-reversible process record data structures. */
9536
9537#define ARM_INSN_SIZE_BYTES 4
9538#define THUMB_INSN_SIZE_BYTES 2
9539#define THUMB2_INSN_SIZE_BYTES 4
9540
9541
71e396f9
LM
9542/* Position of the bit within a 32-bit ARM instruction
9543 that defines whether the instruction is a load or store. */
72508ac0
PO
9544#define INSN_S_L_BIT_NUM 20
9545
9546#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9547 do \
9548 { \
9549 unsigned int reg_len = LENGTH; \
9550 if (reg_len) \
9551 { \
9552 REGS = XNEWVEC (uint32_t, reg_len); \
9553 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9554 } \
9555 } \
9556 while (0)
9557
9558#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9559 do \
9560 { \
9561 unsigned int mem_len = LENGTH; \
9562 if (mem_len) \
9563 { \
9564 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9565 memcpy(&MEMS->len, &RECORD_BUF[0], \
9566 sizeof(struct arm_mem_r) * LENGTH); \
9567 } \
9568 } \
9569 while (0)
9570
9571/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9572#define INSN_RECORDED(ARM_RECORD) \
9573 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9574
9575/* ARM memory record structure. */
9576struct arm_mem_r
9577{
9578 uint32_t len; /* Record length. */
bfbbec00 9579 uint32_t addr; /* Memory address. */
72508ac0
PO
9580};
9581
9582/* ARM instruction record contains opcode of current insn
9583 and execution state (before entry to decode_insn()),
9584 contains list of to-be-modified registers and
9585 memory blocks (on return from decode_insn()). */
9586
9587typedef struct insn_decode_record_t
9588{
9589 struct gdbarch *gdbarch;
9590 struct regcache *regcache;
9591 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9592 uint32_t arm_insn; /* Should accommodate thumb. */
9593 uint32_t cond; /* Condition code. */
9594 uint32_t opcode; /* Insn opcode. */
9595 uint32_t decode; /* Insn decode bits. */
9596 uint32_t mem_rec_count; /* No of mem records. */
9597 uint32_t reg_rec_count; /* No of reg records. */
9598 uint32_t *arm_regs; /* Registers to be saved for this record. */
9599 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9600} insn_decode_record;
9601
9602
9603/* Checks ARM SBZ and SBO mandatory fields. */
9604
9605static int
9606sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9607{
9608 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9609
9610 if (!len)
9611 return 1;
9612
9613 if (!sbo)
9614 ones = ~ones;
9615
9616 while (ones)
9617 {
9618 if (!(ones & sbo))
9619 {
9620 return 0;
9621 }
9622 ones = ones >> 1;
9623 }
9624 return 1;
9625}
9626
c6ec2b30
OJ
9627enum arm_record_result
9628{
9629 ARM_RECORD_SUCCESS = 0,
9630 ARM_RECORD_FAILURE = 1
9631};
9632
72508ac0
PO
9633typedef enum
9634{
9635 ARM_RECORD_STRH=1,
9636 ARM_RECORD_STRD
9637} arm_record_strx_t;
9638
9639typedef enum
9640{
9641 ARM_RECORD=1,
9642 THUMB_RECORD,
9643 THUMB2_RECORD
9644} record_type_t;
9645
9646
9647static int
9648arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9649 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9650{
9651
9652 struct regcache *reg_cache = arm_insn_r->regcache;
9653 ULONGEST u_regval[2]= {0};
9654
9655 uint32_t reg_src1 = 0, reg_src2 = 0;
9656 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9657 uint32_t opcode1 = 0;
9658
9659 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9660 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
9661 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
9662
9663
9664 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9665 {
9666 /* 1) Handle misc store, immediate offset. */
9667 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9668 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9669 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9670 regcache_raw_read_unsigned (reg_cache, reg_src1,
9671 &u_regval[0]);
9672 if (ARM_PC_REGNUM == reg_src1)
9673 {
9674 /* If R15 was used as Rn, hence current PC+8. */
9675 u_regval[0] = u_regval[0] + 8;
9676 }
9677 offset_8 = (immed_high << 4) | immed_low;
9678 /* Calculate target store address. */
9679 if (14 == arm_insn_r->opcode)
9680 {
9681 tgt_mem_addr = u_regval[0] + offset_8;
9682 }
9683 else
9684 {
9685 tgt_mem_addr = u_regval[0] - offset_8;
9686 }
9687 if (ARM_RECORD_STRH == str_type)
9688 {
9689 record_buf_mem[0] = 2;
9690 record_buf_mem[1] = tgt_mem_addr;
9691 arm_insn_r->mem_rec_count = 1;
9692 }
9693 else if (ARM_RECORD_STRD == str_type)
9694 {
9695 record_buf_mem[0] = 4;
9696 record_buf_mem[1] = tgt_mem_addr;
9697 record_buf_mem[2] = 4;
9698 record_buf_mem[3] = tgt_mem_addr + 4;
9699 arm_insn_r->mem_rec_count = 2;
9700 }
9701 }
9702 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9703 {
9704 /* 2) Store, register offset. */
9705 /* Get Rm. */
9706 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9707 /* Get Rn. */
9708 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9709 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9710 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9711 if (15 == reg_src2)
9712 {
9713 /* If R15 was used as Rn, hence current PC+8. */
9714 u_regval[0] = u_regval[0] + 8;
9715 }
9716 /* Calculate target store address, Rn +/- Rm, register offset. */
9717 if (12 == arm_insn_r->opcode)
9718 {
9719 tgt_mem_addr = u_regval[0] + u_regval[1];
9720 }
9721 else
9722 {
9723 tgt_mem_addr = u_regval[1] - u_regval[0];
9724 }
9725 if (ARM_RECORD_STRH == str_type)
9726 {
9727 record_buf_mem[0] = 2;
9728 record_buf_mem[1] = tgt_mem_addr;
9729 arm_insn_r->mem_rec_count = 1;
9730 }
9731 else if (ARM_RECORD_STRD == str_type)
9732 {
9733 record_buf_mem[0] = 4;
9734 record_buf_mem[1] = tgt_mem_addr;
9735 record_buf_mem[2] = 4;
9736 record_buf_mem[3] = tgt_mem_addr + 4;
9737 arm_insn_r->mem_rec_count = 2;
9738 }
9739 }
9740 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9741 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9742 {
9743 /* 3) Store, immediate pre-indexed. */
9744 /* 5) Store, immediate post-indexed. */
9745 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9746 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9747 offset_8 = (immed_high << 4) | immed_low;
9748 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9749 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9750 /* Calculate target store address, Rn +/- Rm, register offset. */
9751 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9752 {
9753 tgt_mem_addr = u_regval[0] + offset_8;
9754 }
9755 else
9756 {
9757 tgt_mem_addr = u_regval[0] - offset_8;
9758 }
9759 if (ARM_RECORD_STRH == str_type)
9760 {
9761 record_buf_mem[0] = 2;
9762 record_buf_mem[1] = tgt_mem_addr;
9763 arm_insn_r->mem_rec_count = 1;
9764 }
9765 else if (ARM_RECORD_STRD == str_type)
9766 {
9767 record_buf_mem[0] = 4;
9768 record_buf_mem[1] = tgt_mem_addr;
9769 record_buf_mem[2] = 4;
9770 record_buf_mem[3] = tgt_mem_addr + 4;
9771 arm_insn_r->mem_rec_count = 2;
9772 }
9773 /* Record Rn also as it changes. */
9774 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9775 arm_insn_r->reg_rec_count = 1;
9776 }
9777 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9778 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9779 {
9780 /* 4) Store, register pre-indexed. */
9781 /* 6) Store, register post -indexed. */
9782 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9783 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9784 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9785 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9786 /* Calculate target store address, Rn +/- Rm, register offset. */
9787 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9788 {
9789 tgt_mem_addr = u_regval[0] + u_regval[1];
9790 }
9791 else
9792 {
9793 tgt_mem_addr = u_regval[1] - u_regval[0];
9794 }
9795 if (ARM_RECORD_STRH == str_type)
9796 {
9797 record_buf_mem[0] = 2;
9798 record_buf_mem[1] = tgt_mem_addr;
9799 arm_insn_r->mem_rec_count = 1;
9800 }
9801 else if (ARM_RECORD_STRD == str_type)
9802 {
9803 record_buf_mem[0] = 4;
9804 record_buf_mem[1] = tgt_mem_addr;
9805 record_buf_mem[2] = 4;
9806 record_buf_mem[3] = tgt_mem_addr + 4;
9807 arm_insn_r->mem_rec_count = 2;
9808 }
9809 /* Record Rn also as it changes. */
9810 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9811 arm_insn_r->reg_rec_count = 1;
9812 }
9813 return 0;
9814}
9815
9816/* Handling ARM extension space insns. */
9817
9818static int
9819arm_record_extension_space (insn_decode_record *arm_insn_r)
9820{
9821 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
9822 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9823 uint32_t record_buf[8], record_buf_mem[8];
9824 uint32_t reg_src1 = 0;
9825 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9826 struct regcache *reg_cache = arm_insn_r->regcache;
9827 ULONGEST u_regval = 0;
9828
9829 gdb_assert (!INSN_RECORDED(arm_insn_r));
9830 /* Handle unconditional insn extension space. */
9831
9832 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9833 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9834 if (arm_insn_r->cond)
9835 {
9836 /* PLD has no affect on architectural state, it just affects
9837 the caches. */
9838 if (5 == ((opcode1 & 0xE0) >> 5))
9839 {
9840 /* BLX(1) */
9841 record_buf[0] = ARM_PS_REGNUM;
9842 record_buf[1] = ARM_LR_REGNUM;
9843 arm_insn_r->reg_rec_count = 2;
9844 }
9845 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9846 }
9847
9848
9849 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9850 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9851 {
9852 ret = -1;
9853 /* Undefined instruction on ARM V5; need to handle if later
9854 versions define it. */
9855 }
9856
9857 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9858 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9859 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9860
9861 /* Handle arithmetic insn extension space. */
9862 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9863 && !INSN_RECORDED(arm_insn_r))
9864 {
9865 /* Handle MLA(S) and MUL(S). */
9866 if (0 <= insn_op1 && 3 >= insn_op1)
9867 {
9868 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9869 record_buf[1] = ARM_PS_REGNUM;
9870 arm_insn_r->reg_rec_count = 2;
9871 }
9872 else if (4 <= insn_op1 && 15 >= insn_op1)
9873 {
9874 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9875 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9876 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9877 record_buf[2] = ARM_PS_REGNUM;
9878 arm_insn_r->reg_rec_count = 3;
9879 }
9880 }
9881
9882 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9883 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9884 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9885
9886 /* Handle control insn extension space. */
9887
9888 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9889 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9890 {
9891 if (!bit (arm_insn_r->arm_insn,25))
9892 {
9893 if (!bits (arm_insn_r->arm_insn, 4, 7))
9894 {
9895 if ((0 == insn_op1) || (2 == insn_op1))
9896 {
9897 /* MRS. */
9898 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9899 arm_insn_r->reg_rec_count = 1;
9900 }
9901 else if (1 == insn_op1)
9902 {
9903 /* CSPR is going to be changed. */
9904 record_buf[0] = ARM_PS_REGNUM;
9905 arm_insn_r->reg_rec_count = 1;
9906 }
9907 else if (3 == insn_op1)
9908 {
9909 /* SPSR is going to be changed. */
9910 /* We need to get SPSR value, which is yet to be done. */
9911 printf_unfiltered (_("Process record does not support "
9912 "instruction 0x%0x at address %s.\n"),
9913 arm_insn_r->arm_insn,
9914 paddress (arm_insn_r->gdbarch,
9915 arm_insn_r->this_addr));
9916 return -1;
9917 }
9918 }
9919 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9920 {
9921 if (1 == insn_op1)
9922 {
9923 /* BX. */
9924 record_buf[0] = ARM_PS_REGNUM;
9925 arm_insn_r->reg_rec_count = 1;
9926 }
9927 else if (3 == insn_op1)
9928 {
9929 /* CLZ. */
9930 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9931 arm_insn_r->reg_rec_count = 1;
9932 }
9933 }
9934 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9935 {
9936 /* BLX. */
9937 record_buf[0] = ARM_PS_REGNUM;
9938 record_buf[1] = ARM_LR_REGNUM;
9939 arm_insn_r->reg_rec_count = 2;
9940 }
9941 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
9942 {
9943 /* QADD, QSUB, QDADD, QDSUB */
9944 record_buf[0] = ARM_PS_REGNUM;
9945 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9946 arm_insn_r->reg_rec_count = 2;
9947 }
9948 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
9949 {
9950 /* BKPT. */
9951 record_buf[0] = ARM_PS_REGNUM;
9952 record_buf[1] = ARM_LR_REGNUM;
9953 arm_insn_r->reg_rec_count = 2;
9954
9955 /* Save SPSR also;how? */
9956 printf_unfiltered (_("Process record does not support "
9957 "instruction 0x%0x at address %s.\n"),
9958 arm_insn_r->arm_insn,
9959 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
9960 return -1;
9961 }
9962 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
9963 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
9964 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
9965 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
9966 )
9967 {
9968 if (0 == insn_op1 || 1 == insn_op1)
9969 {
9970 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
9971 /* We dont do optimization for SMULW<y> where we
9972 need only Rd. */
9973 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9974 record_buf[1] = ARM_PS_REGNUM;
9975 arm_insn_r->reg_rec_count = 2;
9976 }
9977 else if (2 == insn_op1)
9978 {
9979 /* SMLAL<x><y>. */
9980 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9981 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
9982 arm_insn_r->reg_rec_count = 2;
9983 }
9984 else if (3 == insn_op1)
9985 {
9986 /* SMUL<x><y>. */
9987 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9988 arm_insn_r->reg_rec_count = 1;
9989 }
9990 }
9991 }
9992 else
9993 {
9994 /* MSR : immediate form. */
9995 if (1 == insn_op1)
9996 {
9997 /* CSPR is going to be changed. */
9998 record_buf[0] = ARM_PS_REGNUM;
9999 arm_insn_r->reg_rec_count = 1;
10000 }
10001 else if (3 == insn_op1)
10002 {
10003 /* SPSR is going to be changed. */
10004 /* we need to get SPSR value, which is yet to be done */
10005 printf_unfiltered (_("Process record does not support "
10006 "instruction 0x%0x at address %s.\n"),
10007 arm_insn_r->arm_insn,
10008 paddress (arm_insn_r->gdbarch,
10009 arm_insn_r->this_addr));
10010 return -1;
10011 }
10012 }
10013 }
10014
10015 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10016 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10017 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10018
10019 /* Handle load/store insn extension space. */
10020
10021 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10022 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10023 && !INSN_RECORDED(arm_insn_r))
10024 {
10025 /* SWP/SWPB. */
10026 if (0 == insn_op1)
10027 {
10028 /* These insn, changes register and memory as well. */
10029 /* SWP or SWPB insn. */
10030 /* Get memory address given by Rn. */
10031 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10032 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10033 /* SWP insn ?, swaps word. */
10034 if (8 == arm_insn_r->opcode)
10035 {
10036 record_buf_mem[0] = 4;
10037 }
10038 else
10039 {
10040 /* SWPB insn, swaps only byte. */
10041 record_buf_mem[0] = 1;
10042 }
10043 record_buf_mem[1] = u_regval;
10044 arm_insn_r->mem_rec_count = 1;
10045 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10046 arm_insn_r->reg_rec_count = 1;
10047 }
10048 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10049 {
10050 /* STRH. */
10051 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10052 ARM_RECORD_STRH);
10053 }
10054 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10055 {
10056 /* LDRD. */
10057 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10058 record_buf[1] = record_buf[0] + 1;
10059 arm_insn_r->reg_rec_count = 2;
10060 }
10061 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10062 {
10063 /* STRD. */
10064 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10065 ARM_RECORD_STRD);
10066 }
10067 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10068 {
10069 /* LDRH, LDRSB, LDRSH. */
10070 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10071 arm_insn_r->reg_rec_count = 1;
10072 }
10073
10074 }
10075
10076 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10077 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10078 && !INSN_RECORDED(arm_insn_r))
10079 {
10080 ret = -1;
10081 /* Handle coprocessor insn extension space. */
10082 }
10083
10084 /* To be done for ARMv5 and later; as of now we return -1. */
10085 if (-1 == ret)
10086 printf_unfiltered (_("Process record does not support instruction x%0x "
10087 "at address %s.\n"),arm_insn_r->arm_insn,
10088 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10089
10090
10091 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10092 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10093
10094 return ret;
10095}
10096
10097/* Handling opcode 000 insns. */
10098
10099static int
10100arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10101{
10102 struct regcache *reg_cache = arm_insn_r->regcache;
10103 uint32_t record_buf[8], record_buf_mem[8];
10104 ULONGEST u_regval[2] = {0};
10105
10106 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10107 uint32_t immed_high = 0, immed_low = 0, offset_8 = 0, tgt_mem_addr = 0;
10108 uint32_t opcode1 = 0;
10109
10110 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10111 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10112 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10113
10114 /* Data processing insn /multiply insn. */
10115 if (9 == arm_insn_r->decode
10116 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10117 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
10118 {
10119 /* Handle multiply instructions. */
10120 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10121 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10122 {
10123 /* Handle MLA and MUL. */
10124 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10125 record_buf[1] = ARM_PS_REGNUM;
10126 arm_insn_r->reg_rec_count = 2;
10127 }
10128 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10129 {
10130 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10131 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10132 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10133 record_buf[2] = ARM_PS_REGNUM;
10134 arm_insn_r->reg_rec_count = 3;
10135 }
10136 }
10137 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10138 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
10139 {
10140 /* Handle misc load insns, as 20th bit (L = 1). */
10141 /* LDR insn has a capability to do branching, if
10142 MOV LR, PC is precceded by LDR insn having Rn as R15
10143 in that case, it emulates branch and link insn, and hence we
10144 need to save CSPR and PC as well. I am not sure this is right
10145 place; as opcode = 010 LDR insn make this happen, if R15 was
10146 used. */
10147 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10148 if (15 != reg_dest)
10149 {
10150 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10151 arm_insn_r->reg_rec_count = 1;
10152 }
10153 else
10154 {
10155 record_buf[0] = reg_dest;
10156 record_buf[1] = ARM_PS_REGNUM;
10157 arm_insn_r->reg_rec_count = 2;
10158 }
10159 }
10160 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10161 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
10162 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10163 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
10164 {
10165 /* Handle MSR insn. */
10166 if (9 == arm_insn_r->opcode)
10167 {
10168 /* CSPR is going to be changed. */
10169 record_buf[0] = ARM_PS_REGNUM;
10170 arm_insn_r->reg_rec_count = 1;
10171 }
10172 else
10173 {
10174 /* SPSR is going to be changed. */
10175 /* How to read SPSR value? */
10176 printf_unfiltered (_("Process record does not support instruction "
10177 "0x%0x at address %s.\n"),
10178 arm_insn_r->arm_insn,
10179 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10180 return -1;
10181 }
10182 }
10183 else if (9 == arm_insn_r->decode
10184 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10185 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10186 {
10187 /* Handling SWP, SWPB. */
10188 /* These insn, changes register and memory as well. */
10189 /* SWP or SWPB insn. */
10190
10191 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10192 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10193 /* SWP insn ?, swaps word. */
10194 if (8 == arm_insn_r->opcode)
10195 {
10196 record_buf_mem[0] = 4;
10197 }
10198 else
10199 {
10200 /* SWPB insn, swaps only byte. */
10201 record_buf_mem[0] = 1;
10202 }
10203 record_buf_mem[1] = u_regval[0];
10204 arm_insn_r->mem_rec_count = 1;
10205 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10206 arm_insn_r->reg_rec_count = 1;
10207 }
10208 else if (3 == arm_insn_r->decode && 0x12 == opcode1
10209 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10210 {
10211 /* Handle BLX, branch and link/exchange. */
10212 if (9 == arm_insn_r->opcode)
10213 {
10214 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10215 and R14 stores the return address. */
10216 record_buf[0] = ARM_PS_REGNUM;
10217 record_buf[1] = ARM_LR_REGNUM;
10218 arm_insn_r->reg_rec_count = 2;
10219 }
10220 }
10221 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10222 {
10223 /* Handle enhanced software breakpoint insn, BKPT. */
10224 /* CPSR is changed to be executed in ARM state, disabling normal
10225 interrupts, entering abort mode. */
10226 /* According to high vector configuration PC is set. */
10227 /* user hit breakpoint and type reverse, in
10228 that case, we need to go back with previous CPSR and
10229 Program Counter. */
10230 record_buf[0] = ARM_PS_REGNUM;
10231 record_buf[1] = ARM_LR_REGNUM;
10232 arm_insn_r->reg_rec_count = 2;
10233
10234 /* Save SPSR also; how? */
10235 printf_unfiltered (_("Process record does not support instruction "
10236 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10237 paddress (arm_insn_r->gdbarch,
10238 arm_insn_r->this_addr));
10239 return -1;
10240 }
10241 else if (11 == arm_insn_r->decode
10242 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10243 {
10244 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
10245
10246 /* Handle str(x) insn */
10247 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10248 ARM_RECORD_STRH);
10249 }
10250 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10251 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10252 {
10253 /* Handle BX, branch and link/exchange. */
10254 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10255 record_buf[0] = ARM_PS_REGNUM;
10256 arm_insn_r->reg_rec_count = 1;
10257 }
10258 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10259 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10260 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10261 {
10262 /* Count leading zeros: CLZ. */
10263 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10264 arm_insn_r->reg_rec_count = 1;
10265 }
10266 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10267 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10268 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10269 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
10270 )
10271 {
10272 /* Handle MRS insn. */
10273 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10274 arm_insn_r->reg_rec_count = 1;
10275 }
10276 else if (arm_insn_r->opcode <= 15)
10277 {
10278 /* Normal data processing insns. */
10279 /* Out of 11 shifter operands mode, all the insn modifies destination
10280 register, which is specified by 13-16 decode. */
10281 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10282 record_buf[1] = ARM_PS_REGNUM;
10283 arm_insn_r->reg_rec_count = 2;
10284 }
10285 else
10286 {
10287 return -1;
10288 }
10289
10290 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10291 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10292 return 0;
10293}
10294
10295/* Handling opcode 001 insns. */
10296
10297static int
10298arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10299{
10300 uint32_t record_buf[8], record_buf_mem[8];
10301
10302 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10303 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10304
10305 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10306 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10307 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10308 )
10309 {
10310 /* Handle MSR insn. */
10311 if (9 == arm_insn_r->opcode)
10312 {
10313 /* CSPR is going to be changed. */
10314 record_buf[0] = ARM_PS_REGNUM;
10315 arm_insn_r->reg_rec_count = 1;
10316 }
10317 else
10318 {
10319 /* SPSR is going to be changed. */
10320 }
10321 }
10322 else if (arm_insn_r->opcode <= 15)
10323 {
10324 /* Normal data processing insns. */
10325 /* Out of 11 shifter operands mode, all the insn modifies destination
10326 register, which is specified by 13-16 decode. */
10327 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10328 record_buf[1] = ARM_PS_REGNUM;
10329 arm_insn_r->reg_rec_count = 2;
10330 }
10331 else
10332 {
10333 return -1;
10334 }
10335
10336 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10337 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10338 return 0;
10339}
10340
71e396f9 10341/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10342
10343static int
10344arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10345{
10346 struct regcache *reg_cache = arm_insn_r->regcache;
10347
71e396f9
LM
10348 uint32_t reg_base , reg_dest;
10349 uint32_t offset_12, tgt_mem_addr;
72508ac0 10350 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10351 unsigned char wback;
10352 ULONGEST u_regval;
72508ac0 10353
71e396f9
LM
10354 /* Calculate wback. */
10355 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10356 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10357
71e396f9
LM
10358 arm_insn_r->reg_rec_count = 0;
10359 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10360
10361 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10362 {
71e396f9
LM
10363 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10364 and LDRT. */
10365
72508ac0 10366 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10367 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10368
10369 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10370 preceeds a LDR instruction having R15 as reg_base, it
10371 emulates a branch and link instruction, and hence we need to save
10372 CPSR and PC as well. */
10373 if (ARM_PC_REGNUM == reg_dest)
10374 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10375
10376 /* If wback is true, also save the base register, which is going to be
10377 written to. */
10378 if (wback)
10379 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10380 }
10381 else
10382 {
71e396f9
LM
10383 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10384
72508ac0 10385 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10386 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10387
10388 /* Handle bit U. */
72508ac0 10389 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10390 {
10391 /* U == 1: Add the offset. */
10392 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10393 }
72508ac0 10394 else
71e396f9
LM
10395 {
10396 /* U == 0: subtract the offset. */
10397 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10398 }
10399
10400 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10401 bytes. */
10402 if (bit (arm_insn_r->arm_insn, 22))
10403 {
10404 /* STRB and STRBT: 1 byte. */
10405 record_buf_mem[0] = 1;
10406 }
10407 else
10408 {
10409 /* STR and STRT: 4 bytes. */
10410 record_buf_mem[0] = 4;
10411 }
10412
10413 /* Handle bit P. */
10414 if (bit (arm_insn_r->arm_insn, 24))
10415 record_buf_mem[1] = tgt_mem_addr;
10416 else
10417 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10418
72508ac0
PO
10419 arm_insn_r->mem_rec_count = 1;
10420
71e396f9
LM
10421 /* If wback is true, also save the base register, which is going to be
10422 written to. */
10423 if (wback)
10424 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10425 }
10426
10427 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10428 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10429 return 0;
10430}
10431
10432/* Handling opcode 011 insns. */
10433
10434static int
10435arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10436{
10437 struct regcache *reg_cache = arm_insn_r->regcache;
10438
10439 uint32_t shift_imm = 0;
10440 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10441 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10442 uint32_t record_buf[8], record_buf_mem[8];
10443
10444 LONGEST s_word;
10445 ULONGEST u_regval[2];
10446
10447 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10448 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10449
10450 /* Handle enhanced store insns and LDRD DSP insn,
10451 order begins according to addressing modes for store insns
10452 STRH insn. */
10453
10454 /* LDR or STR? */
10455 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10456 {
10457 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10458 /* LDR insn has a capability to do branching, if
10459 MOV LR, PC is precedded by LDR insn having Rn as R15
10460 in that case, it emulates branch and link insn, and hence we
10461 need to save CSPR and PC as well. */
10462 if (15 != reg_dest)
10463 {
10464 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10465 arm_insn_r->reg_rec_count = 1;
10466 }
10467 else
10468 {
10469 record_buf[0] = reg_dest;
10470 record_buf[1] = ARM_PS_REGNUM;
10471 arm_insn_r->reg_rec_count = 2;
10472 }
10473 }
10474 else
10475 {
10476 if (! bits (arm_insn_r->arm_insn, 4, 11))
10477 {
10478 /* Store insn, register offset and register pre-indexed,
10479 register post-indexed. */
10480 /* Get Rm. */
10481 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10482 /* Get Rn. */
10483 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10484 regcache_raw_read_unsigned (reg_cache, reg_src1
10485 , &u_regval[0]);
10486 regcache_raw_read_unsigned (reg_cache, reg_src2
10487 , &u_regval[1]);
10488 if (15 == reg_src2)
10489 {
10490 /* If R15 was used as Rn, hence current PC+8. */
10491 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10492 u_regval[0] = u_regval[0] + 8;
10493 }
10494 /* Calculate target store address, Rn +/- Rm, register offset. */
10495 /* U == 1. */
10496 if (bit (arm_insn_r->arm_insn, 23))
10497 {
10498 tgt_mem_addr = u_regval[0] + u_regval[1];
10499 }
10500 else
10501 {
10502 tgt_mem_addr = u_regval[1] - u_regval[0];
10503 }
10504
10505 switch (arm_insn_r->opcode)
10506 {
10507 /* STR. */
10508 case 8:
10509 case 12:
10510 /* STR. */
10511 case 9:
10512 case 13:
10513 /* STRT. */
10514 case 1:
10515 case 5:
10516 /* STR. */
10517 case 0:
10518 case 4:
10519 record_buf_mem[0] = 4;
10520 break;
10521
10522 /* STRB. */
10523 case 10:
10524 case 14:
10525 /* STRB. */
10526 case 11:
10527 case 15:
10528 /* STRBT. */
10529 case 3:
10530 case 7:
10531 /* STRB. */
10532 case 2:
10533 case 6:
10534 record_buf_mem[0] = 1;
10535 break;
10536
10537 default:
10538 gdb_assert_not_reached ("no decoding pattern found");
10539 break;
10540 }
10541 record_buf_mem[1] = tgt_mem_addr;
10542 arm_insn_r->mem_rec_count = 1;
10543
10544 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10545 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10546 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10547 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10548 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10549 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10550 )
10551 {
10552 /* Rn is going to be changed in pre-indexed mode and
10553 post-indexed mode as well. */
10554 record_buf[0] = reg_src2;
10555 arm_insn_r->reg_rec_count = 1;
10556 }
10557 }
10558 else
10559 {
10560 /* Store insn, scaled register offset; scaled pre-indexed. */
10561 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10562 /* Get Rm. */
10563 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10564 /* Get Rn. */
10565 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10566 /* Get shift_imm. */
10567 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10568 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10569 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10570 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10571 /* Offset_12 used as shift. */
10572 switch (offset_12)
10573 {
10574 case 0:
10575 /* Offset_12 used as index. */
10576 offset_12 = u_regval[0] << shift_imm;
10577 break;
10578
10579 case 1:
10580 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10581 break;
10582
10583 case 2:
10584 if (!shift_imm)
10585 {
10586 if (bit (u_regval[0], 31))
10587 {
10588 offset_12 = 0xFFFFFFFF;
10589 }
10590 else
10591 {
10592 offset_12 = 0;
10593 }
10594 }
10595 else
10596 {
10597 /* This is arithmetic shift. */
10598 offset_12 = s_word >> shift_imm;
10599 }
10600 break;
10601
10602 case 3:
10603 if (!shift_imm)
10604 {
10605 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10606 &u_regval[1]);
10607 /* Get C flag value and shift it by 31. */
10608 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10609 | (u_regval[0]) >> 1);
10610 }
10611 else
10612 {
10613 offset_12 = (u_regval[0] >> shift_imm) \
10614 | (u_regval[0] <<
10615 (sizeof(uint32_t) - shift_imm));
10616 }
10617 break;
10618
10619 default:
10620 gdb_assert_not_reached ("no decoding pattern found");
10621 break;
10622 }
10623
10624 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10625 /* bit U set. */
10626 if (bit (arm_insn_r->arm_insn, 23))
10627 {
10628 tgt_mem_addr = u_regval[1] + offset_12;
10629 }
10630 else
10631 {
10632 tgt_mem_addr = u_regval[1] - offset_12;
10633 }
10634
10635 switch (arm_insn_r->opcode)
10636 {
10637 /* STR. */
10638 case 8:
10639 case 12:
10640 /* STR. */
10641 case 9:
10642 case 13:
10643 /* STRT. */
10644 case 1:
10645 case 5:
10646 /* STR. */
10647 case 0:
10648 case 4:
10649 record_buf_mem[0] = 4;
10650 break;
10651
10652 /* STRB. */
10653 case 10:
10654 case 14:
10655 /* STRB. */
10656 case 11:
10657 case 15:
10658 /* STRBT. */
10659 case 3:
10660 case 7:
10661 /* STRB. */
10662 case 2:
10663 case 6:
10664 record_buf_mem[0] = 1;
10665 break;
10666
10667 default:
10668 gdb_assert_not_reached ("no decoding pattern found");
10669 break;
10670 }
10671 record_buf_mem[1] = tgt_mem_addr;
10672 arm_insn_r->mem_rec_count = 1;
10673
10674 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10675 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10676 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10677 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10678 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10679 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10680 )
10681 {
10682 /* Rn is going to be changed in register scaled pre-indexed
10683 mode,and scaled post indexed mode. */
10684 record_buf[0] = reg_src2;
10685 arm_insn_r->reg_rec_count = 1;
10686 }
10687 }
10688 }
10689
10690 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10691 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10692 return 0;
10693}
10694
71e396f9 10695/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10696
10697static int
10698arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10699{
10700 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10701 uint32_t register_count = 0, register_bits;
10702 uint32_t reg_base, addr_mode;
72508ac0 10703 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10704 uint32_t wback;
10705 ULONGEST u_regval;
72508ac0 10706
71e396f9
LM
10707 /* Fetch the list of registers. */
10708 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10709 arm_insn_r->reg_rec_count = 0;
10710
10711 /* Fetch the base register that contains the address we are loading data
10712 to. */
10713 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10714
71e396f9
LM
10715 /* Calculate wback. */
10716 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10717
10718 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10719 {
71e396f9 10720 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10721
71e396f9 10722 /* Find out which registers are going to be loaded from memory. */
72508ac0 10723 while (register_bits)
71e396f9
LM
10724 {
10725 if (register_bits & 0x00000001)
10726 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10727 register_bits = register_bits >> 1;
10728 register_count++;
10729 }
72508ac0 10730
71e396f9
LM
10731
10732 /* If wback is true, also save the base register, which is going to be
10733 written to. */
10734 if (wback)
10735 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10736
10737 /* Save the CPSR register. */
10738 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10739 }
10740 else
10741 {
71e396f9 10742 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10743
71e396f9
LM
10744 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10745
10746 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10747
10748 /* Find out how many registers are going to be stored to memory. */
72508ac0 10749 while (register_bits)
71e396f9
LM
10750 {
10751 if (register_bits & 0x00000001)
10752 register_count++;
10753 register_bits = register_bits >> 1;
10754 }
72508ac0
PO
10755
10756 switch (addr_mode)
71e396f9
LM
10757 {
10758 /* STMDA (STMED): Decrement after. */
10759 case 0:
10760 record_buf_mem[1] = (uint32_t) u_regval
10761 - register_count * INT_REGISTER_SIZE + 4;
10762 break;
10763 /* STM (STMIA, STMEA): Increment after. */
10764 case 1:
10765 record_buf_mem[1] = (uint32_t) u_regval;
10766 break;
10767 /* STMDB (STMFD): Decrement before. */
10768 case 2:
10769 record_buf_mem[1] = (uint32_t) u_regval
10770 - register_count * INT_REGISTER_SIZE;
10771 break;
10772 /* STMIB (STMFA): Increment before. */
10773 case 3:
10774 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
10775 break;
10776 default:
10777 gdb_assert_not_reached ("no decoding pattern found");
10778 break;
10779 }
72508ac0 10780
71e396f9
LM
10781 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
10782 arm_insn_r->mem_rec_count = 1;
10783
10784 /* If wback is true, also save the base register, which is going to be
10785 written to. */
10786 if (wback)
10787 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10788 }
10789
10790 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10791 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10792 return 0;
10793}
10794
10795/* Handling opcode 101 insns. */
10796
10797static int
10798arm_record_b_bl (insn_decode_record *arm_insn_r)
10799{
10800 uint32_t record_buf[8];
10801
10802 /* Handle B, BL, BLX(1) insns. */
10803 /* B simply branches so we do nothing here. */
10804 /* Note: BLX(1) doesnt fall here but instead it falls into
10805 extension space. */
10806 if (bit (arm_insn_r->arm_insn, 24))
10807 {
10808 record_buf[0] = ARM_LR_REGNUM;
10809 arm_insn_r->reg_rec_count = 1;
10810 }
10811
10812 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10813
10814 return 0;
10815}
10816
10817/* Handling opcode 110 insns. */
10818
10819static int
c6ec2b30 10820arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
10821{
10822 printf_unfiltered (_("Process record does not support instruction "
10823 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10824 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10825
10826 return -1;
10827}
10828
5a578da5
OJ
10829/* Record handler for vector data transfer instructions. */
10830
10831static int
10832arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
10833{
10834 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
10835 uint32_t record_buf[4];
10836
10837 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10838 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
10839 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
10840 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
10841 bit_l = bit (arm_insn_r->arm_insn, 20);
10842 bit_c = bit (arm_insn_r->arm_insn, 8);
10843
10844 /* Handle VMOV instruction. */
10845 if (bit_l && bit_c)
10846 {
10847 record_buf[0] = reg_t;
10848 arm_insn_r->reg_rec_count = 1;
10849 }
10850 else if (bit_l && !bit_c)
10851 {
10852 /* Handle VMOV instruction. */
10853 if (bits_a == 0x00)
10854 {
10855 if (bit (arm_insn_r->arm_insn, 20))
10856 record_buf[0] = reg_t;
10857 else
10858 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10859 (reg_v << 1));
10860
10861 arm_insn_r->reg_rec_count = 1;
10862 }
10863 /* Handle VMRS instruction. */
10864 else if (bits_a == 0x07)
10865 {
10866 if (reg_t == 15)
10867 reg_t = ARM_PS_REGNUM;
10868
10869 record_buf[0] = reg_t;
10870 arm_insn_r->reg_rec_count = 1;
10871 }
10872 }
10873 else if (!bit_l && !bit_c)
10874 {
10875 /* Handle VMOV instruction. */
10876 if (bits_a == 0x00)
10877 {
10878 if (bit (arm_insn_r->arm_insn, 20))
10879 record_buf[0] = reg_t;
10880 else
10881 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10882 (reg_v << 1));
10883
10884 arm_insn_r->reg_rec_count = 1;
10885 }
10886 /* Handle VMSR instruction. */
10887 else if (bits_a == 0x07)
10888 {
10889 record_buf[0] = ARM_FPSCR_REGNUM;
10890 arm_insn_r->reg_rec_count = 1;
10891 }
10892 }
10893 else if (!bit_l && bit_c)
10894 {
10895 /* Handle VMOV instruction. */
10896 if (!(bits_a & 0x04))
10897 {
10898 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
10899 + ARM_D0_REGNUM;
10900 arm_insn_r->reg_rec_count = 1;
10901 }
10902 /* Handle VDUP instruction. */
10903 else
10904 {
10905 if (bit (arm_insn_r->arm_insn, 21))
10906 {
10907 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10908 record_buf[0] = reg_v + ARM_D0_REGNUM;
10909 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
10910 arm_insn_r->reg_rec_count = 2;
10911 }
10912 else
10913 {
10914 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10915 record_buf[0] = reg_v + ARM_D0_REGNUM;
10916 arm_insn_r->reg_rec_count = 1;
10917 }
10918 }
10919 }
10920
10921 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10922 return 0;
10923}
10924
f20f80dd
OJ
10925/* Record handler for extension register load/store instructions. */
10926
10927static int
10928arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
10929{
10930 uint32_t opcode, single_reg;
10931 uint8_t op_vldm_vstm;
10932 uint32_t record_buf[8], record_buf_mem[128];
10933 ULONGEST u_regval = 0;
10934
10935 struct regcache *reg_cache = arm_insn_r->regcache;
10936 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10937
10938 opcode = bits (arm_insn_r->arm_insn, 20, 24);
10939 single_reg = bit (arm_insn_r->arm_insn, 8);
10940 op_vldm_vstm = opcode & 0x1b;
10941
10942 /* Handle VMOV instructions. */
10943 if ((opcode & 0x1e) == 0x04)
10944 {
10945 if (bit (arm_insn_r->arm_insn, 4))
10946 {
10947 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10948 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10949 arm_insn_r->reg_rec_count = 2;
10950 }
10951 else
10952 {
10953 uint8_t reg_m = (bits (arm_insn_r->arm_insn, 0, 3) << 1)
10954 | bit (arm_insn_r->arm_insn, 5);
10955
10956 if (!single_reg)
10957 {
10958 record_buf[0] = num_regs + reg_m;
10959 record_buf[1] = num_regs + reg_m + 1;
10960 arm_insn_r->reg_rec_count = 2;
10961 }
10962 else
10963 {
10964 record_buf[0] = reg_m + ARM_D0_REGNUM;
10965 arm_insn_r->reg_rec_count = 1;
10966 }
10967 }
10968 }
10969 /* Handle VSTM and VPUSH instructions. */
10970 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
10971 || op_vldm_vstm == 0x12)
10972 {
10973 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
10974 uint32_t memory_index = 0;
10975
10976 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
10977 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
10978 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
10979 imm_off32 = imm_off8 << 24;
10980 memory_count = imm_off8;
10981
10982 if (bit (arm_insn_r->arm_insn, 23))
10983 start_address = u_regval;
10984 else
10985 start_address = u_regval - imm_off32;
10986
10987 if (bit (arm_insn_r->arm_insn, 21))
10988 {
10989 record_buf[0] = reg_rn;
10990 arm_insn_r->reg_rec_count = 1;
10991 }
10992
10993 while (memory_count > 0)
10994 {
10995 if (!single_reg)
10996 {
10997 record_buf_mem[memory_index] = start_address;
10998 record_buf_mem[memory_index + 1] = 4;
10999 start_address = start_address + 4;
11000 memory_index = memory_index + 2;
11001 }
11002 else
11003 {
11004 record_buf_mem[memory_index] = start_address;
11005 record_buf_mem[memory_index + 1] = 4;
11006 record_buf_mem[memory_index + 2] = start_address + 4;
11007 record_buf_mem[memory_index + 3] = 4;
11008 start_address = start_address + 8;
11009 memory_index = memory_index + 4;
11010 }
11011 memory_count--;
11012 }
11013 arm_insn_r->mem_rec_count = (memory_index >> 1);
11014 }
11015 /* Handle VLDM instructions. */
11016 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
11017 || op_vldm_vstm == 0x13)
11018 {
11019 uint32_t reg_count, reg_vd;
11020 uint32_t reg_index = 0;
11021
11022 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11023 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11024
11025 if (single_reg)
11026 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11027 else
11028 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11029
11030 if (bit (arm_insn_r->arm_insn, 21))
11031 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
11032
11033 while (reg_count > 0)
11034 {
11035 if (single_reg)
11036 record_buf[reg_index++] = num_regs + reg_vd + reg_count - 1;
11037 else
11038 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
11039
11040 reg_count--;
11041 }
11042 arm_insn_r->reg_rec_count = reg_index;
11043 }
11044 /* VSTR Vector store register. */
11045 else if ((opcode & 0x13) == 0x10)
11046 {
11047 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11048 uint32_t memory_index = 0;
11049
11050 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11051 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11052 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11053 imm_off32 = imm_off8 << 24;
11054 memory_count = imm_off8;
11055
11056 if (bit (arm_insn_r->arm_insn, 23))
11057 start_address = u_regval + imm_off32;
11058 else
11059 start_address = u_regval - imm_off32;
11060
11061 if (single_reg)
11062 {
11063 record_buf_mem[memory_index] = start_address;
11064 record_buf_mem[memory_index + 1] = 4;
11065 arm_insn_r->mem_rec_count = 1;
11066 }
11067 else
11068 {
11069 record_buf_mem[memory_index] = start_address;
11070 record_buf_mem[memory_index + 1] = 4;
11071 record_buf_mem[memory_index + 2] = start_address + 4;
11072 record_buf_mem[memory_index + 3] = 4;
11073 arm_insn_r->mem_rec_count = 2;
11074 }
11075 }
11076 /* VLDR Vector load register. */
11077 else if ((opcode & 0x13) == 0x11)
11078 {
11079 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11080
11081 if (!single_reg)
11082 {
11083 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11084 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11085 }
11086 else
11087 {
11088 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11089 record_buf[0] = num_regs + reg_vd;
11090 }
11091 arm_insn_r->reg_rec_count = 1;
11092 }
11093
11094 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11095 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11096 return 0;
11097}
11098
851f26ae
OJ
11099/* Record handler for arm/thumb mode VFP data processing instructions. */
11100
11101static int
11102arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11103{
11104 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11105 uint32_t record_buf[4];
11106 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11107 enum insn_types curr_insn_type = INSN_INV;
11108
11109 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11110 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11111 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11112 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11113 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11114 bit_d = bit (arm_insn_r->arm_insn, 22);
11115 opc1 = opc1 & 0x04;
11116
11117 /* Handle VMLA, VMLS. */
11118 if (opc1 == 0x00)
11119 {
11120 if (bit (arm_insn_r->arm_insn, 10))
11121 {
11122 if (bit (arm_insn_r->arm_insn, 6))
11123 curr_insn_type = INSN_T0;
11124 else
11125 curr_insn_type = INSN_T1;
11126 }
11127 else
11128 {
11129 if (dp_op_sz)
11130 curr_insn_type = INSN_T1;
11131 else
11132 curr_insn_type = INSN_T2;
11133 }
11134 }
11135 /* Handle VNMLA, VNMLS, VNMUL. */
11136 else if (opc1 == 0x01)
11137 {
11138 if (dp_op_sz)
11139 curr_insn_type = INSN_T1;
11140 else
11141 curr_insn_type = INSN_T2;
11142 }
11143 /* Handle VMUL. */
11144 else if (opc1 == 0x02 && !(opc3 & 0x01))
11145 {
11146 if (bit (arm_insn_r->arm_insn, 10))
11147 {
11148 if (bit (arm_insn_r->arm_insn, 6))
11149 curr_insn_type = INSN_T0;
11150 else
11151 curr_insn_type = INSN_T1;
11152 }
11153 else
11154 {
11155 if (dp_op_sz)
11156 curr_insn_type = INSN_T1;
11157 else
11158 curr_insn_type = INSN_T2;
11159 }
11160 }
11161 /* Handle VADD, VSUB. */
11162 else if (opc1 == 0x03)
11163 {
11164 if (!bit (arm_insn_r->arm_insn, 9))
11165 {
11166 if (bit (arm_insn_r->arm_insn, 6))
11167 curr_insn_type = INSN_T0;
11168 else
11169 curr_insn_type = INSN_T1;
11170 }
11171 else
11172 {
11173 if (dp_op_sz)
11174 curr_insn_type = INSN_T1;
11175 else
11176 curr_insn_type = INSN_T2;
11177 }
11178 }
11179 /* Handle VDIV. */
11180 else if (opc1 == 0x0b)
11181 {
11182 if (dp_op_sz)
11183 curr_insn_type = INSN_T1;
11184 else
11185 curr_insn_type = INSN_T2;
11186 }
11187 /* Handle all other vfp data processing instructions. */
11188 else if (opc1 == 0x0b)
11189 {
11190 /* Handle VMOV. */
11191 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11192 {
11193 if (bit (arm_insn_r->arm_insn, 4))
11194 {
11195 if (bit (arm_insn_r->arm_insn, 6))
11196 curr_insn_type = INSN_T0;
11197 else
11198 curr_insn_type = INSN_T1;
11199 }
11200 else
11201 {
11202 if (dp_op_sz)
11203 curr_insn_type = INSN_T1;
11204 else
11205 curr_insn_type = INSN_T2;
11206 }
11207 }
11208 /* Handle VNEG and VABS. */
11209 else if ((opc2 == 0x01 && opc3 == 0x01)
11210 || (opc2 == 0x00 && opc3 == 0x03))
11211 {
11212 if (!bit (arm_insn_r->arm_insn, 11))
11213 {
11214 if (bit (arm_insn_r->arm_insn, 6))
11215 curr_insn_type = INSN_T0;
11216 else
11217 curr_insn_type = INSN_T1;
11218 }
11219 else
11220 {
11221 if (dp_op_sz)
11222 curr_insn_type = INSN_T1;
11223 else
11224 curr_insn_type = INSN_T2;
11225 }
11226 }
11227 /* Handle VSQRT. */
11228 else if (opc2 == 0x01 && opc3 == 0x03)
11229 {
11230 if (dp_op_sz)
11231 curr_insn_type = INSN_T1;
11232 else
11233 curr_insn_type = INSN_T2;
11234 }
11235 /* Handle VCVT. */
11236 else if (opc2 == 0x07 && opc3 == 0x03)
11237 {
11238 if (!dp_op_sz)
11239 curr_insn_type = INSN_T1;
11240 else
11241 curr_insn_type = INSN_T2;
11242 }
11243 else if (opc3 & 0x01)
11244 {
11245 /* Handle VCVT. */
11246 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11247 {
11248 if (!bit (arm_insn_r->arm_insn, 18))
11249 curr_insn_type = INSN_T2;
11250 else
11251 {
11252 if (dp_op_sz)
11253 curr_insn_type = INSN_T1;
11254 else
11255 curr_insn_type = INSN_T2;
11256 }
11257 }
11258 /* Handle VCVT. */
11259 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11260 {
11261 if (dp_op_sz)
11262 curr_insn_type = INSN_T1;
11263 else
11264 curr_insn_type = INSN_T2;
11265 }
11266 /* Handle VCVTB, VCVTT. */
11267 else if ((opc2 & 0x0e) == 0x02)
11268 curr_insn_type = INSN_T2;
11269 /* Handle VCMP, VCMPE. */
11270 else if ((opc2 & 0x0e) == 0x04)
11271 curr_insn_type = INSN_T3;
11272 }
11273 }
11274
11275 switch (curr_insn_type)
11276 {
11277 case INSN_T0:
11278 reg_vd = reg_vd | (bit_d << 4);
11279 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11280 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11281 arm_insn_r->reg_rec_count = 2;
11282 break;
11283
11284 case INSN_T1:
11285 reg_vd = reg_vd | (bit_d << 4);
11286 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11287 arm_insn_r->reg_rec_count = 1;
11288 break;
11289
11290 case INSN_T2:
11291 reg_vd = (reg_vd << 1) | bit_d;
11292 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11293 arm_insn_r->reg_rec_count = 1;
11294 break;
11295
11296 case INSN_T3:
11297 record_buf[0] = ARM_FPSCR_REGNUM;
11298 arm_insn_r->reg_rec_count = 1;
11299 break;
11300
11301 default:
11302 gdb_assert_not_reached ("no decoding pattern found");
11303 break;
11304 }
11305
11306 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11307 return 0;
11308}
11309
60cc5e93
OJ
11310/* Handling opcode 110 insns. */
11311
11312static int
11313arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11314{
11315 uint32_t op, op1, op1_sbit, op1_ebit, coproc;
11316
11317 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11318 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11319 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11320
11321 if ((coproc & 0x0e) == 0x0a)
11322 {
11323 /* Handle extension register ld/st instructions. */
11324 if (!(op1 & 0x20))
f20f80dd 11325 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11326
11327 /* 64-bit transfers between arm core and extension registers. */
11328 if ((op1 & 0x3e) == 0x04)
f20f80dd 11329 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11330 }
11331 else
11332 {
11333 /* Handle coprocessor ld/st instructions. */
11334 if (!(op1 & 0x3a))
11335 {
11336 /* Store. */
11337 if (!op1_ebit)
11338 return arm_record_unsupported_insn (arm_insn_r);
11339 else
11340 /* Load. */
11341 return arm_record_unsupported_insn (arm_insn_r);
11342 }
11343
11344 /* Move to coprocessor from two arm core registers. */
11345 if (op1 == 0x4)
11346 return arm_record_unsupported_insn (arm_insn_r);
11347
11348 /* Move to two arm core registers from coprocessor. */
11349 if (op1 == 0x5)
11350 {
11351 uint32_t reg_t[2];
11352
11353 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11354 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11355 arm_insn_r->reg_rec_count = 2;
11356
11357 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11358 return 0;
11359 }
11360 }
11361 return arm_record_unsupported_insn (arm_insn_r);
11362}
11363
72508ac0
PO
11364/* Handling opcode 111 insns. */
11365
11366static int
11367arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11368{
60cc5e93 11369 uint32_t op, op1_sbit, op1_ebit, coproc;
72508ac0
PO
11370 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11371 struct regcache *reg_cache = arm_insn_r->regcache;
97dfe206 11372 ULONGEST u_regval = 0;
72508ac0
PO
11373
11374 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93
OJ
11375 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11376 op1_sbit = bit (arm_insn_r->arm_insn, 24);
11377 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11378 op = bit (arm_insn_r->arm_insn, 4);
97dfe206
OJ
11379
11380 /* Handle arm SWI/SVC system call instructions. */
60cc5e93 11381 if (op1_sbit)
97dfe206
OJ
11382 {
11383 if (tdep->arm_syscall_record != NULL)
11384 {
11385 ULONGEST svc_operand, svc_number;
11386
11387 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11388
11389 if (svc_operand) /* OABI. */
11390 svc_number = svc_operand - 0x900000;
11391 else /* EABI. */
11392 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11393
60cc5e93 11394 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11395 }
11396 else
11397 {
11398 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11399 return -1;
97dfe206
OJ
11400 }
11401 }
60cc5e93
OJ
11402
11403 if ((coproc & 0x0e) == 0x0a)
11404 {
11405 /* VFP data-processing instructions. */
11406 if (!op1_sbit && !op)
851f26ae 11407 return arm_record_vfp_data_proc_insn (arm_insn_r);
60cc5e93
OJ
11408
11409 /* Advanced SIMD, VFP instructions. */
11410 if (!op1_sbit && op)
5a578da5 11411 return arm_record_vdata_transfer_insn (arm_insn_r);
60cc5e93 11412 }
97dfe206
OJ
11413 else
11414 {
60cc5e93
OJ
11415 /* Coprocessor data operations. */
11416 if (!op1_sbit && !op)
11417 return arm_record_unsupported_insn (arm_insn_r);
11418
11419 /* Move to Coprocessor from ARM core register. */
11420 if (!op1_sbit && !op1_ebit && op)
11421 return arm_record_unsupported_insn (arm_insn_r);
11422
11423 /* Move to arm core register from coprocessor. */
11424 if (!op1_sbit && op1_ebit && op)
11425 {
11426 uint32_t record_buf[1];
11427
11428 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11429 if (record_buf[0] == 15)
11430 record_buf[0] = ARM_PS_REGNUM;
11431
11432 arm_insn_r->reg_rec_count = 1;
11433 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11434 record_buf);
11435 return 0;
11436 }
97dfe206 11437 }
72508ac0 11438
60cc5e93 11439 return arm_record_unsupported_insn (arm_insn_r);
72508ac0
PO
11440}
11441
11442/* Handling opcode 000 insns. */
11443
11444static int
11445thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11446{
11447 uint32_t record_buf[8];
11448 uint32_t reg_src1 = 0;
11449
11450 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11451
11452 record_buf[0] = ARM_PS_REGNUM;
11453 record_buf[1] = reg_src1;
11454 thumb_insn_r->reg_rec_count = 2;
11455
11456 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11457
11458 return 0;
11459}
11460
11461
11462/* Handling opcode 001 insns. */
11463
11464static int
11465thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11466{
11467 uint32_t record_buf[8];
11468 uint32_t reg_src1 = 0;
11469
11470 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11471
11472 record_buf[0] = ARM_PS_REGNUM;
11473 record_buf[1] = reg_src1;
11474 thumb_insn_r->reg_rec_count = 2;
11475
11476 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11477
11478 return 0;
11479}
11480
11481/* Handling opcode 010 insns. */
11482
11483static int
11484thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11485{
11486 struct regcache *reg_cache = thumb_insn_r->regcache;
11487 uint32_t record_buf[8], record_buf_mem[8];
11488
11489 uint32_t reg_src1 = 0, reg_src2 = 0;
11490 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11491
11492 ULONGEST u_regval[2] = {0};
11493
11494 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11495
11496 if (bit (thumb_insn_r->arm_insn, 12))
11497 {
11498 /* Handle load/store register offset. */
11499 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
11500 if (opcode2 >= 12 && opcode2 <= 15)
11501 {
11502 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11503 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11504 record_buf[0] = reg_src1;
11505 thumb_insn_r->reg_rec_count = 1;
11506 }
11507 else if (opcode2 >= 8 && opcode2 <= 10)
11508 {
11509 /* STR(2), STRB(2), STRH(2) . */
11510 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11511 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11512 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11513 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11514 if (8 == opcode2)
11515 record_buf_mem[0] = 4; /* STR (2). */
11516 else if (10 == opcode2)
11517 record_buf_mem[0] = 1; /* STRB (2). */
11518 else if (9 == opcode2)
11519 record_buf_mem[0] = 2; /* STRH (2). */
11520 record_buf_mem[1] = u_regval[0] + u_regval[1];
11521 thumb_insn_r->mem_rec_count = 1;
11522 }
11523 }
11524 else if (bit (thumb_insn_r->arm_insn, 11))
11525 {
11526 /* Handle load from literal pool. */
11527 /* LDR(3). */
11528 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11529 record_buf[0] = reg_src1;
11530 thumb_insn_r->reg_rec_count = 1;
11531 }
11532 else if (opcode1)
11533 {
11534 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11535 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11536 if ((3 == opcode2) && (!opcode3))
11537 {
11538 /* Branch with exchange. */
11539 record_buf[0] = ARM_PS_REGNUM;
11540 thumb_insn_r->reg_rec_count = 1;
11541 }
11542 else
11543 {
11544 /* Format 8; special data processing insns. */
11545 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11546 record_buf[0] = ARM_PS_REGNUM;
11547 record_buf[1] = reg_src1;
11548 thumb_insn_r->reg_rec_count = 2;
11549 }
11550 }
11551 else
11552 {
11553 /* Format 5; data processing insns. */
11554 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11555 if (bit (thumb_insn_r->arm_insn, 7))
11556 {
11557 reg_src1 = reg_src1 + 8;
11558 }
11559 record_buf[0] = ARM_PS_REGNUM;
11560 record_buf[1] = reg_src1;
11561 thumb_insn_r->reg_rec_count = 2;
11562 }
11563
11564 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11565 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11566 record_buf_mem);
11567
11568 return 0;
11569}
11570
11571/* Handling opcode 001 insns. */
11572
11573static int
11574thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11575{
11576 struct regcache *reg_cache = thumb_insn_r->regcache;
11577 uint32_t record_buf[8], record_buf_mem[8];
11578
11579 uint32_t reg_src1 = 0;
11580 uint32_t opcode = 0, immed_5 = 0;
11581
11582 ULONGEST u_regval = 0;
11583
11584 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11585
11586 if (opcode)
11587 {
11588 /* LDR(1). */
11589 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11590 record_buf[0] = reg_src1;
11591 thumb_insn_r->reg_rec_count = 1;
11592 }
11593 else
11594 {
11595 /* STR(1). */
11596 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11597 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11598 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11599 record_buf_mem[0] = 4;
11600 record_buf_mem[1] = u_regval + (immed_5 * 4);
11601 thumb_insn_r->mem_rec_count = 1;
11602 }
11603
11604 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11605 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11606 record_buf_mem);
11607
11608 return 0;
11609}
11610
11611/* Handling opcode 100 insns. */
11612
11613static int
11614thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11615{
11616 struct regcache *reg_cache = thumb_insn_r->regcache;
11617 uint32_t record_buf[8], record_buf_mem[8];
11618
11619 uint32_t reg_src1 = 0;
11620 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11621
11622 ULONGEST u_regval = 0;
11623
11624 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11625
11626 if (3 == opcode)
11627 {
11628 /* LDR(4). */
11629 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11630 record_buf[0] = reg_src1;
11631 thumb_insn_r->reg_rec_count = 1;
11632 }
11633 else if (1 == opcode)
11634 {
11635 /* LDRH(1). */
11636 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11637 record_buf[0] = reg_src1;
11638 thumb_insn_r->reg_rec_count = 1;
11639 }
11640 else if (2 == opcode)
11641 {
11642 /* STR(3). */
11643 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11644 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11645 record_buf_mem[0] = 4;
11646 record_buf_mem[1] = u_regval + (immed_8 * 4);
11647 thumb_insn_r->mem_rec_count = 1;
11648 }
11649 else if (0 == opcode)
11650 {
11651 /* STRH(1). */
11652 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11653 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11654 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11655 record_buf_mem[0] = 2;
11656 record_buf_mem[1] = u_regval + (immed_5 * 2);
11657 thumb_insn_r->mem_rec_count = 1;
11658 }
11659
11660 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11661 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11662 record_buf_mem);
11663
11664 return 0;
11665}
11666
11667/* Handling opcode 101 insns. */
11668
11669static int
11670thumb_record_misc (insn_decode_record *thumb_insn_r)
11671{
11672 struct regcache *reg_cache = thumb_insn_r->regcache;
11673
11674 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
11675 uint32_t register_bits = 0, register_count = 0;
11676 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
11677 uint32_t record_buf[24], record_buf_mem[48];
11678 uint32_t reg_src1;
11679
11680 ULONGEST u_regval = 0;
11681
11682 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11683 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11684 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
11685
11686 if (14 == opcode2)
11687 {
11688 /* POP. */
11689 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11690 while (register_bits)
f969241e
OJ
11691 {
11692 if (register_bits & 0x00000001)
11693 record_buf[index++] = register_count;
11694 register_bits = register_bits >> 1;
11695 register_count++;
11696 }
11697 record_buf[index++] = ARM_PS_REGNUM;
11698 record_buf[index++] = ARM_SP_REGNUM;
11699 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11700 }
11701 else if (10 == opcode2)
11702 {
11703 /* PUSH. */
11704 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
9904a494 11705 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
72508ac0
PO
11706 while (register_bits)
11707 {
11708 if (register_bits & 0x00000001)
11709 register_count++;
11710 register_bits = register_bits >> 1;
11711 }
11712 start_address = u_regval - \
11713 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11714 thumb_insn_r->mem_rec_count = register_count;
11715 while (register_count)
11716 {
11717 record_buf_mem[(register_count * 2) - 1] = start_address;
11718 record_buf_mem[(register_count * 2) - 2] = 4;
11719 start_address = start_address + 4;
11720 register_count--;
11721 }
11722 record_buf[0] = ARM_SP_REGNUM;
11723 thumb_insn_r->reg_rec_count = 1;
11724 }
11725 else if (0x1E == opcode1)
11726 {
11727 /* BKPT insn. */
11728 /* Handle enhanced software breakpoint insn, BKPT. */
11729 /* CPSR is changed to be executed in ARM state, disabling normal
11730 interrupts, entering abort mode. */
11731 /* According to high vector configuration PC is set. */
11732 /* User hits breakpoint and type reverse, in that case, we need to go back with
11733 previous CPSR and Program Counter. */
11734 record_buf[0] = ARM_PS_REGNUM;
11735 record_buf[1] = ARM_LR_REGNUM;
11736 thumb_insn_r->reg_rec_count = 2;
11737 /* We need to save SPSR value, which is not yet done. */
11738 printf_unfiltered (_("Process record does not support instruction "
11739 "0x%0x at address %s.\n"),
11740 thumb_insn_r->arm_insn,
11741 paddress (thumb_insn_r->gdbarch,
11742 thumb_insn_r->this_addr));
11743 return -1;
11744 }
11745 else if ((0 == opcode) || (1 == opcode))
11746 {
11747 /* ADD(5), ADD(6). */
11748 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11749 record_buf[0] = reg_src1;
11750 thumb_insn_r->reg_rec_count = 1;
11751 }
11752 else if (2 == opcode)
11753 {
11754 /* ADD(7), SUB(4). */
11755 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11756 record_buf[0] = ARM_SP_REGNUM;
11757 thumb_insn_r->reg_rec_count = 1;
11758 }
11759
11760 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11761 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11762 record_buf_mem);
11763
11764 return 0;
11765}
11766
11767/* Handling opcode 110 insns. */
11768
11769static int
11770thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
11771{
11772 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
11773 struct regcache *reg_cache = thumb_insn_r->regcache;
11774
11775 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
11776 uint32_t reg_src1 = 0;
11777 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
11778 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
11779 uint32_t record_buf[24], record_buf_mem[48];
11780
11781 ULONGEST u_regval = 0;
11782
11783 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11784 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
11785
11786 if (1 == opcode2)
11787 {
11788
11789 /* LDMIA. */
11790 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11791 /* Get Rn. */
11792 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11793 while (register_bits)
11794 {
11795 if (register_bits & 0x00000001)
f969241e 11796 record_buf[index++] = register_count;
72508ac0 11797 register_bits = register_bits >> 1;
f969241e 11798 register_count++;
72508ac0 11799 }
f969241e
OJ
11800 record_buf[index++] = reg_src1;
11801 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11802 }
11803 else if (0 == opcode2)
11804 {
11805 /* It handles both STMIA. */
11806 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11807 /* Get Rn. */
11808 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11809 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11810 while (register_bits)
11811 {
11812 if (register_bits & 0x00000001)
11813 register_count++;
11814 register_bits = register_bits >> 1;
11815 }
11816 start_address = u_regval;
11817 thumb_insn_r->mem_rec_count = register_count;
11818 while (register_count)
11819 {
11820 record_buf_mem[(register_count * 2) - 1] = start_address;
11821 record_buf_mem[(register_count * 2) - 2] = 4;
11822 start_address = start_address + 4;
11823 register_count--;
11824 }
11825 }
11826 else if (0x1F == opcode1)
11827 {
11828 /* Handle arm syscall insn. */
97dfe206 11829 if (tdep->arm_syscall_record != NULL)
72508ac0 11830 {
97dfe206
OJ
11831 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
11832 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
11833 }
11834 else
11835 {
11836 printf_unfiltered (_("no syscall record support\n"));
11837 return -1;
11838 }
11839 }
11840
11841 /* B (1), conditional branch is automatically taken care in process_record,
11842 as PC is saved there. */
11843
11844 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11845 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11846 record_buf_mem);
11847
11848 return ret;
11849}
11850
11851/* Handling opcode 111 insns. */
11852
11853static int
11854thumb_record_branch (insn_decode_record *thumb_insn_r)
11855{
11856 uint32_t record_buf[8];
11857 uint32_t bits_h = 0;
11858
11859 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
11860
11861 if (2 == bits_h || 3 == bits_h)
11862 {
11863 /* BL */
11864 record_buf[0] = ARM_LR_REGNUM;
11865 thumb_insn_r->reg_rec_count = 1;
11866 }
11867 else if (1 == bits_h)
11868 {
11869 /* BLX(1). */
11870 record_buf[0] = ARM_PS_REGNUM;
11871 record_buf[1] = ARM_LR_REGNUM;
11872 thumb_insn_r->reg_rec_count = 2;
11873 }
11874
11875 /* B(2) is automatically taken care in process_record, as PC is
11876 saved there. */
11877
11878 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11879
11880 return 0;
11881}
11882
c6ec2b30
OJ
11883/* Handler for thumb2 load/store multiple instructions. */
11884
11885static int
11886thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
11887{
11888 struct regcache *reg_cache = thumb2_insn_r->regcache;
11889
11890 uint32_t reg_rn, op;
11891 uint32_t register_bits = 0, register_count = 0;
11892 uint32_t index = 0, start_address = 0;
11893 uint32_t record_buf[24], record_buf_mem[48];
11894
11895 ULONGEST u_regval = 0;
11896
11897 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11898 op = bits (thumb2_insn_r->arm_insn, 23, 24);
11899
11900 if (0 == op || 3 == op)
11901 {
11902 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11903 {
11904 /* Handle RFE instruction. */
11905 record_buf[0] = ARM_PS_REGNUM;
11906 thumb2_insn_r->reg_rec_count = 1;
11907 }
11908 else
11909 {
11910 /* Handle SRS instruction after reading banked SP. */
11911 return arm_record_unsupported_insn (thumb2_insn_r);
11912 }
11913 }
11914 else if (1 == op || 2 == op)
11915 {
11916 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11917 {
11918 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
11919 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11920 while (register_bits)
11921 {
11922 if (register_bits & 0x00000001)
11923 record_buf[index++] = register_count;
11924
11925 register_count++;
11926 register_bits = register_bits >> 1;
11927 }
11928 record_buf[index++] = reg_rn;
11929 record_buf[index++] = ARM_PS_REGNUM;
11930 thumb2_insn_r->reg_rec_count = index;
11931 }
11932 else
11933 {
11934 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
11935 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11936 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11937 while (register_bits)
11938 {
11939 if (register_bits & 0x00000001)
11940 register_count++;
11941
11942 register_bits = register_bits >> 1;
11943 }
11944
11945 if (1 == op)
11946 {
11947 /* Start address calculation for LDMDB/LDMEA. */
11948 start_address = u_regval;
11949 }
11950 else if (2 == op)
11951 {
11952 /* Start address calculation for LDMDB/LDMEA. */
11953 start_address = u_regval - register_count * 4;
11954 }
11955
11956 thumb2_insn_r->mem_rec_count = register_count;
11957 while (register_count)
11958 {
11959 record_buf_mem[register_count * 2 - 1] = start_address;
11960 record_buf_mem[register_count * 2 - 2] = 4;
11961 start_address = start_address + 4;
11962 register_count--;
11963 }
11964 record_buf[0] = reg_rn;
11965 record_buf[1] = ARM_PS_REGNUM;
11966 thumb2_insn_r->reg_rec_count = 2;
11967 }
11968 }
11969
11970 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
11971 record_buf_mem);
11972 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
11973 record_buf);
11974 return ARM_RECORD_SUCCESS;
11975}
11976
11977/* Handler for thumb2 load/store (dual/exclusive) and table branch
11978 instructions. */
11979
11980static int
11981thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
11982{
11983 struct regcache *reg_cache = thumb2_insn_r->regcache;
11984
11985 uint32_t reg_rd, reg_rn, offset_imm;
11986 uint32_t reg_dest1, reg_dest2;
11987 uint32_t address, offset_addr;
11988 uint32_t record_buf[8], record_buf_mem[8];
11989 uint32_t op1, op2, op3;
11990 LONGEST s_word;
11991
11992 ULONGEST u_regval[2];
11993
11994 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
11995 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
11996 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
11997
11998 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11999 {
12000 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12001 {
12002 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
12003 record_buf[0] = reg_dest1;
12004 record_buf[1] = ARM_PS_REGNUM;
12005 thumb2_insn_r->reg_rec_count = 2;
12006 }
12007
12008 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12009 {
12010 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12011 record_buf[2] = reg_dest2;
12012 thumb2_insn_r->reg_rec_count = 3;
12013 }
12014 }
12015 else
12016 {
12017 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12018 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12019
12020 if (0 == op1 && 0 == op2)
12021 {
12022 /* Handle STREX. */
12023 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12024 address = u_regval[0] + (offset_imm * 4);
12025 record_buf_mem[0] = 4;
12026 record_buf_mem[1] = address;
12027 thumb2_insn_r->mem_rec_count = 1;
12028 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12029 record_buf[0] = reg_rd;
12030 thumb2_insn_r->reg_rec_count = 1;
12031 }
12032 else if (1 == op1 && 0 == op2)
12033 {
12034 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12035 record_buf[0] = reg_rd;
12036 thumb2_insn_r->reg_rec_count = 1;
12037 address = u_regval[0];
12038 record_buf_mem[1] = address;
12039
12040 if (4 == op3)
12041 {
12042 /* Handle STREXB. */
12043 record_buf_mem[0] = 1;
12044 thumb2_insn_r->mem_rec_count = 1;
12045 }
12046 else if (5 == op3)
12047 {
12048 /* Handle STREXH. */
12049 record_buf_mem[0] = 2 ;
12050 thumb2_insn_r->mem_rec_count = 1;
12051 }
12052 else if (7 == op3)
12053 {
12054 /* Handle STREXD. */
12055 address = u_regval[0];
12056 record_buf_mem[0] = 4;
12057 record_buf_mem[2] = 4;
12058 record_buf_mem[3] = address + 4;
12059 thumb2_insn_r->mem_rec_count = 2;
12060 }
12061 }
12062 else
12063 {
12064 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12065
12066 if (bit (thumb2_insn_r->arm_insn, 24))
12067 {
12068 if (bit (thumb2_insn_r->arm_insn, 23))
12069 offset_addr = u_regval[0] + (offset_imm * 4);
12070 else
12071 offset_addr = u_regval[0] - (offset_imm * 4);
12072
12073 address = offset_addr;
12074 }
12075 else
12076 address = u_regval[0];
12077
12078 record_buf_mem[0] = 4;
12079 record_buf_mem[1] = address;
12080 record_buf_mem[2] = 4;
12081 record_buf_mem[3] = address + 4;
12082 thumb2_insn_r->mem_rec_count = 2;
12083 record_buf[0] = reg_rn;
12084 thumb2_insn_r->reg_rec_count = 1;
12085 }
12086 }
12087
12088 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12089 record_buf);
12090 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12091 record_buf_mem);
12092 return ARM_RECORD_SUCCESS;
12093}
12094
12095/* Handler for thumb2 data processing (shift register and modified immediate)
12096 instructions. */
12097
12098static int
12099thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12100{
12101 uint32_t reg_rd, op;
12102 uint32_t record_buf[8];
12103
12104 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12105 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12106
12107 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12108 {
12109 record_buf[0] = ARM_PS_REGNUM;
12110 thumb2_insn_r->reg_rec_count = 1;
12111 }
12112 else
12113 {
12114 record_buf[0] = reg_rd;
12115 record_buf[1] = ARM_PS_REGNUM;
12116 thumb2_insn_r->reg_rec_count = 2;
12117 }
12118
12119 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12120 record_buf);
12121 return ARM_RECORD_SUCCESS;
12122}
12123
12124/* Generic handler for thumb2 instructions which effect destination and PS
12125 registers. */
12126
12127static int
12128thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12129{
12130 uint32_t reg_rd;
12131 uint32_t record_buf[8];
12132
12133 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12134
12135 record_buf[0] = reg_rd;
12136 record_buf[1] = ARM_PS_REGNUM;
12137 thumb2_insn_r->reg_rec_count = 2;
12138
12139 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12140 record_buf);
12141 return ARM_RECORD_SUCCESS;
12142}
12143
12144/* Handler for thumb2 branch and miscellaneous control instructions. */
12145
12146static int
12147thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12148{
12149 uint32_t op, op1, op2;
12150 uint32_t record_buf[8];
12151
12152 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12153 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12154 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12155
12156 /* Handle MSR insn. */
12157 if (!(op1 & 0x2) && 0x38 == op)
12158 {
12159 if (!(op2 & 0x3))
12160 {
12161 /* CPSR is going to be changed. */
12162 record_buf[0] = ARM_PS_REGNUM;
12163 thumb2_insn_r->reg_rec_count = 1;
12164 }
12165 else
12166 {
12167 arm_record_unsupported_insn(thumb2_insn_r);
12168 return -1;
12169 }
12170 }
12171 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12172 {
12173 /* BLX. */
12174 record_buf[0] = ARM_PS_REGNUM;
12175 record_buf[1] = ARM_LR_REGNUM;
12176 thumb2_insn_r->reg_rec_count = 2;
12177 }
12178
12179 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12180 record_buf);
12181 return ARM_RECORD_SUCCESS;
12182}
12183
12184/* Handler for thumb2 store single data item instructions. */
12185
12186static int
12187thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12188{
12189 struct regcache *reg_cache = thumb2_insn_r->regcache;
12190
12191 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12192 uint32_t address, offset_addr;
12193 uint32_t record_buf[8], record_buf_mem[8];
12194 uint32_t op1, op2;
12195
12196 ULONGEST u_regval[2];
12197
12198 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12199 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12200 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12201 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12202
12203 if (bit (thumb2_insn_r->arm_insn, 23))
12204 {
12205 /* T2 encoding. */
12206 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12207 offset_addr = u_regval[0] + offset_imm;
12208 address = offset_addr;
12209 }
12210 else
12211 {
12212 /* T3 encoding. */
12213 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12214 {
12215 /* Handle STRB (register). */
12216 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12217 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12218 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12219 offset_addr = u_regval[1] << shift_imm;
12220 address = u_regval[0] + offset_addr;
12221 }
12222 else
12223 {
12224 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12225 if (bit (thumb2_insn_r->arm_insn, 10))
12226 {
12227 if (bit (thumb2_insn_r->arm_insn, 9))
12228 offset_addr = u_regval[0] + offset_imm;
12229 else
12230 offset_addr = u_regval[0] - offset_imm;
12231
12232 address = offset_addr;
12233 }
12234 else
12235 address = u_regval[0];
12236 }
12237 }
12238
12239 switch (op1)
12240 {
12241 /* Store byte instructions. */
12242 case 4:
12243 case 0:
12244 record_buf_mem[0] = 1;
12245 break;
12246 /* Store half word instructions. */
12247 case 1:
12248 case 5:
12249 record_buf_mem[0] = 2;
12250 break;
12251 /* Store word instructions. */
12252 case 2:
12253 case 6:
12254 record_buf_mem[0] = 4;
12255 break;
12256
12257 default:
12258 gdb_assert_not_reached ("no decoding pattern found");
12259 break;
12260 }
12261
12262 record_buf_mem[1] = address;
12263 thumb2_insn_r->mem_rec_count = 1;
12264 record_buf[0] = reg_rn;
12265 thumb2_insn_r->reg_rec_count = 1;
12266
12267 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12268 record_buf);
12269 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12270 record_buf_mem);
12271 return ARM_RECORD_SUCCESS;
12272}
12273
12274/* Handler for thumb2 load memory hints instructions. */
12275
12276static int
12277thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12278{
12279 uint32_t record_buf[8];
12280 uint32_t reg_rt, reg_rn;
12281
12282 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12283 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12284
12285 if (ARM_PC_REGNUM != reg_rt)
12286 {
12287 record_buf[0] = reg_rt;
12288 record_buf[1] = reg_rn;
12289 record_buf[2] = ARM_PS_REGNUM;
12290 thumb2_insn_r->reg_rec_count = 3;
12291
12292 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12293 record_buf);
12294 return ARM_RECORD_SUCCESS;
12295 }
12296
12297 return ARM_RECORD_FAILURE;
12298}
12299
12300/* Handler for thumb2 load word instructions. */
12301
12302static int
12303thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12304{
12305 uint32_t opcode1 = 0, opcode2 = 0;
12306 uint32_t record_buf[8];
12307
12308 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12309 record_buf[1] = ARM_PS_REGNUM;
12310 thumb2_insn_r->reg_rec_count = 2;
12311
12312 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12313 record_buf);
12314 return ARM_RECORD_SUCCESS;
12315}
12316
12317/* Handler for thumb2 long multiply, long multiply accumulate, and
12318 divide instructions. */
12319
12320static int
12321thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12322{
12323 uint32_t opcode1 = 0, opcode2 = 0;
12324 uint32_t record_buf[8];
12325 uint32_t reg_src1 = 0;
12326
12327 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12328 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12329
12330 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12331 {
12332 /* Handle SMULL, UMULL, SMULAL. */
12333 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12334 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12335 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12336 record_buf[2] = ARM_PS_REGNUM;
12337 thumb2_insn_r->reg_rec_count = 3;
12338 }
12339 else if (1 == opcode1 || 3 == opcode2)
12340 {
12341 /* Handle SDIV and UDIV. */
12342 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12343 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12344 record_buf[2] = ARM_PS_REGNUM;
12345 thumb2_insn_r->reg_rec_count = 3;
12346 }
12347 else
12348 return ARM_RECORD_FAILURE;
12349
12350 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12351 record_buf);
12352 return ARM_RECORD_SUCCESS;
12353}
12354
60cc5e93
OJ
12355/* Record handler for thumb32 coprocessor instructions. */
12356
12357static int
12358thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12359{
12360 if (bit (thumb2_insn_r->arm_insn, 25))
12361 return arm_record_coproc_data_proc (thumb2_insn_r);
12362 else
12363 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12364}
12365
1e1b6563
OJ
12366/* Record handler for advance SIMD structure load/store instructions. */
12367
12368static int
12369thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12370{
12371 struct regcache *reg_cache = thumb2_insn_r->regcache;
12372 uint32_t l_bit, a_bit, b_bits;
12373 uint32_t record_buf[128], record_buf_mem[128];
12374 uint32_t reg_rn, reg_vd, address, f_esize, f_elem;
12375 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12376 uint8_t f_ebytes;
12377
12378 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12379 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12380 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12381 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12382 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12383 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12384 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
12385 f_esize = 8 * f_ebytes;
12386 f_elem = 8 / f_ebytes;
12387
12388 if (!l_bit)
12389 {
12390 ULONGEST u_regval = 0;
12391 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12392 address = u_regval;
12393
12394 if (!a_bit)
12395 {
12396 /* Handle VST1. */
12397 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12398 {
12399 if (b_bits == 0x07)
12400 bf_regs = 1;
12401 else if (b_bits == 0x0a)
12402 bf_regs = 2;
12403 else if (b_bits == 0x06)
12404 bf_regs = 3;
12405 else if (b_bits == 0x02)
12406 bf_regs = 4;
12407 else
12408 bf_regs = 0;
12409
12410 for (index_r = 0; index_r < bf_regs; index_r++)
12411 {
12412 for (index_e = 0; index_e < f_elem; index_e++)
12413 {
12414 record_buf_mem[index_m++] = f_ebytes;
12415 record_buf_mem[index_m++] = address;
12416 address = address + f_ebytes;
12417 thumb2_insn_r->mem_rec_count += 1;
12418 }
12419 }
12420 }
12421 /* Handle VST2. */
12422 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12423 {
12424 if (b_bits == 0x09 || b_bits == 0x08)
12425 bf_regs = 1;
12426 else if (b_bits == 0x03)
12427 bf_regs = 2;
12428 else
12429 bf_regs = 0;
12430
12431 for (index_r = 0; index_r < bf_regs; index_r++)
12432 for (index_e = 0; index_e < f_elem; index_e++)
12433 {
12434 for (loop_t = 0; loop_t < 2; loop_t++)
12435 {
12436 record_buf_mem[index_m++] = f_ebytes;
12437 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12438 thumb2_insn_r->mem_rec_count += 1;
12439 }
12440 address = address + (2 * f_ebytes);
12441 }
12442 }
12443 /* Handle VST3. */
12444 else if ((b_bits & 0x0e) == 0x04)
12445 {
12446 for (index_e = 0; index_e < f_elem; index_e++)
12447 {
12448 for (loop_t = 0; loop_t < 3; loop_t++)
12449 {
12450 record_buf_mem[index_m++] = f_ebytes;
12451 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12452 thumb2_insn_r->mem_rec_count += 1;
12453 }
12454 address = address + (3 * f_ebytes);
12455 }
12456 }
12457 /* Handle VST4. */
12458 else if (!(b_bits & 0x0e))
12459 {
12460 for (index_e = 0; index_e < f_elem; index_e++)
12461 {
12462 for (loop_t = 0; loop_t < 4; loop_t++)
12463 {
12464 record_buf_mem[index_m++] = f_ebytes;
12465 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12466 thumb2_insn_r->mem_rec_count += 1;
12467 }
12468 address = address + (4 * f_ebytes);
12469 }
12470 }
12471 }
12472 else
12473 {
12474 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12475
12476 if (bft_size == 0x00)
12477 f_ebytes = 1;
12478 else if (bft_size == 0x01)
12479 f_ebytes = 2;
12480 else if (bft_size == 0x02)
12481 f_ebytes = 4;
12482 else
12483 f_ebytes = 0;
12484
12485 /* Handle VST1. */
12486 if (!(b_bits & 0x0b) || b_bits == 0x08)
12487 thumb2_insn_r->mem_rec_count = 1;
12488 /* Handle VST2. */
12489 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12490 thumb2_insn_r->mem_rec_count = 2;
12491 /* Handle VST3. */
12492 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12493 thumb2_insn_r->mem_rec_count = 3;
12494 /* Handle VST4. */
12495 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12496 thumb2_insn_r->mem_rec_count = 4;
12497
12498 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12499 {
12500 record_buf_mem[index_m] = f_ebytes;
12501 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12502 }
12503 }
12504 }
12505 else
12506 {
12507 if (!a_bit)
12508 {
12509 /* Handle VLD1. */
12510 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12511 thumb2_insn_r->reg_rec_count = 1;
12512 /* Handle VLD2. */
12513 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12514 thumb2_insn_r->reg_rec_count = 2;
12515 /* Handle VLD3. */
12516 else if ((b_bits & 0x0e) == 0x04)
12517 thumb2_insn_r->reg_rec_count = 3;
12518 /* Handle VLD4. */
12519 else if (!(b_bits & 0x0e))
12520 thumb2_insn_r->reg_rec_count = 4;
12521 }
12522 else
12523 {
12524 /* Handle VLD1. */
12525 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12526 thumb2_insn_r->reg_rec_count = 1;
12527 /* Handle VLD2. */
12528 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12529 thumb2_insn_r->reg_rec_count = 2;
12530 /* Handle VLD3. */
12531 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12532 thumb2_insn_r->reg_rec_count = 3;
12533 /* Handle VLD4. */
12534 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12535 thumb2_insn_r->reg_rec_count = 4;
12536
12537 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12538 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12539 }
12540 }
12541
12542 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12543 {
12544 record_buf[index_r] = reg_rn;
12545 thumb2_insn_r->reg_rec_count += 1;
12546 }
12547
12548 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12549 record_buf);
12550 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12551 record_buf_mem);
12552 return 0;
12553}
12554
c6ec2b30
OJ
12555/* Decodes thumb2 instruction type and invokes its record handler. */
12556
12557static unsigned int
12558thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12559{
12560 uint32_t op, op1, op2;
12561
12562 op = bit (thumb2_insn_r->arm_insn, 15);
12563 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12564 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12565
12566 if (op1 == 0x01)
12567 {
12568 if (!(op2 & 0x64 ))
12569 {
12570 /* Load/store multiple instruction. */
12571 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12572 }
12573 else if (!((op2 & 0x64) ^ 0x04))
12574 {
12575 /* Load/store (dual/exclusive) and table branch instruction. */
12576 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12577 }
12578 else if (!((op2 & 0x20) ^ 0x20))
12579 {
12580 /* Data-processing (shifted register). */
12581 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12582 }
12583 else if (op2 & 0x40)
12584 {
12585 /* Co-processor instructions. */
60cc5e93 12586 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12587 }
12588 }
12589 else if (op1 == 0x02)
12590 {
12591 if (op)
12592 {
12593 /* Branches and miscellaneous control instructions. */
12594 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12595 }
12596 else if (op2 & 0x20)
12597 {
12598 /* Data-processing (plain binary immediate) instruction. */
12599 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12600 }
12601 else
12602 {
12603 /* Data-processing (modified immediate). */
12604 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12605 }
12606 }
12607 else if (op1 == 0x03)
12608 {
12609 if (!(op2 & 0x71 ))
12610 {
12611 /* Store single data item. */
12612 return thumb2_record_str_single_data (thumb2_insn_r);
12613 }
12614 else if (!((op2 & 0x71) ^ 0x10))
12615 {
12616 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12617 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12618 }
12619 else if (!((op2 & 0x67) ^ 0x01))
12620 {
12621 /* Load byte, memory hints instruction. */
12622 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12623 }
12624 else if (!((op2 & 0x67) ^ 0x03))
12625 {
12626 /* Load halfword, memory hints instruction. */
12627 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12628 }
12629 else if (!((op2 & 0x67) ^ 0x05))
12630 {
12631 /* Load word instruction. */
12632 return thumb2_record_ld_word (thumb2_insn_r);
12633 }
12634 else if (!((op2 & 0x70) ^ 0x20))
12635 {
12636 /* Data-processing (register) instruction. */
12637 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12638 }
12639 else if (!((op2 & 0x78) ^ 0x30))
12640 {
12641 /* Multiply, multiply accumulate, abs diff instruction. */
12642 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12643 }
12644 else if (!((op2 & 0x78) ^ 0x38))
12645 {
12646 /* Long multiply, long multiply accumulate, and divide. */
12647 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12648 }
12649 else if (op2 & 0x40)
12650 {
12651 /* Co-processor instructions. */
60cc5e93 12652 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12653 }
12654 }
12655
12656 return -1;
12657}
72508ac0
PO
12658
12659/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12660and positive val on fauilure. */
12661
12662static int
12663extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
12664{
12665 gdb_byte buf[insn_size];
12666
12667 memset (&buf[0], 0, insn_size);
12668
12669 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
12670 return 1;
12671 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12672 insn_size,
2959fed9 12673 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
12674 return 0;
12675}
12676
12677typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12678
12679/* Decode arm/thumb insn depending on condition cods and opcodes; and
12680 dispatch it. */
12681
12682static int
12683decode_insn (insn_decode_record *arm_record, record_type_t record_type,
12684 uint32_t insn_size)
12685{
12686
12687 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
0fa9c223 12688 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
12689 {
12690 arm_record_data_proc_misc_ld_str, /* 000. */
12691 arm_record_data_proc_imm, /* 001. */
12692 arm_record_ld_st_imm_offset, /* 010. */
12693 arm_record_ld_st_reg_offset, /* 011. */
12694 arm_record_ld_st_multiple, /* 100. */
12695 arm_record_b_bl, /* 101. */
60cc5e93 12696 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
12697 arm_record_coproc_data_proc /* 111. */
12698 };
12699
12700 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
0fa9c223 12701 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
12702 { \
12703 thumb_record_shift_add_sub, /* 000. */
12704 thumb_record_add_sub_cmp_mov, /* 001. */
12705 thumb_record_ld_st_reg_offset, /* 010. */
12706 thumb_record_ld_st_imm_offset, /* 011. */
12707 thumb_record_ld_st_stack, /* 100. */
12708 thumb_record_misc, /* 101. */
12709 thumb_record_ldm_stm_swi, /* 110. */
12710 thumb_record_branch /* 111. */
12711 };
12712
12713 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12714 uint32_t insn_id = 0;
12715
12716 if (extract_arm_insn (arm_record, insn_size))
12717 {
12718 if (record_debug)
12719 {
12720 printf_unfiltered (_("Process record: error reading memory at "
12721 "addr %s len = %d.\n"),
12722 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
12723 }
12724 return -1;
12725 }
12726 else if (ARM_RECORD == record_type)
12727 {
12728 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
12729 insn_id = bits (arm_record->arm_insn, 25, 27);
12730 ret = arm_record_extension_space (arm_record);
12731 /* If this insn has fallen into extension space
12732 then we need not decode it anymore. */
12733 if (ret != -1 && !INSN_RECORDED(arm_record))
12734 {
12735 ret = arm_handle_insn[insn_id] (arm_record);
12736 }
12737 }
12738 else if (THUMB_RECORD == record_type)
12739 {
12740 /* As thumb does not have condition codes, we set negative. */
12741 arm_record->cond = -1;
12742 insn_id = bits (arm_record->arm_insn, 13, 15);
12743 ret = thumb_handle_insn[insn_id] (arm_record);
12744 }
12745 else if (THUMB2_RECORD == record_type)
12746 {
c6ec2b30
OJ
12747 /* As thumb does not have condition codes, we set negative. */
12748 arm_record->cond = -1;
12749
12750 /* Swap first half of 32bit thumb instruction with second half. */
12751 arm_record->arm_insn
12752 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
12753
12754 insn_id = thumb2_record_decode_insn_handler (arm_record);
12755
12756 if (insn_id != ARM_RECORD_SUCCESS)
12757 {
12758 arm_record_unsupported_insn (arm_record);
12759 ret = -1;
12760 }
72508ac0
PO
12761 }
12762 else
12763 {
12764 /* Throw assertion. */
12765 gdb_assert_not_reached ("not a valid instruction, could not decode");
12766 }
12767
12768 return ret;
12769}
12770
12771
12772/* Cleans up local record registers and memory allocations. */
12773
12774static void
12775deallocate_reg_mem (insn_decode_record *record)
12776{
12777 xfree (record->arm_regs);
12778 xfree (record->arm_mems);
12779}
12780
12781
12782/* Parse the current instruction and record the values of the registers and
12783 memory that will be changed in current instruction to record_arch_list".
12784 Return -1 if something is wrong. */
12785
12786int
12787arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
12788 CORE_ADDR insn_addr)
12789{
12790
12791 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
12792 uint32_t no_of_rec = 0;
12793 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
12794 ULONGEST t_bit = 0, insn_id = 0;
12795
12796 ULONGEST u_regval = 0;
12797
12798 insn_decode_record arm_record;
12799
12800 memset (&arm_record, 0, sizeof (insn_decode_record));
12801 arm_record.regcache = regcache;
12802 arm_record.this_addr = insn_addr;
12803 arm_record.gdbarch = gdbarch;
12804
12805
12806 if (record_debug > 1)
12807 {
12808 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
12809 "addr = %s\n",
12810 paddress (gdbarch, arm_record.this_addr));
12811 }
12812
12813 if (extract_arm_insn (&arm_record, 2))
12814 {
12815 if (record_debug)
12816 {
12817 printf_unfiltered (_("Process record: error reading memory at "
12818 "addr %s len = %d.\n"),
12819 paddress (arm_record.gdbarch,
12820 arm_record.this_addr), 2);
12821 }
12822 return -1;
12823 }
12824
12825 /* Check the insn, whether it is thumb or arm one. */
12826
12827 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
12828 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
12829
12830
12831 if (!(u_regval & t_bit))
12832 {
12833 /* We are decoding arm insn. */
12834 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
12835 }
12836 else
12837 {
12838 insn_id = bits (arm_record.arm_insn, 11, 15);
12839 /* is it thumb2 insn? */
12840 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
12841 {
12842 ret = decode_insn (&arm_record, THUMB2_RECORD,
12843 THUMB2_INSN_SIZE_BYTES);
12844 }
12845 else
12846 {
12847 /* We are decoding thumb insn. */
12848 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
12849 }
12850 }
12851
12852 if (0 == ret)
12853 {
12854 /* Record registers. */
25ea693b 12855 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0
PO
12856 if (arm_record.arm_regs)
12857 {
12858 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
12859 {
25ea693b
MM
12860 if (record_full_arch_list_add_reg
12861 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
72508ac0
PO
12862 ret = -1;
12863 }
12864 }
12865 /* Record memories. */
12866 if (arm_record.arm_mems)
12867 {
12868 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
12869 {
25ea693b 12870 if (record_full_arch_list_add_mem
72508ac0 12871 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 12872 arm_record.arm_mems[no_of_rec].len))
72508ac0
PO
12873 ret = -1;
12874 }
12875 }
12876
25ea693b 12877 if (record_full_arch_list_add_end ())
72508ac0
PO
12878 ret = -1;
12879 }
12880
12881
12882 deallocate_reg_mem (&arm_record);
12883
12884 return ret;
12885}
12886
This page took 1.830865 seconds and 4 git commands to generate.