Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
CommitLineData
ed9a39eb 1/* Common target dependent code for GDB on ARM systems.
0fd88904 2
618f726f 3 Copyright (C) 1988-2016 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 19
0baeab03
PA
20#include "defs.h"
21
0963b4bd 22#include <ctype.h> /* XXX for isupper (). */
34e8f22d 23
c906108c
SS
24#include "frame.h"
25#include "inferior.h"
45741a9c 26#include "infrun.h"
c906108c
SS
27#include "gdbcmd.h"
28#include "gdbcore.h"
0963b4bd 29#include "dis-asm.h" /* For register styles. */
4e052eda 30#include "regcache.h"
54483882 31#include "reggroups.h"
d16aafd8 32#include "doublest.h"
fd0407d6 33#include "value.h"
34e8f22d 34#include "arch-utils.h"
4be87837 35#include "osabi.h"
eb5492fa
DJ
36#include "frame-unwind.h"
37#include "frame-base.h"
38#include "trad-frame.h"
842e1f1e
DJ
39#include "objfiles.h"
40#include "dwarf2-frame.h"
e4c16157 41#include "gdbtypes.h"
29d73ae4 42#include "prologue-value.h"
25f8c692 43#include "remote.h"
123dc839
DJ
44#include "target-descriptions.h"
45#include "user-regs.h"
0e9e9abd 46#include "observer.h"
34e8f22d 47
8689682c 48#include "arch/arm.h"
d9311bfa 49#include "arch/arm-get-next-pcs.h"
34e8f22d 50#include "arm-tdep.h"
26216b98 51#include "gdb/sim-arm.h"
34e8f22d 52
082fc60d
RE
53#include "elf-bfd.h"
54#include "coff/internal.h"
97e03143 55#include "elf/arm.h"
c906108c 56
60c5725c 57#include "vec.h"
26216b98 58
72508ac0 59#include "record.h"
d02ed0bb 60#include "record-full.h"
72508ac0 61
9779414d 62#include "features/arm-with-m.c"
25f8c692 63#include "features/arm-with-m-fpa-layout.c"
3184d3f9 64#include "features/arm-with-m-vfp-d16.c"
ef7e8358
UW
65#include "features/arm-with-iwmmxt.c"
66#include "features/arm-with-vfpv2.c"
67#include "features/arm-with-vfpv3.c"
68#include "features/arm-with-neon.c"
9779414d 69
6529d2dd
AC
70static int arm_debug;
71
082fc60d
RE
72/* Macros for setting and testing a bit in a minimal symbol that marks
73 it as Thumb function. The MSB of the minimal symbol's "info" field
f594e5e9 74 is used for this purpose.
082fc60d
RE
75
76 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
f594e5e9 77 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
082fc60d 78
0963b4bd 79#define MSYMBOL_SET_SPECIAL(msym) \
b887350f 80 MSYMBOL_TARGET_FLAG_1 (msym) = 1
082fc60d
RE
81
82#define MSYMBOL_IS_SPECIAL(msym) \
b887350f 83 MSYMBOL_TARGET_FLAG_1 (msym)
082fc60d 84
60c5725c
DJ
85/* Per-objfile data used for mapping symbols. */
86static const struct objfile_data *arm_objfile_data_key;
87
88struct arm_mapping_symbol
89{
90 bfd_vma value;
91 char type;
92};
93typedef struct arm_mapping_symbol arm_mapping_symbol_s;
94DEF_VEC_O(arm_mapping_symbol_s);
95
96struct arm_per_objfile
97{
98 VEC(arm_mapping_symbol_s) **section_maps;
99};
100
afd7eef0
RE
101/* The list of available "set arm ..." and "show arm ..." commands. */
102static struct cmd_list_element *setarmcmdlist = NULL;
103static struct cmd_list_element *showarmcmdlist = NULL;
104
fd50bc42
RE
105/* The type of floating-point to use. Keep this in sync with enum
106 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 107static const char *const fp_model_strings[] =
fd50bc42
RE
108{
109 "auto",
110 "softfpa",
111 "fpa",
112 "softvfp",
28e97307
DJ
113 "vfp",
114 NULL
fd50bc42
RE
115};
116
117/* A variable that can be configured by the user. */
118static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
119static const char *current_fp_model = "auto";
120
28e97307 121/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 122static const char *const arm_abi_strings[] =
28e97307
DJ
123{
124 "auto",
125 "APCS",
126 "AAPCS",
127 NULL
128};
129
130/* A variable that can be configured by the user. */
131static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
132static const char *arm_abi_string = "auto";
133
0428b8f5 134/* The execution mode to assume. */
40478521 135static const char *const arm_mode_strings[] =
0428b8f5
DJ
136 {
137 "auto",
138 "arm",
68770265
MGD
139 "thumb",
140 NULL
0428b8f5
DJ
141 };
142
143static const char *arm_fallback_mode_string = "auto";
144static const char *arm_force_mode_string = "auto";
145
18819fa6
UW
146/* Internal override of the execution mode. -1 means no override,
147 0 means override to ARM mode, 1 means override to Thumb mode.
148 The effect is the same as if arm_force_mode has been set by the
149 user (except the internal override has precedence over a user's
150 arm_force_mode override). */
151static int arm_override_mode = -1;
152
94c30b78 153/* Number of different reg name sets (options). */
afd7eef0 154static int num_disassembly_options;
bc90b915 155
f32bf4a4
YQ
156/* The standard register names, and all the valid aliases for them. Note
157 that `fp', `sp' and `pc' are not added in this alias list, because they
158 have been added as builtin user registers in
159 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
160static const struct
161{
162 const char *name;
163 int regnum;
164} arm_register_aliases[] = {
165 /* Basic register numbers. */
166 { "r0", 0 },
167 { "r1", 1 },
168 { "r2", 2 },
169 { "r3", 3 },
170 { "r4", 4 },
171 { "r5", 5 },
172 { "r6", 6 },
173 { "r7", 7 },
174 { "r8", 8 },
175 { "r9", 9 },
176 { "r10", 10 },
177 { "r11", 11 },
178 { "r12", 12 },
179 { "r13", 13 },
180 { "r14", 14 },
181 { "r15", 15 },
182 /* Synonyms (argument and variable registers). */
183 { "a1", 0 },
184 { "a2", 1 },
185 { "a3", 2 },
186 { "a4", 3 },
187 { "v1", 4 },
188 { "v2", 5 },
189 { "v3", 6 },
190 { "v4", 7 },
191 { "v5", 8 },
192 { "v6", 9 },
193 { "v7", 10 },
194 { "v8", 11 },
195 /* Other platform-specific names for r9. */
196 { "sb", 9 },
197 { "tr", 9 },
198 /* Special names. */
199 { "ip", 12 },
123dc839 200 { "lr", 14 },
123dc839
DJ
201 /* Names used by GCC (not listed in the ARM EABI). */
202 { "sl", 10 },
123dc839
DJ
203 /* A special name from the older ATPCS. */
204 { "wr", 7 },
205};
bc90b915 206
123dc839 207static const char *const arm_register_names[] =
da59e081
JM
208{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
209 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
210 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
211 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
212 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
213 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 214 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 215
afd7eef0
RE
216/* Valid register name styles. */
217static const char **valid_disassembly_styles;
ed9a39eb 218
afd7eef0
RE
219/* Disassembly style to use. Default to "std" register names. */
220static const char *disassembly_style;
96baa820 221
ed9a39eb 222/* This is used to keep the bfd arch_info in sync with the disassembly
afd7eef0
RE
223 style. */
224static void set_disassembly_style_sfunc(char *, int,
ed9a39eb 225 struct cmd_list_element *);
afd7eef0 226static void set_disassembly_style (void);
ed9a39eb 227
b508a996 228static void convert_from_extended (const struct floatformat *, const void *,
be8626e0 229 void *, int);
b508a996 230static void convert_to_extended (const struct floatformat *, void *,
be8626e0 231 const void *, int);
ed9a39eb 232
05d1431c
PA
233static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
234 struct regcache *regcache,
235 int regnum, gdb_byte *buf);
58d6951d
DJ
236static void arm_neon_quad_write (struct gdbarch *gdbarch,
237 struct regcache *regcache,
238 int regnum, const gdb_byte *buf);
239
e7cf25a8 240static CORE_ADDR
553cb527 241 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
e7cf25a8
YQ
242
243
d9311bfa
AT
244/* get_next_pcs operations. */
245static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
246 arm_get_next_pcs_read_memory_unsigned_integer,
247 arm_get_next_pcs_syscall_next_pc,
248 arm_get_next_pcs_addr_bits_remove,
ed443b61
YQ
249 arm_get_next_pcs_is_thumb,
250 NULL,
d9311bfa
AT
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 6140static CORE_ADDR
553cb527 6141arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
d9311bfa 6142{
d9311bfa
AT
6143 return 0;
6144}
6145
6146/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6147
6148int
6149arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6150{
6151 return arm_is_thumb (self->regcache);
6152}
6153
6154/* single_step() is called just before we want to resume the inferior,
6155 if we want to single-step it but there is no hardware or kernel
6156 single-step support. We find the target of the coming instructions
6157 and breakpoint them. */
6158
6159int
6160arm_software_single_step (struct frame_info *frame)
6161{
6162 struct regcache *regcache = get_current_regcache ();
6163 struct gdbarch *gdbarch = get_regcache_arch (regcache);
6164 struct address_space *aspace = get_regcache_aspace (regcache);
6165 struct arm_get_next_pcs next_pcs_ctx;
6166 CORE_ADDR pc;
6167 int i;
6168 VEC (CORE_ADDR) *next_pcs = NULL;
6169 struct cleanup *old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
6170
6171 arm_get_next_pcs_ctor (&next_pcs_ctx,
6172 &arm_get_next_pcs_ops,
6173 gdbarch_byte_order (gdbarch),
6174 gdbarch_byte_order_for_code (gdbarch),
1b451dda 6175 0,
d9311bfa
AT
6176 regcache);
6177
4d18591b 6178 next_pcs = arm_get_next_pcs (&next_pcs_ctx);
d9311bfa
AT
6179
6180 for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); i++)
6181 arm_insert_single_step_breakpoint (gdbarch, aspace, pc);
6182
6183 do_cleanups (old_chain);
6184
6185 return 1;
6186}
6187
34518530
YQ
6188/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6189 for Linux, where some SVC instructions must be treated specially. */
6190
6191static void
6192cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
6193 struct displaced_step_closure *dsc)
6194{
6195 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6196
6197 if (debug_displaced)
6198 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6199 "%.8lx\n", (unsigned long) resume_addr);
6200
6201 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6202}
6203
6204
6205/* Common copy routine for svc instruciton. */
6206
6207static int
6208install_svc (struct gdbarch *gdbarch, struct regcache *regs,
6209 struct displaced_step_closure *dsc)
6210{
6211 /* Preparation: none.
6212 Insn: unmodified svc.
6213 Cleanup: pc <- insn_addr + insn_size. */
6214
6215 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6216 instruction. */
6217 dsc->wrote_to_pc = 1;
6218
6219 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6220 if (dsc->u.svc.copy_svc_os)
6221 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6222 else
6223 {
6224 dsc->cleanup = &cleanup_svc;
6225 return 0;
6226 }
34518530
YQ
6227}
6228
6229static int
6230arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
6231 struct regcache *regs, struct displaced_step_closure *dsc)
6232{
6233
6234 if (debug_displaced)
6235 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6236 (unsigned long) insn);
6237
6238 dsc->modinsn[0] = insn;
6239
6240 return install_svc (gdbarch, regs, dsc);
6241}
6242
6243static int
6244thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
6245 struct regcache *regs, struct displaced_step_closure *dsc)
6246{
6247
6248 if (debug_displaced)
6249 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6250 insn);
bd18283a 6251
34518530
YQ
6252 dsc->modinsn[0] = insn;
6253
6254 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6255}
6256
6257/* Copy undefined instructions. */
6258
6259static int
7ff120b4
YQ
6260arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
6261 struct displaced_step_closure *dsc)
cca44b1b
JB
6262{
6263 if (debug_displaced)
0963b4bd
MS
6264 fprintf_unfiltered (gdb_stdlog,
6265 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6266 (unsigned long) insn);
6267
6268 dsc->modinsn[0] = insn;
6269
6270 return 0;
6271}
6272
34518530
YQ
6273static int
6274thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6275 struct displaced_step_closure *dsc)
6276{
6277
6278 if (debug_displaced)
6279 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6280 "%.4x %.4x\n", (unsigned short) insn1,
6281 (unsigned short) insn2);
6282
6283 dsc->modinsn[0] = insn1;
6284 dsc->modinsn[1] = insn2;
6285 dsc->numinsns = 2;
6286
6287 return 0;
6288}
6289
cca44b1b
JB
6290/* Copy unpredictable instructions. */
6291
6292static int
7ff120b4
YQ
6293arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
6294 struct displaced_step_closure *dsc)
cca44b1b
JB
6295{
6296 if (debug_displaced)
6297 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6298 "%.8lx\n", (unsigned long) insn);
6299
6300 dsc->modinsn[0] = insn;
6301
6302 return 0;
6303}
6304
6305/* The decode_* functions are instruction decoding helpers. They mostly follow
6306 the presentation in the ARM ARM. */
6307
6308static int
7ff120b4
YQ
6309arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6310 struct regcache *regs,
6311 struct displaced_step_closure *dsc)
cca44b1b
JB
6312{
6313 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6314 unsigned int rn = bits (insn, 16, 19);
6315
6316 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 6317 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 6318 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 6319 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6320 else if ((op1 & 0x60) == 0x20)
7ff120b4 6321 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6322 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6323 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6324 dsc);
cca44b1b 6325 else if ((op1 & 0x77) == 0x41)
7ff120b4 6326 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6327 else if ((op1 & 0x77) == 0x45)
7ff120b4 6328 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6329 else if ((op1 & 0x77) == 0x51)
6330 {
6331 if (rn != 0xf)
7ff120b4 6332 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6333 else
7ff120b4 6334 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6335 }
6336 else if ((op1 & 0x77) == 0x55)
7ff120b4 6337 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6338 else if (op1 == 0x57)
6339 switch (op2)
6340 {
7ff120b4
YQ
6341 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6342 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6343 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6344 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6345 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6346 }
6347 else if ((op1 & 0x63) == 0x43)
7ff120b4 6348 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6349 else if ((op2 & 0x1) == 0x0)
6350 switch (op1 & ~0x80)
6351 {
6352 case 0x61:
7ff120b4 6353 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6354 case 0x65:
7ff120b4 6355 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6356 case 0x71: case 0x75:
6357 /* pld/pldw reg. */
7ff120b4 6358 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6359 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6360 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6361 default:
7ff120b4 6362 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6363 }
6364 else
7ff120b4 6365 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6366}
6367
6368static int
7ff120b4
YQ
6369arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6370 struct regcache *regs,
6371 struct displaced_step_closure *dsc)
cca44b1b
JB
6372{
6373 if (bit (insn, 27) == 0)
7ff120b4 6374 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6375 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6376 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6377 {
6378 case 0x0: case 0x2:
7ff120b4 6379 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6380
6381 case 0x1: case 0x3:
7ff120b4 6382 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6383
6384 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6385 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6386
6387 case 0x8:
6388 switch ((insn & 0xe00000) >> 21)
6389 {
6390 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6391 /* stc/stc2. */
7ff120b4 6392 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6393
6394 case 0x2:
7ff120b4 6395 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6396
6397 default:
7ff120b4 6398 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6399 }
6400
6401 case 0x9:
6402 {
6403 int rn_f = (bits (insn, 16, 19) == 0xf);
6404 switch ((insn & 0xe00000) >> 21)
6405 {
6406 case 0x1: case 0x3:
6407 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6408 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6409 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6410
6411 case 0x2:
7ff120b4 6412 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6413
6414 case 0x4: case 0x5: case 0x6: case 0x7:
6415 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6416 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6417 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6418
6419 default:
7ff120b4 6420 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6421 }
6422 }
6423
6424 case 0xa:
7ff120b4 6425 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6426
6427 case 0xb:
6428 if (bits (insn, 16, 19) == 0xf)
6429 /* ldc/ldc2 lit. */
7ff120b4 6430 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6431 else
7ff120b4 6432 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6433
6434 case 0xc:
6435 if (bit (insn, 4))
7ff120b4 6436 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6437 else
7ff120b4 6438 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6439
6440 case 0xd:
6441 if (bit (insn, 4))
7ff120b4 6442 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6443 else
7ff120b4 6444 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6445
6446 default:
7ff120b4 6447 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6448 }
6449}
6450
6451/* Decode miscellaneous instructions in dp/misc encoding space. */
6452
6453static int
7ff120b4
YQ
6454arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6455 struct regcache *regs,
6456 struct displaced_step_closure *dsc)
cca44b1b
JB
6457{
6458 unsigned int op2 = bits (insn, 4, 6);
6459 unsigned int op = bits (insn, 21, 22);
cca44b1b
JB
6460
6461 switch (op2)
6462 {
6463 case 0x0:
7ff120b4 6464 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6465
6466 case 0x1:
6467 if (op == 0x1) /* bx. */
7ff120b4 6468 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6469 else if (op == 0x3)
7ff120b4 6470 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6471 else
7ff120b4 6472 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6473
6474 case 0x2:
6475 if (op == 0x1)
6476 /* Not really supported. */
7ff120b4 6477 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6478 else
7ff120b4 6479 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6480
6481 case 0x3:
6482 if (op == 0x1)
7ff120b4 6483 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6484 regs, dsc); /* blx register. */
cca44b1b 6485 else
7ff120b4 6486 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6487
6488 case 0x5:
7ff120b4 6489 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6490
6491 case 0x7:
6492 if (op == 0x1)
7ff120b4 6493 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6494 else if (op == 0x3)
6495 /* Not really supported. */
7ff120b4 6496 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
6497
6498 default:
7ff120b4 6499 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6500 }
6501}
6502
6503static int
7ff120b4
YQ
6504arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6505 struct regcache *regs,
6506 struct displaced_step_closure *dsc)
cca44b1b
JB
6507{
6508 if (bit (insn, 25))
6509 switch (bits (insn, 20, 24))
6510 {
6511 case 0x10:
7ff120b4 6512 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6513
6514 case 0x14:
7ff120b4 6515 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6516
6517 case 0x12: case 0x16:
7ff120b4 6518 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6519
6520 default:
7ff120b4 6521 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6522 }
6523 else
6524 {
6525 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6526
6527 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6528 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6529 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6530 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6531 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6532 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6533 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6534 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6535 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6536 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6537 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6538 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b 6539 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
550dc4e2 6540 /* 2nd arg means "unprivileged". */
7ff120b4
YQ
6541 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6542 dsc);
cca44b1b
JB
6543 }
6544
6545 /* Should be unreachable. */
6546 return 1;
6547}
6548
6549static int
7ff120b4
YQ
6550arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6551 struct regcache *regs,
6552 struct displaced_step_closure *dsc)
cca44b1b
JB
6553{
6554 int a = bit (insn, 25), b = bit (insn, 4);
6555 uint32_t op1 = bits (insn, 20, 24);
cca44b1b
JB
6556
6557 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6558 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6559 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6560 else if ((!a && (op1 & 0x17) == 0x02)
6561 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6562 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6563 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6564 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6565 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6566 else if ((!a && (op1 & 0x17) == 0x03)
6567 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6568 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6569 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6570 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6571 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6572 else if ((!a && (op1 & 0x17) == 0x06)
6573 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6574 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6575 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6576 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6577 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6578 else if ((!a && (op1 & 0x17) == 0x07)
6579 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6580 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6581
6582 /* Should be unreachable. */
6583 return 1;
6584}
6585
6586static int
7ff120b4
YQ
6587arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
6588 struct displaced_step_closure *dsc)
cca44b1b
JB
6589{
6590 switch (bits (insn, 20, 24))
6591 {
6592 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6593 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6594
6595 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6596 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6597
6598 case 0x08: case 0x09: case 0x0a: case 0x0b:
6599 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6600 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6601 "decode/pack/unpack/saturate/reverse", dsc);
6602
6603 case 0x18:
6604 if (bits (insn, 5, 7) == 0) /* op2. */
6605 {
6606 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6607 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6608 else
7ff120b4 6609 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6610 }
6611 else
7ff120b4 6612 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6613
6614 case 0x1a: case 0x1b:
6615 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6616 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6617 else
7ff120b4 6618 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6619
6620 case 0x1c: case 0x1d:
6621 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6622 {
6623 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6624 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6625 else
7ff120b4 6626 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6627 }
6628 else
7ff120b4 6629 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6630
6631 case 0x1e: case 0x1f:
6632 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6633 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6634 else
7ff120b4 6635 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6636 }
6637
6638 /* Should be unreachable. */
6639 return 1;
6640}
6641
6642static int
615234c1 6643arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7ff120b4
YQ
6644 struct regcache *regs,
6645 struct displaced_step_closure *dsc)
cca44b1b
JB
6646{
6647 if (bit (insn, 25))
7ff120b4 6648 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6649 else
7ff120b4 6650 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6651}
6652
6653static int
7ff120b4
YQ
6654arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6655 struct regcache *regs,
6656 struct displaced_step_closure *dsc)
cca44b1b
JB
6657{
6658 unsigned int opcode = bits (insn, 20, 24);
6659
6660 switch (opcode)
6661 {
6662 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6663 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6664
6665 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6666 case 0x12: case 0x16:
7ff120b4 6667 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6668
6669 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6670 case 0x13: case 0x17:
7ff120b4 6671 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6672
6673 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6674 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6675 /* Note: no writeback for these instructions. Bit 25 will always be
6676 zero though (via caller), so the following works OK. */
7ff120b4 6677 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6678 }
6679
6680 /* Should be unreachable. */
6681 return 1;
6682}
6683
34518530
YQ
6684/* Decode shifted register instructions. */
6685
6686static int
6687thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6688 uint16_t insn2, struct regcache *regs,
6689 struct displaced_step_closure *dsc)
6690{
6691 /* PC is only allowed to be used in instruction MOV. */
6692
6693 unsigned int op = bits (insn1, 5, 8);
6694 unsigned int rn = bits (insn1, 0, 3);
6695
6696 if (op == 0x2 && rn == 0xf) /* MOV */
6697 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6698 else
6699 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6700 "dp (shift reg)", dsc);
6701}
6702
6703
6704/* Decode extension register load/store. Exactly the same as
6705 arm_decode_ext_reg_ld_st. */
6706
6707static int
6708thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6709 uint16_t insn2, struct regcache *regs,
6710 struct displaced_step_closure *dsc)
6711{
6712 unsigned int opcode = bits (insn1, 4, 8);
6713
6714 switch (opcode)
6715 {
6716 case 0x04: case 0x05:
6717 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6718 "vfp/neon vmov", dsc);
6719
6720 case 0x08: case 0x0c: /* 01x00 */
6721 case 0x0a: case 0x0e: /* 01x10 */
6722 case 0x12: case 0x16: /* 10x10 */
6723 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6724 "vfp/neon vstm/vpush", dsc);
6725
6726 case 0x09: case 0x0d: /* 01x01 */
6727 case 0x0b: case 0x0f: /* 01x11 */
6728 case 0x13: case 0x17: /* 10x11 */
6729 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6730 "vfp/neon vldm/vpop", dsc);
6731
6732 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6733 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6734 "vstr", dsc);
6735 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6736 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6737 }
6738
6739 /* Should be unreachable. */
6740 return 1;
6741}
6742
cca44b1b 6743static int
7ff120b4
YQ
6744arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
6745 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6746{
6747 unsigned int op1 = bits (insn, 20, 25);
6748 int op = bit (insn, 4);
6749 unsigned int coproc = bits (insn, 8, 11);
cca44b1b
JB
6750
6751 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6752 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6753 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6754 && (coproc & 0xe) != 0xa)
6755 /* stc/stc2. */
7ff120b4 6756 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6757 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6758 && (coproc & 0xe) != 0xa)
6759 /* ldc/ldc2 imm/lit. */
7ff120b4 6760 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6761 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6762 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6763 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6764 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6765 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6766 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6767 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6768 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6769 else if ((op1 & 0x30) == 0x20 && !op)
6770 {
6771 if ((coproc & 0xe) == 0xa)
7ff120b4 6772 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6773 else
7ff120b4 6774 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6775 }
6776 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6777 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6778 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6779 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6780 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6781 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6782 else if ((op1 & 0x30) == 0x30)
7ff120b4 6783 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6784 else
7ff120b4 6785 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6786}
6787
34518530
YQ
6788static int
6789thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6790 uint16_t insn2, struct regcache *regs,
6791 struct displaced_step_closure *dsc)
6792{
6793 unsigned int coproc = bits (insn2, 8, 11);
34518530
YQ
6794 unsigned int bit_5_8 = bits (insn1, 5, 8);
6795 unsigned int bit_9 = bit (insn1, 9);
6796 unsigned int bit_4 = bit (insn1, 4);
34518530
YQ
6797
6798 if (bit_9 == 0)
6799 {
6800 if (bit_5_8 == 2)
6801 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6802 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6803 dsc);
6804 else if (bit_5_8 == 0) /* UNDEFINED. */
6805 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6806 else
6807 {
6808 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6809 if ((coproc & 0xe) == 0xa)
6810 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6811 dsc);
6812 else /* coproc is not 101x. */
6813 {
6814 if (bit_4 == 0) /* STC/STC2. */
6815 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6816 "stc/stc2", dsc);
6817 else /* LDC/LDC2 {literal, immeidate}. */
6818 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6819 regs, dsc);
6820 }
6821 }
6822 }
6823 else
6824 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6825
6826 return 0;
6827}
6828
6829static void
6830install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
6831 struct displaced_step_closure *dsc, int rd)
6832{
6833 /* ADR Rd, #imm
6834
6835 Rewrite as:
6836
6837 Preparation: Rd <- PC
6838 Insn: ADD Rd, #imm
6839 Cleanup: Null.
6840 */
6841
6842 /* Rd <- PC */
6843 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6844 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6845}
6846
6847static int
6848thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
6849 struct displaced_step_closure *dsc,
6850 int rd, unsigned int imm)
6851{
6852
6853 /* Encoding T2: ADDS Rd, #imm */
6854 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6855
6856 install_pc_relative (gdbarch, regs, dsc, rd);
6857
6858 return 0;
6859}
6860
6861static int
6862thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6863 struct regcache *regs,
6864 struct displaced_step_closure *dsc)
6865{
6866 unsigned int rd = bits (insn, 8, 10);
6867 unsigned int imm8 = bits (insn, 0, 7);
6868
6869 if (debug_displaced)
6870 fprintf_unfiltered (gdb_stdlog,
6871 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6872 rd, imm8, insn);
6873
6874 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6875}
6876
6877static int
6878thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6879 uint16_t insn2, struct regcache *regs,
6880 struct displaced_step_closure *dsc)
6881{
6882 unsigned int rd = bits (insn2, 8, 11);
6883 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6884 extract raw immediate encoding rather than computing immediate. When
6885 generating ADD or SUB instruction, we can simply perform OR operation to
6886 set immediate into ADD. */
6887 unsigned int imm_3_8 = insn2 & 0x70ff;
6888 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6889
6890 if (debug_displaced)
6891 fprintf_unfiltered (gdb_stdlog,
6892 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6893 rd, imm_i, imm_3_8, insn1, insn2);
6894
6895 if (bit (insn1, 7)) /* Encoding T2 */
6896 {
6897 /* Encoding T3: SUB Rd, Rd, #imm */
6898 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6899 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6900 }
6901 else /* Encoding T3 */
6902 {
6903 /* Encoding T3: ADD Rd, Rd, #imm */
6904 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6905 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6906 }
6907 dsc->numinsns = 2;
6908
6909 install_pc_relative (gdbarch, regs, dsc, rd);
6910
6911 return 0;
6912}
6913
6914static int
615234c1 6915thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
6916 struct regcache *regs,
6917 struct displaced_step_closure *dsc)
6918{
6919 unsigned int rt = bits (insn1, 8, 10);
6920 unsigned int pc;
6921 int imm8 = (bits (insn1, 0, 7) << 2);
34518530
YQ
6922
6923 /* LDR Rd, #imm8
6924
6925 Rwrite as:
6926
6927 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6928
6929 Insn: LDR R0, [R2, R3];
6930 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6931
6932 if (debug_displaced)
6933 fprintf_unfiltered (gdb_stdlog,
6934 "displaced: copying thumb ldr r%d [pc #%d]\n"
6935 , rt, imm8);
6936
6937 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6938 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6939 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6940 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6941 /* The assembler calculates the required value of the offset from the
6942 Align(PC,4) value of this instruction to the label. */
6943 pc = pc & 0xfffffffc;
6944
6945 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6946 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6947
6948 dsc->rd = rt;
6949 dsc->u.ldst.xfersize = 4;
6950 dsc->u.ldst.rn = 0;
6951 dsc->u.ldst.immed = 0;
6952 dsc->u.ldst.writeback = 0;
6953 dsc->u.ldst.restore_r4 = 0;
6954
6955 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6956
6957 dsc->cleanup = &cleanup_load;
6958
6959 return 0;
6960}
6961
6962/* Copy Thumb cbnz/cbz insruction. */
6963
6964static int
6965thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6966 struct regcache *regs,
6967 struct displaced_step_closure *dsc)
6968{
6969 int non_zero = bit (insn1, 11);
6970 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6971 CORE_ADDR from = dsc->insn_addr;
6972 int rn = bits (insn1, 0, 2);
6973 int rn_val = displaced_read_reg (regs, dsc, rn);
6974
6975 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6976 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6977 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6978 condition is false, let it be, cleanup_branch will do nothing. */
6979 if (dsc->u.branch.cond)
6980 {
6981 dsc->u.branch.cond = INST_AL;
6982 dsc->u.branch.dest = from + 4 + imm5;
6983 }
6984 else
6985 dsc->u.branch.dest = from + 2;
6986
6987 dsc->u.branch.link = 0;
6988 dsc->u.branch.exchange = 0;
6989
6990 if (debug_displaced)
6991 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
6992 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
6993 rn, rn_val, insn1, dsc->u.branch.dest);
6994
6995 dsc->modinsn[0] = THUMB_NOP;
6996
6997 dsc->cleanup = &cleanup_branch;
6998 return 0;
6999}
7000
7001/* Copy Table Branch Byte/Halfword */
7002static int
7003thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7004 uint16_t insn2, struct regcache *regs,
7005 struct displaced_step_closure *dsc)
7006{
7007 ULONGEST rn_val, rm_val;
7008 int is_tbh = bit (insn2, 4);
7009 CORE_ADDR halfwords = 0;
7010 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7011
7012 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7013 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7014
7015 if (is_tbh)
7016 {
7017 gdb_byte buf[2];
7018
7019 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7020 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7021 }
7022 else
7023 {
7024 gdb_byte buf[1];
7025
7026 target_read_memory (rn_val + rm_val, buf, 1);
7027 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7028 }
7029
7030 if (debug_displaced)
7031 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7032 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7033 (unsigned int) rn_val, (unsigned int) rm_val,
7034 (unsigned int) halfwords);
7035
7036 dsc->u.branch.cond = INST_AL;
7037 dsc->u.branch.link = 0;
7038 dsc->u.branch.exchange = 0;
7039 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7040
7041 dsc->cleanup = &cleanup_branch;
7042
7043 return 0;
7044}
7045
7046static void
7047cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
7048 struct displaced_step_closure *dsc)
7049{
7050 /* PC <- r7 */
7051 int val = displaced_read_reg (regs, dsc, 7);
7052 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7053
7054 /* r7 <- r8 */
7055 val = displaced_read_reg (regs, dsc, 8);
7056 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7057
7058 /* r8 <- tmp[0] */
7059 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7060
7061}
7062
7063static int
615234c1 7064thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
34518530
YQ
7065 struct regcache *regs,
7066 struct displaced_step_closure *dsc)
7067{
7068 dsc->u.block.regmask = insn1 & 0x00ff;
7069
7070 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7071 to :
7072
7073 (1) register list is full, that is, r0-r7 are used.
7074 Prepare: tmp[0] <- r8
7075
7076 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7077 MOV r8, r7; Move value of r7 to r8;
7078 POP {r7}; Store PC value into r7.
7079
7080 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7081
7082 (2) register list is not full, supposing there are N registers in
7083 register list (except PC, 0 <= N <= 7).
7084 Prepare: for each i, 0 - N, tmp[i] <- ri.
7085
7086 POP {r0, r1, ...., rN};
7087
7088 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7089 from tmp[] properly.
7090 */
7091 if (debug_displaced)
7092 fprintf_unfiltered (gdb_stdlog,
7093 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7094 dsc->u.block.regmask, insn1);
7095
7096 if (dsc->u.block.regmask == 0xff)
7097 {
7098 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7099
7100 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7101 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7102 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7103
7104 dsc->numinsns = 3;
7105 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7106 }
7107 else
7108 {
7109 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
bec2ab5a
SM
7110 unsigned int i;
7111 unsigned int new_regmask;
34518530
YQ
7112
7113 for (i = 0; i < num_in_list + 1; i++)
7114 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7115
7116 new_regmask = (1 << (num_in_list + 1)) - 1;
7117
7118 if (debug_displaced)
7119 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7120 "{..., pc}: original reg list %.4x,"
7121 " modified list %.4x\n"),
7122 (int) dsc->u.block.regmask, new_regmask);
7123
7124 dsc->u.block.regmask |= 0x8000;
7125 dsc->u.block.writeback = 0;
7126 dsc->u.block.cond = INST_AL;
7127
7128 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7129
7130 dsc->cleanup = &cleanup_block_load_pc;
7131 }
7132
7133 return 0;
7134}
7135
7136static void
7137thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7138 struct regcache *regs,
7139 struct displaced_step_closure *dsc)
7140{
7141 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7142 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7143 int err = 0;
7144
7145 /* 16-bit thumb instructions. */
7146 switch (op_bit_12_15)
7147 {
7148 /* Shift (imme), add, subtract, move and compare. */
7149 case 0: case 1: case 2: case 3:
7150 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7151 "shift/add/sub/mov/cmp",
7152 dsc);
7153 break;
7154 case 4:
7155 switch (op_bit_10_11)
7156 {
7157 case 0: /* Data-processing */
7158 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7159 "data-processing",
7160 dsc);
7161 break;
7162 case 1: /* Special data instructions and branch and exchange. */
7163 {
7164 unsigned short op = bits (insn1, 7, 9);
7165 if (op == 6 || op == 7) /* BX or BLX */
7166 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7167 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7168 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7169 else
7170 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7171 dsc);
7172 }
7173 break;
7174 default: /* LDR (literal) */
7175 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7176 }
7177 break;
7178 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7179 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7180 break;
7181 case 10:
7182 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7183 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7184 else /* Generate SP-relative address */
7185 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7186 break;
7187 case 11: /* Misc 16-bit instructions */
7188 {
7189 switch (bits (insn1, 8, 11))
7190 {
7191 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7192 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7193 break;
7194 case 12: case 13: /* POP */
7195 if (bit (insn1, 8)) /* PC is in register list. */
7196 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7197 else
7198 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7199 break;
7200 case 15: /* If-Then, and hints */
7201 if (bits (insn1, 0, 3))
7202 /* If-Then makes up to four following instructions conditional.
7203 IT instruction itself is not conditional, so handle it as a
7204 common unmodified instruction. */
7205 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7206 dsc);
7207 else
7208 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7209 break;
7210 default:
7211 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7212 }
7213 }
7214 break;
7215 case 12:
7216 if (op_bit_10_11 < 2) /* Store multiple registers */
7217 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7218 else /* Load multiple registers */
7219 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7220 break;
7221 case 13: /* Conditional branch and supervisor call */
7222 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7223 err = thumb_copy_b (gdbarch, insn1, dsc);
7224 else
7225 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7226 break;
7227 case 14: /* Unconditional branch */
7228 err = thumb_copy_b (gdbarch, insn1, dsc);
7229 break;
7230 default:
7231 err = 1;
7232 }
7233
7234 if (err)
7235 internal_error (__FILE__, __LINE__,
7236 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7237}
7238
7239static int
7240decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7241 uint16_t insn1, uint16_t insn2,
7242 struct regcache *regs,
7243 struct displaced_step_closure *dsc)
7244{
7245 int rt = bits (insn2, 12, 15);
7246 int rn = bits (insn1, 0, 3);
7247 int op1 = bits (insn1, 7, 8);
34518530
YQ
7248
7249 switch (bits (insn1, 5, 6))
7250 {
7251 case 0: /* Load byte and memory hints */
7252 if (rt == 0xf) /* PLD/PLI */
7253 {
7254 if (rn == 0xf)
7255 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7256 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7257 else
7258 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7259 "pli/pld", dsc);
7260 }
7261 else
7262 {
7263 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7264 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7265 1);
7266 else
7267 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7268 "ldrb{reg, immediate}/ldrbt",
7269 dsc);
7270 }
7271
7272 break;
7273 case 1: /* Load halfword and memory hints. */
7274 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7275 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7276 "pld/unalloc memhint", dsc);
7277 else
7278 {
7279 if (rn == 0xf)
7280 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7281 2);
7282 else
7283 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7284 "ldrh/ldrht", dsc);
7285 }
7286 break;
7287 case 2: /* Load word */
7288 {
7289 int insn2_bit_8_11 = bits (insn2, 8, 11);
7290
7291 if (rn == 0xf)
7292 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7293 else if (op1 == 0x1) /* Encoding T3 */
7294 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7295 0, 1);
7296 else /* op1 == 0x0 */
7297 {
7298 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7299 /* LDR (immediate) */
7300 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7301 dsc, bit (insn2, 8), 1);
7302 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7303 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7304 "ldrt", dsc);
7305 else
7306 /* LDR (register) */
7307 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7308 dsc, 0, 0);
7309 }
7310 break;
7311 }
7312 default:
7313 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7314 break;
7315 }
7316 return 0;
7317}
7318
7319static void
7320thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7321 uint16_t insn2, struct regcache *regs,
7322 struct displaced_step_closure *dsc)
7323{
7324 int err = 0;
7325 unsigned short op = bit (insn2, 15);
7326 unsigned int op1 = bits (insn1, 11, 12);
7327
7328 switch (op1)
7329 {
7330 case 1:
7331 {
7332 switch (bits (insn1, 9, 10))
7333 {
7334 case 0:
7335 if (bit (insn1, 6))
7336 {
7337 /* Load/store {dual, execlusive}, table branch. */
7338 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7339 && bits (insn2, 5, 7) == 0)
7340 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7341 dsc);
7342 else
7343 /* PC is not allowed to use in load/store {dual, exclusive}
7344 instructions. */
7345 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7346 "load/store dual/ex", dsc);
7347 }
7348 else /* load/store multiple */
7349 {
7350 switch (bits (insn1, 7, 8))
7351 {
7352 case 0: case 3: /* SRS, RFE */
7353 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7354 "srs/rfe", dsc);
7355 break;
7356 case 1: case 2: /* LDM/STM/PUSH/POP */
7357 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7358 break;
7359 }
7360 }
7361 break;
7362
7363 case 1:
7364 /* Data-processing (shift register). */
7365 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7366 dsc);
7367 break;
7368 default: /* Coprocessor instructions. */
7369 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7370 break;
7371 }
7372 break;
7373 }
7374 case 2: /* op1 = 2 */
7375 if (op) /* Branch and misc control. */
7376 {
7377 if (bit (insn2, 14) /* BLX/BL */
7378 || bit (insn2, 12) /* Unconditional branch */
7379 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7380 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7381 else
7382 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7383 "misc ctrl", dsc);
7384 }
7385 else
7386 {
7387 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7388 {
7389 int op = bits (insn1, 4, 8);
7390 int rn = bits (insn1, 0, 3);
7391 if ((op == 0 || op == 0xa) && rn == 0xf)
7392 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7393 regs, dsc);
7394 else
7395 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7396 "dp/pb", dsc);
7397 }
7398 else /* Data processing (modified immeidate) */
7399 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7400 "dp/mi", dsc);
7401 }
7402 break;
7403 case 3: /* op1 = 3 */
7404 switch (bits (insn1, 9, 10))
7405 {
7406 case 0:
7407 if (bit (insn1, 4))
7408 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7409 regs, dsc);
7410 else /* NEON Load/Store and Store single data item */
7411 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7412 "neon elt/struct load/store",
7413 dsc);
7414 break;
7415 case 1: /* op1 = 3, bits (9, 10) == 1 */
7416 switch (bits (insn1, 7, 8))
7417 {
7418 case 0: case 1: /* Data processing (register) */
7419 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7420 "dp(reg)", dsc);
7421 break;
7422 case 2: /* Multiply and absolute difference */
7423 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7424 "mul/mua/diff", dsc);
7425 break;
7426 case 3: /* Long multiply and divide */
7427 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7428 "lmul/lmua", dsc);
7429 break;
7430 }
7431 break;
7432 default: /* Coprocessor instructions */
7433 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7434 break;
7435 }
7436 break;
7437 default:
7438 err = 1;
7439 }
7440
7441 if (err)
7442 internal_error (__FILE__, __LINE__,
7443 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7444
7445}
7446
b434a28f
YQ
7447static void
7448thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7449 CORE_ADDR to, struct regcache *regs,
7450 struct displaced_step_closure *dsc)
7451{
34518530
YQ
7452 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7453 uint16_t insn1
7454 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7455
7456 if (debug_displaced)
7457 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7458 "at %.8lx\n", insn1, (unsigned long) from);
7459
7460 dsc->is_thumb = 1;
7461 dsc->insn_size = thumb_insn_size (insn1);
7462 if (thumb_insn_size (insn1) == 4)
7463 {
7464 uint16_t insn2
7465 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7466 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7467 }
7468 else
7469 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7470}
7471
cca44b1b 7472void
b434a28f
YQ
7473arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7474 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
7475 struct displaced_step_closure *dsc)
7476{
7477 int err = 0;
b434a28f
YQ
7478 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7479 uint32_t insn;
cca44b1b
JB
7480
7481 /* Most displaced instructions use a 1-instruction scratch space, so set this
7482 here and override below if/when necessary. */
7483 dsc->numinsns = 1;
7484 dsc->insn_addr = from;
7485 dsc->scratch_base = to;
7486 dsc->cleanup = NULL;
7487 dsc->wrote_to_pc = 0;
7488
b434a28f
YQ
7489 if (!displaced_in_arm_mode (regs))
7490 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
7491
4db71c0b
YQ
7492 dsc->is_thumb = 0;
7493 dsc->insn_size = 4;
b434a28f
YQ
7494 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7495 if (debug_displaced)
7496 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7497 "at %.8lx\n", (unsigned long) insn,
7498 (unsigned long) from);
7499
cca44b1b 7500 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7501 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7502 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7503 {
7504 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7505 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7506 break;
7507
7508 case 0x4: case 0x5: case 0x6:
7ff120b4 7509 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7510 break;
7511
7512 case 0x7:
7ff120b4 7513 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7514 break;
7515
7516 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7517 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7518 break;
7519
7520 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 7521 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
7522 break;
7523 }
7524
7525 if (err)
7526 internal_error (__FILE__, __LINE__,
7527 _("arm_process_displaced_insn: Instruction decode error"));
7528}
7529
7530/* Actually set up the scratch space for a displaced instruction. */
7531
7532void
7533arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
7534 CORE_ADDR to, struct displaced_step_closure *dsc)
7535{
7536 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7537 unsigned int i, len, offset;
cca44b1b 7538 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7539 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7540 const gdb_byte *bkp_insn;
cca44b1b 7541
4db71c0b 7542 offset = 0;
cca44b1b
JB
7543 /* Poke modified instruction(s). */
7544 for (i = 0; i < dsc->numinsns; i++)
7545 {
7546 if (debug_displaced)
4db71c0b
YQ
7547 {
7548 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7549 if (size == 4)
7550 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7551 dsc->modinsn[i]);
7552 else if (size == 2)
7553 fprintf_unfiltered (gdb_stdlog, "%.4x",
7554 (unsigned short)dsc->modinsn[i]);
7555
7556 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7557 (unsigned long) to + offset);
7558
7559 }
7560 write_memory_unsigned_integer (to + offset, size,
7561 byte_order_for_code,
cca44b1b 7562 dsc->modinsn[i]);
4db71c0b
YQ
7563 offset += size;
7564 }
7565
7566 /* Choose the correct breakpoint instruction. */
7567 if (dsc->is_thumb)
7568 {
7569 bkp_insn = tdep->thumb_breakpoint;
7570 len = tdep->thumb_breakpoint_size;
7571 }
7572 else
7573 {
7574 bkp_insn = tdep->arm_breakpoint;
7575 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7576 }
7577
7578 /* Put breakpoint afterwards. */
4db71c0b 7579 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7580
7581 if (debug_displaced)
7582 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7583 paddress (gdbarch, from), paddress (gdbarch, to));
7584}
7585
cca44b1b
JB
7586/* Entry point for cleaning things up after a displaced instruction has been
7587 single-stepped. */
7588
7589void
7590arm_displaced_step_fixup (struct gdbarch *gdbarch,
7591 struct displaced_step_closure *dsc,
7592 CORE_ADDR from, CORE_ADDR to,
7593 struct regcache *regs)
7594{
7595 if (dsc->cleanup)
7596 dsc->cleanup (gdbarch, regs, dsc);
7597
7598 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7599 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7600 dsc->insn_addr + dsc->insn_size);
7601
cca44b1b
JB
7602}
7603
7604#include "bfd-in2.h"
7605#include "libcoff.h"
7606
7607static int
7608gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7609{
9a3c8263 7610 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
9779414d
DJ
7611
7612 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7613 {
7614 static asymbol *asym;
7615 static combined_entry_type ce;
7616 static struct coff_symbol_struct csym;
7617 static struct bfd fake_bfd;
7618 static bfd_target fake_target;
7619
7620 if (csym.native == NULL)
7621 {
7622 /* Create a fake symbol vector containing a Thumb symbol.
7623 This is solely so that the code in print_insn_little_arm()
7624 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7625 the presence of a Thumb symbol and switch to decoding
7626 Thumb instructions. */
7627
7628 fake_target.flavour = bfd_target_coff_flavour;
7629 fake_bfd.xvec = &fake_target;
7630 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7631 csym.native = &ce;
7632 csym.symbol.the_bfd = &fake_bfd;
7633 csym.symbol.name = "fake";
7634 asym = (asymbol *) & csym;
7635 }
7636
7637 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7638 info->symbols = &asym;
7639 }
7640 else
7641 info->symbols = NULL;
7642
7643 if (info->endian == BFD_ENDIAN_BIG)
7644 return print_insn_big_arm (memaddr, info);
7645 else
7646 return print_insn_little_arm (memaddr, info);
7647}
7648
7649/* The following define instruction sequences that will cause ARM
7650 cpu's to take an undefined instruction trap. These are used to
7651 signal a breakpoint to GDB.
7652
7653 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7654 modes. A different instruction is required for each mode. The ARM
7655 cpu's can also be big or little endian. Thus four different
7656 instructions are needed to support all cases.
7657
7658 Note: ARMv4 defines several new instructions that will take the
7659 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7660 not in fact add the new instructions. The new undefined
7661 instructions in ARMv4 are all instructions that had no defined
7662 behaviour in earlier chips. There is no guarantee that they will
7663 raise an exception, but may be treated as NOP's. In practice, it
7664 may only safe to rely on instructions matching:
7665
7666 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7667 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
7668 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
7669
0963b4bd 7670 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7671 following use a condition predicate of ALWAYS so it is always TRUE.
7672
7673 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7674 and NetBSD all use a software interrupt rather than an undefined
7675 instruction to force a trap. This can be handled by by the
7676 abi-specific code during establishment of the gdbarch vector. */
7677
7678#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7679#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7680#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7681#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7682
948f8e3d
PA
7683static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7684static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7685static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7686static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b
JB
7687
7688/* Determine the type and size of breakpoint to insert at PCPTR. Uses
7689 the program counter value to determine whether a 16-bit or 32-bit
7690 breakpoint should be used. It returns a pointer to a string of
7691 bytes that encode a breakpoint instruction, stores the length of
7692 the string to *lenptr, and adjusts the program counter (if
7693 necessary) to point to the actual memory location where the
7694 breakpoint should be inserted. */
7695
7696static const unsigned char *
7697arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
7698{
7699 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7700 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7701
9779414d 7702 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7703 {
7704 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7705
7706 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7707 check whether we are replacing a 32-bit instruction. */
7708 if (tdep->thumb2_breakpoint != NULL)
7709 {
7710 gdb_byte buf[2];
7711 if (target_read_memory (*pcptr, buf, 2) == 0)
7712 {
7713 unsigned short inst1;
7714 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7715 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
7716 {
7717 *lenptr = tdep->thumb2_breakpoint_size;
7718 return tdep->thumb2_breakpoint;
7719 }
7720 }
7721 }
7722
cca44b1b
JB
7723 *lenptr = tdep->thumb_breakpoint_size;
7724 return tdep->thumb_breakpoint;
7725 }
7726 else
7727 {
7728 *lenptr = tdep->arm_breakpoint_size;
7729 return tdep->arm_breakpoint;
7730 }
7731}
7732
177321bd
DJ
7733static void
7734arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
7735 int *kindptr)
7736{
177321bd
DJ
7737 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
7738
9779414d 7739 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
7740 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
7741 that this is not confused with a 32-bit ARM breakpoint. */
7742 *kindptr = 3;
7743}
7744
cca44b1b
JB
7745/* Extract from an array REGBUF containing the (raw) register state a
7746 function return value of type TYPE, and copy that, in virtual
7747 format, into VALBUF. */
7748
7749static void
7750arm_extract_return_value (struct type *type, struct regcache *regs,
7751 gdb_byte *valbuf)
7752{
7753 struct gdbarch *gdbarch = get_regcache_arch (regs);
7754 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7755
7756 if (TYPE_CODE_FLT == TYPE_CODE (type))
7757 {
7758 switch (gdbarch_tdep (gdbarch)->fp_model)
7759 {
7760 case ARM_FLOAT_FPA:
7761 {
7762 /* The value is in register F0 in internal format. We need to
7763 extract the raw value and then convert it to the desired
7764 internal type. */
7765 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7766
7767 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
7768 convert_from_extended (floatformat_from_type (type), tmpbuf,
7769 valbuf, gdbarch_byte_order (gdbarch));
7770 }
7771 break;
7772
7773 case ARM_FLOAT_SOFT_FPA:
7774 case ARM_FLOAT_SOFT_VFP:
7775 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7776 not using the VFP ABI code. */
7777 case ARM_FLOAT_VFP:
7778 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
7779 if (TYPE_LENGTH (type) > 4)
7780 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
7781 valbuf + INT_REGISTER_SIZE);
7782 break;
7783
7784 default:
0963b4bd
MS
7785 internal_error (__FILE__, __LINE__,
7786 _("arm_extract_return_value: "
7787 "Floating point model not supported"));
cca44b1b
JB
7788 break;
7789 }
7790 }
7791 else if (TYPE_CODE (type) == TYPE_CODE_INT
7792 || TYPE_CODE (type) == TYPE_CODE_CHAR
7793 || TYPE_CODE (type) == TYPE_CODE_BOOL
7794 || TYPE_CODE (type) == TYPE_CODE_PTR
7795 || TYPE_CODE (type) == TYPE_CODE_REF
7796 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7797 {
b021a221
MS
7798 /* If the type is a plain integer, then the access is
7799 straight-forward. Otherwise we have to play around a bit
7800 more. */
cca44b1b
JB
7801 int len = TYPE_LENGTH (type);
7802 int regno = ARM_A1_REGNUM;
7803 ULONGEST tmp;
7804
7805 while (len > 0)
7806 {
7807 /* By using store_unsigned_integer we avoid having to do
7808 anything special for small big-endian values. */
7809 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7810 store_unsigned_integer (valbuf,
7811 (len > INT_REGISTER_SIZE
7812 ? INT_REGISTER_SIZE : len),
7813 byte_order, tmp);
7814 len -= INT_REGISTER_SIZE;
7815 valbuf += INT_REGISTER_SIZE;
7816 }
7817 }
7818 else
7819 {
7820 /* For a structure or union the behaviour is as if the value had
7821 been stored to word-aligned memory and then loaded into
7822 registers with 32-bit load instruction(s). */
7823 int len = TYPE_LENGTH (type);
7824 int regno = ARM_A1_REGNUM;
7825 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7826
7827 while (len > 0)
7828 {
7829 regcache_cooked_read (regs, regno++, tmpbuf);
7830 memcpy (valbuf, tmpbuf,
7831 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7832 len -= INT_REGISTER_SIZE;
7833 valbuf += INT_REGISTER_SIZE;
7834 }
7835 }
7836}
7837
7838
7839/* Will a function return an aggregate type in memory or in a
7840 register? Return 0 if an aggregate type can be returned in a
7841 register, 1 if it must be returned in memory. */
7842
7843static int
7844arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7845{
cca44b1b
JB
7846 enum type_code code;
7847
f168693b 7848 type = check_typedef (type);
cca44b1b 7849
b13c8ab2
YQ
7850 /* Simple, non-aggregate types (ie not including vectors and
7851 complex) are always returned in a register (or registers). */
7852 code = TYPE_CODE (type);
7853 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7854 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7855 return 0;
cca44b1b 7856
c4312b19
YQ
7857 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7858 {
7859 /* Vector values should be returned using ARM registers if they
7860 are not over 16 bytes. */
7861 return (TYPE_LENGTH (type) > 16);
7862 }
7863
b13c8ab2 7864 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7865 {
b13c8ab2
YQ
7866 /* The AAPCS says all aggregates not larger than a word are returned
7867 in a register. */
7868 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
7869 return 0;
7870
cca44b1b
JB
7871 return 1;
7872 }
b13c8ab2
YQ
7873 else
7874 {
7875 int nRc;
cca44b1b 7876
b13c8ab2
YQ
7877 /* All aggregate types that won't fit in a register must be returned
7878 in memory. */
7879 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
7880 return 1;
cca44b1b 7881
b13c8ab2
YQ
7882 /* In the ARM ABI, "integer" like aggregate types are returned in
7883 registers. For an aggregate type to be integer like, its size
7884 must be less than or equal to INT_REGISTER_SIZE and the
7885 offset of each addressable subfield must be zero. Note that bit
7886 fields are not addressable, and all addressable subfields of
7887 unions always start at offset zero.
cca44b1b 7888
b13c8ab2
YQ
7889 This function is based on the behaviour of GCC 2.95.1.
7890 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7891
b13c8ab2
YQ
7892 Note: All versions of GCC before GCC 2.95.2 do not set up the
7893 parameters correctly for a function returning the following
7894 structure: struct { float f;}; This should be returned in memory,
7895 not a register. Richard Earnshaw sent me a patch, but I do not
7896 know of any way to detect if a function like the above has been
7897 compiled with the correct calling convention. */
7898
7899 /* Assume all other aggregate types can be returned in a register.
7900 Run a check for structures, unions and arrays. */
7901 nRc = 0;
67255d04 7902
b13c8ab2
YQ
7903 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7904 {
7905 int i;
7906 /* Need to check if this struct/union is "integer" like. For
7907 this to be true, its size must be less than or equal to
7908 INT_REGISTER_SIZE and the offset of each addressable
7909 subfield must be zero. Note that bit fields are not
7910 addressable, and unions always start at offset zero. If any
7911 of the subfields is a floating point type, the struct/union
7912 cannot be an integer type. */
7913
7914 /* For each field in the object, check:
7915 1) Is it FP? --> yes, nRc = 1;
7916 2) Is it addressable (bitpos != 0) and
7917 not packed (bitsize == 0)?
7918 --> yes, nRc = 1
7919 */
7920
7921 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7922 {
b13c8ab2
YQ
7923 enum type_code field_type_code;
7924
7925 field_type_code
7926 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7927 i)));
7928
7929 /* Is it a floating point type field? */
7930 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7931 {
7932 nRc = 1;
7933 break;
7934 }
b13c8ab2
YQ
7935
7936 /* If bitpos != 0, then we have to care about it. */
7937 if (TYPE_FIELD_BITPOS (type, i) != 0)
7938 {
7939 /* Bitfields are not addressable. If the field bitsize is
7940 zero, then the field is not packed. Hence it cannot be
7941 a bitfield or any other packed type. */
7942 if (TYPE_FIELD_BITSIZE (type, i) == 0)
7943 {
7944 nRc = 1;
7945 break;
7946 }
7947 }
67255d04
RE
7948 }
7949 }
67255d04 7950
b13c8ab2
YQ
7951 return nRc;
7952 }
67255d04
RE
7953}
7954
34e8f22d
RE
7955/* Write into appropriate registers a function return value of type
7956 TYPE, given in virtual format. */
7957
7958static void
b508a996 7959arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 7960 const gdb_byte *valbuf)
34e8f22d 7961{
be8626e0 7962 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 7963 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 7964
34e8f22d
RE
7965 if (TYPE_CODE (type) == TYPE_CODE_FLT)
7966 {
e362b510 7967 gdb_byte buf[MAX_REGISTER_SIZE];
34e8f22d 7968
be8626e0 7969 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
7970 {
7971 case ARM_FLOAT_FPA:
7972
be8626e0
MD
7973 convert_to_extended (floatformat_from_type (type), buf, valbuf,
7974 gdbarch_byte_order (gdbarch));
b508a996 7975 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
7976 break;
7977
fd50bc42 7978 case ARM_FLOAT_SOFT_FPA:
08216dd7 7979 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
7980 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7981 not using the VFP ABI code. */
7982 case ARM_FLOAT_VFP:
b508a996
RE
7983 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
7984 if (TYPE_LENGTH (type) > 4)
7985 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 7986 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
7987 break;
7988
7989 default:
9b20d036
MS
7990 internal_error (__FILE__, __LINE__,
7991 _("arm_store_return_value: Floating "
7992 "point model not supported"));
08216dd7
RE
7993 break;
7994 }
34e8f22d 7995 }
b508a996
RE
7996 else if (TYPE_CODE (type) == TYPE_CODE_INT
7997 || TYPE_CODE (type) == TYPE_CODE_CHAR
7998 || TYPE_CODE (type) == TYPE_CODE_BOOL
7999 || TYPE_CODE (type) == TYPE_CODE_PTR
8000 || TYPE_CODE (type) == TYPE_CODE_REF
8001 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8002 {
8003 if (TYPE_LENGTH (type) <= 4)
8004 {
8005 /* Values of one word or less are zero/sign-extended and
8006 returned in r0. */
7a5ea0d4 8007 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8008 LONGEST val = unpack_long (type, valbuf);
8009
e17a4113 8010 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
8011 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8012 }
8013 else
8014 {
8015 /* Integral values greater than one word are stored in consecutive
8016 registers starting with r0. This will always be a multiple of
8017 the regiser size. */
8018 int len = TYPE_LENGTH (type);
8019 int regno = ARM_A1_REGNUM;
8020
8021 while (len > 0)
8022 {
8023 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
8024 len -= INT_REGISTER_SIZE;
8025 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8026 }
8027 }
8028 }
34e8f22d 8029 else
b508a996
RE
8030 {
8031 /* For a structure or union the behaviour is as if the value had
8032 been stored to word-aligned memory and then loaded into
8033 registers with 32-bit load instruction(s). */
8034 int len = TYPE_LENGTH (type);
8035 int regno = ARM_A1_REGNUM;
7a5ea0d4 8036 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8037
8038 while (len > 0)
8039 {
8040 memcpy (tmpbuf, valbuf,
7a5ea0d4 8041 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 8042 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
8043 len -= INT_REGISTER_SIZE;
8044 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8045 }
8046 }
34e8f22d
RE
8047}
8048
2af48f68
PB
8049
8050/* Handle function return values. */
8051
8052static enum return_value_convention
6a3a010b 8053arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8054 struct type *valtype, struct regcache *regcache,
8055 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8056{
7c00367c 8057 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8058 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8059 enum arm_vfp_cprc_base_type vfp_base_type;
8060 int vfp_base_count;
8061
8062 if (arm_vfp_abi_for_function (gdbarch, func_type)
8063 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8064 {
8065 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8066 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8067 int i;
8068 for (i = 0; i < vfp_base_count; i++)
8069 {
58d6951d
DJ
8070 if (reg_char == 'q')
8071 {
8072 if (writebuf)
8073 arm_neon_quad_write (gdbarch, regcache, i,
8074 writebuf + i * unit_length);
8075
8076 if (readbuf)
8077 arm_neon_quad_read (gdbarch, regcache, i,
8078 readbuf + i * unit_length);
8079 }
8080 else
8081 {
8082 char name_buf[4];
8083 int regnum;
8084
8c042590 8085 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8086 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8087 strlen (name_buf));
8088 if (writebuf)
8089 regcache_cooked_write (regcache, regnum,
8090 writebuf + i * unit_length);
8091 if (readbuf)
8092 regcache_cooked_read (regcache, regnum,
8093 readbuf + i * unit_length);
8094 }
90445bd3
DJ
8095 }
8096 return RETURN_VALUE_REGISTER_CONVENTION;
8097 }
7c00367c 8098
2af48f68
PB
8099 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8100 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8101 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8102 {
7c00367c
MK
8103 if (tdep->struct_return == pcc_struct_return
8104 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8105 return RETURN_VALUE_STRUCT_CONVENTION;
8106 }
b13c8ab2
YQ
8107 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8108 {
8109 if (arm_return_in_memory (gdbarch, valtype))
8110 return RETURN_VALUE_STRUCT_CONVENTION;
8111 }
7052e42c 8112
2af48f68
PB
8113 if (writebuf)
8114 arm_store_return_value (valtype, regcache, writebuf);
8115
8116 if (readbuf)
8117 arm_extract_return_value (valtype, regcache, readbuf);
8118
8119 return RETURN_VALUE_REGISTER_CONVENTION;
8120}
8121
8122
9df628e0 8123static int
60ade65d 8124arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8125{
e17a4113
UW
8126 struct gdbarch *gdbarch = get_frame_arch (frame);
8127 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8128 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8129 CORE_ADDR jb_addr;
e362b510 8130 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 8131
60ade65d 8132 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8133
8134 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 8135 INT_REGISTER_SIZE))
9df628e0
RE
8136 return 0;
8137
e17a4113 8138 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8139 return 1;
8140}
8141
faa95490
DJ
8142/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8143 return the target PC. Otherwise return 0. */
c906108c
SS
8144
8145CORE_ADDR
52f729a7 8146arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8147{
2c02bd72 8148 const char *name;
faa95490 8149 int namelen;
c906108c
SS
8150 CORE_ADDR start_addr;
8151
8152 /* Find the starting address and name of the function containing the PC. */
8153 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8154 {
8155 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8156 check here. */
8157 start_addr = arm_skip_bx_reg (frame, pc);
8158 if (start_addr != 0)
8159 return start_addr;
8160
8161 return 0;
8162 }
c906108c 8163
faa95490
DJ
8164 /* If PC is in a Thumb call or return stub, return the address of the
8165 target PC, which is in a register. The thunk functions are called
8166 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8167 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8168 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8169 if (startswith (name, "_call_via_")
8170 || startswith (name, "__ARM_call_via_"))
c906108c 8171 {
ed9a39eb
JM
8172 /* Use the name suffix to determine which register contains the
8173 target PC. */
c5aa993b
JM
8174 static char *table[15] =
8175 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8176 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8177 };
c906108c 8178 int regno;
faa95490 8179 int offset = strlen (name) - 2;
c906108c
SS
8180
8181 for (regno = 0; regno <= 14; regno++)
faa95490 8182 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8183 return get_frame_register_unsigned (frame, regno);
c906108c 8184 }
ed9a39eb 8185
faa95490
DJ
8186 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8187 non-interworking calls to foo. We could decode the stubs
8188 to find the target but it's easier to use the symbol table. */
8189 namelen = strlen (name);
8190 if (name[0] == '_' && name[1] == '_'
8191 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8192 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8193 || (namelen > 2 + strlen ("_from_arm")
61012eef 8194 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8195 {
8196 char *target_name;
8197 int target_len = namelen - 2;
3b7344d5 8198 struct bound_minimal_symbol minsym;
faa95490
DJ
8199 struct objfile *objfile;
8200 struct obj_section *sec;
8201
8202 if (name[namelen - 1] == 'b')
8203 target_len -= strlen ("_from_thumb");
8204 else
8205 target_len -= strlen ("_from_arm");
8206
224c3ddb 8207 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8208 memcpy (target_name, name + 2, target_len);
8209 target_name[target_len] = '\0';
8210
8211 sec = find_pc_section (pc);
8212 objfile = (sec == NULL) ? NULL : sec->objfile;
8213 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8214 if (minsym.minsym != NULL)
77e371c0 8215 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8216 else
8217 return 0;
8218 }
8219
c5aa993b 8220 return 0; /* not a stub */
c906108c
SS
8221}
8222
afd7eef0
RE
8223static void
8224set_arm_command (char *args, int from_tty)
8225{
edefbb7c
AC
8226 printf_unfiltered (_("\
8227\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8228 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8229}
8230
8231static void
8232show_arm_command (char *args, int from_tty)
8233{
26304000 8234 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8235}
8236
28e97307
DJ
8237static void
8238arm_update_current_architecture (void)
fd50bc42 8239{
28e97307 8240 struct gdbarch_info info;
fd50bc42 8241
28e97307 8242 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8243 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8244 return;
fd50bc42 8245
28e97307
DJ
8246 /* Update the architecture. */
8247 gdbarch_info_init (&info);
fd50bc42 8248
28e97307 8249 if (!gdbarch_update_p (info))
9b20d036 8250 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8251}
8252
8253static void
8254set_fp_model_sfunc (char *args, int from_tty,
8255 struct cmd_list_element *c)
8256{
570dc176 8257 int fp_model;
fd50bc42
RE
8258
8259 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8260 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8261 {
aead7601 8262 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8263 break;
8264 }
8265
8266 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8267 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8268 current_fp_model);
8269
28e97307 8270 arm_update_current_architecture ();
fd50bc42
RE
8271}
8272
8273static void
08546159
AC
8274show_fp_model (struct ui_file *file, int from_tty,
8275 struct cmd_list_element *c, const char *value)
fd50bc42 8276{
f5656ead 8277 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8278
28e97307 8279 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8280 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8281 fprintf_filtered (file, _("\
8282The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8283 fp_model_strings[tdep->fp_model]);
8284 else
8285 fprintf_filtered (file, _("\
8286The current ARM floating point model is \"%s\".\n"),
8287 fp_model_strings[arm_fp_model]);
8288}
8289
8290static void
8291arm_set_abi (char *args, int from_tty,
8292 struct cmd_list_element *c)
8293{
570dc176 8294 int arm_abi;
28e97307
DJ
8295
8296 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8297 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8298 {
aead7601 8299 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8300 break;
8301 }
8302
8303 if (arm_abi == ARM_ABI_LAST)
8304 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8305 arm_abi_string);
8306
8307 arm_update_current_architecture ();
8308}
8309
8310static void
8311arm_show_abi (struct ui_file *file, int from_tty,
8312 struct cmd_list_element *c, const char *value)
8313{
f5656ead 8314 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8315
8316 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8317 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8318 fprintf_filtered (file, _("\
8319The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8320 arm_abi_strings[tdep->arm_abi]);
8321 else
8322 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8323 arm_abi_string);
fd50bc42
RE
8324}
8325
0428b8f5
DJ
8326static void
8327arm_show_fallback_mode (struct ui_file *file, int from_tty,
8328 struct cmd_list_element *c, const char *value)
8329{
0963b4bd
MS
8330 fprintf_filtered (file,
8331 _("The current execution mode assumed "
8332 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8333 arm_fallback_mode_string);
8334}
8335
8336static void
8337arm_show_force_mode (struct ui_file *file, int from_tty,
8338 struct cmd_list_element *c, const char *value)
8339{
0963b4bd
MS
8340 fprintf_filtered (file,
8341 _("The current execution mode assumed "
8342 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8343 arm_force_mode_string);
8344}
8345
afd7eef0
RE
8346/* If the user changes the register disassembly style used for info
8347 register and other commands, we have to also switch the style used
8348 in opcodes for disassembly output. This function is run in the "set
8349 arm disassembly" command, and does that. */
bc90b915
FN
8350
8351static void
afd7eef0 8352set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
8353 struct cmd_list_element *c)
8354{
afd7eef0 8355 set_disassembly_style ();
bc90b915
FN
8356}
8357\f
966fbf70 8358/* Return the ARM register name corresponding to register I. */
a208b0cb 8359static const char *
d93859e2 8360arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8361{
58d6951d
DJ
8362 const int num_regs = gdbarch_num_regs (gdbarch);
8363
8364 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8365 && i >= num_regs && i < num_regs + 32)
8366 {
8367 static const char *const vfp_pseudo_names[] = {
8368 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8369 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8370 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8371 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8372 };
8373
8374 return vfp_pseudo_names[i - num_regs];
8375 }
8376
8377 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8378 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8379 {
8380 static const char *const neon_pseudo_names[] = {
8381 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8382 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8383 };
8384
8385 return neon_pseudo_names[i - num_regs - 32];
8386 }
8387
ff6f572f
DJ
8388 if (i >= ARRAY_SIZE (arm_register_names))
8389 /* These registers are only supported on targets which supply
8390 an XML description. */
8391 return "";
8392
966fbf70
RE
8393 return arm_register_names[i];
8394}
8395
bc90b915 8396static void
afd7eef0 8397set_disassembly_style (void)
bc90b915 8398{
123dc839 8399 int current;
bc90b915 8400
123dc839
DJ
8401 /* Find the style that the user wants. */
8402 for (current = 0; current < num_disassembly_options; current++)
8403 if (disassembly_style == valid_disassembly_styles[current])
8404 break;
8405 gdb_assert (current < num_disassembly_options);
bc90b915 8406
94c30b78 8407 /* Synchronize the disassembler. */
bc90b915
FN
8408 set_arm_regname_option (current);
8409}
8410
082fc60d
RE
8411/* Test whether the coff symbol specific value corresponds to a Thumb
8412 function. */
8413
8414static int
8415coff_sym_is_thumb (int val)
8416{
f8bf5763
PM
8417 return (val == C_THUMBEXT
8418 || val == C_THUMBSTAT
8419 || val == C_THUMBEXTFUNC
8420 || val == C_THUMBSTATFUNC
8421 || val == C_THUMBLABEL);
082fc60d
RE
8422}
8423
8424/* arm_coff_make_msymbol_special()
8425 arm_elf_make_msymbol_special()
8426
8427 These functions test whether the COFF or ELF symbol corresponds to
8428 an address in thumb code, and set a "special" bit in a minimal
8429 symbol to indicate that it does. */
8430
34e8f22d 8431static void
082fc60d
RE
8432arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8433{
467d42c4
UW
8434 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
8435 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8436 MSYMBOL_SET_SPECIAL (msym);
8437}
8438
34e8f22d 8439static void
082fc60d
RE
8440arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8441{
8442 if (coff_sym_is_thumb (val))
8443 MSYMBOL_SET_SPECIAL (msym);
8444}
8445
60c5725c 8446static void
c1bd65d0 8447arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 8448{
9a3c8263 8449 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
8450 unsigned int i;
8451
8452 for (i = 0; i < objfile->obfd->section_count; i++)
8453 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8454}
8455
8456static void
8457arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8458 asymbol *sym)
8459{
8460 const char *name = bfd_asymbol_name (sym);
8461 struct arm_per_objfile *data;
8462 VEC(arm_mapping_symbol_s) **map_p;
8463 struct arm_mapping_symbol new_map_sym;
8464
8465 gdb_assert (name[0] == '$');
8466 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8467 return;
8468
9a3c8263
SM
8469 data = (struct arm_per_objfile *) objfile_data (objfile,
8470 arm_objfile_data_key);
60c5725c
DJ
8471 if (data == NULL)
8472 {
8473 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8474 struct arm_per_objfile);
8475 set_objfile_data (objfile, arm_objfile_data_key, data);
8476 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8477 objfile->obfd->section_count,
8478 VEC(arm_mapping_symbol_s) *);
8479 }
8480 map_p = &data->section_maps[bfd_get_section (sym)->index];
8481
8482 new_map_sym.value = sym->value;
8483 new_map_sym.type = name[1];
8484
8485 /* Assume that most mapping symbols appear in order of increasing
8486 value. If they were randomly distributed, it would be faster to
8487 always push here and then sort at first use. */
8488 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8489 {
8490 struct arm_mapping_symbol *prev_map_sym;
8491
8492 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8493 if (prev_map_sym->value >= sym->value)
8494 {
8495 unsigned int idx;
8496 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8497 arm_compare_mapping_symbols);
8498 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8499 return;
8500 }
8501 }
8502
8503 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8504}
8505
756fe439 8506static void
61a1198a 8507arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8508{
9779414d 8509 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 8510 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8511
8512 /* If necessary, set the T bit. */
8513 if (arm_apcs_32)
8514 {
9779414d 8515 ULONGEST val, t_bit;
61a1198a 8516 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8517 t_bit = arm_psr_thumb_bit (gdbarch);
8518 if (arm_pc_is_thumb (gdbarch, pc))
8519 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8520 val | t_bit);
756fe439 8521 else
61a1198a 8522 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8523 val & ~t_bit);
756fe439
DJ
8524 }
8525}
123dc839 8526
58d6951d
DJ
8527/* Read the contents of a NEON quad register, by reading from two
8528 double registers. This is used to implement the quad pseudo
8529 registers, and for argument passing in case the quad registers are
8530 missing; vectors are passed in quad registers when using the VFP
8531 ABI, even if a NEON unit is not present. REGNUM is the index of
8532 the quad register, in [0, 15]. */
8533
05d1431c 8534static enum register_status
58d6951d
DJ
8535arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
8536 int regnum, gdb_byte *buf)
8537{
8538 char name_buf[4];
8539 gdb_byte reg_buf[8];
8540 int offset, double_regnum;
05d1431c 8541 enum register_status status;
58d6951d 8542
8c042590 8543 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8544 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8545 strlen (name_buf));
8546
8547 /* d0 is always the least significant half of q0. */
8548 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8549 offset = 8;
8550 else
8551 offset = 0;
8552
05d1431c
PA
8553 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8554 if (status != REG_VALID)
8555 return status;
58d6951d
DJ
8556 memcpy (buf + offset, reg_buf, 8);
8557
8558 offset = 8 - offset;
05d1431c
PA
8559 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
8560 if (status != REG_VALID)
8561 return status;
58d6951d 8562 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8563
8564 return REG_VALID;
58d6951d
DJ
8565}
8566
05d1431c 8567static enum register_status
58d6951d
DJ
8568arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
8569 int regnum, gdb_byte *buf)
8570{
8571 const int num_regs = gdbarch_num_regs (gdbarch);
8572 char name_buf[4];
8573 gdb_byte reg_buf[8];
8574 int offset, double_regnum;
8575
8576 gdb_assert (regnum >= num_regs);
8577 regnum -= num_regs;
8578
8579 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8580 /* Quad-precision register. */
05d1431c 8581 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8582 else
8583 {
05d1431c
PA
8584 enum register_status status;
8585
58d6951d
DJ
8586 /* Single-precision register. */
8587 gdb_assert (regnum < 32);
8588
8589 /* s0 is always the least significant half of d0. */
8590 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8591 offset = (regnum & 1) ? 0 : 4;
8592 else
8593 offset = (regnum & 1) ? 4 : 0;
8594
8c042590 8595 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8596 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8597 strlen (name_buf));
8598
05d1431c
PA
8599 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8600 if (status == REG_VALID)
8601 memcpy (buf, reg_buf + offset, 4);
8602 return status;
58d6951d
DJ
8603 }
8604}
8605
8606/* Store the contents of BUF to a NEON quad register, by writing to
8607 two double registers. This is used to implement the quad pseudo
8608 registers, and for argument passing in case the quad registers are
8609 missing; vectors are passed in quad registers when using the VFP
8610 ABI, even if a NEON unit is not present. REGNUM is the index
8611 of the quad register, in [0, 15]. */
8612
8613static void
8614arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8615 int regnum, const gdb_byte *buf)
8616{
8617 char name_buf[4];
58d6951d
DJ
8618 int offset, double_regnum;
8619
8c042590 8620 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8621 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8622 strlen (name_buf));
8623
8624 /* d0 is always the least significant half of q0. */
8625 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8626 offset = 8;
8627 else
8628 offset = 0;
8629
8630 regcache_raw_write (regcache, double_regnum, buf + offset);
8631 offset = 8 - offset;
8632 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
8633}
8634
8635static void
8636arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8637 int regnum, const gdb_byte *buf)
8638{
8639 const int num_regs = gdbarch_num_regs (gdbarch);
8640 char name_buf[4];
8641 gdb_byte reg_buf[8];
8642 int offset, double_regnum;
8643
8644 gdb_assert (regnum >= num_regs);
8645 regnum -= num_regs;
8646
8647 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8648 /* Quad-precision register. */
8649 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8650 else
8651 {
8652 /* Single-precision register. */
8653 gdb_assert (regnum < 32);
8654
8655 /* s0 is always the least significant half of d0. */
8656 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8657 offset = (regnum & 1) ? 0 : 4;
8658 else
8659 offset = (regnum & 1) ? 4 : 0;
8660
8c042590 8661 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8662 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8663 strlen (name_buf));
8664
8665 regcache_raw_read (regcache, double_regnum, reg_buf);
8666 memcpy (reg_buf + offset, buf, 4);
8667 regcache_raw_write (regcache, double_regnum, reg_buf);
8668 }
8669}
8670
123dc839
DJ
8671static struct value *
8672value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8673{
9a3c8263 8674 const int *reg_p = (const int *) baton;
123dc839
DJ
8675 return value_of_register (*reg_p, frame);
8676}
97e03143 8677\f
70f80edf
JT
8678static enum gdb_osabi
8679arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8680{
2af48f68 8681 unsigned int elfosabi;
70f80edf 8682 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8683
70f80edf 8684 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8685
28e97307
DJ
8686 if (elfosabi == ELFOSABI_ARM)
8687 /* GNU tools use this value. Check note sections in this case,
8688 as well. */
8689 bfd_map_over_sections (abfd,
8690 generic_elf_osabi_sniff_abi_tag_sections,
8691 &osabi);
97e03143 8692
28e97307 8693 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8694 return osabi;
97e03143
RE
8695}
8696
54483882
YQ
8697static int
8698arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8699 struct reggroup *group)
8700{
2c291032
YQ
8701 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8702 this, FPS register belongs to save_regroup, restore_reggroup, and
8703 all_reggroup, of course. */
54483882 8704 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8705 return (group == float_reggroup
8706 || group == save_reggroup
8707 || group == restore_reggroup
8708 || group == all_reggroup);
54483882
YQ
8709 else
8710 return default_register_reggroup_p (gdbarch, regnum, group);
8711}
8712
25f8c692
JL
8713\f
8714/* For backward-compatibility we allow two 'g' packet lengths with
8715 the remote protocol depending on whether FPA registers are
8716 supplied. M-profile targets do not have FPA registers, but some
8717 stubs already exist in the wild which use a 'g' packet which
8718 supplies them albeit with dummy values. The packet format which
8719 includes FPA registers should be considered deprecated for
8720 M-profile targets. */
8721
8722static void
8723arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8724{
8725 if (gdbarch_tdep (gdbarch)->is_m)
8726 {
8727 /* If we know from the executable this is an M-profile target,
8728 cater for remote targets whose register set layout is the
8729 same as the FPA layout. */
8730 register_remote_g_packet_guess (gdbarch,
03145bf4 8731 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
8732 (16 * INT_REGISTER_SIZE)
8733 + (8 * FP_REGISTER_SIZE)
8734 + (2 * INT_REGISTER_SIZE),
8735 tdesc_arm_with_m_fpa_layout);
8736
8737 /* The regular M-profile layout. */
8738 register_remote_g_packet_guess (gdbarch,
8739 /* r0-r12,sp,lr,pc; xpsr */
8740 (16 * INT_REGISTER_SIZE)
8741 + INT_REGISTER_SIZE,
8742 tdesc_arm_with_m);
3184d3f9
JL
8743
8744 /* M-profile plus M4F VFP. */
8745 register_remote_g_packet_guess (gdbarch,
8746 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8747 (16 * INT_REGISTER_SIZE)
8748 + (16 * VFP_REGISTER_SIZE)
8749 + (2 * INT_REGISTER_SIZE),
8750 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8751 }
8752
8753 /* Otherwise we don't have a useful guess. */
8754}
8755
70f80edf 8756\f
da3c6d4a
MS
8757/* Initialize the current architecture based on INFO. If possible,
8758 re-use an architecture from ARCHES, which is a list of
8759 architectures already created during this debugging session.
97e03143 8760
da3c6d4a
MS
8761 Called e.g. at program startup, when reading a core file, and when
8762 reading a binary file. */
97e03143 8763
39bbf761
RE
8764static struct gdbarch *
8765arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8766{
97e03143 8767 struct gdbarch_tdep *tdep;
39bbf761 8768 struct gdbarch *gdbarch;
28e97307
DJ
8769 struct gdbarch_list *best_arch;
8770 enum arm_abi_kind arm_abi = arm_abi_global;
8771 enum arm_float_model fp_model = arm_fp_model;
123dc839 8772 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8773 int i, is_m = 0;
330c6ca9 8774 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8775 int have_wmmx_registers = 0;
58d6951d 8776 int have_neon = 0;
ff6f572f 8777 int have_fpa_registers = 1;
9779414d
DJ
8778 const struct target_desc *tdesc = info.target_desc;
8779
8780 /* If we have an object to base this architecture on, try to determine
8781 its ABI. */
8782
8783 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8784 {
8785 int ei_osabi, e_flags;
8786
8787 switch (bfd_get_flavour (info.abfd))
8788 {
8789 case bfd_target_aout_flavour:
8790 /* Assume it's an old APCS-style ABI. */
8791 arm_abi = ARM_ABI_APCS;
8792 break;
8793
8794 case bfd_target_coff_flavour:
8795 /* Assume it's an old APCS-style ABI. */
8796 /* XXX WinCE? */
8797 arm_abi = ARM_ABI_APCS;
8798 break;
8799
8800 case bfd_target_elf_flavour:
8801 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8802 e_flags = elf_elfheader (info.abfd)->e_flags;
8803
8804 if (ei_osabi == ELFOSABI_ARM)
8805 {
8806 /* GNU tools used to use this value, but do not for EABI
8807 objects. There's nowhere to tag an EABI version
8808 anyway, so assume APCS. */
8809 arm_abi = ARM_ABI_APCS;
8810 }
d403db27 8811 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8812 {
8813 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8814 int attr_arch, attr_profile;
8815
8816 switch (eabi_ver)
8817 {
8818 case EF_ARM_EABI_UNKNOWN:
8819 /* Assume GNU tools. */
8820 arm_abi = ARM_ABI_APCS;
8821 break;
8822
8823 case EF_ARM_EABI_VER4:
8824 case EF_ARM_EABI_VER5:
8825 arm_abi = ARM_ABI_AAPCS;
8826 /* EABI binaries default to VFP float ordering.
8827 They may also contain build attributes that can
8828 be used to identify if the VFP argument-passing
8829 ABI is in use. */
8830 if (fp_model == ARM_FLOAT_AUTO)
8831 {
8832#ifdef HAVE_ELF
8833 switch (bfd_elf_get_obj_attr_int (info.abfd,
8834 OBJ_ATTR_PROC,
8835 Tag_ABI_VFP_args))
8836 {
b35b0298 8837 case AEABI_VFP_args_base:
9779414d
DJ
8838 /* "The user intended FP parameter/result
8839 passing to conform to AAPCS, base
8840 variant". */
8841 fp_model = ARM_FLOAT_SOFT_VFP;
8842 break;
b35b0298 8843 case AEABI_VFP_args_vfp:
9779414d
DJ
8844 /* "The user intended FP parameter/result
8845 passing to conform to AAPCS, VFP
8846 variant". */
8847 fp_model = ARM_FLOAT_VFP;
8848 break;
b35b0298 8849 case AEABI_VFP_args_toolchain:
9779414d
DJ
8850 /* "The user intended FP parameter/result
8851 passing to conform to tool chain-specific
8852 conventions" - we don't know any such
8853 conventions, so leave it as "auto". */
8854 break;
b35b0298 8855 case AEABI_VFP_args_compatible:
5c294fee
TG
8856 /* "Code is compatible with both the base
8857 and VFP variants; the user did not permit
8858 non-variadic functions to pass FP
8859 parameters/results" - leave it as
8860 "auto". */
8861 break;
9779414d
DJ
8862 default:
8863 /* Attribute value not mentioned in the
5c294fee 8864 November 2012 ABI, so leave it as
9779414d
DJ
8865 "auto". */
8866 break;
8867 }
8868#else
8869 fp_model = ARM_FLOAT_SOFT_VFP;
8870#endif
8871 }
8872 break;
8873
8874 default:
8875 /* Leave it as "auto". */
8876 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8877 break;
8878 }
8879
8880#ifdef HAVE_ELF
8881 /* Detect M-profile programs. This only works if the
8882 executable file includes build attributes; GCC does
8883 copy them to the executable, but e.g. RealView does
8884 not. */
8885 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8886 Tag_CPU_arch);
0963b4bd
MS
8887 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
8888 OBJ_ATTR_PROC,
9779414d
DJ
8889 Tag_CPU_arch_profile);
8890 /* GCC specifies the profile for v6-M; RealView only
8891 specifies the profile for architectures starting with
8892 V7 (as opposed to architectures with a tag
8893 numerically greater than TAG_CPU_ARCH_V7). */
8894 if (!tdesc_has_registers (tdesc)
8895 && (attr_arch == TAG_CPU_ARCH_V6_M
8896 || attr_arch == TAG_CPU_ARCH_V6S_M
8897 || attr_profile == 'M'))
25f8c692 8898 is_m = 1;
9779414d
DJ
8899#endif
8900 }
8901
8902 if (fp_model == ARM_FLOAT_AUTO)
8903 {
8904 int e_flags = elf_elfheader (info.abfd)->e_flags;
8905
8906 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8907 {
8908 case 0:
8909 /* Leave it as "auto". Strictly speaking this case
8910 means FPA, but almost nobody uses that now, and
8911 many toolchains fail to set the appropriate bits
8912 for the floating-point model they use. */
8913 break;
8914 case EF_ARM_SOFT_FLOAT:
8915 fp_model = ARM_FLOAT_SOFT_FPA;
8916 break;
8917 case EF_ARM_VFP_FLOAT:
8918 fp_model = ARM_FLOAT_VFP;
8919 break;
8920 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
8921 fp_model = ARM_FLOAT_SOFT_VFP;
8922 break;
8923 }
8924 }
8925
8926 if (e_flags & EF_ARM_BE8)
8927 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
8928
8929 break;
8930
8931 default:
8932 /* Leave it as "auto". */
8933 break;
8934 }
8935 }
123dc839
DJ
8936
8937 /* Check any target description for validity. */
9779414d 8938 if (tdesc_has_registers (tdesc))
123dc839
DJ
8939 {
8940 /* For most registers we require GDB's default names; but also allow
8941 the numeric names for sp / lr / pc, as a convenience. */
8942 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
8943 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
8944 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
8945
8946 const struct tdesc_feature *feature;
58d6951d 8947 int valid_p;
123dc839 8948
9779414d 8949 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8950 "org.gnu.gdb.arm.core");
8951 if (feature == NULL)
9779414d
DJ
8952 {
8953 feature = tdesc_find_feature (tdesc,
8954 "org.gnu.gdb.arm.m-profile");
8955 if (feature == NULL)
8956 return NULL;
8957 else
8958 is_m = 1;
8959 }
123dc839
DJ
8960
8961 tdesc_data = tdesc_data_alloc ();
8962
8963 valid_p = 1;
8964 for (i = 0; i < ARM_SP_REGNUM; i++)
8965 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
8966 arm_register_names[i]);
8967 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8968 ARM_SP_REGNUM,
8969 arm_sp_names);
8970 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8971 ARM_LR_REGNUM,
8972 arm_lr_names);
8973 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
8974 ARM_PC_REGNUM,
8975 arm_pc_names);
9779414d
DJ
8976 if (is_m)
8977 valid_p &= tdesc_numbered_register (feature, tdesc_data,
8978 ARM_PS_REGNUM, "xpsr");
8979 else
8980 valid_p &= tdesc_numbered_register (feature, tdesc_data,
8981 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
8982
8983 if (!valid_p)
8984 {
8985 tdesc_data_cleanup (tdesc_data);
8986 return NULL;
8987 }
8988
9779414d 8989 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8990 "org.gnu.gdb.arm.fpa");
8991 if (feature != NULL)
8992 {
8993 valid_p = 1;
8994 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
8995 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
8996 arm_register_names[i]);
8997 if (!valid_p)
8998 {
8999 tdesc_data_cleanup (tdesc_data);
9000 return NULL;
9001 }
9002 }
ff6f572f
DJ
9003 else
9004 have_fpa_registers = 0;
9005
9779414d 9006 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9007 "org.gnu.gdb.xscale.iwmmxt");
9008 if (feature != NULL)
9009 {
9010 static const char *const iwmmxt_names[] = {
9011 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9012 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9013 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9014 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9015 };
9016
9017 valid_p = 1;
9018 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9019 valid_p
9020 &= tdesc_numbered_register (feature, tdesc_data, i,
9021 iwmmxt_names[i - ARM_WR0_REGNUM]);
9022
9023 /* Check for the control registers, but do not fail if they
9024 are missing. */
9025 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9026 tdesc_numbered_register (feature, tdesc_data, i,
9027 iwmmxt_names[i - ARM_WR0_REGNUM]);
9028
9029 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9030 valid_p
9031 &= tdesc_numbered_register (feature, tdesc_data, i,
9032 iwmmxt_names[i - ARM_WR0_REGNUM]);
9033
9034 if (!valid_p)
9035 {
9036 tdesc_data_cleanup (tdesc_data);
9037 return NULL;
9038 }
a56cc1ce
YQ
9039
9040 have_wmmx_registers = 1;
ff6f572f 9041 }
58d6951d
DJ
9042
9043 /* If we have a VFP unit, check whether the single precision registers
9044 are present. If not, then we will synthesize them as pseudo
9045 registers. */
9779414d 9046 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9047 "org.gnu.gdb.arm.vfp");
9048 if (feature != NULL)
9049 {
9050 static const char *const vfp_double_names[] = {
9051 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9052 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9053 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9054 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9055 };
9056
9057 /* Require the double precision registers. There must be either
9058 16 or 32. */
9059 valid_p = 1;
9060 for (i = 0; i < 32; i++)
9061 {
9062 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9063 ARM_D0_REGNUM + i,
9064 vfp_double_names[i]);
9065 if (!valid_p)
9066 break;
9067 }
2b9e5ea6
UW
9068 if (!valid_p && i == 16)
9069 valid_p = 1;
58d6951d 9070
2b9e5ea6
UW
9071 /* Also require FPSCR. */
9072 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9073 ARM_FPSCR_REGNUM, "fpscr");
9074 if (!valid_p)
58d6951d
DJ
9075 {
9076 tdesc_data_cleanup (tdesc_data);
9077 return NULL;
9078 }
9079
9080 if (tdesc_unnumbered_register (feature, "s0") == 0)
9081 have_vfp_pseudos = 1;
9082
330c6ca9 9083 vfp_register_count = i;
58d6951d
DJ
9084
9085 /* If we have VFP, also check for NEON. The architecture allows
9086 NEON without VFP (integer vector operations only), but GDB
9087 does not support that. */
9779414d 9088 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9089 "org.gnu.gdb.arm.neon");
9090 if (feature != NULL)
9091 {
9092 /* NEON requires 32 double-precision registers. */
9093 if (i != 32)
9094 {
9095 tdesc_data_cleanup (tdesc_data);
9096 return NULL;
9097 }
9098
9099 /* If there are quad registers defined by the stub, use
9100 their type; otherwise (normally) provide them with
9101 the default type. */
9102 if (tdesc_unnumbered_register (feature, "q0") == 0)
9103 have_neon_pseudos = 1;
9104
9105 have_neon = 1;
9106 }
9107 }
123dc839 9108 }
39bbf761 9109
28e97307
DJ
9110 /* If there is already a candidate, use it. */
9111 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9112 best_arch != NULL;
9113 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9114 {
b8926edc
DJ
9115 if (arm_abi != ARM_ABI_AUTO
9116 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9117 continue;
9118
b8926edc
DJ
9119 if (fp_model != ARM_FLOAT_AUTO
9120 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9121 continue;
9122
58d6951d
DJ
9123 /* There are various other properties in tdep that we do not
9124 need to check here: those derived from a target description,
9125 since gdbarches with a different target description are
9126 automatically disqualified. */
9127
9779414d
DJ
9128 /* Do check is_m, though, since it might come from the binary. */
9129 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9130 continue;
9131
28e97307
DJ
9132 /* Found a match. */
9133 break;
9134 }
97e03143 9135
28e97307 9136 if (best_arch != NULL)
123dc839
DJ
9137 {
9138 if (tdesc_data != NULL)
9139 tdesc_data_cleanup (tdesc_data);
9140 return best_arch->gdbarch;
9141 }
28e97307 9142
8d749320 9143 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9144 gdbarch = gdbarch_alloc (&info, tdep);
9145
28e97307
DJ
9146 /* Record additional information about the architecture we are defining.
9147 These are gdbarch discriminators, like the OSABI. */
9148 tdep->arm_abi = arm_abi;
9149 tdep->fp_model = fp_model;
9779414d 9150 tdep->is_m = is_m;
ff6f572f 9151 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9152 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9153 gdb_assert (vfp_register_count == 0
9154 || vfp_register_count == 16
9155 || vfp_register_count == 32);
9156 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9157 tdep->have_vfp_pseudos = have_vfp_pseudos;
9158 tdep->have_neon_pseudos = have_neon_pseudos;
9159 tdep->have_neon = have_neon;
08216dd7 9160
25f8c692
JL
9161 arm_register_g_packet_guesses (gdbarch);
9162
08216dd7 9163 /* Breakpoints. */
9d4fde75 9164 switch (info.byte_order_for_code)
67255d04
RE
9165 {
9166 case BFD_ENDIAN_BIG:
66e810cd
RE
9167 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9168 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9169 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9170 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9171
67255d04
RE
9172 break;
9173
9174 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9175 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9176 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9177 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9178 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9179
67255d04
RE
9180 break;
9181
9182 default:
9183 internal_error (__FILE__, __LINE__,
edefbb7c 9184 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9185 }
9186
d7b486e7
RE
9187 /* On ARM targets char defaults to unsigned. */
9188 set_gdbarch_char_signed (gdbarch, 0);
9189
cca44b1b
JB
9190 /* Note: for displaced stepping, this includes the breakpoint, and one word
9191 of additional scratch space. This setting isn't used for anything beside
9192 displaced stepping at present. */
9193 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9194
9df628e0 9195 /* This should be low enough for everything. */
97e03143 9196 tdep->lowest_pc = 0x20;
94c30b78 9197 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9198
7c00367c
MK
9199 /* The default, for both APCS and AAPCS, is to return small
9200 structures in registers. */
9201 tdep->struct_return = reg_struct_return;
9202
2dd604e7 9203 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9204 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9205
756fe439
DJ
9206 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9207
148754e5 9208 /* Frame handling. */
a262aec2 9209 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
9210 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
9211 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
9212
eb5492fa 9213 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9214
34e8f22d 9215 /* Address manipulation. */
34e8f22d
RE
9216 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9217
34e8f22d
RE
9218 /* Advance PC across function entry code. */
9219 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9220
c9cf6e20
MG
9221 /* Detect whether PC is at a point where the stack has been destroyed. */
9222 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9223
190dce09
UW
9224 /* Skip trampolines. */
9225 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9226
34e8f22d
RE
9227 /* The stack grows downward. */
9228 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9229
9230 /* Breakpoint manipulation. */
9231 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
9232 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
9233 arm_remote_breakpoint_from_pc);
34e8f22d
RE
9234
9235 /* Information about registers, etc. */
34e8f22d
RE
9236 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9237 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9238 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9239 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9240 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9241
ff6f572f
DJ
9242 /* This "info float" is FPA-specific. Use the generic version if we
9243 do not have FPA. */
9244 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9245 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9246
26216b98 9247 /* Internal <-> external register number maps. */
ff6f572f 9248 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9249 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9250
34e8f22d
RE
9251 set_gdbarch_register_name (gdbarch, arm_register_name);
9252
9253 /* Returning results. */
2af48f68 9254 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9255
03d48a7d
RE
9256 /* Disassembly. */
9257 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9258
34e8f22d
RE
9259 /* Minsymbol frobbing. */
9260 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9261 set_gdbarch_coff_make_msymbol_special (gdbarch,
9262 arm_coff_make_msymbol_special);
60c5725c 9263 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9264
f9d67f43
DJ
9265 /* Thumb-2 IT block support. */
9266 set_gdbarch_adjust_breakpoint_address (gdbarch,
9267 arm_adjust_breakpoint_address);
9268
0d5de010
DJ
9269 /* Virtual tables. */
9270 set_gdbarch_vbit_in_delta (gdbarch, 1);
9271
97e03143 9272 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9273 gdbarch_init_osabi (info, gdbarch);
97e03143 9274
b39cc962
DJ
9275 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9276
eb5492fa 9277 /* Add some default predicates. */
2ae28aa9
YQ
9278 if (is_m)
9279 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9280 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9281 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9282 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 9283 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9284
97e03143
RE
9285 /* Now we have tuned the configuration, set a few final things,
9286 based on what the OS ABI has told us. */
9287
b8926edc
DJ
9288 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9289 binaries are always marked. */
9290 if (tdep->arm_abi == ARM_ABI_AUTO)
9291 tdep->arm_abi = ARM_ABI_APCS;
9292
e3039479
UW
9293 /* Watchpoints are not steppable. */
9294 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9295
b8926edc
DJ
9296 /* We used to default to FPA for generic ARM, but almost nobody
9297 uses that now, and we now provide a way for the user to force
9298 the model. So default to the most useful variant. */
9299 if (tdep->fp_model == ARM_FLOAT_AUTO)
9300 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9301
9df628e0
RE
9302 if (tdep->jb_pc >= 0)
9303 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9304
08216dd7 9305 /* Floating point sizes and format. */
8da61cc4 9306 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9307 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9308 {
8da61cc4
DJ
9309 set_gdbarch_double_format
9310 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9311 set_gdbarch_long_double_format
9312 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9313 }
9314 else
9315 {
9316 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9317 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9318 }
9319
58d6951d
DJ
9320 if (have_vfp_pseudos)
9321 {
9322 /* NOTE: These are the only pseudo registers used by
9323 the ARM target at the moment. If more are added, a
9324 little more care in numbering will be needed. */
9325
9326 int num_pseudos = 32;
9327 if (have_neon_pseudos)
9328 num_pseudos += 16;
9329 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9330 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9331 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9332 }
9333
123dc839 9334 if (tdesc_data)
58d6951d
DJ
9335 {
9336 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9337
9779414d 9338 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9339
9340 /* Override tdesc_register_type to adjust the types of VFP
9341 registers for NEON. */
9342 set_gdbarch_register_type (gdbarch, arm_register_type);
9343 }
123dc839
DJ
9344
9345 /* Add standard register aliases. We add aliases even for those
9346 nanes which are used by the current architecture - it's simpler,
9347 and does no harm, since nothing ever lists user registers. */
9348 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9349 user_reg_add (gdbarch, arm_register_aliases[i].name,
9350 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9351
39bbf761
RE
9352 return gdbarch;
9353}
9354
97e03143 9355static void
2af46ca0 9356arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9357{
2af46ca0 9358 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9359
9360 if (tdep == NULL)
9361 return;
9362
edefbb7c 9363 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9364 (unsigned long) tdep->lowest_pc);
9365}
9366
a78f21af
AC
9367extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
9368
c906108c 9369void
ed9a39eb 9370_initialize_arm_tdep (void)
c906108c 9371{
bc90b915
FN
9372 struct ui_file *stb;
9373 long length;
53904c9e
AC
9374 const char *setname;
9375 const char *setdesc;
4bd7b427 9376 const char *const *regnames;
bec2ab5a 9377 int i;
bc90b915 9378 static char *helptext;
edefbb7c
AC
9379 char regdesc[1024], *rdptr = regdesc;
9380 size_t rest = sizeof (regdesc);
085dd6e6 9381
42cf1509 9382 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9383
60c5725c 9384 arm_objfile_data_key
c1bd65d0 9385 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 9386
0e9e9abd
UW
9387 /* Add ourselves to objfile event chain. */
9388 observer_attach_new_objfile (arm_exidx_new_objfile);
9389 arm_exidx_data_key
9390 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9391
70f80edf
JT
9392 /* Register an ELF OS ABI sniffer for ARM binaries. */
9393 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9394 bfd_target_elf_flavour,
9395 arm_elf_osabi_sniffer);
9396
9779414d
DJ
9397 /* Initialize the standard target descriptions. */
9398 initialize_tdesc_arm_with_m ();
25f8c692 9399 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9400 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9401 initialize_tdesc_arm_with_iwmmxt ();
9402 initialize_tdesc_arm_with_vfpv2 ();
9403 initialize_tdesc_arm_with_vfpv3 ();
9404 initialize_tdesc_arm_with_neon ();
9779414d 9405
94c30b78 9406 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
9407 num_disassembly_options = get_arm_regname_num_options ();
9408
9409 /* Add root prefix command for all "set arm"/"show arm" commands. */
9410 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9411 _("Various ARM-specific commands."),
afd7eef0
RE
9412 &setarmcmdlist, "set arm ", 0, &setlist);
9413
9414 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9415 _("Various ARM-specific commands."),
afd7eef0 9416 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9417
94c30b78 9418 /* Sync the opcode insn printer with our register viewer. */
bc90b915 9419 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 9420
eefe576e
AC
9421 /* Initialize the array that will be passed to
9422 add_setshow_enum_cmd(). */
8d749320
SM
9423 valid_disassembly_styles = XNEWVEC (const char *,
9424 num_disassembly_options + 1);
afd7eef0 9425 for (i = 0; i < num_disassembly_options; i++)
bc90b915 9426 {
bec2ab5a 9427 get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 9428 valid_disassembly_styles[i] = setname;
edefbb7c
AC
9429 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
9430 rdptr += length;
9431 rest -= length;
123dc839
DJ
9432 /* When we find the default names, tell the disassembler to use
9433 them. */
bc90b915
FN
9434 if (!strcmp (setname, "std"))
9435 {
afd7eef0 9436 disassembly_style = setname;
bc90b915
FN
9437 set_arm_regname_option (i);
9438 }
9439 }
94c30b78 9440 /* Mark the end of valid options. */
afd7eef0 9441 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 9442
edefbb7c
AC
9443 /* Create the help text. */
9444 stb = mem_fileopen ();
9445 fprintf_unfiltered (stb, "%s%s%s",
9446 _("The valid values are:\n"),
9447 regdesc,
9448 _("The default is \"std\"."));
759ef836 9449 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 9450 ui_file_delete (stb);
ed9a39eb 9451
edefbb7c
AC
9452 add_setshow_enum_cmd("disassembler", no_class,
9453 valid_disassembly_styles, &disassembly_style,
9454 _("Set the disassembly style."),
9455 _("Show the disassembly style."),
9456 helptext,
2c5b56ce 9457 set_disassembly_style_sfunc,
0963b4bd
MS
9458 NULL, /* FIXME: i18n: The disassembly style is
9459 \"%s\". */
7376b4c2 9460 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9461
9462 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9463 _("Set usage of ARM 32-bit mode."),
9464 _("Show usage of ARM 32-bit mode."),
9465 _("When off, a 26-bit PC will be used."),
2c5b56ce 9466 NULL,
0963b4bd
MS
9467 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9468 mode is %s. */
26304000 9469 &setarmcmdlist, &showarmcmdlist);
c906108c 9470
fd50bc42 9471 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9472 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9473 _("Set the floating point type."),
9474 _("Show the floating point type."),
9475 _("auto - Determine the FP typefrom the OS-ABI.\n\
9476softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9477fpa - FPA co-processor (GCC compiled).\n\
9478softvfp - Software FP with pure-endian doubles.\n\
9479vfp - VFP co-processor."),
edefbb7c 9480 set_fp_model_sfunc, show_fp_model,
7376b4c2 9481 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9482
28e97307
DJ
9483 /* Add a command to allow the user to force the ABI. */
9484 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9485 _("Set the ABI."),
9486 _("Show the ABI."),
9487 NULL, arm_set_abi, arm_show_abi,
9488 &setarmcmdlist, &showarmcmdlist);
9489
0428b8f5
DJ
9490 /* Add two commands to allow the user to force the assumed
9491 execution mode. */
9492 add_setshow_enum_cmd ("fallback-mode", class_support,
9493 arm_mode_strings, &arm_fallback_mode_string,
9494 _("Set the mode assumed when symbols are unavailable."),
9495 _("Show the mode assumed when symbols are unavailable."),
9496 NULL, NULL, arm_show_fallback_mode,
9497 &setarmcmdlist, &showarmcmdlist);
9498 add_setshow_enum_cmd ("force-mode", class_support,
9499 arm_mode_strings, &arm_force_mode_string,
9500 _("Set the mode assumed even when symbols are available."),
9501 _("Show the mode assumed even when symbols are available."),
9502 NULL, NULL, arm_show_force_mode,
9503 &setarmcmdlist, &showarmcmdlist);
9504
6529d2dd 9505 /* Debugging flag. */
edefbb7c
AC
9506 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9507 _("Set ARM debugging."),
9508 _("Show ARM debugging."),
9509 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9510 NULL,
7915a72c 9511 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9512 &setdebuglist, &showdebuglist);
c906108c 9513}
72508ac0
PO
9514
9515/* ARM-reversible process record data structures. */
9516
9517#define ARM_INSN_SIZE_BYTES 4
9518#define THUMB_INSN_SIZE_BYTES 2
9519#define THUMB2_INSN_SIZE_BYTES 4
9520
9521
71e396f9
LM
9522/* Position of the bit within a 32-bit ARM instruction
9523 that defines whether the instruction is a load or store. */
72508ac0
PO
9524#define INSN_S_L_BIT_NUM 20
9525
9526#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9527 do \
9528 { \
9529 unsigned int reg_len = LENGTH; \
9530 if (reg_len) \
9531 { \
9532 REGS = XNEWVEC (uint32_t, reg_len); \
9533 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9534 } \
9535 } \
9536 while (0)
9537
9538#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9539 do \
9540 { \
9541 unsigned int mem_len = LENGTH; \
9542 if (mem_len) \
9543 { \
9544 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9545 memcpy(&MEMS->len, &RECORD_BUF[0], \
9546 sizeof(struct arm_mem_r) * LENGTH); \
9547 } \
9548 } \
9549 while (0)
9550
9551/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9552#define INSN_RECORDED(ARM_RECORD) \
9553 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9554
9555/* ARM memory record structure. */
9556struct arm_mem_r
9557{
9558 uint32_t len; /* Record length. */
bfbbec00 9559 uint32_t addr; /* Memory address. */
72508ac0
PO
9560};
9561
9562/* ARM instruction record contains opcode of current insn
9563 and execution state (before entry to decode_insn()),
9564 contains list of to-be-modified registers and
9565 memory blocks (on return from decode_insn()). */
9566
9567typedef struct insn_decode_record_t
9568{
9569 struct gdbarch *gdbarch;
9570 struct regcache *regcache;
9571 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9572 uint32_t arm_insn; /* Should accommodate thumb. */
9573 uint32_t cond; /* Condition code. */
9574 uint32_t opcode; /* Insn opcode. */
9575 uint32_t decode; /* Insn decode bits. */
9576 uint32_t mem_rec_count; /* No of mem records. */
9577 uint32_t reg_rec_count; /* No of reg records. */
9578 uint32_t *arm_regs; /* Registers to be saved for this record. */
9579 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9580} insn_decode_record;
9581
9582
9583/* Checks ARM SBZ and SBO mandatory fields. */
9584
9585static int
9586sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9587{
9588 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9589
9590 if (!len)
9591 return 1;
9592
9593 if (!sbo)
9594 ones = ~ones;
9595
9596 while (ones)
9597 {
9598 if (!(ones & sbo))
9599 {
9600 return 0;
9601 }
9602 ones = ones >> 1;
9603 }
9604 return 1;
9605}
9606
c6ec2b30
OJ
9607enum arm_record_result
9608{
9609 ARM_RECORD_SUCCESS = 0,
9610 ARM_RECORD_FAILURE = 1
9611};
9612
72508ac0
PO
9613typedef enum
9614{
9615 ARM_RECORD_STRH=1,
9616 ARM_RECORD_STRD
9617} arm_record_strx_t;
9618
9619typedef enum
9620{
9621 ARM_RECORD=1,
9622 THUMB_RECORD,
9623 THUMB2_RECORD
9624} record_type_t;
9625
9626
9627static int
9628arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9629 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9630{
9631
9632 struct regcache *reg_cache = arm_insn_r->regcache;
9633 ULONGEST u_regval[2]= {0};
9634
9635 uint32_t reg_src1 = 0, reg_src2 = 0;
9636 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
72508ac0
PO
9637
9638 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9639 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
72508ac0
PO
9640
9641 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9642 {
9643 /* 1) Handle misc store, immediate offset. */
9644 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9645 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9646 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9647 regcache_raw_read_unsigned (reg_cache, reg_src1,
9648 &u_regval[0]);
9649 if (ARM_PC_REGNUM == reg_src1)
9650 {
9651 /* If R15 was used as Rn, hence current PC+8. */
9652 u_regval[0] = u_regval[0] + 8;
9653 }
9654 offset_8 = (immed_high << 4) | immed_low;
9655 /* Calculate target store address. */
9656 if (14 == arm_insn_r->opcode)
9657 {
9658 tgt_mem_addr = u_regval[0] + offset_8;
9659 }
9660 else
9661 {
9662 tgt_mem_addr = u_regval[0] - offset_8;
9663 }
9664 if (ARM_RECORD_STRH == str_type)
9665 {
9666 record_buf_mem[0] = 2;
9667 record_buf_mem[1] = tgt_mem_addr;
9668 arm_insn_r->mem_rec_count = 1;
9669 }
9670 else if (ARM_RECORD_STRD == str_type)
9671 {
9672 record_buf_mem[0] = 4;
9673 record_buf_mem[1] = tgt_mem_addr;
9674 record_buf_mem[2] = 4;
9675 record_buf_mem[3] = tgt_mem_addr + 4;
9676 arm_insn_r->mem_rec_count = 2;
9677 }
9678 }
9679 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9680 {
9681 /* 2) Store, register offset. */
9682 /* Get Rm. */
9683 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9684 /* Get Rn. */
9685 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9686 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9687 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9688 if (15 == reg_src2)
9689 {
9690 /* If R15 was used as Rn, hence current PC+8. */
9691 u_regval[0] = u_regval[0] + 8;
9692 }
9693 /* Calculate target store address, Rn +/- Rm, register offset. */
9694 if (12 == arm_insn_r->opcode)
9695 {
9696 tgt_mem_addr = u_regval[0] + u_regval[1];
9697 }
9698 else
9699 {
9700 tgt_mem_addr = u_regval[1] - u_regval[0];
9701 }
9702 if (ARM_RECORD_STRH == str_type)
9703 {
9704 record_buf_mem[0] = 2;
9705 record_buf_mem[1] = tgt_mem_addr;
9706 arm_insn_r->mem_rec_count = 1;
9707 }
9708 else if (ARM_RECORD_STRD == str_type)
9709 {
9710 record_buf_mem[0] = 4;
9711 record_buf_mem[1] = tgt_mem_addr;
9712 record_buf_mem[2] = 4;
9713 record_buf_mem[3] = tgt_mem_addr + 4;
9714 arm_insn_r->mem_rec_count = 2;
9715 }
9716 }
9717 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9718 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9719 {
9720 /* 3) Store, immediate pre-indexed. */
9721 /* 5) Store, immediate post-indexed. */
9722 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9723 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9724 offset_8 = (immed_high << 4) | immed_low;
9725 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9726 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9727 /* Calculate target store address, Rn +/- Rm, register offset. */
9728 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9729 {
9730 tgt_mem_addr = u_regval[0] + offset_8;
9731 }
9732 else
9733 {
9734 tgt_mem_addr = u_regval[0] - offset_8;
9735 }
9736 if (ARM_RECORD_STRH == str_type)
9737 {
9738 record_buf_mem[0] = 2;
9739 record_buf_mem[1] = tgt_mem_addr;
9740 arm_insn_r->mem_rec_count = 1;
9741 }
9742 else if (ARM_RECORD_STRD == str_type)
9743 {
9744 record_buf_mem[0] = 4;
9745 record_buf_mem[1] = tgt_mem_addr;
9746 record_buf_mem[2] = 4;
9747 record_buf_mem[3] = tgt_mem_addr + 4;
9748 arm_insn_r->mem_rec_count = 2;
9749 }
9750 /* Record Rn also as it changes. */
9751 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9752 arm_insn_r->reg_rec_count = 1;
9753 }
9754 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9755 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9756 {
9757 /* 4) Store, register pre-indexed. */
9758 /* 6) Store, register post -indexed. */
9759 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9760 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9761 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9762 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9763 /* Calculate target store address, Rn +/- Rm, register offset. */
9764 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9765 {
9766 tgt_mem_addr = u_regval[0] + u_regval[1];
9767 }
9768 else
9769 {
9770 tgt_mem_addr = u_regval[1] - u_regval[0];
9771 }
9772 if (ARM_RECORD_STRH == str_type)
9773 {
9774 record_buf_mem[0] = 2;
9775 record_buf_mem[1] = tgt_mem_addr;
9776 arm_insn_r->mem_rec_count = 1;
9777 }
9778 else if (ARM_RECORD_STRD == str_type)
9779 {
9780 record_buf_mem[0] = 4;
9781 record_buf_mem[1] = tgt_mem_addr;
9782 record_buf_mem[2] = 4;
9783 record_buf_mem[3] = tgt_mem_addr + 4;
9784 arm_insn_r->mem_rec_count = 2;
9785 }
9786 /* Record Rn also as it changes. */
9787 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9788 arm_insn_r->reg_rec_count = 1;
9789 }
9790 return 0;
9791}
9792
9793/* Handling ARM extension space insns. */
9794
9795static int
9796arm_record_extension_space (insn_decode_record *arm_insn_r)
9797{
9798 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
9799 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9800 uint32_t record_buf[8], record_buf_mem[8];
9801 uint32_t reg_src1 = 0;
72508ac0
PO
9802 struct regcache *reg_cache = arm_insn_r->regcache;
9803 ULONGEST u_regval = 0;
9804
9805 gdb_assert (!INSN_RECORDED(arm_insn_r));
9806 /* Handle unconditional insn extension space. */
9807
9808 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9809 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9810 if (arm_insn_r->cond)
9811 {
9812 /* PLD has no affect on architectural state, it just affects
9813 the caches. */
9814 if (5 == ((opcode1 & 0xE0) >> 5))
9815 {
9816 /* BLX(1) */
9817 record_buf[0] = ARM_PS_REGNUM;
9818 record_buf[1] = ARM_LR_REGNUM;
9819 arm_insn_r->reg_rec_count = 2;
9820 }
9821 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9822 }
9823
9824
9825 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9826 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9827 {
9828 ret = -1;
9829 /* Undefined instruction on ARM V5; need to handle if later
9830 versions define it. */
9831 }
9832
9833 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9834 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9835 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9836
9837 /* Handle arithmetic insn extension space. */
9838 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9839 && !INSN_RECORDED(arm_insn_r))
9840 {
9841 /* Handle MLA(S) and MUL(S). */
9842 if (0 <= insn_op1 && 3 >= insn_op1)
9843 {
9844 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9845 record_buf[1] = ARM_PS_REGNUM;
9846 arm_insn_r->reg_rec_count = 2;
9847 }
9848 else if (4 <= insn_op1 && 15 >= insn_op1)
9849 {
9850 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9851 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9852 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9853 record_buf[2] = ARM_PS_REGNUM;
9854 arm_insn_r->reg_rec_count = 3;
9855 }
9856 }
9857
9858 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9859 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9860 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9861
9862 /* Handle control insn extension space. */
9863
9864 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9865 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9866 {
9867 if (!bit (arm_insn_r->arm_insn,25))
9868 {
9869 if (!bits (arm_insn_r->arm_insn, 4, 7))
9870 {
9871 if ((0 == insn_op1) || (2 == insn_op1))
9872 {
9873 /* MRS. */
9874 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9875 arm_insn_r->reg_rec_count = 1;
9876 }
9877 else if (1 == insn_op1)
9878 {
9879 /* CSPR is going to be changed. */
9880 record_buf[0] = ARM_PS_REGNUM;
9881 arm_insn_r->reg_rec_count = 1;
9882 }
9883 else if (3 == insn_op1)
9884 {
9885 /* SPSR is going to be changed. */
9886 /* We need to get SPSR value, which is yet to be done. */
9887 printf_unfiltered (_("Process record does not support "
9888 "instruction 0x%0x at address %s.\n"),
9889 arm_insn_r->arm_insn,
9890 paddress (arm_insn_r->gdbarch,
9891 arm_insn_r->this_addr));
9892 return -1;
9893 }
9894 }
9895 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9896 {
9897 if (1 == insn_op1)
9898 {
9899 /* BX. */
9900 record_buf[0] = ARM_PS_REGNUM;
9901 arm_insn_r->reg_rec_count = 1;
9902 }
9903 else if (3 == insn_op1)
9904 {
9905 /* CLZ. */
9906 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9907 arm_insn_r->reg_rec_count = 1;
9908 }
9909 }
9910 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9911 {
9912 /* BLX. */
9913 record_buf[0] = ARM_PS_REGNUM;
9914 record_buf[1] = ARM_LR_REGNUM;
9915 arm_insn_r->reg_rec_count = 2;
9916 }
9917 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
9918 {
9919 /* QADD, QSUB, QDADD, QDSUB */
9920 record_buf[0] = ARM_PS_REGNUM;
9921 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9922 arm_insn_r->reg_rec_count = 2;
9923 }
9924 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
9925 {
9926 /* BKPT. */
9927 record_buf[0] = ARM_PS_REGNUM;
9928 record_buf[1] = ARM_LR_REGNUM;
9929 arm_insn_r->reg_rec_count = 2;
9930
9931 /* Save SPSR also;how? */
9932 printf_unfiltered (_("Process record does not support "
9933 "instruction 0x%0x at address %s.\n"),
9934 arm_insn_r->arm_insn,
9935 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
9936 return -1;
9937 }
9938 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
9939 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
9940 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
9941 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
9942 )
9943 {
9944 if (0 == insn_op1 || 1 == insn_op1)
9945 {
9946 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
9947 /* We dont do optimization for SMULW<y> where we
9948 need only Rd. */
9949 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9950 record_buf[1] = ARM_PS_REGNUM;
9951 arm_insn_r->reg_rec_count = 2;
9952 }
9953 else if (2 == insn_op1)
9954 {
9955 /* SMLAL<x><y>. */
9956 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9957 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
9958 arm_insn_r->reg_rec_count = 2;
9959 }
9960 else if (3 == insn_op1)
9961 {
9962 /* SMUL<x><y>. */
9963 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9964 arm_insn_r->reg_rec_count = 1;
9965 }
9966 }
9967 }
9968 else
9969 {
9970 /* MSR : immediate form. */
9971 if (1 == insn_op1)
9972 {
9973 /* CSPR is going to be changed. */
9974 record_buf[0] = ARM_PS_REGNUM;
9975 arm_insn_r->reg_rec_count = 1;
9976 }
9977 else if (3 == insn_op1)
9978 {
9979 /* SPSR is going to be changed. */
9980 /* we need to get SPSR value, which is yet to be done */
9981 printf_unfiltered (_("Process record does not support "
9982 "instruction 0x%0x at address %s.\n"),
9983 arm_insn_r->arm_insn,
9984 paddress (arm_insn_r->gdbarch,
9985 arm_insn_r->this_addr));
9986 return -1;
9987 }
9988 }
9989 }
9990
9991 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9992 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
9993 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
9994
9995 /* Handle load/store insn extension space. */
9996
9997 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
9998 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
9999 && !INSN_RECORDED(arm_insn_r))
10000 {
10001 /* SWP/SWPB. */
10002 if (0 == insn_op1)
10003 {
10004 /* These insn, changes register and memory as well. */
10005 /* SWP or SWPB insn. */
10006 /* Get memory address given by Rn. */
10007 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10008 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10009 /* SWP insn ?, swaps word. */
10010 if (8 == arm_insn_r->opcode)
10011 {
10012 record_buf_mem[0] = 4;
10013 }
10014 else
10015 {
10016 /* SWPB insn, swaps only byte. */
10017 record_buf_mem[0] = 1;
10018 }
10019 record_buf_mem[1] = u_regval;
10020 arm_insn_r->mem_rec_count = 1;
10021 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10022 arm_insn_r->reg_rec_count = 1;
10023 }
10024 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10025 {
10026 /* STRH. */
10027 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10028 ARM_RECORD_STRH);
10029 }
10030 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10031 {
10032 /* LDRD. */
10033 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10034 record_buf[1] = record_buf[0] + 1;
10035 arm_insn_r->reg_rec_count = 2;
10036 }
10037 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10038 {
10039 /* STRD. */
10040 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10041 ARM_RECORD_STRD);
10042 }
10043 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10044 {
10045 /* LDRH, LDRSB, LDRSH. */
10046 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10047 arm_insn_r->reg_rec_count = 1;
10048 }
10049
10050 }
10051
10052 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10053 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10054 && !INSN_RECORDED(arm_insn_r))
10055 {
10056 ret = -1;
10057 /* Handle coprocessor insn extension space. */
10058 }
10059
10060 /* To be done for ARMv5 and later; as of now we return -1. */
10061 if (-1 == ret)
10062 printf_unfiltered (_("Process record does not support instruction x%0x "
10063 "at address %s.\n"),arm_insn_r->arm_insn,
10064 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10065
10066
10067 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10068 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10069
10070 return ret;
10071}
10072
10073/* Handling opcode 000 insns. */
10074
10075static int
10076arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10077{
10078 struct regcache *reg_cache = arm_insn_r->regcache;
10079 uint32_t record_buf[8], record_buf_mem[8];
10080 ULONGEST u_regval[2] = {0};
10081
bec2ab5a 10082 uint32_t reg_src1 = 0, reg_dest = 0;
72508ac0
PO
10083 uint32_t opcode1 = 0;
10084
10085 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10086 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10087 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10088
10089 /* Data processing insn /multiply insn. */
10090 if (9 == arm_insn_r->decode
10091 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10092 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
10093 {
10094 /* Handle multiply instructions. */
10095 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10096 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10097 {
10098 /* Handle MLA and MUL. */
10099 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10100 record_buf[1] = ARM_PS_REGNUM;
10101 arm_insn_r->reg_rec_count = 2;
10102 }
10103 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10104 {
10105 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10106 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10107 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10108 record_buf[2] = ARM_PS_REGNUM;
10109 arm_insn_r->reg_rec_count = 3;
10110 }
10111 }
10112 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10113 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
10114 {
10115 /* Handle misc load insns, as 20th bit (L = 1). */
10116 /* LDR insn has a capability to do branching, if
10117 MOV LR, PC is precceded by LDR insn having Rn as R15
10118 in that case, it emulates branch and link insn, and hence we
10119 need to save CSPR and PC as well. I am not sure this is right
10120 place; as opcode = 010 LDR insn make this happen, if R15 was
10121 used. */
10122 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10123 if (15 != reg_dest)
10124 {
10125 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10126 arm_insn_r->reg_rec_count = 1;
10127 }
10128 else
10129 {
10130 record_buf[0] = reg_dest;
10131 record_buf[1] = ARM_PS_REGNUM;
10132 arm_insn_r->reg_rec_count = 2;
10133 }
10134 }
10135 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10136 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
10137 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10138 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
10139 {
10140 /* Handle MSR insn. */
10141 if (9 == arm_insn_r->opcode)
10142 {
10143 /* CSPR is going to be changed. */
10144 record_buf[0] = ARM_PS_REGNUM;
10145 arm_insn_r->reg_rec_count = 1;
10146 }
10147 else
10148 {
10149 /* SPSR is going to be changed. */
10150 /* How to read SPSR value? */
10151 printf_unfiltered (_("Process record does not support instruction "
10152 "0x%0x at address %s.\n"),
10153 arm_insn_r->arm_insn,
10154 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10155 return -1;
10156 }
10157 }
10158 else if (9 == arm_insn_r->decode
10159 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10160 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10161 {
10162 /* Handling SWP, SWPB. */
10163 /* These insn, changes register and memory as well. */
10164 /* SWP or SWPB insn. */
10165
10166 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10167 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10168 /* SWP insn ?, swaps word. */
10169 if (8 == arm_insn_r->opcode)
10170 {
10171 record_buf_mem[0] = 4;
10172 }
10173 else
10174 {
10175 /* SWPB insn, swaps only byte. */
10176 record_buf_mem[0] = 1;
10177 }
10178 record_buf_mem[1] = u_regval[0];
10179 arm_insn_r->mem_rec_count = 1;
10180 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10181 arm_insn_r->reg_rec_count = 1;
10182 }
10183 else if (3 == arm_insn_r->decode && 0x12 == opcode1
10184 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10185 {
10186 /* Handle BLX, branch and link/exchange. */
10187 if (9 == arm_insn_r->opcode)
10188 {
10189 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10190 and R14 stores the return address. */
10191 record_buf[0] = ARM_PS_REGNUM;
10192 record_buf[1] = ARM_LR_REGNUM;
10193 arm_insn_r->reg_rec_count = 2;
10194 }
10195 }
10196 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10197 {
10198 /* Handle enhanced software breakpoint insn, BKPT. */
10199 /* CPSR is changed to be executed in ARM state, disabling normal
10200 interrupts, entering abort mode. */
10201 /* According to high vector configuration PC is set. */
10202 /* user hit breakpoint and type reverse, in
10203 that case, we need to go back with previous CPSR and
10204 Program Counter. */
10205 record_buf[0] = ARM_PS_REGNUM;
10206 record_buf[1] = ARM_LR_REGNUM;
10207 arm_insn_r->reg_rec_count = 2;
10208
10209 /* Save SPSR also; how? */
10210 printf_unfiltered (_("Process record does not support instruction "
10211 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10212 paddress (arm_insn_r->gdbarch,
10213 arm_insn_r->this_addr));
10214 return -1;
10215 }
10216 else if (11 == arm_insn_r->decode
10217 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10218 {
10219 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
10220
10221 /* Handle str(x) insn */
10222 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10223 ARM_RECORD_STRH);
10224 }
10225 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10226 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10227 {
10228 /* Handle BX, branch and link/exchange. */
10229 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10230 record_buf[0] = ARM_PS_REGNUM;
10231 arm_insn_r->reg_rec_count = 1;
10232 }
10233 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10234 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10235 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10236 {
10237 /* Count leading zeros: CLZ. */
10238 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10239 arm_insn_r->reg_rec_count = 1;
10240 }
10241 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10242 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10243 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10244 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
10245 )
10246 {
10247 /* Handle MRS insn. */
10248 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10249 arm_insn_r->reg_rec_count = 1;
10250 }
10251 else if (arm_insn_r->opcode <= 15)
10252 {
10253 /* Normal data processing insns. */
10254 /* Out of 11 shifter operands mode, all the insn modifies destination
10255 register, which is specified by 13-16 decode. */
10256 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10257 record_buf[1] = ARM_PS_REGNUM;
10258 arm_insn_r->reg_rec_count = 2;
10259 }
10260 else
10261 {
10262 return -1;
10263 }
10264
10265 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10266 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10267 return 0;
10268}
10269
10270/* Handling opcode 001 insns. */
10271
10272static int
10273arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10274{
10275 uint32_t record_buf[8], record_buf_mem[8];
10276
10277 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10278 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10279
10280 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10281 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10282 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10283 )
10284 {
10285 /* Handle MSR insn. */
10286 if (9 == arm_insn_r->opcode)
10287 {
10288 /* CSPR is going to be changed. */
10289 record_buf[0] = ARM_PS_REGNUM;
10290 arm_insn_r->reg_rec_count = 1;
10291 }
10292 else
10293 {
10294 /* SPSR is going to be changed. */
10295 }
10296 }
10297 else if (arm_insn_r->opcode <= 15)
10298 {
10299 /* Normal data processing insns. */
10300 /* Out of 11 shifter operands mode, all the insn modifies destination
10301 register, which is specified by 13-16 decode. */
10302 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10303 record_buf[1] = ARM_PS_REGNUM;
10304 arm_insn_r->reg_rec_count = 2;
10305 }
10306 else
10307 {
10308 return -1;
10309 }
10310
10311 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10312 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10313 return 0;
10314}
10315
71e396f9 10316/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10317
10318static int
10319arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10320{
10321 struct regcache *reg_cache = arm_insn_r->regcache;
10322
71e396f9
LM
10323 uint32_t reg_base , reg_dest;
10324 uint32_t offset_12, tgt_mem_addr;
72508ac0 10325 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10326 unsigned char wback;
10327 ULONGEST u_regval;
72508ac0 10328
71e396f9
LM
10329 /* Calculate wback. */
10330 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10331 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10332
71e396f9
LM
10333 arm_insn_r->reg_rec_count = 0;
10334 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10335
10336 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10337 {
71e396f9
LM
10338 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10339 and LDRT. */
10340
72508ac0 10341 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10342 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10343
10344 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10345 preceeds a LDR instruction having R15 as reg_base, it
10346 emulates a branch and link instruction, and hence we need to save
10347 CPSR and PC as well. */
10348 if (ARM_PC_REGNUM == reg_dest)
10349 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10350
10351 /* If wback is true, also save the base register, which is going to be
10352 written to. */
10353 if (wback)
10354 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10355 }
10356 else
10357 {
71e396f9
LM
10358 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10359
72508ac0 10360 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10361 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10362
10363 /* Handle bit U. */
72508ac0 10364 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10365 {
10366 /* U == 1: Add the offset. */
10367 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10368 }
72508ac0 10369 else
71e396f9
LM
10370 {
10371 /* U == 0: subtract the offset. */
10372 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10373 }
10374
10375 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10376 bytes. */
10377 if (bit (arm_insn_r->arm_insn, 22))
10378 {
10379 /* STRB and STRBT: 1 byte. */
10380 record_buf_mem[0] = 1;
10381 }
10382 else
10383 {
10384 /* STR and STRT: 4 bytes. */
10385 record_buf_mem[0] = 4;
10386 }
10387
10388 /* Handle bit P. */
10389 if (bit (arm_insn_r->arm_insn, 24))
10390 record_buf_mem[1] = tgt_mem_addr;
10391 else
10392 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10393
72508ac0
PO
10394 arm_insn_r->mem_rec_count = 1;
10395
71e396f9
LM
10396 /* If wback is true, also save the base register, which is going to be
10397 written to. */
10398 if (wback)
10399 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10400 }
10401
10402 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10403 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10404 return 0;
10405}
10406
10407/* Handling opcode 011 insns. */
10408
10409static int
10410arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10411{
10412 struct regcache *reg_cache = arm_insn_r->regcache;
10413
10414 uint32_t shift_imm = 0;
10415 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10416 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10417 uint32_t record_buf[8], record_buf_mem[8];
10418
10419 LONGEST s_word;
10420 ULONGEST u_regval[2];
10421
10422 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10423 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10424
10425 /* Handle enhanced store insns and LDRD DSP insn,
10426 order begins according to addressing modes for store insns
10427 STRH insn. */
10428
10429 /* LDR or STR? */
10430 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10431 {
10432 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10433 /* LDR insn has a capability to do branching, if
10434 MOV LR, PC is precedded by LDR insn having Rn as R15
10435 in that case, it emulates branch and link insn, and hence we
10436 need to save CSPR and PC as well. */
10437 if (15 != reg_dest)
10438 {
10439 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10440 arm_insn_r->reg_rec_count = 1;
10441 }
10442 else
10443 {
10444 record_buf[0] = reg_dest;
10445 record_buf[1] = ARM_PS_REGNUM;
10446 arm_insn_r->reg_rec_count = 2;
10447 }
10448 }
10449 else
10450 {
10451 if (! bits (arm_insn_r->arm_insn, 4, 11))
10452 {
10453 /* Store insn, register offset and register pre-indexed,
10454 register post-indexed. */
10455 /* Get Rm. */
10456 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10457 /* Get Rn. */
10458 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10459 regcache_raw_read_unsigned (reg_cache, reg_src1
10460 , &u_regval[0]);
10461 regcache_raw_read_unsigned (reg_cache, reg_src2
10462 , &u_regval[1]);
10463 if (15 == reg_src2)
10464 {
10465 /* If R15 was used as Rn, hence current PC+8. */
10466 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10467 u_regval[0] = u_regval[0] + 8;
10468 }
10469 /* Calculate target store address, Rn +/- Rm, register offset. */
10470 /* U == 1. */
10471 if (bit (arm_insn_r->arm_insn, 23))
10472 {
10473 tgt_mem_addr = u_regval[0] + u_regval[1];
10474 }
10475 else
10476 {
10477 tgt_mem_addr = u_regval[1] - u_regval[0];
10478 }
10479
10480 switch (arm_insn_r->opcode)
10481 {
10482 /* STR. */
10483 case 8:
10484 case 12:
10485 /* STR. */
10486 case 9:
10487 case 13:
10488 /* STRT. */
10489 case 1:
10490 case 5:
10491 /* STR. */
10492 case 0:
10493 case 4:
10494 record_buf_mem[0] = 4;
10495 break;
10496
10497 /* STRB. */
10498 case 10:
10499 case 14:
10500 /* STRB. */
10501 case 11:
10502 case 15:
10503 /* STRBT. */
10504 case 3:
10505 case 7:
10506 /* STRB. */
10507 case 2:
10508 case 6:
10509 record_buf_mem[0] = 1;
10510 break;
10511
10512 default:
10513 gdb_assert_not_reached ("no decoding pattern found");
10514 break;
10515 }
10516 record_buf_mem[1] = tgt_mem_addr;
10517 arm_insn_r->mem_rec_count = 1;
10518
10519 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10520 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10521 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10522 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10523 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10524 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10525 )
10526 {
10527 /* Rn is going to be changed in pre-indexed mode and
10528 post-indexed mode as well. */
10529 record_buf[0] = reg_src2;
10530 arm_insn_r->reg_rec_count = 1;
10531 }
10532 }
10533 else
10534 {
10535 /* Store insn, scaled register offset; scaled pre-indexed. */
10536 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10537 /* Get Rm. */
10538 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10539 /* Get Rn. */
10540 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10541 /* Get shift_imm. */
10542 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10543 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10544 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10545 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10546 /* Offset_12 used as shift. */
10547 switch (offset_12)
10548 {
10549 case 0:
10550 /* Offset_12 used as index. */
10551 offset_12 = u_regval[0] << shift_imm;
10552 break;
10553
10554 case 1:
10555 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10556 break;
10557
10558 case 2:
10559 if (!shift_imm)
10560 {
10561 if (bit (u_regval[0], 31))
10562 {
10563 offset_12 = 0xFFFFFFFF;
10564 }
10565 else
10566 {
10567 offset_12 = 0;
10568 }
10569 }
10570 else
10571 {
10572 /* This is arithmetic shift. */
10573 offset_12 = s_word >> shift_imm;
10574 }
10575 break;
10576
10577 case 3:
10578 if (!shift_imm)
10579 {
10580 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10581 &u_regval[1]);
10582 /* Get C flag value and shift it by 31. */
10583 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10584 | (u_regval[0]) >> 1);
10585 }
10586 else
10587 {
10588 offset_12 = (u_regval[0] >> shift_imm) \
10589 | (u_regval[0] <<
10590 (sizeof(uint32_t) - shift_imm));
10591 }
10592 break;
10593
10594 default:
10595 gdb_assert_not_reached ("no decoding pattern found");
10596 break;
10597 }
10598
10599 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10600 /* bit U set. */
10601 if (bit (arm_insn_r->arm_insn, 23))
10602 {
10603 tgt_mem_addr = u_regval[1] + offset_12;
10604 }
10605 else
10606 {
10607 tgt_mem_addr = u_regval[1] - offset_12;
10608 }
10609
10610 switch (arm_insn_r->opcode)
10611 {
10612 /* STR. */
10613 case 8:
10614 case 12:
10615 /* STR. */
10616 case 9:
10617 case 13:
10618 /* STRT. */
10619 case 1:
10620 case 5:
10621 /* STR. */
10622 case 0:
10623 case 4:
10624 record_buf_mem[0] = 4;
10625 break;
10626
10627 /* STRB. */
10628 case 10:
10629 case 14:
10630 /* STRB. */
10631 case 11:
10632 case 15:
10633 /* STRBT. */
10634 case 3:
10635 case 7:
10636 /* STRB. */
10637 case 2:
10638 case 6:
10639 record_buf_mem[0] = 1;
10640 break;
10641
10642 default:
10643 gdb_assert_not_reached ("no decoding pattern found");
10644 break;
10645 }
10646 record_buf_mem[1] = tgt_mem_addr;
10647 arm_insn_r->mem_rec_count = 1;
10648
10649 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10650 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10651 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10652 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10653 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10654 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10655 )
10656 {
10657 /* Rn is going to be changed in register scaled pre-indexed
10658 mode,and scaled post indexed mode. */
10659 record_buf[0] = reg_src2;
10660 arm_insn_r->reg_rec_count = 1;
10661 }
10662 }
10663 }
10664
10665 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10666 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10667 return 0;
10668}
10669
71e396f9 10670/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10671
10672static int
10673arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10674{
10675 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10676 uint32_t register_count = 0, register_bits;
10677 uint32_t reg_base, addr_mode;
72508ac0 10678 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10679 uint32_t wback;
10680 ULONGEST u_regval;
72508ac0 10681
71e396f9
LM
10682 /* Fetch the list of registers. */
10683 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10684 arm_insn_r->reg_rec_count = 0;
10685
10686 /* Fetch the base register that contains the address we are loading data
10687 to. */
10688 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10689
71e396f9
LM
10690 /* Calculate wback. */
10691 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10692
10693 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10694 {
71e396f9 10695 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10696
71e396f9 10697 /* Find out which registers are going to be loaded from memory. */
72508ac0 10698 while (register_bits)
71e396f9
LM
10699 {
10700 if (register_bits & 0x00000001)
10701 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10702 register_bits = register_bits >> 1;
10703 register_count++;
10704 }
72508ac0 10705
71e396f9
LM
10706
10707 /* If wback is true, also save the base register, which is going to be
10708 written to. */
10709 if (wback)
10710 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10711
10712 /* Save the CPSR register. */
10713 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10714 }
10715 else
10716 {
71e396f9 10717 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10718
71e396f9
LM
10719 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10720
10721 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10722
10723 /* Find out how many registers are going to be stored to memory. */
72508ac0 10724 while (register_bits)
71e396f9
LM
10725 {
10726 if (register_bits & 0x00000001)
10727 register_count++;
10728 register_bits = register_bits >> 1;
10729 }
72508ac0
PO
10730
10731 switch (addr_mode)
71e396f9
LM
10732 {
10733 /* STMDA (STMED): Decrement after. */
10734 case 0:
10735 record_buf_mem[1] = (uint32_t) u_regval
10736 - register_count * INT_REGISTER_SIZE + 4;
10737 break;
10738 /* STM (STMIA, STMEA): Increment after. */
10739 case 1:
10740 record_buf_mem[1] = (uint32_t) u_regval;
10741 break;
10742 /* STMDB (STMFD): Decrement before. */
10743 case 2:
10744 record_buf_mem[1] = (uint32_t) u_regval
10745 - register_count * INT_REGISTER_SIZE;
10746 break;
10747 /* STMIB (STMFA): Increment before. */
10748 case 3:
10749 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
10750 break;
10751 default:
10752 gdb_assert_not_reached ("no decoding pattern found");
10753 break;
10754 }
72508ac0 10755
71e396f9
LM
10756 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
10757 arm_insn_r->mem_rec_count = 1;
10758
10759 /* If wback is true, also save the base register, which is going to be
10760 written to. */
10761 if (wback)
10762 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10763 }
10764
10765 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10766 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10767 return 0;
10768}
10769
10770/* Handling opcode 101 insns. */
10771
10772static int
10773arm_record_b_bl (insn_decode_record *arm_insn_r)
10774{
10775 uint32_t record_buf[8];
10776
10777 /* Handle B, BL, BLX(1) insns. */
10778 /* B simply branches so we do nothing here. */
10779 /* Note: BLX(1) doesnt fall here but instead it falls into
10780 extension space. */
10781 if (bit (arm_insn_r->arm_insn, 24))
10782 {
10783 record_buf[0] = ARM_LR_REGNUM;
10784 arm_insn_r->reg_rec_count = 1;
10785 }
10786
10787 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10788
10789 return 0;
10790}
10791
10792/* Handling opcode 110 insns. */
10793
10794static int
c6ec2b30 10795arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
10796{
10797 printf_unfiltered (_("Process record does not support instruction "
10798 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10799 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10800
10801 return -1;
10802}
10803
5a578da5
OJ
10804/* Record handler for vector data transfer instructions. */
10805
10806static int
10807arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
10808{
10809 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
10810 uint32_t record_buf[4];
10811
10812 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10813 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
10814 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
10815 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
10816 bit_l = bit (arm_insn_r->arm_insn, 20);
10817 bit_c = bit (arm_insn_r->arm_insn, 8);
10818
10819 /* Handle VMOV instruction. */
10820 if (bit_l && bit_c)
10821 {
10822 record_buf[0] = reg_t;
10823 arm_insn_r->reg_rec_count = 1;
10824 }
10825 else if (bit_l && !bit_c)
10826 {
10827 /* Handle VMOV instruction. */
10828 if (bits_a == 0x00)
10829 {
10830 if (bit (arm_insn_r->arm_insn, 20))
10831 record_buf[0] = reg_t;
10832 else
10833 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10834 (reg_v << 1));
10835
10836 arm_insn_r->reg_rec_count = 1;
10837 }
10838 /* Handle VMRS instruction. */
10839 else if (bits_a == 0x07)
10840 {
10841 if (reg_t == 15)
10842 reg_t = ARM_PS_REGNUM;
10843
10844 record_buf[0] = reg_t;
10845 arm_insn_r->reg_rec_count = 1;
10846 }
10847 }
10848 else if (!bit_l && !bit_c)
10849 {
10850 /* Handle VMOV instruction. */
10851 if (bits_a == 0x00)
10852 {
10853 if (bit (arm_insn_r->arm_insn, 20))
10854 record_buf[0] = reg_t;
10855 else
10856 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10857 (reg_v << 1));
10858
10859 arm_insn_r->reg_rec_count = 1;
10860 }
10861 /* Handle VMSR instruction. */
10862 else if (bits_a == 0x07)
10863 {
10864 record_buf[0] = ARM_FPSCR_REGNUM;
10865 arm_insn_r->reg_rec_count = 1;
10866 }
10867 }
10868 else if (!bit_l && bit_c)
10869 {
10870 /* Handle VMOV instruction. */
10871 if (!(bits_a & 0x04))
10872 {
10873 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
10874 + ARM_D0_REGNUM;
10875 arm_insn_r->reg_rec_count = 1;
10876 }
10877 /* Handle VDUP instruction. */
10878 else
10879 {
10880 if (bit (arm_insn_r->arm_insn, 21))
10881 {
10882 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10883 record_buf[0] = reg_v + ARM_D0_REGNUM;
10884 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
10885 arm_insn_r->reg_rec_count = 2;
10886 }
10887 else
10888 {
10889 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10890 record_buf[0] = reg_v + ARM_D0_REGNUM;
10891 arm_insn_r->reg_rec_count = 1;
10892 }
10893 }
10894 }
10895
10896 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10897 return 0;
10898}
10899
f20f80dd
OJ
10900/* Record handler for extension register load/store instructions. */
10901
10902static int
10903arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
10904{
10905 uint32_t opcode, single_reg;
10906 uint8_t op_vldm_vstm;
10907 uint32_t record_buf[8], record_buf_mem[128];
10908 ULONGEST u_regval = 0;
10909
10910 struct regcache *reg_cache = arm_insn_r->regcache;
10911 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10912
10913 opcode = bits (arm_insn_r->arm_insn, 20, 24);
10914 single_reg = bit (arm_insn_r->arm_insn, 8);
10915 op_vldm_vstm = opcode & 0x1b;
10916
10917 /* Handle VMOV instructions. */
10918 if ((opcode & 0x1e) == 0x04)
10919 {
10920 if (bit (arm_insn_r->arm_insn, 4))
10921 {
10922 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10923 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10924 arm_insn_r->reg_rec_count = 2;
10925 }
10926 else
10927 {
10928 uint8_t reg_m = (bits (arm_insn_r->arm_insn, 0, 3) << 1)
10929 | bit (arm_insn_r->arm_insn, 5);
10930
10931 if (!single_reg)
10932 {
10933 record_buf[0] = num_regs + reg_m;
10934 record_buf[1] = num_regs + reg_m + 1;
10935 arm_insn_r->reg_rec_count = 2;
10936 }
10937 else
10938 {
10939 record_buf[0] = reg_m + ARM_D0_REGNUM;
10940 arm_insn_r->reg_rec_count = 1;
10941 }
10942 }
10943 }
10944 /* Handle VSTM and VPUSH instructions. */
10945 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
10946 || op_vldm_vstm == 0x12)
10947 {
10948 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
10949 uint32_t memory_index = 0;
10950
10951 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
10952 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
10953 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
10954 imm_off32 = imm_off8 << 24;
10955 memory_count = imm_off8;
10956
10957 if (bit (arm_insn_r->arm_insn, 23))
10958 start_address = u_regval;
10959 else
10960 start_address = u_regval - imm_off32;
10961
10962 if (bit (arm_insn_r->arm_insn, 21))
10963 {
10964 record_buf[0] = reg_rn;
10965 arm_insn_r->reg_rec_count = 1;
10966 }
10967
10968 while (memory_count > 0)
10969 {
10970 if (!single_reg)
10971 {
10972 record_buf_mem[memory_index] = start_address;
10973 record_buf_mem[memory_index + 1] = 4;
10974 start_address = start_address + 4;
10975 memory_index = memory_index + 2;
10976 }
10977 else
10978 {
10979 record_buf_mem[memory_index] = start_address;
10980 record_buf_mem[memory_index + 1] = 4;
10981 record_buf_mem[memory_index + 2] = start_address + 4;
10982 record_buf_mem[memory_index + 3] = 4;
10983 start_address = start_address + 8;
10984 memory_index = memory_index + 4;
10985 }
10986 memory_count--;
10987 }
10988 arm_insn_r->mem_rec_count = (memory_index >> 1);
10989 }
10990 /* Handle VLDM instructions. */
10991 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
10992 || op_vldm_vstm == 0x13)
10993 {
10994 uint32_t reg_count, reg_vd;
10995 uint32_t reg_index = 0;
10996
10997 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
10998 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
10999
11000 if (single_reg)
11001 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11002 else
11003 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11004
11005 if (bit (arm_insn_r->arm_insn, 21))
11006 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
11007
11008 while (reg_count > 0)
11009 {
11010 if (single_reg)
11011 record_buf[reg_index++] = num_regs + reg_vd + reg_count - 1;
11012 else
11013 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
11014
11015 reg_count--;
11016 }
11017 arm_insn_r->reg_rec_count = reg_index;
11018 }
11019 /* VSTR Vector store register. */
11020 else if ((opcode & 0x13) == 0x10)
11021 {
bec2ab5a 11022 uint32_t start_address, reg_rn, imm_off32, imm_off8;
f20f80dd
OJ
11023 uint32_t memory_index = 0;
11024
11025 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11026 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11027 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11028 imm_off32 = imm_off8 << 24;
f20f80dd
OJ
11029
11030 if (bit (arm_insn_r->arm_insn, 23))
11031 start_address = u_regval + imm_off32;
11032 else
11033 start_address = u_regval - imm_off32;
11034
11035 if (single_reg)
11036 {
11037 record_buf_mem[memory_index] = start_address;
11038 record_buf_mem[memory_index + 1] = 4;
11039 arm_insn_r->mem_rec_count = 1;
11040 }
11041 else
11042 {
11043 record_buf_mem[memory_index] = start_address;
11044 record_buf_mem[memory_index + 1] = 4;
11045 record_buf_mem[memory_index + 2] = start_address + 4;
11046 record_buf_mem[memory_index + 3] = 4;
11047 arm_insn_r->mem_rec_count = 2;
11048 }
11049 }
11050 /* VLDR Vector load register. */
11051 else if ((opcode & 0x13) == 0x11)
11052 {
11053 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11054
11055 if (!single_reg)
11056 {
11057 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11058 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11059 }
11060 else
11061 {
11062 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11063 record_buf[0] = num_regs + reg_vd;
11064 }
11065 arm_insn_r->reg_rec_count = 1;
11066 }
11067
11068 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11069 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11070 return 0;
11071}
11072
851f26ae
OJ
11073/* Record handler for arm/thumb mode VFP data processing instructions. */
11074
11075static int
11076arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11077{
11078 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11079 uint32_t record_buf[4];
11080 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11081 enum insn_types curr_insn_type = INSN_INV;
11082
11083 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11084 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11085 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11086 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11087 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11088 bit_d = bit (arm_insn_r->arm_insn, 22);
11089 opc1 = opc1 & 0x04;
11090
11091 /* Handle VMLA, VMLS. */
11092 if (opc1 == 0x00)
11093 {
11094 if (bit (arm_insn_r->arm_insn, 10))
11095 {
11096 if (bit (arm_insn_r->arm_insn, 6))
11097 curr_insn_type = INSN_T0;
11098 else
11099 curr_insn_type = INSN_T1;
11100 }
11101 else
11102 {
11103 if (dp_op_sz)
11104 curr_insn_type = INSN_T1;
11105 else
11106 curr_insn_type = INSN_T2;
11107 }
11108 }
11109 /* Handle VNMLA, VNMLS, VNMUL. */
11110 else if (opc1 == 0x01)
11111 {
11112 if (dp_op_sz)
11113 curr_insn_type = INSN_T1;
11114 else
11115 curr_insn_type = INSN_T2;
11116 }
11117 /* Handle VMUL. */
11118 else if (opc1 == 0x02 && !(opc3 & 0x01))
11119 {
11120 if (bit (arm_insn_r->arm_insn, 10))
11121 {
11122 if (bit (arm_insn_r->arm_insn, 6))
11123 curr_insn_type = INSN_T0;
11124 else
11125 curr_insn_type = INSN_T1;
11126 }
11127 else
11128 {
11129 if (dp_op_sz)
11130 curr_insn_type = INSN_T1;
11131 else
11132 curr_insn_type = INSN_T2;
11133 }
11134 }
11135 /* Handle VADD, VSUB. */
11136 else if (opc1 == 0x03)
11137 {
11138 if (!bit (arm_insn_r->arm_insn, 9))
11139 {
11140 if (bit (arm_insn_r->arm_insn, 6))
11141 curr_insn_type = INSN_T0;
11142 else
11143 curr_insn_type = INSN_T1;
11144 }
11145 else
11146 {
11147 if (dp_op_sz)
11148 curr_insn_type = INSN_T1;
11149 else
11150 curr_insn_type = INSN_T2;
11151 }
11152 }
11153 /* Handle VDIV. */
11154 else if (opc1 == 0x0b)
11155 {
11156 if (dp_op_sz)
11157 curr_insn_type = INSN_T1;
11158 else
11159 curr_insn_type = INSN_T2;
11160 }
11161 /* Handle all other vfp data processing instructions. */
11162 else if (opc1 == 0x0b)
11163 {
11164 /* Handle VMOV. */
11165 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11166 {
11167 if (bit (arm_insn_r->arm_insn, 4))
11168 {
11169 if (bit (arm_insn_r->arm_insn, 6))
11170 curr_insn_type = INSN_T0;
11171 else
11172 curr_insn_type = INSN_T1;
11173 }
11174 else
11175 {
11176 if (dp_op_sz)
11177 curr_insn_type = INSN_T1;
11178 else
11179 curr_insn_type = INSN_T2;
11180 }
11181 }
11182 /* Handle VNEG and VABS. */
11183 else if ((opc2 == 0x01 && opc3 == 0x01)
11184 || (opc2 == 0x00 && opc3 == 0x03))
11185 {
11186 if (!bit (arm_insn_r->arm_insn, 11))
11187 {
11188 if (bit (arm_insn_r->arm_insn, 6))
11189 curr_insn_type = INSN_T0;
11190 else
11191 curr_insn_type = INSN_T1;
11192 }
11193 else
11194 {
11195 if (dp_op_sz)
11196 curr_insn_type = INSN_T1;
11197 else
11198 curr_insn_type = INSN_T2;
11199 }
11200 }
11201 /* Handle VSQRT. */
11202 else if (opc2 == 0x01 && opc3 == 0x03)
11203 {
11204 if (dp_op_sz)
11205 curr_insn_type = INSN_T1;
11206 else
11207 curr_insn_type = INSN_T2;
11208 }
11209 /* Handle VCVT. */
11210 else if (opc2 == 0x07 && opc3 == 0x03)
11211 {
11212 if (!dp_op_sz)
11213 curr_insn_type = INSN_T1;
11214 else
11215 curr_insn_type = INSN_T2;
11216 }
11217 else if (opc3 & 0x01)
11218 {
11219 /* Handle VCVT. */
11220 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11221 {
11222 if (!bit (arm_insn_r->arm_insn, 18))
11223 curr_insn_type = INSN_T2;
11224 else
11225 {
11226 if (dp_op_sz)
11227 curr_insn_type = INSN_T1;
11228 else
11229 curr_insn_type = INSN_T2;
11230 }
11231 }
11232 /* Handle VCVT. */
11233 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11234 {
11235 if (dp_op_sz)
11236 curr_insn_type = INSN_T1;
11237 else
11238 curr_insn_type = INSN_T2;
11239 }
11240 /* Handle VCVTB, VCVTT. */
11241 else if ((opc2 & 0x0e) == 0x02)
11242 curr_insn_type = INSN_T2;
11243 /* Handle VCMP, VCMPE. */
11244 else if ((opc2 & 0x0e) == 0x04)
11245 curr_insn_type = INSN_T3;
11246 }
11247 }
11248
11249 switch (curr_insn_type)
11250 {
11251 case INSN_T0:
11252 reg_vd = reg_vd | (bit_d << 4);
11253 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11254 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11255 arm_insn_r->reg_rec_count = 2;
11256 break;
11257
11258 case INSN_T1:
11259 reg_vd = reg_vd | (bit_d << 4);
11260 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11261 arm_insn_r->reg_rec_count = 1;
11262 break;
11263
11264 case INSN_T2:
11265 reg_vd = (reg_vd << 1) | bit_d;
11266 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11267 arm_insn_r->reg_rec_count = 1;
11268 break;
11269
11270 case INSN_T3:
11271 record_buf[0] = ARM_FPSCR_REGNUM;
11272 arm_insn_r->reg_rec_count = 1;
11273 break;
11274
11275 default:
11276 gdb_assert_not_reached ("no decoding pattern found");
11277 break;
11278 }
11279
11280 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11281 return 0;
11282}
11283
60cc5e93
OJ
11284/* Handling opcode 110 insns. */
11285
11286static int
11287arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11288{
bec2ab5a 11289 uint32_t op1, op1_ebit, coproc;
60cc5e93
OJ
11290
11291 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11292 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11293 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11294
11295 if ((coproc & 0x0e) == 0x0a)
11296 {
11297 /* Handle extension register ld/st instructions. */
11298 if (!(op1 & 0x20))
f20f80dd 11299 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11300
11301 /* 64-bit transfers between arm core and extension registers. */
11302 if ((op1 & 0x3e) == 0x04)
f20f80dd 11303 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11304 }
11305 else
11306 {
11307 /* Handle coprocessor ld/st instructions. */
11308 if (!(op1 & 0x3a))
11309 {
11310 /* Store. */
11311 if (!op1_ebit)
11312 return arm_record_unsupported_insn (arm_insn_r);
11313 else
11314 /* Load. */
11315 return arm_record_unsupported_insn (arm_insn_r);
11316 }
11317
11318 /* Move to coprocessor from two arm core registers. */
11319 if (op1 == 0x4)
11320 return arm_record_unsupported_insn (arm_insn_r);
11321
11322 /* Move to two arm core registers from coprocessor. */
11323 if (op1 == 0x5)
11324 {
11325 uint32_t reg_t[2];
11326
11327 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11328 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11329 arm_insn_r->reg_rec_count = 2;
11330
11331 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11332 return 0;
11333 }
11334 }
11335 return arm_record_unsupported_insn (arm_insn_r);
11336}
11337
72508ac0
PO
11338/* Handling opcode 111 insns. */
11339
11340static int
11341arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11342{
60cc5e93 11343 uint32_t op, op1_sbit, op1_ebit, coproc;
72508ac0
PO
11344 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11345 struct regcache *reg_cache = arm_insn_r->regcache;
72508ac0
PO
11346
11347 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93
OJ
11348 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11349 op1_sbit = bit (arm_insn_r->arm_insn, 24);
11350 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11351 op = bit (arm_insn_r->arm_insn, 4);
97dfe206
OJ
11352
11353 /* Handle arm SWI/SVC system call instructions. */
60cc5e93 11354 if (op1_sbit)
97dfe206
OJ
11355 {
11356 if (tdep->arm_syscall_record != NULL)
11357 {
11358 ULONGEST svc_operand, svc_number;
11359
11360 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11361
11362 if (svc_operand) /* OABI. */
11363 svc_number = svc_operand - 0x900000;
11364 else /* EABI. */
11365 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11366
60cc5e93 11367 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11368 }
11369 else
11370 {
11371 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11372 return -1;
97dfe206
OJ
11373 }
11374 }
60cc5e93
OJ
11375
11376 if ((coproc & 0x0e) == 0x0a)
11377 {
11378 /* VFP data-processing instructions. */
11379 if (!op1_sbit && !op)
851f26ae 11380 return arm_record_vfp_data_proc_insn (arm_insn_r);
60cc5e93
OJ
11381
11382 /* Advanced SIMD, VFP instructions. */
11383 if (!op1_sbit && op)
5a578da5 11384 return arm_record_vdata_transfer_insn (arm_insn_r);
60cc5e93 11385 }
97dfe206
OJ
11386 else
11387 {
60cc5e93
OJ
11388 /* Coprocessor data operations. */
11389 if (!op1_sbit && !op)
11390 return arm_record_unsupported_insn (arm_insn_r);
11391
11392 /* Move to Coprocessor from ARM core register. */
11393 if (!op1_sbit && !op1_ebit && op)
11394 return arm_record_unsupported_insn (arm_insn_r);
11395
11396 /* Move to arm core register from coprocessor. */
11397 if (!op1_sbit && op1_ebit && op)
11398 {
11399 uint32_t record_buf[1];
11400
11401 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11402 if (record_buf[0] == 15)
11403 record_buf[0] = ARM_PS_REGNUM;
11404
11405 arm_insn_r->reg_rec_count = 1;
11406 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11407 record_buf);
11408 return 0;
11409 }
97dfe206 11410 }
72508ac0 11411
60cc5e93 11412 return arm_record_unsupported_insn (arm_insn_r);
72508ac0
PO
11413}
11414
11415/* Handling opcode 000 insns. */
11416
11417static int
11418thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11419{
11420 uint32_t record_buf[8];
11421 uint32_t reg_src1 = 0;
11422
11423 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11424
11425 record_buf[0] = ARM_PS_REGNUM;
11426 record_buf[1] = reg_src1;
11427 thumb_insn_r->reg_rec_count = 2;
11428
11429 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11430
11431 return 0;
11432}
11433
11434
11435/* Handling opcode 001 insns. */
11436
11437static int
11438thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11439{
11440 uint32_t record_buf[8];
11441 uint32_t reg_src1 = 0;
11442
11443 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11444
11445 record_buf[0] = ARM_PS_REGNUM;
11446 record_buf[1] = reg_src1;
11447 thumb_insn_r->reg_rec_count = 2;
11448
11449 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11450
11451 return 0;
11452}
11453
11454/* Handling opcode 010 insns. */
11455
11456static int
11457thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11458{
11459 struct regcache *reg_cache = thumb_insn_r->regcache;
11460 uint32_t record_buf[8], record_buf_mem[8];
11461
11462 uint32_t reg_src1 = 0, reg_src2 = 0;
11463 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11464
11465 ULONGEST u_regval[2] = {0};
11466
11467 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11468
11469 if (bit (thumb_insn_r->arm_insn, 12))
11470 {
11471 /* Handle load/store register offset. */
11472 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
11473 if (opcode2 >= 12 && opcode2 <= 15)
11474 {
11475 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11476 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11477 record_buf[0] = reg_src1;
11478 thumb_insn_r->reg_rec_count = 1;
11479 }
11480 else if (opcode2 >= 8 && opcode2 <= 10)
11481 {
11482 /* STR(2), STRB(2), STRH(2) . */
11483 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11484 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11485 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11486 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11487 if (8 == opcode2)
11488 record_buf_mem[0] = 4; /* STR (2). */
11489 else if (10 == opcode2)
11490 record_buf_mem[0] = 1; /* STRB (2). */
11491 else if (9 == opcode2)
11492 record_buf_mem[0] = 2; /* STRH (2). */
11493 record_buf_mem[1] = u_regval[0] + u_regval[1];
11494 thumb_insn_r->mem_rec_count = 1;
11495 }
11496 }
11497 else if (bit (thumb_insn_r->arm_insn, 11))
11498 {
11499 /* Handle load from literal pool. */
11500 /* LDR(3). */
11501 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11502 record_buf[0] = reg_src1;
11503 thumb_insn_r->reg_rec_count = 1;
11504 }
11505 else if (opcode1)
11506 {
11507 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11508 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11509 if ((3 == opcode2) && (!opcode3))
11510 {
11511 /* Branch with exchange. */
11512 record_buf[0] = ARM_PS_REGNUM;
11513 thumb_insn_r->reg_rec_count = 1;
11514 }
11515 else
11516 {
11517 /* Format 8; special data processing insns. */
11518 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11519 record_buf[0] = ARM_PS_REGNUM;
11520 record_buf[1] = reg_src1;
11521 thumb_insn_r->reg_rec_count = 2;
11522 }
11523 }
11524 else
11525 {
11526 /* Format 5; data processing insns. */
11527 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11528 if (bit (thumb_insn_r->arm_insn, 7))
11529 {
11530 reg_src1 = reg_src1 + 8;
11531 }
11532 record_buf[0] = ARM_PS_REGNUM;
11533 record_buf[1] = reg_src1;
11534 thumb_insn_r->reg_rec_count = 2;
11535 }
11536
11537 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11538 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11539 record_buf_mem);
11540
11541 return 0;
11542}
11543
11544/* Handling opcode 001 insns. */
11545
11546static int
11547thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11548{
11549 struct regcache *reg_cache = thumb_insn_r->regcache;
11550 uint32_t record_buf[8], record_buf_mem[8];
11551
11552 uint32_t reg_src1 = 0;
11553 uint32_t opcode = 0, immed_5 = 0;
11554
11555 ULONGEST u_regval = 0;
11556
11557 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11558
11559 if (opcode)
11560 {
11561 /* LDR(1). */
11562 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11563 record_buf[0] = reg_src1;
11564 thumb_insn_r->reg_rec_count = 1;
11565 }
11566 else
11567 {
11568 /* STR(1). */
11569 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11570 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11571 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11572 record_buf_mem[0] = 4;
11573 record_buf_mem[1] = u_regval + (immed_5 * 4);
11574 thumb_insn_r->mem_rec_count = 1;
11575 }
11576
11577 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11578 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11579 record_buf_mem);
11580
11581 return 0;
11582}
11583
11584/* Handling opcode 100 insns. */
11585
11586static int
11587thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11588{
11589 struct regcache *reg_cache = thumb_insn_r->regcache;
11590 uint32_t record_buf[8], record_buf_mem[8];
11591
11592 uint32_t reg_src1 = 0;
11593 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11594
11595 ULONGEST u_regval = 0;
11596
11597 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11598
11599 if (3 == opcode)
11600 {
11601 /* LDR(4). */
11602 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11603 record_buf[0] = reg_src1;
11604 thumb_insn_r->reg_rec_count = 1;
11605 }
11606 else if (1 == opcode)
11607 {
11608 /* LDRH(1). */
11609 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11610 record_buf[0] = reg_src1;
11611 thumb_insn_r->reg_rec_count = 1;
11612 }
11613 else if (2 == opcode)
11614 {
11615 /* STR(3). */
11616 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11617 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11618 record_buf_mem[0] = 4;
11619 record_buf_mem[1] = u_regval + (immed_8 * 4);
11620 thumb_insn_r->mem_rec_count = 1;
11621 }
11622 else if (0 == opcode)
11623 {
11624 /* STRH(1). */
11625 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11626 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11627 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11628 record_buf_mem[0] = 2;
11629 record_buf_mem[1] = u_regval + (immed_5 * 2);
11630 thumb_insn_r->mem_rec_count = 1;
11631 }
11632
11633 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11634 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11635 record_buf_mem);
11636
11637 return 0;
11638}
11639
11640/* Handling opcode 101 insns. */
11641
11642static int
11643thumb_record_misc (insn_decode_record *thumb_insn_r)
11644{
11645 struct regcache *reg_cache = thumb_insn_r->regcache;
11646
11647 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
11648 uint32_t register_bits = 0, register_count = 0;
bec2ab5a 11649 uint32_t index = 0, start_address = 0;
72508ac0
PO
11650 uint32_t record_buf[24], record_buf_mem[48];
11651 uint32_t reg_src1;
11652
11653 ULONGEST u_regval = 0;
11654
11655 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11656 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11657 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
11658
11659 if (14 == opcode2)
11660 {
11661 /* POP. */
11662 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11663 while (register_bits)
f969241e
OJ
11664 {
11665 if (register_bits & 0x00000001)
11666 record_buf[index++] = register_count;
11667 register_bits = register_bits >> 1;
11668 register_count++;
11669 }
11670 record_buf[index++] = ARM_PS_REGNUM;
11671 record_buf[index++] = ARM_SP_REGNUM;
11672 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11673 }
11674 else if (10 == opcode2)
11675 {
11676 /* PUSH. */
11677 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
9904a494 11678 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
72508ac0
PO
11679 while (register_bits)
11680 {
11681 if (register_bits & 0x00000001)
11682 register_count++;
11683 register_bits = register_bits >> 1;
11684 }
11685 start_address = u_regval - \
11686 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11687 thumb_insn_r->mem_rec_count = register_count;
11688 while (register_count)
11689 {
11690 record_buf_mem[(register_count * 2) - 1] = start_address;
11691 record_buf_mem[(register_count * 2) - 2] = 4;
11692 start_address = start_address + 4;
11693 register_count--;
11694 }
11695 record_buf[0] = ARM_SP_REGNUM;
11696 thumb_insn_r->reg_rec_count = 1;
11697 }
11698 else if (0x1E == opcode1)
11699 {
11700 /* BKPT insn. */
11701 /* Handle enhanced software breakpoint insn, BKPT. */
11702 /* CPSR is changed to be executed in ARM state, disabling normal
11703 interrupts, entering abort mode. */
11704 /* According to high vector configuration PC is set. */
11705 /* User hits breakpoint and type reverse, in that case, we need to go back with
11706 previous CPSR and Program Counter. */
11707 record_buf[0] = ARM_PS_REGNUM;
11708 record_buf[1] = ARM_LR_REGNUM;
11709 thumb_insn_r->reg_rec_count = 2;
11710 /* We need to save SPSR value, which is not yet done. */
11711 printf_unfiltered (_("Process record does not support instruction "
11712 "0x%0x at address %s.\n"),
11713 thumb_insn_r->arm_insn,
11714 paddress (thumb_insn_r->gdbarch,
11715 thumb_insn_r->this_addr));
11716 return -1;
11717 }
11718 else if ((0 == opcode) || (1 == opcode))
11719 {
11720 /* ADD(5), ADD(6). */
11721 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11722 record_buf[0] = reg_src1;
11723 thumb_insn_r->reg_rec_count = 1;
11724 }
11725 else if (2 == opcode)
11726 {
11727 /* ADD(7), SUB(4). */
11728 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11729 record_buf[0] = ARM_SP_REGNUM;
11730 thumb_insn_r->reg_rec_count = 1;
11731 }
11732
11733 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11734 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11735 record_buf_mem);
11736
11737 return 0;
11738}
11739
11740/* Handling opcode 110 insns. */
11741
11742static int
11743thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
11744{
11745 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
11746 struct regcache *reg_cache = thumb_insn_r->regcache;
11747
11748 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
11749 uint32_t reg_src1 = 0;
11750 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
bec2ab5a 11751 uint32_t index = 0, start_address = 0;
72508ac0
PO
11752 uint32_t record_buf[24], record_buf_mem[48];
11753
11754 ULONGEST u_regval = 0;
11755
11756 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11757 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
11758
11759 if (1 == opcode2)
11760 {
11761
11762 /* LDMIA. */
11763 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11764 /* Get Rn. */
11765 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11766 while (register_bits)
11767 {
11768 if (register_bits & 0x00000001)
f969241e 11769 record_buf[index++] = register_count;
72508ac0 11770 register_bits = register_bits >> 1;
f969241e 11771 register_count++;
72508ac0 11772 }
f969241e
OJ
11773 record_buf[index++] = reg_src1;
11774 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11775 }
11776 else if (0 == opcode2)
11777 {
11778 /* It handles both STMIA. */
11779 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11780 /* Get Rn. */
11781 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11782 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11783 while (register_bits)
11784 {
11785 if (register_bits & 0x00000001)
11786 register_count++;
11787 register_bits = register_bits >> 1;
11788 }
11789 start_address = u_regval;
11790 thumb_insn_r->mem_rec_count = register_count;
11791 while (register_count)
11792 {
11793 record_buf_mem[(register_count * 2) - 1] = start_address;
11794 record_buf_mem[(register_count * 2) - 2] = 4;
11795 start_address = start_address + 4;
11796 register_count--;
11797 }
11798 }
11799 else if (0x1F == opcode1)
11800 {
11801 /* Handle arm syscall insn. */
97dfe206 11802 if (tdep->arm_syscall_record != NULL)
72508ac0 11803 {
97dfe206
OJ
11804 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
11805 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
11806 }
11807 else
11808 {
11809 printf_unfiltered (_("no syscall record support\n"));
11810 return -1;
11811 }
11812 }
11813
11814 /* B (1), conditional branch is automatically taken care in process_record,
11815 as PC is saved there. */
11816
11817 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11818 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11819 record_buf_mem);
11820
11821 return ret;
11822}
11823
11824/* Handling opcode 111 insns. */
11825
11826static int
11827thumb_record_branch (insn_decode_record *thumb_insn_r)
11828{
11829 uint32_t record_buf[8];
11830 uint32_t bits_h = 0;
11831
11832 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
11833
11834 if (2 == bits_h || 3 == bits_h)
11835 {
11836 /* BL */
11837 record_buf[0] = ARM_LR_REGNUM;
11838 thumb_insn_r->reg_rec_count = 1;
11839 }
11840 else if (1 == bits_h)
11841 {
11842 /* BLX(1). */
11843 record_buf[0] = ARM_PS_REGNUM;
11844 record_buf[1] = ARM_LR_REGNUM;
11845 thumb_insn_r->reg_rec_count = 2;
11846 }
11847
11848 /* B(2) is automatically taken care in process_record, as PC is
11849 saved there. */
11850
11851 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11852
11853 return 0;
11854}
11855
c6ec2b30
OJ
11856/* Handler for thumb2 load/store multiple instructions. */
11857
11858static int
11859thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
11860{
11861 struct regcache *reg_cache = thumb2_insn_r->regcache;
11862
11863 uint32_t reg_rn, op;
11864 uint32_t register_bits = 0, register_count = 0;
11865 uint32_t index = 0, start_address = 0;
11866 uint32_t record_buf[24], record_buf_mem[48];
11867
11868 ULONGEST u_regval = 0;
11869
11870 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11871 op = bits (thumb2_insn_r->arm_insn, 23, 24);
11872
11873 if (0 == op || 3 == op)
11874 {
11875 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11876 {
11877 /* Handle RFE instruction. */
11878 record_buf[0] = ARM_PS_REGNUM;
11879 thumb2_insn_r->reg_rec_count = 1;
11880 }
11881 else
11882 {
11883 /* Handle SRS instruction after reading banked SP. */
11884 return arm_record_unsupported_insn (thumb2_insn_r);
11885 }
11886 }
11887 else if (1 == op || 2 == op)
11888 {
11889 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11890 {
11891 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
11892 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11893 while (register_bits)
11894 {
11895 if (register_bits & 0x00000001)
11896 record_buf[index++] = register_count;
11897
11898 register_count++;
11899 register_bits = register_bits >> 1;
11900 }
11901 record_buf[index++] = reg_rn;
11902 record_buf[index++] = ARM_PS_REGNUM;
11903 thumb2_insn_r->reg_rec_count = index;
11904 }
11905 else
11906 {
11907 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
11908 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11909 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11910 while (register_bits)
11911 {
11912 if (register_bits & 0x00000001)
11913 register_count++;
11914
11915 register_bits = register_bits >> 1;
11916 }
11917
11918 if (1 == op)
11919 {
11920 /* Start address calculation for LDMDB/LDMEA. */
11921 start_address = u_regval;
11922 }
11923 else if (2 == op)
11924 {
11925 /* Start address calculation for LDMDB/LDMEA. */
11926 start_address = u_regval - register_count * 4;
11927 }
11928
11929 thumb2_insn_r->mem_rec_count = register_count;
11930 while (register_count)
11931 {
11932 record_buf_mem[register_count * 2 - 1] = start_address;
11933 record_buf_mem[register_count * 2 - 2] = 4;
11934 start_address = start_address + 4;
11935 register_count--;
11936 }
11937 record_buf[0] = reg_rn;
11938 record_buf[1] = ARM_PS_REGNUM;
11939 thumb2_insn_r->reg_rec_count = 2;
11940 }
11941 }
11942
11943 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
11944 record_buf_mem);
11945 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
11946 record_buf);
11947 return ARM_RECORD_SUCCESS;
11948}
11949
11950/* Handler for thumb2 load/store (dual/exclusive) and table branch
11951 instructions. */
11952
11953static int
11954thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
11955{
11956 struct regcache *reg_cache = thumb2_insn_r->regcache;
11957
11958 uint32_t reg_rd, reg_rn, offset_imm;
11959 uint32_t reg_dest1, reg_dest2;
11960 uint32_t address, offset_addr;
11961 uint32_t record_buf[8], record_buf_mem[8];
11962 uint32_t op1, op2, op3;
c6ec2b30
OJ
11963
11964 ULONGEST u_regval[2];
11965
11966 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
11967 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
11968 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
11969
11970 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11971 {
11972 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
11973 {
11974 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
11975 record_buf[0] = reg_dest1;
11976 record_buf[1] = ARM_PS_REGNUM;
11977 thumb2_insn_r->reg_rec_count = 2;
11978 }
11979
11980 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
11981 {
11982 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
11983 record_buf[2] = reg_dest2;
11984 thumb2_insn_r->reg_rec_count = 3;
11985 }
11986 }
11987 else
11988 {
11989 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11990 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
11991
11992 if (0 == op1 && 0 == op2)
11993 {
11994 /* Handle STREX. */
11995 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
11996 address = u_regval[0] + (offset_imm * 4);
11997 record_buf_mem[0] = 4;
11998 record_buf_mem[1] = address;
11999 thumb2_insn_r->mem_rec_count = 1;
12000 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12001 record_buf[0] = reg_rd;
12002 thumb2_insn_r->reg_rec_count = 1;
12003 }
12004 else if (1 == op1 && 0 == op2)
12005 {
12006 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12007 record_buf[0] = reg_rd;
12008 thumb2_insn_r->reg_rec_count = 1;
12009 address = u_regval[0];
12010 record_buf_mem[1] = address;
12011
12012 if (4 == op3)
12013 {
12014 /* Handle STREXB. */
12015 record_buf_mem[0] = 1;
12016 thumb2_insn_r->mem_rec_count = 1;
12017 }
12018 else if (5 == op3)
12019 {
12020 /* Handle STREXH. */
12021 record_buf_mem[0] = 2 ;
12022 thumb2_insn_r->mem_rec_count = 1;
12023 }
12024 else if (7 == op3)
12025 {
12026 /* Handle STREXD. */
12027 address = u_regval[0];
12028 record_buf_mem[0] = 4;
12029 record_buf_mem[2] = 4;
12030 record_buf_mem[3] = address + 4;
12031 thumb2_insn_r->mem_rec_count = 2;
12032 }
12033 }
12034 else
12035 {
12036 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12037
12038 if (bit (thumb2_insn_r->arm_insn, 24))
12039 {
12040 if (bit (thumb2_insn_r->arm_insn, 23))
12041 offset_addr = u_regval[0] + (offset_imm * 4);
12042 else
12043 offset_addr = u_regval[0] - (offset_imm * 4);
12044
12045 address = offset_addr;
12046 }
12047 else
12048 address = u_regval[0];
12049
12050 record_buf_mem[0] = 4;
12051 record_buf_mem[1] = address;
12052 record_buf_mem[2] = 4;
12053 record_buf_mem[3] = address + 4;
12054 thumb2_insn_r->mem_rec_count = 2;
12055 record_buf[0] = reg_rn;
12056 thumb2_insn_r->reg_rec_count = 1;
12057 }
12058 }
12059
12060 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12061 record_buf);
12062 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12063 record_buf_mem);
12064 return ARM_RECORD_SUCCESS;
12065}
12066
12067/* Handler for thumb2 data processing (shift register and modified immediate)
12068 instructions. */
12069
12070static int
12071thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12072{
12073 uint32_t reg_rd, op;
12074 uint32_t record_buf[8];
12075
12076 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12077 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12078
12079 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12080 {
12081 record_buf[0] = ARM_PS_REGNUM;
12082 thumb2_insn_r->reg_rec_count = 1;
12083 }
12084 else
12085 {
12086 record_buf[0] = reg_rd;
12087 record_buf[1] = ARM_PS_REGNUM;
12088 thumb2_insn_r->reg_rec_count = 2;
12089 }
12090
12091 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12092 record_buf);
12093 return ARM_RECORD_SUCCESS;
12094}
12095
12096/* Generic handler for thumb2 instructions which effect destination and PS
12097 registers. */
12098
12099static int
12100thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12101{
12102 uint32_t reg_rd;
12103 uint32_t record_buf[8];
12104
12105 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12106
12107 record_buf[0] = reg_rd;
12108 record_buf[1] = ARM_PS_REGNUM;
12109 thumb2_insn_r->reg_rec_count = 2;
12110
12111 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12112 record_buf);
12113 return ARM_RECORD_SUCCESS;
12114}
12115
12116/* Handler for thumb2 branch and miscellaneous control instructions. */
12117
12118static int
12119thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12120{
12121 uint32_t op, op1, op2;
12122 uint32_t record_buf[8];
12123
12124 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12125 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12126 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12127
12128 /* Handle MSR insn. */
12129 if (!(op1 & 0x2) && 0x38 == op)
12130 {
12131 if (!(op2 & 0x3))
12132 {
12133 /* CPSR is going to be changed. */
12134 record_buf[0] = ARM_PS_REGNUM;
12135 thumb2_insn_r->reg_rec_count = 1;
12136 }
12137 else
12138 {
12139 arm_record_unsupported_insn(thumb2_insn_r);
12140 return -1;
12141 }
12142 }
12143 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12144 {
12145 /* BLX. */
12146 record_buf[0] = ARM_PS_REGNUM;
12147 record_buf[1] = ARM_LR_REGNUM;
12148 thumb2_insn_r->reg_rec_count = 2;
12149 }
12150
12151 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12152 record_buf);
12153 return ARM_RECORD_SUCCESS;
12154}
12155
12156/* Handler for thumb2 store single data item instructions. */
12157
12158static int
12159thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12160{
12161 struct regcache *reg_cache = thumb2_insn_r->regcache;
12162
12163 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12164 uint32_t address, offset_addr;
12165 uint32_t record_buf[8], record_buf_mem[8];
12166 uint32_t op1, op2;
12167
12168 ULONGEST u_regval[2];
12169
12170 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12171 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12172 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12173 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12174
12175 if (bit (thumb2_insn_r->arm_insn, 23))
12176 {
12177 /* T2 encoding. */
12178 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12179 offset_addr = u_regval[0] + offset_imm;
12180 address = offset_addr;
12181 }
12182 else
12183 {
12184 /* T3 encoding. */
12185 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12186 {
12187 /* Handle STRB (register). */
12188 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12189 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12190 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12191 offset_addr = u_regval[1] << shift_imm;
12192 address = u_regval[0] + offset_addr;
12193 }
12194 else
12195 {
12196 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12197 if (bit (thumb2_insn_r->arm_insn, 10))
12198 {
12199 if (bit (thumb2_insn_r->arm_insn, 9))
12200 offset_addr = u_regval[0] + offset_imm;
12201 else
12202 offset_addr = u_regval[0] - offset_imm;
12203
12204 address = offset_addr;
12205 }
12206 else
12207 address = u_regval[0];
12208 }
12209 }
12210
12211 switch (op1)
12212 {
12213 /* Store byte instructions. */
12214 case 4:
12215 case 0:
12216 record_buf_mem[0] = 1;
12217 break;
12218 /* Store half word instructions. */
12219 case 1:
12220 case 5:
12221 record_buf_mem[0] = 2;
12222 break;
12223 /* Store word instructions. */
12224 case 2:
12225 case 6:
12226 record_buf_mem[0] = 4;
12227 break;
12228
12229 default:
12230 gdb_assert_not_reached ("no decoding pattern found");
12231 break;
12232 }
12233
12234 record_buf_mem[1] = address;
12235 thumb2_insn_r->mem_rec_count = 1;
12236 record_buf[0] = reg_rn;
12237 thumb2_insn_r->reg_rec_count = 1;
12238
12239 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12240 record_buf);
12241 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12242 record_buf_mem);
12243 return ARM_RECORD_SUCCESS;
12244}
12245
12246/* Handler for thumb2 load memory hints instructions. */
12247
12248static int
12249thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12250{
12251 uint32_t record_buf[8];
12252 uint32_t reg_rt, reg_rn;
12253
12254 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12255 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12256
12257 if (ARM_PC_REGNUM != reg_rt)
12258 {
12259 record_buf[0] = reg_rt;
12260 record_buf[1] = reg_rn;
12261 record_buf[2] = ARM_PS_REGNUM;
12262 thumb2_insn_r->reg_rec_count = 3;
12263
12264 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12265 record_buf);
12266 return ARM_RECORD_SUCCESS;
12267 }
12268
12269 return ARM_RECORD_FAILURE;
12270}
12271
12272/* Handler for thumb2 load word instructions. */
12273
12274static int
12275thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12276{
c6ec2b30
OJ
12277 uint32_t record_buf[8];
12278
12279 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12280 record_buf[1] = ARM_PS_REGNUM;
12281 thumb2_insn_r->reg_rec_count = 2;
12282
12283 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12284 record_buf);
12285 return ARM_RECORD_SUCCESS;
12286}
12287
12288/* Handler for thumb2 long multiply, long multiply accumulate, and
12289 divide instructions. */
12290
12291static int
12292thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12293{
12294 uint32_t opcode1 = 0, opcode2 = 0;
12295 uint32_t record_buf[8];
c6ec2b30
OJ
12296
12297 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12298 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12299
12300 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12301 {
12302 /* Handle SMULL, UMULL, SMULAL. */
12303 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12304 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12305 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12306 record_buf[2] = ARM_PS_REGNUM;
12307 thumb2_insn_r->reg_rec_count = 3;
12308 }
12309 else if (1 == opcode1 || 3 == opcode2)
12310 {
12311 /* Handle SDIV and UDIV. */
12312 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12313 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12314 record_buf[2] = ARM_PS_REGNUM;
12315 thumb2_insn_r->reg_rec_count = 3;
12316 }
12317 else
12318 return ARM_RECORD_FAILURE;
12319
12320 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12321 record_buf);
12322 return ARM_RECORD_SUCCESS;
12323}
12324
60cc5e93
OJ
12325/* Record handler for thumb32 coprocessor instructions. */
12326
12327static int
12328thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12329{
12330 if (bit (thumb2_insn_r->arm_insn, 25))
12331 return arm_record_coproc_data_proc (thumb2_insn_r);
12332 else
12333 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12334}
12335
1e1b6563
OJ
12336/* Record handler for advance SIMD structure load/store instructions. */
12337
12338static int
12339thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12340{
12341 struct regcache *reg_cache = thumb2_insn_r->regcache;
12342 uint32_t l_bit, a_bit, b_bits;
12343 uint32_t record_buf[128], record_buf_mem[128];
bec2ab5a 12344 uint32_t reg_rn, reg_vd, address, f_elem;
1e1b6563
OJ
12345 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12346 uint8_t f_ebytes;
12347
12348 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12349 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12350 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12351 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12352 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12353 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12354 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
1e1b6563
OJ
12355 f_elem = 8 / f_ebytes;
12356
12357 if (!l_bit)
12358 {
12359 ULONGEST u_regval = 0;
12360 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12361 address = u_regval;
12362
12363 if (!a_bit)
12364 {
12365 /* Handle VST1. */
12366 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12367 {
12368 if (b_bits == 0x07)
12369 bf_regs = 1;
12370 else if (b_bits == 0x0a)
12371 bf_regs = 2;
12372 else if (b_bits == 0x06)
12373 bf_regs = 3;
12374 else if (b_bits == 0x02)
12375 bf_regs = 4;
12376 else
12377 bf_regs = 0;
12378
12379 for (index_r = 0; index_r < bf_regs; index_r++)
12380 {
12381 for (index_e = 0; index_e < f_elem; index_e++)
12382 {
12383 record_buf_mem[index_m++] = f_ebytes;
12384 record_buf_mem[index_m++] = address;
12385 address = address + f_ebytes;
12386 thumb2_insn_r->mem_rec_count += 1;
12387 }
12388 }
12389 }
12390 /* Handle VST2. */
12391 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12392 {
12393 if (b_bits == 0x09 || b_bits == 0x08)
12394 bf_regs = 1;
12395 else if (b_bits == 0x03)
12396 bf_regs = 2;
12397 else
12398 bf_regs = 0;
12399
12400 for (index_r = 0; index_r < bf_regs; index_r++)
12401 for (index_e = 0; index_e < f_elem; index_e++)
12402 {
12403 for (loop_t = 0; loop_t < 2; loop_t++)
12404 {
12405 record_buf_mem[index_m++] = f_ebytes;
12406 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12407 thumb2_insn_r->mem_rec_count += 1;
12408 }
12409 address = address + (2 * f_ebytes);
12410 }
12411 }
12412 /* Handle VST3. */
12413 else if ((b_bits & 0x0e) == 0x04)
12414 {
12415 for (index_e = 0; index_e < f_elem; index_e++)
12416 {
12417 for (loop_t = 0; loop_t < 3; loop_t++)
12418 {
12419 record_buf_mem[index_m++] = f_ebytes;
12420 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12421 thumb2_insn_r->mem_rec_count += 1;
12422 }
12423 address = address + (3 * f_ebytes);
12424 }
12425 }
12426 /* Handle VST4. */
12427 else if (!(b_bits & 0x0e))
12428 {
12429 for (index_e = 0; index_e < f_elem; index_e++)
12430 {
12431 for (loop_t = 0; loop_t < 4; loop_t++)
12432 {
12433 record_buf_mem[index_m++] = f_ebytes;
12434 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12435 thumb2_insn_r->mem_rec_count += 1;
12436 }
12437 address = address + (4 * f_ebytes);
12438 }
12439 }
12440 }
12441 else
12442 {
12443 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12444
12445 if (bft_size == 0x00)
12446 f_ebytes = 1;
12447 else if (bft_size == 0x01)
12448 f_ebytes = 2;
12449 else if (bft_size == 0x02)
12450 f_ebytes = 4;
12451 else
12452 f_ebytes = 0;
12453
12454 /* Handle VST1. */
12455 if (!(b_bits & 0x0b) || b_bits == 0x08)
12456 thumb2_insn_r->mem_rec_count = 1;
12457 /* Handle VST2. */
12458 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12459 thumb2_insn_r->mem_rec_count = 2;
12460 /* Handle VST3. */
12461 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12462 thumb2_insn_r->mem_rec_count = 3;
12463 /* Handle VST4. */
12464 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12465 thumb2_insn_r->mem_rec_count = 4;
12466
12467 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12468 {
12469 record_buf_mem[index_m] = f_ebytes;
12470 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12471 }
12472 }
12473 }
12474 else
12475 {
12476 if (!a_bit)
12477 {
12478 /* Handle VLD1. */
12479 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12480 thumb2_insn_r->reg_rec_count = 1;
12481 /* Handle VLD2. */
12482 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12483 thumb2_insn_r->reg_rec_count = 2;
12484 /* Handle VLD3. */
12485 else if ((b_bits & 0x0e) == 0x04)
12486 thumb2_insn_r->reg_rec_count = 3;
12487 /* Handle VLD4. */
12488 else if (!(b_bits & 0x0e))
12489 thumb2_insn_r->reg_rec_count = 4;
12490 }
12491 else
12492 {
12493 /* Handle VLD1. */
12494 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12495 thumb2_insn_r->reg_rec_count = 1;
12496 /* Handle VLD2. */
12497 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12498 thumb2_insn_r->reg_rec_count = 2;
12499 /* Handle VLD3. */
12500 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12501 thumb2_insn_r->reg_rec_count = 3;
12502 /* Handle VLD4. */
12503 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12504 thumb2_insn_r->reg_rec_count = 4;
12505
12506 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12507 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12508 }
12509 }
12510
12511 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12512 {
12513 record_buf[index_r] = reg_rn;
12514 thumb2_insn_r->reg_rec_count += 1;
12515 }
12516
12517 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12518 record_buf);
12519 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12520 record_buf_mem);
12521 return 0;
12522}
12523
c6ec2b30
OJ
12524/* Decodes thumb2 instruction type and invokes its record handler. */
12525
12526static unsigned int
12527thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12528{
12529 uint32_t op, op1, op2;
12530
12531 op = bit (thumb2_insn_r->arm_insn, 15);
12532 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12533 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12534
12535 if (op1 == 0x01)
12536 {
12537 if (!(op2 & 0x64 ))
12538 {
12539 /* Load/store multiple instruction. */
12540 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12541 }
12542 else if (!((op2 & 0x64) ^ 0x04))
12543 {
12544 /* Load/store (dual/exclusive) and table branch instruction. */
12545 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12546 }
12547 else if (!((op2 & 0x20) ^ 0x20))
12548 {
12549 /* Data-processing (shifted register). */
12550 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12551 }
12552 else if (op2 & 0x40)
12553 {
12554 /* Co-processor instructions. */
60cc5e93 12555 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12556 }
12557 }
12558 else if (op1 == 0x02)
12559 {
12560 if (op)
12561 {
12562 /* Branches and miscellaneous control instructions. */
12563 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12564 }
12565 else if (op2 & 0x20)
12566 {
12567 /* Data-processing (plain binary immediate) instruction. */
12568 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12569 }
12570 else
12571 {
12572 /* Data-processing (modified immediate). */
12573 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12574 }
12575 }
12576 else if (op1 == 0x03)
12577 {
12578 if (!(op2 & 0x71 ))
12579 {
12580 /* Store single data item. */
12581 return thumb2_record_str_single_data (thumb2_insn_r);
12582 }
12583 else if (!((op2 & 0x71) ^ 0x10))
12584 {
12585 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12586 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12587 }
12588 else if (!((op2 & 0x67) ^ 0x01))
12589 {
12590 /* Load byte, memory hints instruction. */
12591 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12592 }
12593 else if (!((op2 & 0x67) ^ 0x03))
12594 {
12595 /* Load halfword, memory hints instruction. */
12596 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12597 }
12598 else if (!((op2 & 0x67) ^ 0x05))
12599 {
12600 /* Load word instruction. */
12601 return thumb2_record_ld_word (thumb2_insn_r);
12602 }
12603 else if (!((op2 & 0x70) ^ 0x20))
12604 {
12605 /* Data-processing (register) instruction. */
12606 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12607 }
12608 else if (!((op2 & 0x78) ^ 0x30))
12609 {
12610 /* Multiply, multiply accumulate, abs diff instruction. */
12611 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12612 }
12613 else if (!((op2 & 0x78) ^ 0x38))
12614 {
12615 /* Long multiply, long multiply accumulate, and divide. */
12616 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12617 }
12618 else if (op2 & 0x40)
12619 {
12620 /* Co-processor instructions. */
60cc5e93 12621 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12622 }
12623 }
12624
12625 return -1;
12626}
72508ac0
PO
12627
12628/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12629and positive val on fauilure. */
12630
12631static int
12632extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
12633{
12634 gdb_byte buf[insn_size];
12635
12636 memset (&buf[0], 0, insn_size);
12637
12638 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
12639 return 1;
12640 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12641 insn_size,
2959fed9 12642 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
12643 return 0;
12644}
12645
12646typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12647
12648/* Decode arm/thumb insn depending on condition cods and opcodes; and
12649 dispatch it. */
12650
12651static int
12652decode_insn (insn_decode_record *arm_record, record_type_t record_type,
12653 uint32_t insn_size)
12654{
12655
12656 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
0fa9c223 12657 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
12658 {
12659 arm_record_data_proc_misc_ld_str, /* 000. */
12660 arm_record_data_proc_imm, /* 001. */
12661 arm_record_ld_st_imm_offset, /* 010. */
12662 arm_record_ld_st_reg_offset, /* 011. */
12663 arm_record_ld_st_multiple, /* 100. */
12664 arm_record_b_bl, /* 101. */
60cc5e93 12665 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
12666 arm_record_coproc_data_proc /* 111. */
12667 };
12668
12669 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
0fa9c223 12670 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
12671 { \
12672 thumb_record_shift_add_sub, /* 000. */
12673 thumb_record_add_sub_cmp_mov, /* 001. */
12674 thumb_record_ld_st_reg_offset, /* 010. */
12675 thumb_record_ld_st_imm_offset, /* 011. */
12676 thumb_record_ld_st_stack, /* 100. */
12677 thumb_record_misc, /* 101. */
12678 thumb_record_ldm_stm_swi, /* 110. */
12679 thumb_record_branch /* 111. */
12680 };
12681
12682 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12683 uint32_t insn_id = 0;
12684
12685 if (extract_arm_insn (arm_record, insn_size))
12686 {
12687 if (record_debug)
12688 {
12689 printf_unfiltered (_("Process record: error reading memory at "
12690 "addr %s len = %d.\n"),
12691 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
12692 }
12693 return -1;
12694 }
12695 else if (ARM_RECORD == record_type)
12696 {
12697 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
12698 insn_id = bits (arm_record->arm_insn, 25, 27);
12699 ret = arm_record_extension_space (arm_record);
12700 /* If this insn has fallen into extension space
12701 then we need not decode it anymore. */
12702 if (ret != -1 && !INSN_RECORDED(arm_record))
12703 {
12704 ret = arm_handle_insn[insn_id] (arm_record);
12705 }
12706 }
12707 else if (THUMB_RECORD == record_type)
12708 {
12709 /* As thumb does not have condition codes, we set negative. */
12710 arm_record->cond = -1;
12711 insn_id = bits (arm_record->arm_insn, 13, 15);
12712 ret = thumb_handle_insn[insn_id] (arm_record);
12713 }
12714 else if (THUMB2_RECORD == record_type)
12715 {
c6ec2b30
OJ
12716 /* As thumb does not have condition codes, we set negative. */
12717 arm_record->cond = -1;
12718
12719 /* Swap first half of 32bit thumb instruction with second half. */
12720 arm_record->arm_insn
12721 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
12722
12723 insn_id = thumb2_record_decode_insn_handler (arm_record);
12724
12725 if (insn_id != ARM_RECORD_SUCCESS)
12726 {
12727 arm_record_unsupported_insn (arm_record);
12728 ret = -1;
12729 }
72508ac0
PO
12730 }
12731 else
12732 {
12733 /* Throw assertion. */
12734 gdb_assert_not_reached ("not a valid instruction, could not decode");
12735 }
12736
12737 return ret;
12738}
12739
12740
12741/* Cleans up local record registers and memory allocations. */
12742
12743static void
12744deallocate_reg_mem (insn_decode_record *record)
12745{
12746 xfree (record->arm_regs);
12747 xfree (record->arm_mems);
12748}
12749
12750
12751/* Parse the current instruction and record the values of the registers and
12752 memory that will be changed in current instruction to record_arch_list".
12753 Return -1 if something is wrong. */
12754
12755int
12756arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
12757 CORE_ADDR insn_addr)
12758{
12759
72508ac0
PO
12760 uint32_t no_of_rec = 0;
12761 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
12762 ULONGEST t_bit = 0, insn_id = 0;
12763
12764 ULONGEST u_regval = 0;
12765
12766 insn_decode_record arm_record;
12767
12768 memset (&arm_record, 0, sizeof (insn_decode_record));
12769 arm_record.regcache = regcache;
12770 arm_record.this_addr = insn_addr;
12771 arm_record.gdbarch = gdbarch;
12772
12773
12774 if (record_debug > 1)
12775 {
12776 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
12777 "addr = %s\n",
12778 paddress (gdbarch, arm_record.this_addr));
12779 }
12780
12781 if (extract_arm_insn (&arm_record, 2))
12782 {
12783 if (record_debug)
12784 {
12785 printf_unfiltered (_("Process record: error reading memory at "
12786 "addr %s len = %d.\n"),
12787 paddress (arm_record.gdbarch,
12788 arm_record.this_addr), 2);
12789 }
12790 return -1;
12791 }
12792
12793 /* Check the insn, whether it is thumb or arm one. */
12794
12795 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
12796 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
12797
12798
12799 if (!(u_regval & t_bit))
12800 {
12801 /* We are decoding arm insn. */
12802 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
12803 }
12804 else
12805 {
12806 insn_id = bits (arm_record.arm_insn, 11, 15);
12807 /* is it thumb2 insn? */
12808 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
12809 {
12810 ret = decode_insn (&arm_record, THUMB2_RECORD,
12811 THUMB2_INSN_SIZE_BYTES);
12812 }
12813 else
12814 {
12815 /* We are decoding thumb insn. */
12816 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
12817 }
12818 }
12819
12820 if (0 == ret)
12821 {
12822 /* Record registers. */
25ea693b 12823 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0
PO
12824 if (arm_record.arm_regs)
12825 {
12826 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
12827 {
25ea693b
MM
12828 if (record_full_arch_list_add_reg
12829 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
72508ac0
PO
12830 ret = -1;
12831 }
12832 }
12833 /* Record memories. */
12834 if (arm_record.arm_mems)
12835 {
12836 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
12837 {
25ea693b 12838 if (record_full_arch_list_add_mem
72508ac0 12839 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 12840 arm_record.arm_mems[no_of_rec].len))
72508ac0
PO
12841 ret = -1;
12842 }
12843 }
12844
25ea693b 12845 if (record_full_arch_list_add_end ())
72508ac0
PO
12846 ret = -1;
12847 }
12848
12849
12850 deallocate_reg_mem (&arm_record);
12851
12852 return ret;
12853}
12854
This page took 2.183487 seconds and 4 git commands to generate.