]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/arm-tdep.c
gdb.trace: Deduplicate write_inferior_data_ptr.
[thirdparty/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{
a89fea3c 1277 CORE_ADDR func_addr, limit_pc;
c906108c 1278
a89fea3c
JL
1279 /* See if we can determine the end of the prologue via the symbol table.
1280 If so, then return either PC, or the PC after the prologue, whichever
1281 is greater. */
1282 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1283 {
d80b854b
UW
1284 CORE_ADDR post_prologue_pc
1285 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1286 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1287
621c6d5b
YQ
1288 if (post_prologue_pc)
1289 post_prologue_pc
1290 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1291
1292
0d39a070
DJ
1293 /* GCC always emits a line note before the prologue and another
1294 one after, even if the two are at the same address or on the
1295 same line. Take advantage of this so that we do not need to
1296 know every instruction that might appear in the prologue. We
1297 will have producer information for most binaries; if it is
1298 missing (e.g. for -gstabs), assuming the GNU tools. */
1299 if (post_prologue_pc
43f3e411
DE
1300 && (cust == NULL
1301 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1302 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1303 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1304 return post_prologue_pc;
1305
a89fea3c 1306 if (post_prologue_pc != 0)
0d39a070
DJ
1307 {
1308 CORE_ADDR analyzed_limit;
1309
1310 /* For non-GCC compilers, make sure the entire line is an
1311 acceptable prologue; GDB will round this function's
1312 return value up to the end of the following line so we
1313 can not skip just part of a line (and we do not want to).
1314
1315 RealView does not treat the prologue specially, but does
1316 associate prologue code with the opening brace; so this
1317 lets us skip the first line if we think it is the opening
1318 brace. */
9779414d 1319 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1320 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1321 post_prologue_pc, NULL);
1322 else
1323 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1324 post_prologue_pc, NULL);
1325
1326 if (analyzed_limit != post_prologue_pc)
1327 return func_addr;
1328
1329 return post_prologue_pc;
1330 }
c906108c
SS
1331 }
1332
a89fea3c
JL
1333 /* Can't determine prologue from the symbol table, need to examine
1334 instructions. */
c906108c 1335
a89fea3c
JL
1336 /* Find an upper limit on the function prologue using the debug
1337 information. If the debug information could not be used to provide
1338 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1339 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1340 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1341 if (limit_pc == 0)
1342 limit_pc = pc + 64; /* Magic. */
1343
c906108c 1344
29d73ae4 1345 /* Check if this is Thumb code. */
9779414d 1346 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1347 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1348 else
1349 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1350}
94c30b78 1351
c5aa993b 1352/* *INDENT-OFF* */
c906108c
SS
1353/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1354 This function decodes a Thumb function prologue to determine:
1355 1) the size of the stack frame
1356 2) which registers are saved on it
1357 3) the offsets of saved regs
1358 4) the offset from the stack pointer to the frame pointer
c906108c 1359
da59e081
JM
1360 A typical Thumb function prologue would create this stack frame
1361 (offsets relative to FP)
c906108c
SS
1362 old SP -> 24 stack parameters
1363 20 LR
1364 16 R7
1365 R7 -> 0 local variables (16 bytes)
1366 SP -> -12 additional stack space (12 bytes)
1367 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1368 12 bytes. The frame register is R7.
da59e081 1369
da3c6d4a
MS
1370 The comments for thumb_skip_prolog() describe the algorithm we use
1371 to detect the end of the prolog. */
c5aa993b
JM
1372/* *INDENT-ON* */
1373
c906108c 1374static void
be8626e0 1375thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1376 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1377{
1378 CORE_ADDR prologue_start;
1379 CORE_ADDR prologue_end;
c906108c 1380
b39cc962
DJ
1381 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1382 &prologue_end))
c906108c 1383 {
ec3d575a
UW
1384 /* See comment in arm_scan_prologue for an explanation of
1385 this heuristics. */
1386 if (prologue_end > prologue_start + 64)
1387 {
1388 prologue_end = prologue_start + 64;
1389 }
c906108c
SS
1390 }
1391 else
f7060f85
DJ
1392 /* We're in the boondocks: we have no idea where the start of the
1393 function is. */
1394 return;
c906108c 1395
eb5492fa 1396 prologue_end = min (prologue_end, prev_pc);
c906108c 1397
be8626e0 1398 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1399}
1400
f303bc3e
YQ
1401/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1402 otherwise. */
1403
1404static int
1405arm_instruction_restores_sp (unsigned int insn)
1406{
1407 if (bits (insn, 28, 31) != INST_NV)
1408 {
1409 if ((insn & 0x0df0f000) == 0x0080d000
1410 /* ADD SP (register or immediate). */
1411 || (insn & 0x0df0f000) == 0x0040d000
1412 /* SUB SP (register or immediate). */
1413 || (insn & 0x0ffffff0) == 0x01a0d000
1414 /* MOV SP. */
1415 || (insn & 0x0fff0000) == 0x08bd0000
1416 /* POP (LDMIA). */
1417 || (insn & 0x0fff0000) == 0x049d0000)
1418 /* POP of a single register. */
1419 return 1;
1420 }
1421
1422 return 0;
1423}
1424
0d39a070
DJ
1425/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1426 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1427 fill it in. Return the first address not recognized as a prologue
1428 instruction.
eb5492fa 1429
0d39a070
DJ
1430 We recognize all the instructions typically found in ARM prologues,
1431 plus harmless instructions which can be skipped (either for analysis
1432 purposes, or a more restrictive set that can be skipped when finding
1433 the end of the prologue). */
1434
1435static CORE_ADDR
1436arm_analyze_prologue (struct gdbarch *gdbarch,
1437 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1438 struct arm_prologue_cache *cache)
1439{
0d39a070
DJ
1440 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1441 int regno;
1442 CORE_ADDR offset, current_pc;
1443 pv_t regs[ARM_FPS_REGNUM];
1444 struct pv_area *stack;
1445 struct cleanup *back_to;
0d39a070
DJ
1446 CORE_ADDR unrecognized_pc = 0;
1447
1448 /* Search the prologue looking for instructions that set up the
96baa820 1449 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1450
96baa820
JM
1451 Be careful, however, and if it doesn't look like a prologue,
1452 don't try to scan it. If, for instance, a frameless function
1453 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1454 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1455 and other operations that rely on a knowledge of the stack
0d39a070 1456 traceback. */
d4473757 1457
4be43953
DJ
1458 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1459 regs[regno] = pv_register (regno, 0);
55f960e1 1460 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953
DJ
1461 back_to = make_cleanup_free_pv_area (stack);
1462
94c30b78
MS
1463 for (current_pc = prologue_start;
1464 current_pc < prologue_end;
f43845b3 1465 current_pc += 4)
96baa820 1466 {
e17a4113
UW
1467 unsigned int insn
1468 = read_memory_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1469
94c30b78 1470 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1471 {
4be43953 1472 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1473 continue;
1474 }
0d39a070
DJ
1475 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1476 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1477 {
1478 unsigned imm = insn & 0xff; /* immediate value */
1479 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1480 int rd = bits (insn, 12, 15);
28cd8767 1481 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1482 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1483 continue;
1484 }
0d39a070
DJ
1485 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1486 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1487 {
1488 unsigned imm = insn & 0xff; /* immediate value */
1489 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1490 int rd = bits (insn, 12, 15);
28cd8767 1491 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1492 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1493 continue;
1494 }
0963b4bd
MS
1495 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1496 [sp, #-4]! */
f43845b3 1497 {
4be43953
DJ
1498 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1499 break;
1500 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
0d39a070
DJ
1501 pv_area_store (stack, regs[ARM_SP_REGNUM], 4,
1502 regs[bits (insn, 12, 15)]);
f43845b3
MS
1503 continue;
1504 }
1505 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1506 /* stmfd sp!, {..., fp, ip, lr, pc}
1507 or
1508 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1509 {
d4473757 1510 int mask = insn & 0xffff;
ed9a39eb 1511
4be43953
DJ
1512 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1513 break;
1514
94c30b78 1515 /* Calculate offsets of saved registers. */
34e8f22d 1516 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1517 if (mask & (1 << regno))
1518 {
0963b4bd
MS
1519 regs[ARM_SP_REGNUM]
1520 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
4be43953 1521 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1522 }
1523 }
0d39a070
DJ
1524 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1525 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1526 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1527 {
1528 /* No need to add this to saved_regs -- it's just an arg reg. */
1529 continue;
1530 }
0d39a070
DJ
1531 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1532 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1533 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1534 {
1535 /* No need to add this to saved_regs -- it's just an arg reg. */
1536 continue;
1537 }
0963b4bd
MS
1538 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1539 { registers } */
0d39a070
DJ
1540 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1541 {
1542 /* No need to add this to saved_regs -- it's just arg regs. */
1543 continue;
1544 }
d4473757
KB
1545 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1546 {
94c30b78
MS
1547 unsigned imm = insn & 0xff; /* immediate value */
1548 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1549 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1550 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1551 }
1552 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1553 {
94c30b78
MS
1554 unsigned imm = insn & 0xff; /* immediate value */
1555 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1556 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1557 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1558 }
0963b4bd
MS
1559 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1560 [sp, -#c]! */
2af46ca0 1561 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1562 {
4be43953
DJ
1563 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1564 break;
1565
1566 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1567 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
4be43953 1568 pv_area_store (stack, regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1569 }
0963b4bd
MS
1570 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1571 [sp!] */
2af46ca0 1572 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1573 {
1574 int n_saved_fp_regs;
1575 unsigned int fp_start_reg, fp_bound_reg;
1576
4be43953
DJ
1577 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1578 break;
1579
94c30b78 1580 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1581 {
d4473757
KB
1582 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1583 n_saved_fp_regs = 3;
1584 else
1585 n_saved_fp_regs = 1;
96baa820 1586 }
d4473757 1587 else
96baa820 1588 {
d4473757
KB
1589 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1590 n_saved_fp_regs = 2;
1591 else
1592 n_saved_fp_regs = 4;
96baa820 1593 }
d4473757 1594
34e8f22d 1595 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1596 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1597 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1598 {
4be43953
DJ
1599 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1600 pv_area_store (stack, regs[ARM_SP_REGNUM], 12,
1601 regs[fp_start_reg++]);
96baa820 1602 }
c906108c 1603 }
0d39a070
DJ
1604 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1605 {
1606 /* Allow some special function calls when skipping the
1607 prologue; GCC generates these before storing arguments to
1608 the stack. */
1609 CORE_ADDR dest = BranchDest (current_pc, insn);
1610
e0634ccf 1611 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1612 continue;
1613 else
1614 break;
1615 }
d4473757 1616 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1617 break; /* Condition not true, exit early. */
0d39a070
DJ
1618 else if (arm_instruction_changes_pc (insn))
1619 /* Don't scan past anything that might change control flow. */
1620 break;
f303bc3e
YQ
1621 else if (arm_instruction_restores_sp (insn))
1622 {
1623 /* Don't scan past the epilogue. */
1624 break;
1625 }
d19f7eee
UW
1626 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1627 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1628 /* Ignore block loads from the stack, potentially copying
1629 parameters from memory. */
1630 continue;
1631 else if ((insn & 0xfc500000) == 0xe4100000
1632 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1633 /* Similarly ignore single loads from the stack. */
1634 continue;
0d39a070
DJ
1635 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1636 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1637 register instead of the stack. */
d4473757 1638 continue;
0d39a070
DJ
1639 else
1640 {
21daaaaf
YQ
1641 /* The optimizer might shove anything into the prologue, if
1642 we build up cache (cache != NULL) from scanning prologue,
1643 we just skip what we don't recognize and scan further to
1644 make cache as complete as possible. However, if we skip
1645 prologue, we'll stop immediately on unrecognized
1646 instruction. */
0d39a070 1647 unrecognized_pc = current_pc;
21daaaaf
YQ
1648 if (cache != NULL)
1649 continue;
1650 else
1651 break;
0d39a070 1652 }
c906108c
SS
1653 }
1654
0d39a070
DJ
1655 if (unrecognized_pc == 0)
1656 unrecognized_pc = current_pc;
1657
0d39a070
DJ
1658 if (cache)
1659 {
4072f920
YQ
1660 int framereg, framesize;
1661
1662 /* The frame size is just the distance from the frame register
1663 to the original stack pointer. */
1664 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1665 {
1666 /* Frame pointer is fp. */
1667 framereg = ARM_FP_REGNUM;
1668 framesize = -regs[ARM_FP_REGNUM].k;
1669 }
1670 else
1671 {
1672 /* Try the stack pointer... this is a bit desperate. */
1673 framereg = ARM_SP_REGNUM;
1674 framesize = -regs[ARM_SP_REGNUM].k;
1675 }
1676
0d39a070
DJ
1677 cache->framereg = framereg;
1678 cache->framesize = framesize;
1679
1680 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1681 if (pv_area_find_reg (stack, gdbarch, regno, &offset))
1682 cache->saved_regs[regno].addr = offset;
1683 }
1684
1685 if (arm_debug)
1686 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1687 paddress (gdbarch, unrecognized_pc));
4be43953
DJ
1688
1689 do_cleanups (back_to);
0d39a070
DJ
1690 return unrecognized_pc;
1691}
1692
1693static void
1694arm_scan_prologue (struct frame_info *this_frame,
1695 struct arm_prologue_cache *cache)
1696{
1697 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1698 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
bec2ab5a 1699 CORE_ADDR prologue_start, prologue_end;
0d39a070
DJ
1700 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1701 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
0d39a070
DJ
1702
1703 /* Assume there is no frame until proven otherwise. */
1704 cache->framereg = ARM_SP_REGNUM;
1705 cache->framesize = 0;
1706
1707 /* Check for Thumb prologue. */
1708 if (arm_frame_is_thumb (this_frame))
1709 {
1710 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1711 return;
1712 }
1713
1714 /* Find the function prologue. If we can't find the function in
1715 the symbol table, peek in the stack frame to find the PC. */
1716 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1717 &prologue_end))
1718 {
1719 /* One way to find the end of the prologue (which works well
1720 for unoptimized code) is to do the following:
1721
1722 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1723
1724 if (sal.line == 0)
1725 prologue_end = prev_pc;
1726 else if (sal.end < prologue_end)
1727 prologue_end = sal.end;
1728
1729 This mechanism is very accurate so long as the optimizer
1730 doesn't move any instructions from the function body into the
1731 prologue. If this happens, sal.end will be the last
1732 instruction in the first hunk of prologue code just before
1733 the first instruction that the scheduler has moved from
1734 the body to the prologue.
1735
1736 In order to make sure that we scan all of the prologue
1737 instructions, we use a slightly less accurate mechanism which
1738 may scan more than necessary. To help compensate for this
1739 lack of accuracy, the prologue scanning loop below contains
1740 several clauses which'll cause the loop to terminate early if
1741 an implausible prologue instruction is encountered.
1742
1743 The expression
1744
1745 prologue_start + 64
1746
1747 is a suitable endpoint since it accounts for the largest
1748 possible prologue plus up to five instructions inserted by
1749 the scheduler. */
1750
1751 if (prologue_end > prologue_start + 64)
1752 {
1753 prologue_end = prologue_start + 64; /* See above. */
1754 }
1755 }
1756 else
1757 {
1758 /* We have no symbol information. Our only option is to assume this
1759 function has a standard stack frame and the normal frame register.
1760 Then, we can find the value of our frame pointer on entrance to
1761 the callee (or at the present moment if this is the innermost frame).
1762 The value stored there should be the address of the stmfd + 8. */
1763 CORE_ADDR frame_loc;
1764 LONGEST return_value;
1765
1766 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1767 if (!safe_read_memory_integer (frame_loc, 4, byte_order, &return_value))
1768 return;
1769 else
1770 {
1771 prologue_start = gdbarch_addr_bits_remove
1772 (gdbarch, return_value) - 8;
1773 prologue_end = prologue_start + 64; /* See above. */
1774 }
1775 }
1776
1777 if (prev_pc < prologue_end)
1778 prologue_end = prev_pc;
1779
1780 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1781}
1782
eb5492fa 1783static struct arm_prologue_cache *
a262aec2 1784arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1785{
eb5492fa
DJ
1786 int reg;
1787 struct arm_prologue_cache *cache;
1788 CORE_ADDR unwound_fp;
c5aa993b 1789
35d5d4ee 1790 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1791 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1792
a262aec2 1793 arm_scan_prologue (this_frame, cache);
848cfffb 1794
a262aec2 1795 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
1796 if (unwound_fp == 0)
1797 return cache;
c906108c 1798
4be43953 1799 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 1800
eb5492fa
DJ
1801 /* Calculate actual addresses of saved registers using offsets
1802 determined by arm_scan_prologue. */
a262aec2 1803 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 1804 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
1805 cache->saved_regs[reg].addr += cache->prev_sp;
1806
1807 return cache;
c906108c
SS
1808}
1809
c1ee9414
LM
1810/* Implementation of the stop_reason hook for arm_prologue frames. */
1811
1812static enum unwind_stop_reason
1813arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1814 void **this_cache)
1815{
1816 struct arm_prologue_cache *cache;
1817 CORE_ADDR pc;
1818
1819 if (*this_cache == NULL)
1820 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1821 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
1822
1823 /* This is meant to halt the backtrace at "_start". */
1824 pc = get_frame_pc (this_frame);
1825 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1826 return UNWIND_OUTERMOST;
1827
1828 /* If we've hit a wall, stop. */
1829 if (cache->prev_sp == 0)
1830 return UNWIND_OUTERMOST;
1831
1832 return UNWIND_NO_REASON;
1833}
1834
eb5492fa
DJ
1835/* Our frame ID for a normal frame is the current function's starting PC
1836 and the caller's SP when we were called. */
c906108c 1837
148754e5 1838static void
a262aec2 1839arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
1840 void **this_cache,
1841 struct frame_id *this_id)
c906108c 1842{
eb5492fa
DJ
1843 struct arm_prologue_cache *cache;
1844 struct frame_id id;
2c404490 1845 CORE_ADDR pc, func;
f079148d 1846
eb5492fa 1847 if (*this_cache == NULL)
a262aec2 1848 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1849 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 1850
0e9e9abd
UW
1851 /* Use function start address as part of the frame ID. If we cannot
1852 identify the start address (due to missing symbol information),
1853 fall back to just using the current PC. */
c1ee9414 1854 pc = get_frame_pc (this_frame);
2c404490 1855 func = get_frame_func (this_frame);
0e9e9abd
UW
1856 if (!func)
1857 func = pc;
1858
eb5492fa 1859 id = frame_id_build (cache->prev_sp, func);
eb5492fa 1860 *this_id = id;
c906108c
SS
1861}
1862
a262aec2
DJ
1863static struct value *
1864arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 1865 void **this_cache,
a262aec2 1866 int prev_regnum)
24de872b 1867{
24568a2c 1868 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
1869 struct arm_prologue_cache *cache;
1870
eb5492fa 1871 if (*this_cache == NULL)
a262aec2 1872 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1873 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 1874
eb5492fa 1875 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
1876 instead. The prologue may save PC, but it will point into this
1877 frame's prologue, not the next frame's resume location. Also
1878 strip the saved T bit. A valid LR may have the low bit set, but
1879 a valid PC never does. */
eb5492fa 1880 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
1881 {
1882 CORE_ADDR lr;
1883
1884 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1885 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 1886 arm_addr_bits_remove (gdbarch, lr));
b39cc962 1887 }
24de872b 1888
eb5492fa 1889 /* SP is generally not saved to the stack, but this frame is
a262aec2 1890 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
1891 The value was already reconstructed into PREV_SP. */
1892 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 1893 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 1894
b39cc962
DJ
1895 /* The CPSR may have been changed by the call instruction and by the
1896 called function. The only bit we can reconstruct is the T bit,
1897 by checking the low bit of LR as of the call. This is a reliable
1898 indicator of Thumb-ness except for some ARM v4T pre-interworking
1899 Thumb code, which could get away with a clear low bit as long as
1900 the called function did not use bx. Guess that all other
1901 bits are unchanged; the condition flags are presumably lost,
1902 but the processor status is likely valid. */
1903 if (prev_regnum == ARM_PS_REGNUM)
1904 {
1905 CORE_ADDR lr, cpsr;
9779414d 1906 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
1907
1908 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1909 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1910 if (IS_THUMB_ADDR (lr))
9779414d 1911 cpsr |= t_bit;
b39cc962 1912 else
9779414d 1913 cpsr &= ~t_bit;
b39cc962
DJ
1914 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1915 }
1916
a262aec2
DJ
1917 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1918 prev_regnum);
eb5492fa
DJ
1919}
1920
1921struct frame_unwind arm_prologue_unwind = {
1922 NORMAL_FRAME,
c1ee9414 1923 arm_prologue_unwind_stop_reason,
eb5492fa 1924 arm_prologue_this_id,
a262aec2
DJ
1925 arm_prologue_prev_register,
1926 NULL,
1927 default_frame_sniffer
eb5492fa
DJ
1928};
1929
0e9e9abd
UW
1930/* Maintain a list of ARM exception table entries per objfile, similar to the
1931 list of mapping symbols. We only cache entries for standard ARM-defined
1932 personality routines; the cache will contain only the frame unwinding
1933 instructions associated with the entry (not the descriptors). */
1934
1935static const struct objfile_data *arm_exidx_data_key;
1936
1937struct arm_exidx_entry
1938{
1939 bfd_vma addr;
1940 gdb_byte *entry;
1941};
1942typedef struct arm_exidx_entry arm_exidx_entry_s;
1943DEF_VEC_O(arm_exidx_entry_s);
1944
1945struct arm_exidx_data
1946{
1947 VEC(arm_exidx_entry_s) **section_maps;
1948};
1949
1950static void
1951arm_exidx_data_free (struct objfile *objfile, void *arg)
1952{
9a3c8263 1953 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
0e9e9abd
UW
1954 unsigned int i;
1955
1956 for (i = 0; i < objfile->obfd->section_count; i++)
1957 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
1958}
1959
1960static inline int
1961arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
1962 const struct arm_exidx_entry *rhs)
1963{
1964 return lhs->addr < rhs->addr;
1965}
1966
1967static struct obj_section *
1968arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
1969{
1970 struct obj_section *osect;
1971
1972 ALL_OBJFILE_OSECTIONS (objfile, osect)
1973 if (bfd_get_section_flags (objfile->obfd,
1974 osect->the_bfd_section) & SEC_ALLOC)
1975 {
1976 bfd_vma start, size;
1977 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
1978 size = bfd_get_section_size (osect->the_bfd_section);
1979
1980 if (start <= vma && vma < start + size)
1981 return osect;
1982 }
1983
1984 return NULL;
1985}
1986
1987/* Parse contents of exception table and exception index sections
1988 of OBJFILE, and fill in the exception table entry cache.
1989
1990 For each entry that refers to a standard ARM-defined personality
1991 routine, extract the frame unwinding instructions (from either
1992 the index or the table section). The unwinding instructions
1993 are normalized by:
1994 - extracting them from the rest of the table data
1995 - converting to host endianness
1996 - appending the implicit 0xb0 ("Finish") code
1997
1998 The extracted and normalized instructions are stored for later
1999 retrieval by the arm_find_exidx_entry routine. */
2000
2001static void
2002arm_exidx_new_objfile (struct objfile *objfile)
2003{
3bb47e8b 2004 struct cleanup *cleanups;
0e9e9abd
UW
2005 struct arm_exidx_data *data;
2006 asection *exidx, *extab;
2007 bfd_vma exidx_vma = 0, extab_vma = 0;
2008 bfd_size_type exidx_size = 0, extab_size = 0;
2009 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2010 LONGEST i;
2011
2012 /* If we've already touched this file, do nothing. */
2013 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2014 return;
3bb47e8b 2015 cleanups = make_cleanup (null_cleanup, NULL);
0e9e9abd
UW
2016
2017 /* Read contents of exception table and index. */
a5eda10c 2018 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
0e9e9abd
UW
2019 if (exidx)
2020 {
2021 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2022 exidx_size = bfd_get_section_size (exidx);
224c3ddb 2023 exidx_data = (gdb_byte *) xmalloc (exidx_size);
0e9e9abd
UW
2024 make_cleanup (xfree, exidx_data);
2025
2026 if (!bfd_get_section_contents (objfile->obfd, exidx,
2027 exidx_data, 0, exidx_size))
2028 {
2029 do_cleanups (cleanups);
2030 return;
2031 }
2032 }
2033
2034 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2035 if (extab)
2036 {
2037 extab_vma = bfd_section_vma (objfile->obfd, extab);
2038 extab_size = bfd_get_section_size (extab);
224c3ddb 2039 extab_data = (gdb_byte *) xmalloc (extab_size);
0e9e9abd
UW
2040 make_cleanup (xfree, extab_data);
2041
2042 if (!bfd_get_section_contents (objfile->obfd, extab,
2043 extab_data, 0, extab_size))
2044 {
2045 do_cleanups (cleanups);
2046 return;
2047 }
2048 }
2049
2050 /* Allocate exception table data structure. */
2051 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2052 set_objfile_data (objfile, arm_exidx_data_key, data);
2053 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2054 objfile->obfd->section_count,
2055 VEC(arm_exidx_entry_s) *);
2056
2057 /* Fill in exception table. */
2058 for (i = 0; i < exidx_size / 8; i++)
2059 {
2060 struct arm_exidx_entry new_exidx_entry;
2061 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2062 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2063 bfd_vma addr = 0, word = 0;
2064 int n_bytes = 0, n_words = 0;
2065 struct obj_section *sec;
2066 gdb_byte *entry = NULL;
2067
2068 /* Extract address of start of function. */
2069 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2070 idx += exidx_vma + i * 8;
2071
2072 /* Find section containing function and compute section offset. */
2073 sec = arm_obj_section_from_vma (objfile, idx);
2074 if (sec == NULL)
2075 continue;
2076 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2077
2078 /* Determine address of exception table entry. */
2079 if (val == 1)
2080 {
2081 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2082 }
2083 else if ((val & 0xff000000) == 0x80000000)
2084 {
2085 /* Exception table entry embedded in .ARM.exidx
2086 -- must be short form. */
2087 word = val;
2088 n_bytes = 3;
2089 }
2090 else if (!(val & 0x80000000))
2091 {
2092 /* Exception table entry in .ARM.extab. */
2093 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2094 addr += exidx_vma + i * 8 + 4;
2095
2096 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2097 {
2098 word = bfd_h_get_32 (objfile->obfd,
2099 extab_data + addr - extab_vma);
2100 addr += 4;
2101
2102 if ((word & 0xff000000) == 0x80000000)
2103 {
2104 /* Short form. */
2105 n_bytes = 3;
2106 }
2107 else if ((word & 0xff000000) == 0x81000000
2108 || (word & 0xff000000) == 0x82000000)
2109 {
2110 /* Long form. */
2111 n_bytes = 2;
2112 n_words = ((word >> 16) & 0xff);
2113 }
2114 else if (!(word & 0x80000000))
2115 {
2116 bfd_vma pers;
2117 struct obj_section *pers_sec;
2118 int gnu_personality = 0;
2119
2120 /* Custom personality routine. */
2121 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2122 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2123
2124 /* Check whether we've got one of the variants of the
2125 GNU personality routines. */
2126 pers_sec = arm_obj_section_from_vma (objfile, pers);
2127 if (pers_sec)
2128 {
2129 static const char *personality[] =
2130 {
2131 "__gcc_personality_v0",
2132 "__gxx_personality_v0",
2133 "__gcj_personality_v0",
2134 "__gnu_objc_personality_v0",
2135 NULL
2136 };
2137
2138 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2139 int k;
2140
2141 for (k = 0; personality[k]; k++)
2142 if (lookup_minimal_symbol_by_pc_name
2143 (pc, personality[k], objfile))
2144 {
2145 gnu_personality = 1;
2146 break;
2147 }
2148 }
2149
2150 /* If so, the next word contains a word count in the high
2151 byte, followed by the same unwind instructions as the
2152 pre-defined forms. */
2153 if (gnu_personality
2154 && addr + 4 <= extab_vma + extab_size)
2155 {
2156 word = bfd_h_get_32 (objfile->obfd,
2157 extab_data + addr - extab_vma);
2158 addr += 4;
2159 n_bytes = 3;
2160 n_words = ((word >> 24) & 0xff);
2161 }
2162 }
2163 }
2164 }
2165
2166 /* Sanity check address. */
2167 if (n_words)
2168 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2169 n_words = n_bytes = 0;
2170
2171 /* The unwind instructions reside in WORD (only the N_BYTES least
2172 significant bytes are valid), followed by N_WORDS words in the
2173 extab section starting at ADDR. */
2174 if (n_bytes || n_words)
2175 {
224c3ddb
SM
2176 gdb_byte *p = entry
2177 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2178 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2179
2180 while (n_bytes--)
2181 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2182
2183 while (n_words--)
2184 {
2185 word = bfd_h_get_32 (objfile->obfd,
2186 extab_data + addr - extab_vma);
2187 addr += 4;
2188
2189 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2190 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2191 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2192 *p++ = (gdb_byte) (word & 0xff);
2193 }
2194
2195 /* Implied "Finish" to terminate the list. */
2196 *p++ = 0xb0;
2197 }
2198
2199 /* Push entry onto vector. They are guaranteed to always
2200 appear in order of increasing addresses. */
2201 new_exidx_entry.addr = idx;
2202 new_exidx_entry.entry = entry;
2203 VEC_safe_push (arm_exidx_entry_s,
2204 data->section_maps[sec->the_bfd_section->index],
2205 &new_exidx_entry);
2206 }
2207
2208 do_cleanups (cleanups);
2209}
2210
2211/* Search for the exception table entry covering MEMADDR. If one is found,
2212 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2213 set *START to the start of the region covered by this entry. */
2214
2215static gdb_byte *
2216arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2217{
2218 struct obj_section *sec;
2219
2220 sec = find_pc_section (memaddr);
2221 if (sec != NULL)
2222 {
2223 struct arm_exidx_data *data;
2224 VEC(arm_exidx_entry_s) *map;
2225 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2226 unsigned int idx;
2227
9a3c8263
SM
2228 data = ((struct arm_exidx_data *)
2229 objfile_data (sec->objfile, arm_exidx_data_key));
0e9e9abd
UW
2230 if (data != NULL)
2231 {
2232 map = data->section_maps[sec->the_bfd_section->index];
2233 if (!VEC_empty (arm_exidx_entry_s, map))
2234 {
2235 struct arm_exidx_entry *map_sym;
2236
2237 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2238 arm_compare_exidx_entries);
2239
2240 /* VEC_lower_bound finds the earliest ordered insertion
2241 point. If the following symbol starts at this exact
2242 address, we use that; otherwise, the preceding
2243 exception table entry covers this address. */
2244 if (idx < VEC_length (arm_exidx_entry_s, map))
2245 {
2246 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2247 if (map_sym->addr == map_key.addr)
2248 {
2249 if (start)
2250 *start = map_sym->addr + obj_section_addr (sec);
2251 return map_sym->entry;
2252 }
2253 }
2254
2255 if (idx > 0)
2256 {
2257 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2258 if (start)
2259 *start = map_sym->addr + obj_section_addr (sec);
2260 return map_sym->entry;
2261 }
2262 }
2263 }
2264 }
2265
2266 return NULL;
2267}
2268
2269/* Given the current frame THIS_FRAME, and its associated frame unwinding
2270 instruction list from the ARM exception table entry ENTRY, allocate and
2271 return a prologue cache structure describing how to unwind this frame.
2272
2273 Return NULL if the unwinding instruction list contains a "spare",
2274 "reserved" or "refuse to unwind" instruction as defined in section
2275 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2276 for the ARM Architecture" document. */
2277
2278static struct arm_prologue_cache *
2279arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2280{
2281 CORE_ADDR vsp = 0;
2282 int vsp_valid = 0;
2283
2284 struct arm_prologue_cache *cache;
2285 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2286 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2287
2288 for (;;)
2289 {
2290 gdb_byte insn;
2291
2292 /* Whenever we reload SP, we actually have to retrieve its
2293 actual value in the current frame. */
2294 if (!vsp_valid)
2295 {
2296 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2297 {
2298 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2299 vsp = get_frame_register_unsigned (this_frame, reg);
2300 }
2301 else
2302 {
2303 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2304 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2305 }
2306
2307 vsp_valid = 1;
2308 }
2309
2310 /* Decode next unwind instruction. */
2311 insn = *entry++;
2312
2313 if ((insn & 0xc0) == 0)
2314 {
2315 int offset = insn & 0x3f;
2316 vsp += (offset << 2) + 4;
2317 }
2318 else if ((insn & 0xc0) == 0x40)
2319 {
2320 int offset = insn & 0x3f;
2321 vsp -= (offset << 2) + 4;
2322 }
2323 else if ((insn & 0xf0) == 0x80)
2324 {
2325 int mask = ((insn & 0xf) << 8) | *entry++;
2326 int i;
2327
2328 /* The special case of an all-zero mask identifies
2329 "Refuse to unwind". We return NULL to fall back
2330 to the prologue analyzer. */
2331 if (mask == 0)
2332 return NULL;
2333
2334 /* Pop registers r4..r15 under mask. */
2335 for (i = 0; i < 12; i++)
2336 if (mask & (1 << i))
2337 {
2338 cache->saved_regs[4 + i].addr = vsp;
2339 vsp += 4;
2340 }
2341
2342 /* Special-case popping SP -- we need to reload vsp. */
2343 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2344 vsp_valid = 0;
2345 }
2346 else if ((insn & 0xf0) == 0x90)
2347 {
2348 int reg = insn & 0xf;
2349
2350 /* Reserved cases. */
2351 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2352 return NULL;
2353
2354 /* Set SP from another register and mark VSP for reload. */
2355 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2356 vsp_valid = 0;
2357 }
2358 else if ((insn & 0xf0) == 0xa0)
2359 {
2360 int count = insn & 0x7;
2361 int pop_lr = (insn & 0x8) != 0;
2362 int i;
2363
2364 /* Pop r4..r[4+count]. */
2365 for (i = 0; i <= count; i++)
2366 {
2367 cache->saved_regs[4 + i].addr = vsp;
2368 vsp += 4;
2369 }
2370
2371 /* If indicated by flag, pop LR as well. */
2372 if (pop_lr)
2373 {
2374 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2375 vsp += 4;
2376 }
2377 }
2378 else if (insn == 0xb0)
2379 {
2380 /* We could only have updated PC by popping into it; if so, it
2381 will show up as address. Otherwise, copy LR into PC. */
2382 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2383 cache->saved_regs[ARM_PC_REGNUM]
2384 = cache->saved_regs[ARM_LR_REGNUM];
2385
2386 /* We're done. */
2387 break;
2388 }
2389 else if (insn == 0xb1)
2390 {
2391 int mask = *entry++;
2392 int i;
2393
2394 /* All-zero mask and mask >= 16 is "spare". */
2395 if (mask == 0 || mask >= 16)
2396 return NULL;
2397
2398 /* Pop r0..r3 under mask. */
2399 for (i = 0; i < 4; i++)
2400 if (mask & (1 << i))
2401 {
2402 cache->saved_regs[i].addr = vsp;
2403 vsp += 4;
2404 }
2405 }
2406 else if (insn == 0xb2)
2407 {
2408 ULONGEST offset = 0;
2409 unsigned shift = 0;
2410
2411 do
2412 {
2413 offset |= (*entry & 0x7f) << shift;
2414 shift += 7;
2415 }
2416 while (*entry++ & 0x80);
2417
2418 vsp += 0x204 + (offset << 2);
2419 }
2420 else if (insn == 0xb3)
2421 {
2422 int start = *entry >> 4;
2423 int count = (*entry++) & 0xf;
2424 int i;
2425
2426 /* Only registers D0..D15 are valid here. */
2427 if (start + count >= 16)
2428 return NULL;
2429
2430 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2431 for (i = 0; i <= count; i++)
2432 {
2433 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2434 vsp += 8;
2435 }
2436
2437 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2438 vsp += 4;
2439 }
2440 else if ((insn & 0xf8) == 0xb8)
2441 {
2442 int count = insn & 0x7;
2443 int i;
2444
2445 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2446 for (i = 0; i <= count; i++)
2447 {
2448 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2449 vsp += 8;
2450 }
2451
2452 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2453 vsp += 4;
2454 }
2455 else if (insn == 0xc6)
2456 {
2457 int start = *entry >> 4;
2458 int count = (*entry++) & 0xf;
2459 int i;
2460
2461 /* Only registers WR0..WR15 are valid. */
2462 if (start + count >= 16)
2463 return NULL;
2464
2465 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2466 for (i = 0; i <= count; i++)
2467 {
2468 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2469 vsp += 8;
2470 }
2471 }
2472 else if (insn == 0xc7)
2473 {
2474 int mask = *entry++;
2475 int i;
2476
2477 /* All-zero mask and mask >= 16 is "spare". */
2478 if (mask == 0 || mask >= 16)
2479 return NULL;
2480
2481 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2482 for (i = 0; i < 4; i++)
2483 if (mask & (1 << i))
2484 {
2485 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2486 vsp += 4;
2487 }
2488 }
2489 else if ((insn & 0xf8) == 0xc0)
2490 {
2491 int count = insn & 0x7;
2492 int i;
2493
2494 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2495 for (i = 0; i <= count; i++)
2496 {
2497 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2498 vsp += 8;
2499 }
2500 }
2501 else if (insn == 0xc8)
2502 {
2503 int start = *entry >> 4;
2504 int count = (*entry++) & 0xf;
2505 int i;
2506
2507 /* Only registers D0..D31 are valid. */
2508 if (start + count >= 16)
2509 return NULL;
2510
2511 /* Pop VFP double-precision registers
2512 D[16+start]..D[16+start+count]. */
2513 for (i = 0; i <= count; i++)
2514 {
2515 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2516 vsp += 8;
2517 }
2518 }
2519 else if (insn == 0xc9)
2520 {
2521 int start = *entry >> 4;
2522 int count = (*entry++) & 0xf;
2523 int i;
2524
2525 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2526 for (i = 0; i <= count; i++)
2527 {
2528 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2529 vsp += 8;
2530 }
2531 }
2532 else if ((insn & 0xf8) == 0xd0)
2533 {
2534 int count = insn & 0x7;
2535 int i;
2536
2537 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2538 for (i = 0; i <= count; i++)
2539 {
2540 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2541 vsp += 8;
2542 }
2543 }
2544 else
2545 {
2546 /* Everything else is "spare". */
2547 return NULL;
2548 }
2549 }
2550
2551 /* If we restore SP from a register, assume this was the frame register.
2552 Otherwise just fall back to SP as frame register. */
2553 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2554 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2555 else
2556 cache->framereg = ARM_SP_REGNUM;
2557
2558 /* Determine offset to previous frame. */
2559 cache->framesize
2560 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2561
2562 /* We already got the previous SP. */
2563 cache->prev_sp = vsp;
2564
2565 return cache;
2566}
2567
2568/* Unwinding via ARM exception table entries. Note that the sniffer
2569 already computes a filled-in prologue cache, which is then used
2570 with the same arm_prologue_this_id and arm_prologue_prev_register
2571 routines also used for prologue-parsing based unwinding. */
2572
2573static int
2574arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2575 struct frame_info *this_frame,
2576 void **this_prologue_cache)
2577{
2578 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2579 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2580 CORE_ADDR addr_in_block, exidx_region, func_start;
2581 struct arm_prologue_cache *cache;
2582 gdb_byte *entry;
2583
2584 /* See if we have an ARM exception table entry covering this address. */
2585 addr_in_block = get_frame_address_in_block (this_frame);
2586 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2587 if (!entry)
2588 return 0;
2589
2590 /* The ARM exception table does not describe unwind information
2591 for arbitrary PC values, but is guaranteed to be correct only
2592 at call sites. We have to decide here whether we want to use
2593 ARM exception table information for this frame, or fall back
2594 to using prologue parsing. (Note that if we have DWARF CFI,
2595 this sniffer isn't even called -- CFI is always preferred.)
2596
2597 Before we make this decision, however, we check whether we
2598 actually have *symbol* information for the current frame.
2599 If not, prologue parsing would not work anyway, so we might
2600 as well use the exception table and hope for the best. */
2601 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2602 {
2603 int exc_valid = 0;
2604
2605 /* If the next frame is "normal", we are at a call site in this
2606 frame, so exception information is guaranteed to be valid. */
2607 if (get_next_frame (this_frame)
2608 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2609 exc_valid = 1;
2610
2611 /* We also assume exception information is valid if we're currently
2612 blocked in a system call. The system library is supposed to
d9311bfa
AT
2613 ensure this, so that e.g. pthread cancellation works. */
2614 if (arm_frame_is_thumb (this_frame))
0e9e9abd 2615 {
d9311bfa 2616 LONGEST insn;
416dc9c6 2617
d9311bfa
AT
2618 if (safe_read_memory_integer (get_frame_pc (this_frame) - 2, 2,
2619 byte_order_for_code, &insn)
2620 && (insn & 0xff00) == 0xdf00 /* svc */)
2621 exc_valid = 1;
0e9e9abd 2622 }
d9311bfa
AT
2623 else
2624 {
2625 LONGEST insn;
416dc9c6 2626
d9311bfa
AT
2627 if (safe_read_memory_integer (get_frame_pc (this_frame) - 4, 4,
2628 byte_order_for_code, &insn)
2629 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2630 exc_valid = 1;
2631 }
2632
0e9e9abd
UW
2633 /* Bail out if we don't know that exception information is valid. */
2634 if (!exc_valid)
2635 return 0;
2636
2637 /* The ARM exception index does not mark the *end* of the region
2638 covered by the entry, and some functions will not have any entry.
2639 To correctly recognize the end of the covered region, the linker
2640 should have inserted dummy records with a CANTUNWIND marker.
2641
2642 Unfortunately, current versions of GNU ld do not reliably do
2643 this, and thus we may have found an incorrect entry above.
2644 As a (temporary) sanity check, we only use the entry if it
2645 lies *within* the bounds of the function. Note that this check
2646 might reject perfectly valid entries that just happen to cover
2647 multiple functions; therefore this check ought to be removed
2648 once the linker is fixed. */
2649 if (func_start > exidx_region)
2650 return 0;
2651 }
2652
2653 /* Decode the list of unwinding instructions into a prologue cache.
2654 Note that this may fail due to e.g. a "refuse to unwind" code. */
2655 cache = arm_exidx_fill_cache (this_frame, entry);
2656 if (!cache)
2657 return 0;
2658
2659 *this_prologue_cache = cache;
2660 return 1;
2661}
2662
2663struct frame_unwind arm_exidx_unwind = {
2664 NORMAL_FRAME,
8fbca658 2665 default_frame_unwind_stop_reason,
0e9e9abd
UW
2666 arm_prologue_this_id,
2667 arm_prologue_prev_register,
2668 NULL,
2669 arm_exidx_unwind_sniffer
2670};
2671
80d8d390
YQ
2672/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2673 trampoline, return the target PC. Otherwise return 0.
2674
2675 void call0a (char c, short s, int i, long l) {}
2676
2677 int main (void)
2678 {
2679 (*pointer_to_call0a) (c, s, i, l);
2680 }
2681
2682 Instead of calling a stub library function _call_via_xx (xx is
2683 the register name), GCC may inline the trampoline in the object
2684 file as below (register r2 has the address of call0a).
2685
2686 .global main
2687 .type main, %function
2688 ...
2689 bl .L1
2690 ...
2691 .size main, .-main
2692
2693 .L1:
2694 bx r2
2695
2696 The trampoline 'bx r2' doesn't belong to main. */
2697
2698static CORE_ADDR
2699arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2700{
2701 /* The heuristics of recognizing such trampoline is that FRAME is
2702 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2703 if (arm_frame_is_thumb (frame))
2704 {
2705 gdb_byte buf[2];
2706
2707 if (target_read_memory (pc, buf, 2) == 0)
2708 {
2709 struct gdbarch *gdbarch = get_frame_arch (frame);
2710 enum bfd_endian byte_order_for_code
2711 = gdbarch_byte_order_for_code (gdbarch);
2712 uint16_t insn
2713 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2714
2715 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2716 {
2717 CORE_ADDR dest
2718 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2719
2720 /* Clear the LSB so that gdb core sets step-resume
2721 breakpoint at the right address. */
2722 return UNMAKE_THUMB_ADDR (dest);
2723 }
2724 }
2725 }
2726
2727 return 0;
2728}
2729
909cf6ea 2730static struct arm_prologue_cache *
a262aec2 2731arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2732{
909cf6ea 2733 struct arm_prologue_cache *cache;
909cf6ea 2734
35d5d4ee 2735 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2736 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2737
a262aec2 2738 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2739
2740 return cache;
2741}
2742
2743/* Our frame ID for a stub frame is the current SP and LR. */
2744
2745static void
a262aec2 2746arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2747 void **this_cache,
2748 struct frame_id *this_id)
2749{
2750 struct arm_prologue_cache *cache;
2751
2752 if (*this_cache == NULL)
a262aec2 2753 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2754 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2755
a262aec2 2756 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2757}
2758
a262aec2
DJ
2759static int
2760arm_stub_unwind_sniffer (const struct frame_unwind *self,
2761 struct frame_info *this_frame,
2762 void **this_prologue_cache)
909cf6ea 2763{
93d42b30 2764 CORE_ADDR addr_in_block;
948f8e3d 2765 gdb_byte dummy[4];
18d18ac8
YQ
2766 CORE_ADDR pc, start_addr;
2767 const char *name;
909cf6ea 2768
a262aec2 2769 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2770 pc = get_frame_pc (this_frame);
3e5d3a5a 2771 if (in_plt_section (addr_in_block)
fc36e839
DE
2772 /* We also use the stub winder if the target memory is unreadable
2773 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2774 || target_read_memory (pc, dummy, 4) != 0)
2775 return 1;
2776
2777 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2778 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2779 return 1;
909cf6ea 2780
a262aec2 2781 return 0;
909cf6ea
DJ
2782}
2783
a262aec2
DJ
2784struct frame_unwind arm_stub_unwind = {
2785 NORMAL_FRAME,
8fbca658 2786 default_frame_unwind_stop_reason,
a262aec2
DJ
2787 arm_stub_this_id,
2788 arm_prologue_prev_register,
2789 NULL,
2790 arm_stub_unwind_sniffer
2791};
2792
2ae28aa9
YQ
2793/* Put here the code to store, into CACHE->saved_regs, the addresses
2794 of the saved registers of frame described by THIS_FRAME. CACHE is
2795 returned. */
2796
2797static struct arm_prologue_cache *
2798arm_m_exception_cache (struct frame_info *this_frame)
2799{
2800 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2801 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2802 struct arm_prologue_cache *cache;
2803 CORE_ADDR unwound_sp;
2804 LONGEST xpsr;
2805
2806 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2807 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2808
2809 unwound_sp = get_frame_register_unsigned (this_frame,
2810 ARM_SP_REGNUM);
2811
2812 /* The hardware saves eight 32-bit words, comprising xPSR,
2813 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2814 "B1.5.6 Exception entry behavior" in
2815 "ARMv7-M Architecture Reference Manual". */
2816 cache->saved_regs[0].addr = unwound_sp;
2817 cache->saved_regs[1].addr = unwound_sp + 4;
2818 cache->saved_regs[2].addr = unwound_sp + 8;
2819 cache->saved_regs[3].addr = unwound_sp + 12;
2820 cache->saved_regs[12].addr = unwound_sp + 16;
2821 cache->saved_regs[14].addr = unwound_sp + 20;
2822 cache->saved_regs[15].addr = unwound_sp + 24;
2823 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2824
2825 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2826 aligner between the top of the 32-byte stack frame and the
2827 previous context's stack pointer. */
2828 cache->prev_sp = unwound_sp + 32;
2829 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2830 && (xpsr & (1 << 9)) != 0)
2831 cache->prev_sp += 4;
2832
2833 return cache;
2834}
2835
2836/* Implementation of function hook 'this_id' in
2837 'struct frame_uwnind'. */
2838
2839static void
2840arm_m_exception_this_id (struct frame_info *this_frame,
2841 void **this_cache,
2842 struct frame_id *this_id)
2843{
2844 struct arm_prologue_cache *cache;
2845
2846 if (*this_cache == NULL)
2847 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2848 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2849
2850 /* Our frame ID for a stub frame is the current SP and LR. */
2851 *this_id = frame_id_build (cache->prev_sp,
2852 get_frame_pc (this_frame));
2853}
2854
2855/* Implementation of function hook 'prev_register' in
2856 'struct frame_uwnind'. */
2857
2858static struct value *
2859arm_m_exception_prev_register (struct frame_info *this_frame,
2860 void **this_cache,
2861 int prev_regnum)
2862{
2ae28aa9
YQ
2863 struct arm_prologue_cache *cache;
2864
2865 if (*this_cache == NULL)
2866 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2867 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2868
2869 /* The value was already reconstructed into PREV_SP. */
2870 if (prev_regnum == ARM_SP_REGNUM)
2871 return frame_unwind_got_constant (this_frame, prev_regnum,
2872 cache->prev_sp);
2873
2874 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2875 prev_regnum);
2876}
2877
2878/* Implementation of function hook 'sniffer' in
2879 'struct frame_uwnind'. */
2880
2881static int
2882arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
2883 struct frame_info *this_frame,
2884 void **this_prologue_cache)
2885{
2886 CORE_ADDR this_pc = get_frame_pc (this_frame);
2887
2888 /* No need to check is_m; this sniffer is only registered for
2889 M-profile architectures. */
2890
2891 /* Exception frames return to one of these magic PCs. Other values
2892 are not defined as of v7-M. See details in "B1.5.8 Exception
2893 return behavior" in "ARMv7-M Architecture Reference Manual". */
2894 if (this_pc == 0xfffffff1 || this_pc == 0xfffffff9
2895 || this_pc == 0xfffffffd)
2896 return 1;
2897
2898 return 0;
2899}
2900
2901/* Frame unwinder for M-profile exceptions. */
2902
2903struct frame_unwind arm_m_exception_unwind =
2904{
2905 SIGTRAMP_FRAME,
2906 default_frame_unwind_stop_reason,
2907 arm_m_exception_this_id,
2908 arm_m_exception_prev_register,
2909 NULL,
2910 arm_m_exception_unwind_sniffer
2911};
2912
24de872b 2913static CORE_ADDR
a262aec2 2914arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
2915{
2916 struct arm_prologue_cache *cache;
2917
eb5492fa 2918 if (*this_cache == NULL)
a262aec2 2919 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2920 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 2921
4be43953 2922 return cache->prev_sp - cache->framesize;
24de872b
DJ
2923}
2924
eb5492fa
DJ
2925struct frame_base arm_normal_base = {
2926 &arm_prologue_unwind,
2927 arm_normal_frame_base,
2928 arm_normal_frame_base,
2929 arm_normal_frame_base
2930};
2931
a262aec2 2932/* Assuming THIS_FRAME is a dummy, return the frame ID of that
eb5492fa
DJ
2933 dummy frame. The frame ID's base needs to match the TOS value
2934 saved by save_dummy_frame_tos() and returned from
2935 arm_push_dummy_call, and the PC needs to match the dummy frame's
2936 breakpoint. */
c906108c 2937
eb5492fa 2938static struct frame_id
a262aec2 2939arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
c906108c 2940{
0963b4bd
MS
2941 return frame_id_build (get_frame_register_unsigned (this_frame,
2942 ARM_SP_REGNUM),
a262aec2 2943 get_frame_pc (this_frame));
eb5492fa 2944}
c3b4394c 2945
eb5492fa
DJ
2946/* Given THIS_FRAME, find the previous frame's resume PC (which will
2947 be used to construct the previous frame's ID, after looking up the
2948 containing function). */
c3b4394c 2949
eb5492fa
DJ
2950static CORE_ADDR
2951arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
2952{
2953 CORE_ADDR pc;
2954 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
24568a2c 2955 return arm_addr_bits_remove (gdbarch, pc);
eb5492fa
DJ
2956}
2957
2958static CORE_ADDR
2959arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
2960{
2961 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
c906108c
SS
2962}
2963
b39cc962
DJ
2964static struct value *
2965arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
2966 int regnum)
2967{
24568a2c 2968 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 2969 CORE_ADDR lr, cpsr;
9779414d 2970 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2971
2972 switch (regnum)
2973 {
2974 case ARM_PC_REGNUM:
2975 /* The PC is normally copied from the return column, which
2976 describes saves of LR. However, that version may have an
2977 extra bit set to indicate Thumb state. The bit is not
2978 part of the PC. */
2979 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2980 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 2981 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
2982
2983 case ARM_PS_REGNUM:
2984 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 2985 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
2986 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2987 if (IS_THUMB_ADDR (lr))
9779414d 2988 cpsr |= t_bit;
b39cc962 2989 else
9779414d 2990 cpsr &= ~t_bit;
ca38c58e 2991 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
2992
2993 default:
2994 internal_error (__FILE__, __LINE__,
2995 _("Unexpected register %d"), regnum);
2996 }
2997}
2998
2999static void
3000arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3001 struct dwarf2_frame_state_reg *reg,
3002 struct frame_info *this_frame)
3003{
3004 switch (regnum)
3005 {
3006 case ARM_PC_REGNUM:
3007 case ARM_PS_REGNUM:
3008 reg->how = DWARF2_FRAME_REG_FN;
3009 reg->loc.fn = arm_dwarf2_prev_register;
3010 break;
3011 case ARM_SP_REGNUM:
3012 reg->how = DWARF2_FRAME_REG_CFA;
3013 break;
3014 }
3015}
3016
c9cf6e20 3017/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3018
3019static int
c9cf6e20 3020thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3021{
3022 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3023 unsigned int insn, insn2;
3024 int found_return = 0, found_stack_adjust = 0;
3025 CORE_ADDR func_start, func_end;
3026 CORE_ADDR scan_pc;
3027 gdb_byte buf[4];
3028
3029 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3030 return 0;
3031
3032 /* The epilogue is a sequence of instructions along the following lines:
3033
3034 - add stack frame size to SP or FP
3035 - [if frame pointer used] restore SP from FP
3036 - restore registers from SP [may include PC]
3037 - a return-type instruction [if PC wasn't already restored]
3038
3039 In a first pass, we scan forward from the current PC and verify the
3040 instructions we find as compatible with this sequence, ending in a
3041 return instruction.
3042
3043 However, this is not sufficient to distinguish indirect function calls
3044 within a function from indirect tail calls in the epilogue in some cases.
3045 Therefore, if we didn't already find any SP-changing instruction during
3046 forward scan, we add a backward scanning heuristic to ensure we actually
3047 are in the epilogue. */
3048
3049 scan_pc = pc;
3050 while (scan_pc < func_end && !found_return)
3051 {
3052 if (target_read_memory (scan_pc, buf, 2))
3053 break;
3054
3055 scan_pc += 2;
3056 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3057
3058 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3059 found_return = 1;
3060 else if (insn == 0x46f7) /* mov pc, lr */
3061 found_return = 1;
540314bd 3062 else if (thumb_instruction_restores_sp (insn))
4024ca99 3063 {
b7576e5c 3064 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3065 found_return = 1;
3066 }
db24da6d 3067 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3068 {
3069 if (target_read_memory (scan_pc, buf, 2))
3070 break;
3071
3072 scan_pc += 2;
3073 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3074
3075 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3076 {
4024ca99
UW
3077 if (insn2 & 0x8000) /* <registers> include PC. */
3078 found_return = 1;
3079 }
3080 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3081 && (insn2 & 0x0fff) == 0x0b04)
3082 {
4024ca99
UW
3083 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3084 found_return = 1;
3085 }
3086 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3087 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3088 ;
4024ca99
UW
3089 else
3090 break;
3091 }
3092 else
3093 break;
3094 }
3095
3096 if (!found_return)
3097 return 0;
3098
3099 /* Since any instruction in the epilogue sequence, with the possible
3100 exception of return itself, updates the stack pointer, we need to
3101 scan backwards for at most one instruction. Try either a 16-bit or
3102 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3103 too much about false positives. */
4024ca99 3104
6b65d1b6
YQ
3105 if (pc - 4 < func_start)
3106 return 0;
3107 if (target_read_memory (pc - 4, buf, 4))
3108 return 0;
4024ca99 3109
6b65d1b6
YQ
3110 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3111 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3112
3113 if (thumb_instruction_restores_sp (insn2))
3114 found_stack_adjust = 1;
3115 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3116 found_stack_adjust = 1;
3117 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3118 && (insn2 & 0x0fff) == 0x0b04)
3119 found_stack_adjust = 1;
3120 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3121 && (insn2 & 0x0e00) == 0x0a00)
3122 found_stack_adjust = 1;
4024ca99
UW
3123
3124 return found_stack_adjust;
3125}
3126
c9cf6e20 3127/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3128
3129static int
c9cf6e20 3130arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3131{
3132 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3133 unsigned int insn;
f303bc3e 3134 int found_return;
4024ca99
UW
3135 CORE_ADDR func_start, func_end;
3136
3137 if (arm_pc_is_thumb (gdbarch, pc))
c9cf6e20 3138 return thumb_stack_frame_destroyed_p (gdbarch, pc);
4024ca99
UW
3139
3140 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3141 return 0;
3142
3143 /* We are in the epilogue if the previous instruction was a stack
3144 adjustment and the next instruction is a possible return (bx, mov
3145 pc, or pop). We could have to scan backwards to find the stack
3146 adjustment, or forwards to find the return, but this is a decent
3147 approximation. First scan forwards. */
3148
3149 found_return = 0;
3150 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3151 if (bits (insn, 28, 31) != INST_NV)
3152 {
3153 if ((insn & 0x0ffffff0) == 0x012fff10)
3154 /* BX. */
3155 found_return = 1;
3156 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3157 /* MOV PC. */
3158 found_return = 1;
3159 else if ((insn & 0x0fff0000) == 0x08bd0000
3160 && (insn & 0x0000c000) != 0)
3161 /* POP (LDMIA), including PC or LR. */
3162 found_return = 1;
3163 }
3164
3165 if (!found_return)
3166 return 0;
3167
3168 /* Scan backwards. This is just a heuristic, so do not worry about
3169 false positives from mode changes. */
3170
3171 if (pc < func_start + 4)
3172 return 0;
3173
3174 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3175 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3176 return 1;
3177
3178 return 0;
3179}
3180
3181
2dd604e7
RE
3182/* When arguments must be pushed onto the stack, they go on in reverse
3183 order. The code below implements a FILO (stack) to do this. */
3184
3185struct stack_item
3186{
3187 int len;
3188 struct stack_item *prev;
7c543f7b 3189 gdb_byte *data;
2dd604e7
RE
3190};
3191
3192static struct stack_item *
df3b6708 3193push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3194{
3195 struct stack_item *si;
8d749320 3196 si = XNEW (struct stack_item);
7c543f7b 3197 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3198 si->len = len;
3199 si->prev = prev;
3200 memcpy (si->data, contents, len);
3201 return si;
3202}
3203
3204static struct stack_item *
3205pop_stack_item (struct stack_item *si)
3206{
3207 struct stack_item *dead = si;
3208 si = si->prev;
3209 xfree (dead->data);
3210 xfree (dead);
3211 return si;
3212}
3213
2af48f68
PB
3214
3215/* Return the alignment (in bytes) of the given type. */
3216
3217static int
3218arm_type_align (struct type *t)
3219{
3220 int n;
3221 int align;
3222 int falign;
3223
3224 t = check_typedef (t);
3225 switch (TYPE_CODE (t))
3226 {
3227 default:
3228 /* Should never happen. */
3229 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3230 return 4;
3231
3232 case TYPE_CODE_PTR:
3233 case TYPE_CODE_ENUM:
3234 case TYPE_CODE_INT:
3235 case TYPE_CODE_FLT:
3236 case TYPE_CODE_SET:
3237 case TYPE_CODE_RANGE:
2af48f68
PB
3238 case TYPE_CODE_REF:
3239 case TYPE_CODE_CHAR:
3240 case TYPE_CODE_BOOL:
3241 return TYPE_LENGTH (t);
3242
3243 case TYPE_CODE_ARRAY:
c4312b19
YQ
3244 if (TYPE_VECTOR (t))
3245 {
3246 /* Use the natural alignment for vector types (the same for
3247 scalar type), but the maximum alignment is 64-bit. */
3248 if (TYPE_LENGTH (t) > 8)
3249 return 8;
3250 else
3251 return TYPE_LENGTH (t);
3252 }
3253 else
3254 return arm_type_align (TYPE_TARGET_TYPE (t));
2af48f68 3255 case TYPE_CODE_COMPLEX:
2af48f68
PB
3256 return arm_type_align (TYPE_TARGET_TYPE (t));
3257
3258 case TYPE_CODE_STRUCT:
3259 case TYPE_CODE_UNION:
3260 align = 1;
3261 for (n = 0; n < TYPE_NFIELDS (t); n++)
3262 {
3263 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3264 if (falign > align)
3265 align = falign;
3266 }
3267 return align;
3268 }
3269}
3270
90445bd3
DJ
3271/* Possible base types for a candidate for passing and returning in
3272 VFP registers. */
3273
3274enum arm_vfp_cprc_base_type
3275{
3276 VFP_CPRC_UNKNOWN,
3277 VFP_CPRC_SINGLE,
3278 VFP_CPRC_DOUBLE,
3279 VFP_CPRC_VEC64,
3280 VFP_CPRC_VEC128
3281};
3282
3283/* The length of one element of base type B. */
3284
3285static unsigned
3286arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3287{
3288 switch (b)
3289 {
3290 case VFP_CPRC_SINGLE:
3291 return 4;
3292 case VFP_CPRC_DOUBLE:
3293 return 8;
3294 case VFP_CPRC_VEC64:
3295 return 8;
3296 case VFP_CPRC_VEC128:
3297 return 16;
3298 default:
3299 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3300 (int) b);
3301 }
3302}
3303
3304/* The character ('s', 'd' or 'q') for the type of VFP register used
3305 for passing base type B. */
3306
3307static int
3308arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3309{
3310 switch (b)
3311 {
3312 case VFP_CPRC_SINGLE:
3313 return 's';
3314 case VFP_CPRC_DOUBLE:
3315 return 'd';
3316 case VFP_CPRC_VEC64:
3317 return 'd';
3318 case VFP_CPRC_VEC128:
3319 return 'q';
3320 default:
3321 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3322 (int) b);
3323 }
3324}
3325
3326/* Determine whether T may be part of a candidate for passing and
3327 returning in VFP registers, ignoring the limit on the total number
3328 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3329 classification of the first valid component found; if it is not
3330 VFP_CPRC_UNKNOWN, all components must have the same classification
3331 as *BASE_TYPE. If it is found that T contains a type not permitted
3332 for passing and returning in VFP registers, a type differently
3333 classified from *BASE_TYPE, or two types differently classified
3334 from each other, return -1, otherwise return the total number of
3335 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3336 array). Vector types are not currently supported, matching the
3337 generic AAPCS support. */
90445bd3
DJ
3338
3339static int
3340arm_vfp_cprc_sub_candidate (struct type *t,
3341 enum arm_vfp_cprc_base_type *base_type)
3342{
3343 t = check_typedef (t);
3344 switch (TYPE_CODE (t))
3345 {
3346 case TYPE_CODE_FLT:
3347 switch (TYPE_LENGTH (t))
3348 {
3349 case 4:
3350 if (*base_type == VFP_CPRC_UNKNOWN)
3351 *base_type = VFP_CPRC_SINGLE;
3352 else if (*base_type != VFP_CPRC_SINGLE)
3353 return -1;
3354 return 1;
3355
3356 case 8:
3357 if (*base_type == VFP_CPRC_UNKNOWN)
3358 *base_type = VFP_CPRC_DOUBLE;
3359 else if (*base_type != VFP_CPRC_DOUBLE)
3360 return -1;
3361 return 1;
3362
3363 default:
3364 return -1;
3365 }
3366 break;
3367
817e0957
YQ
3368 case TYPE_CODE_COMPLEX:
3369 /* Arguments of complex T where T is one of the types float or
3370 double get treated as if they are implemented as:
3371
3372 struct complexT
3373 {
3374 T real;
3375 T imag;
5f52445b
YQ
3376 };
3377
3378 */
817e0957
YQ
3379 switch (TYPE_LENGTH (t))
3380 {
3381 case 8:
3382 if (*base_type == VFP_CPRC_UNKNOWN)
3383 *base_type = VFP_CPRC_SINGLE;
3384 else if (*base_type != VFP_CPRC_SINGLE)
3385 return -1;
3386 return 2;
3387
3388 case 16:
3389 if (*base_type == VFP_CPRC_UNKNOWN)
3390 *base_type = VFP_CPRC_DOUBLE;
3391 else if (*base_type != VFP_CPRC_DOUBLE)
3392 return -1;
3393 return 2;
3394
3395 default:
3396 return -1;
3397 }
3398 break;
3399
90445bd3
DJ
3400 case TYPE_CODE_ARRAY:
3401 {
c4312b19 3402 if (TYPE_VECTOR (t))
90445bd3 3403 {
c4312b19
YQ
3404 /* A 64-bit or 128-bit containerized vector type are VFP
3405 CPRCs. */
3406 switch (TYPE_LENGTH (t))
3407 {
3408 case 8:
3409 if (*base_type == VFP_CPRC_UNKNOWN)
3410 *base_type = VFP_CPRC_VEC64;
3411 return 1;
3412 case 16:
3413 if (*base_type == VFP_CPRC_UNKNOWN)
3414 *base_type = VFP_CPRC_VEC128;
3415 return 1;
3416 default:
3417 return -1;
3418 }
3419 }
3420 else
3421 {
3422 int count;
3423 unsigned unitlen;
3424
3425 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3426 base_type);
3427 if (count == -1)
3428 return -1;
3429 if (TYPE_LENGTH (t) == 0)
3430 {
3431 gdb_assert (count == 0);
3432 return 0;
3433 }
3434 else if (count == 0)
3435 return -1;
3436 unitlen = arm_vfp_cprc_unit_length (*base_type);
3437 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3438 return TYPE_LENGTH (t) / unitlen;
90445bd3 3439 }
90445bd3
DJ
3440 }
3441 break;
3442
3443 case TYPE_CODE_STRUCT:
3444 {
3445 int count = 0;
3446 unsigned unitlen;
3447 int i;
3448 for (i = 0; i < TYPE_NFIELDS (t); i++)
3449 {
3450 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3451 base_type);
3452 if (sub_count == -1)
3453 return -1;
3454 count += sub_count;
3455 }
3456 if (TYPE_LENGTH (t) == 0)
3457 {
3458 gdb_assert (count == 0);
3459 return 0;
3460 }
3461 else if (count == 0)
3462 return -1;
3463 unitlen = arm_vfp_cprc_unit_length (*base_type);
3464 if (TYPE_LENGTH (t) != unitlen * count)
3465 return -1;
3466 return count;
3467 }
3468
3469 case TYPE_CODE_UNION:
3470 {
3471 int count = 0;
3472 unsigned unitlen;
3473 int i;
3474 for (i = 0; i < TYPE_NFIELDS (t); i++)
3475 {
3476 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3477 base_type);
3478 if (sub_count == -1)
3479 return -1;
3480 count = (count > sub_count ? count : sub_count);
3481 }
3482 if (TYPE_LENGTH (t) == 0)
3483 {
3484 gdb_assert (count == 0);
3485 return 0;
3486 }
3487 else if (count == 0)
3488 return -1;
3489 unitlen = arm_vfp_cprc_unit_length (*base_type);
3490 if (TYPE_LENGTH (t) != unitlen * count)
3491 return -1;
3492 return count;
3493 }
3494
3495 default:
3496 break;
3497 }
3498
3499 return -1;
3500}
3501
3502/* Determine whether T is a VFP co-processor register candidate (CPRC)
3503 if passed to or returned from a non-variadic function with the VFP
3504 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3505 *BASE_TYPE to the base type for T and *COUNT to the number of
3506 elements of that base type before returning. */
3507
3508static int
3509arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3510 int *count)
3511{
3512 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3513 int c = arm_vfp_cprc_sub_candidate (t, &b);
3514 if (c <= 0 || c > 4)
3515 return 0;
3516 *base_type = b;
3517 *count = c;
3518 return 1;
3519}
3520
3521/* Return 1 if the VFP ABI should be used for passing arguments to and
3522 returning values from a function of type FUNC_TYPE, 0
3523 otherwise. */
3524
3525static int
3526arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3527{
3528 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3529 /* Variadic functions always use the base ABI. Assume that functions
3530 without debug info are not variadic. */
3531 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3532 return 0;
3533 /* The VFP ABI is only supported as a variant of AAPCS. */
3534 if (tdep->arm_abi != ARM_ABI_AAPCS)
3535 return 0;
3536 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3537}
3538
3539/* We currently only support passing parameters in integer registers, which
3540 conforms with GCC's default model, and VFP argument passing following
3541 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3542 we should probably support some of them based on the selected ABI. */
3543
3544static CORE_ADDR
7d9b040b 3545arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
3546 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3547 struct value **args, CORE_ADDR sp, int struct_return,
3548 CORE_ADDR struct_addr)
2dd604e7 3549{
e17a4113 3550 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3551 int argnum;
3552 int argreg;
3553 int nstack;
3554 struct stack_item *si = NULL;
90445bd3
DJ
3555 int use_vfp_abi;
3556 struct type *ftype;
3557 unsigned vfp_regs_free = (1 << 16) - 1;
3558
3559 /* Determine the type of this function and whether the VFP ABI
3560 applies. */
3561 ftype = check_typedef (value_type (function));
3562 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3563 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3564 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3565
6a65450a
AC
3566 /* Set the return address. For the ARM, the return breakpoint is
3567 always at BP_ADDR. */
9779414d 3568 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3569 bp_addr |= 1;
6a65450a 3570 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3571
3572 /* Walk through the list of args and determine how large a temporary
3573 stack is required. Need to take care here as structs may be
7a9dd1b2 3574 passed on the stack, and we have to push them. */
2dd604e7
RE
3575 nstack = 0;
3576
3577 argreg = ARM_A1_REGNUM;
3578 nstack = 0;
3579
2dd604e7
RE
3580 /* The struct_return pointer occupies the first parameter
3581 passing register. */
3582 if (struct_return)
3583 {
3584 if (arm_debug)
5af949e3 3585 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3586 gdbarch_register_name (gdbarch, argreg),
5af949e3 3587 paddress (gdbarch, struct_addr));
2dd604e7
RE
3588 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3589 argreg++;
3590 }
3591
3592 for (argnum = 0; argnum < nargs; argnum++)
3593 {
3594 int len;
3595 struct type *arg_type;
3596 struct type *target_type;
3597 enum type_code typecode;
8c6363cf 3598 const bfd_byte *val;
2af48f68 3599 int align;
90445bd3
DJ
3600 enum arm_vfp_cprc_base_type vfp_base_type;
3601 int vfp_base_count;
3602 int may_use_core_reg = 1;
2dd604e7 3603
df407dfe 3604 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3605 len = TYPE_LENGTH (arg_type);
3606 target_type = TYPE_TARGET_TYPE (arg_type);
3607 typecode = TYPE_CODE (arg_type);
8c6363cf 3608 val = value_contents (args[argnum]);
2dd604e7 3609
2af48f68
PB
3610 align = arm_type_align (arg_type);
3611 /* Round alignment up to a whole number of words. */
3612 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3613 /* Different ABIs have different maximum alignments. */
3614 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3615 {
3616 /* The APCS ABI only requires word alignment. */
3617 align = INT_REGISTER_SIZE;
3618 }
3619 else
3620 {
3621 /* The AAPCS requires at most doubleword alignment. */
3622 if (align > INT_REGISTER_SIZE * 2)
3623 align = INT_REGISTER_SIZE * 2;
3624 }
3625
90445bd3
DJ
3626 if (use_vfp_abi
3627 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3628 &vfp_base_count))
3629 {
3630 int regno;
3631 int unit_length;
3632 int shift;
3633 unsigned mask;
3634
3635 /* Because this is a CPRC it cannot go in a core register or
3636 cause a core register to be skipped for alignment.
3637 Either it goes in VFP registers and the rest of this loop
3638 iteration is skipped for this argument, or it goes on the
3639 stack (and the stack alignment code is correct for this
3640 case). */
3641 may_use_core_reg = 0;
3642
3643 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3644 shift = unit_length / 4;
3645 mask = (1 << (shift * vfp_base_count)) - 1;
3646 for (regno = 0; regno < 16; regno += shift)
3647 if (((vfp_regs_free >> regno) & mask) == mask)
3648 break;
3649
3650 if (regno < 16)
3651 {
3652 int reg_char;
3653 int reg_scaled;
3654 int i;
3655
3656 vfp_regs_free &= ~(mask << regno);
3657 reg_scaled = regno / shift;
3658 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3659 for (i = 0; i < vfp_base_count; i++)
3660 {
3661 char name_buf[4];
3662 int regnum;
58d6951d
DJ
3663 if (reg_char == 'q')
3664 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3665 val + i * unit_length);
58d6951d
DJ
3666 else
3667 {
8c042590
PM
3668 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3669 reg_char, reg_scaled + i);
58d6951d
DJ
3670 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3671 strlen (name_buf));
3672 regcache_cooked_write (regcache, regnum,
3673 val + i * unit_length);
3674 }
90445bd3
DJ
3675 }
3676 continue;
3677 }
3678 else
3679 {
3680 /* This CPRC could not go in VFP registers, so all VFP
3681 registers are now marked as used. */
3682 vfp_regs_free = 0;
3683 }
3684 }
3685
2af48f68
PB
3686 /* Push stack padding for dowubleword alignment. */
3687 if (nstack & (align - 1))
3688 {
3689 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3690 nstack += INT_REGISTER_SIZE;
3691 }
3692
3693 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3694 if (may_use_core_reg
3695 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3696 && align > INT_REGISTER_SIZE
3697 && argreg & 1)
3698 argreg++;
3699
2dd604e7
RE
3700 /* If the argument is a pointer to a function, and it is a
3701 Thumb function, create a LOCAL copy of the value and set
3702 the THUMB bit in it. */
3703 if (TYPE_CODE_PTR == typecode
3704 && target_type != NULL
f96b8fa0 3705 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3706 {
e17a4113 3707 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3708 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3709 {
224c3ddb 3710 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3711 store_unsigned_integer (copy, len, byte_order,
e17a4113 3712 MAKE_THUMB_ADDR (regval));
8c6363cf 3713 val = copy;
2dd604e7
RE
3714 }
3715 }
3716
3717 /* Copy the argument to general registers or the stack in
3718 register-sized pieces. Large arguments are split between
3719 registers and stack. */
3720 while (len > 0)
3721 {
f0c9063c 3722 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
ef9bd0b8
YQ
3723 CORE_ADDR regval
3724 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3725
90445bd3 3726 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3727 {
3728 /* The argument is being passed in a general purpose
3729 register. */
e17a4113 3730 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3731 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3732 if (arm_debug)
3733 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3734 argnum,
3735 gdbarch_register_name
2af46ca0 3736 (gdbarch, argreg),
f0c9063c 3737 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3738 regcache_cooked_write_unsigned (regcache, argreg, regval);
3739 argreg++;
3740 }
3741 else
3742 {
ef9bd0b8
YQ
3743 gdb_byte buf[INT_REGISTER_SIZE];
3744
3745 memset (buf, 0, sizeof (buf));
3746 store_unsigned_integer (buf, partial_len, byte_order, regval);
3747
2dd604e7
RE
3748 /* Push the arguments onto the stack. */
3749 if (arm_debug)
3750 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3751 argnum, nstack);
ef9bd0b8 3752 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
f0c9063c 3753 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3754 }
3755
3756 len -= partial_len;
3757 val += partial_len;
3758 }
3759 }
3760 /* If we have an odd number of words to push, then decrement the stack
3761 by one word now, so first stack argument will be dword aligned. */
3762 if (nstack & 4)
3763 sp -= 4;
3764
3765 while (si)
3766 {
3767 sp -= si->len;
3768 write_memory (sp, si->data, si->len);
3769 si = pop_stack_item (si);
3770 }
3771
3772 /* Finally, update teh SP register. */
3773 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3774
3775 return sp;
3776}
3777
f53f0d0b
PB
3778
3779/* Always align the frame to an 8-byte boundary. This is required on
3780 some platforms and harmless on the rest. */
3781
3782static CORE_ADDR
3783arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3784{
3785 /* Align the stack to eight bytes. */
3786 return sp & ~ (CORE_ADDR) 7;
3787}
3788
c906108c 3789static void
12b27276 3790print_fpu_flags (struct ui_file *file, int flags)
c906108c 3791{
c5aa993b 3792 if (flags & (1 << 0))
12b27276 3793 fputs_filtered ("IVO ", file);
c5aa993b 3794 if (flags & (1 << 1))
12b27276 3795 fputs_filtered ("DVZ ", file);
c5aa993b 3796 if (flags & (1 << 2))
12b27276 3797 fputs_filtered ("OFL ", file);
c5aa993b 3798 if (flags & (1 << 3))
12b27276 3799 fputs_filtered ("UFL ", file);
c5aa993b 3800 if (flags & (1 << 4))
12b27276
WN
3801 fputs_filtered ("INX ", file);
3802 fputc_filtered ('\n', file);
c906108c
SS
3803}
3804
5e74b15c
RE
3805/* Print interesting information about the floating point processor
3806 (if present) or emulator. */
34e8f22d 3807static void
d855c300 3808arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3809 struct frame_info *frame, const char *args)
c906108c 3810{
9c9acae0 3811 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3812 int type;
3813
3814 type = (status >> 24) & 127;
edefbb7c 3815 if (status & (1 << 31))
12b27276 3816 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 3817 else
12b27276 3818 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 3819 /* i18n: [floating point unit] mask */
12b27276
WN
3820 fputs_filtered (_("mask: "), file);
3821 print_fpu_flags (file, status >> 16);
edefbb7c 3822 /* i18n: [floating point unit] flags */
12b27276
WN
3823 fputs_filtered (_("flags: "), file);
3824 print_fpu_flags (file, status);
c906108c
SS
3825}
3826
27067745
UW
3827/* Construct the ARM extended floating point type. */
3828static struct type *
3829arm_ext_type (struct gdbarch *gdbarch)
3830{
3831 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3832
3833 if (!tdep->arm_ext_type)
3834 tdep->arm_ext_type
e9bb382b 3835 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3836 floatformats_arm_ext);
3837
3838 return tdep->arm_ext_type;
3839}
3840
58d6951d
DJ
3841static struct type *
3842arm_neon_double_type (struct gdbarch *gdbarch)
3843{
3844 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3845
3846 if (tdep->neon_double_type == NULL)
3847 {
3848 struct type *t, *elem;
3849
3850 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3851 TYPE_CODE_UNION);
3852 elem = builtin_type (gdbarch)->builtin_uint8;
3853 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3854 elem = builtin_type (gdbarch)->builtin_uint16;
3855 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3856 elem = builtin_type (gdbarch)->builtin_uint32;
3857 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3858 elem = builtin_type (gdbarch)->builtin_uint64;
3859 append_composite_type_field (t, "u64", elem);
3860 elem = builtin_type (gdbarch)->builtin_float;
3861 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3862 elem = builtin_type (gdbarch)->builtin_double;
3863 append_composite_type_field (t, "f64", elem);
3864
3865 TYPE_VECTOR (t) = 1;
3866 TYPE_NAME (t) = "neon_d";
3867 tdep->neon_double_type = t;
3868 }
3869
3870 return tdep->neon_double_type;
3871}
3872
3873/* FIXME: The vector types are not correctly ordered on big-endian
3874 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3875 bits of d0 - regardless of what unit size is being held in d0. So
3876 the offset of the first uint8 in d0 is 7, but the offset of the
3877 first float is 4. This code works as-is for little-endian
3878 targets. */
3879
3880static struct type *
3881arm_neon_quad_type (struct gdbarch *gdbarch)
3882{
3883 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3884
3885 if (tdep->neon_quad_type == NULL)
3886 {
3887 struct type *t, *elem;
3888
3889 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3890 TYPE_CODE_UNION);
3891 elem = builtin_type (gdbarch)->builtin_uint8;
3892 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3893 elem = builtin_type (gdbarch)->builtin_uint16;
3894 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3895 elem = builtin_type (gdbarch)->builtin_uint32;
3896 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3897 elem = builtin_type (gdbarch)->builtin_uint64;
3898 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3899 elem = builtin_type (gdbarch)->builtin_float;
3900 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3901 elem = builtin_type (gdbarch)->builtin_double;
3902 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3903
3904 TYPE_VECTOR (t) = 1;
3905 TYPE_NAME (t) = "neon_q";
3906 tdep->neon_quad_type = t;
3907 }
3908
3909 return tdep->neon_quad_type;
3910}
3911
34e8f22d
RE
3912/* Return the GDB type object for the "standard" data type of data in
3913 register N. */
3914
3915static struct type *
7a5ea0d4 3916arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3917{
58d6951d
DJ
3918 int num_regs = gdbarch_num_regs (gdbarch);
3919
3920 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3921 && regnum >= num_regs && regnum < num_regs + 32)
3922 return builtin_type (gdbarch)->builtin_float;
3923
3924 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3925 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3926 return arm_neon_quad_type (gdbarch);
3927
3928 /* If the target description has register information, we are only
3929 in this function so that we can override the types of
3930 double-precision registers for NEON. */
3931 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
3932 {
3933 struct type *t = tdesc_register_type (gdbarch, regnum);
3934
3935 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
3936 && TYPE_CODE (t) == TYPE_CODE_FLT
3937 && gdbarch_tdep (gdbarch)->have_neon)
3938 return arm_neon_double_type (gdbarch);
3939 else
3940 return t;
3941 }
3942
34e8f22d 3943 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
3944 {
3945 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
3946 return builtin_type (gdbarch)->builtin_void;
3947
3948 return arm_ext_type (gdbarch);
3949 }
e4c16157 3950 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 3951 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 3952 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 3953 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
3954 else if (regnum >= ARRAY_SIZE (arm_register_names))
3955 /* These registers are only supported on targets which supply
3956 an XML description. */
df4df182 3957 return builtin_type (gdbarch)->builtin_int0;
032758dc 3958 else
df4df182 3959 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
3960}
3961
ff6f572f
DJ
3962/* Map a DWARF register REGNUM onto the appropriate GDB register
3963 number. */
3964
3965static int
d3f73121 3966arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
3967{
3968 /* Core integer regs. */
3969 if (reg >= 0 && reg <= 15)
3970 return reg;
3971
3972 /* Legacy FPA encoding. These were once used in a way which
3973 overlapped with VFP register numbering, so their use is
3974 discouraged, but GDB doesn't support the ARM toolchain
3975 which used them for VFP. */
3976 if (reg >= 16 && reg <= 23)
3977 return ARM_F0_REGNUM + reg - 16;
3978
3979 /* New assignments for the FPA registers. */
3980 if (reg >= 96 && reg <= 103)
3981 return ARM_F0_REGNUM + reg - 96;
3982
3983 /* WMMX register assignments. */
3984 if (reg >= 104 && reg <= 111)
3985 return ARM_WCGR0_REGNUM + reg - 104;
3986
3987 if (reg >= 112 && reg <= 127)
3988 return ARM_WR0_REGNUM + reg - 112;
3989
3990 if (reg >= 192 && reg <= 199)
3991 return ARM_WC0_REGNUM + reg - 192;
3992
58d6951d
DJ
3993 /* VFP v2 registers. A double precision value is actually
3994 in d1 rather than s2, but the ABI only defines numbering
3995 for the single precision registers. This will "just work"
3996 in GDB for little endian targets (we'll read eight bytes,
3997 starting in s0 and then progressing to s1), but will be
3998 reversed on big endian targets with VFP. This won't
3999 be a problem for the new Neon quad registers; you're supposed
4000 to use DW_OP_piece for those. */
4001 if (reg >= 64 && reg <= 95)
4002 {
4003 char name_buf[4];
4004
8c042590 4005 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4006 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4007 strlen (name_buf));
4008 }
4009
4010 /* VFP v3 / Neon registers. This range is also used for VFP v2
4011 registers, except that it now describes d0 instead of s0. */
4012 if (reg >= 256 && reg <= 287)
4013 {
4014 char name_buf[4];
4015
8c042590 4016 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4017 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4018 strlen (name_buf));
4019 }
4020
ff6f572f
DJ
4021 return -1;
4022}
4023
26216b98
AC
4024/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4025static int
e7faf938 4026arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4027{
4028 int reg = regnum;
e7faf938 4029 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4030
ff6f572f
DJ
4031 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4032 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4033
4034 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4035 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4036
4037 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4038 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4039
26216b98
AC
4040 if (reg < NUM_GREGS)
4041 return SIM_ARM_R0_REGNUM + reg;
4042 reg -= NUM_GREGS;
4043
4044 if (reg < NUM_FREGS)
4045 return SIM_ARM_FP0_REGNUM + reg;
4046 reg -= NUM_FREGS;
4047
4048 if (reg < NUM_SREGS)
4049 return SIM_ARM_FPS_REGNUM + reg;
4050 reg -= NUM_SREGS;
4051
edefbb7c 4052 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4053}
34e8f22d 4054
a37b3cc0
AC
4055/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
4056 convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
4057 It is thought that this is is the floating-point register format on
4058 little-endian systems. */
c906108c 4059
ed9a39eb 4060static void
b508a996 4061convert_from_extended (const struct floatformat *fmt, const void *ptr,
be8626e0 4062 void *dbl, int endianess)
c906108c 4063{
a37b3cc0 4064 DOUBLEST d;
be8626e0
MD
4065
4066 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4067 floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
4068 else
4069 floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
4070 ptr, &d);
b508a996 4071 floatformat_from_doublest (fmt, &d, dbl);
c906108c
SS
4072}
4073
34e8f22d 4074static void
be8626e0
MD
4075convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
4076 int endianess)
c906108c 4077{
a37b3cc0 4078 DOUBLEST d;
be8626e0 4079
b508a996 4080 floatformat_to_doublest (fmt, ptr, &d);
be8626e0 4081 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4082 floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
4083 else
4084 floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
4085 &d, dbl);
c906108c 4086}
ed9a39eb 4087
d9311bfa
AT
4088/* Like insert_single_step_breakpoint, but make sure we use a breakpoint
4089 of the appropriate mode (as encoded in the PC value), even if this
4090 differs from what would be expected according to the symbol tables. */
4091
4092void
4093arm_insert_single_step_breakpoint (struct gdbarch *gdbarch,
4094 struct address_space *aspace,
4095 CORE_ADDR pc)
c906108c 4096{
d9311bfa
AT
4097 struct cleanup *old_chain
4098 = make_cleanup_restore_integer (&arm_override_mode);
c5aa993b 4099
d9311bfa
AT
4100 arm_override_mode = IS_THUMB_ADDR (pc);
4101 pc = gdbarch_addr_bits_remove (gdbarch, pc);
c5aa993b 4102
d9311bfa 4103 insert_single_step_breakpoint (gdbarch, aspace, pc);
c906108c 4104
d9311bfa
AT
4105 do_cleanups (old_chain);
4106}
c5aa993b 4107
d9311bfa
AT
4108/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4109 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4110 NULL if an error occurs. BUF is freed. */
c906108c 4111
d9311bfa
AT
4112static gdb_byte *
4113extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4114 int old_len, int new_len)
4115{
4116 gdb_byte *new_buf;
4117 int bytes_to_read = new_len - old_len;
c906108c 4118
d9311bfa
AT
4119 new_buf = (gdb_byte *) xmalloc (new_len);
4120 memcpy (new_buf + bytes_to_read, buf, old_len);
4121 xfree (buf);
4122 if (target_read_memory (endaddr - new_len, new_buf, bytes_to_read) != 0)
4123 {
4124 xfree (new_buf);
4125 return NULL;
c906108c 4126 }
d9311bfa 4127 return new_buf;
c906108c
SS
4128}
4129
d9311bfa
AT
4130/* An IT block is at most the 2-byte IT instruction followed by
4131 four 4-byte instructions. The furthest back we must search to
4132 find an IT block that affects the current instruction is thus
4133 2 + 3 * 4 == 14 bytes. */
4134#define MAX_IT_BLOCK_PREFIX 14
177321bd 4135
d9311bfa
AT
4136/* Use a quick scan if there are more than this many bytes of
4137 code. */
4138#define IT_SCAN_THRESHOLD 32
177321bd 4139
d9311bfa
AT
4140/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4141 A breakpoint in an IT block may not be hit, depending on the
4142 condition flags. */
ad527d2e 4143static CORE_ADDR
d9311bfa 4144arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
c906108c 4145{
d9311bfa
AT
4146 gdb_byte *buf;
4147 char map_type;
4148 CORE_ADDR boundary, func_start;
4149 int buf_len;
4150 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4151 int i, any, last_it, last_it_count;
177321bd 4152
d9311bfa
AT
4153 /* If we are using BKPT breakpoints, none of this is necessary. */
4154 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4155 return bpaddr;
177321bd 4156
d9311bfa
AT
4157 /* ARM mode does not have this problem. */
4158 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4159 return bpaddr;
177321bd 4160
d9311bfa
AT
4161 /* We are setting a breakpoint in Thumb code that could potentially
4162 contain an IT block. The first step is to find how much Thumb
4163 code there is; we do not need to read outside of known Thumb
4164 sequences. */
4165 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4166 if (map_type == 0)
4167 /* Thumb-2 code must have mapping symbols to have a chance. */
4168 return bpaddr;
9dca5578 4169
d9311bfa 4170 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
177321bd 4171
d9311bfa
AT
4172 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4173 && func_start > boundary)
4174 boundary = func_start;
9dca5578 4175
d9311bfa
AT
4176 /* Search for a candidate IT instruction. We have to do some fancy
4177 footwork to distinguish a real IT instruction from the second
4178 half of a 32-bit instruction, but there is no need for that if
4179 there's no candidate. */
4180 buf_len = min (bpaddr - boundary, MAX_IT_BLOCK_PREFIX);
4181 if (buf_len == 0)
4182 /* No room for an IT instruction. */
4183 return bpaddr;
c906108c 4184
d9311bfa
AT
4185 buf = (gdb_byte *) xmalloc (buf_len);
4186 if (target_read_memory (bpaddr - buf_len, buf, buf_len) != 0)
4187 return bpaddr;
4188 any = 0;
4189 for (i = 0; i < buf_len; i += 2)
c906108c 4190 {
d9311bfa
AT
4191 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4192 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
25b41d01 4193 {
d9311bfa
AT
4194 any = 1;
4195 break;
25b41d01 4196 }
c906108c 4197 }
d9311bfa
AT
4198
4199 if (any == 0)
c906108c 4200 {
d9311bfa
AT
4201 xfree (buf);
4202 return bpaddr;
f9d67f43
DJ
4203 }
4204
4205 /* OK, the code bytes before this instruction contain at least one
4206 halfword which resembles an IT instruction. We know that it's
4207 Thumb code, but there are still two possibilities. Either the
4208 halfword really is an IT instruction, or it is the second half of
4209 a 32-bit Thumb instruction. The only way we can tell is to
4210 scan forwards from a known instruction boundary. */
4211 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4212 {
4213 int definite;
4214
4215 /* There's a lot of code before this instruction. Start with an
4216 optimistic search; it's easy to recognize halfwords that can
4217 not be the start of a 32-bit instruction, and use that to
4218 lock on to the instruction boundaries. */
4219 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4220 if (buf == NULL)
4221 return bpaddr;
4222 buf_len = IT_SCAN_THRESHOLD;
4223
4224 definite = 0;
4225 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4226 {
4227 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4228 if (thumb_insn_size (inst1) == 2)
4229 {
4230 definite = 1;
4231 break;
4232 }
4233 }
4234
4235 /* At this point, if DEFINITE, BUF[I] is the first place we
4236 are sure that we know the instruction boundaries, and it is far
4237 enough from BPADDR that we could not miss an IT instruction
4238 affecting BPADDR. If ! DEFINITE, give up - start from a
4239 known boundary. */
4240 if (! definite)
4241 {
0963b4bd
MS
4242 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4243 bpaddr - boundary);
f9d67f43
DJ
4244 if (buf == NULL)
4245 return bpaddr;
4246 buf_len = bpaddr - boundary;
4247 i = 0;
4248 }
4249 }
4250 else
4251 {
4252 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4253 if (buf == NULL)
4254 return bpaddr;
4255 buf_len = bpaddr - boundary;
4256 i = 0;
4257 }
4258
4259 /* Scan forwards. Find the last IT instruction before BPADDR. */
4260 last_it = -1;
4261 last_it_count = 0;
4262 while (i < buf_len)
4263 {
4264 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4265 last_it_count--;
4266 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4267 {
4268 last_it = i;
4269 if (inst1 & 0x0001)
4270 last_it_count = 4;
4271 else if (inst1 & 0x0002)
4272 last_it_count = 3;
4273 else if (inst1 & 0x0004)
4274 last_it_count = 2;
4275 else
4276 last_it_count = 1;
4277 }
4278 i += thumb_insn_size (inst1);
4279 }
4280
4281 xfree (buf);
4282
4283 if (last_it == -1)
4284 /* There wasn't really an IT instruction after all. */
4285 return bpaddr;
4286
4287 if (last_it_count < 1)
4288 /* It was too far away. */
4289 return bpaddr;
4290
4291 /* This really is a trouble spot. Move the breakpoint to the IT
4292 instruction. */
4293 return bpaddr - buf_len + last_it;
4294}
4295
cca44b1b 4296/* ARM displaced stepping support.
c906108c 4297
cca44b1b 4298 Generally ARM displaced stepping works as follows:
c906108c 4299
cca44b1b 4300 1. When an instruction is to be single-stepped, it is first decoded by
2ba163c8
SM
4301 arm_process_displaced_insn. Depending on the type of instruction, it is
4302 then copied to a scratch location, possibly in a modified form. The
4303 copy_* set of functions performs such modification, as necessary. A
4304 breakpoint is placed after the modified instruction in the scratch space
4305 to return control to GDB. Note in particular that instructions which
4306 modify the PC will no longer do so after modification.
c5aa993b 4307
cca44b1b
JB
4308 2. The instruction is single-stepped, by setting the PC to the scratch
4309 location address, and resuming. Control returns to GDB when the
4310 breakpoint is hit.
c5aa993b 4311
cca44b1b
JB
4312 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4313 function used for the current instruction. This function's job is to
4314 put the CPU/memory state back to what it would have been if the
4315 instruction had been executed unmodified in its original location. */
c5aa993b 4316
cca44b1b
JB
4317/* NOP instruction (mov r0, r0). */
4318#define ARM_NOP 0xe1a00000
34518530 4319#define THUMB_NOP 0x4600
cca44b1b
JB
4320
4321/* Helper for register reads for displaced stepping. In particular, this
4322 returns the PC as it would be seen by the instruction at its original
4323 location. */
4324
4325ULONGEST
36073a92
YQ
4326displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4327 int regno)
cca44b1b
JB
4328{
4329 ULONGEST ret;
36073a92 4330 CORE_ADDR from = dsc->insn_addr;
cca44b1b 4331
bf9f652a 4332 if (regno == ARM_PC_REGNUM)
cca44b1b 4333 {
4db71c0b
YQ
4334 /* Compute pipeline offset:
4335 - When executing an ARM instruction, PC reads as the address of the
4336 current instruction plus 8.
4337 - When executing a Thumb instruction, PC reads as the address of the
4338 current instruction plus 4. */
4339
36073a92 4340 if (!dsc->is_thumb)
4db71c0b
YQ
4341 from += 8;
4342 else
4343 from += 4;
4344
cca44b1b
JB
4345 if (debug_displaced)
4346 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
4347 (unsigned long) from);
4348 return (ULONGEST) from;
cca44b1b 4349 }
c906108c 4350 else
cca44b1b
JB
4351 {
4352 regcache_cooked_read_unsigned (regs, regno, &ret);
4353 if (debug_displaced)
4354 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4355 regno, (unsigned long) ret);
4356 return ret;
4357 }
c906108c
SS
4358}
4359
cca44b1b
JB
4360static int
4361displaced_in_arm_mode (struct regcache *regs)
4362{
4363 ULONGEST ps;
9779414d 4364 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
66e810cd 4365
cca44b1b 4366 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 4367
9779414d 4368 return (ps & t_bit) == 0;
cca44b1b 4369}
66e810cd 4370
cca44b1b 4371/* Write to the PC as from a branch instruction. */
c906108c 4372
cca44b1b 4373static void
36073a92
YQ
4374branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4375 ULONGEST val)
c906108c 4376{
36073a92 4377 if (!dsc->is_thumb)
cca44b1b
JB
4378 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4379 architecture versions < 6. */
0963b4bd
MS
4380 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4381 val & ~(ULONGEST) 0x3);
cca44b1b 4382 else
0963b4bd
MS
4383 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4384 val & ~(ULONGEST) 0x1);
cca44b1b 4385}
66e810cd 4386
cca44b1b
JB
4387/* Write to the PC as from a branch-exchange instruction. */
4388
4389static void
4390bx_write_pc (struct regcache *regs, ULONGEST val)
4391{
4392 ULONGEST ps;
9779414d 4393 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
cca44b1b
JB
4394
4395 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4396
4397 if ((val & 1) == 1)
c906108c 4398 {
9779414d 4399 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
4400 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4401 }
4402 else if ((val & 2) == 0)
4403 {
9779414d 4404 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4405 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
4406 }
4407 else
4408 {
cca44b1b
JB
4409 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4410 mode, align dest to 4 bytes). */
4411 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 4412 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4413 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
4414 }
4415}
ed9a39eb 4416
cca44b1b 4417/* Write to the PC as if from a load instruction. */
ed9a39eb 4418
34e8f22d 4419static void
36073a92
YQ
4420load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4421 ULONGEST val)
ed9a39eb 4422{
cca44b1b
JB
4423 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4424 bx_write_pc (regs, val);
4425 else
36073a92 4426 branch_write_pc (regs, dsc, val);
cca44b1b 4427}
be8626e0 4428
cca44b1b
JB
4429/* Write to the PC as if from an ALU instruction. */
4430
4431static void
36073a92
YQ
4432alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4433 ULONGEST val)
cca44b1b 4434{
36073a92 4435 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
4436 bx_write_pc (regs, val);
4437 else
36073a92 4438 branch_write_pc (regs, dsc, val);
cca44b1b
JB
4439}
4440
4441/* Helper for writing to registers for displaced stepping. Writing to the PC
4442 has a varying effects depending on the instruction which does the write:
4443 this is controlled by the WRITE_PC argument. */
4444
4445void
4446displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4447 int regno, ULONGEST val, enum pc_write_style write_pc)
4448{
bf9f652a 4449 if (regno == ARM_PC_REGNUM)
08216dd7 4450 {
cca44b1b
JB
4451 if (debug_displaced)
4452 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4453 (unsigned long) val);
4454 switch (write_pc)
08216dd7 4455 {
cca44b1b 4456 case BRANCH_WRITE_PC:
36073a92 4457 branch_write_pc (regs, dsc, val);
08216dd7
RE
4458 break;
4459
cca44b1b
JB
4460 case BX_WRITE_PC:
4461 bx_write_pc (regs, val);
4462 break;
4463
4464 case LOAD_WRITE_PC:
36073a92 4465 load_write_pc (regs, dsc, val);
cca44b1b
JB
4466 break;
4467
4468 case ALU_WRITE_PC:
36073a92 4469 alu_write_pc (regs, dsc, val);
cca44b1b
JB
4470 break;
4471
4472 case CANNOT_WRITE_PC:
4473 warning (_("Instruction wrote to PC in an unexpected way when "
4474 "single-stepping"));
08216dd7
RE
4475 break;
4476
4477 default:
97b9747c
JB
4478 internal_error (__FILE__, __LINE__,
4479 _("Invalid argument to displaced_write_reg"));
08216dd7 4480 }
b508a996 4481
cca44b1b 4482 dsc->wrote_to_pc = 1;
b508a996 4483 }
ed9a39eb 4484 else
b508a996 4485 {
cca44b1b
JB
4486 if (debug_displaced)
4487 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4488 regno, (unsigned long) val);
4489 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 4490 }
34e8f22d
RE
4491}
4492
cca44b1b
JB
4493/* This function is used to concisely determine if an instruction INSN
4494 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
4495 corresponding fields of BITMASK set to 0b1111. The function
4496 returns return 1 if any of these fields in INSN reference the PC
4497 (also 0b1111, r15), else it returns 0. */
67255d04
RE
4498
4499static int
cca44b1b 4500insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 4501{
cca44b1b 4502 uint32_t lowbit = 1;
67255d04 4503
cca44b1b
JB
4504 while (bitmask != 0)
4505 {
4506 uint32_t mask;
44e1a9eb 4507
cca44b1b
JB
4508 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4509 ;
67255d04 4510
cca44b1b
JB
4511 if (!lowbit)
4512 break;
67255d04 4513
cca44b1b 4514 mask = lowbit * 0xf;
67255d04 4515
cca44b1b
JB
4516 if ((insn & mask) == mask)
4517 return 1;
4518
4519 bitmask &= ~mask;
67255d04
RE
4520 }
4521
cca44b1b
JB
4522 return 0;
4523}
2af48f68 4524
cca44b1b
JB
4525/* The simplest copy function. Many instructions have the same effect no
4526 matter what address they are executed at: in those cases, use this. */
67255d04 4527
cca44b1b 4528static int
7ff120b4
YQ
4529arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
4530 const char *iname, struct displaced_step_closure *dsc)
cca44b1b
JB
4531{
4532 if (debug_displaced)
4533 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4534 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4535 iname);
67255d04 4536
cca44b1b 4537 dsc->modinsn[0] = insn;
67255d04 4538
cca44b1b
JB
4539 return 0;
4540}
4541
34518530
YQ
4542static int
4543thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4544 uint16_t insn2, const char *iname,
4545 struct displaced_step_closure *dsc)
4546{
4547 if (debug_displaced)
4548 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4549 "opcode/class '%s' unmodified\n", insn1, insn2,
4550 iname);
4551
4552 dsc->modinsn[0] = insn1;
4553 dsc->modinsn[1] = insn2;
4554 dsc->numinsns = 2;
4555
4556 return 0;
4557}
4558
4559/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4560 modification. */
4561static int
615234c1 4562thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
34518530
YQ
4563 const char *iname,
4564 struct displaced_step_closure *dsc)
4565{
4566 if (debug_displaced)
4567 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4568 "opcode/class '%s' unmodified\n", insn,
4569 iname);
4570
4571 dsc->modinsn[0] = insn;
4572
4573 return 0;
4574}
4575
cca44b1b
JB
4576/* Preload instructions with immediate offset. */
4577
4578static void
6e39997a 4579cleanup_preload (struct gdbarch *gdbarch,
cca44b1b
JB
4580 struct regcache *regs, struct displaced_step_closure *dsc)
4581{
4582 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4583 if (!dsc->u.preload.immed)
4584 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4585}
4586
7ff120b4
YQ
4587static void
4588install_preload (struct gdbarch *gdbarch, struct regcache *regs,
4589 struct displaced_step_closure *dsc, unsigned int rn)
cca44b1b 4590{
cca44b1b 4591 ULONGEST rn_val;
cca44b1b
JB
4592 /* Preload instructions:
4593
4594 {pli/pld} [rn, #+/-imm]
4595 ->
4596 {pli/pld} [r0, #+/-imm]. */
4597
36073a92
YQ
4598 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4599 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 4600 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
4601 dsc->u.preload.immed = 1;
4602
cca44b1b 4603 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
4604}
4605
cca44b1b 4606static int
7ff120b4 4607arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cca44b1b
JB
4608 struct displaced_step_closure *dsc)
4609{
4610 unsigned int rn = bits (insn, 16, 19);
cca44b1b 4611
7ff120b4
YQ
4612 if (!insn_references_pc (insn, 0x000f0000ul))
4613 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
4614
4615 if (debug_displaced)
4616 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4617 (unsigned long) insn);
4618
7ff120b4
YQ
4619 dsc->modinsn[0] = insn & 0xfff0ffff;
4620
4621 install_preload (gdbarch, regs, dsc, rn);
4622
4623 return 0;
4624}
4625
34518530
YQ
4626static int
4627thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
4628 struct regcache *regs, struct displaced_step_closure *dsc)
4629{
4630 unsigned int rn = bits (insn1, 0, 3);
4631 unsigned int u_bit = bit (insn1, 7);
4632 int imm12 = bits (insn2, 0, 11);
4633 ULONGEST pc_val;
4634
4635 if (rn != ARM_PC_REGNUM)
4636 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4637
4638 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4639 PLD (literal) Encoding T1. */
4640 if (debug_displaced)
4641 fprintf_unfiltered (gdb_stdlog,
4642 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4643 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4644 imm12);
4645
4646 if (!u_bit)
4647 imm12 = -1 * imm12;
4648
4649 /* Rewrite instruction {pli/pld} PC imm12 into:
4650 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4651
4652 {pli/pld} [r0, r1]
4653
4654 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4655
4656 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4657 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4658
4659 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4660
4661 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4662 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4663 dsc->u.preload.immed = 0;
4664
4665 /* {pli/pld} [r0, r1] */
4666 dsc->modinsn[0] = insn1 & 0xfff0;
4667 dsc->modinsn[1] = 0xf001;
4668 dsc->numinsns = 2;
4669
4670 dsc->cleanup = &cleanup_preload;
4671 return 0;
4672}
4673
7ff120b4
YQ
4674/* Preload instructions with register offset. */
4675
4676static void
4677install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
4678 struct displaced_step_closure *dsc, unsigned int rn,
4679 unsigned int rm)
4680{
4681 ULONGEST rn_val, rm_val;
4682
cca44b1b
JB
4683 /* Preload register-offset instructions:
4684
4685 {pli/pld} [rn, rm {, shift}]
4686 ->
4687 {pli/pld} [r0, r1 {, shift}]. */
4688
36073a92
YQ
4689 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4690 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4691 rn_val = displaced_read_reg (regs, dsc, rn);
4692 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
4693 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4694 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
4695 dsc->u.preload.immed = 0;
4696
cca44b1b 4697 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
4698}
4699
4700static int
4701arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4702 struct regcache *regs,
4703 struct displaced_step_closure *dsc)
4704{
4705 unsigned int rn = bits (insn, 16, 19);
4706 unsigned int rm = bits (insn, 0, 3);
4707
4708
4709 if (!insn_references_pc (insn, 0x000f000ful))
4710 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4711
4712 if (debug_displaced)
4713 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4714 (unsigned long) insn);
4715
4716 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 4717
7ff120b4 4718 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
4719 return 0;
4720}
4721
4722/* Copy/cleanup coprocessor load and store instructions. */
4723
4724static void
6e39997a 4725cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b
JB
4726 struct regcache *regs,
4727 struct displaced_step_closure *dsc)
4728{
36073a92 4729 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
4730
4731 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4732
4733 if (dsc->u.ldst.writeback)
4734 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4735}
4736
7ff120b4
YQ
4737static void
4738install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
4739 struct displaced_step_closure *dsc,
4740 int writeback, unsigned int rn)
cca44b1b 4741{
cca44b1b 4742 ULONGEST rn_val;
cca44b1b 4743
cca44b1b
JB
4744 /* Coprocessor load/store instructions:
4745
4746 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4747 ->
4748 {stc/stc2} [r0, #+/-imm].
4749
4750 ldc/ldc2 are handled identically. */
4751
36073a92
YQ
4752 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4753 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
4754 /* PC should be 4-byte aligned. */
4755 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
4756 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4757
7ff120b4 4758 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
4759 dsc->u.ldst.rn = rn;
4760
7ff120b4
YQ
4761 dsc->cleanup = &cleanup_copro_load_store;
4762}
4763
4764static int
4765arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4766 struct regcache *regs,
4767 struct displaced_step_closure *dsc)
4768{
4769 unsigned int rn = bits (insn, 16, 19);
4770
4771 if (!insn_references_pc (insn, 0x000f0000ul))
4772 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4773
4774 if (debug_displaced)
4775 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4776 "load/store insn %.8lx\n", (unsigned long) insn);
4777
cca44b1b
JB
4778 dsc->modinsn[0] = insn & 0xfff0ffff;
4779
7ff120b4 4780 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
4781
4782 return 0;
4783}
4784
34518530
YQ
4785static int
4786thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4787 uint16_t insn2, struct regcache *regs,
4788 struct displaced_step_closure *dsc)
4789{
4790 unsigned int rn = bits (insn1, 0, 3);
4791
4792 if (rn != ARM_PC_REGNUM)
4793 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4794 "copro load/store", dsc);
4795
4796 if (debug_displaced)
4797 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4798 "load/store insn %.4x%.4x\n", insn1, insn2);
4799
4800 dsc->modinsn[0] = insn1 & 0xfff0;
4801 dsc->modinsn[1] = insn2;
4802 dsc->numinsns = 2;
4803
4804 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4805 doesn't support writeback, so pass 0. */
4806 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4807
4808 return 0;
4809}
4810
cca44b1b
JB
4811/* Clean up branch instructions (actually perform the branch, by setting
4812 PC). */
4813
4814static void
6e39997a 4815cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
4816 struct displaced_step_closure *dsc)
4817{
36073a92 4818 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
4819 int branch_taken = condition_true (dsc->u.branch.cond, status);
4820 enum pc_write_style write_pc = dsc->u.branch.exchange
4821 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4822
4823 if (!branch_taken)
4824 return;
4825
4826 if (dsc->u.branch.link)
4827 {
8c8dba6d
YQ
4828 /* The value of LR should be the next insn of current one. In order
4829 not to confuse logic hanlding later insn `bx lr', if current insn mode
4830 is Thumb, the bit 0 of LR value should be set to 1. */
4831 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4832
4833 if (dsc->is_thumb)
4834 next_insn_addr |= 0x1;
4835
4836 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4837 CANNOT_WRITE_PC);
cca44b1b
JB
4838 }
4839
bf9f652a 4840 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
4841}
4842
4843/* Copy B/BL/BLX instructions with immediate destinations. */
4844
7ff120b4
YQ
4845static void
4846install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
4847 struct displaced_step_closure *dsc,
4848 unsigned int cond, int exchange, int link, long offset)
4849{
4850 /* Implement "BL<cond> <label>" as:
4851
4852 Preparation: cond <- instruction condition
4853 Insn: mov r0, r0 (nop)
4854 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4855
4856 B<cond> similar, but don't set r14 in cleanup. */
4857
4858 dsc->u.branch.cond = cond;
4859 dsc->u.branch.link = link;
4860 dsc->u.branch.exchange = exchange;
4861
2b16b2e3
YQ
4862 dsc->u.branch.dest = dsc->insn_addr;
4863 if (link && exchange)
4864 /* For BLX, offset is computed from the Align (PC, 4). */
4865 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4866
7ff120b4 4867 if (dsc->is_thumb)
2b16b2e3 4868 dsc->u.branch.dest += 4 + offset;
7ff120b4 4869 else
2b16b2e3 4870 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
4871
4872 dsc->cleanup = &cleanup_branch;
4873}
cca44b1b 4874static int
7ff120b4
YQ
4875arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
4876 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
4877{
4878 unsigned int cond = bits (insn, 28, 31);
4879 int exchange = (cond == 0xf);
4880 int link = exchange || bit (insn, 24);
cca44b1b
JB
4881 long offset;
4882
4883 if (debug_displaced)
4884 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4885 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4886 (unsigned long) insn);
cca44b1b
JB
4887 if (exchange)
4888 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4889 then arrange the switch into Thumb mode. */
4890 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4891 else
4892 offset = bits (insn, 0, 23) << 2;
4893
4894 if (bit (offset, 25))
4895 offset = offset | ~0x3ffffff;
4896
cca44b1b
JB
4897 dsc->modinsn[0] = ARM_NOP;
4898
7ff120b4 4899 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
4900 return 0;
4901}
4902
34518530
YQ
4903static int
4904thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4905 uint16_t insn2, struct regcache *regs,
4906 struct displaced_step_closure *dsc)
4907{
4908 int link = bit (insn2, 14);
4909 int exchange = link && !bit (insn2, 12);
4910 int cond = INST_AL;
4911 long offset = 0;
4912 int j1 = bit (insn2, 13);
4913 int j2 = bit (insn2, 11);
4914 int s = sbits (insn1, 10, 10);
4915 int i1 = !(j1 ^ bit (insn1, 10));
4916 int i2 = !(j2 ^ bit (insn1, 10));
4917
4918 if (!link && !exchange) /* B */
4919 {
4920 offset = (bits (insn2, 0, 10) << 1);
4921 if (bit (insn2, 12)) /* Encoding T4 */
4922 {
4923 offset |= (bits (insn1, 0, 9) << 12)
4924 | (i2 << 22)
4925 | (i1 << 23)
4926 | (s << 24);
4927 cond = INST_AL;
4928 }
4929 else /* Encoding T3 */
4930 {
4931 offset |= (bits (insn1, 0, 5) << 12)
4932 | (j1 << 18)
4933 | (j2 << 19)
4934 | (s << 20);
4935 cond = bits (insn1, 6, 9);
4936 }
4937 }
4938 else
4939 {
4940 offset = (bits (insn1, 0, 9) << 12);
4941 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
4942 offset |= exchange ?
4943 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
4944 }
4945
4946 if (debug_displaced)
4947 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
4948 "%.4x %.4x with offset %.8lx\n",
4949 link ? (exchange) ? "blx" : "bl" : "b",
4950 insn1, insn2, offset);
4951
4952 dsc->modinsn[0] = THUMB_NOP;
4953
4954 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4955 return 0;
4956}
4957
4958/* Copy B Thumb instructions. */
4959static int
615234c1 4960thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
34518530
YQ
4961 struct displaced_step_closure *dsc)
4962{
4963 unsigned int cond = 0;
4964 int offset = 0;
4965 unsigned short bit_12_15 = bits (insn, 12, 15);
4966 CORE_ADDR from = dsc->insn_addr;
4967
4968 if (bit_12_15 == 0xd)
4969 {
4970 /* offset = SignExtend (imm8:0, 32) */
4971 offset = sbits ((insn << 1), 0, 8);
4972 cond = bits (insn, 8, 11);
4973 }
4974 else if (bit_12_15 == 0xe) /* Encoding T2 */
4975 {
4976 offset = sbits ((insn << 1), 0, 11);
4977 cond = INST_AL;
4978 }
4979
4980 if (debug_displaced)
4981 fprintf_unfiltered (gdb_stdlog,
4982 "displaced: copying b immediate insn %.4x "
4983 "with offset %d\n", insn, offset);
4984
4985 dsc->u.branch.cond = cond;
4986 dsc->u.branch.link = 0;
4987 dsc->u.branch.exchange = 0;
4988 dsc->u.branch.dest = from + 4 + offset;
4989
4990 dsc->modinsn[0] = THUMB_NOP;
4991
4992 dsc->cleanup = &cleanup_branch;
4993
4994 return 0;
4995}
4996
cca44b1b
JB
4997/* Copy BX/BLX with register-specified destinations. */
4998
7ff120b4
YQ
4999static void
5000install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
5001 struct displaced_step_closure *dsc, int link,
5002 unsigned int cond, unsigned int rm)
cca44b1b 5003{
cca44b1b
JB
5004 /* Implement {BX,BLX}<cond> <reg>" as:
5005
5006 Preparation: cond <- instruction condition
5007 Insn: mov r0, r0 (nop)
5008 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5009
5010 Don't set r14 in cleanup for BX. */
5011
36073a92 5012 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5013
5014 dsc->u.branch.cond = cond;
5015 dsc->u.branch.link = link;
cca44b1b 5016
7ff120b4 5017 dsc->u.branch.exchange = 1;
cca44b1b
JB
5018
5019 dsc->cleanup = &cleanup_branch;
7ff120b4 5020}
cca44b1b 5021
7ff120b4
YQ
5022static int
5023arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
5024 struct regcache *regs, struct displaced_step_closure *dsc)
5025{
5026 unsigned int cond = bits (insn, 28, 31);
5027 /* BX: x12xxx1x
5028 BLX: x12xxx3x. */
5029 int link = bit (insn, 5);
5030 unsigned int rm = bits (insn, 0, 3);
5031
5032 if (debug_displaced)
5033 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5034 (unsigned long) insn);
5035
5036 dsc->modinsn[0] = ARM_NOP;
5037
5038 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
5039 return 0;
5040}
5041
34518530
YQ
5042static int
5043thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5044 struct regcache *regs,
5045 struct displaced_step_closure *dsc)
5046{
5047 int link = bit (insn, 7);
5048 unsigned int rm = bits (insn, 3, 6);
5049
5050 if (debug_displaced)
5051 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5052 (unsigned short) insn);
5053
5054 dsc->modinsn[0] = THUMB_NOP;
5055
5056 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5057
5058 return 0;
5059}
5060
5061
0963b4bd 5062/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
5063
5064static void
6e39997a 5065cleanup_alu_imm (struct gdbarch *gdbarch,
cca44b1b
JB
5066 struct regcache *regs, struct displaced_step_closure *dsc)
5067{
36073a92 5068 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5069 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5070 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5071 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5072}
5073
5074static int
7ff120b4
YQ
5075arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5076 struct displaced_step_closure *dsc)
cca44b1b
JB
5077{
5078 unsigned int rn = bits (insn, 16, 19);
5079 unsigned int rd = bits (insn, 12, 15);
5080 unsigned int op = bits (insn, 21, 24);
5081 int is_mov = (op == 0xd);
5082 ULONGEST rd_val, rn_val;
cca44b1b
JB
5083
5084 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 5085 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
5086
5087 if (debug_displaced)
5088 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5089 "%.8lx\n", is_mov ? "move" : "ALU",
5090 (unsigned long) insn);
5091
5092 /* Instruction is of form:
5093
5094 <op><cond> rd, [rn,] #imm
5095
5096 Rewrite as:
5097
5098 Preparation: tmp1, tmp2 <- r0, r1;
5099 r0, r1 <- rd, rn
5100 Insn: <op><cond> r0, r1, #imm
5101 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5102 */
5103
36073a92
YQ
5104 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5105 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5106 rn_val = displaced_read_reg (regs, dsc, rn);
5107 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
5108 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5109 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5110 dsc->rd = rd;
5111
5112 if (is_mov)
5113 dsc->modinsn[0] = insn & 0xfff00fff;
5114 else
5115 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5116
5117 dsc->cleanup = &cleanup_alu_imm;
5118
5119 return 0;
5120}
5121
34518530
YQ
5122static int
5123thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5124 uint16_t insn2, struct regcache *regs,
5125 struct displaced_step_closure *dsc)
5126{
5127 unsigned int op = bits (insn1, 5, 8);
5128 unsigned int rn, rm, rd;
5129 ULONGEST rd_val, rn_val;
5130
5131 rn = bits (insn1, 0, 3); /* Rn */
5132 rm = bits (insn2, 0, 3); /* Rm */
5133 rd = bits (insn2, 8, 11); /* Rd */
5134
5135 /* This routine is only called for instruction MOV. */
5136 gdb_assert (op == 0x2 && rn == 0xf);
5137
5138 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5139 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5140
5141 if (debug_displaced)
5142 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5143 "ALU", insn1, insn2);
5144
5145 /* Instruction is of form:
5146
5147 <op><cond> rd, [rn,] #imm
5148
5149 Rewrite as:
5150
5151 Preparation: tmp1, tmp2 <- r0, r1;
5152 r0, r1 <- rd, rn
5153 Insn: <op><cond> r0, r1, #imm
5154 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5155 */
5156
5157 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5158 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5159 rn_val = displaced_read_reg (regs, dsc, rn);
5160 rd_val = displaced_read_reg (regs, dsc, rd);
5161 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5162 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5163 dsc->rd = rd;
5164
5165 dsc->modinsn[0] = insn1;
5166 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5167 dsc->numinsns = 2;
5168
5169 dsc->cleanup = &cleanup_alu_imm;
5170
5171 return 0;
5172}
5173
cca44b1b
JB
5174/* Copy/cleanup arithmetic/logic insns with register RHS. */
5175
5176static void
6e39997a 5177cleanup_alu_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5178 struct regcache *regs, struct displaced_step_closure *dsc)
5179{
5180 ULONGEST rd_val;
5181 int i;
5182
36073a92 5183 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5184
5185 for (i = 0; i < 3; i++)
5186 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5187
5188 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5189}
5190
7ff120b4
YQ
5191static void
5192install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
5193 struct displaced_step_closure *dsc,
5194 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 5195{
cca44b1b 5196 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 5197
cca44b1b
JB
5198 /* Instruction is of form:
5199
5200 <op><cond> rd, [rn,] rm [, <shift>]
5201
5202 Rewrite as:
5203
5204 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5205 r0, r1, r2 <- rd, rn, rm
ef713951 5206 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
5207 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5208 */
5209
36073a92
YQ
5210 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5211 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5212 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5213 rd_val = displaced_read_reg (regs, dsc, rd);
5214 rn_val = displaced_read_reg (regs, dsc, rn);
5215 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5216 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5217 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5218 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5219 dsc->rd = rd;
5220
7ff120b4
YQ
5221 dsc->cleanup = &cleanup_alu_reg;
5222}
5223
5224static int
5225arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5226 struct displaced_step_closure *dsc)
5227{
5228 unsigned int op = bits (insn, 21, 24);
5229 int is_mov = (op == 0xd);
5230
5231 if (!insn_references_pc (insn, 0x000ff00ful))
5232 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5233
5234 if (debug_displaced)
5235 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5236 is_mov ? "move" : "ALU", (unsigned long) insn);
5237
cca44b1b
JB
5238 if (is_mov)
5239 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5240 else
5241 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5242
7ff120b4
YQ
5243 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5244 bits (insn, 0, 3));
cca44b1b
JB
5245 return 0;
5246}
5247
34518530
YQ
5248static int
5249thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5250 struct regcache *regs,
5251 struct displaced_step_closure *dsc)
5252{
ef713951 5253 unsigned rm, rd;
34518530 5254
ef713951
YQ
5255 rm = bits (insn, 3, 6);
5256 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 5257
ef713951 5258 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
5259 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5260
5261 if (debug_displaced)
ef713951
YQ
5262 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5263 (unsigned short) insn);
34518530 5264
ef713951 5265 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 5266
ef713951 5267 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
5268
5269 return 0;
5270}
5271
cca44b1b
JB
5272/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5273
5274static void
6e39997a 5275cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5276 struct regcache *regs,
5277 struct displaced_step_closure *dsc)
5278{
36073a92 5279 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5280 int i;
5281
5282 for (i = 0; i < 4; i++)
5283 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5284
5285 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5286}
5287
7ff120b4
YQ
5288static void
5289install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
5290 struct displaced_step_closure *dsc,
5291 unsigned int rd, unsigned int rn, unsigned int rm,
5292 unsigned rs)
cca44b1b 5293{
7ff120b4 5294 int i;
cca44b1b 5295 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 5296
cca44b1b
JB
5297 /* Instruction is of form:
5298
5299 <op><cond> rd, [rn,] rm, <shift> rs
5300
5301 Rewrite as:
5302
5303 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5304 r0, r1, r2, r3 <- rd, rn, rm, rs
5305 Insn: <op><cond> r0, r1, r2, <shift> r3
5306 Cleanup: tmp5 <- r0
5307 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5308 rd <- tmp5
5309 */
5310
5311 for (i = 0; i < 4; i++)
36073a92 5312 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 5313
36073a92
YQ
5314 rd_val = displaced_read_reg (regs, dsc, rd);
5315 rn_val = displaced_read_reg (regs, dsc, rn);
5316 rm_val = displaced_read_reg (regs, dsc, rm);
5317 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
5318 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5319 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5320 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5321 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5322 dsc->rd = rd;
7ff120b4
YQ
5323 dsc->cleanup = &cleanup_alu_shifted_reg;
5324}
5325
5326static int
5327arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5328 struct regcache *regs,
5329 struct displaced_step_closure *dsc)
5330{
5331 unsigned int op = bits (insn, 21, 24);
5332 int is_mov = (op == 0xd);
5333 unsigned int rd, rn, rm, rs;
5334
5335 if (!insn_references_pc (insn, 0x000fff0ful))
5336 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5337
5338 if (debug_displaced)
5339 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5340 "%.8lx\n", is_mov ? "move" : "ALU",
5341 (unsigned long) insn);
5342
5343 rn = bits (insn, 16, 19);
5344 rm = bits (insn, 0, 3);
5345 rs = bits (insn, 8, 11);
5346 rd = bits (insn, 12, 15);
cca44b1b
JB
5347
5348 if (is_mov)
5349 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5350 else
5351 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5352
7ff120b4 5353 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
5354
5355 return 0;
5356}
5357
5358/* Clean up load instructions. */
5359
5360static void
6e39997a 5361cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5362 struct displaced_step_closure *dsc)
5363{
5364 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 5365
36073a92 5366 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 5367 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
5368 rt_val2 = displaced_read_reg (regs, dsc, 1);
5369 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5370
5371 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5372 if (dsc->u.ldst.xfersize > 4)
5373 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5374 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5375 if (!dsc->u.ldst.immed)
5376 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5377
5378 /* Handle register writeback. */
5379 if (dsc->u.ldst.writeback)
5380 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5381 /* Put result in right place. */
5382 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5383 if (dsc->u.ldst.xfersize == 8)
5384 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5385}
5386
5387/* Clean up store instructions. */
5388
5389static void
6e39997a 5390cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5391 struct displaced_step_closure *dsc)
5392{
36073a92 5393 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5394
5395 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5396 if (dsc->u.ldst.xfersize > 4)
5397 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5398 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5399 if (!dsc->u.ldst.immed)
5400 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5401 if (!dsc->u.ldst.restore_r4)
5402 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5403
5404 /* Writeback. */
5405 if (dsc->u.ldst.writeback)
5406 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5407}
5408
5409/* Copy "extra" load/store instructions. These are halfword/doubleword
5410 transfers, which have a different encoding to byte/word transfers. */
5411
5412static int
550dc4e2 5413arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
7ff120b4 5414 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
5415{
5416 unsigned int op1 = bits (insn, 20, 24);
5417 unsigned int op2 = bits (insn, 5, 6);
5418 unsigned int rt = bits (insn, 12, 15);
5419 unsigned int rn = bits (insn, 16, 19);
5420 unsigned int rm = bits (insn, 0, 3);
5421 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5422 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5423 int immed = (op1 & 0x4) != 0;
5424 int opcode;
5425 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
5426
5427 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 5428 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
5429
5430 if (debug_displaced)
5431 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
550dc4e2 5432 "insn %.8lx\n", unprivileged ? "unprivileged " : "",
cca44b1b
JB
5433 (unsigned long) insn);
5434
5435 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5436
5437 if (opcode < 0)
5438 internal_error (__FILE__, __LINE__,
5439 _("copy_extra_ld_st: instruction decode error"));
5440
36073a92
YQ
5441 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5442 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5443 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5444 if (!immed)
36073a92 5445 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5446
36073a92 5447 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 5448 if (bytesize[opcode] == 8)
36073a92
YQ
5449 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5450 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5451 if (!immed)
36073a92 5452 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5453
5454 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5455 if (bytesize[opcode] == 8)
5456 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5457 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5458 if (!immed)
5459 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5460
5461 dsc->rd = rt;
5462 dsc->u.ldst.xfersize = bytesize[opcode];
5463 dsc->u.ldst.rn = rn;
5464 dsc->u.ldst.immed = immed;
5465 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5466 dsc->u.ldst.restore_r4 = 0;
5467
5468 if (immed)
5469 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5470 ->
5471 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5472 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5473 else
5474 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5475 ->
5476 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5477 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5478
5479 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5480
5481 return 0;
5482}
5483
0f6f04ba 5484/* Copy byte/half word/word loads and stores. */
cca44b1b 5485
7ff120b4 5486static void
0f6f04ba
YQ
5487install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5488 struct displaced_step_closure *dsc, int load,
5489 int immed, int writeback, int size, int usermode,
5490 int rt, int rm, int rn)
cca44b1b 5491{
cca44b1b 5492 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 5493
36073a92
YQ
5494 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5495 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5496 if (!immed)
36073a92 5497 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5498 if (!load)
36073a92 5499 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 5500
36073a92
YQ
5501 rt_val = displaced_read_reg (regs, dsc, rt);
5502 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5503 if (!immed)
36073a92 5504 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5505
5506 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5507 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5508 if (!immed)
5509 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 5510 dsc->rd = rt;
0f6f04ba 5511 dsc->u.ldst.xfersize = size;
cca44b1b
JB
5512 dsc->u.ldst.rn = rn;
5513 dsc->u.ldst.immed = immed;
7ff120b4 5514 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5515
5516 /* To write PC we can do:
5517
494e194e
YQ
5518 Before this sequence of instructions:
5519 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5520 r2 is the Rn value got from dispalced_read_reg.
5521
5522 Insn1: push {pc} Write address of STR instruction + offset on stack
5523 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5524 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5525 = addr(Insn1) + offset - addr(Insn3) - 8
5526 = offset - 16
5527 Insn4: add r4, r4, #8 r4 = offset - 8
5528 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5529 = from + offset
5530 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
5531
5532 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
5533 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5534 of this can be found in Section "Saving from r15" in
5535 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 5536
7ff120b4
YQ
5537 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5538}
5539
34518530
YQ
5540
5541static int
5542thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5543 uint16_t insn2, struct regcache *regs,
5544 struct displaced_step_closure *dsc, int size)
5545{
5546 unsigned int u_bit = bit (insn1, 7);
5547 unsigned int rt = bits (insn2, 12, 15);
5548 int imm12 = bits (insn2, 0, 11);
5549 ULONGEST pc_val;
5550
5551 if (debug_displaced)
5552 fprintf_unfiltered (gdb_stdlog,
5553 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5554 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5555 imm12);
5556
5557 if (!u_bit)
5558 imm12 = -1 * imm12;
5559
5560 /* Rewrite instruction LDR Rt imm12 into:
5561
5562 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5563
5564 LDR R0, R2, R3,
5565
5566 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5567
5568
5569 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5570 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5571 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5572
5573 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5574
5575 pc_val = pc_val & 0xfffffffc;
5576
5577 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5578 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5579
5580 dsc->rd = rt;
5581
5582 dsc->u.ldst.xfersize = size;
5583 dsc->u.ldst.immed = 0;
5584 dsc->u.ldst.writeback = 0;
5585 dsc->u.ldst.restore_r4 = 0;
5586
5587 /* LDR R0, R2, R3 */
5588 dsc->modinsn[0] = 0xf852;
5589 dsc->modinsn[1] = 0x3;
5590 dsc->numinsns = 2;
5591
5592 dsc->cleanup = &cleanup_load;
5593
5594 return 0;
5595}
5596
5597static int
5598thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5599 uint16_t insn2, struct regcache *regs,
5600 struct displaced_step_closure *dsc,
5601 int writeback, int immed)
5602{
5603 unsigned int rt = bits (insn2, 12, 15);
5604 unsigned int rn = bits (insn1, 0, 3);
5605 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5606 /* In LDR (register), there is also a register Rm, which is not allowed to
5607 be PC, so we don't have to check it. */
5608
5609 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5610 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5611 dsc);
5612
5613 if (debug_displaced)
5614 fprintf_unfiltered (gdb_stdlog,
5615 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5616 rt, rn, insn1, insn2);
5617
5618 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5619 0, rt, rm, rn);
5620
5621 dsc->u.ldst.restore_r4 = 0;
5622
5623 if (immed)
5624 /* ldr[b]<cond> rt, [rn, #imm], etc.
5625 ->
5626 ldr[b]<cond> r0, [r2, #imm]. */
5627 {
5628 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5629 dsc->modinsn[1] = insn2 & 0x0fff;
5630 }
5631 else
5632 /* ldr[b]<cond> rt, [rn, rm], etc.
5633 ->
5634 ldr[b]<cond> r0, [r2, r3]. */
5635 {
5636 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5637 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5638 }
5639
5640 dsc->numinsns = 2;
5641
5642 return 0;
5643}
5644
5645
7ff120b4
YQ
5646static int
5647arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5648 struct regcache *regs,
5649 struct displaced_step_closure *dsc,
0f6f04ba 5650 int load, int size, int usermode)
7ff120b4
YQ
5651{
5652 int immed = !bit (insn, 25);
5653 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5654 unsigned int rt = bits (insn, 12, 15);
5655 unsigned int rn = bits (insn, 16, 19);
5656 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5657
5658 if (!insn_references_pc (insn, 0x000ff00ful))
5659 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5660
5661 if (debug_displaced)
5662 fprintf_unfiltered (gdb_stdlog,
5663 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
5664 load ? (size == 1 ? "ldrb" : "ldr")
5665 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
5666 rt, rn,
5667 (unsigned long) insn);
5668
0f6f04ba
YQ
5669 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5670 usermode, rt, rm, rn);
7ff120b4 5671
bf9f652a 5672 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
5673 {
5674 dsc->u.ldst.restore_r4 = 0;
5675
5676 if (immed)
5677 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5678 ->
5679 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5680 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5681 else
5682 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5683 ->
5684 {ldr,str}[b]<cond> r0, [r2, r3]. */
5685 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5686 }
5687 else
5688 {
5689 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5690 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
5691 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5692 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
5693 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5694 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5695 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5696
5697 /* As above. */
5698 if (immed)
5699 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5700 else
5701 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5702
cca44b1b
JB
5703 dsc->numinsns = 6;
5704 }
5705
5706 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5707
5708 return 0;
5709}
5710
5711/* Cleanup LDM instructions with fully-populated register list. This is an
5712 unfortunate corner case: it's impossible to implement correctly by modifying
5713 the instruction. The issue is as follows: we have an instruction,
5714
5715 ldm rN, {r0-r15}
5716
5717 which we must rewrite to avoid loading PC. A possible solution would be to
5718 do the load in two halves, something like (with suitable cleanup
5719 afterwards):
5720
5721 mov r8, rN
5722 ldm[id][ab] r8!, {r0-r7}
5723 str r7, <temp>
5724 ldm[id][ab] r8, {r7-r14}
5725 <bkpt>
5726
5727 but at present there's no suitable place for <temp>, since the scratch space
5728 is overwritten before the cleanup routine is called. For now, we simply
5729 emulate the instruction. */
5730
5731static void
5732cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
5733 struct displaced_step_closure *dsc)
5734{
cca44b1b
JB
5735 int inc = dsc->u.block.increment;
5736 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5737 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5738 uint32_t regmask = dsc->u.block.regmask;
5739 int regno = inc ? 0 : 15;
5740 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5741 int exception_return = dsc->u.block.load && dsc->u.block.user
5742 && (regmask & 0x8000) != 0;
36073a92 5743 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5744 int do_transfer = condition_true (dsc->u.block.cond, status);
5745 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5746
5747 if (!do_transfer)
5748 return;
5749
5750 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5751 sensible we can do here. Complain loudly. */
5752 if (exception_return)
5753 error (_("Cannot single-step exception return"));
5754
5755 /* We don't handle any stores here for now. */
5756 gdb_assert (dsc->u.block.load != 0);
5757
5758 if (debug_displaced)
5759 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5760 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5761 dsc->u.block.increment ? "inc" : "dec",
5762 dsc->u.block.before ? "before" : "after");
5763
5764 while (regmask)
5765 {
5766 uint32_t memword;
5767
5768 if (inc)
bf9f652a 5769 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
5770 regno++;
5771 else
5772 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5773 regno--;
5774
5775 xfer_addr += bump_before;
5776
5777 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5778 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5779
5780 xfer_addr += bump_after;
5781
5782 regmask &= ~(1 << regno);
5783 }
5784
5785 if (dsc->u.block.writeback)
5786 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5787 CANNOT_WRITE_PC);
5788}
5789
5790/* Clean up an STM which included the PC in the register list. */
5791
5792static void
5793cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
5794 struct displaced_step_closure *dsc)
5795{
36073a92 5796 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5797 int store_executed = condition_true (dsc->u.block.cond, status);
5798 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5799 CORE_ADDR stm_insn_addr;
5800 uint32_t pc_val;
5801 long offset;
5802 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5803
5804 /* If condition code fails, there's nothing else to do. */
5805 if (!store_executed)
5806 return;
5807
5808 if (dsc->u.block.increment)
5809 {
5810 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5811
5812 if (dsc->u.block.before)
5813 pc_stored_at += 4;
5814 }
5815 else
5816 {
5817 pc_stored_at = dsc->u.block.xfer_addr;
5818
5819 if (dsc->u.block.before)
5820 pc_stored_at -= 4;
5821 }
5822
5823 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5824 stm_insn_addr = dsc->scratch_base;
5825 offset = pc_val - stm_insn_addr;
5826
5827 if (debug_displaced)
5828 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5829 "STM instruction\n", offset);
5830
5831 /* Rewrite the stored PC to the proper value for the non-displaced original
5832 instruction. */
5833 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5834 dsc->insn_addr + offset);
5835}
5836
5837/* Clean up an LDM which includes the PC in the register list. We clumped all
5838 the registers in the transferred list into a contiguous range r0...rX (to
5839 avoid loading PC directly and losing control of the debugged program), so we
5840 must undo that here. */
5841
5842static void
6e39997a 5843cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b
JB
5844 struct regcache *regs,
5845 struct displaced_step_closure *dsc)
5846{
36073a92 5847 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 5848 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 5849 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
5850 unsigned int regs_loaded = bitcount (mask);
5851 unsigned int num_to_shuffle = regs_loaded, clobbered;
5852
5853 /* The method employed here will fail if the register list is fully populated
5854 (we need to avoid loading PC directly). */
5855 gdb_assert (num_to_shuffle < 16);
5856
5857 if (!load_executed)
5858 return;
5859
5860 clobbered = (1 << num_to_shuffle) - 1;
5861
5862 while (num_to_shuffle > 0)
5863 {
5864 if ((mask & (1 << write_reg)) != 0)
5865 {
5866 unsigned int read_reg = num_to_shuffle - 1;
5867
5868 if (read_reg != write_reg)
5869 {
36073a92 5870 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
5871 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5872 if (debug_displaced)
5873 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5874 "loaded register r%d to r%d\n"), read_reg,
5875 write_reg);
5876 }
5877 else if (debug_displaced)
5878 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5879 "r%d already in the right place\n"),
5880 write_reg);
5881
5882 clobbered &= ~(1 << write_reg);
5883
5884 num_to_shuffle--;
5885 }
5886
5887 write_reg--;
5888 }
5889
5890 /* Restore any registers we scribbled over. */
5891 for (write_reg = 0; clobbered != 0; write_reg++)
5892 {
5893 if ((clobbered & (1 << write_reg)) != 0)
5894 {
5895 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5896 CANNOT_WRITE_PC);
5897 if (debug_displaced)
5898 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5899 "clobbered register r%d\n"), write_reg);
5900 clobbered &= ~(1 << write_reg);
5901 }
5902 }
5903
5904 /* Perform register writeback manually. */
5905 if (dsc->u.block.writeback)
5906 {
5907 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5908
5909 if (dsc->u.block.increment)
5910 new_rn_val += regs_loaded * 4;
5911 else
5912 new_rn_val -= regs_loaded * 4;
5913
5914 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
5915 CANNOT_WRITE_PC);
5916 }
5917}
5918
5919/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
5920 in user-level code (in particular exception return, ldm rn, {...pc}^). */
5921
5922static int
7ff120b4
YQ
5923arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
5924 struct regcache *regs,
5925 struct displaced_step_closure *dsc)
cca44b1b
JB
5926{
5927 int load = bit (insn, 20);
5928 int user = bit (insn, 22);
5929 int increment = bit (insn, 23);
5930 int before = bit (insn, 24);
5931 int writeback = bit (insn, 21);
5932 int rn = bits (insn, 16, 19);
cca44b1b 5933
0963b4bd
MS
5934 /* Block transfers which don't mention PC can be run directly
5935 out-of-line. */
bf9f652a 5936 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 5937 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 5938
bf9f652a 5939 if (rn == ARM_PC_REGNUM)
cca44b1b 5940 {
0963b4bd
MS
5941 warning (_("displaced: Unpredictable LDM or STM with "
5942 "base register r15"));
7ff120b4 5943 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
5944 }
5945
5946 if (debug_displaced)
5947 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
5948 "%.8lx\n", (unsigned long) insn);
5949
36073a92 5950 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
5951 dsc->u.block.rn = rn;
5952
5953 dsc->u.block.load = load;
5954 dsc->u.block.user = user;
5955 dsc->u.block.increment = increment;
5956 dsc->u.block.before = before;
5957 dsc->u.block.writeback = writeback;
5958 dsc->u.block.cond = bits (insn, 28, 31);
5959
5960 dsc->u.block.regmask = insn & 0xffff;
5961
5962 if (load)
5963 {
5964 if ((insn & 0xffff) == 0xffff)
5965 {
5966 /* LDM with a fully-populated register list. This case is
5967 particularly tricky. Implement for now by fully emulating the
5968 instruction (which might not behave perfectly in all cases, but
5969 these instructions should be rare enough for that not to matter
5970 too much). */
5971 dsc->modinsn[0] = ARM_NOP;
5972
5973 dsc->cleanup = &cleanup_block_load_all;
5974 }
5975 else
5976 {
5977 /* LDM of a list of registers which includes PC. Implement by
5978 rewriting the list of registers to be transferred into a
5979 contiguous chunk r0...rX before doing the transfer, then shuffling
5980 registers into the correct places in the cleanup routine. */
5981 unsigned int regmask = insn & 0xffff;
bec2ab5a
SM
5982 unsigned int num_in_list = bitcount (regmask), new_regmask;
5983 unsigned int i;
cca44b1b
JB
5984
5985 for (i = 0; i < num_in_list; i++)
36073a92 5986 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
5987
5988 /* Writeback makes things complicated. We need to avoid clobbering
5989 the base register with one of the registers in our modified
5990 register list, but just using a different register can't work in
5991 all cases, e.g.:
5992
5993 ldm r14!, {r0-r13,pc}
5994
5995 which would need to be rewritten as:
5996
5997 ldm rN!, {r0-r14}
5998
5999 but that can't work, because there's no free register for N.
6000
6001 Solve this by turning off the writeback bit, and emulating
6002 writeback manually in the cleanup routine. */
6003
6004 if (writeback)
6005 insn &= ~(1 << 21);
6006
6007 new_regmask = (1 << num_in_list) - 1;
6008
6009 if (debug_displaced)
6010 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6011 "{..., pc}: original reg list %.4x, modified "
6012 "list %.4x\n"), rn, writeback ? "!" : "",
6013 (int) insn & 0xffff, new_regmask);
6014
6015 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6016
6017 dsc->cleanup = &cleanup_block_load_pc;
6018 }
6019 }
6020 else
6021 {
6022 /* STM of a list of registers which includes PC. Run the instruction
6023 as-is, but out of line: this will store the wrong value for the PC,
6024 so we must manually fix up the memory in the cleanup routine.
6025 Doing things this way has the advantage that we can auto-detect
6026 the offset of the PC write (which is architecture-dependent) in
6027 the cleanup routine. */
6028 dsc->modinsn[0] = insn;
6029
6030 dsc->cleanup = &cleanup_block_store_pc;
6031 }
6032
6033 return 0;
6034}
6035
34518530
YQ
6036static int
6037thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6038 struct regcache *regs,
6039 struct displaced_step_closure *dsc)
cca44b1b 6040{
34518530
YQ
6041 int rn = bits (insn1, 0, 3);
6042 int load = bit (insn1, 4);
6043 int writeback = bit (insn1, 5);
cca44b1b 6044
34518530
YQ
6045 /* Block transfers which don't mention PC can be run directly
6046 out-of-line. */
6047 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6048 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 6049
34518530
YQ
6050 if (rn == ARM_PC_REGNUM)
6051 {
6052 warning (_("displaced: Unpredictable LDM or STM with "
6053 "base register r15"));
6054 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6055 "unpredictable ldm/stm", dsc);
6056 }
cca44b1b
JB
6057
6058 if (debug_displaced)
34518530
YQ
6059 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6060 "%.4x%.4x\n", insn1, insn2);
cca44b1b 6061
34518530
YQ
6062 /* Clear bit 13, since it should be always zero. */
6063 dsc->u.block.regmask = (insn2 & 0xdfff);
6064 dsc->u.block.rn = rn;
cca44b1b 6065
34518530
YQ
6066 dsc->u.block.load = load;
6067 dsc->u.block.user = 0;
6068 dsc->u.block.increment = bit (insn1, 7);
6069 dsc->u.block.before = bit (insn1, 8);
6070 dsc->u.block.writeback = writeback;
6071 dsc->u.block.cond = INST_AL;
6072 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 6073
34518530
YQ
6074 if (load)
6075 {
6076 if (dsc->u.block.regmask == 0xffff)
6077 {
6078 /* This branch is impossible to happen. */
6079 gdb_assert (0);
6080 }
6081 else
6082 {
6083 unsigned int regmask = dsc->u.block.regmask;
bec2ab5a
SM
6084 unsigned int num_in_list = bitcount (regmask), new_regmask;
6085 unsigned int i;
34518530
YQ
6086
6087 for (i = 0; i < num_in_list; i++)
6088 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6089
6090 if (writeback)
6091 insn1 &= ~(1 << 5);
6092
6093 new_regmask = (1 << num_in_list) - 1;
6094
6095 if (debug_displaced)
6096 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6097 "{..., pc}: original reg list %.4x, modified "
6098 "list %.4x\n"), rn, writeback ? "!" : "",
6099 (int) dsc->u.block.regmask, new_regmask);
6100
6101 dsc->modinsn[0] = insn1;
6102 dsc->modinsn[1] = (new_regmask & 0xffff);
6103 dsc->numinsns = 2;
6104
6105 dsc->cleanup = &cleanup_block_load_pc;
6106 }
6107 }
6108 else
6109 {
6110 dsc->modinsn[0] = insn1;
6111 dsc->modinsn[1] = insn2;
6112 dsc->numinsns = 2;
6113 dsc->cleanup = &cleanup_block_store_pc;
6114 }
6115 return 0;
6116}
6117
d9311bfa
AT
6118/* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6119 This is used to avoid a dependency on BFD's bfd_endian enum. */
6120
6121ULONGEST
6122arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6123 int byte_order)
6124{
5f2dfcfd
AT
6125 return read_memory_unsigned_integer (memaddr, len,
6126 (enum bfd_endian) byte_order);
d9311bfa
AT
6127}
6128
6129/* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6130
6131CORE_ADDR
6132arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6133 CORE_ADDR val)
6134{
6135 return gdbarch_addr_bits_remove (get_regcache_arch (self->regcache), val);
6136}
6137
6138/* Wrapper over syscall_next_pc for use in get_next_pcs. */
6139
e7cf25a8
YQ
6140static CORE_ADDR
6141arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self,
6142 CORE_ADDR pc)
d9311bfa 6143{
d9311bfa
AT
6144 return 0;
6145}
6146
6147/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6148
6149int
6150arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6151{
6152 return arm_is_thumb (self->regcache);
6153}
6154
6155/* single_step() is called just before we want to resume the inferior,
6156 if we want to single-step it but there is no hardware or kernel
6157 single-step support. We find the target of the coming instructions
6158 and breakpoint them. */
6159
6160int
6161arm_software_single_step (struct frame_info *frame)
6162{
6163 struct regcache *regcache = get_current_regcache ();
6164 struct gdbarch *gdbarch = get_regcache_arch (regcache);
6165 struct address_space *aspace = get_regcache_aspace (regcache);
6166 struct arm_get_next_pcs next_pcs_ctx;
6167 CORE_ADDR pc;
6168 int i;
6169 VEC (CORE_ADDR) *next_pcs = NULL;
6170 struct cleanup *old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
6171
6172 arm_get_next_pcs_ctor (&next_pcs_ctx,
6173 &arm_get_next_pcs_ops,
6174 gdbarch_byte_order (gdbarch),
6175 gdbarch_byte_order_for_code (gdbarch),
1b451dda 6176 0,
d9311bfa
AT
6177 regcache);
6178
4d18591b 6179 next_pcs = arm_get_next_pcs (&next_pcs_ctx);
d9311bfa
AT
6180
6181 for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); i++)
6182 arm_insert_single_step_breakpoint (gdbarch, aspace, pc);
6183
6184 do_cleanups (old_chain);
6185
6186 return 1;
6187}
6188
34518530
YQ
6189/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6190 for Linux, where some SVC instructions must be treated specially. */
6191
6192static void
6193cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
6194 struct displaced_step_closure *dsc)
6195{
6196 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6197
6198 if (debug_displaced)
6199 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6200 "%.8lx\n", (unsigned long) resume_addr);
6201
6202 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6203}
6204
6205
6206/* Common copy routine for svc instruciton. */
6207
6208static int
6209install_svc (struct gdbarch *gdbarch, struct regcache *regs,
6210 struct displaced_step_closure *dsc)
6211{
6212 /* Preparation: none.
6213 Insn: unmodified svc.
6214 Cleanup: pc <- insn_addr + insn_size. */
6215
6216 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6217 instruction. */
6218 dsc->wrote_to_pc = 1;
6219
6220 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6221 if (dsc->u.svc.copy_svc_os)
6222 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6223 else
6224 {
6225 dsc->cleanup = &cleanup_svc;
6226 return 0;
6227 }
34518530
YQ
6228}
6229
6230static int
6231arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
6232 struct regcache *regs, struct displaced_step_closure *dsc)
6233{
6234
6235 if (debug_displaced)
6236 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6237 (unsigned long) insn);
6238
6239 dsc->modinsn[0] = insn;
6240
6241 return install_svc (gdbarch, regs, dsc);
6242}
6243
6244static int
6245thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
6246 struct regcache *regs, struct displaced_step_closure *dsc)
6247{
6248
6249 if (debug_displaced)
6250 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6251 insn);
bd18283a 6252
34518530
YQ
6253 dsc->modinsn[0] = insn;
6254
6255 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6256}
6257
6258/* Copy undefined instructions. */
6259
6260static int
7ff120b4
YQ
6261arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
6262 struct displaced_step_closure *dsc)
cca44b1b
JB
6263{
6264 if (debug_displaced)
0963b4bd
MS
6265 fprintf_unfiltered (gdb_stdlog,
6266 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6267 (unsigned long) insn);
6268
6269 dsc->modinsn[0] = insn;
6270
6271 return 0;
6272}
6273
34518530
YQ
6274static int
6275thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6276 struct displaced_step_closure *dsc)
6277{
6278
6279 if (debug_displaced)
6280 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6281 "%.4x %.4x\n", (unsigned short) insn1,
6282 (unsigned short) insn2);
6283
6284 dsc->modinsn[0] = insn1;
6285 dsc->modinsn[1] = insn2;
6286 dsc->numinsns = 2;
6287
6288 return 0;
6289}
6290
cca44b1b
JB
6291/* Copy unpredictable instructions. */
6292
6293static int
7ff120b4
YQ
6294arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
6295 struct displaced_step_closure *dsc)
cca44b1b
JB
6296{
6297 if (debug_displaced)
6298 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6299 "%.8lx\n", (unsigned long) insn);
6300
6301 dsc->modinsn[0] = insn;
6302
6303 return 0;
6304}
6305
6306/* The decode_* functions are instruction decoding helpers. They mostly follow
6307 the presentation in the ARM ARM. */
6308
6309static int
7ff120b4
YQ
6310arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6311 struct regcache *regs,
6312 struct displaced_step_closure *dsc)
cca44b1b
JB
6313{
6314 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6315 unsigned int rn = bits (insn, 16, 19);
6316
6317 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 6318 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 6319 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 6320 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6321 else if ((op1 & 0x60) == 0x20)
7ff120b4 6322 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6323 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6324 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6325 dsc);
cca44b1b 6326 else if ((op1 & 0x77) == 0x41)
7ff120b4 6327 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6328 else if ((op1 & 0x77) == 0x45)
7ff120b4 6329 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6330 else if ((op1 & 0x77) == 0x51)
6331 {
6332 if (rn != 0xf)
7ff120b4 6333 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6334 else
7ff120b4 6335 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6336 }
6337 else if ((op1 & 0x77) == 0x55)
7ff120b4 6338 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6339 else if (op1 == 0x57)
6340 switch (op2)
6341 {
7ff120b4
YQ
6342 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6343 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6344 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6345 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6346 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6347 }
6348 else if ((op1 & 0x63) == 0x43)
7ff120b4 6349 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6350 else if ((op2 & 0x1) == 0x0)
6351 switch (op1 & ~0x80)
6352 {
6353 case 0x61:
7ff120b4 6354 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6355 case 0x65:
7ff120b4 6356 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6357 case 0x71: case 0x75:
6358 /* pld/pldw reg. */
7ff120b4 6359 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6360 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6361 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6362 default:
7ff120b4 6363 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6364 }
6365 else
7ff120b4 6366 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6367}
6368
6369static int
7ff120b4
YQ
6370arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6371 struct regcache *regs,
6372 struct displaced_step_closure *dsc)
cca44b1b
JB
6373{
6374 if (bit (insn, 27) == 0)
7ff120b4 6375 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6376 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6377 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6378 {
6379 case 0x0: case 0x2:
7ff120b4 6380 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6381
6382 case 0x1: case 0x3:
7ff120b4 6383 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6384
6385 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6386 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6387
6388 case 0x8:
6389 switch ((insn & 0xe00000) >> 21)
6390 {
6391 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6392 /* stc/stc2. */
7ff120b4 6393 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6394
6395 case 0x2:
7ff120b4 6396 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6397
6398 default:
7ff120b4 6399 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6400 }
6401
6402 case 0x9:
6403 {
6404 int rn_f = (bits (insn, 16, 19) == 0xf);
6405 switch ((insn & 0xe00000) >> 21)
6406 {
6407 case 0x1: case 0x3:
6408 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6409 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6410 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6411
6412 case 0x2:
7ff120b4 6413 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6414
6415 case 0x4: case 0x5: case 0x6: case 0x7:
6416 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6417 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6418 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6419
6420 default:
7ff120b4 6421 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6422 }
6423 }
6424
6425 case 0xa:
7ff120b4 6426 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6427
6428 case 0xb:
6429 if (bits (insn, 16, 19) == 0xf)
6430 /* ldc/ldc2 lit. */
7ff120b4 6431 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6432 else
7ff120b4 6433 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6434
6435 case 0xc:
6436 if (bit (insn, 4))
7ff120b4 6437 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6438 else
7ff120b4 6439 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6440
6441 case 0xd:
6442 if (bit (insn, 4))
7ff120b4 6443 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6444 else
7ff120b4 6445 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6446
6447 default:
7ff120b4 6448 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6449 }
6450}
6451
6452/* Decode miscellaneous instructions in dp/misc encoding space. */
6453
6454static int
7ff120b4
YQ
6455arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6456 struct regcache *regs,
6457 struct displaced_step_closure *dsc)
cca44b1b
JB
6458{
6459 unsigned int op2 = bits (insn, 4, 6);
6460 unsigned int op = bits (insn, 21, 22);
cca44b1b
JB
6461
6462 switch (op2)
6463 {
6464 case 0x0:
7ff120b4 6465 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6466
6467 case 0x1:
6468 if (op == 0x1) /* bx. */
7ff120b4 6469 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6470 else if (op == 0x3)
7ff120b4 6471 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6472 else
7ff120b4 6473 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6474
6475 case 0x2:
6476 if (op == 0x1)
6477 /* Not really supported. */
7ff120b4 6478 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6479 else
7ff120b4 6480 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6481
6482 case 0x3:
6483 if (op == 0x1)
7ff120b4 6484 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6485 regs, dsc); /* blx register. */
cca44b1b 6486 else
7ff120b4 6487 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6488
6489 case 0x5:
7ff120b4 6490 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6491
6492 case 0x7:
6493 if (op == 0x1)
7ff120b4 6494 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6495 else if (op == 0x3)
6496 /* Not really supported. */
7ff120b4 6497 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
6498
6499 default:
7ff120b4 6500 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6501 }
6502}
6503
6504static int
7ff120b4
YQ
6505arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6506 struct regcache *regs,
6507 struct displaced_step_closure *dsc)
cca44b1b
JB
6508{
6509 if (bit (insn, 25))
6510 switch (bits (insn, 20, 24))
6511 {
6512 case 0x10:
7ff120b4 6513 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6514
6515 case 0x14:
7ff120b4 6516 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6517
6518 case 0x12: case 0x16:
7ff120b4 6519 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6520
6521 default:
7ff120b4 6522 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6523 }
6524 else
6525 {
6526 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6527
6528 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6529 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6530 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6531 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6532 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6533 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6534 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6535 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6536 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6537 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6538 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6539 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b 6540 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
550dc4e2 6541 /* 2nd arg means "unprivileged". */
7ff120b4
YQ
6542 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6543 dsc);
cca44b1b
JB
6544 }
6545
6546 /* Should be unreachable. */
6547 return 1;
6548}
6549
6550static int
7ff120b4
YQ
6551arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6552 struct regcache *regs,
6553 struct displaced_step_closure *dsc)
cca44b1b
JB
6554{
6555 int a = bit (insn, 25), b = bit (insn, 4);
6556 uint32_t op1 = bits (insn, 20, 24);
cca44b1b
JB
6557
6558 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6559 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6560 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6561 else if ((!a && (op1 & 0x17) == 0x02)
6562 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6563 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6564 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6565 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6566 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6567 else if ((!a && (op1 & 0x17) == 0x03)
6568 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6569 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6570 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6571 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6572 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6573 else if ((!a && (op1 & 0x17) == 0x06)
6574 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6575 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6576 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6577 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6578 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6579 else if ((!a && (op1 & 0x17) == 0x07)
6580 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6581 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6582
6583 /* Should be unreachable. */
6584 return 1;
6585}
6586
6587static int
7ff120b4
YQ
6588arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
6589 struct displaced_step_closure *dsc)
cca44b1b
JB
6590{
6591 switch (bits (insn, 20, 24))
6592 {
6593 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6594 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6595
6596 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6597 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6598
6599 case 0x08: case 0x09: case 0x0a: case 0x0b:
6600 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6601 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6602 "decode/pack/unpack/saturate/reverse", dsc);
6603
6604 case 0x18:
6605 if (bits (insn, 5, 7) == 0) /* op2. */
6606 {
6607 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6608 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6609 else
7ff120b4 6610 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6611 }
6612 else
7ff120b4 6613 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6614
6615 case 0x1a: case 0x1b:
6616 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6617 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6618 else
7ff120b4 6619 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6620
6621 case 0x1c: case 0x1d:
6622 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6623 {
6624 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6625 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6626 else
7ff120b4 6627 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6628 }
6629 else
7ff120b4 6630 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6631
6632 case 0x1e: case 0x1f:
6633 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6634 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6635 else
7ff120b4 6636 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6637 }
6638
6639 /* Should be unreachable. */
6640 return 1;
6641}
6642
6643static int
615234c1 6644arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7ff120b4
YQ
6645 struct regcache *regs,
6646 struct displaced_step_closure *dsc)
cca44b1b
JB
6647{
6648 if (bit (insn, 25))
7ff120b4 6649 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6650 else
7ff120b4 6651 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6652}
6653
6654static int
7ff120b4
YQ
6655arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6656 struct regcache *regs,
6657 struct displaced_step_closure *dsc)
cca44b1b
JB
6658{
6659 unsigned int opcode = bits (insn, 20, 24);
6660
6661 switch (opcode)
6662 {
6663 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6664 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6665
6666 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6667 case 0x12: case 0x16:
7ff120b4 6668 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6669
6670 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6671 case 0x13: case 0x17:
7ff120b4 6672 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6673
6674 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6675 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6676 /* Note: no writeback for these instructions. Bit 25 will always be
6677 zero though (via caller), so the following works OK. */
7ff120b4 6678 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6679 }
6680
6681 /* Should be unreachable. */
6682 return 1;
6683}
6684
34518530
YQ
6685/* Decode shifted register instructions. */
6686
6687static int
6688thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6689 uint16_t insn2, struct regcache *regs,
6690 struct displaced_step_closure *dsc)
6691{
6692 /* PC is only allowed to be used in instruction MOV. */
6693
6694 unsigned int op = bits (insn1, 5, 8);
6695 unsigned int rn = bits (insn1, 0, 3);
6696
6697 if (op == 0x2 && rn == 0xf) /* MOV */
6698 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6699 else
6700 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6701 "dp (shift reg)", dsc);
6702}
6703
6704
6705/* Decode extension register load/store. Exactly the same as
6706 arm_decode_ext_reg_ld_st. */
6707
6708static int
6709thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6710 uint16_t insn2, struct regcache *regs,
6711 struct displaced_step_closure *dsc)
6712{
6713 unsigned int opcode = bits (insn1, 4, 8);
6714
6715 switch (opcode)
6716 {
6717 case 0x04: case 0x05:
6718 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6719 "vfp/neon vmov", dsc);
6720
6721 case 0x08: case 0x0c: /* 01x00 */
6722 case 0x0a: case 0x0e: /* 01x10 */
6723 case 0x12: case 0x16: /* 10x10 */
6724 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6725 "vfp/neon vstm/vpush", dsc);
6726
6727 case 0x09: case 0x0d: /* 01x01 */
6728 case 0x0b: case 0x0f: /* 01x11 */
6729 case 0x13: case 0x17: /* 10x11 */
6730 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6731 "vfp/neon vldm/vpop", dsc);
6732
6733 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6734 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6735 "vstr", dsc);
6736 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6737 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6738 }
6739
6740 /* Should be unreachable. */
6741 return 1;
6742}
6743
cca44b1b 6744static int
7ff120b4
YQ
6745arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
6746 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6747{
6748 unsigned int op1 = bits (insn, 20, 25);
6749 int op = bit (insn, 4);
6750 unsigned int coproc = bits (insn, 8, 11);
cca44b1b
JB
6751
6752 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6753 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6754 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6755 && (coproc & 0xe) != 0xa)
6756 /* stc/stc2. */
7ff120b4 6757 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6758 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6759 && (coproc & 0xe) != 0xa)
6760 /* ldc/ldc2 imm/lit. */
7ff120b4 6761 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6762 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6763 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6764 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6765 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6766 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6767 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6768 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6769 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6770 else if ((op1 & 0x30) == 0x20 && !op)
6771 {
6772 if ((coproc & 0xe) == 0xa)
7ff120b4 6773 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6774 else
7ff120b4 6775 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6776 }
6777 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6778 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6779 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6780 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6781 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6782 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6783 else if ((op1 & 0x30) == 0x30)
7ff120b4 6784 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6785 else
7ff120b4 6786 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6787}
6788
34518530
YQ
6789static int
6790thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6791 uint16_t insn2, struct regcache *regs,
6792 struct displaced_step_closure *dsc)
6793{
6794 unsigned int coproc = bits (insn2, 8, 11);
34518530
YQ
6795 unsigned int bit_5_8 = bits (insn1, 5, 8);
6796 unsigned int bit_9 = bit (insn1, 9);
6797 unsigned int bit_4 = bit (insn1, 4);
34518530
YQ
6798
6799 if (bit_9 == 0)
6800 {
6801 if (bit_5_8 == 2)
6802 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6803 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6804 dsc);
6805 else if (bit_5_8 == 0) /* UNDEFINED. */
6806 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6807 else
6808 {
6809 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6810 if ((coproc & 0xe) == 0xa)
6811 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6812 dsc);
6813 else /* coproc is not 101x. */
6814 {
6815 if (bit_4 == 0) /* STC/STC2. */
6816 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6817 "stc/stc2", dsc);
6818 else /* LDC/LDC2 {literal, immeidate}. */
6819 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6820 regs, dsc);
6821 }
6822 }
6823 }
6824 else
6825 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6826
6827 return 0;
6828}
6829
6830static void
6831install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
6832 struct displaced_step_closure *dsc, int rd)
6833{
6834 /* ADR Rd, #imm
6835
6836 Rewrite as:
6837
6838 Preparation: Rd <- PC
6839 Insn: ADD Rd, #imm
6840 Cleanup: Null.
6841 */
6842
6843 /* Rd <- PC */
6844 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6845 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6846}
6847
6848static int
6849thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
6850 struct displaced_step_closure *dsc,
6851 int rd, unsigned int imm)
6852{
6853
6854 /* Encoding T2: ADDS Rd, #imm */
6855 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6856
6857 install_pc_relative (gdbarch, regs, dsc, rd);
6858
6859 return 0;
6860}
6861
6862static int
6863thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6864 struct regcache *regs,
6865 struct displaced_step_closure *dsc)
6866{
6867 unsigned int rd = bits (insn, 8, 10);
6868 unsigned int imm8 = bits (insn, 0, 7);
6869
6870 if (debug_displaced)
6871 fprintf_unfiltered (gdb_stdlog,
6872 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6873 rd, imm8, insn);
6874
6875 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6876}
6877
6878static int
6879thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6880 uint16_t insn2, struct regcache *regs,
6881 struct displaced_step_closure *dsc)
6882{
6883 unsigned int rd = bits (insn2, 8, 11);
6884 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6885 extract raw immediate encoding rather than computing immediate. When
6886 generating ADD or SUB instruction, we can simply perform OR operation to
6887 set immediate into ADD. */
6888 unsigned int imm_3_8 = insn2 & 0x70ff;
6889 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6890
6891 if (debug_displaced)
6892 fprintf_unfiltered (gdb_stdlog,
6893 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6894 rd, imm_i, imm_3_8, insn1, insn2);
6895
6896 if (bit (insn1, 7)) /* Encoding T2 */
6897 {
6898 /* Encoding T3: SUB Rd, Rd, #imm */
6899 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6900 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6901 }
6902 else /* Encoding T3 */
6903 {
6904 /* Encoding T3: ADD Rd, Rd, #imm */
6905 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6906 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6907 }
6908 dsc->numinsns = 2;
6909
6910 install_pc_relative (gdbarch, regs, dsc, rd);
6911
6912 return 0;
6913}
6914
6915static int
615234c1 6916thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
6917 struct regcache *regs,
6918 struct displaced_step_closure *dsc)
6919{
6920 unsigned int rt = bits (insn1, 8, 10);
6921 unsigned int pc;
6922 int imm8 = (bits (insn1, 0, 7) << 2);
34518530
YQ
6923
6924 /* LDR Rd, #imm8
6925
6926 Rwrite as:
6927
6928 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6929
6930 Insn: LDR R0, [R2, R3];
6931 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6932
6933 if (debug_displaced)
6934 fprintf_unfiltered (gdb_stdlog,
6935 "displaced: copying thumb ldr r%d [pc #%d]\n"
6936 , rt, imm8);
6937
6938 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6939 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6940 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6941 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6942 /* The assembler calculates the required value of the offset from the
6943 Align(PC,4) value of this instruction to the label. */
6944 pc = pc & 0xfffffffc;
6945
6946 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6947 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6948
6949 dsc->rd = rt;
6950 dsc->u.ldst.xfersize = 4;
6951 dsc->u.ldst.rn = 0;
6952 dsc->u.ldst.immed = 0;
6953 dsc->u.ldst.writeback = 0;
6954 dsc->u.ldst.restore_r4 = 0;
6955
6956 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6957
6958 dsc->cleanup = &cleanup_load;
6959
6960 return 0;
6961}
6962
6963/* Copy Thumb cbnz/cbz insruction. */
6964
6965static int
6966thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6967 struct regcache *regs,
6968 struct displaced_step_closure *dsc)
6969{
6970 int non_zero = bit (insn1, 11);
6971 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6972 CORE_ADDR from = dsc->insn_addr;
6973 int rn = bits (insn1, 0, 2);
6974 int rn_val = displaced_read_reg (regs, dsc, rn);
6975
6976 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6977 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6978 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6979 condition is false, let it be, cleanup_branch will do nothing. */
6980 if (dsc->u.branch.cond)
6981 {
6982 dsc->u.branch.cond = INST_AL;
6983 dsc->u.branch.dest = from + 4 + imm5;
6984 }
6985 else
6986 dsc->u.branch.dest = from + 2;
6987
6988 dsc->u.branch.link = 0;
6989 dsc->u.branch.exchange = 0;
6990
6991 if (debug_displaced)
6992 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
6993 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
6994 rn, rn_val, insn1, dsc->u.branch.dest);
6995
6996 dsc->modinsn[0] = THUMB_NOP;
6997
6998 dsc->cleanup = &cleanup_branch;
6999 return 0;
7000}
7001
7002/* Copy Table Branch Byte/Halfword */
7003static int
7004thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7005 uint16_t insn2, struct regcache *regs,
7006 struct displaced_step_closure *dsc)
7007{
7008 ULONGEST rn_val, rm_val;
7009 int is_tbh = bit (insn2, 4);
7010 CORE_ADDR halfwords = 0;
7011 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7012
7013 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7014 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7015
7016 if (is_tbh)
7017 {
7018 gdb_byte buf[2];
7019
7020 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7021 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7022 }
7023 else
7024 {
7025 gdb_byte buf[1];
7026
7027 target_read_memory (rn_val + rm_val, buf, 1);
7028 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7029 }
7030
7031 if (debug_displaced)
7032 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7033 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7034 (unsigned int) rn_val, (unsigned int) rm_val,
7035 (unsigned int) halfwords);
7036
7037 dsc->u.branch.cond = INST_AL;
7038 dsc->u.branch.link = 0;
7039 dsc->u.branch.exchange = 0;
7040 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7041
7042 dsc->cleanup = &cleanup_branch;
7043
7044 return 0;
7045}
7046
7047static void
7048cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
7049 struct displaced_step_closure *dsc)
7050{
7051 /* PC <- r7 */
7052 int val = displaced_read_reg (regs, dsc, 7);
7053 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7054
7055 /* r7 <- r8 */
7056 val = displaced_read_reg (regs, dsc, 8);
7057 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7058
7059 /* r8 <- tmp[0] */
7060 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7061
7062}
7063
7064static int
615234c1 7065thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
7066 struct regcache *regs,
7067 struct displaced_step_closure *dsc)
7068{
7069 dsc->u.block.regmask = insn1 & 0x00ff;
7070
7071 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7072 to :
7073
7074 (1) register list is full, that is, r0-r7 are used.
7075 Prepare: tmp[0] <- r8
7076
7077 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7078 MOV r8, r7; Move value of r7 to r8;
7079 POP {r7}; Store PC value into r7.
7080
7081 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7082
7083 (2) register list is not full, supposing there are N registers in
7084 register list (except PC, 0 <= N <= 7).
7085 Prepare: for each i, 0 - N, tmp[i] <- ri.
7086
7087 POP {r0, r1, ...., rN};
7088
7089 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7090 from tmp[] properly.
7091 */
7092 if (debug_displaced)
7093 fprintf_unfiltered (gdb_stdlog,
7094 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7095 dsc->u.block.regmask, insn1);
7096
7097 if (dsc->u.block.regmask == 0xff)
7098 {
7099 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7100
7101 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7102 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7103 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7104
7105 dsc->numinsns = 3;
7106 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7107 }
7108 else
7109 {
7110 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
bec2ab5a
SM
7111 unsigned int i;
7112 unsigned int new_regmask;
34518530
YQ
7113
7114 for (i = 0; i < num_in_list + 1; i++)
7115 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7116
7117 new_regmask = (1 << (num_in_list + 1)) - 1;
7118
7119 if (debug_displaced)
7120 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7121 "{..., pc}: original reg list %.4x,"
7122 " modified list %.4x\n"),
7123 (int) dsc->u.block.regmask, new_regmask);
7124
7125 dsc->u.block.regmask |= 0x8000;
7126 dsc->u.block.writeback = 0;
7127 dsc->u.block.cond = INST_AL;
7128
7129 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7130
7131 dsc->cleanup = &cleanup_block_load_pc;
7132 }
7133
7134 return 0;
7135}
7136
7137static void
7138thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7139 struct regcache *regs,
7140 struct displaced_step_closure *dsc)
7141{
7142 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7143 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7144 int err = 0;
7145
7146 /* 16-bit thumb instructions. */
7147 switch (op_bit_12_15)
7148 {
7149 /* Shift (imme), add, subtract, move and compare. */
7150 case 0: case 1: case 2: case 3:
7151 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7152 "shift/add/sub/mov/cmp",
7153 dsc);
7154 break;
7155 case 4:
7156 switch (op_bit_10_11)
7157 {
7158 case 0: /* Data-processing */
7159 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7160 "data-processing",
7161 dsc);
7162 break;
7163 case 1: /* Special data instructions and branch and exchange. */
7164 {
7165 unsigned short op = bits (insn1, 7, 9);
7166 if (op == 6 || op == 7) /* BX or BLX */
7167 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7168 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7169 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7170 else
7171 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7172 dsc);
7173 }
7174 break;
7175 default: /* LDR (literal) */
7176 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7177 }
7178 break;
7179 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7180 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7181 break;
7182 case 10:
7183 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7184 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7185 else /* Generate SP-relative address */
7186 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7187 break;
7188 case 11: /* Misc 16-bit instructions */
7189 {
7190 switch (bits (insn1, 8, 11))
7191 {
7192 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7193 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7194 break;
7195 case 12: case 13: /* POP */
7196 if (bit (insn1, 8)) /* PC is in register list. */
7197 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7198 else
7199 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7200 break;
7201 case 15: /* If-Then, and hints */
7202 if (bits (insn1, 0, 3))
7203 /* If-Then makes up to four following instructions conditional.
7204 IT instruction itself is not conditional, so handle it as a
7205 common unmodified instruction. */
7206 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7207 dsc);
7208 else
7209 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7210 break;
7211 default:
7212 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7213 }
7214 }
7215 break;
7216 case 12:
7217 if (op_bit_10_11 < 2) /* Store multiple registers */
7218 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7219 else /* Load multiple registers */
7220 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7221 break;
7222 case 13: /* Conditional branch and supervisor call */
7223 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7224 err = thumb_copy_b (gdbarch, insn1, dsc);
7225 else
7226 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7227 break;
7228 case 14: /* Unconditional branch */
7229 err = thumb_copy_b (gdbarch, insn1, dsc);
7230 break;
7231 default:
7232 err = 1;
7233 }
7234
7235 if (err)
7236 internal_error (__FILE__, __LINE__,
7237 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7238}
7239
7240static int
7241decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7242 uint16_t insn1, uint16_t insn2,
7243 struct regcache *regs,
7244 struct displaced_step_closure *dsc)
7245{
7246 int rt = bits (insn2, 12, 15);
7247 int rn = bits (insn1, 0, 3);
7248 int op1 = bits (insn1, 7, 8);
34518530
YQ
7249
7250 switch (bits (insn1, 5, 6))
7251 {
7252 case 0: /* Load byte and memory hints */
7253 if (rt == 0xf) /* PLD/PLI */
7254 {
7255 if (rn == 0xf)
7256 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7257 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7258 else
7259 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7260 "pli/pld", dsc);
7261 }
7262 else
7263 {
7264 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7265 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7266 1);
7267 else
7268 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7269 "ldrb{reg, immediate}/ldrbt",
7270 dsc);
7271 }
7272
7273 break;
7274 case 1: /* Load halfword and memory hints. */
7275 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7276 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7277 "pld/unalloc memhint", dsc);
7278 else
7279 {
7280 if (rn == 0xf)
7281 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7282 2);
7283 else
7284 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7285 "ldrh/ldrht", dsc);
7286 }
7287 break;
7288 case 2: /* Load word */
7289 {
7290 int insn2_bit_8_11 = bits (insn2, 8, 11);
7291
7292 if (rn == 0xf)
7293 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7294 else if (op1 == 0x1) /* Encoding T3 */
7295 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7296 0, 1);
7297 else /* op1 == 0x0 */
7298 {
7299 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7300 /* LDR (immediate) */
7301 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7302 dsc, bit (insn2, 8), 1);
7303 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7304 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7305 "ldrt", dsc);
7306 else
7307 /* LDR (register) */
7308 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7309 dsc, 0, 0);
7310 }
7311 break;
7312 }
7313 default:
7314 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7315 break;
7316 }
7317 return 0;
7318}
7319
7320static void
7321thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7322 uint16_t insn2, struct regcache *regs,
7323 struct displaced_step_closure *dsc)
7324{
7325 int err = 0;
7326 unsigned short op = bit (insn2, 15);
7327 unsigned int op1 = bits (insn1, 11, 12);
7328
7329 switch (op1)
7330 {
7331 case 1:
7332 {
7333 switch (bits (insn1, 9, 10))
7334 {
7335 case 0:
7336 if (bit (insn1, 6))
7337 {
7338 /* Load/store {dual, execlusive}, table branch. */
7339 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7340 && bits (insn2, 5, 7) == 0)
7341 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7342 dsc);
7343 else
7344 /* PC is not allowed to use in load/store {dual, exclusive}
7345 instructions. */
7346 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7347 "load/store dual/ex", dsc);
7348 }
7349 else /* load/store multiple */
7350 {
7351 switch (bits (insn1, 7, 8))
7352 {
7353 case 0: case 3: /* SRS, RFE */
7354 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7355 "srs/rfe", dsc);
7356 break;
7357 case 1: case 2: /* LDM/STM/PUSH/POP */
7358 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7359 break;
7360 }
7361 }
7362 break;
7363
7364 case 1:
7365 /* Data-processing (shift register). */
7366 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7367 dsc);
7368 break;
7369 default: /* Coprocessor instructions. */
7370 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7371 break;
7372 }
7373 break;
7374 }
7375 case 2: /* op1 = 2 */
7376 if (op) /* Branch and misc control. */
7377 {
7378 if (bit (insn2, 14) /* BLX/BL */
7379 || bit (insn2, 12) /* Unconditional branch */
7380 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7381 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7382 else
7383 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7384 "misc ctrl", dsc);
7385 }
7386 else
7387 {
7388 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7389 {
7390 int op = bits (insn1, 4, 8);
7391 int rn = bits (insn1, 0, 3);
7392 if ((op == 0 || op == 0xa) && rn == 0xf)
7393 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7394 regs, dsc);
7395 else
7396 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7397 "dp/pb", dsc);
7398 }
7399 else /* Data processing (modified immeidate) */
7400 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7401 "dp/mi", dsc);
7402 }
7403 break;
7404 case 3: /* op1 = 3 */
7405 switch (bits (insn1, 9, 10))
7406 {
7407 case 0:
7408 if (bit (insn1, 4))
7409 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7410 regs, dsc);
7411 else /* NEON Load/Store and Store single data item */
7412 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7413 "neon elt/struct load/store",
7414 dsc);
7415 break;
7416 case 1: /* op1 = 3, bits (9, 10) == 1 */
7417 switch (bits (insn1, 7, 8))
7418 {
7419 case 0: case 1: /* Data processing (register) */
7420 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7421 "dp(reg)", dsc);
7422 break;
7423 case 2: /* Multiply and absolute difference */
7424 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7425 "mul/mua/diff", dsc);
7426 break;
7427 case 3: /* Long multiply and divide */
7428 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7429 "lmul/lmua", dsc);
7430 break;
7431 }
7432 break;
7433 default: /* Coprocessor instructions */
7434 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7435 break;
7436 }
7437 break;
7438 default:
7439 err = 1;
7440 }
7441
7442 if (err)
7443 internal_error (__FILE__, __LINE__,
7444 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7445
7446}
7447
b434a28f
YQ
7448static void
7449thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7450 CORE_ADDR to, struct regcache *regs,
7451 struct displaced_step_closure *dsc)
7452{
34518530
YQ
7453 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7454 uint16_t insn1
7455 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7456
7457 if (debug_displaced)
7458 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7459 "at %.8lx\n", insn1, (unsigned long) from);
7460
7461 dsc->is_thumb = 1;
7462 dsc->insn_size = thumb_insn_size (insn1);
7463 if (thumb_insn_size (insn1) == 4)
7464 {
7465 uint16_t insn2
7466 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7467 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7468 }
7469 else
7470 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7471}
7472
cca44b1b 7473void
b434a28f
YQ
7474arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7475 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
7476 struct displaced_step_closure *dsc)
7477{
7478 int err = 0;
b434a28f
YQ
7479 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7480 uint32_t insn;
cca44b1b
JB
7481
7482 /* Most displaced instructions use a 1-instruction scratch space, so set this
7483 here and override below if/when necessary. */
7484 dsc->numinsns = 1;
7485 dsc->insn_addr = from;
7486 dsc->scratch_base = to;
7487 dsc->cleanup = NULL;
7488 dsc->wrote_to_pc = 0;
7489
b434a28f
YQ
7490 if (!displaced_in_arm_mode (regs))
7491 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
7492
4db71c0b
YQ
7493 dsc->is_thumb = 0;
7494 dsc->insn_size = 4;
b434a28f
YQ
7495 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7496 if (debug_displaced)
7497 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7498 "at %.8lx\n", (unsigned long) insn,
7499 (unsigned long) from);
7500
cca44b1b 7501 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7502 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7503 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7504 {
7505 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7506 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7507 break;
7508
7509 case 0x4: case 0x5: case 0x6:
7ff120b4 7510 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7511 break;
7512
7513 case 0x7:
7ff120b4 7514 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7515 break;
7516
7517 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7518 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7519 break;
7520
7521 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 7522 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
7523 break;
7524 }
7525
7526 if (err)
7527 internal_error (__FILE__, __LINE__,
7528 _("arm_process_displaced_insn: Instruction decode error"));
7529}
7530
7531/* Actually set up the scratch space for a displaced instruction. */
7532
7533void
7534arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
7535 CORE_ADDR to, struct displaced_step_closure *dsc)
7536{
7537 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7538 unsigned int i, len, offset;
cca44b1b 7539 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7540 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7541 const gdb_byte *bkp_insn;
cca44b1b 7542
4db71c0b 7543 offset = 0;
cca44b1b
JB
7544 /* Poke modified instruction(s). */
7545 for (i = 0; i < dsc->numinsns; i++)
7546 {
7547 if (debug_displaced)
4db71c0b
YQ
7548 {
7549 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7550 if (size == 4)
7551 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7552 dsc->modinsn[i]);
7553 else if (size == 2)
7554 fprintf_unfiltered (gdb_stdlog, "%.4x",
7555 (unsigned short)dsc->modinsn[i]);
7556
7557 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7558 (unsigned long) to + offset);
7559
7560 }
7561 write_memory_unsigned_integer (to + offset, size,
7562 byte_order_for_code,
cca44b1b 7563 dsc->modinsn[i]);
4db71c0b
YQ
7564 offset += size;
7565 }
7566
7567 /* Choose the correct breakpoint instruction. */
7568 if (dsc->is_thumb)
7569 {
7570 bkp_insn = tdep->thumb_breakpoint;
7571 len = tdep->thumb_breakpoint_size;
7572 }
7573 else
7574 {
7575 bkp_insn = tdep->arm_breakpoint;
7576 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7577 }
7578
7579 /* Put breakpoint afterwards. */
4db71c0b 7580 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7581
7582 if (debug_displaced)
7583 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7584 paddress (gdbarch, from), paddress (gdbarch, to));
7585}
7586
cca44b1b
JB
7587/* Entry point for cleaning things up after a displaced instruction has been
7588 single-stepped. */
7589
7590void
7591arm_displaced_step_fixup (struct gdbarch *gdbarch,
7592 struct displaced_step_closure *dsc,
7593 CORE_ADDR from, CORE_ADDR to,
7594 struct regcache *regs)
7595{
7596 if (dsc->cleanup)
7597 dsc->cleanup (gdbarch, regs, dsc);
7598
7599 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7600 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7601 dsc->insn_addr + dsc->insn_size);
7602
cca44b1b
JB
7603}
7604
7605#include "bfd-in2.h"
7606#include "libcoff.h"
7607
7608static int
7609gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7610{
9a3c8263 7611 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
9779414d
DJ
7612
7613 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7614 {
7615 static asymbol *asym;
7616 static combined_entry_type ce;
7617 static struct coff_symbol_struct csym;
7618 static struct bfd fake_bfd;
7619 static bfd_target fake_target;
7620
7621 if (csym.native == NULL)
7622 {
7623 /* Create a fake symbol vector containing a Thumb symbol.
7624 This is solely so that the code in print_insn_little_arm()
7625 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7626 the presence of a Thumb symbol and switch to decoding
7627 Thumb instructions. */
7628
7629 fake_target.flavour = bfd_target_coff_flavour;
7630 fake_bfd.xvec = &fake_target;
7631 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7632 csym.native = &ce;
7633 csym.symbol.the_bfd = &fake_bfd;
7634 csym.symbol.name = "fake";
7635 asym = (asymbol *) & csym;
7636 }
7637
7638 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7639 info->symbols = &asym;
7640 }
7641 else
7642 info->symbols = NULL;
7643
7644 if (info->endian == BFD_ENDIAN_BIG)
7645 return print_insn_big_arm (memaddr, info);
7646 else
7647 return print_insn_little_arm (memaddr, info);
7648}
7649
7650/* The following define instruction sequences that will cause ARM
7651 cpu's to take an undefined instruction trap. These are used to
7652 signal a breakpoint to GDB.
7653
7654 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7655 modes. A different instruction is required for each mode. The ARM
7656 cpu's can also be big or little endian. Thus four different
7657 instructions are needed to support all cases.
7658
7659 Note: ARMv4 defines several new instructions that will take the
7660 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7661 not in fact add the new instructions. The new undefined
7662 instructions in ARMv4 are all instructions that had no defined
7663 behaviour in earlier chips. There is no guarantee that they will
7664 raise an exception, but may be treated as NOP's. In practice, it
7665 may only safe to rely on instructions matching:
7666
7667 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7668 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
7669 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
7670
0963b4bd 7671 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7672 following use a condition predicate of ALWAYS so it is always TRUE.
7673
7674 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7675 and NetBSD all use a software interrupt rather than an undefined
7676 instruction to force a trap. This can be handled by by the
7677 abi-specific code during establishment of the gdbarch vector. */
7678
7679#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7680#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7681#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7682#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7683
948f8e3d
PA
7684static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7685static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7686static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7687static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b
JB
7688
7689/* Determine the type and size of breakpoint to insert at PCPTR. Uses
7690 the program counter value to determine whether a 16-bit or 32-bit
7691 breakpoint should be used. It returns a pointer to a string of
7692 bytes that encode a breakpoint instruction, stores the length of
7693 the string to *lenptr, and adjusts the program counter (if
7694 necessary) to point to the actual memory location where the
7695 breakpoint should be inserted. */
7696
7697static const unsigned char *
7698arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
7699{
7700 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7701 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7702
9779414d 7703 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7704 {
7705 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7706
7707 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7708 check whether we are replacing a 32-bit instruction. */
7709 if (tdep->thumb2_breakpoint != NULL)
7710 {
7711 gdb_byte buf[2];
7712 if (target_read_memory (*pcptr, buf, 2) == 0)
7713 {
7714 unsigned short inst1;
7715 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7716 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
7717 {
7718 *lenptr = tdep->thumb2_breakpoint_size;
7719 return tdep->thumb2_breakpoint;
7720 }
7721 }
7722 }
7723
cca44b1b
JB
7724 *lenptr = tdep->thumb_breakpoint_size;
7725 return tdep->thumb_breakpoint;
7726 }
7727 else
7728 {
7729 *lenptr = tdep->arm_breakpoint_size;
7730 return tdep->arm_breakpoint;
7731 }
7732}
7733
177321bd
DJ
7734static void
7735arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
7736 int *kindptr)
7737{
177321bd
DJ
7738 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
7739
9779414d 7740 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
7741 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
7742 that this is not confused with a 32-bit ARM breakpoint. */
7743 *kindptr = 3;
7744}
7745
cca44b1b
JB
7746/* Extract from an array REGBUF containing the (raw) register state a
7747 function return value of type TYPE, and copy that, in virtual
7748 format, into VALBUF. */
7749
7750static void
7751arm_extract_return_value (struct type *type, struct regcache *regs,
7752 gdb_byte *valbuf)
7753{
7754 struct gdbarch *gdbarch = get_regcache_arch (regs);
7755 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7756
7757 if (TYPE_CODE_FLT == TYPE_CODE (type))
7758 {
7759 switch (gdbarch_tdep (gdbarch)->fp_model)
7760 {
7761 case ARM_FLOAT_FPA:
7762 {
7763 /* The value is in register F0 in internal format. We need to
7764 extract the raw value and then convert it to the desired
7765 internal type. */
7766 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7767
7768 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
7769 convert_from_extended (floatformat_from_type (type), tmpbuf,
7770 valbuf, gdbarch_byte_order (gdbarch));
7771 }
7772 break;
7773
7774 case ARM_FLOAT_SOFT_FPA:
7775 case ARM_FLOAT_SOFT_VFP:
7776 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7777 not using the VFP ABI code. */
7778 case ARM_FLOAT_VFP:
7779 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
7780 if (TYPE_LENGTH (type) > 4)
7781 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
7782 valbuf + INT_REGISTER_SIZE);
7783 break;
7784
7785 default:
0963b4bd
MS
7786 internal_error (__FILE__, __LINE__,
7787 _("arm_extract_return_value: "
7788 "Floating point model not supported"));
cca44b1b
JB
7789 break;
7790 }
7791 }
7792 else if (TYPE_CODE (type) == TYPE_CODE_INT
7793 || TYPE_CODE (type) == TYPE_CODE_CHAR
7794 || TYPE_CODE (type) == TYPE_CODE_BOOL
7795 || TYPE_CODE (type) == TYPE_CODE_PTR
7796 || TYPE_CODE (type) == TYPE_CODE_REF
7797 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7798 {
b021a221
MS
7799 /* If the type is a plain integer, then the access is
7800 straight-forward. Otherwise we have to play around a bit
7801 more. */
cca44b1b
JB
7802 int len = TYPE_LENGTH (type);
7803 int regno = ARM_A1_REGNUM;
7804 ULONGEST tmp;
7805
7806 while (len > 0)
7807 {
7808 /* By using store_unsigned_integer we avoid having to do
7809 anything special for small big-endian values. */
7810 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7811 store_unsigned_integer (valbuf,
7812 (len > INT_REGISTER_SIZE
7813 ? INT_REGISTER_SIZE : len),
7814 byte_order, tmp);
7815 len -= INT_REGISTER_SIZE;
7816 valbuf += INT_REGISTER_SIZE;
7817 }
7818 }
7819 else
7820 {
7821 /* For a structure or union the behaviour is as if the value had
7822 been stored to word-aligned memory and then loaded into
7823 registers with 32-bit load instruction(s). */
7824 int len = TYPE_LENGTH (type);
7825 int regno = ARM_A1_REGNUM;
7826 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7827
7828 while (len > 0)
7829 {
7830 regcache_cooked_read (regs, regno++, tmpbuf);
7831 memcpy (valbuf, tmpbuf,
7832 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7833 len -= INT_REGISTER_SIZE;
7834 valbuf += INT_REGISTER_SIZE;
7835 }
7836 }
7837}
7838
7839
7840/* Will a function return an aggregate type in memory or in a
7841 register? Return 0 if an aggregate type can be returned in a
7842 register, 1 if it must be returned in memory. */
7843
7844static int
7845arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7846{
cca44b1b
JB
7847 enum type_code code;
7848
f168693b 7849 type = check_typedef (type);
cca44b1b 7850
b13c8ab2
YQ
7851 /* Simple, non-aggregate types (ie not including vectors and
7852 complex) are always returned in a register (or registers). */
7853 code = TYPE_CODE (type);
7854 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7855 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7856 return 0;
cca44b1b 7857
c4312b19
YQ
7858 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7859 {
7860 /* Vector values should be returned using ARM registers if they
7861 are not over 16 bytes. */
7862 return (TYPE_LENGTH (type) > 16);
7863 }
7864
b13c8ab2 7865 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7866 {
b13c8ab2
YQ
7867 /* The AAPCS says all aggregates not larger than a word are returned
7868 in a register. */
7869 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
7870 return 0;
7871
cca44b1b
JB
7872 return 1;
7873 }
b13c8ab2
YQ
7874 else
7875 {
7876 int nRc;
cca44b1b 7877
b13c8ab2
YQ
7878 /* All aggregate types that won't fit in a register must be returned
7879 in memory. */
7880 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
7881 return 1;
cca44b1b 7882
b13c8ab2
YQ
7883 /* In the ARM ABI, "integer" like aggregate types are returned in
7884 registers. For an aggregate type to be integer like, its size
7885 must be less than or equal to INT_REGISTER_SIZE and the
7886 offset of each addressable subfield must be zero. Note that bit
7887 fields are not addressable, and all addressable subfields of
7888 unions always start at offset zero.
cca44b1b 7889
b13c8ab2
YQ
7890 This function is based on the behaviour of GCC 2.95.1.
7891 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7892
b13c8ab2
YQ
7893 Note: All versions of GCC before GCC 2.95.2 do not set up the
7894 parameters correctly for a function returning the following
7895 structure: struct { float f;}; This should be returned in memory,
7896 not a register. Richard Earnshaw sent me a patch, but I do not
7897 know of any way to detect if a function like the above has been
7898 compiled with the correct calling convention. */
7899
7900 /* Assume all other aggregate types can be returned in a register.
7901 Run a check for structures, unions and arrays. */
7902 nRc = 0;
67255d04 7903
b13c8ab2
YQ
7904 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7905 {
7906 int i;
7907 /* Need to check if this struct/union is "integer" like. For
7908 this to be true, its size must be less than or equal to
7909 INT_REGISTER_SIZE and the offset of each addressable
7910 subfield must be zero. Note that bit fields are not
7911 addressable, and unions always start at offset zero. If any
7912 of the subfields is a floating point type, the struct/union
7913 cannot be an integer type. */
7914
7915 /* For each field in the object, check:
7916 1) Is it FP? --> yes, nRc = 1;
7917 2) Is it addressable (bitpos != 0) and
7918 not packed (bitsize == 0)?
7919 --> yes, nRc = 1
7920 */
7921
7922 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7923 {
b13c8ab2
YQ
7924 enum type_code field_type_code;
7925
7926 field_type_code
7927 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7928 i)));
7929
7930 /* Is it a floating point type field? */
7931 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7932 {
7933 nRc = 1;
7934 break;
7935 }
b13c8ab2
YQ
7936
7937 /* If bitpos != 0, then we have to care about it. */
7938 if (TYPE_FIELD_BITPOS (type, i) != 0)
7939 {
7940 /* Bitfields are not addressable. If the field bitsize is
7941 zero, then the field is not packed. Hence it cannot be
7942 a bitfield or any other packed type. */
7943 if (TYPE_FIELD_BITSIZE (type, i) == 0)
7944 {
7945 nRc = 1;
7946 break;
7947 }
7948 }
67255d04
RE
7949 }
7950 }
67255d04 7951
b13c8ab2
YQ
7952 return nRc;
7953 }
67255d04
RE
7954}
7955
34e8f22d
RE
7956/* Write into appropriate registers a function return value of type
7957 TYPE, given in virtual format. */
7958
7959static void
b508a996 7960arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 7961 const gdb_byte *valbuf)
34e8f22d 7962{
be8626e0 7963 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 7964 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 7965
34e8f22d
RE
7966 if (TYPE_CODE (type) == TYPE_CODE_FLT)
7967 {
e362b510 7968 gdb_byte buf[MAX_REGISTER_SIZE];
34e8f22d 7969
be8626e0 7970 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
7971 {
7972 case ARM_FLOAT_FPA:
7973
be8626e0
MD
7974 convert_to_extended (floatformat_from_type (type), buf, valbuf,
7975 gdbarch_byte_order (gdbarch));
b508a996 7976 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
7977 break;
7978
fd50bc42 7979 case ARM_FLOAT_SOFT_FPA:
08216dd7 7980 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
7981 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7982 not using the VFP ABI code. */
7983 case ARM_FLOAT_VFP:
b508a996
RE
7984 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
7985 if (TYPE_LENGTH (type) > 4)
7986 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 7987 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
7988 break;
7989
7990 default:
9b20d036
MS
7991 internal_error (__FILE__, __LINE__,
7992 _("arm_store_return_value: Floating "
7993 "point model not supported"));
08216dd7
RE
7994 break;
7995 }
34e8f22d 7996 }
b508a996
RE
7997 else if (TYPE_CODE (type) == TYPE_CODE_INT
7998 || TYPE_CODE (type) == TYPE_CODE_CHAR
7999 || TYPE_CODE (type) == TYPE_CODE_BOOL
8000 || TYPE_CODE (type) == TYPE_CODE_PTR
8001 || TYPE_CODE (type) == TYPE_CODE_REF
8002 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8003 {
8004 if (TYPE_LENGTH (type) <= 4)
8005 {
8006 /* Values of one word or less are zero/sign-extended and
8007 returned in r0. */
7a5ea0d4 8008 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8009 LONGEST val = unpack_long (type, valbuf);
8010
e17a4113 8011 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
8012 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8013 }
8014 else
8015 {
8016 /* Integral values greater than one word are stored in consecutive
8017 registers starting with r0. This will always be a multiple of
8018 the regiser size. */
8019 int len = TYPE_LENGTH (type);
8020 int regno = ARM_A1_REGNUM;
8021
8022 while (len > 0)
8023 {
8024 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
8025 len -= INT_REGISTER_SIZE;
8026 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8027 }
8028 }
8029 }
34e8f22d 8030 else
b508a996
RE
8031 {
8032 /* For a structure or union the behaviour is as if the value had
8033 been stored to word-aligned memory and then loaded into
8034 registers with 32-bit load instruction(s). */
8035 int len = TYPE_LENGTH (type);
8036 int regno = ARM_A1_REGNUM;
7a5ea0d4 8037 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8038
8039 while (len > 0)
8040 {
8041 memcpy (tmpbuf, valbuf,
7a5ea0d4 8042 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 8043 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
8044 len -= INT_REGISTER_SIZE;
8045 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8046 }
8047 }
34e8f22d
RE
8048}
8049
2af48f68
PB
8050
8051/* Handle function return values. */
8052
8053static enum return_value_convention
6a3a010b 8054arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8055 struct type *valtype, struct regcache *regcache,
8056 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8057{
7c00367c 8058 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8059 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8060 enum arm_vfp_cprc_base_type vfp_base_type;
8061 int vfp_base_count;
8062
8063 if (arm_vfp_abi_for_function (gdbarch, func_type)
8064 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8065 {
8066 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8067 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8068 int i;
8069 for (i = 0; i < vfp_base_count; i++)
8070 {
58d6951d
DJ
8071 if (reg_char == 'q')
8072 {
8073 if (writebuf)
8074 arm_neon_quad_write (gdbarch, regcache, i,
8075 writebuf + i * unit_length);
8076
8077 if (readbuf)
8078 arm_neon_quad_read (gdbarch, regcache, i,
8079 readbuf + i * unit_length);
8080 }
8081 else
8082 {
8083 char name_buf[4];
8084 int regnum;
8085
8c042590 8086 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8087 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8088 strlen (name_buf));
8089 if (writebuf)
8090 regcache_cooked_write (regcache, regnum,
8091 writebuf + i * unit_length);
8092 if (readbuf)
8093 regcache_cooked_read (regcache, regnum,
8094 readbuf + i * unit_length);
8095 }
90445bd3
DJ
8096 }
8097 return RETURN_VALUE_REGISTER_CONVENTION;
8098 }
7c00367c 8099
2af48f68
PB
8100 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8101 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8102 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8103 {
7c00367c
MK
8104 if (tdep->struct_return == pcc_struct_return
8105 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8106 return RETURN_VALUE_STRUCT_CONVENTION;
8107 }
b13c8ab2
YQ
8108 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8109 {
8110 if (arm_return_in_memory (gdbarch, valtype))
8111 return RETURN_VALUE_STRUCT_CONVENTION;
8112 }
7052e42c 8113
2af48f68
PB
8114 if (writebuf)
8115 arm_store_return_value (valtype, regcache, writebuf);
8116
8117 if (readbuf)
8118 arm_extract_return_value (valtype, regcache, readbuf);
8119
8120 return RETURN_VALUE_REGISTER_CONVENTION;
8121}
8122
8123
9df628e0 8124static int
60ade65d 8125arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8126{
e17a4113
UW
8127 struct gdbarch *gdbarch = get_frame_arch (frame);
8128 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8129 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8130 CORE_ADDR jb_addr;
e362b510 8131 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 8132
60ade65d 8133 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8134
8135 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 8136 INT_REGISTER_SIZE))
9df628e0
RE
8137 return 0;
8138
e17a4113 8139 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8140 return 1;
8141}
8142
faa95490
DJ
8143/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8144 return the target PC. Otherwise return 0. */
c906108c
SS
8145
8146CORE_ADDR
52f729a7 8147arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8148{
2c02bd72 8149 const char *name;
faa95490 8150 int namelen;
c906108c
SS
8151 CORE_ADDR start_addr;
8152
8153 /* Find the starting address and name of the function containing the PC. */
8154 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8155 {
8156 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8157 check here. */
8158 start_addr = arm_skip_bx_reg (frame, pc);
8159 if (start_addr != 0)
8160 return start_addr;
8161
8162 return 0;
8163 }
c906108c 8164
faa95490
DJ
8165 /* If PC is in a Thumb call or return stub, return the address of the
8166 target PC, which is in a register. The thunk functions are called
8167 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8168 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8169 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8170 if (startswith (name, "_call_via_")
8171 || startswith (name, "__ARM_call_via_"))
c906108c 8172 {
ed9a39eb
JM
8173 /* Use the name suffix to determine which register contains the
8174 target PC. */
c5aa993b
JM
8175 static char *table[15] =
8176 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8177 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8178 };
c906108c 8179 int regno;
faa95490 8180 int offset = strlen (name) - 2;
c906108c
SS
8181
8182 for (regno = 0; regno <= 14; regno++)
faa95490 8183 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8184 return get_frame_register_unsigned (frame, regno);
c906108c 8185 }
ed9a39eb 8186
faa95490
DJ
8187 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8188 non-interworking calls to foo. We could decode the stubs
8189 to find the target but it's easier to use the symbol table. */
8190 namelen = strlen (name);
8191 if (name[0] == '_' && name[1] == '_'
8192 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8193 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8194 || (namelen > 2 + strlen ("_from_arm")
61012eef 8195 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8196 {
8197 char *target_name;
8198 int target_len = namelen - 2;
3b7344d5 8199 struct bound_minimal_symbol minsym;
faa95490
DJ
8200 struct objfile *objfile;
8201 struct obj_section *sec;
8202
8203 if (name[namelen - 1] == 'b')
8204 target_len -= strlen ("_from_thumb");
8205 else
8206 target_len -= strlen ("_from_arm");
8207
224c3ddb 8208 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8209 memcpy (target_name, name + 2, target_len);
8210 target_name[target_len] = '\0';
8211
8212 sec = find_pc_section (pc);
8213 objfile = (sec == NULL) ? NULL : sec->objfile;
8214 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8215 if (minsym.minsym != NULL)
77e371c0 8216 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8217 else
8218 return 0;
8219 }
8220
c5aa993b 8221 return 0; /* not a stub */
c906108c
SS
8222}
8223
afd7eef0
RE
8224static void
8225set_arm_command (char *args, int from_tty)
8226{
edefbb7c
AC
8227 printf_unfiltered (_("\
8228\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8229 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8230}
8231
8232static void
8233show_arm_command (char *args, int from_tty)
8234{
26304000 8235 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8236}
8237
28e97307
DJ
8238static void
8239arm_update_current_architecture (void)
fd50bc42 8240{
28e97307 8241 struct gdbarch_info info;
fd50bc42 8242
28e97307 8243 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8244 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8245 return;
fd50bc42 8246
28e97307
DJ
8247 /* Update the architecture. */
8248 gdbarch_info_init (&info);
fd50bc42 8249
28e97307 8250 if (!gdbarch_update_p (info))
9b20d036 8251 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8252}
8253
8254static void
8255set_fp_model_sfunc (char *args, int from_tty,
8256 struct cmd_list_element *c)
8257{
570dc176 8258 int fp_model;
fd50bc42
RE
8259
8260 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8261 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8262 {
aead7601 8263 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8264 break;
8265 }
8266
8267 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8268 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8269 current_fp_model);
8270
28e97307 8271 arm_update_current_architecture ();
fd50bc42
RE
8272}
8273
8274static void
08546159
AC
8275show_fp_model (struct ui_file *file, int from_tty,
8276 struct cmd_list_element *c, const char *value)
fd50bc42 8277{
f5656ead 8278 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8279
28e97307 8280 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8281 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8282 fprintf_filtered (file, _("\
8283The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8284 fp_model_strings[tdep->fp_model]);
8285 else
8286 fprintf_filtered (file, _("\
8287The current ARM floating point model is \"%s\".\n"),
8288 fp_model_strings[arm_fp_model]);
8289}
8290
8291static void
8292arm_set_abi (char *args, int from_tty,
8293 struct cmd_list_element *c)
8294{
570dc176 8295 int arm_abi;
28e97307
DJ
8296
8297 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8298 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8299 {
aead7601 8300 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8301 break;
8302 }
8303
8304 if (arm_abi == ARM_ABI_LAST)
8305 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8306 arm_abi_string);
8307
8308 arm_update_current_architecture ();
8309}
8310
8311static void
8312arm_show_abi (struct ui_file *file, int from_tty,
8313 struct cmd_list_element *c, const char *value)
8314{
f5656ead 8315 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8316
8317 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8318 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8319 fprintf_filtered (file, _("\
8320The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8321 arm_abi_strings[tdep->arm_abi]);
8322 else
8323 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8324 arm_abi_string);
fd50bc42
RE
8325}
8326
0428b8f5
DJ
8327static void
8328arm_show_fallback_mode (struct ui_file *file, int from_tty,
8329 struct cmd_list_element *c, const char *value)
8330{
0963b4bd
MS
8331 fprintf_filtered (file,
8332 _("The current execution mode assumed "
8333 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8334 arm_fallback_mode_string);
8335}
8336
8337static void
8338arm_show_force_mode (struct ui_file *file, int from_tty,
8339 struct cmd_list_element *c, const char *value)
8340{
0963b4bd
MS
8341 fprintf_filtered (file,
8342 _("The current execution mode assumed "
8343 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8344 arm_force_mode_string);
8345}
8346
afd7eef0
RE
8347/* If the user changes the register disassembly style used for info
8348 register and other commands, we have to also switch the style used
8349 in opcodes for disassembly output. This function is run in the "set
8350 arm disassembly" command, and does that. */
bc90b915
FN
8351
8352static void
afd7eef0 8353set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
8354 struct cmd_list_element *c)
8355{
afd7eef0 8356 set_disassembly_style ();
bc90b915
FN
8357}
8358\f
966fbf70 8359/* Return the ARM register name corresponding to register I. */
a208b0cb 8360static const char *
d93859e2 8361arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8362{
58d6951d
DJ
8363 const int num_regs = gdbarch_num_regs (gdbarch);
8364
8365 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8366 && i >= num_regs && i < num_regs + 32)
8367 {
8368 static const char *const vfp_pseudo_names[] = {
8369 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8370 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8371 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8372 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8373 };
8374
8375 return vfp_pseudo_names[i - num_regs];
8376 }
8377
8378 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8379 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8380 {
8381 static const char *const neon_pseudo_names[] = {
8382 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8383 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8384 };
8385
8386 return neon_pseudo_names[i - num_regs - 32];
8387 }
8388
ff6f572f
DJ
8389 if (i >= ARRAY_SIZE (arm_register_names))
8390 /* These registers are only supported on targets which supply
8391 an XML description. */
8392 return "";
8393
966fbf70
RE
8394 return arm_register_names[i];
8395}
8396
bc90b915 8397static void
afd7eef0 8398set_disassembly_style (void)
bc90b915 8399{
123dc839 8400 int current;
bc90b915 8401
123dc839
DJ
8402 /* Find the style that the user wants. */
8403 for (current = 0; current < num_disassembly_options; current++)
8404 if (disassembly_style == valid_disassembly_styles[current])
8405 break;
8406 gdb_assert (current < num_disassembly_options);
bc90b915 8407
94c30b78 8408 /* Synchronize the disassembler. */
bc90b915
FN
8409 set_arm_regname_option (current);
8410}
8411
082fc60d
RE
8412/* Test whether the coff symbol specific value corresponds to a Thumb
8413 function. */
8414
8415static int
8416coff_sym_is_thumb (int val)
8417{
f8bf5763
PM
8418 return (val == C_THUMBEXT
8419 || val == C_THUMBSTAT
8420 || val == C_THUMBEXTFUNC
8421 || val == C_THUMBSTATFUNC
8422 || val == C_THUMBLABEL);
082fc60d
RE
8423}
8424
8425/* arm_coff_make_msymbol_special()
8426 arm_elf_make_msymbol_special()
8427
8428 These functions test whether the COFF or ELF symbol corresponds to
8429 an address in thumb code, and set a "special" bit in a minimal
8430 symbol to indicate that it does. */
8431
34e8f22d 8432static void
082fc60d
RE
8433arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8434{
467d42c4
UW
8435 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
8436 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8437 MSYMBOL_SET_SPECIAL (msym);
8438}
8439
34e8f22d 8440static void
082fc60d
RE
8441arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8442{
8443 if (coff_sym_is_thumb (val))
8444 MSYMBOL_SET_SPECIAL (msym);
8445}
8446
60c5725c 8447static void
c1bd65d0 8448arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 8449{
9a3c8263 8450 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
8451 unsigned int i;
8452
8453 for (i = 0; i < objfile->obfd->section_count; i++)
8454 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8455}
8456
8457static void
8458arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8459 asymbol *sym)
8460{
8461 const char *name = bfd_asymbol_name (sym);
8462 struct arm_per_objfile *data;
8463 VEC(arm_mapping_symbol_s) **map_p;
8464 struct arm_mapping_symbol new_map_sym;
8465
8466 gdb_assert (name[0] == '$');
8467 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8468 return;
8469
9a3c8263
SM
8470 data = (struct arm_per_objfile *) objfile_data (objfile,
8471 arm_objfile_data_key);
60c5725c
DJ
8472 if (data == NULL)
8473 {
8474 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8475 struct arm_per_objfile);
8476 set_objfile_data (objfile, arm_objfile_data_key, data);
8477 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8478 objfile->obfd->section_count,
8479 VEC(arm_mapping_symbol_s) *);
8480 }
8481 map_p = &data->section_maps[bfd_get_section (sym)->index];
8482
8483 new_map_sym.value = sym->value;
8484 new_map_sym.type = name[1];
8485
8486 /* Assume that most mapping symbols appear in order of increasing
8487 value. If they were randomly distributed, it would be faster to
8488 always push here and then sort at first use. */
8489 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8490 {
8491 struct arm_mapping_symbol *prev_map_sym;
8492
8493 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8494 if (prev_map_sym->value >= sym->value)
8495 {
8496 unsigned int idx;
8497 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8498 arm_compare_mapping_symbols);
8499 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8500 return;
8501 }
8502 }
8503
8504 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8505}
8506
756fe439 8507static void
61a1198a 8508arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8509{
9779414d 8510 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 8511 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8512
8513 /* If necessary, set the T bit. */
8514 if (arm_apcs_32)
8515 {
9779414d 8516 ULONGEST val, t_bit;
61a1198a 8517 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8518 t_bit = arm_psr_thumb_bit (gdbarch);
8519 if (arm_pc_is_thumb (gdbarch, pc))
8520 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8521 val | t_bit);
756fe439 8522 else
61a1198a 8523 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8524 val & ~t_bit);
756fe439
DJ
8525 }
8526}
123dc839 8527
58d6951d
DJ
8528/* Read the contents of a NEON quad register, by reading from two
8529 double registers. This is used to implement the quad pseudo
8530 registers, and for argument passing in case the quad registers are
8531 missing; vectors are passed in quad registers when using the VFP
8532 ABI, even if a NEON unit is not present. REGNUM is the index of
8533 the quad register, in [0, 15]. */
8534
05d1431c 8535static enum register_status
58d6951d
DJ
8536arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
8537 int regnum, gdb_byte *buf)
8538{
8539 char name_buf[4];
8540 gdb_byte reg_buf[8];
8541 int offset, double_regnum;
05d1431c 8542 enum register_status status;
58d6951d 8543
8c042590 8544 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8545 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8546 strlen (name_buf));
8547
8548 /* d0 is always the least significant half of q0. */
8549 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8550 offset = 8;
8551 else
8552 offset = 0;
8553
05d1431c
PA
8554 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8555 if (status != REG_VALID)
8556 return status;
58d6951d
DJ
8557 memcpy (buf + offset, reg_buf, 8);
8558
8559 offset = 8 - offset;
05d1431c
PA
8560 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
8561 if (status != REG_VALID)
8562 return status;
58d6951d 8563 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8564
8565 return REG_VALID;
58d6951d
DJ
8566}
8567
05d1431c 8568static enum register_status
58d6951d
DJ
8569arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
8570 int regnum, gdb_byte *buf)
8571{
8572 const int num_regs = gdbarch_num_regs (gdbarch);
8573 char name_buf[4];
8574 gdb_byte reg_buf[8];
8575 int offset, double_regnum;
8576
8577 gdb_assert (regnum >= num_regs);
8578 regnum -= num_regs;
8579
8580 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8581 /* Quad-precision register. */
05d1431c 8582 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8583 else
8584 {
05d1431c
PA
8585 enum register_status status;
8586
58d6951d
DJ
8587 /* Single-precision register. */
8588 gdb_assert (regnum < 32);
8589
8590 /* s0 is always the least significant half of d0. */
8591 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8592 offset = (regnum & 1) ? 0 : 4;
8593 else
8594 offset = (regnum & 1) ? 4 : 0;
8595
8c042590 8596 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8597 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8598 strlen (name_buf));
8599
05d1431c
PA
8600 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8601 if (status == REG_VALID)
8602 memcpy (buf, reg_buf + offset, 4);
8603 return status;
58d6951d
DJ
8604 }
8605}
8606
8607/* Store the contents of BUF to a NEON quad register, by writing to
8608 two double registers. This is used to implement the quad pseudo
8609 registers, and for argument passing in case the quad registers are
8610 missing; vectors are passed in quad registers when using the VFP
8611 ABI, even if a NEON unit is not present. REGNUM is the index
8612 of the quad register, in [0, 15]. */
8613
8614static void
8615arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8616 int regnum, const gdb_byte *buf)
8617{
8618 char name_buf[4];
58d6951d
DJ
8619 int offset, double_regnum;
8620
8c042590 8621 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8622 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8623 strlen (name_buf));
8624
8625 /* d0 is always the least significant half of q0. */
8626 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8627 offset = 8;
8628 else
8629 offset = 0;
8630
8631 regcache_raw_write (regcache, double_regnum, buf + offset);
8632 offset = 8 - offset;
8633 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
8634}
8635
8636static void
8637arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8638 int regnum, const gdb_byte *buf)
8639{
8640 const int num_regs = gdbarch_num_regs (gdbarch);
8641 char name_buf[4];
8642 gdb_byte reg_buf[8];
8643 int offset, double_regnum;
8644
8645 gdb_assert (regnum >= num_regs);
8646 regnum -= num_regs;
8647
8648 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8649 /* Quad-precision register. */
8650 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8651 else
8652 {
8653 /* Single-precision register. */
8654 gdb_assert (regnum < 32);
8655
8656 /* s0 is always the least significant half of d0. */
8657 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8658 offset = (regnum & 1) ? 0 : 4;
8659 else
8660 offset = (regnum & 1) ? 4 : 0;
8661
8c042590 8662 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8663 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8664 strlen (name_buf));
8665
8666 regcache_raw_read (regcache, double_regnum, reg_buf);
8667 memcpy (reg_buf + offset, buf, 4);
8668 regcache_raw_write (regcache, double_regnum, reg_buf);
8669 }
8670}
8671
123dc839
DJ
8672static struct value *
8673value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8674{
9a3c8263 8675 const int *reg_p = (const int *) baton;
123dc839
DJ
8676 return value_of_register (*reg_p, frame);
8677}
97e03143 8678\f
70f80edf
JT
8679static enum gdb_osabi
8680arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8681{
2af48f68 8682 unsigned int elfosabi;
70f80edf 8683 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8684
70f80edf 8685 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8686
28e97307
DJ
8687 if (elfosabi == ELFOSABI_ARM)
8688 /* GNU tools use this value. Check note sections in this case,
8689 as well. */
8690 bfd_map_over_sections (abfd,
8691 generic_elf_osabi_sniff_abi_tag_sections,
8692 &osabi);
97e03143 8693
28e97307 8694 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8695 return osabi;
97e03143
RE
8696}
8697
54483882
YQ
8698static int
8699arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8700 struct reggroup *group)
8701{
2c291032
YQ
8702 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8703 this, FPS register belongs to save_regroup, restore_reggroup, and
8704 all_reggroup, of course. */
54483882 8705 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8706 return (group == float_reggroup
8707 || group == save_reggroup
8708 || group == restore_reggroup
8709 || group == all_reggroup);
54483882
YQ
8710 else
8711 return default_register_reggroup_p (gdbarch, regnum, group);
8712}
8713
25f8c692
JL
8714\f
8715/* For backward-compatibility we allow two 'g' packet lengths with
8716 the remote protocol depending on whether FPA registers are
8717 supplied. M-profile targets do not have FPA registers, but some
8718 stubs already exist in the wild which use a 'g' packet which
8719 supplies them albeit with dummy values. The packet format which
8720 includes FPA registers should be considered deprecated for
8721 M-profile targets. */
8722
8723static void
8724arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8725{
8726 if (gdbarch_tdep (gdbarch)->is_m)
8727 {
8728 /* If we know from the executable this is an M-profile target,
8729 cater for remote targets whose register set layout is the
8730 same as the FPA layout. */
8731 register_remote_g_packet_guess (gdbarch,
03145bf4 8732 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
8733 (16 * INT_REGISTER_SIZE)
8734 + (8 * FP_REGISTER_SIZE)
8735 + (2 * INT_REGISTER_SIZE),
8736 tdesc_arm_with_m_fpa_layout);
8737
8738 /* The regular M-profile layout. */
8739 register_remote_g_packet_guess (gdbarch,
8740 /* r0-r12,sp,lr,pc; xpsr */
8741 (16 * INT_REGISTER_SIZE)
8742 + INT_REGISTER_SIZE,
8743 tdesc_arm_with_m);
3184d3f9
JL
8744
8745 /* M-profile plus M4F VFP. */
8746 register_remote_g_packet_guess (gdbarch,
8747 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8748 (16 * INT_REGISTER_SIZE)
8749 + (16 * VFP_REGISTER_SIZE)
8750 + (2 * INT_REGISTER_SIZE),
8751 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8752 }
8753
8754 /* Otherwise we don't have a useful guess. */
8755}
8756
70f80edf 8757\f
da3c6d4a
MS
8758/* Initialize the current architecture based on INFO. If possible,
8759 re-use an architecture from ARCHES, which is a list of
8760 architectures already created during this debugging session.
97e03143 8761
da3c6d4a
MS
8762 Called e.g. at program startup, when reading a core file, and when
8763 reading a binary file. */
97e03143 8764
39bbf761
RE
8765static struct gdbarch *
8766arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8767{
97e03143 8768 struct gdbarch_tdep *tdep;
39bbf761 8769 struct gdbarch *gdbarch;
28e97307
DJ
8770 struct gdbarch_list *best_arch;
8771 enum arm_abi_kind arm_abi = arm_abi_global;
8772 enum arm_float_model fp_model = arm_fp_model;
123dc839 8773 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8774 int i, is_m = 0;
330c6ca9 8775 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8776 int have_wmmx_registers = 0;
58d6951d 8777 int have_neon = 0;
ff6f572f 8778 int have_fpa_registers = 1;
9779414d
DJ
8779 const struct target_desc *tdesc = info.target_desc;
8780
8781 /* If we have an object to base this architecture on, try to determine
8782 its ABI. */
8783
8784 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8785 {
8786 int ei_osabi, e_flags;
8787
8788 switch (bfd_get_flavour (info.abfd))
8789 {
8790 case bfd_target_aout_flavour:
8791 /* Assume it's an old APCS-style ABI. */
8792 arm_abi = ARM_ABI_APCS;
8793 break;
8794
8795 case bfd_target_coff_flavour:
8796 /* Assume it's an old APCS-style ABI. */
8797 /* XXX WinCE? */
8798 arm_abi = ARM_ABI_APCS;
8799 break;
8800
8801 case bfd_target_elf_flavour:
8802 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8803 e_flags = elf_elfheader (info.abfd)->e_flags;
8804
8805 if (ei_osabi == ELFOSABI_ARM)
8806 {
8807 /* GNU tools used to use this value, but do not for EABI
8808 objects. There's nowhere to tag an EABI version
8809 anyway, so assume APCS. */
8810 arm_abi = ARM_ABI_APCS;
8811 }
d403db27 8812 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8813 {
8814 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8815 int attr_arch, attr_profile;
8816
8817 switch (eabi_ver)
8818 {
8819 case EF_ARM_EABI_UNKNOWN:
8820 /* Assume GNU tools. */
8821 arm_abi = ARM_ABI_APCS;
8822 break;
8823
8824 case EF_ARM_EABI_VER4:
8825 case EF_ARM_EABI_VER5:
8826 arm_abi = ARM_ABI_AAPCS;
8827 /* EABI binaries default to VFP float ordering.
8828 They may also contain build attributes that can
8829 be used to identify if the VFP argument-passing
8830 ABI is in use. */
8831 if (fp_model == ARM_FLOAT_AUTO)
8832 {
8833#ifdef HAVE_ELF
8834 switch (bfd_elf_get_obj_attr_int (info.abfd,
8835 OBJ_ATTR_PROC,
8836 Tag_ABI_VFP_args))
8837 {
b35b0298 8838 case AEABI_VFP_args_base:
9779414d
DJ
8839 /* "The user intended FP parameter/result
8840 passing to conform to AAPCS, base
8841 variant". */
8842 fp_model = ARM_FLOAT_SOFT_VFP;
8843 break;
b35b0298 8844 case AEABI_VFP_args_vfp:
9779414d
DJ
8845 /* "The user intended FP parameter/result
8846 passing to conform to AAPCS, VFP
8847 variant". */
8848 fp_model = ARM_FLOAT_VFP;
8849 break;
b35b0298 8850 case AEABI_VFP_args_toolchain:
9779414d
DJ
8851 /* "The user intended FP parameter/result
8852 passing to conform to tool chain-specific
8853 conventions" - we don't know any such
8854 conventions, so leave it as "auto". */
8855 break;
b35b0298 8856 case AEABI_VFP_args_compatible:
5c294fee
TG
8857 /* "Code is compatible with both the base
8858 and VFP variants; the user did not permit
8859 non-variadic functions to pass FP
8860 parameters/results" - leave it as
8861 "auto". */
8862 break;
9779414d
DJ
8863 default:
8864 /* Attribute value not mentioned in the
5c294fee 8865 November 2012 ABI, so leave it as
9779414d
DJ
8866 "auto". */
8867 break;
8868 }
8869#else
8870 fp_model = ARM_FLOAT_SOFT_VFP;
8871#endif
8872 }
8873 break;
8874
8875 default:
8876 /* Leave it as "auto". */
8877 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8878 break;
8879 }
8880
8881#ifdef HAVE_ELF
8882 /* Detect M-profile programs. This only works if the
8883 executable file includes build attributes; GCC does
8884 copy them to the executable, but e.g. RealView does
8885 not. */
8886 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8887 Tag_CPU_arch);
0963b4bd
MS
8888 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
8889 OBJ_ATTR_PROC,
9779414d
DJ
8890 Tag_CPU_arch_profile);
8891 /* GCC specifies the profile for v6-M; RealView only
8892 specifies the profile for architectures starting with
8893 V7 (as opposed to architectures with a tag
8894 numerically greater than TAG_CPU_ARCH_V7). */
8895 if (!tdesc_has_registers (tdesc)
8896 && (attr_arch == TAG_CPU_ARCH_V6_M
8897 || attr_arch == TAG_CPU_ARCH_V6S_M
8898 || attr_profile == 'M'))
25f8c692 8899 is_m = 1;
9779414d
DJ
8900#endif
8901 }
8902
8903 if (fp_model == ARM_FLOAT_AUTO)
8904 {
8905 int e_flags = elf_elfheader (info.abfd)->e_flags;
8906
8907 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8908 {
8909 case 0:
8910 /* Leave it as "auto". Strictly speaking this case
8911 means FPA, but almost nobody uses that now, and
8912 many toolchains fail to set the appropriate bits
8913 for the floating-point model they use. */
8914 break;
8915 case EF_ARM_SOFT_FLOAT:
8916 fp_model = ARM_FLOAT_SOFT_FPA;
8917 break;
8918 case EF_ARM_VFP_FLOAT:
8919 fp_model = ARM_FLOAT_VFP;
8920 break;
8921 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
8922 fp_model = ARM_FLOAT_SOFT_VFP;
8923 break;
8924 }
8925 }
8926
8927 if (e_flags & EF_ARM_BE8)
8928 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
8929
8930 break;
8931
8932 default:
8933 /* Leave it as "auto". */
8934 break;
8935 }
8936 }
123dc839
DJ
8937
8938 /* Check any target description for validity. */
9779414d 8939 if (tdesc_has_registers (tdesc))
123dc839
DJ
8940 {
8941 /* For most registers we require GDB's default names; but also allow
8942 the numeric names for sp / lr / pc, as a convenience. */
8943 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
8944 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
8945 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
8946
8947 const struct tdesc_feature *feature;
58d6951d 8948 int valid_p;
123dc839 8949
9779414d 8950 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8951 "org.gnu.gdb.arm.core");
8952 if (feature == NULL)
9779414d
DJ
8953 {
8954 feature = tdesc_find_feature (tdesc,
8955 "org.gnu.gdb.arm.m-profile");
8956 if (feature == NULL)
8957 return NULL;
8958 else
8959 is_m = 1;
8960 }
123dc839
DJ
8961
8962 tdesc_data = tdesc_data_alloc ();
8963
8964 valid_p = 1;
8965 for (i = 0; i < ARM_SP_REGNUM; i++)
8966 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
8967 arm_register_names[i]);
8968 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8969 ARM_SP_REGNUM,
8970 arm_sp_names);
8971 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8972 ARM_LR_REGNUM,
8973 arm_lr_names);
8974 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8975 ARM_PC_REGNUM,
8976 arm_pc_names);
9779414d
DJ
8977 if (is_m)
8978 valid_p &= tdesc_numbered_register (feature, tdesc_data,
8979 ARM_PS_REGNUM, "xpsr");
8980 else
8981 valid_p &= tdesc_numbered_register (feature, tdesc_data,
8982 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
8983
8984 if (!valid_p)
8985 {
8986 tdesc_data_cleanup (tdesc_data);
8987 return NULL;
8988 }
8989
9779414d 8990 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8991 "org.gnu.gdb.arm.fpa");
8992 if (feature != NULL)
8993 {
8994 valid_p = 1;
8995 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
8996 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
8997 arm_register_names[i]);
8998 if (!valid_p)
8999 {
9000 tdesc_data_cleanup (tdesc_data);
9001 return NULL;
9002 }
9003 }
ff6f572f
DJ
9004 else
9005 have_fpa_registers = 0;
9006
9779414d 9007 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9008 "org.gnu.gdb.xscale.iwmmxt");
9009 if (feature != NULL)
9010 {
9011 static const char *const iwmmxt_names[] = {
9012 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9013 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9014 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9015 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9016 };
9017
9018 valid_p = 1;
9019 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9020 valid_p
9021 &= tdesc_numbered_register (feature, tdesc_data, i,
9022 iwmmxt_names[i - ARM_WR0_REGNUM]);
9023
9024 /* Check for the control registers, but do not fail if they
9025 are missing. */
9026 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9027 tdesc_numbered_register (feature, tdesc_data, i,
9028 iwmmxt_names[i - ARM_WR0_REGNUM]);
9029
9030 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9031 valid_p
9032 &= tdesc_numbered_register (feature, tdesc_data, i,
9033 iwmmxt_names[i - ARM_WR0_REGNUM]);
9034
9035 if (!valid_p)
9036 {
9037 tdesc_data_cleanup (tdesc_data);
9038 return NULL;
9039 }
a56cc1ce
YQ
9040
9041 have_wmmx_registers = 1;
ff6f572f 9042 }
58d6951d
DJ
9043
9044 /* If we have a VFP unit, check whether the single precision registers
9045 are present. If not, then we will synthesize them as pseudo
9046 registers. */
9779414d 9047 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9048 "org.gnu.gdb.arm.vfp");
9049 if (feature != NULL)
9050 {
9051 static const char *const vfp_double_names[] = {
9052 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9053 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9054 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9055 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9056 };
9057
9058 /* Require the double precision registers. There must be either
9059 16 or 32. */
9060 valid_p = 1;
9061 for (i = 0; i < 32; i++)
9062 {
9063 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9064 ARM_D0_REGNUM + i,
9065 vfp_double_names[i]);
9066 if (!valid_p)
9067 break;
9068 }
2b9e5ea6
UW
9069 if (!valid_p && i == 16)
9070 valid_p = 1;
58d6951d 9071
2b9e5ea6
UW
9072 /* Also require FPSCR. */
9073 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9074 ARM_FPSCR_REGNUM, "fpscr");
9075 if (!valid_p)
58d6951d
DJ
9076 {
9077 tdesc_data_cleanup (tdesc_data);
9078 return NULL;
9079 }
9080
9081 if (tdesc_unnumbered_register (feature, "s0") == 0)
9082 have_vfp_pseudos = 1;
9083
330c6ca9 9084 vfp_register_count = i;
58d6951d
DJ
9085
9086 /* If we have VFP, also check for NEON. The architecture allows
9087 NEON without VFP (integer vector operations only), but GDB
9088 does not support that. */
9779414d 9089 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9090 "org.gnu.gdb.arm.neon");
9091 if (feature != NULL)
9092 {
9093 /* NEON requires 32 double-precision registers. */
9094 if (i != 32)
9095 {
9096 tdesc_data_cleanup (tdesc_data);
9097 return NULL;
9098 }
9099
9100 /* If there are quad registers defined by the stub, use
9101 their type; otherwise (normally) provide them with
9102 the default type. */
9103 if (tdesc_unnumbered_register (feature, "q0") == 0)
9104 have_neon_pseudos = 1;
9105
9106 have_neon = 1;
9107 }
9108 }
123dc839 9109 }
39bbf761 9110
28e97307
DJ
9111 /* If there is already a candidate, use it. */
9112 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9113 best_arch != NULL;
9114 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9115 {
b8926edc
DJ
9116 if (arm_abi != ARM_ABI_AUTO
9117 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9118 continue;
9119
b8926edc
DJ
9120 if (fp_model != ARM_FLOAT_AUTO
9121 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9122 continue;
9123
58d6951d
DJ
9124 /* There are various other properties in tdep that we do not
9125 need to check here: those derived from a target description,
9126 since gdbarches with a different target description are
9127 automatically disqualified. */
9128
9779414d
DJ
9129 /* Do check is_m, though, since it might come from the binary. */
9130 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9131 continue;
9132
28e97307
DJ
9133 /* Found a match. */
9134 break;
9135 }
97e03143 9136
28e97307 9137 if (best_arch != NULL)
123dc839
DJ
9138 {
9139 if (tdesc_data != NULL)
9140 tdesc_data_cleanup (tdesc_data);
9141 return best_arch->gdbarch;
9142 }
28e97307 9143
8d749320 9144 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9145 gdbarch = gdbarch_alloc (&info, tdep);
9146
28e97307
DJ
9147 /* Record additional information about the architecture we are defining.
9148 These are gdbarch discriminators, like the OSABI. */
9149 tdep->arm_abi = arm_abi;
9150 tdep->fp_model = fp_model;
9779414d 9151 tdep->is_m = is_m;
ff6f572f 9152 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9153 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9154 gdb_assert (vfp_register_count == 0
9155 || vfp_register_count == 16
9156 || vfp_register_count == 32);
9157 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9158 tdep->have_vfp_pseudos = have_vfp_pseudos;
9159 tdep->have_neon_pseudos = have_neon_pseudos;
9160 tdep->have_neon = have_neon;
08216dd7 9161
25f8c692
JL
9162 arm_register_g_packet_guesses (gdbarch);
9163
08216dd7 9164 /* Breakpoints. */
9d4fde75 9165 switch (info.byte_order_for_code)
67255d04
RE
9166 {
9167 case BFD_ENDIAN_BIG:
66e810cd
RE
9168 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9169 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9170 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9171 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9172
67255d04
RE
9173 break;
9174
9175 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9176 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9177 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9178 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9179 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9180
67255d04
RE
9181 break;
9182
9183 default:
9184 internal_error (__FILE__, __LINE__,
edefbb7c 9185 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9186 }
9187
d7b486e7
RE
9188 /* On ARM targets char defaults to unsigned. */
9189 set_gdbarch_char_signed (gdbarch, 0);
9190
cca44b1b
JB
9191 /* Note: for displaced stepping, this includes the breakpoint, and one word
9192 of additional scratch space. This setting isn't used for anything beside
9193 displaced stepping at present. */
9194 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9195
9df628e0 9196 /* This should be low enough for everything. */
97e03143 9197 tdep->lowest_pc = 0x20;
94c30b78 9198 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9199
7c00367c
MK
9200 /* The default, for both APCS and AAPCS, is to return small
9201 structures in registers. */
9202 tdep->struct_return = reg_struct_return;
9203
2dd604e7 9204 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9205 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9206
756fe439
DJ
9207 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9208
148754e5 9209 /* Frame handling. */
a262aec2 9210 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
9211 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
9212 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
9213
eb5492fa 9214 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9215
34e8f22d 9216 /* Address manipulation. */
34e8f22d
RE
9217 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9218
34e8f22d
RE
9219 /* Advance PC across function entry code. */
9220 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9221
c9cf6e20
MG
9222 /* Detect whether PC is at a point where the stack has been destroyed. */
9223 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9224
190dce09
UW
9225 /* Skip trampolines. */
9226 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9227
34e8f22d
RE
9228 /* The stack grows downward. */
9229 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9230
9231 /* Breakpoint manipulation. */
9232 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
9233 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
9234 arm_remote_breakpoint_from_pc);
34e8f22d
RE
9235
9236 /* Information about registers, etc. */
34e8f22d
RE
9237 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9238 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9239 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9240 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9241 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9242
ff6f572f
DJ
9243 /* This "info float" is FPA-specific. Use the generic version if we
9244 do not have FPA. */
9245 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9246 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9247
26216b98 9248 /* Internal <-> external register number maps. */
ff6f572f 9249 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9250 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9251
34e8f22d
RE
9252 set_gdbarch_register_name (gdbarch, arm_register_name);
9253
9254 /* Returning results. */
2af48f68 9255 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9256
03d48a7d
RE
9257 /* Disassembly. */
9258 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9259
34e8f22d
RE
9260 /* Minsymbol frobbing. */
9261 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9262 set_gdbarch_coff_make_msymbol_special (gdbarch,
9263 arm_coff_make_msymbol_special);
60c5725c 9264 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9265
f9d67f43
DJ
9266 /* Thumb-2 IT block support. */
9267 set_gdbarch_adjust_breakpoint_address (gdbarch,
9268 arm_adjust_breakpoint_address);
9269
0d5de010
DJ
9270 /* Virtual tables. */
9271 set_gdbarch_vbit_in_delta (gdbarch, 1);
9272
97e03143 9273 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9274 gdbarch_init_osabi (info, gdbarch);
97e03143 9275
b39cc962
DJ
9276 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9277
eb5492fa 9278 /* Add some default predicates. */
2ae28aa9
YQ
9279 if (is_m)
9280 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9281 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9282 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9283 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 9284 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9285
97e03143
RE
9286 /* Now we have tuned the configuration, set a few final things,
9287 based on what the OS ABI has told us. */
9288
b8926edc
DJ
9289 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9290 binaries are always marked. */
9291 if (tdep->arm_abi == ARM_ABI_AUTO)
9292 tdep->arm_abi = ARM_ABI_APCS;
9293
e3039479
UW
9294 /* Watchpoints are not steppable. */
9295 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9296
b8926edc
DJ
9297 /* We used to default to FPA for generic ARM, but almost nobody
9298 uses that now, and we now provide a way for the user to force
9299 the model. So default to the most useful variant. */
9300 if (tdep->fp_model == ARM_FLOAT_AUTO)
9301 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9302
9df628e0
RE
9303 if (tdep->jb_pc >= 0)
9304 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9305
08216dd7 9306 /* Floating point sizes and format. */
8da61cc4 9307 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9308 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9309 {
8da61cc4
DJ
9310 set_gdbarch_double_format
9311 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9312 set_gdbarch_long_double_format
9313 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9314 }
9315 else
9316 {
9317 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9318 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9319 }
9320
58d6951d
DJ
9321 if (have_vfp_pseudos)
9322 {
9323 /* NOTE: These are the only pseudo registers used by
9324 the ARM target at the moment. If more are added, a
9325 little more care in numbering will be needed. */
9326
9327 int num_pseudos = 32;
9328 if (have_neon_pseudos)
9329 num_pseudos += 16;
9330 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9331 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9332 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9333 }
9334
123dc839 9335 if (tdesc_data)
58d6951d
DJ
9336 {
9337 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9338
9779414d 9339 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9340
9341 /* Override tdesc_register_type to adjust the types of VFP
9342 registers for NEON. */
9343 set_gdbarch_register_type (gdbarch, arm_register_type);
9344 }
123dc839
DJ
9345
9346 /* Add standard register aliases. We add aliases even for those
9347 nanes which are used by the current architecture - it's simpler,
9348 and does no harm, since nothing ever lists user registers. */
9349 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9350 user_reg_add (gdbarch, arm_register_aliases[i].name,
9351 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9352
39bbf761
RE
9353 return gdbarch;
9354}
9355
97e03143 9356static void
2af46ca0 9357arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9358{
2af46ca0 9359 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9360
9361 if (tdep == NULL)
9362 return;
9363
edefbb7c 9364 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9365 (unsigned long) tdep->lowest_pc);
9366}
9367
a78f21af
AC
9368extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
9369
c906108c 9370void
ed9a39eb 9371_initialize_arm_tdep (void)
c906108c 9372{
bc90b915
FN
9373 struct ui_file *stb;
9374 long length;
53904c9e
AC
9375 const char *setname;
9376 const char *setdesc;
4bd7b427 9377 const char *const *regnames;
bec2ab5a 9378 int i;
bc90b915 9379 static char *helptext;
edefbb7c
AC
9380 char regdesc[1024], *rdptr = regdesc;
9381 size_t rest = sizeof (regdesc);
085dd6e6 9382
42cf1509 9383 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9384
60c5725c 9385 arm_objfile_data_key
c1bd65d0 9386 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 9387
0e9e9abd
UW
9388 /* Add ourselves to objfile event chain. */
9389 observer_attach_new_objfile (arm_exidx_new_objfile);
9390 arm_exidx_data_key
9391 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9392
70f80edf
JT
9393 /* Register an ELF OS ABI sniffer for ARM binaries. */
9394 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9395 bfd_target_elf_flavour,
9396 arm_elf_osabi_sniffer);
9397
9779414d
DJ
9398 /* Initialize the standard target descriptions. */
9399 initialize_tdesc_arm_with_m ();
25f8c692 9400 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9401 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9402 initialize_tdesc_arm_with_iwmmxt ();
9403 initialize_tdesc_arm_with_vfpv2 ();
9404 initialize_tdesc_arm_with_vfpv3 ();
9405 initialize_tdesc_arm_with_neon ();
9779414d 9406
94c30b78 9407 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
9408 num_disassembly_options = get_arm_regname_num_options ();
9409
9410 /* Add root prefix command for all "set arm"/"show arm" commands. */
9411 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9412 _("Various ARM-specific commands."),
afd7eef0
RE
9413 &setarmcmdlist, "set arm ", 0, &setlist);
9414
9415 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9416 _("Various ARM-specific commands."),
afd7eef0 9417 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9418
94c30b78 9419 /* Sync the opcode insn printer with our register viewer. */
bc90b915 9420 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 9421
eefe576e
AC
9422 /* Initialize the array that will be passed to
9423 add_setshow_enum_cmd(). */
8d749320
SM
9424 valid_disassembly_styles = XNEWVEC (const char *,
9425 num_disassembly_options + 1);
afd7eef0 9426 for (i = 0; i < num_disassembly_options; i++)
bc90b915 9427 {
bec2ab5a 9428 get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 9429 valid_disassembly_styles[i] = setname;
edefbb7c
AC
9430 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
9431 rdptr += length;
9432 rest -= length;
123dc839
DJ
9433 /* When we find the default names, tell the disassembler to use
9434 them. */
bc90b915
FN
9435 if (!strcmp (setname, "std"))
9436 {
afd7eef0 9437 disassembly_style = setname;
bc90b915
FN
9438 set_arm_regname_option (i);
9439 }
9440 }
94c30b78 9441 /* Mark the end of valid options. */
afd7eef0 9442 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 9443
edefbb7c
AC
9444 /* Create the help text. */
9445 stb = mem_fileopen ();
9446 fprintf_unfiltered (stb, "%s%s%s",
9447 _("The valid values are:\n"),
9448 regdesc,
9449 _("The default is \"std\"."));
759ef836 9450 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 9451 ui_file_delete (stb);
ed9a39eb 9452
edefbb7c
AC
9453 add_setshow_enum_cmd("disassembler", no_class,
9454 valid_disassembly_styles, &disassembly_style,
9455 _("Set the disassembly style."),
9456 _("Show the disassembly style."),
9457 helptext,
2c5b56ce 9458 set_disassembly_style_sfunc,
0963b4bd
MS
9459 NULL, /* FIXME: i18n: The disassembly style is
9460 \"%s\". */
7376b4c2 9461 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9462
9463 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9464 _("Set usage of ARM 32-bit mode."),
9465 _("Show usage of ARM 32-bit mode."),
9466 _("When off, a 26-bit PC will be used."),
2c5b56ce 9467 NULL,
0963b4bd
MS
9468 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9469 mode is %s. */
26304000 9470 &setarmcmdlist, &showarmcmdlist);
c906108c 9471
fd50bc42 9472 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9473 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9474 _("Set the floating point type."),
9475 _("Show the floating point type."),
9476 _("auto - Determine the FP typefrom the OS-ABI.\n\
9477softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9478fpa - FPA co-processor (GCC compiled).\n\
9479softvfp - Software FP with pure-endian doubles.\n\
9480vfp - VFP co-processor."),
edefbb7c 9481 set_fp_model_sfunc, show_fp_model,
7376b4c2 9482 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9483
28e97307
DJ
9484 /* Add a command to allow the user to force the ABI. */
9485 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9486 _("Set the ABI."),
9487 _("Show the ABI."),
9488 NULL, arm_set_abi, arm_show_abi,
9489 &setarmcmdlist, &showarmcmdlist);
9490
0428b8f5
DJ
9491 /* Add two commands to allow the user to force the assumed
9492 execution mode. */
9493 add_setshow_enum_cmd ("fallback-mode", class_support,
9494 arm_mode_strings, &arm_fallback_mode_string,
9495 _("Set the mode assumed when symbols are unavailable."),
9496 _("Show the mode assumed when symbols are unavailable."),
9497 NULL, NULL, arm_show_fallback_mode,
9498 &setarmcmdlist, &showarmcmdlist);
9499 add_setshow_enum_cmd ("force-mode", class_support,
9500 arm_mode_strings, &arm_force_mode_string,
9501 _("Set the mode assumed even when symbols are available."),
9502 _("Show the mode assumed even when symbols are available."),
9503 NULL, NULL, arm_show_force_mode,
9504 &setarmcmdlist, &showarmcmdlist);
9505
6529d2dd 9506 /* Debugging flag. */
edefbb7c
AC
9507 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9508 _("Set ARM debugging."),
9509 _("Show ARM debugging."),
9510 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9511 NULL,
7915a72c 9512 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9513 &setdebuglist, &showdebuglist);
c906108c 9514}
72508ac0
PO
9515
9516/* ARM-reversible process record data structures. */
9517
9518#define ARM_INSN_SIZE_BYTES 4
9519#define THUMB_INSN_SIZE_BYTES 2
9520#define THUMB2_INSN_SIZE_BYTES 4
9521
9522
71e396f9
LM
9523/* Position of the bit within a 32-bit ARM instruction
9524 that defines whether the instruction is a load or store. */
72508ac0
PO
9525#define INSN_S_L_BIT_NUM 20
9526
9527#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9528 do \
9529 { \
9530 unsigned int reg_len = LENGTH; \
9531 if (reg_len) \
9532 { \
9533 REGS = XNEWVEC (uint32_t, reg_len); \
9534 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9535 } \
9536 } \
9537 while (0)
9538
9539#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9540 do \
9541 { \
9542 unsigned int mem_len = LENGTH; \
9543 if (mem_len) \
9544 { \
9545 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9546 memcpy(&MEMS->len, &RECORD_BUF[0], \
9547 sizeof(struct arm_mem_r) * LENGTH); \
9548 } \
9549 } \
9550 while (0)
9551
9552/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9553#define INSN_RECORDED(ARM_RECORD) \
9554 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9555
9556/* ARM memory record structure. */
9557struct arm_mem_r
9558{
9559 uint32_t len; /* Record length. */
bfbbec00 9560 uint32_t addr; /* Memory address. */
72508ac0
PO
9561};
9562
9563/* ARM instruction record contains opcode of current insn
9564 and execution state (before entry to decode_insn()),
9565 contains list of to-be-modified registers and
9566 memory blocks (on return from decode_insn()). */
9567
9568typedef struct insn_decode_record_t
9569{
9570 struct gdbarch *gdbarch;
9571 struct regcache *regcache;
9572 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9573 uint32_t arm_insn; /* Should accommodate thumb. */
9574 uint32_t cond; /* Condition code. */
9575 uint32_t opcode; /* Insn opcode. */
9576 uint32_t decode; /* Insn decode bits. */
9577 uint32_t mem_rec_count; /* No of mem records. */
9578 uint32_t reg_rec_count; /* No of reg records. */
9579 uint32_t *arm_regs; /* Registers to be saved for this record. */
9580 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9581} insn_decode_record;
9582
9583
9584/* Checks ARM SBZ and SBO mandatory fields. */
9585
9586static int
9587sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9588{
9589 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9590
9591 if (!len)
9592 return 1;
9593
9594 if (!sbo)
9595 ones = ~ones;
9596
9597 while (ones)
9598 {
9599 if (!(ones & sbo))
9600 {
9601 return 0;
9602 }
9603 ones = ones >> 1;
9604 }
9605 return 1;
9606}
9607
c6ec2b30
OJ
9608enum arm_record_result
9609{
9610 ARM_RECORD_SUCCESS = 0,
9611 ARM_RECORD_FAILURE = 1
9612};
9613
72508ac0
PO
9614typedef enum
9615{
9616 ARM_RECORD_STRH=1,
9617 ARM_RECORD_STRD
9618} arm_record_strx_t;
9619
9620typedef enum
9621{
9622 ARM_RECORD=1,
9623 THUMB_RECORD,
9624 THUMB2_RECORD
9625} record_type_t;
9626
9627
9628static int
9629arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9630 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9631{
9632
9633 struct regcache *reg_cache = arm_insn_r->regcache;
9634 ULONGEST u_regval[2]= {0};
9635
9636 uint32_t reg_src1 = 0, reg_src2 = 0;
9637 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
72508ac0
PO
9638
9639 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9640 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
72508ac0
PO
9641
9642 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9643 {
9644 /* 1) Handle misc store, immediate offset. */
9645 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9646 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9647 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9648 regcache_raw_read_unsigned (reg_cache, reg_src1,
9649 &u_regval[0]);
9650 if (ARM_PC_REGNUM == reg_src1)
9651 {
9652 /* If R15 was used as Rn, hence current PC+8. */
9653 u_regval[0] = u_regval[0] + 8;
9654 }
9655 offset_8 = (immed_high << 4) | immed_low;
9656 /* Calculate target store address. */
9657 if (14 == arm_insn_r->opcode)
9658 {
9659 tgt_mem_addr = u_regval[0] + offset_8;
9660 }
9661 else
9662 {
9663 tgt_mem_addr = u_regval[0] - offset_8;
9664 }
9665 if (ARM_RECORD_STRH == str_type)
9666 {
9667 record_buf_mem[0] = 2;
9668 record_buf_mem[1] = tgt_mem_addr;
9669 arm_insn_r->mem_rec_count = 1;
9670 }
9671 else if (ARM_RECORD_STRD == str_type)
9672 {
9673 record_buf_mem[0] = 4;
9674 record_buf_mem[1] = tgt_mem_addr;
9675 record_buf_mem[2] = 4;
9676 record_buf_mem[3] = tgt_mem_addr + 4;
9677 arm_insn_r->mem_rec_count = 2;
9678 }
9679 }
9680 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9681 {
9682 /* 2) Store, register offset. */
9683 /* Get Rm. */
9684 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9685 /* Get Rn. */
9686 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9687 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9688 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9689 if (15 == reg_src2)
9690 {
9691 /* If R15 was used as Rn, hence current PC+8. */
9692 u_regval[0] = u_regval[0] + 8;
9693 }
9694 /* Calculate target store address, Rn +/- Rm, register offset. */
9695 if (12 == arm_insn_r->opcode)
9696 {
9697 tgt_mem_addr = u_regval[0] + u_regval[1];
9698 }
9699 else
9700 {
9701 tgt_mem_addr = u_regval[1] - u_regval[0];
9702 }
9703 if (ARM_RECORD_STRH == str_type)
9704 {
9705 record_buf_mem[0] = 2;
9706 record_buf_mem[1] = tgt_mem_addr;
9707 arm_insn_r->mem_rec_count = 1;
9708 }
9709 else if (ARM_RECORD_STRD == str_type)
9710 {
9711 record_buf_mem[0] = 4;
9712 record_buf_mem[1] = tgt_mem_addr;
9713 record_buf_mem[2] = 4;
9714 record_buf_mem[3] = tgt_mem_addr + 4;
9715 arm_insn_r->mem_rec_count = 2;
9716 }
9717 }
9718 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9719 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9720 {
9721 /* 3) Store, immediate pre-indexed. */
9722 /* 5) Store, immediate post-indexed. */
9723 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9724 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9725 offset_8 = (immed_high << 4) | immed_low;
9726 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9727 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9728 /* Calculate target store address, Rn +/- Rm, register offset. */
9729 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9730 {
9731 tgt_mem_addr = u_regval[0] + offset_8;
9732 }
9733 else
9734 {
9735 tgt_mem_addr = u_regval[0] - offset_8;
9736 }
9737 if (ARM_RECORD_STRH == str_type)
9738 {
9739 record_buf_mem[0] = 2;
9740 record_buf_mem[1] = tgt_mem_addr;
9741 arm_insn_r->mem_rec_count = 1;
9742 }
9743 else if (ARM_RECORD_STRD == str_type)
9744 {
9745 record_buf_mem[0] = 4;
9746 record_buf_mem[1] = tgt_mem_addr;
9747 record_buf_mem[2] = 4;
9748 record_buf_mem[3] = tgt_mem_addr + 4;
9749 arm_insn_r->mem_rec_count = 2;
9750 }
9751 /* Record Rn also as it changes. */
9752 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9753 arm_insn_r->reg_rec_count = 1;
9754 }
9755 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9756 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9757 {
9758 /* 4) Store, register pre-indexed. */
9759 /* 6) Store, register post -indexed. */
9760 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9761 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9762 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9763 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9764 /* Calculate target store address, Rn +/- Rm, register offset. */
9765 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9766 {
9767 tgt_mem_addr = u_regval[0] + u_regval[1];
9768 }
9769 else
9770 {
9771 tgt_mem_addr = u_regval[1] - u_regval[0];
9772 }
9773 if (ARM_RECORD_STRH == str_type)
9774 {
9775 record_buf_mem[0] = 2;
9776 record_buf_mem[1] = tgt_mem_addr;
9777 arm_insn_r->mem_rec_count = 1;
9778 }
9779 else if (ARM_RECORD_STRD == str_type)
9780 {
9781 record_buf_mem[0] = 4;
9782 record_buf_mem[1] = tgt_mem_addr;
9783 record_buf_mem[2] = 4;
9784 record_buf_mem[3] = tgt_mem_addr + 4;
9785 arm_insn_r->mem_rec_count = 2;
9786 }
9787 /* Record Rn also as it changes. */
9788 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9789 arm_insn_r->reg_rec_count = 1;
9790 }
9791 return 0;
9792}
9793
9794/* Handling ARM extension space insns. */
9795
9796static int
9797arm_record_extension_space (insn_decode_record *arm_insn_r)
9798{
9799 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
9800 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9801 uint32_t record_buf[8], record_buf_mem[8];
9802 uint32_t reg_src1 = 0;
72508ac0
PO
9803 struct regcache *reg_cache = arm_insn_r->regcache;
9804 ULONGEST u_regval = 0;
9805
9806 gdb_assert (!INSN_RECORDED(arm_insn_r));
9807 /* Handle unconditional insn extension space. */
9808
9809 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9810 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9811 if (arm_insn_r->cond)
9812 {
9813 /* PLD has no affect on architectural state, it just affects
9814 the caches. */
9815 if (5 == ((opcode1 & 0xE0) >> 5))
9816 {
9817 /* BLX(1) */
9818 record_buf[0] = ARM_PS_REGNUM;
9819 record_buf[1] = ARM_LR_REGNUM;
9820 arm_insn_r->reg_rec_count = 2;
9821 }
9822 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9823 }
9824
9825
9826 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9827 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9828 {
9829 ret = -1;
9830 /* Undefined instruction on ARM V5; need to handle if later
9831 versions define it. */
9832 }
9833
9834 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9835 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9836 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9837
9838 /* Handle arithmetic insn extension space. */
9839 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9840 && !INSN_RECORDED(arm_insn_r))
9841 {
9842 /* Handle MLA(S) and MUL(S). */
9843 if (0 <= insn_op1 && 3 >= insn_op1)
9844 {
9845 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9846 record_buf[1] = ARM_PS_REGNUM;
9847 arm_insn_r->reg_rec_count = 2;
9848 }
9849 else if (4 <= insn_op1 && 15 >= insn_op1)
9850 {
9851 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9852 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9853 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9854 record_buf[2] = ARM_PS_REGNUM;
9855 arm_insn_r->reg_rec_count = 3;
9856 }
9857 }
9858
9859 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9860 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9861 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9862
9863 /* Handle control insn extension space. */
9864
9865 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9866 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9867 {
9868 if (!bit (arm_insn_r->arm_insn,25))
9869 {
9870 if (!bits (arm_insn_r->arm_insn, 4, 7))
9871 {
9872 if ((0 == insn_op1) || (2 == insn_op1))
9873 {
9874 /* MRS. */
9875 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9876 arm_insn_r->reg_rec_count = 1;
9877 }
9878 else if (1 == insn_op1)
9879 {
9880 /* CSPR is going to be changed. */
9881 record_buf[0] = ARM_PS_REGNUM;
9882 arm_insn_r->reg_rec_count = 1;
9883 }
9884 else if (3 == insn_op1)
9885 {
9886 /* SPSR is going to be changed. */
9887 /* We need to get SPSR value, which is yet to be done. */
9888 printf_unfiltered (_("Process record does not support "
9889 "instruction 0x%0x at address %s.\n"),
9890 arm_insn_r->arm_insn,
9891 paddress (arm_insn_r->gdbarch,
9892 arm_insn_r->this_addr));
9893 return -1;
9894 }
9895 }
9896 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9897 {
9898 if (1 == insn_op1)
9899 {
9900 /* BX. */
9901 record_buf[0] = ARM_PS_REGNUM;
9902 arm_insn_r->reg_rec_count = 1;
9903 }
9904 else if (3 == insn_op1)
9905 {
9906 /* CLZ. */
9907 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9908 arm_insn_r->reg_rec_count = 1;
9909 }
9910 }
9911 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9912 {
9913 /* BLX. */
9914 record_buf[0] = ARM_PS_REGNUM;
9915 record_buf[1] = ARM_LR_REGNUM;
9916 arm_insn_r->reg_rec_count = 2;
9917 }
9918 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
9919 {
9920 /* QADD, QSUB, QDADD, QDSUB */
9921 record_buf[0] = ARM_PS_REGNUM;
9922 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9923 arm_insn_r->reg_rec_count = 2;
9924 }
9925 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
9926 {
9927 /* BKPT. */
9928 record_buf[0] = ARM_PS_REGNUM;
9929 record_buf[1] = ARM_LR_REGNUM;
9930 arm_insn_r->reg_rec_count = 2;
9931
9932 /* Save SPSR also;how? */
9933 printf_unfiltered (_("Process record does not support "
9934 "instruction 0x%0x at address %s.\n"),
9935 arm_insn_r->arm_insn,
9936 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
9937 return -1;
9938 }
9939 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
9940 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
9941 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
9942 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
9943 )
9944 {
9945 if (0 == insn_op1 || 1 == insn_op1)
9946 {
9947 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
9948 /* We dont do optimization for SMULW<y> where we
9949 need only Rd. */
9950 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9951 record_buf[1] = ARM_PS_REGNUM;
9952 arm_insn_r->reg_rec_count = 2;
9953 }
9954 else if (2 == insn_op1)
9955 {
9956 /* SMLAL<x><y>. */
9957 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9958 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
9959 arm_insn_r->reg_rec_count = 2;
9960 }
9961 else if (3 == insn_op1)
9962 {
9963 /* SMUL<x><y>. */
9964 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9965 arm_insn_r->reg_rec_count = 1;
9966 }
9967 }
9968 }
9969 else
9970 {
9971 /* MSR : immediate form. */
9972 if (1 == insn_op1)
9973 {
9974 /* CSPR is going to be changed. */
9975 record_buf[0] = ARM_PS_REGNUM;
9976 arm_insn_r->reg_rec_count = 1;
9977 }
9978 else if (3 == insn_op1)
9979 {
9980 /* SPSR is going to be changed. */
9981 /* we need to get SPSR value, which is yet to be done */
9982 printf_unfiltered (_("Process record does not support "
9983 "instruction 0x%0x at address %s.\n"),
9984 arm_insn_r->arm_insn,
9985 paddress (arm_insn_r->gdbarch,
9986 arm_insn_r->this_addr));
9987 return -1;
9988 }
9989 }
9990 }
9991
9992 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9993 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
9994 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
9995
9996 /* Handle load/store insn extension space. */
9997
9998 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
9999 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10000 && !INSN_RECORDED(arm_insn_r))
10001 {
10002 /* SWP/SWPB. */
10003 if (0 == insn_op1)
10004 {
10005 /* These insn, changes register and memory as well. */
10006 /* SWP or SWPB insn. */
10007 /* Get memory address given by Rn. */
10008 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10009 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10010 /* SWP insn ?, swaps word. */
10011 if (8 == arm_insn_r->opcode)
10012 {
10013 record_buf_mem[0] = 4;
10014 }
10015 else
10016 {
10017 /* SWPB insn, swaps only byte. */
10018 record_buf_mem[0] = 1;
10019 }
10020 record_buf_mem[1] = u_regval;
10021 arm_insn_r->mem_rec_count = 1;
10022 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10023 arm_insn_r->reg_rec_count = 1;
10024 }
10025 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10026 {
10027 /* STRH. */
10028 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10029 ARM_RECORD_STRH);
10030 }
10031 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10032 {
10033 /* LDRD. */
10034 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10035 record_buf[1] = record_buf[0] + 1;
10036 arm_insn_r->reg_rec_count = 2;
10037 }
10038 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10039 {
10040 /* STRD. */
10041 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10042 ARM_RECORD_STRD);
10043 }
10044 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10045 {
10046 /* LDRH, LDRSB, LDRSH. */
10047 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10048 arm_insn_r->reg_rec_count = 1;
10049 }
10050
10051 }
10052
10053 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10054 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10055 && !INSN_RECORDED(arm_insn_r))
10056 {
10057 ret = -1;
10058 /* Handle coprocessor insn extension space. */
10059 }
10060
10061 /* To be done for ARMv5 and later; as of now we return -1. */
10062 if (-1 == ret)
10063 printf_unfiltered (_("Process record does not support instruction x%0x "
10064 "at address %s.\n"),arm_insn_r->arm_insn,
10065 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10066
10067
10068 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10069 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10070
10071 return ret;
10072}
10073
10074/* Handling opcode 000 insns. */
10075
10076static int
10077arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10078{
10079 struct regcache *reg_cache = arm_insn_r->regcache;
10080 uint32_t record_buf[8], record_buf_mem[8];
10081 ULONGEST u_regval[2] = {0};
10082
bec2ab5a 10083 uint32_t reg_src1 = 0, reg_dest = 0;
72508ac0
PO
10084 uint32_t opcode1 = 0;
10085
10086 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10087 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10088 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10089
10090 /* Data processing insn /multiply insn. */
10091 if (9 == arm_insn_r->decode
10092 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10093 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
10094 {
10095 /* Handle multiply instructions. */
10096 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10097 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10098 {
10099 /* Handle MLA and MUL. */
10100 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10101 record_buf[1] = ARM_PS_REGNUM;
10102 arm_insn_r->reg_rec_count = 2;
10103 }
10104 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10105 {
10106 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10107 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10108 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10109 record_buf[2] = ARM_PS_REGNUM;
10110 arm_insn_r->reg_rec_count = 3;
10111 }
10112 }
10113 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10114 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
10115 {
10116 /* Handle misc load insns, as 20th bit (L = 1). */
10117 /* LDR insn has a capability to do branching, if
10118 MOV LR, PC is precceded by LDR insn having Rn as R15
10119 in that case, it emulates branch and link insn, and hence we
10120 need to save CSPR and PC as well. I am not sure this is right
10121 place; as opcode = 010 LDR insn make this happen, if R15 was
10122 used. */
10123 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10124 if (15 != reg_dest)
10125 {
10126 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10127 arm_insn_r->reg_rec_count = 1;
10128 }
10129 else
10130 {
10131 record_buf[0] = reg_dest;
10132 record_buf[1] = ARM_PS_REGNUM;
10133 arm_insn_r->reg_rec_count = 2;
10134 }
10135 }
10136 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10137 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
10138 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10139 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
10140 {
10141 /* Handle MSR insn. */
10142 if (9 == arm_insn_r->opcode)
10143 {
10144 /* CSPR is going to be changed. */
10145 record_buf[0] = ARM_PS_REGNUM;
10146 arm_insn_r->reg_rec_count = 1;
10147 }
10148 else
10149 {
10150 /* SPSR is going to be changed. */
10151 /* How to read SPSR value? */
10152 printf_unfiltered (_("Process record does not support instruction "
10153 "0x%0x at address %s.\n"),
10154 arm_insn_r->arm_insn,
10155 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10156 return -1;
10157 }
10158 }
10159 else if (9 == arm_insn_r->decode
10160 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10161 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10162 {
10163 /* Handling SWP, SWPB. */
10164 /* These insn, changes register and memory as well. */
10165 /* SWP or SWPB insn. */
10166
10167 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10168 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10169 /* SWP insn ?, swaps word. */
10170 if (8 == arm_insn_r->opcode)
10171 {
10172 record_buf_mem[0] = 4;
10173 }
10174 else
10175 {
10176 /* SWPB insn, swaps only byte. */
10177 record_buf_mem[0] = 1;
10178 }
10179 record_buf_mem[1] = u_regval[0];
10180 arm_insn_r->mem_rec_count = 1;
10181 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10182 arm_insn_r->reg_rec_count = 1;
10183 }
10184 else if (3 == arm_insn_r->decode && 0x12 == opcode1
10185 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10186 {
10187 /* Handle BLX, branch and link/exchange. */
10188 if (9 == arm_insn_r->opcode)
10189 {
10190 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10191 and R14 stores the return address. */
10192 record_buf[0] = ARM_PS_REGNUM;
10193 record_buf[1] = ARM_LR_REGNUM;
10194 arm_insn_r->reg_rec_count = 2;
10195 }
10196 }
10197 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10198 {
10199 /* Handle enhanced software breakpoint insn, BKPT. */
10200 /* CPSR is changed to be executed in ARM state, disabling normal
10201 interrupts, entering abort mode. */
10202 /* According to high vector configuration PC is set. */
10203 /* user hit breakpoint and type reverse, in
10204 that case, we need to go back with previous CPSR and
10205 Program Counter. */
10206 record_buf[0] = ARM_PS_REGNUM;
10207 record_buf[1] = ARM_LR_REGNUM;
10208 arm_insn_r->reg_rec_count = 2;
10209
10210 /* Save SPSR also; how? */
10211 printf_unfiltered (_("Process record does not support instruction "
10212 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10213 paddress (arm_insn_r->gdbarch,
10214 arm_insn_r->this_addr));
10215 return -1;
10216 }
10217 else if (11 == arm_insn_r->decode
10218 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10219 {
10220 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
10221
10222 /* Handle str(x) insn */
10223 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10224 ARM_RECORD_STRH);
10225 }
10226 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10227 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10228 {
10229 /* Handle BX, branch and link/exchange. */
10230 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10231 record_buf[0] = ARM_PS_REGNUM;
10232 arm_insn_r->reg_rec_count = 1;
10233 }
10234 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10235 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10236 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10237 {
10238 /* Count leading zeros: CLZ. */
10239 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10240 arm_insn_r->reg_rec_count = 1;
10241 }
10242 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10243 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10244 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10245 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
10246 )
10247 {
10248 /* Handle MRS insn. */
10249 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10250 arm_insn_r->reg_rec_count = 1;
10251 }
10252 else if (arm_insn_r->opcode <= 15)
10253 {
10254 /* Normal data processing insns. */
10255 /* Out of 11 shifter operands mode, all the insn modifies destination
10256 register, which is specified by 13-16 decode. */
10257 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10258 record_buf[1] = ARM_PS_REGNUM;
10259 arm_insn_r->reg_rec_count = 2;
10260 }
10261 else
10262 {
10263 return -1;
10264 }
10265
10266 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10267 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10268 return 0;
10269}
10270
10271/* Handling opcode 001 insns. */
10272
10273static int
10274arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10275{
10276 uint32_t record_buf[8], record_buf_mem[8];
10277
10278 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10279 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10280
10281 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10282 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10283 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10284 )
10285 {
10286 /* Handle MSR insn. */
10287 if (9 == arm_insn_r->opcode)
10288 {
10289 /* CSPR is going to be changed. */
10290 record_buf[0] = ARM_PS_REGNUM;
10291 arm_insn_r->reg_rec_count = 1;
10292 }
10293 else
10294 {
10295 /* SPSR is going to be changed. */
10296 }
10297 }
10298 else if (arm_insn_r->opcode <= 15)
10299 {
10300 /* Normal data processing insns. */
10301 /* Out of 11 shifter operands mode, all the insn modifies destination
10302 register, which is specified by 13-16 decode. */
10303 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10304 record_buf[1] = ARM_PS_REGNUM;
10305 arm_insn_r->reg_rec_count = 2;
10306 }
10307 else
10308 {
10309 return -1;
10310 }
10311
10312 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10313 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10314 return 0;
10315}
10316
71e396f9 10317/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10318
10319static int
10320arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10321{
10322 struct regcache *reg_cache = arm_insn_r->regcache;
10323
71e396f9
LM
10324 uint32_t reg_base , reg_dest;
10325 uint32_t offset_12, tgt_mem_addr;
72508ac0 10326 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10327 unsigned char wback;
10328 ULONGEST u_regval;
72508ac0 10329
71e396f9
LM
10330 /* Calculate wback. */
10331 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10332 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10333
71e396f9
LM
10334 arm_insn_r->reg_rec_count = 0;
10335 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10336
10337 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10338 {
71e396f9
LM
10339 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10340 and LDRT. */
10341
72508ac0 10342 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10343 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10344
10345 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10346 preceeds a LDR instruction having R15 as reg_base, it
10347 emulates a branch and link instruction, and hence we need to save
10348 CPSR and PC as well. */
10349 if (ARM_PC_REGNUM == reg_dest)
10350 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10351
10352 /* If wback is true, also save the base register, which is going to be
10353 written to. */
10354 if (wback)
10355 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10356 }
10357 else
10358 {
71e396f9
LM
10359 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10360
72508ac0 10361 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10362 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10363
10364 /* Handle bit U. */
72508ac0 10365 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10366 {
10367 /* U == 1: Add the offset. */
10368 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10369 }
72508ac0 10370 else
71e396f9
LM
10371 {
10372 /* U == 0: subtract the offset. */
10373 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10374 }
10375
10376 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10377 bytes. */
10378 if (bit (arm_insn_r->arm_insn, 22))
10379 {
10380 /* STRB and STRBT: 1 byte. */
10381 record_buf_mem[0] = 1;
10382 }
10383 else
10384 {
10385 /* STR and STRT: 4 bytes. */
10386 record_buf_mem[0] = 4;
10387 }
10388
10389 /* Handle bit P. */
10390 if (bit (arm_insn_r->arm_insn, 24))
10391 record_buf_mem[1] = tgt_mem_addr;
10392 else
10393 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10394
72508ac0
PO
10395 arm_insn_r->mem_rec_count = 1;
10396
71e396f9
LM
10397 /* If wback is true, also save the base register, which is going to be
10398 written to. */
10399 if (wback)
10400 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10401 }
10402
10403 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10404 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10405 return 0;
10406}
10407
10408/* Handling opcode 011 insns. */
10409
10410static int
10411arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10412{
10413 struct regcache *reg_cache = arm_insn_r->regcache;
10414
10415 uint32_t shift_imm = 0;
10416 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10417 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10418 uint32_t record_buf[8], record_buf_mem[8];
10419
10420 LONGEST s_word;
10421 ULONGEST u_regval[2];
10422
10423 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10424 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10425
10426 /* Handle enhanced store insns and LDRD DSP insn,
10427 order begins according to addressing modes for store insns
10428 STRH insn. */
10429
10430 /* LDR or STR? */
10431 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10432 {
10433 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10434 /* LDR insn has a capability to do branching, if
10435 MOV LR, PC is precedded by LDR insn having Rn as R15
10436 in that case, it emulates branch and link insn, and hence we
10437 need to save CSPR and PC as well. */
10438 if (15 != reg_dest)
10439 {
10440 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10441 arm_insn_r->reg_rec_count = 1;
10442 }
10443 else
10444 {
10445 record_buf[0] = reg_dest;
10446 record_buf[1] = ARM_PS_REGNUM;
10447 arm_insn_r->reg_rec_count = 2;
10448 }
10449 }
10450 else
10451 {
10452 if (! bits (arm_insn_r->arm_insn, 4, 11))
10453 {
10454 /* Store insn, register offset and register pre-indexed,
10455 register post-indexed. */
10456 /* Get Rm. */
10457 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10458 /* Get Rn. */
10459 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10460 regcache_raw_read_unsigned (reg_cache, reg_src1
10461 , &u_regval[0]);
10462 regcache_raw_read_unsigned (reg_cache, reg_src2
10463 , &u_regval[1]);
10464 if (15 == reg_src2)
10465 {
10466 /* If R15 was used as Rn, hence current PC+8. */
10467 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10468 u_regval[0] = u_regval[0] + 8;
10469 }
10470 /* Calculate target store address, Rn +/- Rm, register offset. */
10471 /* U == 1. */
10472 if (bit (arm_insn_r->arm_insn, 23))
10473 {
10474 tgt_mem_addr = u_regval[0] + u_regval[1];
10475 }
10476 else
10477 {
10478 tgt_mem_addr = u_regval[1] - u_regval[0];
10479 }
10480
10481 switch (arm_insn_r->opcode)
10482 {
10483 /* STR. */
10484 case 8:
10485 case 12:
10486 /* STR. */
10487 case 9:
10488 case 13:
10489 /* STRT. */
10490 case 1:
10491 case 5:
10492 /* STR. */
10493 case 0:
10494 case 4:
10495 record_buf_mem[0] = 4;
10496 break;
10497
10498 /* STRB. */
10499 case 10:
10500 case 14:
10501 /* STRB. */
10502 case 11:
10503 case 15:
10504 /* STRBT. */
10505 case 3:
10506 case 7:
10507 /* STRB. */
10508 case 2:
10509 case 6:
10510 record_buf_mem[0] = 1;
10511 break;
10512
10513 default:
10514 gdb_assert_not_reached ("no decoding pattern found");
10515 break;
10516 }
10517 record_buf_mem[1] = tgt_mem_addr;
10518 arm_insn_r->mem_rec_count = 1;
10519
10520 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10521 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10522 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10523 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10524 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10525 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10526 )
10527 {
10528 /* Rn is going to be changed in pre-indexed mode and
10529 post-indexed mode as well. */
10530 record_buf[0] = reg_src2;
10531 arm_insn_r->reg_rec_count = 1;
10532 }
10533 }
10534 else
10535 {
10536 /* Store insn, scaled register offset; scaled pre-indexed. */
10537 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10538 /* Get Rm. */
10539 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10540 /* Get Rn. */
10541 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10542 /* Get shift_imm. */
10543 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10544 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10545 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10546 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10547 /* Offset_12 used as shift. */
10548 switch (offset_12)
10549 {
10550 case 0:
10551 /* Offset_12 used as index. */
10552 offset_12 = u_regval[0] << shift_imm;
10553 break;
10554
10555 case 1:
10556 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10557 break;
10558
10559 case 2:
10560 if (!shift_imm)
10561 {
10562 if (bit (u_regval[0], 31))
10563 {
10564 offset_12 = 0xFFFFFFFF;
10565 }
10566 else
10567 {
10568 offset_12 = 0;
10569 }
10570 }
10571 else
10572 {
10573 /* This is arithmetic shift. */
10574 offset_12 = s_word >> shift_imm;
10575 }
10576 break;
10577
10578 case 3:
10579 if (!shift_imm)
10580 {
10581 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10582 &u_regval[1]);
10583 /* Get C flag value and shift it by 31. */
10584 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10585 | (u_regval[0]) >> 1);
10586 }
10587 else
10588 {
10589 offset_12 = (u_regval[0] >> shift_imm) \
10590 | (u_regval[0] <<
10591 (sizeof(uint32_t) - shift_imm));
10592 }
10593 break;
10594
10595 default:
10596 gdb_assert_not_reached ("no decoding pattern found");
10597 break;
10598 }
10599
10600 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10601 /* bit U set. */
10602 if (bit (arm_insn_r->arm_insn, 23))
10603 {
10604 tgt_mem_addr = u_regval[1] + offset_12;
10605 }
10606 else
10607 {
10608 tgt_mem_addr = u_regval[1] - offset_12;
10609 }
10610
10611 switch (arm_insn_r->opcode)
10612 {
10613 /* STR. */
10614 case 8:
10615 case 12:
10616 /* STR. */
10617 case 9:
10618 case 13:
10619 /* STRT. */
10620 case 1:
10621 case 5:
10622 /* STR. */
10623 case 0:
10624 case 4:
10625 record_buf_mem[0] = 4;
10626 break;
10627
10628 /* STRB. */
10629 case 10:
10630 case 14:
10631 /* STRB. */
10632 case 11:
10633 case 15:
10634 /* STRBT. */
10635 case 3:
10636 case 7:
10637 /* STRB. */
10638 case 2:
10639 case 6:
10640 record_buf_mem[0] = 1;
10641 break;
10642
10643 default:
10644 gdb_assert_not_reached ("no decoding pattern found");
10645 break;
10646 }
10647 record_buf_mem[1] = tgt_mem_addr;
10648 arm_insn_r->mem_rec_count = 1;
10649
10650 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10651 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10652 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10653 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10654 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10655 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10656 )
10657 {
10658 /* Rn is going to be changed in register scaled pre-indexed
10659 mode,and scaled post indexed mode. */
10660 record_buf[0] = reg_src2;
10661 arm_insn_r->reg_rec_count = 1;
10662 }
10663 }
10664 }
10665
10666 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10667 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10668 return 0;
10669}
10670
71e396f9 10671/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10672
10673static int
10674arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10675{
10676 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10677 uint32_t register_count = 0, register_bits;
10678 uint32_t reg_base, addr_mode;
72508ac0 10679 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10680 uint32_t wback;
10681 ULONGEST u_regval;
72508ac0 10682
71e396f9
LM
10683 /* Fetch the list of registers. */
10684 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10685 arm_insn_r->reg_rec_count = 0;
10686
10687 /* Fetch the base register that contains the address we are loading data
10688 to. */
10689 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10690
71e396f9
LM
10691 /* Calculate wback. */
10692 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10693
10694 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10695 {
71e396f9 10696 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10697
71e396f9 10698 /* Find out which registers are going to be loaded from memory. */
72508ac0 10699 while (register_bits)
71e396f9
LM
10700 {
10701 if (register_bits & 0x00000001)
10702 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10703 register_bits = register_bits >> 1;
10704 register_count++;
10705 }
72508ac0 10706
71e396f9
LM
10707
10708 /* If wback is true, also save the base register, which is going to be
10709 written to. */
10710 if (wback)
10711 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10712
10713 /* Save the CPSR register. */
10714 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10715 }
10716 else
10717 {
71e396f9 10718 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10719
71e396f9
LM
10720 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10721
10722 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10723
10724 /* Find out how many registers are going to be stored to memory. */
72508ac0 10725 while (register_bits)
71e396f9
LM
10726 {
10727 if (register_bits & 0x00000001)
10728 register_count++;
10729 register_bits = register_bits >> 1;
10730 }
72508ac0
PO
10731
10732 switch (addr_mode)
71e396f9
LM
10733 {
10734 /* STMDA (STMED): Decrement after. */
10735 case 0:
10736 record_buf_mem[1] = (uint32_t) u_regval
10737 - register_count * INT_REGISTER_SIZE + 4;
10738 break;
10739 /* STM (STMIA, STMEA): Increment after. */
10740 case 1:
10741 record_buf_mem[1] = (uint32_t) u_regval;
10742 break;
10743 /* STMDB (STMFD): Decrement before. */
10744 case 2:
10745 record_buf_mem[1] = (uint32_t) u_regval
10746 - register_count * INT_REGISTER_SIZE;
10747 break;
10748 /* STMIB (STMFA): Increment before. */
10749 case 3:
10750 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
10751 break;
10752 default:
10753 gdb_assert_not_reached ("no decoding pattern found");
10754 break;
10755 }
72508ac0 10756
71e396f9
LM
10757 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
10758 arm_insn_r->mem_rec_count = 1;
10759
10760 /* If wback is true, also save the base register, which is going to be
10761 written to. */
10762 if (wback)
10763 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10764 }
10765
10766 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10767 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10768 return 0;
10769}
10770
10771/* Handling opcode 101 insns. */
10772
10773static int
10774arm_record_b_bl (insn_decode_record *arm_insn_r)
10775{
10776 uint32_t record_buf[8];
10777
10778 /* Handle B, BL, BLX(1) insns. */
10779 /* B simply branches so we do nothing here. */
10780 /* Note: BLX(1) doesnt fall here but instead it falls into
10781 extension space. */
10782 if (bit (arm_insn_r->arm_insn, 24))
10783 {
10784 record_buf[0] = ARM_LR_REGNUM;
10785 arm_insn_r->reg_rec_count = 1;
10786 }
10787
10788 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10789
10790 return 0;
10791}
10792
10793/* Handling opcode 110 insns. */
10794
10795static int
c6ec2b30 10796arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
10797{
10798 printf_unfiltered (_("Process record does not support instruction "
10799 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10800 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10801
10802 return -1;
10803}
10804
5a578da5
OJ
10805/* Record handler for vector data transfer instructions. */
10806
10807static int
10808arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
10809{
10810 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
10811 uint32_t record_buf[4];
10812
10813 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10814 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
10815 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
10816 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
10817 bit_l = bit (arm_insn_r->arm_insn, 20);
10818 bit_c = bit (arm_insn_r->arm_insn, 8);
10819
10820 /* Handle VMOV instruction. */
10821 if (bit_l && bit_c)
10822 {
10823 record_buf[0] = reg_t;
10824 arm_insn_r->reg_rec_count = 1;
10825 }
10826 else if (bit_l && !bit_c)
10827 {
10828 /* Handle VMOV instruction. */
10829 if (bits_a == 0x00)
10830 {
10831 if (bit (arm_insn_r->arm_insn, 20))
10832 record_buf[0] = reg_t;
10833 else
10834 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10835 (reg_v << 1));
10836
10837 arm_insn_r->reg_rec_count = 1;
10838 }
10839 /* Handle VMRS instruction. */
10840 else if (bits_a == 0x07)
10841 {
10842 if (reg_t == 15)
10843 reg_t = ARM_PS_REGNUM;
10844
10845 record_buf[0] = reg_t;
10846 arm_insn_r->reg_rec_count = 1;
10847 }
10848 }
10849 else if (!bit_l && !bit_c)
10850 {
10851 /* Handle VMOV instruction. */
10852 if (bits_a == 0x00)
10853 {
10854 if (bit (arm_insn_r->arm_insn, 20))
10855 record_buf[0] = reg_t;
10856 else
10857 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10858 (reg_v << 1));
10859
10860 arm_insn_r->reg_rec_count = 1;
10861 }
10862 /* Handle VMSR instruction. */
10863 else if (bits_a == 0x07)
10864 {
10865 record_buf[0] = ARM_FPSCR_REGNUM;
10866 arm_insn_r->reg_rec_count = 1;
10867 }
10868 }
10869 else if (!bit_l && bit_c)
10870 {
10871 /* Handle VMOV instruction. */
10872 if (!(bits_a & 0x04))
10873 {
10874 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
10875 + ARM_D0_REGNUM;
10876 arm_insn_r->reg_rec_count = 1;
10877 }
10878 /* Handle VDUP instruction. */
10879 else
10880 {
10881 if (bit (arm_insn_r->arm_insn, 21))
10882 {
10883 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10884 record_buf[0] = reg_v + ARM_D0_REGNUM;
10885 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
10886 arm_insn_r->reg_rec_count = 2;
10887 }
10888 else
10889 {
10890 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10891 record_buf[0] = reg_v + ARM_D0_REGNUM;
10892 arm_insn_r->reg_rec_count = 1;
10893 }
10894 }
10895 }
10896
10897 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10898 return 0;
10899}
10900
f20f80dd
OJ
10901/* Record handler for extension register load/store instructions. */
10902
10903static int
10904arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
10905{
10906 uint32_t opcode, single_reg;
10907 uint8_t op_vldm_vstm;
10908 uint32_t record_buf[8], record_buf_mem[128];
10909 ULONGEST u_regval = 0;
10910
10911 struct regcache *reg_cache = arm_insn_r->regcache;
10912 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10913
10914 opcode = bits (arm_insn_r->arm_insn, 20, 24);
10915 single_reg = bit (arm_insn_r->arm_insn, 8);
10916 op_vldm_vstm = opcode & 0x1b;
10917
10918 /* Handle VMOV instructions. */
10919 if ((opcode & 0x1e) == 0x04)
10920 {
10921 if (bit (arm_insn_r->arm_insn, 4))
10922 {
10923 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10924 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10925 arm_insn_r->reg_rec_count = 2;
10926 }
10927 else
10928 {
10929 uint8_t reg_m = (bits (arm_insn_r->arm_insn, 0, 3) << 1)
10930 | bit (arm_insn_r->arm_insn, 5);
10931
10932 if (!single_reg)
10933 {
10934 record_buf[0] = num_regs + reg_m;
10935 record_buf[1] = num_regs + reg_m + 1;
10936 arm_insn_r->reg_rec_count = 2;
10937 }
10938 else
10939 {
10940 record_buf[0] = reg_m + ARM_D0_REGNUM;
10941 arm_insn_r->reg_rec_count = 1;
10942 }
10943 }
10944 }
10945 /* Handle VSTM and VPUSH instructions. */
10946 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
10947 || op_vldm_vstm == 0x12)
10948 {
10949 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
10950 uint32_t memory_index = 0;
10951
10952 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
10953 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
10954 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
10955 imm_off32 = imm_off8 << 24;
10956 memory_count = imm_off8;
10957
10958 if (bit (arm_insn_r->arm_insn, 23))
10959 start_address = u_regval;
10960 else
10961 start_address = u_regval - imm_off32;
10962
10963 if (bit (arm_insn_r->arm_insn, 21))
10964 {
10965 record_buf[0] = reg_rn;
10966 arm_insn_r->reg_rec_count = 1;
10967 }
10968
10969 while (memory_count > 0)
10970 {
10971 if (!single_reg)
10972 {
10973 record_buf_mem[memory_index] = start_address;
10974 record_buf_mem[memory_index + 1] = 4;
10975 start_address = start_address + 4;
10976 memory_index = memory_index + 2;
10977 }
10978 else
10979 {
10980 record_buf_mem[memory_index] = start_address;
10981 record_buf_mem[memory_index + 1] = 4;
10982 record_buf_mem[memory_index + 2] = start_address + 4;
10983 record_buf_mem[memory_index + 3] = 4;
10984 start_address = start_address + 8;
10985 memory_index = memory_index + 4;
10986 }
10987 memory_count--;
10988 }
10989 arm_insn_r->mem_rec_count = (memory_index >> 1);
10990 }
10991 /* Handle VLDM instructions. */
10992 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
10993 || op_vldm_vstm == 0x13)
10994 {
10995 uint32_t reg_count, reg_vd;
10996 uint32_t reg_index = 0;
10997
10998 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
10999 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11000
11001 if (single_reg)
11002 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11003 else
11004 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11005
11006 if (bit (arm_insn_r->arm_insn, 21))
11007 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
11008
11009 while (reg_count > 0)
11010 {
11011 if (single_reg)
11012 record_buf[reg_index++] = num_regs + reg_vd + reg_count - 1;
11013 else
11014 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
11015
11016 reg_count--;
11017 }
11018 arm_insn_r->reg_rec_count = reg_index;
11019 }
11020 /* VSTR Vector store register. */
11021 else if ((opcode & 0x13) == 0x10)
11022 {
bec2ab5a 11023 uint32_t start_address, reg_rn, imm_off32, imm_off8;
f20f80dd
OJ
11024 uint32_t memory_index = 0;
11025
11026 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11027 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11028 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11029 imm_off32 = imm_off8 << 24;
f20f80dd
OJ
11030
11031 if (bit (arm_insn_r->arm_insn, 23))
11032 start_address = u_regval + imm_off32;
11033 else
11034 start_address = u_regval - imm_off32;
11035
11036 if (single_reg)
11037 {
11038 record_buf_mem[memory_index] = start_address;
11039 record_buf_mem[memory_index + 1] = 4;
11040 arm_insn_r->mem_rec_count = 1;
11041 }
11042 else
11043 {
11044 record_buf_mem[memory_index] = start_address;
11045 record_buf_mem[memory_index + 1] = 4;
11046 record_buf_mem[memory_index + 2] = start_address + 4;
11047 record_buf_mem[memory_index + 3] = 4;
11048 arm_insn_r->mem_rec_count = 2;
11049 }
11050 }
11051 /* VLDR Vector load register. */
11052 else if ((opcode & 0x13) == 0x11)
11053 {
11054 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11055
11056 if (!single_reg)
11057 {
11058 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11059 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11060 }
11061 else
11062 {
11063 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11064 record_buf[0] = num_regs + reg_vd;
11065 }
11066 arm_insn_r->reg_rec_count = 1;
11067 }
11068
11069 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11070 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11071 return 0;
11072}
11073
851f26ae
OJ
11074/* Record handler for arm/thumb mode VFP data processing instructions. */
11075
11076static int
11077arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11078{
11079 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11080 uint32_t record_buf[4];
11081 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11082 enum insn_types curr_insn_type = INSN_INV;
11083
11084 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11085 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11086 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11087 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11088 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11089 bit_d = bit (arm_insn_r->arm_insn, 22);
11090 opc1 = opc1 & 0x04;
11091
11092 /* Handle VMLA, VMLS. */
11093 if (opc1 == 0x00)
11094 {
11095 if (bit (arm_insn_r->arm_insn, 10))
11096 {
11097 if (bit (arm_insn_r->arm_insn, 6))
11098 curr_insn_type = INSN_T0;
11099 else
11100 curr_insn_type = INSN_T1;
11101 }
11102 else
11103 {
11104 if (dp_op_sz)
11105 curr_insn_type = INSN_T1;
11106 else
11107 curr_insn_type = INSN_T2;
11108 }
11109 }
11110 /* Handle VNMLA, VNMLS, VNMUL. */
11111 else if (opc1 == 0x01)
11112 {
11113 if (dp_op_sz)
11114 curr_insn_type = INSN_T1;
11115 else
11116 curr_insn_type = INSN_T2;
11117 }
11118 /* Handle VMUL. */
11119 else if (opc1 == 0x02 && !(opc3 & 0x01))
11120 {
11121 if (bit (arm_insn_r->arm_insn, 10))
11122 {
11123 if (bit (arm_insn_r->arm_insn, 6))
11124 curr_insn_type = INSN_T0;
11125 else
11126 curr_insn_type = INSN_T1;
11127 }
11128 else
11129 {
11130 if (dp_op_sz)
11131 curr_insn_type = INSN_T1;
11132 else
11133 curr_insn_type = INSN_T2;
11134 }
11135 }
11136 /* Handle VADD, VSUB. */
11137 else if (opc1 == 0x03)
11138 {
11139 if (!bit (arm_insn_r->arm_insn, 9))
11140 {
11141 if (bit (arm_insn_r->arm_insn, 6))
11142 curr_insn_type = INSN_T0;
11143 else
11144 curr_insn_type = INSN_T1;
11145 }
11146 else
11147 {
11148 if (dp_op_sz)
11149 curr_insn_type = INSN_T1;
11150 else
11151 curr_insn_type = INSN_T2;
11152 }
11153 }
11154 /* Handle VDIV. */
11155 else if (opc1 == 0x0b)
11156 {
11157 if (dp_op_sz)
11158 curr_insn_type = INSN_T1;
11159 else
11160 curr_insn_type = INSN_T2;
11161 }
11162 /* Handle all other vfp data processing instructions. */
11163 else if (opc1 == 0x0b)
11164 {
11165 /* Handle VMOV. */
11166 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11167 {
11168 if (bit (arm_insn_r->arm_insn, 4))
11169 {
11170 if (bit (arm_insn_r->arm_insn, 6))
11171 curr_insn_type = INSN_T0;
11172 else
11173 curr_insn_type = INSN_T1;
11174 }
11175 else
11176 {
11177 if (dp_op_sz)
11178 curr_insn_type = INSN_T1;
11179 else
11180 curr_insn_type = INSN_T2;
11181 }
11182 }
11183 /* Handle VNEG and VABS. */
11184 else if ((opc2 == 0x01 && opc3 == 0x01)
11185 || (opc2 == 0x00 && opc3 == 0x03))
11186 {
11187 if (!bit (arm_insn_r->arm_insn, 11))
11188 {
11189 if (bit (arm_insn_r->arm_insn, 6))
11190 curr_insn_type = INSN_T0;
11191 else
11192 curr_insn_type = INSN_T1;
11193 }
11194 else
11195 {
11196 if (dp_op_sz)
11197 curr_insn_type = INSN_T1;
11198 else
11199 curr_insn_type = INSN_T2;
11200 }
11201 }
11202 /* Handle VSQRT. */
11203 else if (opc2 == 0x01 && opc3 == 0x03)
11204 {
11205 if (dp_op_sz)
11206 curr_insn_type = INSN_T1;
11207 else
11208 curr_insn_type = INSN_T2;
11209 }
11210 /* Handle VCVT. */
11211 else if (opc2 == 0x07 && opc3 == 0x03)
11212 {
11213 if (!dp_op_sz)
11214 curr_insn_type = INSN_T1;
11215 else
11216 curr_insn_type = INSN_T2;
11217 }
11218 else if (opc3 & 0x01)
11219 {
11220 /* Handle VCVT. */
11221 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11222 {
11223 if (!bit (arm_insn_r->arm_insn, 18))
11224 curr_insn_type = INSN_T2;
11225 else
11226 {
11227 if (dp_op_sz)
11228 curr_insn_type = INSN_T1;
11229 else
11230 curr_insn_type = INSN_T2;
11231 }
11232 }
11233 /* Handle VCVT. */
11234 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11235 {
11236 if (dp_op_sz)
11237 curr_insn_type = INSN_T1;
11238 else
11239 curr_insn_type = INSN_T2;
11240 }
11241 /* Handle VCVTB, VCVTT. */
11242 else if ((opc2 & 0x0e) == 0x02)
11243 curr_insn_type = INSN_T2;
11244 /* Handle VCMP, VCMPE. */
11245 else if ((opc2 & 0x0e) == 0x04)
11246 curr_insn_type = INSN_T3;
11247 }
11248 }
11249
11250 switch (curr_insn_type)
11251 {
11252 case INSN_T0:
11253 reg_vd = reg_vd | (bit_d << 4);
11254 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11255 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11256 arm_insn_r->reg_rec_count = 2;
11257 break;
11258
11259 case INSN_T1:
11260 reg_vd = reg_vd | (bit_d << 4);
11261 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11262 arm_insn_r->reg_rec_count = 1;
11263 break;
11264
11265 case INSN_T2:
11266 reg_vd = (reg_vd << 1) | bit_d;
11267 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11268 arm_insn_r->reg_rec_count = 1;
11269 break;
11270
11271 case INSN_T3:
11272 record_buf[0] = ARM_FPSCR_REGNUM;
11273 arm_insn_r->reg_rec_count = 1;
11274 break;
11275
11276 default:
11277 gdb_assert_not_reached ("no decoding pattern found");
11278 break;
11279 }
11280
11281 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11282 return 0;
11283}
11284
60cc5e93
OJ
11285/* Handling opcode 110 insns. */
11286
11287static int
11288arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11289{
bec2ab5a 11290 uint32_t op1, op1_ebit, coproc;
60cc5e93
OJ
11291
11292 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11293 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11294 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11295
11296 if ((coproc & 0x0e) == 0x0a)
11297 {
11298 /* Handle extension register ld/st instructions. */
11299 if (!(op1 & 0x20))
f20f80dd 11300 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11301
11302 /* 64-bit transfers between arm core and extension registers. */
11303 if ((op1 & 0x3e) == 0x04)
f20f80dd 11304 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11305 }
11306 else
11307 {
11308 /* Handle coprocessor ld/st instructions. */
11309 if (!(op1 & 0x3a))
11310 {
11311 /* Store. */
11312 if (!op1_ebit)
11313 return arm_record_unsupported_insn (arm_insn_r);
11314 else
11315 /* Load. */
11316 return arm_record_unsupported_insn (arm_insn_r);
11317 }
11318
11319 /* Move to coprocessor from two arm core registers. */
11320 if (op1 == 0x4)
11321 return arm_record_unsupported_insn (arm_insn_r);
11322
11323 /* Move to two arm core registers from coprocessor. */
11324 if (op1 == 0x5)
11325 {
11326 uint32_t reg_t[2];
11327
11328 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11329 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11330 arm_insn_r->reg_rec_count = 2;
11331
11332 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11333 return 0;
11334 }
11335 }
11336 return arm_record_unsupported_insn (arm_insn_r);
11337}
11338
72508ac0
PO
11339/* Handling opcode 111 insns. */
11340
11341static int
11342arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11343{
60cc5e93 11344 uint32_t op, op1_sbit, op1_ebit, coproc;
72508ac0
PO
11345 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11346 struct regcache *reg_cache = arm_insn_r->regcache;
72508ac0
PO
11347
11348 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93
OJ
11349 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11350 op1_sbit = bit (arm_insn_r->arm_insn, 24);
11351 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11352 op = bit (arm_insn_r->arm_insn, 4);
97dfe206
OJ
11353
11354 /* Handle arm SWI/SVC system call instructions. */
60cc5e93 11355 if (op1_sbit)
97dfe206
OJ
11356 {
11357 if (tdep->arm_syscall_record != NULL)
11358 {
11359 ULONGEST svc_operand, svc_number;
11360
11361 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11362
11363 if (svc_operand) /* OABI. */
11364 svc_number = svc_operand - 0x900000;
11365 else /* EABI. */
11366 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11367
60cc5e93 11368 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11369 }
11370 else
11371 {
11372 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11373 return -1;
97dfe206
OJ
11374 }
11375 }
60cc5e93
OJ
11376
11377 if ((coproc & 0x0e) == 0x0a)
11378 {
11379 /* VFP data-processing instructions. */
11380 if (!op1_sbit && !op)
851f26ae 11381 return arm_record_vfp_data_proc_insn (arm_insn_r);
60cc5e93
OJ
11382
11383 /* Advanced SIMD, VFP instructions. */
11384 if (!op1_sbit && op)
5a578da5 11385 return arm_record_vdata_transfer_insn (arm_insn_r);
60cc5e93 11386 }
97dfe206
OJ
11387 else
11388 {
60cc5e93
OJ
11389 /* Coprocessor data operations. */
11390 if (!op1_sbit && !op)
11391 return arm_record_unsupported_insn (arm_insn_r);
11392
11393 /* Move to Coprocessor from ARM core register. */
11394 if (!op1_sbit && !op1_ebit && op)
11395 return arm_record_unsupported_insn (arm_insn_r);
11396
11397 /* Move to arm core register from coprocessor. */
11398 if (!op1_sbit && op1_ebit && op)
11399 {
11400 uint32_t record_buf[1];
11401
11402 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11403 if (record_buf[0] == 15)
11404 record_buf[0] = ARM_PS_REGNUM;
11405
11406 arm_insn_r->reg_rec_count = 1;
11407 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11408 record_buf);
11409 return 0;
11410 }
97dfe206 11411 }
72508ac0 11412
60cc5e93 11413 return arm_record_unsupported_insn (arm_insn_r);
72508ac0
PO
11414}
11415
11416/* Handling opcode 000 insns. */
11417
11418static int
11419thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11420{
11421 uint32_t record_buf[8];
11422 uint32_t reg_src1 = 0;
11423
11424 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11425
11426 record_buf[0] = ARM_PS_REGNUM;
11427 record_buf[1] = reg_src1;
11428 thumb_insn_r->reg_rec_count = 2;
11429
11430 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11431
11432 return 0;
11433}
11434
11435
11436/* Handling opcode 001 insns. */
11437
11438static int
11439thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11440{
11441 uint32_t record_buf[8];
11442 uint32_t reg_src1 = 0;
11443
11444 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11445
11446 record_buf[0] = ARM_PS_REGNUM;
11447 record_buf[1] = reg_src1;
11448 thumb_insn_r->reg_rec_count = 2;
11449
11450 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11451
11452 return 0;
11453}
11454
11455/* Handling opcode 010 insns. */
11456
11457static int
11458thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11459{
11460 struct regcache *reg_cache = thumb_insn_r->regcache;
11461 uint32_t record_buf[8], record_buf_mem[8];
11462
11463 uint32_t reg_src1 = 0, reg_src2 = 0;
11464 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11465
11466 ULONGEST u_regval[2] = {0};
11467
11468 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11469
11470 if (bit (thumb_insn_r->arm_insn, 12))
11471 {
11472 /* Handle load/store register offset. */
11473 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
11474 if (opcode2 >= 12 && opcode2 <= 15)
11475 {
11476 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11477 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11478 record_buf[0] = reg_src1;
11479 thumb_insn_r->reg_rec_count = 1;
11480 }
11481 else if (opcode2 >= 8 && opcode2 <= 10)
11482 {
11483 /* STR(2), STRB(2), STRH(2) . */
11484 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11485 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11486 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11487 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11488 if (8 == opcode2)
11489 record_buf_mem[0] = 4; /* STR (2). */
11490 else if (10 == opcode2)
11491 record_buf_mem[0] = 1; /* STRB (2). */
11492 else if (9 == opcode2)
11493 record_buf_mem[0] = 2; /* STRH (2). */
11494 record_buf_mem[1] = u_regval[0] + u_regval[1];
11495 thumb_insn_r->mem_rec_count = 1;
11496 }
11497 }
11498 else if (bit (thumb_insn_r->arm_insn, 11))
11499 {
11500 /* Handle load from literal pool. */
11501 /* LDR(3). */
11502 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11503 record_buf[0] = reg_src1;
11504 thumb_insn_r->reg_rec_count = 1;
11505 }
11506 else if (opcode1)
11507 {
11508 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11509 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11510 if ((3 == opcode2) && (!opcode3))
11511 {
11512 /* Branch with exchange. */
11513 record_buf[0] = ARM_PS_REGNUM;
11514 thumb_insn_r->reg_rec_count = 1;
11515 }
11516 else
11517 {
11518 /* Format 8; special data processing insns. */
11519 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11520 record_buf[0] = ARM_PS_REGNUM;
11521 record_buf[1] = reg_src1;
11522 thumb_insn_r->reg_rec_count = 2;
11523 }
11524 }
11525 else
11526 {
11527 /* Format 5; data processing insns. */
11528 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11529 if (bit (thumb_insn_r->arm_insn, 7))
11530 {
11531 reg_src1 = reg_src1 + 8;
11532 }
11533 record_buf[0] = ARM_PS_REGNUM;
11534 record_buf[1] = reg_src1;
11535 thumb_insn_r->reg_rec_count = 2;
11536 }
11537
11538 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11539 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11540 record_buf_mem);
11541
11542 return 0;
11543}
11544
11545/* Handling opcode 001 insns. */
11546
11547static int
11548thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11549{
11550 struct regcache *reg_cache = thumb_insn_r->regcache;
11551 uint32_t record_buf[8], record_buf_mem[8];
11552
11553 uint32_t reg_src1 = 0;
11554 uint32_t opcode = 0, immed_5 = 0;
11555
11556 ULONGEST u_regval = 0;
11557
11558 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11559
11560 if (opcode)
11561 {
11562 /* LDR(1). */
11563 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11564 record_buf[0] = reg_src1;
11565 thumb_insn_r->reg_rec_count = 1;
11566 }
11567 else
11568 {
11569 /* STR(1). */
11570 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11571 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11572 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11573 record_buf_mem[0] = 4;
11574 record_buf_mem[1] = u_regval + (immed_5 * 4);
11575 thumb_insn_r->mem_rec_count = 1;
11576 }
11577
11578 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11579 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11580 record_buf_mem);
11581
11582 return 0;
11583}
11584
11585/* Handling opcode 100 insns. */
11586
11587static int
11588thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11589{
11590 struct regcache *reg_cache = thumb_insn_r->regcache;
11591 uint32_t record_buf[8], record_buf_mem[8];
11592
11593 uint32_t reg_src1 = 0;
11594 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11595
11596 ULONGEST u_regval = 0;
11597
11598 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11599
11600 if (3 == opcode)
11601 {
11602 /* LDR(4). */
11603 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11604 record_buf[0] = reg_src1;
11605 thumb_insn_r->reg_rec_count = 1;
11606 }
11607 else if (1 == opcode)
11608 {
11609 /* LDRH(1). */
11610 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11611 record_buf[0] = reg_src1;
11612 thumb_insn_r->reg_rec_count = 1;
11613 }
11614 else if (2 == opcode)
11615 {
11616 /* STR(3). */
11617 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11618 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11619 record_buf_mem[0] = 4;
11620 record_buf_mem[1] = u_regval + (immed_8 * 4);
11621 thumb_insn_r->mem_rec_count = 1;
11622 }
11623 else if (0 == opcode)
11624 {
11625 /* STRH(1). */
11626 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11627 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11628 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11629 record_buf_mem[0] = 2;
11630 record_buf_mem[1] = u_regval + (immed_5 * 2);
11631 thumb_insn_r->mem_rec_count = 1;
11632 }
11633
11634 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11635 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11636 record_buf_mem);
11637
11638 return 0;
11639}
11640
11641/* Handling opcode 101 insns. */
11642
11643static int
11644thumb_record_misc (insn_decode_record *thumb_insn_r)
11645{
11646 struct regcache *reg_cache = thumb_insn_r->regcache;
11647
11648 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
11649 uint32_t register_bits = 0, register_count = 0;
bec2ab5a 11650 uint32_t index = 0, start_address = 0;
72508ac0
PO
11651 uint32_t record_buf[24], record_buf_mem[48];
11652 uint32_t reg_src1;
11653
11654 ULONGEST u_regval = 0;
11655
11656 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11657 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11658 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
11659
11660 if (14 == opcode2)
11661 {
11662 /* POP. */
11663 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11664 while (register_bits)
f969241e
OJ
11665 {
11666 if (register_bits & 0x00000001)
11667 record_buf[index++] = register_count;
11668 register_bits = register_bits >> 1;
11669 register_count++;
11670 }
11671 record_buf[index++] = ARM_PS_REGNUM;
11672 record_buf[index++] = ARM_SP_REGNUM;
11673 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11674 }
11675 else if (10 == opcode2)
11676 {
11677 /* PUSH. */
11678 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
9904a494 11679 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
72508ac0
PO
11680 while (register_bits)
11681 {
11682 if (register_bits & 0x00000001)
11683 register_count++;
11684 register_bits = register_bits >> 1;
11685 }
11686 start_address = u_regval - \
11687 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11688 thumb_insn_r->mem_rec_count = register_count;
11689 while (register_count)
11690 {
11691 record_buf_mem[(register_count * 2) - 1] = start_address;
11692 record_buf_mem[(register_count * 2) - 2] = 4;
11693 start_address = start_address + 4;
11694 register_count--;
11695 }
11696 record_buf[0] = ARM_SP_REGNUM;
11697 thumb_insn_r->reg_rec_count = 1;
11698 }
11699 else if (0x1E == opcode1)
11700 {
11701 /* BKPT insn. */
11702 /* Handle enhanced software breakpoint insn, BKPT. */
11703 /* CPSR is changed to be executed in ARM state, disabling normal
11704 interrupts, entering abort mode. */
11705 /* According to high vector configuration PC is set. */
11706 /* User hits breakpoint and type reverse, in that case, we need to go back with
11707 previous CPSR and Program Counter. */
11708 record_buf[0] = ARM_PS_REGNUM;
11709 record_buf[1] = ARM_LR_REGNUM;
11710 thumb_insn_r->reg_rec_count = 2;
11711 /* We need to save SPSR value, which is not yet done. */
11712 printf_unfiltered (_("Process record does not support instruction "
11713 "0x%0x at address %s.\n"),
11714 thumb_insn_r->arm_insn,
11715 paddress (thumb_insn_r->gdbarch,
11716 thumb_insn_r->this_addr));
11717 return -1;
11718 }
11719 else if ((0 == opcode) || (1 == opcode))
11720 {
11721 /* ADD(5), ADD(6). */
11722 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11723 record_buf[0] = reg_src1;
11724 thumb_insn_r->reg_rec_count = 1;
11725 }
11726 else if (2 == opcode)
11727 {
11728 /* ADD(7), SUB(4). */
11729 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11730 record_buf[0] = ARM_SP_REGNUM;
11731 thumb_insn_r->reg_rec_count = 1;
11732 }
11733
11734 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11735 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11736 record_buf_mem);
11737
11738 return 0;
11739}
11740
11741/* Handling opcode 110 insns. */
11742
11743static int
11744thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
11745{
11746 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
11747 struct regcache *reg_cache = thumb_insn_r->regcache;
11748
11749 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
11750 uint32_t reg_src1 = 0;
11751 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
bec2ab5a 11752 uint32_t index = 0, start_address = 0;
72508ac0
PO
11753 uint32_t record_buf[24], record_buf_mem[48];
11754
11755 ULONGEST u_regval = 0;
11756
11757 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11758 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
11759
11760 if (1 == opcode2)
11761 {
11762
11763 /* LDMIA. */
11764 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11765 /* Get Rn. */
11766 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11767 while (register_bits)
11768 {
11769 if (register_bits & 0x00000001)
f969241e 11770 record_buf[index++] = register_count;
72508ac0 11771 register_bits = register_bits >> 1;
f969241e 11772 register_count++;
72508ac0 11773 }
f969241e
OJ
11774 record_buf[index++] = reg_src1;
11775 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11776 }
11777 else if (0 == opcode2)
11778 {
11779 /* It handles both STMIA. */
11780 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11781 /* Get Rn. */
11782 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11783 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11784 while (register_bits)
11785 {
11786 if (register_bits & 0x00000001)
11787 register_count++;
11788 register_bits = register_bits >> 1;
11789 }
11790 start_address = u_regval;
11791 thumb_insn_r->mem_rec_count = register_count;
11792 while (register_count)
11793 {
11794 record_buf_mem[(register_count * 2) - 1] = start_address;
11795 record_buf_mem[(register_count * 2) - 2] = 4;
11796 start_address = start_address + 4;
11797 register_count--;
11798 }
11799 }
11800 else if (0x1F == opcode1)
11801 {
11802 /* Handle arm syscall insn. */
97dfe206 11803 if (tdep->arm_syscall_record != NULL)
72508ac0 11804 {
97dfe206
OJ
11805 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
11806 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
11807 }
11808 else
11809 {
11810 printf_unfiltered (_("no syscall record support\n"));
11811 return -1;
11812 }
11813 }
11814
11815 /* B (1), conditional branch is automatically taken care in process_record,
11816 as PC is saved there. */
11817
11818 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11819 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11820 record_buf_mem);
11821
11822 return ret;
11823}
11824
11825/* Handling opcode 111 insns. */
11826
11827static int
11828thumb_record_branch (insn_decode_record *thumb_insn_r)
11829{
11830 uint32_t record_buf[8];
11831 uint32_t bits_h = 0;
11832
11833 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
11834
11835 if (2 == bits_h || 3 == bits_h)
11836 {
11837 /* BL */
11838 record_buf[0] = ARM_LR_REGNUM;
11839 thumb_insn_r->reg_rec_count = 1;
11840 }
11841 else if (1 == bits_h)
11842 {
11843 /* BLX(1). */
11844 record_buf[0] = ARM_PS_REGNUM;
11845 record_buf[1] = ARM_LR_REGNUM;
11846 thumb_insn_r->reg_rec_count = 2;
11847 }
11848
11849 /* B(2) is automatically taken care in process_record, as PC is
11850 saved there. */
11851
11852 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11853
11854 return 0;
11855}
11856
c6ec2b30
OJ
11857/* Handler for thumb2 load/store multiple instructions. */
11858
11859static int
11860thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
11861{
11862 struct regcache *reg_cache = thumb2_insn_r->regcache;
11863
11864 uint32_t reg_rn, op;
11865 uint32_t register_bits = 0, register_count = 0;
11866 uint32_t index = 0, start_address = 0;
11867 uint32_t record_buf[24], record_buf_mem[48];
11868
11869 ULONGEST u_regval = 0;
11870
11871 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11872 op = bits (thumb2_insn_r->arm_insn, 23, 24);
11873
11874 if (0 == op || 3 == op)
11875 {
11876 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11877 {
11878 /* Handle RFE instruction. */
11879 record_buf[0] = ARM_PS_REGNUM;
11880 thumb2_insn_r->reg_rec_count = 1;
11881 }
11882 else
11883 {
11884 /* Handle SRS instruction after reading banked SP. */
11885 return arm_record_unsupported_insn (thumb2_insn_r);
11886 }
11887 }
11888 else if (1 == op || 2 == op)
11889 {
11890 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11891 {
11892 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
11893 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11894 while (register_bits)
11895 {
11896 if (register_bits & 0x00000001)
11897 record_buf[index++] = register_count;
11898
11899 register_count++;
11900 register_bits = register_bits >> 1;
11901 }
11902 record_buf[index++] = reg_rn;
11903 record_buf[index++] = ARM_PS_REGNUM;
11904 thumb2_insn_r->reg_rec_count = index;
11905 }
11906 else
11907 {
11908 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
11909 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11910 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11911 while (register_bits)
11912 {
11913 if (register_bits & 0x00000001)
11914 register_count++;
11915
11916 register_bits = register_bits >> 1;
11917 }
11918
11919 if (1 == op)
11920 {
11921 /* Start address calculation for LDMDB/LDMEA. */
11922 start_address = u_regval;
11923 }
11924 else if (2 == op)
11925 {
11926 /* Start address calculation for LDMDB/LDMEA. */
11927 start_address = u_regval - register_count * 4;
11928 }
11929
11930 thumb2_insn_r->mem_rec_count = register_count;
11931 while (register_count)
11932 {
11933 record_buf_mem[register_count * 2 - 1] = start_address;
11934 record_buf_mem[register_count * 2 - 2] = 4;
11935 start_address = start_address + 4;
11936 register_count--;
11937 }
11938 record_buf[0] = reg_rn;
11939 record_buf[1] = ARM_PS_REGNUM;
11940 thumb2_insn_r->reg_rec_count = 2;
11941 }
11942 }
11943
11944 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
11945 record_buf_mem);
11946 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
11947 record_buf);
11948 return ARM_RECORD_SUCCESS;
11949}
11950
11951/* Handler for thumb2 load/store (dual/exclusive) and table branch
11952 instructions. */
11953
11954static int
11955thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
11956{
11957 struct regcache *reg_cache = thumb2_insn_r->regcache;
11958
11959 uint32_t reg_rd, reg_rn, offset_imm;
11960 uint32_t reg_dest1, reg_dest2;
11961 uint32_t address, offset_addr;
11962 uint32_t record_buf[8], record_buf_mem[8];
11963 uint32_t op1, op2, op3;
c6ec2b30
OJ
11964
11965 ULONGEST u_regval[2];
11966
11967 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
11968 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
11969 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
11970
11971 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11972 {
11973 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
11974 {
11975 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
11976 record_buf[0] = reg_dest1;
11977 record_buf[1] = ARM_PS_REGNUM;
11978 thumb2_insn_r->reg_rec_count = 2;
11979 }
11980
11981 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
11982 {
11983 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
11984 record_buf[2] = reg_dest2;
11985 thumb2_insn_r->reg_rec_count = 3;
11986 }
11987 }
11988 else
11989 {
11990 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11991 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
11992
11993 if (0 == op1 && 0 == op2)
11994 {
11995 /* Handle STREX. */
11996 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
11997 address = u_regval[0] + (offset_imm * 4);
11998 record_buf_mem[0] = 4;
11999 record_buf_mem[1] = address;
12000 thumb2_insn_r->mem_rec_count = 1;
12001 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12002 record_buf[0] = reg_rd;
12003 thumb2_insn_r->reg_rec_count = 1;
12004 }
12005 else if (1 == op1 && 0 == op2)
12006 {
12007 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12008 record_buf[0] = reg_rd;
12009 thumb2_insn_r->reg_rec_count = 1;
12010 address = u_regval[0];
12011 record_buf_mem[1] = address;
12012
12013 if (4 == op3)
12014 {
12015 /* Handle STREXB. */
12016 record_buf_mem[0] = 1;
12017 thumb2_insn_r->mem_rec_count = 1;
12018 }
12019 else if (5 == op3)
12020 {
12021 /* Handle STREXH. */
12022 record_buf_mem[0] = 2 ;
12023 thumb2_insn_r->mem_rec_count = 1;
12024 }
12025 else if (7 == op3)
12026 {
12027 /* Handle STREXD. */
12028 address = u_regval[0];
12029 record_buf_mem[0] = 4;
12030 record_buf_mem[2] = 4;
12031 record_buf_mem[3] = address + 4;
12032 thumb2_insn_r->mem_rec_count = 2;
12033 }
12034 }
12035 else
12036 {
12037 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12038
12039 if (bit (thumb2_insn_r->arm_insn, 24))
12040 {
12041 if (bit (thumb2_insn_r->arm_insn, 23))
12042 offset_addr = u_regval[0] + (offset_imm * 4);
12043 else
12044 offset_addr = u_regval[0] - (offset_imm * 4);
12045
12046 address = offset_addr;
12047 }
12048 else
12049 address = u_regval[0];
12050
12051 record_buf_mem[0] = 4;
12052 record_buf_mem[1] = address;
12053 record_buf_mem[2] = 4;
12054 record_buf_mem[3] = address + 4;
12055 thumb2_insn_r->mem_rec_count = 2;
12056 record_buf[0] = reg_rn;
12057 thumb2_insn_r->reg_rec_count = 1;
12058 }
12059 }
12060
12061 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12062 record_buf);
12063 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12064 record_buf_mem);
12065 return ARM_RECORD_SUCCESS;
12066}
12067
12068/* Handler for thumb2 data processing (shift register and modified immediate)
12069 instructions. */
12070
12071static int
12072thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12073{
12074 uint32_t reg_rd, op;
12075 uint32_t record_buf[8];
12076
12077 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12078 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12079
12080 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12081 {
12082 record_buf[0] = ARM_PS_REGNUM;
12083 thumb2_insn_r->reg_rec_count = 1;
12084 }
12085 else
12086 {
12087 record_buf[0] = reg_rd;
12088 record_buf[1] = ARM_PS_REGNUM;
12089 thumb2_insn_r->reg_rec_count = 2;
12090 }
12091
12092 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12093 record_buf);
12094 return ARM_RECORD_SUCCESS;
12095}
12096
12097/* Generic handler for thumb2 instructions which effect destination and PS
12098 registers. */
12099
12100static int
12101thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12102{
12103 uint32_t reg_rd;
12104 uint32_t record_buf[8];
12105
12106 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12107
12108 record_buf[0] = reg_rd;
12109 record_buf[1] = ARM_PS_REGNUM;
12110 thumb2_insn_r->reg_rec_count = 2;
12111
12112 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12113 record_buf);
12114 return ARM_RECORD_SUCCESS;
12115}
12116
12117/* Handler for thumb2 branch and miscellaneous control instructions. */
12118
12119static int
12120thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12121{
12122 uint32_t op, op1, op2;
12123 uint32_t record_buf[8];
12124
12125 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12126 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12127 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12128
12129 /* Handle MSR insn. */
12130 if (!(op1 & 0x2) && 0x38 == op)
12131 {
12132 if (!(op2 & 0x3))
12133 {
12134 /* CPSR is going to be changed. */
12135 record_buf[0] = ARM_PS_REGNUM;
12136 thumb2_insn_r->reg_rec_count = 1;
12137 }
12138 else
12139 {
12140 arm_record_unsupported_insn(thumb2_insn_r);
12141 return -1;
12142 }
12143 }
12144 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12145 {
12146 /* BLX. */
12147 record_buf[0] = ARM_PS_REGNUM;
12148 record_buf[1] = ARM_LR_REGNUM;
12149 thumb2_insn_r->reg_rec_count = 2;
12150 }
12151
12152 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12153 record_buf);
12154 return ARM_RECORD_SUCCESS;
12155}
12156
12157/* Handler for thumb2 store single data item instructions. */
12158
12159static int
12160thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12161{
12162 struct regcache *reg_cache = thumb2_insn_r->regcache;
12163
12164 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12165 uint32_t address, offset_addr;
12166 uint32_t record_buf[8], record_buf_mem[8];
12167 uint32_t op1, op2;
12168
12169 ULONGEST u_regval[2];
12170
12171 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12172 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12173 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12174 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12175
12176 if (bit (thumb2_insn_r->arm_insn, 23))
12177 {
12178 /* T2 encoding. */
12179 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12180 offset_addr = u_regval[0] + offset_imm;
12181 address = offset_addr;
12182 }
12183 else
12184 {
12185 /* T3 encoding. */
12186 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12187 {
12188 /* Handle STRB (register). */
12189 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12190 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12191 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12192 offset_addr = u_regval[1] << shift_imm;
12193 address = u_regval[0] + offset_addr;
12194 }
12195 else
12196 {
12197 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12198 if (bit (thumb2_insn_r->arm_insn, 10))
12199 {
12200 if (bit (thumb2_insn_r->arm_insn, 9))
12201 offset_addr = u_regval[0] + offset_imm;
12202 else
12203 offset_addr = u_regval[0] - offset_imm;
12204
12205 address = offset_addr;
12206 }
12207 else
12208 address = u_regval[0];
12209 }
12210 }
12211
12212 switch (op1)
12213 {
12214 /* Store byte instructions. */
12215 case 4:
12216 case 0:
12217 record_buf_mem[0] = 1;
12218 break;
12219 /* Store half word instructions. */
12220 case 1:
12221 case 5:
12222 record_buf_mem[0] = 2;
12223 break;
12224 /* Store word instructions. */
12225 case 2:
12226 case 6:
12227 record_buf_mem[0] = 4;
12228 break;
12229
12230 default:
12231 gdb_assert_not_reached ("no decoding pattern found");
12232 break;
12233 }
12234
12235 record_buf_mem[1] = address;
12236 thumb2_insn_r->mem_rec_count = 1;
12237 record_buf[0] = reg_rn;
12238 thumb2_insn_r->reg_rec_count = 1;
12239
12240 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12241 record_buf);
12242 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12243 record_buf_mem);
12244 return ARM_RECORD_SUCCESS;
12245}
12246
12247/* Handler for thumb2 load memory hints instructions. */
12248
12249static int
12250thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12251{
12252 uint32_t record_buf[8];
12253 uint32_t reg_rt, reg_rn;
12254
12255 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12256 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12257
12258 if (ARM_PC_REGNUM != reg_rt)
12259 {
12260 record_buf[0] = reg_rt;
12261 record_buf[1] = reg_rn;
12262 record_buf[2] = ARM_PS_REGNUM;
12263 thumb2_insn_r->reg_rec_count = 3;
12264
12265 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12266 record_buf);
12267 return ARM_RECORD_SUCCESS;
12268 }
12269
12270 return ARM_RECORD_FAILURE;
12271}
12272
12273/* Handler for thumb2 load word instructions. */
12274
12275static int
12276thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12277{
c6ec2b30
OJ
12278 uint32_t record_buf[8];
12279
12280 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12281 record_buf[1] = ARM_PS_REGNUM;
12282 thumb2_insn_r->reg_rec_count = 2;
12283
12284 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12285 record_buf);
12286 return ARM_RECORD_SUCCESS;
12287}
12288
12289/* Handler for thumb2 long multiply, long multiply accumulate, and
12290 divide instructions. */
12291
12292static int
12293thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12294{
12295 uint32_t opcode1 = 0, opcode2 = 0;
12296 uint32_t record_buf[8];
c6ec2b30
OJ
12297
12298 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12299 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12300
12301 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12302 {
12303 /* Handle SMULL, UMULL, SMULAL. */
12304 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12305 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12306 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12307 record_buf[2] = ARM_PS_REGNUM;
12308 thumb2_insn_r->reg_rec_count = 3;
12309 }
12310 else if (1 == opcode1 || 3 == opcode2)
12311 {
12312 /* Handle SDIV and UDIV. */
12313 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12314 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12315 record_buf[2] = ARM_PS_REGNUM;
12316 thumb2_insn_r->reg_rec_count = 3;
12317 }
12318 else
12319 return ARM_RECORD_FAILURE;
12320
12321 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12322 record_buf);
12323 return ARM_RECORD_SUCCESS;
12324}
12325
60cc5e93
OJ
12326/* Record handler for thumb32 coprocessor instructions. */
12327
12328static int
12329thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12330{
12331 if (bit (thumb2_insn_r->arm_insn, 25))
12332 return arm_record_coproc_data_proc (thumb2_insn_r);
12333 else
12334 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12335}
12336
1e1b6563
OJ
12337/* Record handler for advance SIMD structure load/store instructions. */
12338
12339static int
12340thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12341{
12342 struct regcache *reg_cache = thumb2_insn_r->regcache;
12343 uint32_t l_bit, a_bit, b_bits;
12344 uint32_t record_buf[128], record_buf_mem[128];
bec2ab5a 12345 uint32_t reg_rn, reg_vd, address, f_elem;
1e1b6563
OJ
12346 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12347 uint8_t f_ebytes;
12348
12349 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12350 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12351 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12352 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12353 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12354 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12355 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
1e1b6563
OJ
12356 f_elem = 8 / f_ebytes;
12357
12358 if (!l_bit)
12359 {
12360 ULONGEST u_regval = 0;
12361 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12362 address = u_regval;
12363
12364 if (!a_bit)
12365 {
12366 /* Handle VST1. */
12367 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12368 {
12369 if (b_bits == 0x07)
12370 bf_regs = 1;
12371 else if (b_bits == 0x0a)
12372 bf_regs = 2;
12373 else if (b_bits == 0x06)
12374 bf_regs = 3;
12375 else if (b_bits == 0x02)
12376 bf_regs = 4;
12377 else
12378 bf_regs = 0;
12379
12380 for (index_r = 0; index_r < bf_regs; index_r++)
12381 {
12382 for (index_e = 0; index_e < f_elem; index_e++)
12383 {
12384 record_buf_mem[index_m++] = f_ebytes;
12385 record_buf_mem[index_m++] = address;
12386 address = address + f_ebytes;
12387 thumb2_insn_r->mem_rec_count += 1;
12388 }
12389 }
12390 }
12391 /* Handle VST2. */
12392 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12393 {
12394 if (b_bits == 0x09 || b_bits == 0x08)
12395 bf_regs = 1;
12396 else if (b_bits == 0x03)
12397 bf_regs = 2;
12398 else
12399 bf_regs = 0;
12400
12401 for (index_r = 0; index_r < bf_regs; index_r++)
12402 for (index_e = 0; index_e < f_elem; index_e++)
12403 {
12404 for (loop_t = 0; loop_t < 2; loop_t++)
12405 {
12406 record_buf_mem[index_m++] = f_ebytes;
12407 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12408 thumb2_insn_r->mem_rec_count += 1;
12409 }
12410 address = address + (2 * f_ebytes);
12411 }
12412 }
12413 /* Handle VST3. */
12414 else if ((b_bits & 0x0e) == 0x04)
12415 {
12416 for (index_e = 0; index_e < f_elem; index_e++)
12417 {
12418 for (loop_t = 0; loop_t < 3; loop_t++)
12419 {
12420 record_buf_mem[index_m++] = f_ebytes;
12421 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12422 thumb2_insn_r->mem_rec_count += 1;
12423 }
12424 address = address + (3 * f_ebytes);
12425 }
12426 }
12427 /* Handle VST4. */
12428 else if (!(b_bits & 0x0e))
12429 {
12430 for (index_e = 0; index_e < f_elem; index_e++)
12431 {
12432 for (loop_t = 0; loop_t < 4; loop_t++)
12433 {
12434 record_buf_mem[index_m++] = f_ebytes;
12435 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12436 thumb2_insn_r->mem_rec_count += 1;
12437 }
12438 address = address + (4 * f_ebytes);
12439 }
12440 }
12441 }
12442 else
12443 {
12444 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12445
12446 if (bft_size == 0x00)
12447 f_ebytes = 1;
12448 else if (bft_size == 0x01)
12449 f_ebytes = 2;
12450 else if (bft_size == 0x02)
12451 f_ebytes = 4;
12452 else
12453 f_ebytes = 0;
12454
12455 /* Handle VST1. */
12456 if (!(b_bits & 0x0b) || b_bits == 0x08)
12457 thumb2_insn_r->mem_rec_count = 1;
12458 /* Handle VST2. */
12459 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12460 thumb2_insn_r->mem_rec_count = 2;
12461 /* Handle VST3. */
12462 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12463 thumb2_insn_r->mem_rec_count = 3;
12464 /* Handle VST4. */
12465 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12466 thumb2_insn_r->mem_rec_count = 4;
12467
12468 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12469 {
12470 record_buf_mem[index_m] = f_ebytes;
12471 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12472 }
12473 }
12474 }
12475 else
12476 {
12477 if (!a_bit)
12478 {
12479 /* Handle VLD1. */
12480 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12481 thumb2_insn_r->reg_rec_count = 1;
12482 /* Handle VLD2. */
12483 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12484 thumb2_insn_r->reg_rec_count = 2;
12485 /* Handle VLD3. */
12486 else if ((b_bits & 0x0e) == 0x04)
12487 thumb2_insn_r->reg_rec_count = 3;
12488 /* Handle VLD4. */
12489 else if (!(b_bits & 0x0e))
12490 thumb2_insn_r->reg_rec_count = 4;
12491 }
12492 else
12493 {
12494 /* Handle VLD1. */
12495 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12496 thumb2_insn_r->reg_rec_count = 1;
12497 /* Handle VLD2. */
12498 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12499 thumb2_insn_r->reg_rec_count = 2;
12500 /* Handle VLD3. */
12501 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12502 thumb2_insn_r->reg_rec_count = 3;
12503 /* Handle VLD4. */
12504 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12505 thumb2_insn_r->reg_rec_count = 4;
12506
12507 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12508 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12509 }
12510 }
12511
12512 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12513 {
12514 record_buf[index_r] = reg_rn;
12515 thumb2_insn_r->reg_rec_count += 1;
12516 }
12517
12518 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12519 record_buf);
12520 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12521 record_buf_mem);
12522 return 0;
12523}
12524
c6ec2b30
OJ
12525/* Decodes thumb2 instruction type and invokes its record handler. */
12526
12527static unsigned int
12528thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12529{
12530 uint32_t op, op1, op2;
12531
12532 op = bit (thumb2_insn_r->arm_insn, 15);
12533 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12534 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12535
12536 if (op1 == 0x01)
12537 {
12538 if (!(op2 & 0x64 ))
12539 {
12540 /* Load/store multiple instruction. */
12541 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12542 }
12543 else if (!((op2 & 0x64) ^ 0x04))
12544 {
12545 /* Load/store (dual/exclusive) and table branch instruction. */
12546 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12547 }
12548 else if (!((op2 & 0x20) ^ 0x20))
12549 {
12550 /* Data-processing (shifted register). */
12551 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12552 }
12553 else if (op2 & 0x40)
12554 {
12555 /* Co-processor instructions. */
60cc5e93 12556 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12557 }
12558 }
12559 else if (op1 == 0x02)
12560 {
12561 if (op)
12562 {
12563 /* Branches and miscellaneous control instructions. */
12564 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12565 }
12566 else if (op2 & 0x20)
12567 {
12568 /* Data-processing (plain binary immediate) instruction. */
12569 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12570 }
12571 else
12572 {
12573 /* Data-processing (modified immediate). */
12574 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12575 }
12576 }
12577 else if (op1 == 0x03)
12578 {
12579 if (!(op2 & 0x71 ))
12580 {
12581 /* Store single data item. */
12582 return thumb2_record_str_single_data (thumb2_insn_r);
12583 }
12584 else if (!((op2 & 0x71) ^ 0x10))
12585 {
12586 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12587 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12588 }
12589 else if (!((op2 & 0x67) ^ 0x01))
12590 {
12591 /* Load byte, memory hints instruction. */
12592 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12593 }
12594 else if (!((op2 & 0x67) ^ 0x03))
12595 {
12596 /* Load halfword, memory hints instruction. */
12597 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12598 }
12599 else if (!((op2 & 0x67) ^ 0x05))
12600 {
12601 /* Load word instruction. */
12602 return thumb2_record_ld_word (thumb2_insn_r);
12603 }
12604 else if (!((op2 & 0x70) ^ 0x20))
12605 {
12606 /* Data-processing (register) instruction. */
12607 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12608 }
12609 else if (!((op2 & 0x78) ^ 0x30))
12610 {
12611 /* Multiply, multiply accumulate, abs diff instruction. */
12612 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12613 }
12614 else if (!((op2 & 0x78) ^ 0x38))
12615 {
12616 /* Long multiply, long multiply accumulate, and divide. */
12617 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12618 }
12619 else if (op2 & 0x40)
12620 {
12621 /* Co-processor instructions. */
60cc5e93 12622 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12623 }
12624 }
12625
12626 return -1;
12627}
72508ac0
PO
12628
12629/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12630and positive val on fauilure. */
12631
12632static int
12633extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
12634{
12635 gdb_byte buf[insn_size];
12636
12637 memset (&buf[0], 0, insn_size);
12638
12639 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
12640 return 1;
12641 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12642 insn_size,
2959fed9 12643 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
12644 return 0;
12645}
12646
12647typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12648
12649/* Decode arm/thumb insn depending on condition cods and opcodes; and
12650 dispatch it. */
12651
12652static int
12653decode_insn (insn_decode_record *arm_record, record_type_t record_type,
12654 uint32_t insn_size)
12655{
12656
12657 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
0fa9c223 12658 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
12659 {
12660 arm_record_data_proc_misc_ld_str, /* 000. */
12661 arm_record_data_proc_imm, /* 001. */
12662 arm_record_ld_st_imm_offset, /* 010. */
12663 arm_record_ld_st_reg_offset, /* 011. */
12664 arm_record_ld_st_multiple, /* 100. */
12665 arm_record_b_bl, /* 101. */
60cc5e93 12666 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
12667 arm_record_coproc_data_proc /* 111. */
12668 };
12669
12670 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
0fa9c223 12671 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
12672 { \
12673 thumb_record_shift_add_sub, /* 000. */
12674 thumb_record_add_sub_cmp_mov, /* 001. */
12675 thumb_record_ld_st_reg_offset, /* 010. */
12676 thumb_record_ld_st_imm_offset, /* 011. */
12677 thumb_record_ld_st_stack, /* 100. */
12678 thumb_record_misc, /* 101. */
12679 thumb_record_ldm_stm_swi, /* 110. */
12680 thumb_record_branch /* 111. */
12681 };
12682
12683 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12684 uint32_t insn_id = 0;
12685
12686 if (extract_arm_insn (arm_record, insn_size))
12687 {
12688 if (record_debug)
12689 {
12690 printf_unfiltered (_("Process record: error reading memory at "
12691 "addr %s len = %d.\n"),
12692 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
12693 }
12694 return -1;
12695 }
12696 else if (ARM_RECORD == record_type)
12697 {
12698 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
12699 insn_id = bits (arm_record->arm_insn, 25, 27);
12700 ret = arm_record_extension_space (arm_record);
12701 /* If this insn has fallen into extension space
12702 then we need not decode it anymore. */
12703 if (ret != -1 && !INSN_RECORDED(arm_record))
12704 {
12705 ret = arm_handle_insn[insn_id] (arm_record);
12706 }
12707 }
12708 else if (THUMB_RECORD == record_type)
12709 {
12710 /* As thumb does not have condition codes, we set negative. */
12711 arm_record->cond = -1;
12712 insn_id = bits (arm_record->arm_insn, 13, 15);
12713 ret = thumb_handle_insn[insn_id] (arm_record);
12714 }
12715 else if (THUMB2_RECORD == record_type)
12716 {
c6ec2b30
OJ
12717 /* As thumb does not have condition codes, we set negative. */
12718 arm_record->cond = -1;
12719
12720 /* Swap first half of 32bit thumb instruction with second half. */
12721 arm_record->arm_insn
12722 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
12723
12724 insn_id = thumb2_record_decode_insn_handler (arm_record);
12725
12726 if (insn_id != ARM_RECORD_SUCCESS)
12727 {
12728 arm_record_unsupported_insn (arm_record);
12729 ret = -1;
12730 }
72508ac0
PO
12731 }
12732 else
12733 {
12734 /* Throw assertion. */
12735 gdb_assert_not_reached ("not a valid instruction, could not decode");
12736 }
12737
12738 return ret;
12739}
12740
12741
12742/* Cleans up local record registers and memory allocations. */
12743
12744static void
12745deallocate_reg_mem (insn_decode_record *record)
12746{
12747 xfree (record->arm_regs);
12748 xfree (record->arm_mems);
12749}
12750
12751
12752/* Parse the current instruction and record the values of the registers and
12753 memory that will be changed in current instruction to record_arch_list".
12754 Return -1 if something is wrong. */
12755
12756int
12757arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
12758 CORE_ADDR insn_addr)
12759{
12760
72508ac0
PO
12761 uint32_t no_of_rec = 0;
12762 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
12763 ULONGEST t_bit = 0, insn_id = 0;
12764
12765 ULONGEST u_regval = 0;
12766
12767 insn_decode_record arm_record;
12768
12769 memset (&arm_record, 0, sizeof (insn_decode_record));
12770 arm_record.regcache = regcache;
12771 arm_record.this_addr = insn_addr;
12772 arm_record.gdbarch = gdbarch;
12773
12774
12775 if (record_debug > 1)
12776 {
12777 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
12778 "addr = %s\n",
12779 paddress (gdbarch, arm_record.this_addr));
12780 }
12781
12782 if (extract_arm_insn (&arm_record, 2))
12783 {
12784 if (record_debug)
12785 {
12786 printf_unfiltered (_("Process record: error reading memory at "
12787 "addr %s len = %d.\n"),
12788 paddress (arm_record.gdbarch,
12789 arm_record.this_addr), 2);
12790 }
12791 return -1;
12792 }
12793
12794 /* Check the insn, whether it is thumb or arm one. */
12795
12796 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
12797 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
12798
12799
12800 if (!(u_regval & t_bit))
12801 {
12802 /* We are decoding arm insn. */
12803 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
12804 }
12805 else
12806 {
12807 insn_id = bits (arm_record.arm_insn, 11, 15);
12808 /* is it thumb2 insn? */
12809 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
12810 {
12811 ret = decode_insn (&arm_record, THUMB2_RECORD,
12812 THUMB2_INSN_SIZE_BYTES);
12813 }
12814 else
12815 {
12816 /* We are decoding thumb insn. */
12817 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
12818 }
12819 }
12820
12821 if (0 == ret)
12822 {
12823 /* Record registers. */
25ea693b 12824 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0
PO
12825 if (arm_record.arm_regs)
12826 {
12827 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
12828 {
25ea693b
MM
12829 if (record_full_arch_list_add_reg
12830 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
72508ac0
PO
12831 ret = -1;
12832 }
12833 }
12834 /* Record memories. */
12835 if (arm_record.arm_mems)
12836 {
12837 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
12838 {
25ea693b 12839 if (record_full_arch_list_add_mem
72508ac0 12840 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 12841 arm_record.arm_mems[no_of_rec].len))
72508ac0
PO
12842 ret = -1;
12843 }
12844 }
12845
25ea693b 12846 if (record_full_arch_list_add_end ())
72508ac0
PO
12847 ret = -1;
12848 }
12849
12850
12851 deallocate_reg_mem (&arm_record);
12852
12853 return ret;
12854}
12855