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
d9311bfa
AT
240/* get_next_pcs operations. */
241static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
242 arm_get_next_pcs_read_memory_unsigned_integer,
243 arm_get_next_pcs_syscall_next_pc,
244 arm_get_next_pcs_addr_bits_remove,
245 arm_get_next_pcs_is_thumb
246};
247
9b8d791a 248struct arm_prologue_cache
c3b4394c 249{
eb5492fa
DJ
250 /* The stack pointer at the time this frame was created; i.e. the
251 caller's stack pointer when this function was called. It is used
252 to identify this frame. */
253 CORE_ADDR prev_sp;
254
4be43953
DJ
255 /* The frame base for this frame is just prev_sp - frame size.
256 FRAMESIZE is the distance from the frame pointer to the
257 initial stack pointer. */
eb5492fa 258
c3b4394c 259 int framesize;
eb5492fa
DJ
260
261 /* The register used to hold the frame pointer for this frame. */
c3b4394c 262 int framereg;
eb5492fa
DJ
263
264 /* Saved register offsets. */
265 struct trad_frame_saved_reg *saved_regs;
c3b4394c 266};
ed9a39eb 267
0d39a070
DJ
268static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
269 CORE_ADDR prologue_start,
270 CORE_ADDR prologue_end,
271 struct arm_prologue_cache *cache);
272
cca44b1b
JB
273/* Architecture version for displaced stepping. This effects the behaviour of
274 certain instructions, and really should not be hard-wired. */
275
276#define DISPLACED_STEPPING_ARCH_VERSION 5
277
94c30b78 278/* Set to true if the 32-bit mode is in use. */
c906108c
SS
279
280int arm_apcs_32 = 1;
281
9779414d
DJ
282/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
283
478fd957 284int
9779414d
DJ
285arm_psr_thumb_bit (struct gdbarch *gdbarch)
286{
287 if (gdbarch_tdep (gdbarch)->is_m)
288 return XPSR_T;
289 else
290 return CPSR_T;
291}
292
d0e59a68
AT
293/* Determine if the processor is currently executing in Thumb mode. */
294
295int
296arm_is_thumb (struct regcache *regcache)
297{
298 ULONGEST cpsr;
299 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regcache));
300
301 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
302
303 return (cpsr & t_bit) != 0;
304}
305
b39cc962
DJ
306/* Determine if FRAME is executing in Thumb mode. */
307
25b41d01 308int
b39cc962
DJ
309arm_frame_is_thumb (struct frame_info *frame)
310{
311 CORE_ADDR cpsr;
9779414d 312 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
313
314 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
315 directly (from a signal frame or dummy frame) or by interpreting
316 the saved LR (from a prologue or DWARF frame). So consult it and
317 trust the unwinders. */
318 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
319
9779414d 320 return (cpsr & t_bit) != 0;
b39cc962
DJ
321}
322
60c5725c
DJ
323/* Callback for VEC_lower_bound. */
324
325static inline int
326arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
327 const struct arm_mapping_symbol *rhs)
328{
329 return lhs->value < rhs->value;
330}
331
f9d67f43
DJ
332/* Search for the mapping symbol covering MEMADDR. If one is found,
333 return its type. Otherwise, return 0. If START is non-NULL,
334 set *START to the location of the mapping symbol. */
c906108c 335
f9d67f43
DJ
336static char
337arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 338{
60c5725c 339 struct obj_section *sec;
0428b8f5 340
60c5725c
DJ
341 /* If there are mapping symbols, consult them. */
342 sec = find_pc_section (memaddr);
343 if (sec != NULL)
344 {
345 struct arm_per_objfile *data;
346 VEC(arm_mapping_symbol_s) *map;
aded6f54
PA
347 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
348 0 };
60c5725c
DJ
349 unsigned int idx;
350
9a3c8263
SM
351 data = (struct arm_per_objfile *) objfile_data (sec->objfile,
352 arm_objfile_data_key);
60c5725c
DJ
353 if (data != NULL)
354 {
355 map = data->section_maps[sec->the_bfd_section->index];
356 if (!VEC_empty (arm_mapping_symbol_s, map))
357 {
358 struct arm_mapping_symbol *map_sym;
359
360 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
361 arm_compare_mapping_symbols);
362
363 /* VEC_lower_bound finds the earliest ordered insertion
364 point. If the following symbol starts at this exact
365 address, we use that; otherwise, the preceding
366 mapping symbol covers this address. */
367 if (idx < VEC_length (arm_mapping_symbol_s, map))
368 {
369 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
370 if (map_sym->value == map_key.value)
f9d67f43
DJ
371 {
372 if (start)
373 *start = map_sym->value + obj_section_addr (sec);
374 return map_sym->type;
375 }
60c5725c
DJ
376 }
377
378 if (idx > 0)
379 {
380 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
f9d67f43
DJ
381 if (start)
382 *start = map_sym->value + obj_section_addr (sec);
383 return map_sym->type;
60c5725c
DJ
384 }
385 }
386 }
387 }
388
f9d67f43
DJ
389 return 0;
390}
391
392/* Determine if the program counter specified in MEMADDR is in a Thumb
393 function. This function should be called for addresses unrelated to
394 any executing frame; otherwise, prefer arm_frame_is_thumb. */
395
e3039479 396int
9779414d 397arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 398{
7cbd4a93 399 struct bound_minimal_symbol sym;
f9d67f43 400 char type;
a42244db
YQ
401 struct displaced_step_closure* dsc
402 = get_displaced_step_closure_by_addr(memaddr);
403
404 /* If checking the mode of displaced instruction in copy area, the mode
405 should be determined by instruction on the original address. */
406 if (dsc)
407 {
408 if (debug_displaced)
409 fprintf_unfiltered (gdb_stdlog,
410 "displaced: check mode of %.8lx instead of %.8lx\n",
411 (unsigned long) dsc->insn_addr,
412 (unsigned long) memaddr);
413 memaddr = dsc->insn_addr;
414 }
f9d67f43
DJ
415
416 /* If bit 0 of the address is set, assume this is a Thumb address. */
417 if (IS_THUMB_ADDR (memaddr))
418 return 1;
419
18819fa6
UW
420 /* Respect internal mode override if active. */
421 if (arm_override_mode != -1)
422 return arm_override_mode;
423
f9d67f43
DJ
424 /* If the user wants to override the symbol table, let him. */
425 if (strcmp (arm_force_mode_string, "arm") == 0)
426 return 0;
427 if (strcmp (arm_force_mode_string, "thumb") == 0)
428 return 1;
429
9779414d
DJ
430 /* ARM v6-M and v7-M are always in Thumb mode. */
431 if (gdbarch_tdep (gdbarch)->is_m)
432 return 1;
433
f9d67f43
DJ
434 /* If there are mapping symbols, consult them. */
435 type = arm_find_mapping_symbol (memaddr, NULL);
436 if (type)
437 return type == 't';
438
ed9a39eb 439 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c 440 sym = lookup_minimal_symbol_by_pc (memaddr);
7cbd4a93
TT
441 if (sym.minsym)
442 return (MSYMBOL_IS_SPECIAL (sym.minsym));
0428b8f5
DJ
443
444 /* If the user wants to override the fallback mode, let them. */
445 if (strcmp (arm_fallback_mode_string, "arm") == 0)
446 return 0;
447 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
448 return 1;
449
450 /* If we couldn't find any symbol, but we're talking to a running
451 target, then trust the current value of $cpsr. This lets
452 "display/i $pc" always show the correct mode (though if there is
453 a symbol table we will not reach here, so it still may not be
18819fa6 454 displayed in the mode it will be executed). */
0428b8f5 455 if (target_has_registers)
18819fa6 456 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
457
458 /* Otherwise we're out of luck; we assume ARM. */
459 return 0;
c906108c
SS
460}
461
181c1381 462/* Remove useless bits from addresses in a running program. */
34e8f22d 463static CORE_ADDR
24568a2c 464arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 465{
2ae28aa9
YQ
466 /* On M-profile devices, do not strip the low bit from EXC_RETURN
467 (the magic exception return address). */
468 if (gdbarch_tdep (gdbarch)->is_m
469 && (val & 0xfffffff0) == 0xfffffff0)
470 return val;
471
a3a2ee65 472 if (arm_apcs_32)
dd6be234 473 return UNMAKE_THUMB_ADDR (val);
c906108c 474 else
a3a2ee65 475 return (val & 0x03fffffc);
c906108c
SS
476}
477
0d39a070 478/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
479 can be safely ignored during prologue skipping. IS_THUMB is true
480 if the function is known to be a Thumb function due to the way it
481 is being called. */
0d39a070 482static int
e0634ccf 483skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 484{
e0634ccf 485 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7cbd4a93 486 struct bound_minimal_symbol msym;
0d39a070
DJ
487
488 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 489 if (msym.minsym != NULL
77e371c0 490 && BMSYMBOL_VALUE_ADDRESS (msym) == pc
efd66ac6 491 && MSYMBOL_LINKAGE_NAME (msym.minsym) != NULL)
e0634ccf 492 {
efd66ac6 493 const char *name = MSYMBOL_LINKAGE_NAME (msym.minsym);
0d39a070 494
e0634ccf
UW
495 /* The GNU linker's Thumb call stub to foo is named
496 __foo_from_thumb. */
497 if (strstr (name, "_from_thumb") != NULL)
498 name += 2;
0d39a070 499
e0634ccf
UW
500 /* On soft-float targets, __truncdfsf2 is called to convert promoted
501 arguments to their argument types in non-prototyped
502 functions. */
61012eef 503 if (startswith (name, "__truncdfsf2"))
e0634ccf 504 return 1;
61012eef 505 if (startswith (name, "__aeabi_d2f"))
e0634ccf 506 return 1;
0d39a070 507
e0634ccf 508 /* Internal functions related to thread-local storage. */
61012eef 509 if (startswith (name, "__tls_get_addr"))
e0634ccf 510 return 1;
61012eef 511 if (startswith (name, "__aeabi_read_tp"))
e0634ccf
UW
512 return 1;
513 }
514 else
515 {
516 /* If we run against a stripped glibc, we may be unable to identify
517 special functions by name. Check for one important case,
518 __aeabi_read_tp, by comparing the *code* against the default
519 implementation (this is hand-written ARM assembler in glibc). */
520
521 if (!is_thumb
522 && read_memory_unsigned_integer (pc, 4, byte_order_for_code)
523 == 0xe3e00a0f /* mov r0, #0xffff0fff */
524 && read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code)
525 == 0xe240f01f) /* sub pc, r0, #31 */
526 return 1;
527 }
ec3d575a 528
0d39a070
DJ
529 return 0;
530}
531
621c6d5b
YQ
532/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
533 the first 16-bit of instruction, and INSN2 is the second 16-bit of
534 instruction. */
535#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
536 ((bits ((insn1), 0, 3) << 12) \
537 | (bits ((insn1), 10, 10) << 11) \
538 | (bits ((insn2), 12, 14) << 8) \
539 | bits ((insn2), 0, 7))
540
541/* Extract the immediate from instruction movw/movt of encoding A. INSN is
542 the 32-bit instruction. */
543#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
544 ((bits ((insn), 16, 19) << 12) \
545 | bits ((insn), 0, 11))
546
ec3d575a
UW
547/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
548
549static unsigned int
550thumb_expand_immediate (unsigned int imm)
551{
552 unsigned int count = imm >> 7;
553
554 if (count < 8)
555 switch (count / 2)
556 {
557 case 0:
558 return imm & 0xff;
559 case 1:
560 return (imm & 0xff) | ((imm & 0xff) << 16);
561 case 2:
562 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
563 case 3:
564 return (imm & 0xff) | ((imm & 0xff) << 8)
565 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
566 }
567
568 return (0x80 | (imm & 0x7f)) << (32 - count);
569}
570
540314bd
YQ
571/* Return 1 if the 16-bit Thumb instruction INSN restores SP in
572 epilogue, 0 otherwise. */
573
574static int
575thumb_instruction_restores_sp (unsigned short insn)
576{
577 return (insn == 0x46bd /* mov sp, r7 */
578 || (insn & 0xff80) == 0xb000 /* add sp, imm */
579 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
580}
581
29d73ae4
DJ
582/* Analyze a Thumb prologue, looking for a recognizable stack frame
583 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
584 clobber the stack frame unexpectedly, or an unknown instruction.
585 Return the last address which is definitely safe to skip for an
586 initial breakpoint. */
c906108c
SS
587
588static CORE_ADDR
29d73ae4
DJ
589thumb_analyze_prologue (struct gdbarch *gdbarch,
590 CORE_ADDR start, CORE_ADDR limit,
591 struct arm_prologue_cache *cache)
c906108c 592{
0d39a070 593 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 594 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
595 int i;
596 pv_t regs[16];
597 struct pv_area *stack;
598 struct cleanup *back_to;
599 CORE_ADDR offset;
ec3d575a 600 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 601
29d73ae4
DJ
602 for (i = 0; i < 16; i++)
603 regs[i] = pv_register (i, 0);
55f960e1 604 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4
DJ
605 back_to = make_cleanup_free_pv_area (stack);
606
29d73ae4 607 while (start < limit)
c906108c 608 {
29d73ae4
DJ
609 unsigned short insn;
610
e17a4113 611 insn = read_memory_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 612
94c30b78 613 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 614 {
29d73ae4
DJ
615 int regno;
616 int mask;
4be43953
DJ
617
618 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
619 break;
29d73ae4
DJ
620
621 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
622 whether to save LR (R14). */
623 mask = (insn & 0xff) | ((insn & 0x100) << 6);
624
625 /* Calculate offsets of saved R0-R7 and LR. */
626 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
627 if (mask & (1 << regno))
628 {
29d73ae4
DJ
629 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
630 -4);
631 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
632 }
da59e081 633 }
1db01f22 634 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
da59e081 635 {
29d73ae4 636 offset = (insn & 0x7f) << 2; /* get scaled offset */
1db01f22
YQ
637 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
638 -offset);
da59e081 639 }
808f7ab1
YQ
640 else if (thumb_instruction_restores_sp (insn))
641 {
642 /* Don't scan past the epilogue. */
643 break;
644 }
0d39a070
DJ
645 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
646 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
647 (insn & 0xff) << 2);
648 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
649 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
650 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
651 bits (insn, 6, 8));
652 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
653 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
654 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
655 bits (insn, 0, 7));
656 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
657 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
658 && pv_is_constant (regs[bits (insn, 3, 5)]))
659 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
660 regs[bits (insn, 6, 8)]);
661 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
662 && pv_is_constant (regs[bits (insn, 3, 6)]))
663 {
664 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
665 int rm = bits (insn, 3, 6);
666 regs[rd] = pv_add (regs[rd], regs[rm]);
667 }
29d73ae4 668 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 669 {
29d73ae4
DJ
670 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
671 int src_reg = (insn & 0x78) >> 3;
672 regs[dst_reg] = regs[src_reg];
da59e081 673 }
29d73ae4 674 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 675 {
29d73ae4
DJ
676 /* Handle stores to the stack. Normally pushes are used,
677 but with GCC -mtpcs-frame, there may be other stores
678 in the prologue to create the frame. */
679 int regno = (insn >> 8) & 0x7;
680 pv_t addr;
681
682 offset = (insn & 0xff) << 2;
683 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
684
685 if (pv_area_store_would_trash (stack, addr))
686 break;
687
688 pv_area_store (stack, addr, 4, regs[regno]);
da59e081 689 }
0d39a070
DJ
690 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
691 {
692 int rd = bits (insn, 0, 2);
693 int rn = bits (insn, 3, 5);
694 pv_t addr;
695
696 offset = bits (insn, 6, 10) << 2;
697 addr = pv_add_constant (regs[rn], offset);
698
699 if (pv_area_store_would_trash (stack, addr))
700 break;
701
702 pv_area_store (stack, addr, 4, regs[rd]);
703 }
704 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
705 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
706 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
707 /* Ignore stores of argument registers to the stack. */
708 ;
709 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
710 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
711 /* Ignore block loads from the stack, potentially copying
712 parameters from memory. */
713 ;
714 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
715 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
716 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
717 /* Similarly ignore single loads from the stack. */
718 ;
719 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
720 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
721 /* Skip register copies, i.e. saves to another register
722 instead of the stack. */
723 ;
724 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
725 /* Recognize constant loads; even with small stacks these are necessary
726 on Thumb. */
727 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
728 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
729 {
730 /* Constant pool loads, for the same reason. */
731 unsigned int constant;
732 CORE_ADDR loc;
733
734 loc = start + 4 + bits (insn, 0, 7) * 4;
735 constant = read_memory_unsigned_integer (loc, 4, byte_order);
736 regs[bits (insn, 8, 10)] = pv_constant (constant);
737 }
db24da6d 738 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 739 {
0d39a070
DJ
740 unsigned short inst2;
741
742 inst2 = read_memory_unsigned_integer (start + 2, 2,
743 byte_order_for_code);
744
745 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
746 {
747 /* BL, BLX. Allow some special function calls when
748 skipping the prologue; GCC generates these before
749 storing arguments to the stack. */
750 CORE_ADDR nextpc;
751 int j1, j2, imm1, imm2;
752
753 imm1 = sbits (insn, 0, 10);
754 imm2 = bits (inst2, 0, 10);
755 j1 = bit (inst2, 13);
756 j2 = bit (inst2, 11);
757
758 offset = ((imm1 << 12) + (imm2 << 1));
759 offset ^= ((!j2) << 22) | ((!j1) << 23);
760
761 nextpc = start + 4 + offset;
762 /* For BLX make sure to clear the low bits. */
763 if (bit (inst2, 12) == 0)
764 nextpc = nextpc & 0xfffffffc;
765
e0634ccf
UW
766 if (!skip_prologue_function (gdbarch, nextpc,
767 bit (inst2, 12) != 0))
0d39a070
DJ
768 break;
769 }
ec3d575a 770
0963b4bd
MS
771 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
772 { registers } */
ec3d575a
UW
773 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
774 {
775 pv_t addr = regs[bits (insn, 0, 3)];
776 int regno;
777
778 if (pv_area_store_would_trash (stack, addr))
779 break;
780
781 /* Calculate offsets of saved registers. */
782 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
783 if (inst2 & (1 << regno))
784 {
785 addr = pv_add_constant (addr, -4);
786 pv_area_store (stack, addr, 4, regs[regno]);
787 }
788
789 if (insn & 0x0020)
790 regs[bits (insn, 0, 3)] = addr;
791 }
792
0963b4bd
MS
793 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
794 [Rn, #+/-imm]{!} */
ec3d575a
UW
795 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
796 {
797 int regno1 = bits (inst2, 12, 15);
798 int regno2 = bits (inst2, 8, 11);
799 pv_t addr = regs[bits (insn, 0, 3)];
800
801 offset = inst2 & 0xff;
802 if (insn & 0x0080)
803 addr = pv_add_constant (addr, offset);
804 else
805 addr = pv_add_constant (addr, -offset);
806
807 if (pv_area_store_would_trash (stack, addr))
808 break;
809
810 pv_area_store (stack, addr, 4, regs[regno1]);
811 pv_area_store (stack, pv_add_constant (addr, 4),
812 4, regs[regno2]);
813
814 if (insn & 0x0020)
815 regs[bits (insn, 0, 3)] = addr;
816 }
817
818 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
819 && (inst2 & 0x0c00) == 0x0c00
820 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
821 {
822 int regno = bits (inst2, 12, 15);
823 pv_t addr = regs[bits (insn, 0, 3)];
824
825 offset = inst2 & 0xff;
826 if (inst2 & 0x0200)
827 addr = pv_add_constant (addr, offset);
828 else
829 addr = pv_add_constant (addr, -offset);
830
831 if (pv_area_store_would_trash (stack, addr))
832 break;
833
834 pv_area_store (stack, addr, 4, regs[regno]);
835
836 if (inst2 & 0x0100)
837 regs[bits (insn, 0, 3)] = addr;
838 }
839
840 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
841 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
842 {
843 int regno = bits (inst2, 12, 15);
844 pv_t addr;
845
846 offset = inst2 & 0xfff;
847 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
848
849 if (pv_area_store_would_trash (stack, addr))
850 break;
851
852 pv_area_store (stack, addr, 4, regs[regno]);
853 }
854
855 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 856 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 857 /* Ignore stores of argument registers to the stack. */
0d39a070 858 ;
ec3d575a
UW
859
860 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
861 && (inst2 & 0x0d00) == 0x0c00
0d39a070 862 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 863 /* Ignore stores of argument registers to the stack. */
0d39a070 864 ;
ec3d575a 865
0963b4bd
MS
866 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
867 { registers } */
ec3d575a
UW
868 && (inst2 & 0x8000) == 0x0000
869 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
870 /* Ignore block loads from the stack, potentially copying
871 parameters from memory. */
0d39a070 872 ;
ec3d575a 873
0963b4bd
MS
874 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
875 [Rn, #+/-imm] */
0d39a070 876 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 877 /* Similarly ignore dual loads from the stack. */
0d39a070 878 ;
ec3d575a
UW
879
880 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
881 && (inst2 & 0x0d00) == 0x0c00
0d39a070 882 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 883 /* Similarly ignore single loads from the stack. */
0d39a070 884 ;
ec3d575a
UW
885
886 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
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 & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
892 && (inst2 & 0x8000) == 0x0000)
893 {
894 unsigned int imm = ((bits (insn, 10, 10) << 11)
895 | (bits (inst2, 12, 14) << 8)
896 | bits (inst2, 0, 7));
897
898 regs[bits (inst2, 8, 11)]
899 = pv_add_constant (regs[bits (insn, 0, 3)],
900 thumb_expand_immediate (imm));
901 }
902
903 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
904 && (inst2 & 0x8000) == 0x0000)
0d39a070 905 {
ec3d575a
UW
906 unsigned int imm = ((bits (insn, 10, 10) << 11)
907 | (bits (inst2, 12, 14) << 8)
908 | bits (inst2, 0, 7));
909
910 regs[bits (inst2, 8, 11)]
911 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
912 }
913
914 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
915 && (inst2 & 0x8000) == 0x0000)
916 {
917 unsigned int imm = ((bits (insn, 10, 10) << 11)
918 | (bits (inst2, 12, 14) << 8)
919 | bits (inst2, 0, 7));
920
921 regs[bits (inst2, 8, 11)]
922 = pv_add_constant (regs[bits (insn, 0, 3)],
923 - (CORE_ADDR) thumb_expand_immediate (imm));
924 }
925
926 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
927 && (inst2 & 0x8000) == 0x0000)
928 {
929 unsigned int imm = ((bits (insn, 10, 10) << 11)
930 | (bits (inst2, 12, 14) << 8)
931 | bits (inst2, 0, 7));
932
933 regs[bits (inst2, 8, 11)]
934 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
935 }
936
937 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
938 {
939 unsigned int imm = ((bits (insn, 10, 10) << 11)
940 | (bits (inst2, 12, 14) << 8)
941 | bits (inst2, 0, 7));
942
943 regs[bits (inst2, 8, 11)]
944 = pv_constant (thumb_expand_immediate (imm));
945 }
946
947 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
948 {
621c6d5b
YQ
949 unsigned int imm
950 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
951
952 regs[bits (inst2, 8, 11)] = pv_constant (imm);
953 }
954
955 else if (insn == 0xea5f /* mov.w Rd,Rm */
956 && (inst2 & 0xf0f0) == 0)
957 {
958 int dst_reg = (inst2 & 0x0f00) >> 8;
959 int src_reg = inst2 & 0xf;
960 regs[dst_reg] = regs[src_reg];
961 }
962
963 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
964 {
965 /* Constant pool loads. */
966 unsigned int constant;
967 CORE_ADDR loc;
968
cac395ea 969 offset = bits (inst2, 0, 11);
ec3d575a
UW
970 if (insn & 0x0080)
971 loc = start + 4 + offset;
972 else
973 loc = start + 4 - offset;
974
975 constant = read_memory_unsigned_integer (loc, 4, byte_order);
976 regs[bits (inst2, 12, 15)] = pv_constant (constant);
977 }
978
979 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
980 {
981 /* Constant pool loads. */
982 unsigned int constant;
983 CORE_ADDR loc;
984
cac395ea 985 offset = bits (inst2, 0, 7) << 2;
ec3d575a
UW
986 if (insn & 0x0080)
987 loc = start + 4 + offset;
988 else
989 loc = start + 4 - offset;
990
991 constant = read_memory_unsigned_integer (loc, 4, byte_order);
992 regs[bits (inst2, 12, 15)] = pv_constant (constant);
993
994 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
995 regs[bits (inst2, 8, 11)] = pv_constant (constant);
996 }
997
998 else if (thumb2_instruction_changes_pc (insn, inst2))
999 {
1000 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1001 break;
1002 }
ec3d575a
UW
1003 else
1004 {
1005 /* The optimizer might shove anything into the prologue,
1006 so we just skip what we don't recognize. */
1007 unrecognized_pc = start;
1008 }
0d39a070
DJ
1009
1010 start += 2;
1011 }
ec3d575a 1012 else if (thumb_instruction_changes_pc (insn))
3d74b771 1013 {
ec3d575a 1014 /* Don't scan past anything that might change control flow. */
da3c6d4a 1015 break;
3d74b771 1016 }
ec3d575a
UW
1017 else
1018 {
1019 /* The optimizer might shove anything into the prologue,
1020 so we just skip what we don't recognize. */
1021 unrecognized_pc = start;
1022 }
29d73ae4
DJ
1023
1024 start += 2;
c906108c
SS
1025 }
1026
0d39a070
DJ
1027 if (arm_debug)
1028 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1029 paddress (gdbarch, start));
1030
ec3d575a
UW
1031 if (unrecognized_pc == 0)
1032 unrecognized_pc = start;
1033
29d73ae4
DJ
1034 if (cache == NULL)
1035 {
1036 do_cleanups (back_to);
ec3d575a 1037 return unrecognized_pc;
29d73ae4
DJ
1038 }
1039
29d73ae4
DJ
1040 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1041 {
1042 /* Frame pointer is fp. Frame size is constant. */
1043 cache->framereg = ARM_FP_REGNUM;
1044 cache->framesize = -regs[ARM_FP_REGNUM].k;
1045 }
1046 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1047 {
1048 /* Frame pointer is r7. Frame size is constant. */
1049 cache->framereg = THUMB_FP_REGNUM;
1050 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1051 }
72a2e3dc 1052 else
29d73ae4
DJ
1053 {
1054 /* Try the stack pointer... this is a bit desperate. */
1055 cache->framereg = ARM_SP_REGNUM;
1056 cache->framesize = -regs[ARM_SP_REGNUM].k;
1057 }
29d73ae4
DJ
1058
1059 for (i = 0; i < 16; i++)
1060 if (pv_area_find_reg (stack, gdbarch, i, &offset))
1061 cache->saved_regs[i].addr = offset;
1062
1063 do_cleanups (back_to);
ec3d575a 1064 return unrecognized_pc;
c906108c
SS
1065}
1066
621c6d5b
YQ
1067
1068/* Try to analyze the instructions starting from PC, which load symbol
1069 __stack_chk_guard. Return the address of instruction after loading this
1070 symbol, set the dest register number to *BASEREG, and set the size of
1071 instructions for loading symbol in OFFSET. Return 0 if instructions are
1072 not recognized. */
1073
1074static CORE_ADDR
1075arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1076 unsigned int *destreg, int *offset)
1077{
1078 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1079 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1080 unsigned int low, high, address;
1081
1082 address = 0;
1083 if (is_thumb)
1084 {
1085 unsigned short insn1
1086 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
1087
1088 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1089 {
1090 *destreg = bits (insn1, 8, 10);
1091 *offset = 2;
6ae274b7
YQ
1092 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1093 address = read_memory_unsigned_integer (address, 4,
1094 byte_order_for_code);
621c6d5b
YQ
1095 }
1096 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1097 {
1098 unsigned short insn2
1099 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
1100
1101 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1102
1103 insn1
1104 = read_memory_unsigned_integer (pc + 4, 2, byte_order_for_code);
1105 insn2
1106 = read_memory_unsigned_integer (pc + 6, 2, byte_order_for_code);
1107
1108 /* movt Rd, #const */
1109 if ((insn1 & 0xfbc0) == 0xf2c0)
1110 {
1111 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1112 *destreg = bits (insn2, 8, 11);
1113 *offset = 8;
1114 address = (high << 16 | low);
1115 }
1116 }
1117 }
1118 else
1119 {
2e9e421f
UW
1120 unsigned int insn
1121 = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
1122
6ae274b7 1123 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
2e9e421f 1124 {
6ae274b7
YQ
1125 address = bits (insn, 0, 11) + pc + 8;
1126 address = read_memory_unsigned_integer (address, 4,
1127 byte_order_for_code);
1128
2e9e421f
UW
1129 *destreg = bits (insn, 12, 15);
1130 *offset = 4;
1131 }
1132 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1133 {
1134 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1135
1136 insn
1137 = read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code);
1138
1139 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1140 {
1141 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1142 *destreg = bits (insn, 12, 15);
1143 *offset = 8;
1144 address = (high << 16 | low);
1145 }
1146 }
621c6d5b
YQ
1147 }
1148
1149 return address;
1150}
1151
1152/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1153 points to the first instruction of this sequence, return the address of
1154 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1155
1156 On arm, this sequence of instructions is composed of mainly three steps,
1157 Step 1: load symbol __stack_chk_guard,
1158 Step 2: load from address of __stack_chk_guard,
1159 Step 3: store it to somewhere else.
1160
1161 Usually, instructions on step 2 and step 3 are the same on various ARM
1162 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1163 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1164 instructions in step 1 vary from different ARM architectures. On ARMv7,
1165 they are,
1166
1167 movw Rn, #:lower16:__stack_chk_guard
1168 movt Rn, #:upper16:__stack_chk_guard
1169
1170 On ARMv5t, it is,
1171
1172 ldr Rn, .Label
1173 ....
1174 .Lable:
1175 .word __stack_chk_guard
1176
1177 Since ldr/str is a very popular instruction, we can't use them as
1178 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1179 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1180 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1181
1182static CORE_ADDR
1183arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1184{
1185 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1186 unsigned int basereg;
7cbd4a93 1187 struct bound_minimal_symbol stack_chk_guard;
621c6d5b
YQ
1188 int offset;
1189 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1190 CORE_ADDR addr;
1191
1192 /* Try to parse the instructions in Step 1. */
1193 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1194 &basereg, &offset);
1195 if (!addr)
1196 return pc;
1197
1198 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
6041179a
JB
1199 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1200 Otherwise, this sequence cannot be for stack protector. */
1201 if (stack_chk_guard.minsym == NULL
61012eef 1202 || !startswith (MSYMBOL_LINKAGE_NAME (stack_chk_guard.minsym), "__stack_chk_guard"))
621c6d5b
YQ
1203 return pc;
1204
1205 if (is_thumb)
1206 {
1207 unsigned int destreg;
1208 unsigned short insn
1209 = read_memory_unsigned_integer (pc + offset, 2, byte_order_for_code);
1210
1211 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1212 if ((insn & 0xf800) != 0x6800)
1213 return pc;
1214 if (bits (insn, 3, 5) != basereg)
1215 return pc;
1216 destreg = bits (insn, 0, 2);
1217
1218 insn = read_memory_unsigned_integer (pc + offset + 2, 2,
1219 byte_order_for_code);
1220 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1221 if ((insn & 0xf800) != 0x6000)
1222 return pc;
1223 if (destreg != bits (insn, 0, 2))
1224 return pc;
1225 }
1226 else
1227 {
1228 unsigned int destreg;
1229 unsigned int insn
1230 = read_memory_unsigned_integer (pc + offset, 4, byte_order_for_code);
1231
1232 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1233 if ((insn & 0x0e500000) != 0x04100000)
1234 return pc;
1235 if (bits (insn, 16, 19) != basereg)
1236 return pc;
1237 destreg = bits (insn, 12, 15);
1238 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1239 insn = read_memory_unsigned_integer (pc + offset + 4,
1240 4, byte_order_for_code);
1241 if ((insn & 0x0e500000) != 0x04000000)
1242 return pc;
1243 if (bits (insn, 12, 15) != destreg)
1244 return pc;
1245 }
1246 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1247 on arm. */
1248 if (is_thumb)
1249 return pc + offset + 4;
1250 else
1251 return pc + offset + 8;
1252}
1253
da3c6d4a
MS
1254/* Advance the PC across any function entry prologue instructions to
1255 reach some "real" code.
34e8f22d
RE
1256
1257 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1258 prologue:
c906108c 1259
c5aa993b
JM
1260 mov ip, sp
1261 [stmfd sp!, {a1,a2,a3,a4}]
1262 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1263 [stfe f7, [sp, #-12]!]
1264 [stfe f6, [sp, #-12]!]
1265 [stfe f5, [sp, #-12]!]
1266 [stfe f4, [sp, #-12]!]
0963b4bd 1267 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1268
34e8f22d 1269static CORE_ADDR
6093d2eb 1270arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1271{
e17a4113 1272 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c 1273 unsigned long inst;
a89fea3c 1274 CORE_ADDR func_addr, limit_pc;
c906108c 1275
a89fea3c
JL
1276 /* See if we can determine the end of the prologue via the symbol table.
1277 If so, then return either PC, or the PC after the prologue, whichever
1278 is greater. */
1279 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1280 {
d80b854b
UW
1281 CORE_ADDR post_prologue_pc
1282 = skip_prologue_using_sal (gdbarch, func_addr);
43f3e411 1283 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
0d39a070 1284
621c6d5b
YQ
1285 if (post_prologue_pc)
1286 post_prologue_pc
1287 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1288
1289
0d39a070
DJ
1290 /* GCC always emits a line note before the prologue and another
1291 one after, even if the two are at the same address or on the
1292 same line. Take advantage of this so that we do not need to
1293 know every instruction that might appear in the prologue. We
1294 will have producer information for most binaries; if it is
1295 missing (e.g. for -gstabs), assuming the GNU tools. */
1296 if (post_prologue_pc
43f3e411
DE
1297 && (cust == NULL
1298 || COMPUNIT_PRODUCER (cust) == NULL
61012eef
GB
1299 || startswith (COMPUNIT_PRODUCER (cust), "GNU ")
1300 || startswith (COMPUNIT_PRODUCER (cust), "clang ")))
0d39a070
DJ
1301 return post_prologue_pc;
1302
a89fea3c 1303 if (post_prologue_pc != 0)
0d39a070
DJ
1304 {
1305 CORE_ADDR analyzed_limit;
1306
1307 /* For non-GCC compilers, make sure the entire line is an
1308 acceptable prologue; GDB will round this function's
1309 return value up to the end of the following line so we
1310 can not skip just part of a line (and we do not want to).
1311
1312 RealView does not treat the prologue specially, but does
1313 associate prologue code with the opening brace; so this
1314 lets us skip the first line if we think it is the opening
1315 brace. */
9779414d 1316 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1317 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1318 post_prologue_pc, NULL);
1319 else
1320 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1321 post_prologue_pc, NULL);
1322
1323 if (analyzed_limit != post_prologue_pc)
1324 return func_addr;
1325
1326 return post_prologue_pc;
1327 }
c906108c
SS
1328 }
1329
a89fea3c
JL
1330 /* Can't determine prologue from the symbol table, need to examine
1331 instructions. */
c906108c 1332
a89fea3c
JL
1333 /* Find an upper limit on the function prologue using the debug
1334 information. If the debug information could not be used to provide
1335 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1336 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1337 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1338 if (limit_pc == 0)
1339 limit_pc = pc + 64; /* Magic. */
1340
c906108c 1341
29d73ae4 1342 /* Check if this is Thumb code. */
9779414d 1343 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1344 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
21daaaaf
YQ
1345 else
1346 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL);
c906108c 1347}
94c30b78 1348
c5aa993b 1349/* *INDENT-OFF* */
c906108c
SS
1350/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1351 This function decodes a Thumb function prologue to determine:
1352 1) the size of the stack frame
1353 2) which registers are saved on it
1354 3) the offsets of saved regs
1355 4) the offset from the stack pointer to the frame pointer
c906108c 1356
da59e081
JM
1357 A typical Thumb function prologue would create this stack frame
1358 (offsets relative to FP)
c906108c
SS
1359 old SP -> 24 stack parameters
1360 20 LR
1361 16 R7
1362 R7 -> 0 local variables (16 bytes)
1363 SP -> -12 additional stack space (12 bytes)
1364 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1365 12 bytes. The frame register is R7.
da59e081 1366
da3c6d4a
MS
1367 The comments for thumb_skip_prolog() describe the algorithm we use
1368 to detect the end of the prolog. */
c5aa993b
JM
1369/* *INDENT-ON* */
1370
c906108c 1371static void
be8626e0 1372thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1373 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1374{
1375 CORE_ADDR prologue_start;
1376 CORE_ADDR prologue_end;
c906108c 1377
b39cc962
DJ
1378 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1379 &prologue_end))
c906108c 1380 {
ec3d575a
UW
1381 /* See comment in arm_scan_prologue for an explanation of
1382 this heuristics. */
1383 if (prologue_end > prologue_start + 64)
1384 {
1385 prologue_end = prologue_start + 64;
1386 }
c906108c
SS
1387 }
1388 else
f7060f85
DJ
1389 /* We're in the boondocks: we have no idea where the start of the
1390 function is. */
1391 return;
c906108c 1392
eb5492fa 1393 prologue_end = min (prologue_end, prev_pc);
c906108c 1394
be8626e0 1395 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1396}
1397
f303bc3e
YQ
1398/* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1399 otherwise. */
1400
1401static int
1402arm_instruction_restores_sp (unsigned int insn)
1403{
1404 if (bits (insn, 28, 31) != INST_NV)
1405 {
1406 if ((insn & 0x0df0f000) == 0x0080d000
1407 /* ADD SP (register or immediate). */
1408 || (insn & 0x0df0f000) == 0x0040d000
1409 /* SUB SP (register or immediate). */
1410 || (insn & 0x0ffffff0) == 0x01a0d000
1411 /* MOV SP. */
1412 || (insn & 0x0fff0000) == 0x08bd0000
1413 /* POP (LDMIA). */
1414 || (insn & 0x0fff0000) == 0x049d0000)
1415 /* POP of a single register. */
1416 return 1;
1417 }
1418
1419 return 0;
1420}
1421
0d39a070
DJ
1422/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1423 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1424 fill it in. Return the first address not recognized as a prologue
1425 instruction.
eb5492fa 1426
0d39a070
DJ
1427 We recognize all the instructions typically found in ARM prologues,
1428 plus harmless instructions which can be skipped (either for analysis
1429 purposes, or a more restrictive set that can be skipped when finding
1430 the end of the prologue). */
1431
1432static CORE_ADDR
1433arm_analyze_prologue (struct gdbarch *gdbarch,
1434 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1435 struct arm_prologue_cache *cache)
1436{
1437 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1438 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1439 int regno;
1440 CORE_ADDR offset, current_pc;
1441 pv_t regs[ARM_FPS_REGNUM];
1442 struct pv_area *stack;
1443 struct cleanup *back_to;
0d39a070
DJ
1444 CORE_ADDR unrecognized_pc = 0;
1445
1446 /* Search the prologue looking for instructions that set up the
96baa820 1447 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1448
96baa820
JM
1449 Be careful, however, and if it doesn't look like a prologue,
1450 don't try to scan it. If, for instance, a frameless function
1451 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1452 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1453 and other operations that rely on a knowledge of the stack
0d39a070 1454 traceback. */
d4473757 1455
4be43953
DJ
1456 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1457 regs[regno] = pv_register (regno, 0);
55f960e1 1458 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953
DJ
1459 back_to = make_cleanup_free_pv_area (stack);
1460
94c30b78
MS
1461 for (current_pc = prologue_start;
1462 current_pc < prologue_end;
f43845b3 1463 current_pc += 4)
96baa820 1464 {
e17a4113
UW
1465 unsigned int insn
1466 = read_memory_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1467
94c30b78 1468 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1469 {
4be43953 1470 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1471 continue;
1472 }
0d39a070
DJ
1473 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1474 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1475 {
1476 unsigned imm = insn & 0xff; /* immediate value */
1477 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1478 int rd = bits (insn, 12, 15);
28cd8767 1479 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1480 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1481 continue;
1482 }
0d39a070
DJ
1483 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1484 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1485 {
1486 unsigned imm = insn & 0xff; /* immediate value */
1487 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1488 int rd = bits (insn, 12, 15);
28cd8767 1489 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1490 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1491 continue;
1492 }
0963b4bd
MS
1493 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1494 [sp, #-4]! */
f43845b3 1495 {
4be43953
DJ
1496 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1497 break;
1498 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
0d39a070
DJ
1499 pv_area_store (stack, regs[ARM_SP_REGNUM], 4,
1500 regs[bits (insn, 12, 15)]);
f43845b3
MS
1501 continue;
1502 }
1503 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1504 /* stmfd sp!, {..., fp, ip, lr, pc}
1505 or
1506 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1507 {
d4473757 1508 int mask = insn & 0xffff;
ed9a39eb 1509
4be43953
DJ
1510 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1511 break;
1512
94c30b78 1513 /* Calculate offsets of saved registers. */
34e8f22d 1514 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1515 if (mask & (1 << regno))
1516 {
0963b4bd
MS
1517 regs[ARM_SP_REGNUM]
1518 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
4be43953 1519 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1520 }
1521 }
0d39a070
DJ
1522 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1523 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1524 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1525 {
1526 /* No need to add this to saved_regs -- it's just an arg reg. */
1527 continue;
1528 }
0d39a070
DJ
1529 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1530 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1531 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1532 {
1533 /* No need to add this to saved_regs -- it's just an arg reg. */
1534 continue;
1535 }
0963b4bd
MS
1536 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1537 { registers } */
0d39a070
DJ
1538 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1539 {
1540 /* No need to add this to saved_regs -- it's just arg regs. */
1541 continue;
1542 }
d4473757
KB
1543 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1544 {
94c30b78
MS
1545 unsigned imm = insn & 0xff; /* immediate value */
1546 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1547 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1548 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1549 }
1550 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1551 {
94c30b78
MS
1552 unsigned imm = insn & 0xff; /* immediate value */
1553 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1554 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1555 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1556 }
0963b4bd
MS
1557 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1558 [sp, -#c]! */
2af46ca0 1559 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1560 {
4be43953
DJ
1561 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1562 break;
1563
1564 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1565 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
4be43953 1566 pv_area_store (stack, regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1567 }
0963b4bd
MS
1568 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1569 [sp!] */
2af46ca0 1570 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1571 {
1572 int n_saved_fp_regs;
1573 unsigned int fp_start_reg, fp_bound_reg;
1574
4be43953
DJ
1575 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1576 break;
1577
94c30b78 1578 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1579 {
d4473757
KB
1580 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1581 n_saved_fp_regs = 3;
1582 else
1583 n_saved_fp_regs = 1;
96baa820 1584 }
d4473757 1585 else
96baa820 1586 {
d4473757
KB
1587 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1588 n_saved_fp_regs = 2;
1589 else
1590 n_saved_fp_regs = 4;
96baa820 1591 }
d4473757 1592
34e8f22d 1593 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1594 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1595 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1596 {
4be43953
DJ
1597 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1598 pv_area_store (stack, regs[ARM_SP_REGNUM], 12,
1599 regs[fp_start_reg++]);
96baa820 1600 }
c906108c 1601 }
0d39a070
DJ
1602 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1603 {
1604 /* Allow some special function calls when skipping the
1605 prologue; GCC generates these before storing arguments to
1606 the stack. */
1607 CORE_ADDR dest = BranchDest (current_pc, insn);
1608
e0634ccf 1609 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1610 continue;
1611 else
1612 break;
1613 }
d4473757 1614 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1615 break; /* Condition not true, exit early. */
0d39a070
DJ
1616 else if (arm_instruction_changes_pc (insn))
1617 /* Don't scan past anything that might change control flow. */
1618 break;
f303bc3e
YQ
1619 else if (arm_instruction_restores_sp (insn))
1620 {
1621 /* Don't scan past the epilogue. */
1622 break;
1623 }
d19f7eee
UW
1624 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1625 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1626 /* Ignore block loads from the stack, potentially copying
1627 parameters from memory. */
1628 continue;
1629 else if ((insn & 0xfc500000) == 0xe4100000
1630 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1631 /* Similarly ignore single loads from the stack. */
1632 continue;
0d39a070
DJ
1633 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1634 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1635 register instead of the stack. */
d4473757 1636 continue;
0d39a070
DJ
1637 else
1638 {
21daaaaf
YQ
1639 /* The optimizer might shove anything into the prologue, if
1640 we build up cache (cache != NULL) from scanning prologue,
1641 we just skip what we don't recognize and scan further to
1642 make cache as complete as possible. However, if we skip
1643 prologue, we'll stop immediately on unrecognized
1644 instruction. */
0d39a070 1645 unrecognized_pc = current_pc;
21daaaaf
YQ
1646 if (cache != NULL)
1647 continue;
1648 else
1649 break;
0d39a070 1650 }
c906108c
SS
1651 }
1652
0d39a070
DJ
1653 if (unrecognized_pc == 0)
1654 unrecognized_pc = current_pc;
1655
0d39a070
DJ
1656 if (cache)
1657 {
4072f920
YQ
1658 int framereg, framesize;
1659
1660 /* The frame size is just the distance from the frame register
1661 to the original stack pointer. */
1662 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1663 {
1664 /* Frame pointer is fp. */
1665 framereg = ARM_FP_REGNUM;
1666 framesize = -regs[ARM_FP_REGNUM].k;
1667 }
1668 else
1669 {
1670 /* Try the stack pointer... this is a bit desperate. */
1671 framereg = ARM_SP_REGNUM;
1672 framesize = -regs[ARM_SP_REGNUM].k;
1673 }
1674
0d39a070
DJ
1675 cache->framereg = framereg;
1676 cache->framesize = framesize;
1677
1678 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1679 if (pv_area_find_reg (stack, gdbarch, regno, &offset))
1680 cache->saved_regs[regno].addr = offset;
1681 }
1682
1683 if (arm_debug)
1684 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1685 paddress (gdbarch, unrecognized_pc));
4be43953
DJ
1686
1687 do_cleanups (back_to);
0d39a070
DJ
1688 return unrecognized_pc;
1689}
1690
1691static void
1692arm_scan_prologue (struct frame_info *this_frame,
1693 struct arm_prologue_cache *cache)
1694{
1695 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1696 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1697 int regno;
1698 CORE_ADDR prologue_start, prologue_end, current_pc;
1699 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1700 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
1701 pv_t regs[ARM_FPS_REGNUM];
1702 struct pv_area *stack;
1703 struct cleanup *back_to;
1704 CORE_ADDR offset;
1705
1706 /* Assume there is no frame until proven otherwise. */
1707 cache->framereg = ARM_SP_REGNUM;
1708 cache->framesize = 0;
1709
1710 /* Check for Thumb prologue. */
1711 if (arm_frame_is_thumb (this_frame))
1712 {
1713 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1714 return;
1715 }
1716
1717 /* Find the function prologue. If we can't find the function in
1718 the symbol table, peek in the stack frame to find the PC. */
1719 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1720 &prologue_end))
1721 {
1722 /* One way to find the end of the prologue (which works well
1723 for unoptimized code) is to do the following:
1724
1725 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1726
1727 if (sal.line == 0)
1728 prologue_end = prev_pc;
1729 else if (sal.end < prologue_end)
1730 prologue_end = sal.end;
1731
1732 This mechanism is very accurate so long as the optimizer
1733 doesn't move any instructions from the function body into the
1734 prologue. If this happens, sal.end will be the last
1735 instruction in the first hunk of prologue code just before
1736 the first instruction that the scheduler has moved from
1737 the body to the prologue.
1738
1739 In order to make sure that we scan all of the prologue
1740 instructions, we use a slightly less accurate mechanism which
1741 may scan more than necessary. To help compensate for this
1742 lack of accuracy, the prologue scanning loop below contains
1743 several clauses which'll cause the loop to terminate early if
1744 an implausible prologue instruction is encountered.
1745
1746 The expression
1747
1748 prologue_start + 64
1749
1750 is a suitable endpoint since it accounts for the largest
1751 possible prologue plus up to five instructions inserted by
1752 the scheduler. */
1753
1754 if (prologue_end > prologue_start + 64)
1755 {
1756 prologue_end = prologue_start + 64; /* See above. */
1757 }
1758 }
1759 else
1760 {
1761 /* We have no symbol information. Our only option is to assume this
1762 function has a standard stack frame and the normal frame register.
1763 Then, we can find the value of our frame pointer on entrance to
1764 the callee (or at the present moment if this is the innermost frame).
1765 The value stored there should be the address of the stmfd + 8. */
1766 CORE_ADDR frame_loc;
1767 LONGEST return_value;
1768
1769 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1770 if (!safe_read_memory_integer (frame_loc, 4, byte_order, &return_value))
1771 return;
1772 else
1773 {
1774 prologue_start = gdbarch_addr_bits_remove
1775 (gdbarch, return_value) - 8;
1776 prologue_end = prologue_start + 64; /* See above. */
1777 }
1778 }
1779
1780 if (prev_pc < prologue_end)
1781 prologue_end = prev_pc;
1782
1783 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1784}
1785
eb5492fa 1786static struct arm_prologue_cache *
a262aec2 1787arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 1788{
eb5492fa
DJ
1789 int reg;
1790 struct arm_prologue_cache *cache;
1791 CORE_ADDR unwound_fp;
c5aa993b 1792
35d5d4ee 1793 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 1794 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 1795
a262aec2 1796 arm_scan_prologue (this_frame, cache);
848cfffb 1797
a262aec2 1798 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
1799 if (unwound_fp == 0)
1800 return cache;
c906108c 1801
4be43953 1802 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 1803
eb5492fa
DJ
1804 /* Calculate actual addresses of saved registers using offsets
1805 determined by arm_scan_prologue. */
a262aec2 1806 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 1807 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
1808 cache->saved_regs[reg].addr += cache->prev_sp;
1809
1810 return cache;
c906108c
SS
1811}
1812
c1ee9414
LM
1813/* Implementation of the stop_reason hook for arm_prologue frames. */
1814
1815static enum unwind_stop_reason
1816arm_prologue_unwind_stop_reason (struct frame_info *this_frame,
1817 void **this_cache)
1818{
1819 struct arm_prologue_cache *cache;
1820 CORE_ADDR pc;
1821
1822 if (*this_cache == NULL)
1823 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1824 cache = (struct arm_prologue_cache *) *this_cache;
c1ee9414
LM
1825
1826 /* This is meant to halt the backtrace at "_start". */
1827 pc = get_frame_pc (this_frame);
1828 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
1829 return UNWIND_OUTERMOST;
1830
1831 /* If we've hit a wall, stop. */
1832 if (cache->prev_sp == 0)
1833 return UNWIND_OUTERMOST;
1834
1835 return UNWIND_NO_REASON;
1836}
1837
eb5492fa
DJ
1838/* Our frame ID for a normal frame is the current function's starting PC
1839 and the caller's SP when we were called. */
c906108c 1840
148754e5 1841static void
a262aec2 1842arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
1843 void **this_cache,
1844 struct frame_id *this_id)
c906108c 1845{
eb5492fa
DJ
1846 struct arm_prologue_cache *cache;
1847 struct frame_id id;
2c404490 1848 CORE_ADDR pc, func;
f079148d 1849
eb5492fa 1850 if (*this_cache == NULL)
a262aec2 1851 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1852 cache = (struct arm_prologue_cache *) *this_cache;
2a451106 1853
0e9e9abd
UW
1854 /* Use function start address as part of the frame ID. If we cannot
1855 identify the start address (due to missing symbol information),
1856 fall back to just using the current PC. */
c1ee9414 1857 pc = get_frame_pc (this_frame);
2c404490 1858 func = get_frame_func (this_frame);
0e9e9abd
UW
1859 if (!func)
1860 func = pc;
1861
eb5492fa 1862 id = frame_id_build (cache->prev_sp, func);
eb5492fa 1863 *this_id = id;
c906108c
SS
1864}
1865
a262aec2
DJ
1866static struct value *
1867arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 1868 void **this_cache,
a262aec2 1869 int prev_regnum)
24de872b 1870{
24568a2c 1871 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
1872 struct arm_prologue_cache *cache;
1873
eb5492fa 1874 if (*this_cache == NULL)
a262aec2 1875 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 1876 cache = (struct arm_prologue_cache *) *this_cache;
24de872b 1877
eb5492fa 1878 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
1879 instead. The prologue may save PC, but it will point into this
1880 frame's prologue, not the next frame's resume location. Also
1881 strip the saved T bit. A valid LR may have the low bit set, but
1882 a valid PC never does. */
eb5492fa 1883 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
1884 {
1885 CORE_ADDR lr;
1886
1887 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1888 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 1889 arm_addr_bits_remove (gdbarch, lr));
b39cc962 1890 }
24de872b 1891
eb5492fa 1892 /* SP is generally not saved to the stack, but this frame is
a262aec2 1893 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
1894 The value was already reconstructed into PREV_SP. */
1895 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 1896 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 1897
b39cc962
DJ
1898 /* The CPSR may have been changed by the call instruction and by the
1899 called function. The only bit we can reconstruct is the T bit,
1900 by checking the low bit of LR as of the call. This is a reliable
1901 indicator of Thumb-ness except for some ARM v4T pre-interworking
1902 Thumb code, which could get away with a clear low bit as long as
1903 the called function did not use bx. Guess that all other
1904 bits are unchanged; the condition flags are presumably lost,
1905 but the processor status is likely valid. */
1906 if (prev_regnum == ARM_PS_REGNUM)
1907 {
1908 CORE_ADDR lr, cpsr;
9779414d 1909 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
1910
1911 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
1912 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
1913 if (IS_THUMB_ADDR (lr))
9779414d 1914 cpsr |= t_bit;
b39cc962 1915 else
9779414d 1916 cpsr &= ~t_bit;
b39cc962
DJ
1917 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
1918 }
1919
a262aec2
DJ
1920 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
1921 prev_regnum);
eb5492fa
DJ
1922}
1923
1924struct frame_unwind arm_prologue_unwind = {
1925 NORMAL_FRAME,
c1ee9414 1926 arm_prologue_unwind_stop_reason,
eb5492fa 1927 arm_prologue_this_id,
a262aec2
DJ
1928 arm_prologue_prev_register,
1929 NULL,
1930 default_frame_sniffer
eb5492fa
DJ
1931};
1932
0e9e9abd
UW
1933/* Maintain a list of ARM exception table entries per objfile, similar to the
1934 list of mapping symbols. We only cache entries for standard ARM-defined
1935 personality routines; the cache will contain only the frame unwinding
1936 instructions associated with the entry (not the descriptors). */
1937
1938static const struct objfile_data *arm_exidx_data_key;
1939
1940struct arm_exidx_entry
1941{
1942 bfd_vma addr;
1943 gdb_byte *entry;
1944};
1945typedef struct arm_exidx_entry arm_exidx_entry_s;
1946DEF_VEC_O(arm_exidx_entry_s);
1947
1948struct arm_exidx_data
1949{
1950 VEC(arm_exidx_entry_s) **section_maps;
1951};
1952
1953static void
1954arm_exidx_data_free (struct objfile *objfile, void *arg)
1955{
9a3c8263 1956 struct arm_exidx_data *data = (struct arm_exidx_data *) arg;
0e9e9abd
UW
1957 unsigned int i;
1958
1959 for (i = 0; i < objfile->obfd->section_count; i++)
1960 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
1961}
1962
1963static inline int
1964arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
1965 const struct arm_exidx_entry *rhs)
1966{
1967 return lhs->addr < rhs->addr;
1968}
1969
1970static struct obj_section *
1971arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
1972{
1973 struct obj_section *osect;
1974
1975 ALL_OBJFILE_OSECTIONS (objfile, osect)
1976 if (bfd_get_section_flags (objfile->obfd,
1977 osect->the_bfd_section) & SEC_ALLOC)
1978 {
1979 bfd_vma start, size;
1980 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
1981 size = bfd_get_section_size (osect->the_bfd_section);
1982
1983 if (start <= vma && vma < start + size)
1984 return osect;
1985 }
1986
1987 return NULL;
1988}
1989
1990/* Parse contents of exception table and exception index sections
1991 of OBJFILE, and fill in the exception table entry cache.
1992
1993 For each entry that refers to a standard ARM-defined personality
1994 routine, extract the frame unwinding instructions (from either
1995 the index or the table section). The unwinding instructions
1996 are normalized by:
1997 - extracting them from the rest of the table data
1998 - converting to host endianness
1999 - appending the implicit 0xb0 ("Finish") code
2000
2001 The extracted and normalized instructions are stored for later
2002 retrieval by the arm_find_exidx_entry routine. */
2003
2004static void
2005arm_exidx_new_objfile (struct objfile *objfile)
2006{
3bb47e8b 2007 struct cleanup *cleanups;
0e9e9abd
UW
2008 struct arm_exidx_data *data;
2009 asection *exidx, *extab;
2010 bfd_vma exidx_vma = 0, extab_vma = 0;
2011 bfd_size_type exidx_size = 0, extab_size = 0;
2012 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2013 LONGEST i;
2014
2015 /* If we've already touched this file, do nothing. */
2016 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2017 return;
3bb47e8b 2018 cleanups = make_cleanup (null_cleanup, NULL);
0e9e9abd
UW
2019
2020 /* Read contents of exception table and index. */
a5eda10c 2021 exidx = bfd_get_section_by_name (objfile->obfd, ELF_STRING_ARM_unwind);
0e9e9abd
UW
2022 if (exidx)
2023 {
2024 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2025 exidx_size = bfd_get_section_size (exidx);
224c3ddb 2026 exidx_data = (gdb_byte *) xmalloc (exidx_size);
0e9e9abd
UW
2027 make_cleanup (xfree, exidx_data);
2028
2029 if (!bfd_get_section_contents (objfile->obfd, exidx,
2030 exidx_data, 0, exidx_size))
2031 {
2032 do_cleanups (cleanups);
2033 return;
2034 }
2035 }
2036
2037 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2038 if (extab)
2039 {
2040 extab_vma = bfd_section_vma (objfile->obfd, extab);
2041 extab_size = bfd_get_section_size (extab);
224c3ddb 2042 extab_data = (gdb_byte *) xmalloc (extab_size);
0e9e9abd
UW
2043 make_cleanup (xfree, extab_data);
2044
2045 if (!bfd_get_section_contents (objfile->obfd, extab,
2046 extab_data, 0, extab_size))
2047 {
2048 do_cleanups (cleanups);
2049 return;
2050 }
2051 }
2052
2053 /* Allocate exception table data structure. */
2054 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2055 set_objfile_data (objfile, arm_exidx_data_key, data);
2056 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2057 objfile->obfd->section_count,
2058 VEC(arm_exidx_entry_s) *);
2059
2060 /* Fill in exception table. */
2061 for (i = 0; i < exidx_size / 8; i++)
2062 {
2063 struct arm_exidx_entry new_exidx_entry;
2064 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2065 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2066 bfd_vma addr = 0, word = 0;
2067 int n_bytes = 0, n_words = 0;
2068 struct obj_section *sec;
2069 gdb_byte *entry = NULL;
2070
2071 /* Extract address of start of function. */
2072 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2073 idx += exidx_vma + i * 8;
2074
2075 /* Find section containing function and compute section offset. */
2076 sec = arm_obj_section_from_vma (objfile, idx);
2077 if (sec == NULL)
2078 continue;
2079 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2080
2081 /* Determine address of exception table entry. */
2082 if (val == 1)
2083 {
2084 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2085 }
2086 else if ((val & 0xff000000) == 0x80000000)
2087 {
2088 /* Exception table entry embedded in .ARM.exidx
2089 -- must be short form. */
2090 word = val;
2091 n_bytes = 3;
2092 }
2093 else if (!(val & 0x80000000))
2094 {
2095 /* Exception table entry in .ARM.extab. */
2096 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2097 addr += exidx_vma + i * 8 + 4;
2098
2099 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2100 {
2101 word = bfd_h_get_32 (objfile->obfd,
2102 extab_data + addr - extab_vma);
2103 addr += 4;
2104
2105 if ((word & 0xff000000) == 0x80000000)
2106 {
2107 /* Short form. */
2108 n_bytes = 3;
2109 }
2110 else if ((word & 0xff000000) == 0x81000000
2111 || (word & 0xff000000) == 0x82000000)
2112 {
2113 /* Long form. */
2114 n_bytes = 2;
2115 n_words = ((word >> 16) & 0xff);
2116 }
2117 else if (!(word & 0x80000000))
2118 {
2119 bfd_vma pers;
2120 struct obj_section *pers_sec;
2121 int gnu_personality = 0;
2122
2123 /* Custom personality routine. */
2124 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2125 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2126
2127 /* Check whether we've got one of the variants of the
2128 GNU personality routines. */
2129 pers_sec = arm_obj_section_from_vma (objfile, pers);
2130 if (pers_sec)
2131 {
2132 static const char *personality[] =
2133 {
2134 "__gcc_personality_v0",
2135 "__gxx_personality_v0",
2136 "__gcj_personality_v0",
2137 "__gnu_objc_personality_v0",
2138 NULL
2139 };
2140
2141 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2142 int k;
2143
2144 for (k = 0; personality[k]; k++)
2145 if (lookup_minimal_symbol_by_pc_name
2146 (pc, personality[k], objfile))
2147 {
2148 gnu_personality = 1;
2149 break;
2150 }
2151 }
2152
2153 /* If so, the next word contains a word count in the high
2154 byte, followed by the same unwind instructions as the
2155 pre-defined forms. */
2156 if (gnu_personality
2157 && addr + 4 <= extab_vma + extab_size)
2158 {
2159 word = bfd_h_get_32 (objfile->obfd,
2160 extab_data + addr - extab_vma);
2161 addr += 4;
2162 n_bytes = 3;
2163 n_words = ((word >> 24) & 0xff);
2164 }
2165 }
2166 }
2167 }
2168
2169 /* Sanity check address. */
2170 if (n_words)
2171 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2172 n_words = n_bytes = 0;
2173
2174 /* The unwind instructions reside in WORD (only the N_BYTES least
2175 significant bytes are valid), followed by N_WORDS words in the
2176 extab section starting at ADDR. */
2177 if (n_bytes || n_words)
2178 {
224c3ddb
SM
2179 gdb_byte *p = entry
2180 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2181 n_bytes + n_words * 4 + 1);
0e9e9abd
UW
2182
2183 while (n_bytes--)
2184 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2185
2186 while (n_words--)
2187 {
2188 word = bfd_h_get_32 (objfile->obfd,
2189 extab_data + addr - extab_vma);
2190 addr += 4;
2191
2192 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2193 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2194 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2195 *p++ = (gdb_byte) (word & 0xff);
2196 }
2197
2198 /* Implied "Finish" to terminate the list. */
2199 *p++ = 0xb0;
2200 }
2201
2202 /* Push entry onto vector. They are guaranteed to always
2203 appear in order of increasing addresses. */
2204 new_exidx_entry.addr = idx;
2205 new_exidx_entry.entry = entry;
2206 VEC_safe_push (arm_exidx_entry_s,
2207 data->section_maps[sec->the_bfd_section->index],
2208 &new_exidx_entry);
2209 }
2210
2211 do_cleanups (cleanups);
2212}
2213
2214/* Search for the exception table entry covering MEMADDR. If one is found,
2215 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2216 set *START to the start of the region covered by this entry. */
2217
2218static gdb_byte *
2219arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2220{
2221 struct obj_section *sec;
2222
2223 sec = find_pc_section (memaddr);
2224 if (sec != NULL)
2225 {
2226 struct arm_exidx_data *data;
2227 VEC(arm_exidx_entry_s) *map;
2228 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2229 unsigned int idx;
2230
9a3c8263
SM
2231 data = ((struct arm_exidx_data *)
2232 objfile_data (sec->objfile, arm_exidx_data_key));
0e9e9abd
UW
2233 if (data != NULL)
2234 {
2235 map = data->section_maps[sec->the_bfd_section->index];
2236 if (!VEC_empty (arm_exidx_entry_s, map))
2237 {
2238 struct arm_exidx_entry *map_sym;
2239
2240 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2241 arm_compare_exidx_entries);
2242
2243 /* VEC_lower_bound finds the earliest ordered insertion
2244 point. If the following symbol starts at this exact
2245 address, we use that; otherwise, the preceding
2246 exception table entry covers this address. */
2247 if (idx < VEC_length (arm_exidx_entry_s, map))
2248 {
2249 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2250 if (map_sym->addr == map_key.addr)
2251 {
2252 if (start)
2253 *start = map_sym->addr + obj_section_addr (sec);
2254 return map_sym->entry;
2255 }
2256 }
2257
2258 if (idx > 0)
2259 {
2260 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2261 if (start)
2262 *start = map_sym->addr + obj_section_addr (sec);
2263 return map_sym->entry;
2264 }
2265 }
2266 }
2267 }
2268
2269 return NULL;
2270}
2271
2272/* Given the current frame THIS_FRAME, and its associated frame unwinding
2273 instruction list from the ARM exception table entry ENTRY, allocate and
2274 return a prologue cache structure describing how to unwind this frame.
2275
2276 Return NULL if the unwinding instruction list contains a "spare",
2277 "reserved" or "refuse to unwind" instruction as defined in section
2278 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2279 for the ARM Architecture" document. */
2280
2281static struct arm_prologue_cache *
2282arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2283{
2284 CORE_ADDR vsp = 0;
2285 int vsp_valid = 0;
2286
2287 struct arm_prologue_cache *cache;
2288 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2289 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2290
2291 for (;;)
2292 {
2293 gdb_byte insn;
2294
2295 /* Whenever we reload SP, we actually have to retrieve its
2296 actual value in the current frame. */
2297 if (!vsp_valid)
2298 {
2299 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2300 {
2301 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2302 vsp = get_frame_register_unsigned (this_frame, reg);
2303 }
2304 else
2305 {
2306 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2307 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2308 }
2309
2310 vsp_valid = 1;
2311 }
2312
2313 /* Decode next unwind instruction. */
2314 insn = *entry++;
2315
2316 if ((insn & 0xc0) == 0)
2317 {
2318 int offset = insn & 0x3f;
2319 vsp += (offset << 2) + 4;
2320 }
2321 else if ((insn & 0xc0) == 0x40)
2322 {
2323 int offset = insn & 0x3f;
2324 vsp -= (offset << 2) + 4;
2325 }
2326 else if ((insn & 0xf0) == 0x80)
2327 {
2328 int mask = ((insn & 0xf) << 8) | *entry++;
2329 int i;
2330
2331 /* The special case of an all-zero mask identifies
2332 "Refuse to unwind". We return NULL to fall back
2333 to the prologue analyzer. */
2334 if (mask == 0)
2335 return NULL;
2336
2337 /* Pop registers r4..r15 under mask. */
2338 for (i = 0; i < 12; i++)
2339 if (mask & (1 << i))
2340 {
2341 cache->saved_regs[4 + i].addr = vsp;
2342 vsp += 4;
2343 }
2344
2345 /* Special-case popping SP -- we need to reload vsp. */
2346 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2347 vsp_valid = 0;
2348 }
2349 else if ((insn & 0xf0) == 0x90)
2350 {
2351 int reg = insn & 0xf;
2352
2353 /* Reserved cases. */
2354 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2355 return NULL;
2356
2357 /* Set SP from another register and mark VSP for reload. */
2358 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2359 vsp_valid = 0;
2360 }
2361 else if ((insn & 0xf0) == 0xa0)
2362 {
2363 int count = insn & 0x7;
2364 int pop_lr = (insn & 0x8) != 0;
2365 int i;
2366
2367 /* Pop r4..r[4+count]. */
2368 for (i = 0; i <= count; i++)
2369 {
2370 cache->saved_regs[4 + i].addr = vsp;
2371 vsp += 4;
2372 }
2373
2374 /* If indicated by flag, pop LR as well. */
2375 if (pop_lr)
2376 {
2377 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2378 vsp += 4;
2379 }
2380 }
2381 else if (insn == 0xb0)
2382 {
2383 /* We could only have updated PC by popping into it; if so, it
2384 will show up as address. Otherwise, copy LR into PC. */
2385 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2386 cache->saved_regs[ARM_PC_REGNUM]
2387 = cache->saved_regs[ARM_LR_REGNUM];
2388
2389 /* We're done. */
2390 break;
2391 }
2392 else if (insn == 0xb1)
2393 {
2394 int mask = *entry++;
2395 int i;
2396
2397 /* All-zero mask and mask >= 16 is "spare". */
2398 if (mask == 0 || mask >= 16)
2399 return NULL;
2400
2401 /* Pop r0..r3 under mask. */
2402 for (i = 0; i < 4; i++)
2403 if (mask & (1 << i))
2404 {
2405 cache->saved_regs[i].addr = vsp;
2406 vsp += 4;
2407 }
2408 }
2409 else if (insn == 0xb2)
2410 {
2411 ULONGEST offset = 0;
2412 unsigned shift = 0;
2413
2414 do
2415 {
2416 offset |= (*entry & 0x7f) << shift;
2417 shift += 7;
2418 }
2419 while (*entry++ & 0x80);
2420
2421 vsp += 0x204 + (offset << 2);
2422 }
2423 else if (insn == 0xb3)
2424 {
2425 int start = *entry >> 4;
2426 int count = (*entry++) & 0xf;
2427 int i;
2428
2429 /* Only registers D0..D15 are valid here. */
2430 if (start + count >= 16)
2431 return NULL;
2432
2433 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2434 for (i = 0; i <= count; i++)
2435 {
2436 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2437 vsp += 8;
2438 }
2439
2440 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2441 vsp += 4;
2442 }
2443 else if ((insn & 0xf8) == 0xb8)
2444 {
2445 int count = insn & 0x7;
2446 int i;
2447
2448 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2449 for (i = 0; i <= count; i++)
2450 {
2451 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2452 vsp += 8;
2453 }
2454
2455 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2456 vsp += 4;
2457 }
2458 else if (insn == 0xc6)
2459 {
2460 int start = *entry >> 4;
2461 int count = (*entry++) & 0xf;
2462 int i;
2463
2464 /* Only registers WR0..WR15 are valid. */
2465 if (start + count >= 16)
2466 return NULL;
2467
2468 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2469 for (i = 0; i <= count; i++)
2470 {
2471 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2472 vsp += 8;
2473 }
2474 }
2475 else if (insn == 0xc7)
2476 {
2477 int mask = *entry++;
2478 int i;
2479
2480 /* All-zero mask and mask >= 16 is "spare". */
2481 if (mask == 0 || mask >= 16)
2482 return NULL;
2483
2484 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2485 for (i = 0; i < 4; i++)
2486 if (mask & (1 << i))
2487 {
2488 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2489 vsp += 4;
2490 }
2491 }
2492 else if ((insn & 0xf8) == 0xc0)
2493 {
2494 int count = insn & 0x7;
2495 int i;
2496
2497 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2498 for (i = 0; i <= count; i++)
2499 {
2500 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2501 vsp += 8;
2502 }
2503 }
2504 else if (insn == 0xc8)
2505 {
2506 int start = *entry >> 4;
2507 int count = (*entry++) & 0xf;
2508 int i;
2509
2510 /* Only registers D0..D31 are valid. */
2511 if (start + count >= 16)
2512 return NULL;
2513
2514 /* Pop VFP double-precision registers
2515 D[16+start]..D[16+start+count]. */
2516 for (i = 0; i <= count; i++)
2517 {
2518 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2519 vsp += 8;
2520 }
2521 }
2522 else if (insn == 0xc9)
2523 {
2524 int start = *entry >> 4;
2525 int count = (*entry++) & 0xf;
2526 int i;
2527
2528 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2529 for (i = 0; i <= count; i++)
2530 {
2531 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2532 vsp += 8;
2533 }
2534 }
2535 else if ((insn & 0xf8) == 0xd0)
2536 {
2537 int count = insn & 0x7;
2538 int i;
2539
2540 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2541 for (i = 0; i <= count; i++)
2542 {
2543 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2544 vsp += 8;
2545 }
2546 }
2547 else
2548 {
2549 /* Everything else is "spare". */
2550 return NULL;
2551 }
2552 }
2553
2554 /* If we restore SP from a register, assume this was the frame register.
2555 Otherwise just fall back to SP as frame register. */
2556 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2557 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2558 else
2559 cache->framereg = ARM_SP_REGNUM;
2560
2561 /* Determine offset to previous frame. */
2562 cache->framesize
2563 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2564
2565 /* We already got the previous SP. */
2566 cache->prev_sp = vsp;
2567
2568 return cache;
2569}
2570
2571/* Unwinding via ARM exception table entries. Note that the sniffer
2572 already computes a filled-in prologue cache, which is then used
2573 with the same arm_prologue_this_id and arm_prologue_prev_register
2574 routines also used for prologue-parsing based unwinding. */
2575
2576static int
2577arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2578 struct frame_info *this_frame,
2579 void **this_prologue_cache)
2580{
2581 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2582 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2583 CORE_ADDR addr_in_block, exidx_region, func_start;
2584 struct arm_prologue_cache *cache;
2585 gdb_byte *entry;
2586
2587 /* See if we have an ARM exception table entry covering this address. */
2588 addr_in_block = get_frame_address_in_block (this_frame);
2589 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2590 if (!entry)
2591 return 0;
2592
2593 /* The ARM exception table does not describe unwind information
2594 for arbitrary PC values, but is guaranteed to be correct only
2595 at call sites. We have to decide here whether we want to use
2596 ARM exception table information for this frame, or fall back
2597 to using prologue parsing. (Note that if we have DWARF CFI,
2598 this sniffer isn't even called -- CFI is always preferred.)
2599
2600 Before we make this decision, however, we check whether we
2601 actually have *symbol* information for the current frame.
2602 If not, prologue parsing would not work anyway, so we might
2603 as well use the exception table and hope for the best. */
2604 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2605 {
2606 int exc_valid = 0;
2607
2608 /* If the next frame is "normal", we are at a call site in this
2609 frame, so exception information is guaranteed to be valid. */
2610 if (get_next_frame (this_frame)
2611 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2612 exc_valid = 1;
2613
2614 /* We also assume exception information is valid if we're currently
2615 blocked in a system call. The system library is supposed to
d9311bfa
AT
2616 ensure this, so that e.g. pthread cancellation works. */
2617 if (arm_frame_is_thumb (this_frame))
0e9e9abd 2618 {
d9311bfa 2619 LONGEST insn;
416dc9c6 2620
d9311bfa
AT
2621 if (safe_read_memory_integer (get_frame_pc (this_frame) - 2, 2,
2622 byte_order_for_code, &insn)
2623 && (insn & 0xff00) == 0xdf00 /* svc */)
2624 exc_valid = 1;
0e9e9abd 2625 }
d9311bfa
AT
2626 else
2627 {
2628 LONGEST insn;
416dc9c6 2629
d9311bfa
AT
2630 if (safe_read_memory_integer (get_frame_pc (this_frame) - 4, 4,
2631 byte_order_for_code, &insn)
2632 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2633 exc_valid = 1;
2634 }
2635
0e9e9abd
UW
2636 /* Bail out if we don't know that exception information is valid. */
2637 if (!exc_valid)
2638 return 0;
2639
2640 /* The ARM exception index does not mark the *end* of the region
2641 covered by the entry, and some functions will not have any entry.
2642 To correctly recognize the end of the covered region, the linker
2643 should have inserted dummy records with a CANTUNWIND marker.
2644
2645 Unfortunately, current versions of GNU ld do not reliably do
2646 this, and thus we may have found an incorrect entry above.
2647 As a (temporary) sanity check, we only use the entry if it
2648 lies *within* the bounds of the function. Note that this check
2649 might reject perfectly valid entries that just happen to cover
2650 multiple functions; therefore this check ought to be removed
2651 once the linker is fixed. */
2652 if (func_start > exidx_region)
2653 return 0;
2654 }
2655
2656 /* Decode the list of unwinding instructions into a prologue cache.
2657 Note that this may fail due to e.g. a "refuse to unwind" code. */
2658 cache = arm_exidx_fill_cache (this_frame, entry);
2659 if (!cache)
2660 return 0;
2661
2662 *this_prologue_cache = cache;
2663 return 1;
2664}
2665
2666struct frame_unwind arm_exidx_unwind = {
2667 NORMAL_FRAME,
8fbca658 2668 default_frame_unwind_stop_reason,
0e9e9abd
UW
2669 arm_prologue_this_id,
2670 arm_prologue_prev_register,
2671 NULL,
2672 arm_exidx_unwind_sniffer
2673};
2674
80d8d390
YQ
2675/* Recognize GCC's trampoline for thumb call-indirect. If we are in a
2676 trampoline, return the target PC. Otherwise return 0.
2677
2678 void call0a (char c, short s, int i, long l) {}
2679
2680 int main (void)
2681 {
2682 (*pointer_to_call0a) (c, s, i, l);
2683 }
2684
2685 Instead of calling a stub library function _call_via_xx (xx is
2686 the register name), GCC may inline the trampoline in the object
2687 file as below (register r2 has the address of call0a).
2688
2689 .global main
2690 .type main, %function
2691 ...
2692 bl .L1
2693 ...
2694 .size main, .-main
2695
2696 .L1:
2697 bx r2
2698
2699 The trampoline 'bx r2' doesn't belong to main. */
2700
2701static CORE_ADDR
2702arm_skip_bx_reg (struct frame_info *frame, CORE_ADDR pc)
2703{
2704 /* The heuristics of recognizing such trampoline is that FRAME is
2705 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
2706 if (arm_frame_is_thumb (frame))
2707 {
2708 gdb_byte buf[2];
2709
2710 if (target_read_memory (pc, buf, 2) == 0)
2711 {
2712 struct gdbarch *gdbarch = get_frame_arch (frame);
2713 enum bfd_endian byte_order_for_code
2714 = gdbarch_byte_order_for_code (gdbarch);
2715 uint16_t insn
2716 = extract_unsigned_integer (buf, 2, byte_order_for_code);
2717
2718 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
2719 {
2720 CORE_ADDR dest
2721 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
2722
2723 /* Clear the LSB so that gdb core sets step-resume
2724 breakpoint at the right address. */
2725 return UNMAKE_THUMB_ADDR (dest);
2726 }
2727 }
2728 }
2729
2730 return 0;
2731}
2732
909cf6ea 2733static struct arm_prologue_cache *
a262aec2 2734arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2735{
909cf6ea 2736 struct arm_prologue_cache *cache;
909cf6ea 2737
35d5d4ee 2738 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2739 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2740
a262aec2 2741 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2742
2743 return cache;
2744}
2745
2746/* Our frame ID for a stub frame is the current SP and LR. */
2747
2748static void
a262aec2 2749arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2750 void **this_cache,
2751 struct frame_id *this_id)
2752{
2753 struct arm_prologue_cache *cache;
2754
2755 if (*this_cache == NULL)
a262aec2 2756 *this_cache = arm_make_stub_cache (this_frame);
9a3c8263 2757 cache = (struct arm_prologue_cache *) *this_cache;
909cf6ea 2758
a262aec2 2759 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2760}
2761
a262aec2
DJ
2762static int
2763arm_stub_unwind_sniffer (const struct frame_unwind *self,
2764 struct frame_info *this_frame,
2765 void **this_prologue_cache)
909cf6ea 2766{
93d42b30 2767 CORE_ADDR addr_in_block;
948f8e3d 2768 gdb_byte dummy[4];
18d18ac8
YQ
2769 CORE_ADDR pc, start_addr;
2770 const char *name;
909cf6ea 2771
a262aec2 2772 addr_in_block = get_frame_address_in_block (this_frame);
18d18ac8 2773 pc = get_frame_pc (this_frame);
3e5d3a5a 2774 if (in_plt_section (addr_in_block)
fc36e839
DE
2775 /* We also use the stub winder if the target memory is unreadable
2776 to avoid having the prologue unwinder trying to read it. */
18d18ac8
YQ
2777 || target_read_memory (pc, dummy, 4) != 0)
2778 return 1;
2779
2780 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
2781 && arm_skip_bx_reg (this_frame, pc) != 0)
a262aec2 2782 return 1;
909cf6ea 2783
a262aec2 2784 return 0;
909cf6ea
DJ
2785}
2786
a262aec2
DJ
2787struct frame_unwind arm_stub_unwind = {
2788 NORMAL_FRAME,
8fbca658 2789 default_frame_unwind_stop_reason,
a262aec2
DJ
2790 arm_stub_this_id,
2791 arm_prologue_prev_register,
2792 NULL,
2793 arm_stub_unwind_sniffer
2794};
2795
2ae28aa9
YQ
2796/* Put here the code to store, into CACHE->saved_regs, the addresses
2797 of the saved registers of frame described by THIS_FRAME. CACHE is
2798 returned. */
2799
2800static struct arm_prologue_cache *
2801arm_m_exception_cache (struct frame_info *this_frame)
2802{
2803 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2804 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2805 struct arm_prologue_cache *cache;
2806 CORE_ADDR unwound_sp;
2807 LONGEST xpsr;
2808
2809 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2810 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2811
2812 unwound_sp = get_frame_register_unsigned (this_frame,
2813 ARM_SP_REGNUM);
2814
2815 /* The hardware saves eight 32-bit words, comprising xPSR,
2816 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
2817 "B1.5.6 Exception entry behavior" in
2818 "ARMv7-M Architecture Reference Manual". */
2819 cache->saved_regs[0].addr = unwound_sp;
2820 cache->saved_regs[1].addr = unwound_sp + 4;
2821 cache->saved_regs[2].addr = unwound_sp + 8;
2822 cache->saved_regs[3].addr = unwound_sp + 12;
2823 cache->saved_regs[12].addr = unwound_sp + 16;
2824 cache->saved_regs[14].addr = unwound_sp + 20;
2825 cache->saved_regs[15].addr = unwound_sp + 24;
2826 cache->saved_regs[ARM_PS_REGNUM].addr = unwound_sp + 28;
2827
2828 /* If bit 9 of the saved xPSR is set, then there is a four-byte
2829 aligner between the top of the 32-byte stack frame and the
2830 previous context's stack pointer. */
2831 cache->prev_sp = unwound_sp + 32;
2832 if (safe_read_memory_integer (unwound_sp + 28, 4, byte_order, &xpsr)
2833 && (xpsr & (1 << 9)) != 0)
2834 cache->prev_sp += 4;
2835
2836 return cache;
2837}
2838
2839/* Implementation of function hook 'this_id' in
2840 'struct frame_uwnind'. */
2841
2842static void
2843arm_m_exception_this_id (struct frame_info *this_frame,
2844 void **this_cache,
2845 struct frame_id *this_id)
2846{
2847 struct arm_prologue_cache *cache;
2848
2849 if (*this_cache == NULL)
2850 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2851 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2852
2853 /* Our frame ID for a stub frame is the current SP and LR. */
2854 *this_id = frame_id_build (cache->prev_sp,
2855 get_frame_pc (this_frame));
2856}
2857
2858/* Implementation of function hook 'prev_register' in
2859 'struct frame_uwnind'. */
2860
2861static struct value *
2862arm_m_exception_prev_register (struct frame_info *this_frame,
2863 void **this_cache,
2864 int prev_regnum)
2865{
2866 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2867 struct arm_prologue_cache *cache;
2868
2869 if (*this_cache == NULL)
2870 *this_cache = arm_m_exception_cache (this_frame);
9a3c8263 2871 cache = (struct arm_prologue_cache *) *this_cache;
2ae28aa9
YQ
2872
2873 /* The value was already reconstructed into PREV_SP. */
2874 if (prev_regnum == ARM_SP_REGNUM)
2875 return frame_unwind_got_constant (this_frame, prev_regnum,
2876 cache->prev_sp);
2877
2878 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2879 prev_regnum);
2880}
2881
2882/* Implementation of function hook 'sniffer' in
2883 'struct frame_uwnind'. */
2884
2885static int
2886arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
2887 struct frame_info *this_frame,
2888 void **this_prologue_cache)
2889{
2890 CORE_ADDR this_pc = get_frame_pc (this_frame);
2891
2892 /* No need to check is_m; this sniffer is only registered for
2893 M-profile architectures. */
2894
2895 /* Exception frames return to one of these magic PCs. Other values
2896 are not defined as of v7-M. See details in "B1.5.8 Exception
2897 return behavior" in "ARMv7-M Architecture Reference Manual". */
2898 if (this_pc == 0xfffffff1 || this_pc == 0xfffffff9
2899 || this_pc == 0xfffffffd)
2900 return 1;
2901
2902 return 0;
2903}
2904
2905/* Frame unwinder for M-profile exceptions. */
2906
2907struct frame_unwind arm_m_exception_unwind =
2908{
2909 SIGTRAMP_FRAME,
2910 default_frame_unwind_stop_reason,
2911 arm_m_exception_this_id,
2912 arm_m_exception_prev_register,
2913 NULL,
2914 arm_m_exception_unwind_sniffer
2915};
2916
24de872b 2917static CORE_ADDR
a262aec2 2918arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
2919{
2920 struct arm_prologue_cache *cache;
2921
eb5492fa 2922 if (*this_cache == NULL)
a262aec2 2923 *this_cache = arm_make_prologue_cache (this_frame);
9a3c8263 2924 cache = (struct arm_prologue_cache *) *this_cache;
eb5492fa 2925
4be43953 2926 return cache->prev_sp - cache->framesize;
24de872b
DJ
2927}
2928
eb5492fa
DJ
2929struct frame_base arm_normal_base = {
2930 &arm_prologue_unwind,
2931 arm_normal_frame_base,
2932 arm_normal_frame_base,
2933 arm_normal_frame_base
2934};
2935
a262aec2 2936/* Assuming THIS_FRAME is a dummy, return the frame ID of that
eb5492fa
DJ
2937 dummy frame. The frame ID's base needs to match the TOS value
2938 saved by save_dummy_frame_tos() and returned from
2939 arm_push_dummy_call, and the PC needs to match the dummy frame's
2940 breakpoint. */
c906108c 2941
eb5492fa 2942static struct frame_id
a262aec2 2943arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
c906108c 2944{
0963b4bd
MS
2945 return frame_id_build (get_frame_register_unsigned (this_frame,
2946 ARM_SP_REGNUM),
a262aec2 2947 get_frame_pc (this_frame));
eb5492fa 2948}
c3b4394c 2949
eb5492fa
DJ
2950/* Given THIS_FRAME, find the previous frame's resume PC (which will
2951 be used to construct the previous frame's ID, after looking up the
2952 containing function). */
c3b4394c 2953
eb5492fa
DJ
2954static CORE_ADDR
2955arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
2956{
2957 CORE_ADDR pc;
2958 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
24568a2c 2959 return arm_addr_bits_remove (gdbarch, pc);
eb5492fa
DJ
2960}
2961
2962static CORE_ADDR
2963arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
2964{
2965 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
c906108c
SS
2966}
2967
b39cc962
DJ
2968static struct value *
2969arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
2970 int regnum)
2971{
24568a2c 2972 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 2973 CORE_ADDR lr, cpsr;
9779414d 2974 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2975
2976 switch (regnum)
2977 {
2978 case ARM_PC_REGNUM:
2979 /* The PC is normally copied from the return column, which
2980 describes saves of LR. However, that version may have an
2981 extra bit set to indicate Thumb state. The bit is not
2982 part of the PC. */
2983 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2984 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 2985 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
2986
2987 case ARM_PS_REGNUM:
2988 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 2989 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
2990 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2991 if (IS_THUMB_ADDR (lr))
9779414d 2992 cpsr |= t_bit;
b39cc962 2993 else
9779414d 2994 cpsr &= ~t_bit;
ca38c58e 2995 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
2996
2997 default:
2998 internal_error (__FILE__, __LINE__,
2999 _("Unexpected register %d"), regnum);
3000 }
3001}
3002
3003static void
3004arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3005 struct dwarf2_frame_state_reg *reg,
3006 struct frame_info *this_frame)
3007{
3008 switch (regnum)
3009 {
3010 case ARM_PC_REGNUM:
3011 case ARM_PS_REGNUM:
3012 reg->how = DWARF2_FRAME_REG_FN;
3013 reg->loc.fn = arm_dwarf2_prev_register;
3014 break;
3015 case ARM_SP_REGNUM:
3016 reg->how = DWARF2_FRAME_REG_CFA;
3017 break;
3018 }
3019}
3020
c9cf6e20 3021/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3022
3023static int
c9cf6e20 3024thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3025{
3026 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3027 unsigned int insn, insn2;
3028 int found_return = 0, found_stack_adjust = 0;
3029 CORE_ADDR func_start, func_end;
3030 CORE_ADDR scan_pc;
3031 gdb_byte buf[4];
3032
3033 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3034 return 0;
3035
3036 /* The epilogue is a sequence of instructions along the following lines:
3037
3038 - add stack frame size to SP or FP
3039 - [if frame pointer used] restore SP from FP
3040 - restore registers from SP [may include PC]
3041 - a return-type instruction [if PC wasn't already restored]
3042
3043 In a first pass, we scan forward from the current PC and verify the
3044 instructions we find as compatible with this sequence, ending in a
3045 return instruction.
3046
3047 However, this is not sufficient to distinguish indirect function calls
3048 within a function from indirect tail calls in the epilogue in some cases.
3049 Therefore, if we didn't already find any SP-changing instruction during
3050 forward scan, we add a backward scanning heuristic to ensure we actually
3051 are in the epilogue. */
3052
3053 scan_pc = pc;
3054 while (scan_pc < func_end && !found_return)
3055 {
3056 if (target_read_memory (scan_pc, buf, 2))
3057 break;
3058
3059 scan_pc += 2;
3060 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3061
3062 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3063 found_return = 1;
3064 else if (insn == 0x46f7) /* mov pc, lr */
3065 found_return = 1;
540314bd 3066 else if (thumb_instruction_restores_sp (insn))
4024ca99 3067 {
b7576e5c 3068 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4024ca99
UW
3069 found_return = 1;
3070 }
db24da6d 3071 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3072 {
3073 if (target_read_memory (scan_pc, buf, 2))
3074 break;
3075
3076 scan_pc += 2;
3077 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3078
3079 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3080 {
4024ca99
UW
3081 if (insn2 & 0x8000) /* <registers> include PC. */
3082 found_return = 1;
3083 }
3084 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3085 && (insn2 & 0x0fff) == 0x0b04)
3086 {
4024ca99
UW
3087 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3088 found_return = 1;
3089 }
3090 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3091 && (insn2 & 0x0e00) == 0x0a00)
6b65d1b6 3092 ;
4024ca99
UW
3093 else
3094 break;
3095 }
3096 else
3097 break;
3098 }
3099
3100 if (!found_return)
3101 return 0;
3102
3103 /* Since any instruction in the epilogue sequence, with the possible
3104 exception of return itself, updates the stack pointer, we need to
3105 scan backwards for at most one instruction. Try either a 16-bit or
3106 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3107 too much about false positives. */
4024ca99 3108
6b65d1b6
YQ
3109 if (pc - 4 < func_start)
3110 return 0;
3111 if (target_read_memory (pc - 4, buf, 4))
3112 return 0;
4024ca99 3113
6b65d1b6
YQ
3114 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3115 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3116
3117 if (thumb_instruction_restores_sp (insn2))
3118 found_stack_adjust = 1;
3119 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3120 found_stack_adjust = 1;
3121 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3122 && (insn2 & 0x0fff) == 0x0b04)
3123 found_stack_adjust = 1;
3124 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3125 && (insn2 & 0x0e00) == 0x0a00)
3126 found_stack_adjust = 1;
4024ca99
UW
3127
3128 return found_stack_adjust;
3129}
3130
c9cf6e20 3131/* Implement the stack_frame_destroyed_p gdbarch method. */
4024ca99
UW
3132
3133static int
c9cf6e20 3134arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4024ca99
UW
3135{
3136 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3137 unsigned int insn;
f303bc3e 3138 int found_return;
4024ca99
UW
3139 CORE_ADDR func_start, func_end;
3140
3141 if (arm_pc_is_thumb (gdbarch, pc))
c9cf6e20 3142 return thumb_stack_frame_destroyed_p (gdbarch, pc);
4024ca99
UW
3143
3144 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3145 return 0;
3146
3147 /* We are in the epilogue if the previous instruction was a stack
3148 adjustment and the next instruction is a possible return (bx, mov
3149 pc, or pop). We could have to scan backwards to find the stack
3150 adjustment, or forwards to find the return, but this is a decent
3151 approximation. First scan forwards. */
3152
3153 found_return = 0;
3154 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3155 if (bits (insn, 28, 31) != INST_NV)
3156 {
3157 if ((insn & 0x0ffffff0) == 0x012fff10)
3158 /* BX. */
3159 found_return = 1;
3160 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3161 /* MOV PC. */
3162 found_return = 1;
3163 else if ((insn & 0x0fff0000) == 0x08bd0000
3164 && (insn & 0x0000c000) != 0)
3165 /* POP (LDMIA), including PC or LR. */
3166 found_return = 1;
3167 }
3168
3169 if (!found_return)
3170 return 0;
3171
3172 /* Scan backwards. This is just a heuristic, so do not worry about
3173 false positives from mode changes. */
3174
3175 if (pc < func_start + 4)
3176 return 0;
3177
3178 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
f303bc3e 3179 if (arm_instruction_restores_sp (insn))
4024ca99
UW
3180 return 1;
3181
3182 return 0;
3183}
3184
3185
2dd604e7
RE
3186/* When arguments must be pushed onto the stack, they go on in reverse
3187 order. The code below implements a FILO (stack) to do this. */
3188
3189struct stack_item
3190{
3191 int len;
3192 struct stack_item *prev;
7c543f7b 3193 gdb_byte *data;
2dd604e7
RE
3194};
3195
3196static struct stack_item *
df3b6708 3197push_stack_item (struct stack_item *prev, const gdb_byte *contents, int len)
2dd604e7
RE
3198{
3199 struct stack_item *si;
8d749320 3200 si = XNEW (struct stack_item);
7c543f7b 3201 si->data = (gdb_byte *) xmalloc (len);
2dd604e7
RE
3202 si->len = len;
3203 si->prev = prev;
3204 memcpy (si->data, contents, len);
3205 return si;
3206}
3207
3208static struct stack_item *
3209pop_stack_item (struct stack_item *si)
3210{
3211 struct stack_item *dead = si;
3212 si = si->prev;
3213 xfree (dead->data);
3214 xfree (dead);
3215 return si;
3216}
3217
2af48f68
PB
3218
3219/* Return the alignment (in bytes) of the given type. */
3220
3221static int
3222arm_type_align (struct type *t)
3223{
3224 int n;
3225 int align;
3226 int falign;
3227
3228 t = check_typedef (t);
3229 switch (TYPE_CODE (t))
3230 {
3231 default:
3232 /* Should never happen. */
3233 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3234 return 4;
3235
3236 case TYPE_CODE_PTR:
3237 case TYPE_CODE_ENUM:
3238 case TYPE_CODE_INT:
3239 case TYPE_CODE_FLT:
3240 case TYPE_CODE_SET:
3241 case TYPE_CODE_RANGE:
2af48f68
PB
3242 case TYPE_CODE_REF:
3243 case TYPE_CODE_CHAR:
3244 case TYPE_CODE_BOOL:
3245 return TYPE_LENGTH (t);
3246
3247 case TYPE_CODE_ARRAY:
c4312b19
YQ
3248 if (TYPE_VECTOR (t))
3249 {
3250 /* Use the natural alignment for vector types (the same for
3251 scalar type), but the maximum alignment is 64-bit. */
3252 if (TYPE_LENGTH (t) > 8)
3253 return 8;
3254 else
3255 return TYPE_LENGTH (t);
3256 }
3257 else
3258 return arm_type_align (TYPE_TARGET_TYPE (t));
2af48f68 3259 case TYPE_CODE_COMPLEX:
2af48f68
PB
3260 return arm_type_align (TYPE_TARGET_TYPE (t));
3261
3262 case TYPE_CODE_STRUCT:
3263 case TYPE_CODE_UNION:
3264 align = 1;
3265 for (n = 0; n < TYPE_NFIELDS (t); n++)
3266 {
3267 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3268 if (falign > align)
3269 align = falign;
3270 }
3271 return align;
3272 }
3273}
3274
90445bd3
DJ
3275/* Possible base types for a candidate for passing and returning in
3276 VFP registers. */
3277
3278enum arm_vfp_cprc_base_type
3279{
3280 VFP_CPRC_UNKNOWN,
3281 VFP_CPRC_SINGLE,
3282 VFP_CPRC_DOUBLE,
3283 VFP_CPRC_VEC64,
3284 VFP_CPRC_VEC128
3285};
3286
3287/* The length of one element of base type B. */
3288
3289static unsigned
3290arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3291{
3292 switch (b)
3293 {
3294 case VFP_CPRC_SINGLE:
3295 return 4;
3296 case VFP_CPRC_DOUBLE:
3297 return 8;
3298 case VFP_CPRC_VEC64:
3299 return 8;
3300 case VFP_CPRC_VEC128:
3301 return 16;
3302 default:
3303 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3304 (int) b);
3305 }
3306}
3307
3308/* The character ('s', 'd' or 'q') for the type of VFP register used
3309 for passing base type B. */
3310
3311static int
3312arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3313{
3314 switch (b)
3315 {
3316 case VFP_CPRC_SINGLE:
3317 return 's';
3318 case VFP_CPRC_DOUBLE:
3319 return 'd';
3320 case VFP_CPRC_VEC64:
3321 return 'd';
3322 case VFP_CPRC_VEC128:
3323 return 'q';
3324 default:
3325 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3326 (int) b);
3327 }
3328}
3329
3330/* Determine whether T may be part of a candidate for passing and
3331 returning in VFP registers, ignoring the limit on the total number
3332 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3333 classification of the first valid component found; if it is not
3334 VFP_CPRC_UNKNOWN, all components must have the same classification
3335 as *BASE_TYPE. If it is found that T contains a type not permitted
3336 for passing and returning in VFP registers, a type differently
3337 classified from *BASE_TYPE, or two types differently classified
3338 from each other, return -1, otherwise return the total number of
3339 base-type elements found (possibly 0 in an empty structure or
817e0957
YQ
3340 array). Vector types are not currently supported, matching the
3341 generic AAPCS support. */
90445bd3
DJ
3342
3343static int
3344arm_vfp_cprc_sub_candidate (struct type *t,
3345 enum arm_vfp_cprc_base_type *base_type)
3346{
3347 t = check_typedef (t);
3348 switch (TYPE_CODE (t))
3349 {
3350 case TYPE_CODE_FLT:
3351 switch (TYPE_LENGTH (t))
3352 {
3353 case 4:
3354 if (*base_type == VFP_CPRC_UNKNOWN)
3355 *base_type = VFP_CPRC_SINGLE;
3356 else if (*base_type != VFP_CPRC_SINGLE)
3357 return -1;
3358 return 1;
3359
3360 case 8:
3361 if (*base_type == VFP_CPRC_UNKNOWN)
3362 *base_type = VFP_CPRC_DOUBLE;
3363 else if (*base_type != VFP_CPRC_DOUBLE)
3364 return -1;
3365 return 1;
3366
3367 default:
3368 return -1;
3369 }
3370 break;
3371
817e0957
YQ
3372 case TYPE_CODE_COMPLEX:
3373 /* Arguments of complex T where T is one of the types float or
3374 double get treated as if they are implemented as:
3375
3376 struct complexT
3377 {
3378 T real;
3379 T imag;
5f52445b
YQ
3380 };
3381
3382 */
817e0957
YQ
3383 switch (TYPE_LENGTH (t))
3384 {
3385 case 8:
3386 if (*base_type == VFP_CPRC_UNKNOWN)
3387 *base_type = VFP_CPRC_SINGLE;
3388 else if (*base_type != VFP_CPRC_SINGLE)
3389 return -1;
3390 return 2;
3391
3392 case 16:
3393 if (*base_type == VFP_CPRC_UNKNOWN)
3394 *base_type = VFP_CPRC_DOUBLE;
3395 else if (*base_type != VFP_CPRC_DOUBLE)
3396 return -1;
3397 return 2;
3398
3399 default:
3400 return -1;
3401 }
3402 break;
3403
90445bd3
DJ
3404 case TYPE_CODE_ARRAY:
3405 {
c4312b19 3406 if (TYPE_VECTOR (t))
90445bd3 3407 {
c4312b19
YQ
3408 /* A 64-bit or 128-bit containerized vector type are VFP
3409 CPRCs. */
3410 switch (TYPE_LENGTH (t))
3411 {
3412 case 8:
3413 if (*base_type == VFP_CPRC_UNKNOWN)
3414 *base_type = VFP_CPRC_VEC64;
3415 return 1;
3416 case 16:
3417 if (*base_type == VFP_CPRC_UNKNOWN)
3418 *base_type = VFP_CPRC_VEC128;
3419 return 1;
3420 default:
3421 return -1;
3422 }
3423 }
3424 else
3425 {
3426 int count;
3427 unsigned unitlen;
3428
3429 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t),
3430 base_type);
3431 if (count == -1)
3432 return -1;
3433 if (TYPE_LENGTH (t) == 0)
3434 {
3435 gdb_assert (count == 0);
3436 return 0;
3437 }
3438 else if (count == 0)
3439 return -1;
3440 unitlen = arm_vfp_cprc_unit_length (*base_type);
3441 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3442 return TYPE_LENGTH (t) / unitlen;
90445bd3 3443 }
90445bd3
DJ
3444 }
3445 break;
3446
3447 case TYPE_CODE_STRUCT:
3448 {
3449 int count = 0;
3450 unsigned unitlen;
3451 int i;
3452 for (i = 0; i < TYPE_NFIELDS (t); i++)
3453 {
3454 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3455 base_type);
3456 if (sub_count == -1)
3457 return -1;
3458 count += sub_count;
3459 }
3460 if (TYPE_LENGTH (t) == 0)
3461 {
3462 gdb_assert (count == 0);
3463 return 0;
3464 }
3465 else if (count == 0)
3466 return -1;
3467 unitlen = arm_vfp_cprc_unit_length (*base_type);
3468 if (TYPE_LENGTH (t) != unitlen * count)
3469 return -1;
3470 return count;
3471 }
3472
3473 case TYPE_CODE_UNION:
3474 {
3475 int count = 0;
3476 unsigned unitlen;
3477 int i;
3478 for (i = 0; i < TYPE_NFIELDS (t); i++)
3479 {
3480 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3481 base_type);
3482 if (sub_count == -1)
3483 return -1;
3484 count = (count > sub_count ? count : sub_count);
3485 }
3486 if (TYPE_LENGTH (t) == 0)
3487 {
3488 gdb_assert (count == 0);
3489 return 0;
3490 }
3491 else if (count == 0)
3492 return -1;
3493 unitlen = arm_vfp_cprc_unit_length (*base_type);
3494 if (TYPE_LENGTH (t) != unitlen * count)
3495 return -1;
3496 return count;
3497 }
3498
3499 default:
3500 break;
3501 }
3502
3503 return -1;
3504}
3505
3506/* Determine whether T is a VFP co-processor register candidate (CPRC)
3507 if passed to or returned from a non-variadic function with the VFP
3508 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3509 *BASE_TYPE to the base type for T and *COUNT to the number of
3510 elements of that base type before returning. */
3511
3512static int
3513arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3514 int *count)
3515{
3516 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3517 int c = arm_vfp_cprc_sub_candidate (t, &b);
3518 if (c <= 0 || c > 4)
3519 return 0;
3520 *base_type = b;
3521 *count = c;
3522 return 1;
3523}
3524
3525/* Return 1 if the VFP ABI should be used for passing arguments to and
3526 returning values from a function of type FUNC_TYPE, 0
3527 otherwise. */
3528
3529static int
3530arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3531{
3532 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3533 /* Variadic functions always use the base ABI. Assume that functions
3534 without debug info are not variadic. */
3535 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3536 return 0;
3537 /* The VFP ABI is only supported as a variant of AAPCS. */
3538 if (tdep->arm_abi != ARM_ABI_AAPCS)
3539 return 0;
3540 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3541}
3542
3543/* We currently only support passing parameters in integer registers, which
3544 conforms with GCC's default model, and VFP argument passing following
3545 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3546 we should probably support some of them based on the selected ABI. */
3547
3548static CORE_ADDR
7d9b040b 3549arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
3550 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3551 struct value **args, CORE_ADDR sp, int struct_return,
3552 CORE_ADDR struct_addr)
2dd604e7 3553{
e17a4113 3554 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3555 int argnum;
3556 int argreg;
3557 int nstack;
3558 struct stack_item *si = NULL;
90445bd3
DJ
3559 int use_vfp_abi;
3560 struct type *ftype;
3561 unsigned vfp_regs_free = (1 << 16) - 1;
3562
3563 /* Determine the type of this function and whether the VFP ABI
3564 applies. */
3565 ftype = check_typedef (value_type (function));
3566 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3567 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3568 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3569
6a65450a
AC
3570 /* Set the return address. For the ARM, the return breakpoint is
3571 always at BP_ADDR. */
9779414d 3572 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3573 bp_addr |= 1;
6a65450a 3574 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3575
3576 /* Walk through the list of args and determine how large a temporary
3577 stack is required. Need to take care here as structs may be
7a9dd1b2 3578 passed on the stack, and we have to push them. */
2dd604e7
RE
3579 nstack = 0;
3580
3581 argreg = ARM_A1_REGNUM;
3582 nstack = 0;
3583
2dd604e7
RE
3584 /* The struct_return pointer occupies the first parameter
3585 passing register. */
3586 if (struct_return)
3587 {
3588 if (arm_debug)
5af949e3 3589 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3590 gdbarch_register_name (gdbarch, argreg),
5af949e3 3591 paddress (gdbarch, struct_addr));
2dd604e7
RE
3592 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3593 argreg++;
3594 }
3595
3596 for (argnum = 0; argnum < nargs; argnum++)
3597 {
3598 int len;
3599 struct type *arg_type;
3600 struct type *target_type;
3601 enum type_code typecode;
8c6363cf 3602 const bfd_byte *val;
2af48f68 3603 int align;
90445bd3
DJ
3604 enum arm_vfp_cprc_base_type vfp_base_type;
3605 int vfp_base_count;
3606 int may_use_core_reg = 1;
2dd604e7 3607
df407dfe 3608 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3609 len = TYPE_LENGTH (arg_type);
3610 target_type = TYPE_TARGET_TYPE (arg_type);
3611 typecode = TYPE_CODE (arg_type);
8c6363cf 3612 val = value_contents (args[argnum]);
2dd604e7 3613
2af48f68
PB
3614 align = arm_type_align (arg_type);
3615 /* Round alignment up to a whole number of words. */
3616 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3617 /* Different ABIs have different maximum alignments. */
3618 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3619 {
3620 /* The APCS ABI only requires word alignment. */
3621 align = INT_REGISTER_SIZE;
3622 }
3623 else
3624 {
3625 /* The AAPCS requires at most doubleword alignment. */
3626 if (align > INT_REGISTER_SIZE * 2)
3627 align = INT_REGISTER_SIZE * 2;
3628 }
3629
90445bd3
DJ
3630 if (use_vfp_abi
3631 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3632 &vfp_base_count))
3633 {
3634 int regno;
3635 int unit_length;
3636 int shift;
3637 unsigned mask;
3638
3639 /* Because this is a CPRC it cannot go in a core register or
3640 cause a core register to be skipped for alignment.
3641 Either it goes in VFP registers and the rest of this loop
3642 iteration is skipped for this argument, or it goes on the
3643 stack (and the stack alignment code is correct for this
3644 case). */
3645 may_use_core_reg = 0;
3646
3647 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3648 shift = unit_length / 4;
3649 mask = (1 << (shift * vfp_base_count)) - 1;
3650 for (regno = 0; regno < 16; regno += shift)
3651 if (((vfp_regs_free >> regno) & mask) == mask)
3652 break;
3653
3654 if (regno < 16)
3655 {
3656 int reg_char;
3657 int reg_scaled;
3658 int i;
3659
3660 vfp_regs_free &= ~(mask << regno);
3661 reg_scaled = regno / shift;
3662 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3663 for (i = 0; i < vfp_base_count; i++)
3664 {
3665 char name_buf[4];
3666 int regnum;
58d6951d
DJ
3667 if (reg_char == 'q')
3668 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3669 val + i * unit_length);
58d6951d
DJ
3670 else
3671 {
8c042590
PM
3672 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
3673 reg_char, reg_scaled + i);
58d6951d
DJ
3674 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3675 strlen (name_buf));
3676 regcache_cooked_write (regcache, regnum,
3677 val + i * unit_length);
3678 }
90445bd3
DJ
3679 }
3680 continue;
3681 }
3682 else
3683 {
3684 /* This CPRC could not go in VFP registers, so all VFP
3685 registers are now marked as used. */
3686 vfp_regs_free = 0;
3687 }
3688 }
3689
2af48f68
PB
3690 /* Push stack padding for dowubleword alignment. */
3691 if (nstack & (align - 1))
3692 {
3693 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3694 nstack += INT_REGISTER_SIZE;
3695 }
3696
3697 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3698 if (may_use_core_reg
3699 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3700 && align > INT_REGISTER_SIZE
3701 && argreg & 1)
3702 argreg++;
3703
2dd604e7
RE
3704 /* If the argument is a pointer to a function, and it is a
3705 Thumb function, create a LOCAL copy of the value and set
3706 the THUMB bit in it. */
3707 if (TYPE_CODE_PTR == typecode
3708 && target_type != NULL
f96b8fa0 3709 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3710 {
e17a4113 3711 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3712 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3713 {
224c3ddb 3714 bfd_byte *copy = (bfd_byte *) alloca (len);
8c6363cf 3715 store_unsigned_integer (copy, len, byte_order,
e17a4113 3716 MAKE_THUMB_ADDR (regval));
8c6363cf 3717 val = copy;
2dd604e7
RE
3718 }
3719 }
3720
3721 /* Copy the argument to general registers or the stack in
3722 register-sized pieces. Large arguments are split between
3723 registers and stack. */
3724 while (len > 0)
3725 {
f0c9063c 3726 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
ef9bd0b8
YQ
3727 CORE_ADDR regval
3728 = extract_unsigned_integer (val, partial_len, byte_order);
2dd604e7 3729
90445bd3 3730 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3731 {
3732 /* The argument is being passed in a general purpose
3733 register. */
e17a4113 3734 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3735 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3736 if (arm_debug)
3737 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3738 argnum,
3739 gdbarch_register_name
2af46ca0 3740 (gdbarch, argreg),
f0c9063c 3741 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3742 regcache_cooked_write_unsigned (regcache, argreg, regval);
3743 argreg++;
3744 }
3745 else
3746 {
ef9bd0b8
YQ
3747 gdb_byte buf[INT_REGISTER_SIZE];
3748
3749 memset (buf, 0, sizeof (buf));
3750 store_unsigned_integer (buf, partial_len, byte_order, regval);
3751
2dd604e7
RE
3752 /* Push the arguments onto the stack. */
3753 if (arm_debug)
3754 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3755 argnum, nstack);
ef9bd0b8 3756 si = push_stack_item (si, buf, INT_REGISTER_SIZE);
f0c9063c 3757 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3758 }
3759
3760 len -= partial_len;
3761 val += partial_len;
3762 }
3763 }
3764 /* If we have an odd number of words to push, then decrement the stack
3765 by one word now, so first stack argument will be dword aligned. */
3766 if (nstack & 4)
3767 sp -= 4;
3768
3769 while (si)
3770 {
3771 sp -= si->len;
3772 write_memory (sp, si->data, si->len);
3773 si = pop_stack_item (si);
3774 }
3775
3776 /* Finally, update teh SP register. */
3777 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3778
3779 return sp;
3780}
3781
f53f0d0b
PB
3782
3783/* Always align the frame to an 8-byte boundary. This is required on
3784 some platforms and harmless on the rest. */
3785
3786static CORE_ADDR
3787arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3788{
3789 /* Align the stack to eight bytes. */
3790 return sp & ~ (CORE_ADDR) 7;
3791}
3792
c906108c 3793static void
12b27276 3794print_fpu_flags (struct ui_file *file, int flags)
c906108c 3795{
c5aa993b 3796 if (flags & (1 << 0))
12b27276 3797 fputs_filtered ("IVO ", file);
c5aa993b 3798 if (flags & (1 << 1))
12b27276 3799 fputs_filtered ("DVZ ", file);
c5aa993b 3800 if (flags & (1 << 2))
12b27276 3801 fputs_filtered ("OFL ", file);
c5aa993b 3802 if (flags & (1 << 3))
12b27276 3803 fputs_filtered ("UFL ", file);
c5aa993b 3804 if (flags & (1 << 4))
12b27276
WN
3805 fputs_filtered ("INX ", file);
3806 fputc_filtered ('\n', file);
c906108c
SS
3807}
3808
5e74b15c
RE
3809/* Print interesting information about the floating point processor
3810 (if present) or emulator. */
34e8f22d 3811static void
d855c300 3812arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3813 struct frame_info *frame, const char *args)
c906108c 3814{
9c9acae0 3815 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3816 int type;
3817
3818 type = (status >> 24) & 127;
edefbb7c 3819 if (status & (1 << 31))
12b27276 3820 fprintf_filtered (file, _("Hardware FPU type %d\n"), type);
edefbb7c 3821 else
12b27276 3822 fprintf_filtered (file, _("Software FPU type %d\n"), type);
edefbb7c 3823 /* i18n: [floating point unit] mask */
12b27276
WN
3824 fputs_filtered (_("mask: "), file);
3825 print_fpu_flags (file, status >> 16);
edefbb7c 3826 /* i18n: [floating point unit] flags */
12b27276
WN
3827 fputs_filtered (_("flags: "), file);
3828 print_fpu_flags (file, status);
c906108c
SS
3829}
3830
27067745
UW
3831/* Construct the ARM extended floating point type. */
3832static struct type *
3833arm_ext_type (struct gdbarch *gdbarch)
3834{
3835 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3836
3837 if (!tdep->arm_ext_type)
3838 tdep->arm_ext_type
e9bb382b 3839 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3840 floatformats_arm_ext);
3841
3842 return tdep->arm_ext_type;
3843}
3844
58d6951d
DJ
3845static struct type *
3846arm_neon_double_type (struct gdbarch *gdbarch)
3847{
3848 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3849
3850 if (tdep->neon_double_type == NULL)
3851 {
3852 struct type *t, *elem;
3853
3854 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3855 TYPE_CODE_UNION);
3856 elem = builtin_type (gdbarch)->builtin_uint8;
3857 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3858 elem = builtin_type (gdbarch)->builtin_uint16;
3859 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3860 elem = builtin_type (gdbarch)->builtin_uint32;
3861 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3862 elem = builtin_type (gdbarch)->builtin_uint64;
3863 append_composite_type_field (t, "u64", elem);
3864 elem = builtin_type (gdbarch)->builtin_float;
3865 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3866 elem = builtin_type (gdbarch)->builtin_double;
3867 append_composite_type_field (t, "f64", elem);
3868
3869 TYPE_VECTOR (t) = 1;
3870 TYPE_NAME (t) = "neon_d";
3871 tdep->neon_double_type = t;
3872 }
3873
3874 return tdep->neon_double_type;
3875}
3876
3877/* FIXME: The vector types are not correctly ordered on big-endian
3878 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3879 bits of d0 - regardless of what unit size is being held in d0. So
3880 the offset of the first uint8 in d0 is 7, but the offset of the
3881 first float is 4. This code works as-is for little-endian
3882 targets. */
3883
3884static struct type *
3885arm_neon_quad_type (struct gdbarch *gdbarch)
3886{
3887 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3888
3889 if (tdep->neon_quad_type == NULL)
3890 {
3891 struct type *t, *elem;
3892
3893 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3894 TYPE_CODE_UNION);
3895 elem = builtin_type (gdbarch)->builtin_uint8;
3896 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3897 elem = builtin_type (gdbarch)->builtin_uint16;
3898 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3899 elem = builtin_type (gdbarch)->builtin_uint32;
3900 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3901 elem = builtin_type (gdbarch)->builtin_uint64;
3902 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3903 elem = builtin_type (gdbarch)->builtin_float;
3904 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3905 elem = builtin_type (gdbarch)->builtin_double;
3906 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3907
3908 TYPE_VECTOR (t) = 1;
3909 TYPE_NAME (t) = "neon_q";
3910 tdep->neon_quad_type = t;
3911 }
3912
3913 return tdep->neon_quad_type;
3914}
3915
34e8f22d
RE
3916/* Return the GDB type object for the "standard" data type of data in
3917 register N. */
3918
3919static struct type *
7a5ea0d4 3920arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3921{
58d6951d
DJ
3922 int num_regs = gdbarch_num_regs (gdbarch);
3923
3924 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3925 && regnum >= num_regs && regnum < num_regs + 32)
3926 return builtin_type (gdbarch)->builtin_float;
3927
3928 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3929 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3930 return arm_neon_quad_type (gdbarch);
3931
3932 /* If the target description has register information, we are only
3933 in this function so that we can override the types of
3934 double-precision registers for NEON. */
3935 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
3936 {
3937 struct type *t = tdesc_register_type (gdbarch, regnum);
3938
3939 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
3940 && TYPE_CODE (t) == TYPE_CODE_FLT
3941 && gdbarch_tdep (gdbarch)->have_neon)
3942 return arm_neon_double_type (gdbarch);
3943 else
3944 return t;
3945 }
3946
34e8f22d 3947 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
3948 {
3949 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
3950 return builtin_type (gdbarch)->builtin_void;
3951
3952 return arm_ext_type (gdbarch);
3953 }
e4c16157 3954 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 3955 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 3956 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 3957 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
3958 else if (regnum >= ARRAY_SIZE (arm_register_names))
3959 /* These registers are only supported on targets which supply
3960 an XML description. */
df4df182 3961 return builtin_type (gdbarch)->builtin_int0;
032758dc 3962 else
df4df182 3963 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
3964}
3965
ff6f572f
DJ
3966/* Map a DWARF register REGNUM onto the appropriate GDB register
3967 number. */
3968
3969static int
d3f73121 3970arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
3971{
3972 /* Core integer regs. */
3973 if (reg >= 0 && reg <= 15)
3974 return reg;
3975
3976 /* Legacy FPA encoding. These were once used in a way which
3977 overlapped with VFP register numbering, so their use is
3978 discouraged, but GDB doesn't support the ARM toolchain
3979 which used them for VFP. */
3980 if (reg >= 16 && reg <= 23)
3981 return ARM_F0_REGNUM + reg - 16;
3982
3983 /* New assignments for the FPA registers. */
3984 if (reg >= 96 && reg <= 103)
3985 return ARM_F0_REGNUM + reg - 96;
3986
3987 /* WMMX register assignments. */
3988 if (reg >= 104 && reg <= 111)
3989 return ARM_WCGR0_REGNUM + reg - 104;
3990
3991 if (reg >= 112 && reg <= 127)
3992 return ARM_WR0_REGNUM + reg - 112;
3993
3994 if (reg >= 192 && reg <= 199)
3995 return ARM_WC0_REGNUM + reg - 192;
3996
58d6951d
DJ
3997 /* VFP v2 registers. A double precision value is actually
3998 in d1 rather than s2, but the ABI only defines numbering
3999 for the single precision registers. This will "just work"
4000 in GDB for little endian targets (we'll read eight bytes,
4001 starting in s0 and then progressing to s1), but will be
4002 reversed on big endian targets with VFP. This won't
4003 be a problem for the new Neon quad registers; you're supposed
4004 to use DW_OP_piece for those. */
4005 if (reg >= 64 && reg <= 95)
4006 {
4007 char name_buf[4];
4008
8c042590 4009 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
58d6951d
DJ
4010 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4011 strlen (name_buf));
4012 }
4013
4014 /* VFP v3 / Neon registers. This range is also used for VFP v2
4015 registers, except that it now describes d0 instead of s0. */
4016 if (reg >= 256 && reg <= 287)
4017 {
4018 char name_buf[4];
4019
8c042590 4020 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
58d6951d
DJ
4021 return user_reg_map_name_to_regnum (gdbarch, name_buf,
4022 strlen (name_buf));
4023 }
4024
ff6f572f
DJ
4025 return -1;
4026}
4027
26216b98
AC
4028/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4029static int
e7faf938 4030arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4031{
4032 int reg = regnum;
e7faf938 4033 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4034
ff6f572f
DJ
4035 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4036 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4037
4038 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4039 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4040
4041 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4042 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4043
26216b98
AC
4044 if (reg < NUM_GREGS)
4045 return SIM_ARM_R0_REGNUM + reg;
4046 reg -= NUM_GREGS;
4047
4048 if (reg < NUM_FREGS)
4049 return SIM_ARM_FP0_REGNUM + reg;
4050 reg -= NUM_FREGS;
4051
4052 if (reg < NUM_SREGS)
4053 return SIM_ARM_FPS_REGNUM + reg;
4054 reg -= NUM_SREGS;
4055
edefbb7c 4056 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4057}
34e8f22d 4058
a37b3cc0
AC
4059/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
4060 convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
4061 It is thought that this is is the floating-point register format on
4062 little-endian systems. */
c906108c 4063
ed9a39eb 4064static void
b508a996 4065convert_from_extended (const struct floatformat *fmt, const void *ptr,
be8626e0 4066 void *dbl, int endianess)
c906108c 4067{
a37b3cc0 4068 DOUBLEST d;
be8626e0
MD
4069
4070 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4071 floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
4072 else
4073 floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
4074 ptr, &d);
b508a996 4075 floatformat_from_doublest (fmt, &d, dbl);
c906108c
SS
4076}
4077
34e8f22d 4078static void
be8626e0
MD
4079convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
4080 int endianess)
c906108c 4081{
a37b3cc0 4082 DOUBLEST d;
be8626e0 4083
b508a996 4084 floatformat_to_doublest (fmt, ptr, &d);
be8626e0 4085 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4086 floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
4087 else
4088 floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
4089 &d, dbl);
c906108c 4090}
ed9a39eb 4091
d9311bfa
AT
4092/* Like insert_single_step_breakpoint, but make sure we use a breakpoint
4093 of the appropriate mode (as encoded in the PC value), even if this
4094 differs from what would be expected according to the symbol tables. */
4095
4096void
4097arm_insert_single_step_breakpoint (struct gdbarch *gdbarch,
4098 struct address_space *aspace,
4099 CORE_ADDR pc)
c906108c 4100{
d9311bfa
AT
4101 struct cleanup *old_chain
4102 = make_cleanup_restore_integer (&arm_override_mode);
c5aa993b 4103
d9311bfa
AT
4104 arm_override_mode = IS_THUMB_ADDR (pc);
4105 pc = gdbarch_addr_bits_remove (gdbarch, pc);
c5aa993b 4106
d9311bfa 4107 insert_single_step_breakpoint (gdbarch, aspace, pc);
c906108c 4108
d9311bfa
AT
4109 do_cleanups (old_chain);
4110}
c5aa993b 4111
d9311bfa
AT
4112/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
4113 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
4114 NULL if an error occurs. BUF is freed. */
c906108c 4115
d9311bfa
AT
4116static gdb_byte *
4117extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
4118 int old_len, int new_len)
4119{
4120 gdb_byte *new_buf;
4121 int bytes_to_read = new_len - old_len;
c906108c 4122
d9311bfa
AT
4123 new_buf = (gdb_byte *) xmalloc (new_len);
4124 memcpy (new_buf + bytes_to_read, buf, old_len);
4125 xfree (buf);
4126 if (target_read_memory (endaddr - new_len, new_buf, bytes_to_read) != 0)
4127 {
4128 xfree (new_buf);
4129 return NULL;
c906108c 4130 }
d9311bfa 4131 return new_buf;
c906108c
SS
4132}
4133
d9311bfa
AT
4134/* An IT block is at most the 2-byte IT instruction followed by
4135 four 4-byte instructions. The furthest back we must search to
4136 find an IT block that affects the current instruction is thus
4137 2 + 3 * 4 == 14 bytes. */
4138#define MAX_IT_BLOCK_PREFIX 14
177321bd 4139
d9311bfa
AT
4140/* Use a quick scan if there are more than this many bytes of
4141 code. */
4142#define IT_SCAN_THRESHOLD 32
177321bd 4143
d9311bfa
AT
4144/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
4145 A breakpoint in an IT block may not be hit, depending on the
4146 condition flags. */
ad527d2e 4147static CORE_ADDR
d9311bfa 4148arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
c906108c 4149{
d9311bfa
AT
4150 gdb_byte *buf;
4151 char map_type;
4152 CORE_ADDR boundary, func_start;
4153 int buf_len;
4154 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
4155 int i, any, last_it, last_it_count;
177321bd 4156
d9311bfa
AT
4157 /* If we are using BKPT breakpoints, none of this is necessary. */
4158 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
4159 return bpaddr;
177321bd 4160
d9311bfa
AT
4161 /* ARM mode does not have this problem. */
4162 if (!arm_pc_is_thumb (gdbarch, bpaddr))
4163 return bpaddr;
177321bd 4164
d9311bfa
AT
4165 /* We are setting a breakpoint in Thumb code that could potentially
4166 contain an IT block. The first step is to find how much Thumb
4167 code there is; we do not need to read outside of known Thumb
4168 sequences. */
4169 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
4170 if (map_type == 0)
4171 /* Thumb-2 code must have mapping symbols to have a chance. */
4172 return bpaddr;
9dca5578 4173
d9311bfa 4174 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
177321bd 4175
d9311bfa
AT
4176 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
4177 && func_start > boundary)
4178 boundary = func_start;
9dca5578 4179
d9311bfa
AT
4180 /* Search for a candidate IT instruction. We have to do some fancy
4181 footwork to distinguish a real IT instruction from the second
4182 half of a 32-bit instruction, but there is no need for that if
4183 there's no candidate. */
4184 buf_len = min (bpaddr - boundary, MAX_IT_BLOCK_PREFIX);
4185 if (buf_len == 0)
4186 /* No room for an IT instruction. */
4187 return bpaddr;
c906108c 4188
d9311bfa
AT
4189 buf = (gdb_byte *) xmalloc (buf_len);
4190 if (target_read_memory (bpaddr - buf_len, buf, buf_len) != 0)
4191 return bpaddr;
4192 any = 0;
4193 for (i = 0; i < buf_len; i += 2)
c906108c 4194 {
d9311bfa
AT
4195 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4196 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
25b41d01 4197 {
d9311bfa
AT
4198 any = 1;
4199 break;
25b41d01 4200 }
c906108c 4201 }
d9311bfa
AT
4202
4203 if (any == 0)
c906108c 4204 {
d9311bfa
AT
4205 xfree (buf);
4206 return bpaddr;
f9d67f43
DJ
4207 }
4208
4209 /* OK, the code bytes before this instruction contain at least one
4210 halfword which resembles an IT instruction. We know that it's
4211 Thumb code, but there are still two possibilities. Either the
4212 halfword really is an IT instruction, or it is the second half of
4213 a 32-bit Thumb instruction. The only way we can tell is to
4214 scan forwards from a known instruction boundary. */
4215 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
4216 {
4217 int definite;
4218
4219 /* There's a lot of code before this instruction. Start with an
4220 optimistic search; it's easy to recognize halfwords that can
4221 not be the start of a 32-bit instruction, and use that to
4222 lock on to the instruction boundaries. */
4223 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
4224 if (buf == NULL)
4225 return bpaddr;
4226 buf_len = IT_SCAN_THRESHOLD;
4227
4228 definite = 0;
4229 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
4230 {
4231 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4232 if (thumb_insn_size (inst1) == 2)
4233 {
4234 definite = 1;
4235 break;
4236 }
4237 }
4238
4239 /* At this point, if DEFINITE, BUF[I] is the first place we
4240 are sure that we know the instruction boundaries, and it is far
4241 enough from BPADDR that we could not miss an IT instruction
4242 affecting BPADDR. If ! DEFINITE, give up - start from a
4243 known boundary. */
4244 if (! definite)
4245 {
0963b4bd
MS
4246 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
4247 bpaddr - boundary);
f9d67f43
DJ
4248 if (buf == NULL)
4249 return bpaddr;
4250 buf_len = bpaddr - boundary;
4251 i = 0;
4252 }
4253 }
4254 else
4255 {
4256 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
4257 if (buf == NULL)
4258 return bpaddr;
4259 buf_len = bpaddr - boundary;
4260 i = 0;
4261 }
4262
4263 /* Scan forwards. Find the last IT instruction before BPADDR. */
4264 last_it = -1;
4265 last_it_count = 0;
4266 while (i < buf_len)
4267 {
4268 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
4269 last_it_count--;
4270 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4271 {
4272 last_it = i;
4273 if (inst1 & 0x0001)
4274 last_it_count = 4;
4275 else if (inst1 & 0x0002)
4276 last_it_count = 3;
4277 else if (inst1 & 0x0004)
4278 last_it_count = 2;
4279 else
4280 last_it_count = 1;
4281 }
4282 i += thumb_insn_size (inst1);
4283 }
4284
4285 xfree (buf);
4286
4287 if (last_it == -1)
4288 /* There wasn't really an IT instruction after all. */
4289 return bpaddr;
4290
4291 if (last_it_count < 1)
4292 /* It was too far away. */
4293 return bpaddr;
4294
4295 /* This really is a trouble spot. Move the breakpoint to the IT
4296 instruction. */
4297 return bpaddr - buf_len + last_it;
4298}
4299
cca44b1b 4300/* ARM displaced stepping support.
c906108c 4301
cca44b1b 4302 Generally ARM displaced stepping works as follows:
c906108c 4303
cca44b1b
JB
4304 1. When an instruction is to be single-stepped, it is first decoded by
4305 arm_process_displaced_insn (called from arm_displaced_step_copy_insn).
4306 Depending on the type of instruction, it is then copied to a scratch
4307 location, possibly in a modified form. The copy_* set of functions
0963b4bd 4308 performs such modification, as necessary. A breakpoint is placed after
cca44b1b
JB
4309 the modified instruction in the scratch space to return control to GDB.
4310 Note in particular that instructions which modify the PC will no longer
4311 do so after modification.
c5aa993b 4312
cca44b1b
JB
4313 2. The instruction is single-stepped, by setting the PC to the scratch
4314 location address, and resuming. Control returns to GDB when the
4315 breakpoint is hit.
c5aa993b 4316
cca44b1b
JB
4317 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
4318 function used for the current instruction. This function's job is to
4319 put the CPU/memory state back to what it would have been if the
4320 instruction had been executed unmodified in its original location. */
c5aa993b 4321
cca44b1b
JB
4322/* NOP instruction (mov r0, r0). */
4323#define ARM_NOP 0xe1a00000
34518530 4324#define THUMB_NOP 0x4600
cca44b1b
JB
4325
4326/* Helper for register reads for displaced stepping. In particular, this
4327 returns the PC as it would be seen by the instruction at its original
4328 location. */
4329
4330ULONGEST
36073a92
YQ
4331displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4332 int regno)
cca44b1b
JB
4333{
4334 ULONGEST ret;
36073a92 4335 CORE_ADDR from = dsc->insn_addr;
cca44b1b 4336
bf9f652a 4337 if (regno == ARM_PC_REGNUM)
cca44b1b 4338 {
4db71c0b
YQ
4339 /* Compute pipeline offset:
4340 - When executing an ARM instruction, PC reads as the address of the
4341 current instruction plus 8.
4342 - When executing a Thumb instruction, PC reads as the address of the
4343 current instruction plus 4. */
4344
36073a92 4345 if (!dsc->is_thumb)
4db71c0b
YQ
4346 from += 8;
4347 else
4348 from += 4;
4349
cca44b1b
JB
4350 if (debug_displaced)
4351 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
4352 (unsigned long) from);
4353 return (ULONGEST) from;
cca44b1b 4354 }
c906108c 4355 else
cca44b1b
JB
4356 {
4357 regcache_cooked_read_unsigned (regs, regno, &ret);
4358 if (debug_displaced)
4359 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
4360 regno, (unsigned long) ret);
4361 return ret;
4362 }
c906108c
SS
4363}
4364
cca44b1b
JB
4365static int
4366displaced_in_arm_mode (struct regcache *regs)
4367{
4368 ULONGEST ps;
9779414d 4369 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
66e810cd 4370
cca44b1b 4371 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 4372
9779414d 4373 return (ps & t_bit) == 0;
cca44b1b 4374}
66e810cd 4375
cca44b1b 4376/* Write to the PC as from a branch instruction. */
c906108c 4377
cca44b1b 4378static void
36073a92
YQ
4379branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4380 ULONGEST val)
c906108c 4381{
36073a92 4382 if (!dsc->is_thumb)
cca44b1b
JB
4383 /* Note: If bits 0/1 are set, this branch would be unpredictable for
4384 architecture versions < 6. */
0963b4bd
MS
4385 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4386 val & ~(ULONGEST) 0x3);
cca44b1b 4387 else
0963b4bd
MS
4388 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
4389 val & ~(ULONGEST) 0x1);
cca44b1b 4390}
66e810cd 4391
cca44b1b
JB
4392/* Write to the PC as from a branch-exchange instruction. */
4393
4394static void
4395bx_write_pc (struct regcache *regs, ULONGEST val)
4396{
4397 ULONGEST ps;
9779414d 4398 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
cca44b1b
JB
4399
4400 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
4401
4402 if ((val & 1) == 1)
c906108c 4403 {
9779414d 4404 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
4405 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
4406 }
4407 else if ((val & 2) == 0)
4408 {
9779414d 4409 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4410 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
4411 }
4412 else
4413 {
cca44b1b
JB
4414 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
4415 mode, align dest to 4 bytes). */
4416 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 4417 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 4418 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
4419 }
4420}
ed9a39eb 4421
cca44b1b 4422/* Write to the PC as if from a load instruction. */
ed9a39eb 4423
34e8f22d 4424static void
36073a92
YQ
4425load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4426 ULONGEST val)
ed9a39eb 4427{
cca44b1b
JB
4428 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
4429 bx_write_pc (regs, val);
4430 else
36073a92 4431 branch_write_pc (regs, dsc, val);
cca44b1b 4432}
be8626e0 4433
cca44b1b
JB
4434/* Write to the PC as if from an ALU instruction. */
4435
4436static void
36073a92
YQ
4437alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
4438 ULONGEST val)
cca44b1b 4439{
36073a92 4440 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
4441 bx_write_pc (regs, val);
4442 else
36073a92 4443 branch_write_pc (regs, dsc, val);
cca44b1b
JB
4444}
4445
4446/* Helper for writing to registers for displaced stepping. Writing to the PC
4447 has a varying effects depending on the instruction which does the write:
4448 this is controlled by the WRITE_PC argument. */
4449
4450void
4451displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
4452 int regno, ULONGEST val, enum pc_write_style write_pc)
4453{
bf9f652a 4454 if (regno == ARM_PC_REGNUM)
08216dd7 4455 {
cca44b1b
JB
4456 if (debug_displaced)
4457 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
4458 (unsigned long) val);
4459 switch (write_pc)
08216dd7 4460 {
cca44b1b 4461 case BRANCH_WRITE_PC:
36073a92 4462 branch_write_pc (regs, dsc, val);
08216dd7
RE
4463 break;
4464
cca44b1b
JB
4465 case BX_WRITE_PC:
4466 bx_write_pc (regs, val);
4467 break;
4468
4469 case LOAD_WRITE_PC:
36073a92 4470 load_write_pc (regs, dsc, val);
cca44b1b
JB
4471 break;
4472
4473 case ALU_WRITE_PC:
36073a92 4474 alu_write_pc (regs, dsc, val);
cca44b1b
JB
4475 break;
4476
4477 case CANNOT_WRITE_PC:
4478 warning (_("Instruction wrote to PC in an unexpected way when "
4479 "single-stepping"));
08216dd7
RE
4480 break;
4481
4482 default:
97b9747c
JB
4483 internal_error (__FILE__, __LINE__,
4484 _("Invalid argument to displaced_write_reg"));
08216dd7 4485 }
b508a996 4486
cca44b1b 4487 dsc->wrote_to_pc = 1;
b508a996 4488 }
ed9a39eb 4489 else
b508a996 4490 {
cca44b1b
JB
4491 if (debug_displaced)
4492 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
4493 regno, (unsigned long) val);
4494 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 4495 }
34e8f22d
RE
4496}
4497
cca44b1b
JB
4498/* This function is used to concisely determine if an instruction INSN
4499 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
4500 corresponding fields of BITMASK set to 0b1111. The function
4501 returns return 1 if any of these fields in INSN reference the PC
4502 (also 0b1111, r15), else it returns 0. */
67255d04
RE
4503
4504static int
cca44b1b 4505insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 4506{
cca44b1b 4507 uint32_t lowbit = 1;
67255d04 4508
cca44b1b
JB
4509 while (bitmask != 0)
4510 {
4511 uint32_t mask;
44e1a9eb 4512
cca44b1b
JB
4513 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
4514 ;
67255d04 4515
cca44b1b
JB
4516 if (!lowbit)
4517 break;
67255d04 4518
cca44b1b 4519 mask = lowbit * 0xf;
67255d04 4520
cca44b1b
JB
4521 if ((insn & mask) == mask)
4522 return 1;
4523
4524 bitmask &= ~mask;
67255d04
RE
4525 }
4526
cca44b1b
JB
4527 return 0;
4528}
2af48f68 4529
cca44b1b
JB
4530/* The simplest copy function. Many instructions have the same effect no
4531 matter what address they are executed at: in those cases, use this. */
67255d04 4532
cca44b1b 4533static int
7ff120b4
YQ
4534arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
4535 const char *iname, struct displaced_step_closure *dsc)
cca44b1b
JB
4536{
4537 if (debug_displaced)
4538 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
4539 "opcode/class '%s' unmodified\n", (unsigned long) insn,
4540 iname);
67255d04 4541
cca44b1b 4542 dsc->modinsn[0] = insn;
67255d04 4543
cca44b1b
JB
4544 return 0;
4545}
4546
34518530
YQ
4547static int
4548thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
4549 uint16_t insn2, const char *iname,
4550 struct displaced_step_closure *dsc)
4551{
4552 if (debug_displaced)
4553 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
4554 "opcode/class '%s' unmodified\n", insn1, insn2,
4555 iname);
4556
4557 dsc->modinsn[0] = insn1;
4558 dsc->modinsn[1] = insn2;
4559 dsc->numinsns = 2;
4560
4561 return 0;
4562}
4563
4564/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
4565 modification. */
4566static int
4567thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, unsigned int insn,
4568 const char *iname,
4569 struct displaced_step_closure *dsc)
4570{
4571 if (debug_displaced)
4572 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
4573 "opcode/class '%s' unmodified\n", insn,
4574 iname);
4575
4576 dsc->modinsn[0] = insn;
4577
4578 return 0;
4579}
4580
cca44b1b
JB
4581/* Preload instructions with immediate offset. */
4582
4583static void
6e39997a 4584cleanup_preload (struct gdbarch *gdbarch,
cca44b1b
JB
4585 struct regcache *regs, struct displaced_step_closure *dsc)
4586{
4587 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4588 if (!dsc->u.preload.immed)
4589 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
4590}
4591
7ff120b4
YQ
4592static void
4593install_preload (struct gdbarch *gdbarch, struct regcache *regs,
4594 struct displaced_step_closure *dsc, unsigned int rn)
cca44b1b 4595{
cca44b1b 4596 ULONGEST rn_val;
cca44b1b
JB
4597 /* Preload instructions:
4598
4599 {pli/pld} [rn, #+/-imm]
4600 ->
4601 {pli/pld} [r0, #+/-imm]. */
4602
36073a92
YQ
4603 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4604 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 4605 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
4606 dsc->u.preload.immed = 1;
4607
cca44b1b 4608 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
4609}
4610
cca44b1b 4611static int
7ff120b4 4612arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cca44b1b
JB
4613 struct displaced_step_closure *dsc)
4614{
4615 unsigned int rn = bits (insn, 16, 19);
cca44b1b 4616
7ff120b4
YQ
4617 if (!insn_references_pc (insn, 0x000f0000ul))
4618 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
4619
4620 if (debug_displaced)
4621 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4622 (unsigned long) insn);
4623
7ff120b4
YQ
4624 dsc->modinsn[0] = insn & 0xfff0ffff;
4625
4626 install_preload (gdbarch, regs, dsc, rn);
4627
4628 return 0;
4629}
4630
34518530
YQ
4631static int
4632thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
4633 struct regcache *regs, struct displaced_step_closure *dsc)
4634{
4635 unsigned int rn = bits (insn1, 0, 3);
4636 unsigned int u_bit = bit (insn1, 7);
4637 int imm12 = bits (insn2, 0, 11);
4638 ULONGEST pc_val;
4639
4640 if (rn != ARM_PC_REGNUM)
4641 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
4642
4643 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
4644 PLD (literal) Encoding T1. */
4645 if (debug_displaced)
4646 fprintf_unfiltered (gdb_stdlog,
4647 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
4648 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
4649 imm12);
4650
4651 if (!u_bit)
4652 imm12 = -1 * imm12;
4653
4654 /* Rewrite instruction {pli/pld} PC imm12 into:
4655 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
4656
4657 {pli/pld} [r0, r1]
4658
4659 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
4660
4661 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4662 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4663
4664 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
4665
4666 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
4667 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
4668 dsc->u.preload.immed = 0;
4669
4670 /* {pli/pld} [r0, r1] */
4671 dsc->modinsn[0] = insn1 & 0xfff0;
4672 dsc->modinsn[1] = 0xf001;
4673 dsc->numinsns = 2;
4674
4675 dsc->cleanup = &cleanup_preload;
4676 return 0;
4677}
4678
7ff120b4
YQ
4679/* Preload instructions with register offset. */
4680
4681static void
4682install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
4683 struct displaced_step_closure *dsc, unsigned int rn,
4684 unsigned int rm)
4685{
4686 ULONGEST rn_val, rm_val;
4687
cca44b1b
JB
4688 /* Preload register-offset instructions:
4689
4690 {pli/pld} [rn, rm {, shift}]
4691 ->
4692 {pli/pld} [r0, r1 {, shift}]. */
4693
36073a92
YQ
4694 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4695 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
4696 rn_val = displaced_read_reg (regs, dsc, rn);
4697 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
4698 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4699 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
4700 dsc->u.preload.immed = 0;
4701
cca44b1b 4702 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
4703}
4704
4705static int
4706arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
4707 struct regcache *regs,
4708 struct displaced_step_closure *dsc)
4709{
4710 unsigned int rn = bits (insn, 16, 19);
4711 unsigned int rm = bits (insn, 0, 3);
4712
4713
4714 if (!insn_references_pc (insn, 0x000f000ful))
4715 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
4716
4717 if (debug_displaced)
4718 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
4719 (unsigned long) insn);
4720
4721 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 4722
7ff120b4 4723 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
4724 return 0;
4725}
4726
4727/* Copy/cleanup coprocessor load and store instructions. */
4728
4729static void
6e39997a 4730cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b
JB
4731 struct regcache *regs,
4732 struct displaced_step_closure *dsc)
4733{
36073a92 4734 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
4735
4736 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
4737
4738 if (dsc->u.ldst.writeback)
4739 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
4740}
4741
7ff120b4
YQ
4742static void
4743install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
4744 struct displaced_step_closure *dsc,
4745 int writeback, unsigned int rn)
cca44b1b 4746{
cca44b1b 4747 ULONGEST rn_val;
cca44b1b 4748
cca44b1b
JB
4749 /* Coprocessor load/store instructions:
4750
4751 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
4752 ->
4753 {stc/stc2} [r0, #+/-imm].
4754
4755 ldc/ldc2 are handled identically. */
4756
36073a92
YQ
4757 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
4758 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
4759 /* PC should be 4-byte aligned. */
4760 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
4761 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
4762
7ff120b4 4763 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
4764 dsc->u.ldst.rn = rn;
4765
7ff120b4
YQ
4766 dsc->cleanup = &cleanup_copro_load_store;
4767}
4768
4769static int
4770arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
4771 struct regcache *regs,
4772 struct displaced_step_closure *dsc)
4773{
4774 unsigned int rn = bits (insn, 16, 19);
4775
4776 if (!insn_references_pc (insn, 0x000f0000ul))
4777 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
4778
4779 if (debug_displaced)
4780 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4781 "load/store insn %.8lx\n", (unsigned long) insn);
4782
cca44b1b
JB
4783 dsc->modinsn[0] = insn & 0xfff0ffff;
4784
7ff120b4 4785 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
4786
4787 return 0;
4788}
4789
34518530
YQ
4790static int
4791thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
4792 uint16_t insn2, struct regcache *regs,
4793 struct displaced_step_closure *dsc)
4794{
4795 unsigned int rn = bits (insn1, 0, 3);
4796
4797 if (rn != ARM_PC_REGNUM)
4798 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
4799 "copro load/store", dsc);
4800
4801 if (debug_displaced)
4802 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
4803 "load/store insn %.4x%.4x\n", insn1, insn2);
4804
4805 dsc->modinsn[0] = insn1 & 0xfff0;
4806 dsc->modinsn[1] = insn2;
4807 dsc->numinsns = 2;
4808
4809 /* This function is called for copying instruction LDC/LDC2/VLDR, which
4810 doesn't support writeback, so pass 0. */
4811 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
4812
4813 return 0;
4814}
4815
cca44b1b
JB
4816/* Clean up branch instructions (actually perform the branch, by setting
4817 PC). */
4818
4819static void
6e39997a 4820cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
4821 struct displaced_step_closure *dsc)
4822{
36073a92 4823 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
4824 int branch_taken = condition_true (dsc->u.branch.cond, status);
4825 enum pc_write_style write_pc = dsc->u.branch.exchange
4826 ? BX_WRITE_PC : BRANCH_WRITE_PC;
4827
4828 if (!branch_taken)
4829 return;
4830
4831 if (dsc->u.branch.link)
4832 {
8c8dba6d
YQ
4833 /* The value of LR should be the next insn of current one. In order
4834 not to confuse logic hanlding later insn `bx lr', if current insn mode
4835 is Thumb, the bit 0 of LR value should be set to 1. */
4836 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
4837
4838 if (dsc->is_thumb)
4839 next_insn_addr |= 0x1;
4840
4841 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
4842 CANNOT_WRITE_PC);
cca44b1b
JB
4843 }
4844
bf9f652a 4845 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
4846}
4847
4848/* Copy B/BL/BLX instructions with immediate destinations. */
4849
7ff120b4
YQ
4850static void
4851install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
4852 struct displaced_step_closure *dsc,
4853 unsigned int cond, int exchange, int link, long offset)
4854{
4855 /* Implement "BL<cond> <label>" as:
4856
4857 Preparation: cond <- instruction condition
4858 Insn: mov r0, r0 (nop)
4859 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
4860
4861 B<cond> similar, but don't set r14 in cleanup. */
4862
4863 dsc->u.branch.cond = cond;
4864 dsc->u.branch.link = link;
4865 dsc->u.branch.exchange = exchange;
4866
2b16b2e3
YQ
4867 dsc->u.branch.dest = dsc->insn_addr;
4868 if (link && exchange)
4869 /* For BLX, offset is computed from the Align (PC, 4). */
4870 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
4871
7ff120b4 4872 if (dsc->is_thumb)
2b16b2e3 4873 dsc->u.branch.dest += 4 + offset;
7ff120b4 4874 else
2b16b2e3 4875 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
4876
4877 dsc->cleanup = &cleanup_branch;
4878}
cca44b1b 4879static int
7ff120b4
YQ
4880arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
4881 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
4882{
4883 unsigned int cond = bits (insn, 28, 31);
4884 int exchange = (cond == 0xf);
4885 int link = exchange || bit (insn, 24);
cca44b1b
JB
4886 long offset;
4887
4888 if (debug_displaced)
4889 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
4890 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
4891 (unsigned long) insn);
cca44b1b
JB
4892 if (exchange)
4893 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
4894 then arrange the switch into Thumb mode. */
4895 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
4896 else
4897 offset = bits (insn, 0, 23) << 2;
4898
4899 if (bit (offset, 25))
4900 offset = offset | ~0x3ffffff;
4901
cca44b1b
JB
4902 dsc->modinsn[0] = ARM_NOP;
4903
7ff120b4 4904 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
4905 return 0;
4906}
4907
34518530
YQ
4908static int
4909thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
4910 uint16_t insn2, struct regcache *regs,
4911 struct displaced_step_closure *dsc)
4912{
4913 int link = bit (insn2, 14);
4914 int exchange = link && !bit (insn2, 12);
4915 int cond = INST_AL;
4916 long offset = 0;
4917 int j1 = bit (insn2, 13);
4918 int j2 = bit (insn2, 11);
4919 int s = sbits (insn1, 10, 10);
4920 int i1 = !(j1 ^ bit (insn1, 10));
4921 int i2 = !(j2 ^ bit (insn1, 10));
4922
4923 if (!link && !exchange) /* B */
4924 {
4925 offset = (bits (insn2, 0, 10) << 1);
4926 if (bit (insn2, 12)) /* Encoding T4 */
4927 {
4928 offset |= (bits (insn1, 0, 9) << 12)
4929 | (i2 << 22)
4930 | (i1 << 23)
4931 | (s << 24);
4932 cond = INST_AL;
4933 }
4934 else /* Encoding T3 */
4935 {
4936 offset |= (bits (insn1, 0, 5) << 12)
4937 | (j1 << 18)
4938 | (j2 << 19)
4939 | (s << 20);
4940 cond = bits (insn1, 6, 9);
4941 }
4942 }
4943 else
4944 {
4945 offset = (bits (insn1, 0, 9) << 12);
4946 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
4947 offset |= exchange ?
4948 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
4949 }
4950
4951 if (debug_displaced)
4952 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
4953 "%.4x %.4x with offset %.8lx\n",
4954 link ? (exchange) ? "blx" : "bl" : "b",
4955 insn1, insn2, offset);
4956
4957 dsc->modinsn[0] = THUMB_NOP;
4958
4959 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
4960 return 0;
4961}
4962
4963/* Copy B Thumb instructions. */
4964static int
4965thumb_copy_b (struct gdbarch *gdbarch, unsigned short insn,
4966 struct displaced_step_closure *dsc)
4967{
4968 unsigned int cond = 0;
4969 int offset = 0;
4970 unsigned short bit_12_15 = bits (insn, 12, 15);
4971 CORE_ADDR from = dsc->insn_addr;
4972
4973 if (bit_12_15 == 0xd)
4974 {
4975 /* offset = SignExtend (imm8:0, 32) */
4976 offset = sbits ((insn << 1), 0, 8);
4977 cond = bits (insn, 8, 11);
4978 }
4979 else if (bit_12_15 == 0xe) /* Encoding T2 */
4980 {
4981 offset = sbits ((insn << 1), 0, 11);
4982 cond = INST_AL;
4983 }
4984
4985 if (debug_displaced)
4986 fprintf_unfiltered (gdb_stdlog,
4987 "displaced: copying b immediate insn %.4x "
4988 "with offset %d\n", insn, offset);
4989
4990 dsc->u.branch.cond = cond;
4991 dsc->u.branch.link = 0;
4992 dsc->u.branch.exchange = 0;
4993 dsc->u.branch.dest = from + 4 + offset;
4994
4995 dsc->modinsn[0] = THUMB_NOP;
4996
4997 dsc->cleanup = &cleanup_branch;
4998
4999 return 0;
5000}
5001
cca44b1b
JB
5002/* Copy BX/BLX with register-specified destinations. */
5003
7ff120b4
YQ
5004static void
5005install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
5006 struct displaced_step_closure *dsc, int link,
5007 unsigned int cond, unsigned int rm)
cca44b1b 5008{
cca44b1b
JB
5009 /* Implement {BX,BLX}<cond> <reg>" as:
5010
5011 Preparation: cond <- instruction condition
5012 Insn: mov r0, r0 (nop)
5013 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
5014
5015 Don't set r14 in cleanup for BX. */
5016
36073a92 5017 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5018
5019 dsc->u.branch.cond = cond;
5020 dsc->u.branch.link = link;
cca44b1b 5021
7ff120b4 5022 dsc->u.branch.exchange = 1;
cca44b1b
JB
5023
5024 dsc->cleanup = &cleanup_branch;
7ff120b4 5025}
cca44b1b 5026
7ff120b4
YQ
5027static int
5028arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
5029 struct regcache *regs, struct displaced_step_closure *dsc)
5030{
5031 unsigned int cond = bits (insn, 28, 31);
5032 /* BX: x12xxx1x
5033 BLX: x12xxx3x. */
5034 int link = bit (insn, 5);
5035 unsigned int rm = bits (insn, 0, 3);
5036
5037 if (debug_displaced)
5038 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
5039 (unsigned long) insn);
5040
5041 dsc->modinsn[0] = ARM_NOP;
5042
5043 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
5044 return 0;
5045}
5046
34518530
YQ
5047static int
5048thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
5049 struct regcache *regs,
5050 struct displaced_step_closure *dsc)
5051{
5052 int link = bit (insn, 7);
5053 unsigned int rm = bits (insn, 3, 6);
5054
5055 if (debug_displaced)
5056 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
5057 (unsigned short) insn);
5058
5059 dsc->modinsn[0] = THUMB_NOP;
5060
5061 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
5062
5063 return 0;
5064}
5065
5066
0963b4bd 5067/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
5068
5069static void
6e39997a 5070cleanup_alu_imm (struct gdbarch *gdbarch,
cca44b1b
JB
5071 struct regcache *regs, struct displaced_step_closure *dsc)
5072{
36073a92 5073 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5074 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5075 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5076 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5077}
5078
5079static int
7ff120b4
YQ
5080arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5081 struct displaced_step_closure *dsc)
cca44b1b
JB
5082{
5083 unsigned int rn = bits (insn, 16, 19);
5084 unsigned int rd = bits (insn, 12, 15);
5085 unsigned int op = bits (insn, 21, 24);
5086 int is_mov = (op == 0xd);
5087 ULONGEST rd_val, rn_val;
cca44b1b
JB
5088
5089 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 5090 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
5091
5092 if (debug_displaced)
5093 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
5094 "%.8lx\n", is_mov ? "move" : "ALU",
5095 (unsigned long) insn);
5096
5097 /* Instruction is of form:
5098
5099 <op><cond> rd, [rn,] #imm
5100
5101 Rewrite as:
5102
5103 Preparation: tmp1, tmp2 <- r0, r1;
5104 r0, r1 <- rd, rn
5105 Insn: <op><cond> r0, r1, #imm
5106 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5107 */
5108
36073a92
YQ
5109 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5110 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5111 rn_val = displaced_read_reg (regs, dsc, rn);
5112 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
5113 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5114 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5115 dsc->rd = rd;
5116
5117 if (is_mov)
5118 dsc->modinsn[0] = insn & 0xfff00fff;
5119 else
5120 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
5121
5122 dsc->cleanup = &cleanup_alu_imm;
5123
5124 return 0;
5125}
5126
34518530
YQ
5127static int
5128thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
5129 uint16_t insn2, struct regcache *regs,
5130 struct displaced_step_closure *dsc)
5131{
5132 unsigned int op = bits (insn1, 5, 8);
5133 unsigned int rn, rm, rd;
5134 ULONGEST rd_val, rn_val;
5135
5136 rn = bits (insn1, 0, 3); /* Rn */
5137 rm = bits (insn2, 0, 3); /* Rm */
5138 rd = bits (insn2, 8, 11); /* Rd */
5139
5140 /* This routine is only called for instruction MOV. */
5141 gdb_assert (op == 0x2 && rn == 0xf);
5142
5143 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
5144 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
5145
5146 if (debug_displaced)
5147 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
5148 "ALU", insn1, insn2);
5149
5150 /* Instruction is of form:
5151
5152 <op><cond> rd, [rn,] #imm
5153
5154 Rewrite as:
5155
5156 Preparation: tmp1, tmp2 <- r0, r1;
5157 r0, r1 <- rd, rn
5158 Insn: <op><cond> r0, r1, #imm
5159 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
5160 */
5161
5162 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5163 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5164 rn_val = displaced_read_reg (regs, dsc, rn);
5165 rd_val = displaced_read_reg (regs, dsc, rd);
5166 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5167 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5168 dsc->rd = rd;
5169
5170 dsc->modinsn[0] = insn1;
5171 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
5172 dsc->numinsns = 2;
5173
5174 dsc->cleanup = &cleanup_alu_imm;
5175
5176 return 0;
5177}
5178
cca44b1b
JB
5179/* Copy/cleanup arithmetic/logic insns with register RHS. */
5180
5181static void
6e39997a 5182cleanup_alu_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5183 struct regcache *regs, struct displaced_step_closure *dsc)
5184{
5185 ULONGEST rd_val;
5186 int i;
5187
36073a92 5188 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5189
5190 for (i = 0; i < 3; i++)
5191 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5192
5193 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5194}
5195
7ff120b4
YQ
5196static void
5197install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
5198 struct displaced_step_closure *dsc,
5199 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 5200{
cca44b1b 5201 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 5202
cca44b1b
JB
5203 /* Instruction is of form:
5204
5205 <op><cond> rd, [rn,] rm [, <shift>]
5206
5207 Rewrite as:
5208
5209 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
5210 r0, r1, r2 <- rd, rn, rm
ef713951 5211 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
cca44b1b
JB
5212 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
5213 */
5214
36073a92
YQ
5215 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5216 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5217 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5218 rd_val = displaced_read_reg (regs, dsc, rd);
5219 rn_val = displaced_read_reg (regs, dsc, rn);
5220 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5221 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5222 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5223 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5224 dsc->rd = rd;
5225
7ff120b4
YQ
5226 dsc->cleanup = &cleanup_alu_reg;
5227}
5228
5229static int
5230arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5231 struct displaced_step_closure *dsc)
5232{
5233 unsigned int op = bits (insn, 21, 24);
5234 int is_mov = (op == 0xd);
5235
5236 if (!insn_references_pc (insn, 0x000ff00ful))
5237 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
5238
5239 if (debug_displaced)
5240 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
5241 is_mov ? "move" : "ALU", (unsigned long) insn);
5242
cca44b1b
JB
5243 if (is_mov)
5244 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
5245 else
5246 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
5247
7ff120b4
YQ
5248 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
5249 bits (insn, 0, 3));
cca44b1b
JB
5250 return 0;
5251}
5252
34518530
YQ
5253static int
5254thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
5255 struct regcache *regs,
5256 struct displaced_step_closure *dsc)
5257{
ef713951 5258 unsigned rm, rd;
34518530 5259
ef713951
YQ
5260 rm = bits (insn, 3, 6);
5261 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
34518530 5262
ef713951 5263 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
34518530
YQ
5264 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
5265
5266 if (debug_displaced)
ef713951
YQ
5267 fprintf_unfiltered (gdb_stdlog, "displaced: copying ALU reg insn %.4x\n",
5268 (unsigned short) insn);
34518530 5269
ef713951 5270 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
34518530 5271
ef713951 5272 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
34518530
YQ
5273
5274 return 0;
5275}
5276
cca44b1b
JB
5277/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
5278
5279static void
6e39997a 5280cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b
JB
5281 struct regcache *regs,
5282 struct displaced_step_closure *dsc)
5283{
36073a92 5284 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5285 int i;
5286
5287 for (i = 0; i < 4; i++)
5288 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
5289
5290 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
5291}
5292
7ff120b4
YQ
5293static void
5294install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
5295 struct displaced_step_closure *dsc,
5296 unsigned int rd, unsigned int rn, unsigned int rm,
5297 unsigned rs)
cca44b1b 5298{
7ff120b4 5299 int i;
cca44b1b 5300 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 5301
cca44b1b
JB
5302 /* Instruction is of form:
5303
5304 <op><cond> rd, [rn,] rm, <shift> rs
5305
5306 Rewrite as:
5307
5308 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
5309 r0, r1, r2, r3 <- rd, rn, rm, rs
5310 Insn: <op><cond> r0, r1, r2, <shift> r3
5311 Cleanup: tmp5 <- r0
5312 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
5313 rd <- tmp5
5314 */
5315
5316 for (i = 0; i < 4; i++)
36073a92 5317 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 5318
36073a92
YQ
5319 rd_val = displaced_read_reg (regs, dsc, rd);
5320 rn_val = displaced_read_reg (regs, dsc, rn);
5321 rm_val = displaced_read_reg (regs, dsc, rm);
5322 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
5323 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
5324 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
5325 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
5326 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
5327 dsc->rd = rd;
7ff120b4
YQ
5328 dsc->cleanup = &cleanup_alu_shifted_reg;
5329}
5330
5331static int
5332arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
5333 struct regcache *regs,
5334 struct displaced_step_closure *dsc)
5335{
5336 unsigned int op = bits (insn, 21, 24);
5337 int is_mov = (op == 0xd);
5338 unsigned int rd, rn, rm, rs;
5339
5340 if (!insn_references_pc (insn, 0x000fff0ful))
5341 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
5342
5343 if (debug_displaced)
5344 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
5345 "%.8lx\n", is_mov ? "move" : "ALU",
5346 (unsigned long) insn);
5347
5348 rn = bits (insn, 16, 19);
5349 rm = bits (insn, 0, 3);
5350 rs = bits (insn, 8, 11);
5351 rd = bits (insn, 12, 15);
cca44b1b
JB
5352
5353 if (is_mov)
5354 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
5355 else
5356 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
5357
7ff120b4 5358 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
5359
5360 return 0;
5361}
5362
5363/* Clean up load instructions. */
5364
5365static void
6e39997a 5366cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5367 struct displaced_step_closure *dsc)
5368{
5369 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 5370
36073a92 5371 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 5372 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
5373 rt_val2 = displaced_read_reg (regs, dsc, 1);
5374 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5375
5376 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5377 if (dsc->u.ldst.xfersize > 4)
5378 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5379 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5380 if (!dsc->u.ldst.immed)
5381 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5382
5383 /* Handle register writeback. */
5384 if (dsc->u.ldst.writeback)
5385 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5386 /* Put result in right place. */
5387 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
5388 if (dsc->u.ldst.xfersize == 8)
5389 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
5390}
5391
5392/* Clean up store instructions. */
5393
5394static void
6e39997a 5395cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5396 struct displaced_step_closure *dsc)
5397{
36073a92 5398 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
5399
5400 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5401 if (dsc->u.ldst.xfersize > 4)
5402 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5403 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
5404 if (!dsc->u.ldst.immed)
5405 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
5406 if (!dsc->u.ldst.restore_r4)
5407 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
5408
5409 /* Writeback. */
5410 if (dsc->u.ldst.writeback)
5411 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
5412}
5413
5414/* Copy "extra" load/store instructions. These are halfword/doubleword
5415 transfers, which have a different encoding to byte/word transfers. */
5416
5417static int
7ff120b4
YQ
5418arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unpriveleged,
5419 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
5420{
5421 unsigned int op1 = bits (insn, 20, 24);
5422 unsigned int op2 = bits (insn, 5, 6);
5423 unsigned int rt = bits (insn, 12, 15);
5424 unsigned int rn = bits (insn, 16, 19);
5425 unsigned int rm = bits (insn, 0, 3);
5426 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
5427 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
5428 int immed = (op1 & 0x4) != 0;
5429 int opcode;
5430 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
5431
5432 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 5433 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
5434
5435 if (debug_displaced)
5436 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
5437 "insn %.8lx\n", unpriveleged ? "unpriveleged " : "",
5438 (unsigned long) insn);
5439
5440 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
5441
5442 if (opcode < 0)
5443 internal_error (__FILE__, __LINE__,
5444 _("copy_extra_ld_st: instruction decode error"));
5445
36073a92
YQ
5446 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5447 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5448 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5449 if (!immed)
36073a92 5450 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5451
36073a92 5452 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 5453 if (bytesize[opcode] == 8)
36073a92
YQ
5454 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
5455 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5456 if (!immed)
36073a92 5457 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5458
5459 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5460 if (bytesize[opcode] == 8)
5461 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
5462 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5463 if (!immed)
5464 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
5465
5466 dsc->rd = rt;
5467 dsc->u.ldst.xfersize = bytesize[opcode];
5468 dsc->u.ldst.rn = rn;
5469 dsc->u.ldst.immed = immed;
5470 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
5471 dsc->u.ldst.restore_r4 = 0;
5472
5473 if (immed)
5474 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
5475 ->
5476 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
5477 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5478 else
5479 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
5480 ->
5481 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
5482 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5483
5484 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
5485
5486 return 0;
5487}
5488
0f6f04ba 5489/* Copy byte/half word/word loads and stores. */
cca44b1b 5490
7ff120b4 5491static void
0f6f04ba
YQ
5492install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5493 struct displaced_step_closure *dsc, int load,
5494 int immed, int writeback, int size, int usermode,
5495 int rt, int rm, int rn)
cca44b1b 5496{
cca44b1b 5497 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 5498
36073a92
YQ
5499 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5500 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 5501 if (!immed)
36073a92 5502 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 5503 if (!load)
36073a92 5504 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 5505
36073a92
YQ
5506 rt_val = displaced_read_reg (regs, dsc, rt);
5507 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5508 if (!immed)
36073a92 5509 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5510
5511 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
5512 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
5513 if (!immed)
5514 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 5515 dsc->rd = rt;
0f6f04ba 5516 dsc->u.ldst.xfersize = size;
cca44b1b
JB
5517 dsc->u.ldst.rn = rn;
5518 dsc->u.ldst.immed = immed;
7ff120b4 5519 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5520
5521 /* To write PC we can do:
5522
494e194e
YQ
5523 Before this sequence of instructions:
5524 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
5525 r2 is the Rn value got from dispalced_read_reg.
5526
5527 Insn1: push {pc} Write address of STR instruction + offset on stack
5528 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
5529 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
5530 = addr(Insn1) + offset - addr(Insn3) - 8
5531 = offset - 16
5532 Insn4: add r4, r4, #8 r4 = offset - 8
5533 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
5534 = from + offset
5535 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
5536
5537 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
5538 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
5539 of this can be found in Section "Saving from r15" in
5540 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 5541
7ff120b4
YQ
5542 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5543}
5544
34518530
YQ
5545
5546static int
5547thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
5548 uint16_t insn2, struct regcache *regs,
5549 struct displaced_step_closure *dsc, int size)
5550{
5551 unsigned int u_bit = bit (insn1, 7);
5552 unsigned int rt = bits (insn2, 12, 15);
5553 int imm12 = bits (insn2, 0, 11);
5554 ULONGEST pc_val;
5555
5556 if (debug_displaced)
5557 fprintf_unfiltered (gdb_stdlog,
5558 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
5559 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
5560 imm12);
5561
5562 if (!u_bit)
5563 imm12 = -1 * imm12;
5564
5565 /* Rewrite instruction LDR Rt imm12 into:
5566
5567 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
5568
5569 LDR R0, R2, R3,
5570
5571 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
5572
5573
5574 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5575 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
5576 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
5577
5578 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5579
5580 pc_val = pc_val & 0xfffffffc;
5581
5582 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
5583 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
5584
5585 dsc->rd = rt;
5586
5587 dsc->u.ldst.xfersize = size;
5588 dsc->u.ldst.immed = 0;
5589 dsc->u.ldst.writeback = 0;
5590 dsc->u.ldst.restore_r4 = 0;
5591
5592 /* LDR R0, R2, R3 */
5593 dsc->modinsn[0] = 0xf852;
5594 dsc->modinsn[1] = 0x3;
5595 dsc->numinsns = 2;
5596
5597 dsc->cleanup = &cleanup_load;
5598
5599 return 0;
5600}
5601
5602static int
5603thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
5604 uint16_t insn2, struct regcache *regs,
5605 struct displaced_step_closure *dsc,
5606 int writeback, int immed)
5607{
5608 unsigned int rt = bits (insn2, 12, 15);
5609 unsigned int rn = bits (insn1, 0, 3);
5610 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
5611 /* In LDR (register), there is also a register Rm, which is not allowed to
5612 be PC, so we don't have to check it. */
5613
5614 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
5615 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
5616 dsc);
5617
5618 if (debug_displaced)
5619 fprintf_unfiltered (gdb_stdlog,
5620 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
5621 rt, rn, insn1, insn2);
5622
5623 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
5624 0, rt, rm, rn);
5625
5626 dsc->u.ldst.restore_r4 = 0;
5627
5628 if (immed)
5629 /* ldr[b]<cond> rt, [rn, #imm], etc.
5630 ->
5631 ldr[b]<cond> r0, [r2, #imm]. */
5632 {
5633 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5634 dsc->modinsn[1] = insn2 & 0x0fff;
5635 }
5636 else
5637 /* ldr[b]<cond> rt, [rn, rm], etc.
5638 ->
5639 ldr[b]<cond> r0, [r2, r3]. */
5640 {
5641 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
5642 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
5643 }
5644
5645 dsc->numinsns = 2;
5646
5647 return 0;
5648}
5649
5650
7ff120b4
YQ
5651static int
5652arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
5653 struct regcache *regs,
5654 struct displaced_step_closure *dsc,
0f6f04ba 5655 int load, int size, int usermode)
7ff120b4
YQ
5656{
5657 int immed = !bit (insn, 25);
5658 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
5659 unsigned int rt = bits (insn, 12, 15);
5660 unsigned int rn = bits (insn, 16, 19);
5661 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
5662
5663 if (!insn_references_pc (insn, 0x000ff00ful))
5664 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
5665
5666 if (debug_displaced)
5667 fprintf_unfiltered (gdb_stdlog,
5668 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
5669 load ? (size == 1 ? "ldrb" : "ldr")
5670 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
5671 rt, rn,
5672 (unsigned long) insn);
5673
0f6f04ba
YQ
5674 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
5675 usermode, rt, rm, rn);
7ff120b4 5676
bf9f652a 5677 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
5678 {
5679 dsc->u.ldst.restore_r4 = 0;
5680
5681 if (immed)
5682 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
5683 ->
5684 {ldr,str}[b]<cond> r0, [r2, #imm]. */
5685 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
5686 else
5687 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
5688 ->
5689 {ldr,str}[b]<cond> r0, [r2, r3]. */
5690 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
5691 }
5692 else
5693 {
5694 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
5695 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
5696 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
5697 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
5698 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
5699 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
5700 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
5701
5702 /* As above. */
5703 if (immed)
5704 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
5705 else
5706 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
5707
cca44b1b
JB
5708 dsc->numinsns = 6;
5709 }
5710
5711 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
5712
5713 return 0;
5714}
5715
5716/* Cleanup LDM instructions with fully-populated register list. This is an
5717 unfortunate corner case: it's impossible to implement correctly by modifying
5718 the instruction. The issue is as follows: we have an instruction,
5719
5720 ldm rN, {r0-r15}
5721
5722 which we must rewrite to avoid loading PC. A possible solution would be to
5723 do the load in two halves, something like (with suitable cleanup
5724 afterwards):
5725
5726 mov r8, rN
5727 ldm[id][ab] r8!, {r0-r7}
5728 str r7, <temp>
5729 ldm[id][ab] r8, {r7-r14}
5730 <bkpt>
5731
5732 but at present there's no suitable place for <temp>, since the scratch space
5733 is overwritten before the cleanup routine is called. For now, we simply
5734 emulate the instruction. */
5735
5736static void
5737cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
5738 struct displaced_step_closure *dsc)
5739{
cca44b1b
JB
5740 int inc = dsc->u.block.increment;
5741 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
5742 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
5743 uint32_t regmask = dsc->u.block.regmask;
5744 int regno = inc ? 0 : 15;
5745 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
5746 int exception_return = dsc->u.block.load && dsc->u.block.user
5747 && (regmask & 0x8000) != 0;
36073a92 5748 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5749 int do_transfer = condition_true (dsc->u.block.cond, status);
5750 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5751
5752 if (!do_transfer)
5753 return;
5754
5755 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
5756 sensible we can do here. Complain loudly. */
5757 if (exception_return)
5758 error (_("Cannot single-step exception return"));
5759
5760 /* We don't handle any stores here for now. */
5761 gdb_assert (dsc->u.block.load != 0);
5762
5763 if (debug_displaced)
5764 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
5765 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
5766 dsc->u.block.increment ? "inc" : "dec",
5767 dsc->u.block.before ? "before" : "after");
5768
5769 while (regmask)
5770 {
5771 uint32_t memword;
5772
5773 if (inc)
bf9f652a 5774 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
5775 regno++;
5776 else
5777 while (regno >= 0 && (regmask & (1 << regno)) == 0)
5778 regno--;
5779
5780 xfer_addr += bump_before;
5781
5782 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
5783 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
5784
5785 xfer_addr += bump_after;
5786
5787 regmask &= ~(1 << regno);
5788 }
5789
5790 if (dsc->u.block.writeback)
5791 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
5792 CANNOT_WRITE_PC);
5793}
5794
5795/* Clean up an STM which included the PC in the register list. */
5796
5797static void
5798cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
5799 struct displaced_step_closure *dsc)
5800{
36073a92 5801 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5802 int store_executed = condition_true (dsc->u.block.cond, status);
5803 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
5804 CORE_ADDR stm_insn_addr;
5805 uint32_t pc_val;
5806 long offset;
5807 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
5808
5809 /* If condition code fails, there's nothing else to do. */
5810 if (!store_executed)
5811 return;
5812
5813 if (dsc->u.block.increment)
5814 {
5815 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
5816
5817 if (dsc->u.block.before)
5818 pc_stored_at += 4;
5819 }
5820 else
5821 {
5822 pc_stored_at = dsc->u.block.xfer_addr;
5823
5824 if (dsc->u.block.before)
5825 pc_stored_at -= 4;
5826 }
5827
5828 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
5829 stm_insn_addr = dsc->scratch_base;
5830 offset = pc_val - stm_insn_addr;
5831
5832 if (debug_displaced)
5833 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
5834 "STM instruction\n", offset);
5835
5836 /* Rewrite the stored PC to the proper value for the non-displaced original
5837 instruction. */
5838 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
5839 dsc->insn_addr + offset);
5840}
5841
5842/* Clean up an LDM which includes the PC in the register list. We clumped all
5843 the registers in the transferred list into a contiguous range r0...rX (to
5844 avoid loading PC directly and losing control of the debugged program), so we
5845 must undo that here. */
5846
5847static void
6e39997a 5848cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b
JB
5849 struct regcache *regs,
5850 struct displaced_step_closure *dsc)
5851{
36073a92 5852 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 5853 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 5854 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
5855 unsigned int regs_loaded = bitcount (mask);
5856 unsigned int num_to_shuffle = regs_loaded, clobbered;
5857
5858 /* The method employed here will fail if the register list is fully populated
5859 (we need to avoid loading PC directly). */
5860 gdb_assert (num_to_shuffle < 16);
5861
5862 if (!load_executed)
5863 return;
5864
5865 clobbered = (1 << num_to_shuffle) - 1;
5866
5867 while (num_to_shuffle > 0)
5868 {
5869 if ((mask & (1 << write_reg)) != 0)
5870 {
5871 unsigned int read_reg = num_to_shuffle - 1;
5872
5873 if (read_reg != write_reg)
5874 {
36073a92 5875 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
5876 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
5877 if (debug_displaced)
5878 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
5879 "loaded register r%d to r%d\n"), read_reg,
5880 write_reg);
5881 }
5882 else if (debug_displaced)
5883 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
5884 "r%d already in the right place\n"),
5885 write_reg);
5886
5887 clobbered &= ~(1 << write_reg);
5888
5889 num_to_shuffle--;
5890 }
5891
5892 write_reg--;
5893 }
5894
5895 /* Restore any registers we scribbled over. */
5896 for (write_reg = 0; clobbered != 0; write_reg++)
5897 {
5898 if ((clobbered & (1 << write_reg)) != 0)
5899 {
5900 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
5901 CANNOT_WRITE_PC);
5902 if (debug_displaced)
5903 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
5904 "clobbered register r%d\n"), write_reg);
5905 clobbered &= ~(1 << write_reg);
5906 }
5907 }
5908
5909 /* Perform register writeback manually. */
5910 if (dsc->u.block.writeback)
5911 {
5912 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
5913
5914 if (dsc->u.block.increment)
5915 new_rn_val += regs_loaded * 4;
5916 else
5917 new_rn_val -= regs_loaded * 4;
5918
5919 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
5920 CANNOT_WRITE_PC);
5921 }
5922}
5923
5924/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
5925 in user-level code (in particular exception return, ldm rn, {...pc}^). */
5926
5927static int
7ff120b4
YQ
5928arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
5929 struct regcache *regs,
5930 struct displaced_step_closure *dsc)
cca44b1b
JB
5931{
5932 int load = bit (insn, 20);
5933 int user = bit (insn, 22);
5934 int increment = bit (insn, 23);
5935 int before = bit (insn, 24);
5936 int writeback = bit (insn, 21);
5937 int rn = bits (insn, 16, 19);
cca44b1b 5938
0963b4bd
MS
5939 /* Block transfers which don't mention PC can be run directly
5940 out-of-line. */
bf9f652a 5941 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 5942 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 5943
bf9f652a 5944 if (rn == ARM_PC_REGNUM)
cca44b1b 5945 {
0963b4bd
MS
5946 warning (_("displaced: Unpredictable LDM or STM with "
5947 "base register r15"));
7ff120b4 5948 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
5949 }
5950
5951 if (debug_displaced)
5952 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
5953 "%.8lx\n", (unsigned long) insn);
5954
36073a92 5955 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
5956 dsc->u.block.rn = rn;
5957
5958 dsc->u.block.load = load;
5959 dsc->u.block.user = user;
5960 dsc->u.block.increment = increment;
5961 dsc->u.block.before = before;
5962 dsc->u.block.writeback = writeback;
5963 dsc->u.block.cond = bits (insn, 28, 31);
5964
5965 dsc->u.block.regmask = insn & 0xffff;
5966
5967 if (load)
5968 {
5969 if ((insn & 0xffff) == 0xffff)
5970 {
5971 /* LDM with a fully-populated register list. This case is
5972 particularly tricky. Implement for now by fully emulating the
5973 instruction (which might not behave perfectly in all cases, but
5974 these instructions should be rare enough for that not to matter
5975 too much). */
5976 dsc->modinsn[0] = ARM_NOP;
5977
5978 dsc->cleanup = &cleanup_block_load_all;
5979 }
5980 else
5981 {
5982 /* LDM of a list of registers which includes PC. Implement by
5983 rewriting the list of registers to be transferred into a
5984 contiguous chunk r0...rX before doing the transfer, then shuffling
5985 registers into the correct places in the cleanup routine. */
5986 unsigned int regmask = insn & 0xffff;
5987 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
5988 unsigned int to = 0, from = 0, i, new_rn;
5989
5990 for (i = 0; i < num_in_list; i++)
36073a92 5991 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
5992
5993 /* Writeback makes things complicated. We need to avoid clobbering
5994 the base register with one of the registers in our modified
5995 register list, but just using a different register can't work in
5996 all cases, e.g.:
5997
5998 ldm r14!, {r0-r13,pc}
5999
6000 which would need to be rewritten as:
6001
6002 ldm rN!, {r0-r14}
6003
6004 but that can't work, because there's no free register for N.
6005
6006 Solve this by turning off the writeback bit, and emulating
6007 writeback manually in the cleanup routine. */
6008
6009 if (writeback)
6010 insn &= ~(1 << 21);
6011
6012 new_regmask = (1 << num_in_list) - 1;
6013
6014 if (debug_displaced)
6015 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6016 "{..., pc}: original reg list %.4x, modified "
6017 "list %.4x\n"), rn, writeback ? "!" : "",
6018 (int) insn & 0xffff, new_regmask);
6019
6020 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
6021
6022 dsc->cleanup = &cleanup_block_load_pc;
6023 }
6024 }
6025 else
6026 {
6027 /* STM of a list of registers which includes PC. Run the instruction
6028 as-is, but out of line: this will store the wrong value for the PC,
6029 so we must manually fix up the memory in the cleanup routine.
6030 Doing things this way has the advantage that we can auto-detect
6031 the offset of the PC write (which is architecture-dependent) in
6032 the cleanup routine. */
6033 dsc->modinsn[0] = insn;
6034
6035 dsc->cleanup = &cleanup_block_store_pc;
6036 }
6037
6038 return 0;
6039}
6040
34518530
YQ
6041static int
6042thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6043 struct regcache *regs,
6044 struct displaced_step_closure *dsc)
cca44b1b 6045{
34518530
YQ
6046 int rn = bits (insn1, 0, 3);
6047 int load = bit (insn1, 4);
6048 int writeback = bit (insn1, 5);
cca44b1b 6049
34518530
YQ
6050 /* Block transfers which don't mention PC can be run directly
6051 out-of-line. */
6052 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
6053 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 6054
34518530
YQ
6055 if (rn == ARM_PC_REGNUM)
6056 {
6057 warning (_("displaced: Unpredictable LDM or STM with "
6058 "base register r15"));
6059 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6060 "unpredictable ldm/stm", dsc);
6061 }
cca44b1b
JB
6062
6063 if (debug_displaced)
34518530
YQ
6064 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6065 "%.4x%.4x\n", insn1, insn2);
cca44b1b 6066
34518530
YQ
6067 /* Clear bit 13, since it should be always zero. */
6068 dsc->u.block.regmask = (insn2 & 0xdfff);
6069 dsc->u.block.rn = rn;
cca44b1b 6070
34518530
YQ
6071 dsc->u.block.load = load;
6072 dsc->u.block.user = 0;
6073 dsc->u.block.increment = bit (insn1, 7);
6074 dsc->u.block.before = bit (insn1, 8);
6075 dsc->u.block.writeback = writeback;
6076 dsc->u.block.cond = INST_AL;
6077 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 6078
34518530
YQ
6079 if (load)
6080 {
6081 if (dsc->u.block.regmask == 0xffff)
6082 {
6083 /* This branch is impossible to happen. */
6084 gdb_assert (0);
6085 }
6086 else
6087 {
6088 unsigned int regmask = dsc->u.block.regmask;
6089 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
6090 unsigned int to = 0, from = 0, i, new_rn;
6091
6092 for (i = 0; i < num_in_list; i++)
6093 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6094
6095 if (writeback)
6096 insn1 &= ~(1 << 5);
6097
6098 new_regmask = (1 << num_in_list) - 1;
6099
6100 if (debug_displaced)
6101 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
6102 "{..., pc}: original reg list %.4x, modified "
6103 "list %.4x\n"), rn, writeback ? "!" : "",
6104 (int) dsc->u.block.regmask, new_regmask);
6105
6106 dsc->modinsn[0] = insn1;
6107 dsc->modinsn[1] = (new_regmask & 0xffff);
6108 dsc->numinsns = 2;
6109
6110 dsc->cleanup = &cleanup_block_load_pc;
6111 }
6112 }
6113 else
6114 {
6115 dsc->modinsn[0] = insn1;
6116 dsc->modinsn[1] = insn2;
6117 dsc->numinsns = 2;
6118 dsc->cleanup = &cleanup_block_store_pc;
6119 }
6120 return 0;
6121}
6122
d9311bfa
AT
6123/* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
6124 This is used to avoid a dependency on BFD's bfd_endian enum. */
6125
6126ULONGEST
6127arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
6128 int byte_order)
6129{
5f2dfcfd
AT
6130 return read_memory_unsigned_integer (memaddr, len,
6131 (enum bfd_endian) byte_order);
d9311bfa
AT
6132}
6133
6134/* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
6135
6136CORE_ADDR
6137arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
6138 CORE_ADDR val)
6139{
6140 return gdbarch_addr_bits_remove (get_regcache_arch (self->regcache), val);
6141}
6142
6143/* Wrapper over syscall_next_pc for use in get_next_pcs. */
6144
6145CORE_ADDR
6146arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self, CORE_ADDR pc)
6147{
6148 struct gdbarch_tdep *tdep;
6149
6150 tdep = gdbarch_tdep (get_regcache_arch (self->regcache));
6151 if (tdep->syscall_next_pc != NULL)
6152 return tdep->syscall_next_pc (self->regcache);
6153
6154 return 0;
6155}
6156
6157/* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
6158
6159int
6160arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
6161{
6162 return arm_is_thumb (self->regcache);
6163}
6164
6165/* single_step() is called just before we want to resume the inferior,
6166 if we want to single-step it but there is no hardware or kernel
6167 single-step support. We find the target of the coming instructions
6168 and breakpoint them. */
6169
6170int
6171arm_software_single_step (struct frame_info *frame)
6172{
6173 struct regcache *regcache = get_current_regcache ();
6174 struct gdbarch *gdbarch = get_regcache_arch (regcache);
6175 struct address_space *aspace = get_regcache_aspace (regcache);
6176 struct arm_get_next_pcs next_pcs_ctx;
6177 CORE_ADDR pc;
6178 int i;
6179 VEC (CORE_ADDR) *next_pcs = NULL;
6180 struct cleanup *old_chain = make_cleanup (VEC_cleanup (CORE_ADDR), &next_pcs);
6181
6182 arm_get_next_pcs_ctor (&next_pcs_ctx,
6183 &arm_get_next_pcs_ops,
6184 gdbarch_byte_order (gdbarch),
6185 gdbarch_byte_order_for_code (gdbarch),
6186 gdbarch_tdep (gdbarch)->thumb2_breakpoint,
6187 regcache);
6188
6189 next_pcs = arm_get_next_pcs (&next_pcs_ctx, regcache_read_pc (regcache));
6190
6191 for (i = 0; VEC_iterate (CORE_ADDR, next_pcs, i, pc); i++)
6192 arm_insert_single_step_breakpoint (gdbarch, aspace, pc);
6193
6194 do_cleanups (old_chain);
6195
6196 return 1;
6197}
6198
34518530
YQ
6199/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
6200 for Linux, where some SVC instructions must be treated specially. */
6201
6202static void
6203cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
6204 struct displaced_step_closure *dsc)
6205{
6206 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
6207
6208 if (debug_displaced)
6209 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
6210 "%.8lx\n", (unsigned long) resume_addr);
6211
6212 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
6213}
6214
6215
6216/* Common copy routine for svc instruciton. */
6217
6218static int
6219install_svc (struct gdbarch *gdbarch, struct regcache *regs,
6220 struct displaced_step_closure *dsc)
6221{
6222 /* Preparation: none.
6223 Insn: unmodified svc.
6224 Cleanup: pc <- insn_addr + insn_size. */
6225
6226 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
6227 instruction. */
6228 dsc->wrote_to_pc = 1;
6229
6230 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
6231 if (dsc->u.svc.copy_svc_os)
6232 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
6233 else
6234 {
6235 dsc->cleanup = &cleanup_svc;
6236 return 0;
6237 }
34518530
YQ
6238}
6239
6240static int
6241arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
6242 struct regcache *regs, struct displaced_step_closure *dsc)
6243{
6244
6245 if (debug_displaced)
6246 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
6247 (unsigned long) insn);
6248
6249 dsc->modinsn[0] = insn;
6250
6251 return install_svc (gdbarch, regs, dsc);
6252}
6253
6254static int
6255thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
6256 struct regcache *regs, struct displaced_step_closure *dsc)
6257{
6258
6259 if (debug_displaced)
6260 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
6261 insn);
bd18283a 6262
34518530
YQ
6263 dsc->modinsn[0] = insn;
6264
6265 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
6266}
6267
6268/* Copy undefined instructions. */
6269
6270static int
7ff120b4
YQ
6271arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
6272 struct displaced_step_closure *dsc)
cca44b1b
JB
6273{
6274 if (debug_displaced)
0963b4bd
MS
6275 fprintf_unfiltered (gdb_stdlog,
6276 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
6277 (unsigned long) insn);
6278
6279 dsc->modinsn[0] = insn;
6280
6281 return 0;
6282}
6283
34518530
YQ
6284static int
6285thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
6286 struct displaced_step_closure *dsc)
6287{
6288
6289 if (debug_displaced)
6290 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
6291 "%.4x %.4x\n", (unsigned short) insn1,
6292 (unsigned short) insn2);
6293
6294 dsc->modinsn[0] = insn1;
6295 dsc->modinsn[1] = insn2;
6296 dsc->numinsns = 2;
6297
6298 return 0;
6299}
6300
cca44b1b
JB
6301/* Copy unpredictable instructions. */
6302
6303static int
7ff120b4
YQ
6304arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
6305 struct displaced_step_closure *dsc)
cca44b1b
JB
6306{
6307 if (debug_displaced)
6308 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
6309 "%.8lx\n", (unsigned long) insn);
6310
6311 dsc->modinsn[0] = insn;
6312
6313 return 0;
6314}
6315
6316/* The decode_* functions are instruction decoding helpers. They mostly follow
6317 the presentation in the ARM ARM. */
6318
6319static int
7ff120b4
YQ
6320arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
6321 struct regcache *regs,
6322 struct displaced_step_closure *dsc)
cca44b1b
JB
6323{
6324 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
6325 unsigned int rn = bits (insn, 16, 19);
6326
6327 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 6328 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 6329 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 6330 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 6331 else if ((op1 & 0x60) == 0x20)
7ff120b4 6332 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 6333 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
6334 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
6335 dsc);
cca44b1b 6336 else if ((op1 & 0x77) == 0x41)
7ff120b4 6337 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6338 else if ((op1 & 0x77) == 0x45)
7ff120b4 6339 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
6340 else if ((op1 & 0x77) == 0x51)
6341 {
6342 if (rn != 0xf)
7ff120b4 6343 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 6344 else
7ff120b4 6345 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6346 }
6347 else if ((op1 & 0x77) == 0x55)
7ff120b4 6348 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
6349 else if (op1 == 0x57)
6350 switch (op2)
6351 {
7ff120b4
YQ
6352 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
6353 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
6354 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
6355 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
6356 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6357 }
6358 else if ((op1 & 0x63) == 0x43)
7ff120b4 6359 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
6360 else if ((op2 & 0x1) == 0x0)
6361 switch (op1 & ~0x80)
6362 {
6363 case 0x61:
7ff120b4 6364 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 6365 case 0x65:
7ff120b4 6366 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
6367 case 0x71: case 0x75:
6368 /* pld/pldw reg. */
7ff120b4 6369 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 6370 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 6371 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 6372 default:
7ff120b4 6373 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6374 }
6375 else
7ff120b4 6376 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
6377}
6378
6379static int
7ff120b4
YQ
6380arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
6381 struct regcache *regs,
6382 struct displaced_step_closure *dsc)
cca44b1b
JB
6383{
6384 if (bit (insn, 27) == 0)
7ff120b4 6385 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
6386 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
6387 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
6388 {
6389 case 0x0: case 0x2:
7ff120b4 6390 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
6391
6392 case 0x1: case 0x3:
7ff120b4 6393 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
6394
6395 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 6396 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
6397
6398 case 0x8:
6399 switch ((insn & 0xe00000) >> 21)
6400 {
6401 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
6402 /* stc/stc2. */
7ff120b4 6403 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6404
6405 case 0x2:
7ff120b4 6406 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
6407
6408 default:
7ff120b4 6409 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6410 }
6411
6412 case 0x9:
6413 {
6414 int rn_f = (bits (insn, 16, 19) == 0xf);
6415 switch ((insn & 0xe00000) >> 21)
6416 {
6417 case 0x1: case 0x3:
6418 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
6419 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
6420 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6421
6422 case 0x2:
7ff120b4 6423 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6424
6425 case 0x4: case 0x5: case 0x6: case 0x7:
6426 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
6427 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
6428 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6429
6430 default:
7ff120b4 6431 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6432 }
6433 }
6434
6435 case 0xa:
7ff120b4 6436 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
6437
6438 case 0xb:
6439 if (bits (insn, 16, 19) == 0xf)
6440 /* ldc/ldc2 lit. */
7ff120b4 6441 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6442 else
7ff120b4 6443 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6444
6445 case 0xc:
6446 if (bit (insn, 4))
7ff120b4 6447 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6448 else
7ff120b4 6449 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6450
6451 case 0xd:
6452 if (bit (insn, 4))
7ff120b4 6453 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6454 else
7ff120b4 6455 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6456
6457 default:
7ff120b4 6458 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6459 }
6460}
6461
6462/* Decode miscellaneous instructions in dp/misc encoding space. */
6463
6464static int
7ff120b4
YQ
6465arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
6466 struct regcache *regs,
6467 struct displaced_step_closure *dsc)
cca44b1b
JB
6468{
6469 unsigned int op2 = bits (insn, 4, 6);
6470 unsigned int op = bits (insn, 21, 22);
6471 unsigned int op1 = bits (insn, 16, 19);
6472
6473 switch (op2)
6474 {
6475 case 0x0:
7ff120b4 6476 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
6477
6478 case 0x1:
6479 if (op == 0x1) /* bx. */
7ff120b4 6480 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 6481 else if (op == 0x3)
7ff120b4 6482 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 6483 else
7ff120b4 6484 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6485
6486 case 0x2:
6487 if (op == 0x1)
6488 /* Not really supported. */
7ff120b4 6489 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 6490 else
7ff120b4 6491 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6492
6493 case 0x3:
6494 if (op == 0x1)
7ff120b4 6495 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 6496 regs, dsc); /* blx register. */
cca44b1b 6497 else
7ff120b4 6498 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6499
6500 case 0x5:
7ff120b4 6501 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
6502
6503 case 0x7:
6504 if (op == 0x1)
7ff120b4 6505 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
6506 else if (op == 0x3)
6507 /* Not really supported. */
7ff120b4 6508 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
6509
6510 default:
7ff120b4 6511 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6512 }
6513}
6514
6515static int
7ff120b4
YQ
6516arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
6517 struct regcache *regs,
6518 struct displaced_step_closure *dsc)
cca44b1b
JB
6519{
6520 if (bit (insn, 25))
6521 switch (bits (insn, 20, 24))
6522 {
6523 case 0x10:
7ff120b4 6524 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
6525
6526 case 0x14:
7ff120b4 6527 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
6528
6529 case 0x12: case 0x16:
7ff120b4 6530 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
6531
6532 default:
7ff120b4 6533 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
6534 }
6535 else
6536 {
6537 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
6538
6539 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 6540 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 6541 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 6542 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 6543 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 6544 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 6545 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 6546 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 6547 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 6548 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 6549 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 6550 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b
JB
6551 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
6552 /* 2nd arg means "unpriveleged". */
7ff120b4
YQ
6553 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
6554 dsc);
cca44b1b
JB
6555 }
6556
6557 /* Should be unreachable. */
6558 return 1;
6559}
6560
6561static int
7ff120b4
YQ
6562arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
6563 struct regcache *regs,
6564 struct displaced_step_closure *dsc)
cca44b1b
JB
6565{
6566 int a = bit (insn, 25), b = bit (insn, 4);
6567 uint32_t op1 = bits (insn, 20, 24);
6568 int rn_f = bits (insn, 16, 19) == 0xf;
6569
6570 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
6571 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 6572 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
6573 else if ((!a && (op1 & 0x17) == 0x02)
6574 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 6575 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
6576 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
6577 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 6578 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
6579 else if ((!a && (op1 & 0x17) == 0x03)
6580 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 6581 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
6582 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
6583 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 6584 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
6585 else if ((!a && (op1 & 0x17) == 0x06)
6586 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 6587 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
6588 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
6589 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 6590 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
6591 else if ((!a && (op1 & 0x17) == 0x07)
6592 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 6593 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
6594
6595 /* Should be unreachable. */
6596 return 1;
6597}
6598
6599static int
7ff120b4
YQ
6600arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
6601 struct displaced_step_closure *dsc)
cca44b1b
JB
6602{
6603 switch (bits (insn, 20, 24))
6604 {
6605 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 6606 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
6607
6608 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 6609 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
6610
6611 case 0x08: case 0x09: case 0x0a: case 0x0b:
6612 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 6613 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
6614 "decode/pack/unpack/saturate/reverse", dsc);
6615
6616 case 0x18:
6617 if (bits (insn, 5, 7) == 0) /* op2. */
6618 {
6619 if (bits (insn, 12, 15) == 0xf)
7ff120b4 6620 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 6621 else
7ff120b4 6622 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
6623 }
6624 else
7ff120b4 6625 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6626
6627 case 0x1a: case 0x1b:
6628 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6629 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 6630 else
7ff120b4 6631 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6632
6633 case 0x1c: case 0x1d:
6634 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
6635 {
6636 if (bits (insn, 0, 3) == 0xf)
7ff120b4 6637 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 6638 else
7ff120b4 6639 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
6640 }
6641 else
7ff120b4 6642 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6643
6644 case 0x1e: case 0x1f:
6645 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 6646 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 6647 else
7ff120b4 6648 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
6649 }
6650
6651 /* Should be unreachable. */
6652 return 1;
6653}
6654
6655static int
7ff120b4
YQ
6656arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, int32_t insn,
6657 struct regcache *regs,
6658 struct displaced_step_closure *dsc)
cca44b1b
JB
6659{
6660 if (bit (insn, 25))
7ff120b4 6661 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 6662 else
7ff120b4 6663 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
6664}
6665
6666static int
7ff120b4
YQ
6667arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
6668 struct regcache *regs,
6669 struct displaced_step_closure *dsc)
cca44b1b
JB
6670{
6671 unsigned int opcode = bits (insn, 20, 24);
6672
6673 switch (opcode)
6674 {
6675 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 6676 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
6677
6678 case 0x08: case 0x0a: case 0x0c: case 0x0e:
6679 case 0x12: case 0x16:
7ff120b4 6680 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
6681
6682 case 0x09: case 0x0b: case 0x0d: case 0x0f:
6683 case 0x13: case 0x17:
7ff120b4 6684 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
6685
6686 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6687 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6688 /* Note: no writeback for these instructions. Bit 25 will always be
6689 zero though (via caller), so the following works OK. */
7ff120b4 6690 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6691 }
6692
6693 /* Should be unreachable. */
6694 return 1;
6695}
6696
34518530
YQ
6697/* Decode shifted register instructions. */
6698
6699static int
6700thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
6701 uint16_t insn2, struct regcache *regs,
6702 struct displaced_step_closure *dsc)
6703{
6704 /* PC is only allowed to be used in instruction MOV. */
6705
6706 unsigned int op = bits (insn1, 5, 8);
6707 unsigned int rn = bits (insn1, 0, 3);
6708
6709 if (op == 0x2 && rn == 0xf) /* MOV */
6710 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
6711 else
6712 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6713 "dp (shift reg)", dsc);
6714}
6715
6716
6717/* Decode extension register load/store. Exactly the same as
6718 arm_decode_ext_reg_ld_st. */
6719
6720static int
6721thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
6722 uint16_t insn2, struct regcache *regs,
6723 struct displaced_step_closure *dsc)
6724{
6725 unsigned int opcode = bits (insn1, 4, 8);
6726
6727 switch (opcode)
6728 {
6729 case 0x04: case 0x05:
6730 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6731 "vfp/neon vmov", dsc);
6732
6733 case 0x08: case 0x0c: /* 01x00 */
6734 case 0x0a: case 0x0e: /* 01x10 */
6735 case 0x12: case 0x16: /* 10x10 */
6736 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6737 "vfp/neon vstm/vpush", dsc);
6738
6739 case 0x09: case 0x0d: /* 01x01 */
6740 case 0x0b: case 0x0f: /* 01x11 */
6741 case 0x13: case 0x17: /* 10x11 */
6742 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6743 "vfp/neon vldm/vpop", dsc);
6744
6745 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
6746 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6747 "vstr", dsc);
6748 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
6749 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
6750 }
6751
6752 /* Should be unreachable. */
6753 return 1;
6754}
6755
cca44b1b 6756static int
7ff120b4
YQ
6757arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
6758 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6759{
6760 unsigned int op1 = bits (insn, 20, 25);
6761 int op = bit (insn, 4);
6762 unsigned int coproc = bits (insn, 8, 11);
6763 unsigned int rn = bits (insn, 16, 19);
6764
6765 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 6766 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
6767 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
6768 && (coproc & 0xe) != 0xa)
6769 /* stc/stc2. */
7ff120b4 6770 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
6771 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
6772 && (coproc & 0xe) != 0xa)
6773 /* ldc/ldc2 imm/lit. */
7ff120b4 6774 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 6775 else if ((op1 & 0x3e) == 0x00)
7ff120b4 6776 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 6777 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 6778 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 6779 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 6780 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 6781 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 6782 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
6783 else if ((op1 & 0x30) == 0x20 && !op)
6784 {
6785 if ((coproc & 0xe) == 0xa)
7ff120b4 6786 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 6787 else
7ff120b4 6788 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
6789 }
6790 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 6791 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 6792 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 6793 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 6794 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 6795 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 6796 else if ((op1 & 0x30) == 0x30)
7ff120b4 6797 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 6798 else
7ff120b4 6799 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
6800}
6801
34518530
YQ
6802static int
6803thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
6804 uint16_t insn2, struct regcache *regs,
6805 struct displaced_step_closure *dsc)
6806{
6807 unsigned int coproc = bits (insn2, 8, 11);
6808 unsigned int op1 = bits (insn1, 4, 9);
6809 unsigned int bit_5_8 = bits (insn1, 5, 8);
6810 unsigned int bit_9 = bit (insn1, 9);
6811 unsigned int bit_4 = bit (insn1, 4);
6812 unsigned int rn = bits (insn1, 0, 3);
6813
6814 if (bit_9 == 0)
6815 {
6816 if (bit_5_8 == 2)
6817 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6818 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
6819 dsc);
6820 else if (bit_5_8 == 0) /* UNDEFINED. */
6821 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
6822 else
6823 {
6824 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
6825 if ((coproc & 0xe) == 0xa)
6826 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
6827 dsc);
6828 else /* coproc is not 101x. */
6829 {
6830 if (bit_4 == 0) /* STC/STC2. */
6831 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
6832 "stc/stc2", dsc);
6833 else /* LDC/LDC2 {literal, immeidate}. */
6834 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
6835 regs, dsc);
6836 }
6837 }
6838 }
6839 else
6840 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
6841
6842 return 0;
6843}
6844
6845static void
6846install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
6847 struct displaced_step_closure *dsc, int rd)
6848{
6849 /* ADR Rd, #imm
6850
6851 Rewrite as:
6852
6853 Preparation: Rd <- PC
6854 Insn: ADD Rd, #imm
6855 Cleanup: Null.
6856 */
6857
6858 /* Rd <- PC */
6859 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6860 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
6861}
6862
6863static int
6864thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
6865 struct displaced_step_closure *dsc,
6866 int rd, unsigned int imm)
6867{
6868
6869 /* Encoding T2: ADDS Rd, #imm */
6870 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
6871
6872 install_pc_relative (gdbarch, regs, dsc, rd);
6873
6874 return 0;
6875}
6876
6877static int
6878thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
6879 struct regcache *regs,
6880 struct displaced_step_closure *dsc)
6881{
6882 unsigned int rd = bits (insn, 8, 10);
6883 unsigned int imm8 = bits (insn, 0, 7);
6884
6885 if (debug_displaced)
6886 fprintf_unfiltered (gdb_stdlog,
6887 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
6888 rd, imm8, insn);
6889
6890 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
6891}
6892
6893static int
6894thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
6895 uint16_t insn2, struct regcache *regs,
6896 struct displaced_step_closure *dsc)
6897{
6898 unsigned int rd = bits (insn2, 8, 11);
6899 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
6900 extract raw immediate encoding rather than computing immediate. When
6901 generating ADD or SUB instruction, we can simply perform OR operation to
6902 set immediate into ADD. */
6903 unsigned int imm_3_8 = insn2 & 0x70ff;
6904 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
6905
6906 if (debug_displaced)
6907 fprintf_unfiltered (gdb_stdlog,
6908 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
6909 rd, imm_i, imm_3_8, insn1, insn2);
6910
6911 if (bit (insn1, 7)) /* Encoding T2 */
6912 {
6913 /* Encoding T3: SUB Rd, Rd, #imm */
6914 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
6915 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6916 }
6917 else /* Encoding T3 */
6918 {
6919 /* Encoding T3: ADD Rd, Rd, #imm */
6920 dsc->modinsn[0] = (0xf100 | rd | imm_i);
6921 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
6922 }
6923 dsc->numinsns = 2;
6924
6925 install_pc_relative (gdbarch, regs, dsc, rd);
6926
6927 return 0;
6928}
6929
6930static int
6931thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, unsigned short insn1,
6932 struct regcache *regs,
6933 struct displaced_step_closure *dsc)
6934{
6935 unsigned int rt = bits (insn1, 8, 10);
6936 unsigned int pc;
6937 int imm8 = (bits (insn1, 0, 7) << 2);
6938 CORE_ADDR from = dsc->insn_addr;
6939
6940 /* LDR Rd, #imm8
6941
6942 Rwrite as:
6943
6944 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
6945
6946 Insn: LDR R0, [R2, R3];
6947 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
6948
6949 if (debug_displaced)
6950 fprintf_unfiltered (gdb_stdlog,
6951 "displaced: copying thumb ldr r%d [pc #%d]\n"
6952 , rt, imm8);
6953
6954 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6955 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6956 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6957 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6958 /* The assembler calculates the required value of the offset from the
6959 Align(PC,4) value of this instruction to the label. */
6960 pc = pc & 0xfffffffc;
6961
6962 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
6963 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
6964
6965 dsc->rd = rt;
6966 dsc->u.ldst.xfersize = 4;
6967 dsc->u.ldst.rn = 0;
6968 dsc->u.ldst.immed = 0;
6969 dsc->u.ldst.writeback = 0;
6970 dsc->u.ldst.restore_r4 = 0;
6971
6972 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
6973
6974 dsc->cleanup = &cleanup_load;
6975
6976 return 0;
6977}
6978
6979/* Copy Thumb cbnz/cbz insruction. */
6980
6981static int
6982thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
6983 struct regcache *regs,
6984 struct displaced_step_closure *dsc)
6985{
6986 int non_zero = bit (insn1, 11);
6987 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
6988 CORE_ADDR from = dsc->insn_addr;
6989 int rn = bits (insn1, 0, 2);
6990 int rn_val = displaced_read_reg (regs, dsc, rn);
6991
6992 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
6993 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
6994 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
6995 condition is false, let it be, cleanup_branch will do nothing. */
6996 if (dsc->u.branch.cond)
6997 {
6998 dsc->u.branch.cond = INST_AL;
6999 dsc->u.branch.dest = from + 4 + imm5;
7000 }
7001 else
7002 dsc->u.branch.dest = from + 2;
7003
7004 dsc->u.branch.link = 0;
7005 dsc->u.branch.exchange = 0;
7006
7007 if (debug_displaced)
7008 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
7009 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
7010 rn, rn_val, insn1, dsc->u.branch.dest);
7011
7012 dsc->modinsn[0] = THUMB_NOP;
7013
7014 dsc->cleanup = &cleanup_branch;
7015 return 0;
7016}
7017
7018/* Copy Table Branch Byte/Halfword */
7019static int
7020thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7021 uint16_t insn2, struct regcache *regs,
7022 struct displaced_step_closure *dsc)
7023{
7024 ULONGEST rn_val, rm_val;
7025 int is_tbh = bit (insn2, 4);
7026 CORE_ADDR halfwords = 0;
7027 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7028
7029 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7030 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7031
7032 if (is_tbh)
7033 {
7034 gdb_byte buf[2];
7035
7036 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7037 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7038 }
7039 else
7040 {
7041 gdb_byte buf[1];
7042
7043 target_read_memory (rn_val + rm_val, buf, 1);
7044 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7045 }
7046
7047 if (debug_displaced)
7048 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7049 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7050 (unsigned int) rn_val, (unsigned int) rm_val,
7051 (unsigned int) halfwords);
7052
7053 dsc->u.branch.cond = INST_AL;
7054 dsc->u.branch.link = 0;
7055 dsc->u.branch.exchange = 0;
7056 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7057
7058 dsc->cleanup = &cleanup_branch;
7059
7060 return 0;
7061}
7062
7063static void
7064cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
7065 struct displaced_step_closure *dsc)
7066{
7067 /* PC <- r7 */
7068 int val = displaced_read_reg (regs, dsc, 7);
7069 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
7070
7071 /* r7 <- r8 */
7072 val = displaced_read_reg (regs, dsc, 8);
7073 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
7074
7075 /* r8 <- tmp[0] */
7076 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
7077
7078}
7079
7080static int
7081thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, unsigned short insn1,
7082 struct regcache *regs,
7083 struct displaced_step_closure *dsc)
7084{
7085 dsc->u.block.regmask = insn1 & 0x00ff;
7086
7087 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
7088 to :
7089
7090 (1) register list is full, that is, r0-r7 are used.
7091 Prepare: tmp[0] <- r8
7092
7093 POP {r0, r1, ...., r6, r7}; remove PC from reglist
7094 MOV r8, r7; Move value of r7 to r8;
7095 POP {r7}; Store PC value into r7.
7096
7097 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
7098
7099 (2) register list is not full, supposing there are N registers in
7100 register list (except PC, 0 <= N <= 7).
7101 Prepare: for each i, 0 - N, tmp[i] <- ri.
7102
7103 POP {r0, r1, ...., rN};
7104
7105 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
7106 from tmp[] properly.
7107 */
7108 if (debug_displaced)
7109 fprintf_unfiltered (gdb_stdlog,
7110 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
7111 dsc->u.block.regmask, insn1);
7112
7113 if (dsc->u.block.regmask == 0xff)
7114 {
7115 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
7116
7117 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
7118 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
7119 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
7120
7121 dsc->numinsns = 3;
7122 dsc->cleanup = &cleanup_pop_pc_16bit_all;
7123 }
7124 else
7125 {
7126 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
7127 unsigned int new_regmask, bit = 1;
7128 unsigned int to = 0, from = 0, i, new_rn;
7129
7130 for (i = 0; i < num_in_list + 1; i++)
7131 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7132
7133 new_regmask = (1 << (num_in_list + 1)) - 1;
7134
7135 if (debug_displaced)
7136 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
7137 "{..., pc}: original reg list %.4x,"
7138 " modified list %.4x\n"),
7139 (int) dsc->u.block.regmask, new_regmask);
7140
7141 dsc->u.block.regmask |= 0x8000;
7142 dsc->u.block.writeback = 0;
7143 dsc->u.block.cond = INST_AL;
7144
7145 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
7146
7147 dsc->cleanup = &cleanup_block_load_pc;
7148 }
7149
7150 return 0;
7151}
7152
7153static void
7154thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7155 struct regcache *regs,
7156 struct displaced_step_closure *dsc)
7157{
7158 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
7159 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
7160 int err = 0;
7161
7162 /* 16-bit thumb instructions. */
7163 switch (op_bit_12_15)
7164 {
7165 /* Shift (imme), add, subtract, move and compare. */
7166 case 0: case 1: case 2: case 3:
7167 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7168 "shift/add/sub/mov/cmp",
7169 dsc);
7170 break;
7171 case 4:
7172 switch (op_bit_10_11)
7173 {
7174 case 0: /* Data-processing */
7175 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
7176 "data-processing",
7177 dsc);
7178 break;
7179 case 1: /* Special data instructions and branch and exchange. */
7180 {
7181 unsigned short op = bits (insn1, 7, 9);
7182 if (op == 6 || op == 7) /* BX or BLX */
7183 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
7184 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
7185 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
7186 else
7187 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
7188 dsc);
7189 }
7190 break;
7191 default: /* LDR (literal) */
7192 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
7193 }
7194 break;
7195 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
7196 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
7197 break;
7198 case 10:
7199 if (op_bit_10_11 < 2) /* Generate PC-relative address */
7200 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
7201 else /* Generate SP-relative address */
7202 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
7203 break;
7204 case 11: /* Misc 16-bit instructions */
7205 {
7206 switch (bits (insn1, 8, 11))
7207 {
7208 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
7209 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
7210 break;
7211 case 12: case 13: /* POP */
7212 if (bit (insn1, 8)) /* PC is in register list. */
7213 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
7214 else
7215 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
7216 break;
7217 case 15: /* If-Then, and hints */
7218 if (bits (insn1, 0, 3))
7219 /* If-Then makes up to four following instructions conditional.
7220 IT instruction itself is not conditional, so handle it as a
7221 common unmodified instruction. */
7222 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
7223 dsc);
7224 else
7225 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
7226 break;
7227 default:
7228 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
7229 }
7230 }
7231 break;
7232 case 12:
7233 if (op_bit_10_11 < 2) /* Store multiple registers */
7234 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
7235 else /* Load multiple registers */
7236 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
7237 break;
7238 case 13: /* Conditional branch and supervisor call */
7239 if (bits (insn1, 9, 11) != 7) /* conditional branch */
7240 err = thumb_copy_b (gdbarch, insn1, dsc);
7241 else
7242 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
7243 break;
7244 case 14: /* Unconditional branch */
7245 err = thumb_copy_b (gdbarch, insn1, dsc);
7246 break;
7247 default:
7248 err = 1;
7249 }
7250
7251 if (err)
7252 internal_error (__FILE__, __LINE__,
7253 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
7254}
7255
7256static int
7257decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
7258 uint16_t insn1, uint16_t insn2,
7259 struct regcache *regs,
7260 struct displaced_step_closure *dsc)
7261{
7262 int rt = bits (insn2, 12, 15);
7263 int rn = bits (insn1, 0, 3);
7264 int op1 = bits (insn1, 7, 8);
7265 int err = 0;
7266
7267 switch (bits (insn1, 5, 6))
7268 {
7269 case 0: /* Load byte and memory hints */
7270 if (rt == 0xf) /* PLD/PLI */
7271 {
7272 if (rn == 0xf)
7273 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
7274 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
7275 else
7276 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7277 "pli/pld", dsc);
7278 }
7279 else
7280 {
7281 if (rn == 0xf) /* LDRB/LDRSB (literal) */
7282 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7283 1);
7284 else
7285 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7286 "ldrb{reg, immediate}/ldrbt",
7287 dsc);
7288 }
7289
7290 break;
7291 case 1: /* Load halfword and memory hints. */
7292 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
7293 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7294 "pld/unalloc memhint", dsc);
7295 else
7296 {
7297 if (rn == 0xf)
7298 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
7299 2);
7300 else
7301 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7302 "ldrh/ldrht", dsc);
7303 }
7304 break;
7305 case 2: /* Load word */
7306 {
7307 int insn2_bit_8_11 = bits (insn2, 8, 11);
7308
7309 if (rn == 0xf)
7310 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
7311 else if (op1 == 0x1) /* Encoding T3 */
7312 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
7313 0, 1);
7314 else /* op1 == 0x0 */
7315 {
7316 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
7317 /* LDR (immediate) */
7318 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7319 dsc, bit (insn2, 8), 1);
7320 else if (insn2_bit_8_11 == 0xe) /* LDRT */
7321 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7322 "ldrt", dsc);
7323 else
7324 /* LDR (register) */
7325 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
7326 dsc, 0, 0);
7327 }
7328 break;
7329 }
7330 default:
7331 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7332 break;
7333 }
7334 return 0;
7335}
7336
7337static void
7338thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
7339 uint16_t insn2, struct regcache *regs,
7340 struct displaced_step_closure *dsc)
7341{
7342 int err = 0;
7343 unsigned short op = bit (insn2, 15);
7344 unsigned int op1 = bits (insn1, 11, 12);
7345
7346 switch (op1)
7347 {
7348 case 1:
7349 {
7350 switch (bits (insn1, 9, 10))
7351 {
7352 case 0:
7353 if (bit (insn1, 6))
7354 {
7355 /* Load/store {dual, execlusive}, table branch. */
7356 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
7357 && bits (insn2, 5, 7) == 0)
7358 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
7359 dsc);
7360 else
7361 /* PC is not allowed to use in load/store {dual, exclusive}
7362 instructions. */
7363 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7364 "load/store dual/ex", dsc);
7365 }
7366 else /* load/store multiple */
7367 {
7368 switch (bits (insn1, 7, 8))
7369 {
7370 case 0: case 3: /* SRS, RFE */
7371 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7372 "srs/rfe", dsc);
7373 break;
7374 case 1: case 2: /* LDM/STM/PUSH/POP */
7375 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
7376 break;
7377 }
7378 }
7379 break;
7380
7381 case 1:
7382 /* Data-processing (shift register). */
7383 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
7384 dsc);
7385 break;
7386 default: /* Coprocessor instructions. */
7387 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7388 break;
7389 }
7390 break;
7391 }
7392 case 2: /* op1 = 2 */
7393 if (op) /* Branch and misc control. */
7394 {
7395 if (bit (insn2, 14) /* BLX/BL */
7396 || bit (insn2, 12) /* Unconditional branch */
7397 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
7398 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
7399 else
7400 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7401 "misc ctrl", dsc);
7402 }
7403 else
7404 {
7405 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
7406 {
7407 int op = bits (insn1, 4, 8);
7408 int rn = bits (insn1, 0, 3);
7409 if ((op == 0 || op == 0xa) && rn == 0xf)
7410 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
7411 regs, dsc);
7412 else
7413 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7414 "dp/pb", dsc);
7415 }
7416 else /* Data processing (modified immeidate) */
7417 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7418 "dp/mi", dsc);
7419 }
7420 break;
7421 case 3: /* op1 = 3 */
7422 switch (bits (insn1, 9, 10))
7423 {
7424 case 0:
7425 if (bit (insn1, 4))
7426 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
7427 regs, dsc);
7428 else /* NEON Load/Store and Store single data item */
7429 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7430 "neon elt/struct load/store",
7431 dsc);
7432 break;
7433 case 1: /* op1 = 3, bits (9, 10) == 1 */
7434 switch (bits (insn1, 7, 8))
7435 {
7436 case 0: case 1: /* Data processing (register) */
7437 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7438 "dp(reg)", dsc);
7439 break;
7440 case 2: /* Multiply and absolute difference */
7441 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7442 "mul/mua/diff", dsc);
7443 break;
7444 case 3: /* Long multiply and divide */
7445 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7446 "lmul/lmua", dsc);
7447 break;
7448 }
7449 break;
7450 default: /* Coprocessor instructions */
7451 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
7452 break;
7453 }
7454 break;
7455 default:
7456 err = 1;
7457 }
7458
7459 if (err)
7460 internal_error (__FILE__, __LINE__,
7461 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
7462
7463}
7464
b434a28f
YQ
7465static void
7466thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7467 CORE_ADDR to, struct regcache *regs,
7468 struct displaced_step_closure *dsc)
7469{
34518530
YQ
7470 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7471 uint16_t insn1
7472 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
7473
7474 if (debug_displaced)
7475 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
7476 "at %.8lx\n", insn1, (unsigned long) from);
7477
7478 dsc->is_thumb = 1;
7479 dsc->insn_size = thumb_insn_size (insn1);
7480 if (thumb_insn_size (insn1) == 4)
7481 {
7482 uint16_t insn2
7483 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
7484 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
7485 }
7486 else
7487 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
7488}
7489
cca44b1b 7490void
b434a28f
YQ
7491arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
7492 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
7493 struct displaced_step_closure *dsc)
7494{
7495 int err = 0;
b434a28f
YQ
7496 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
7497 uint32_t insn;
cca44b1b
JB
7498
7499 /* Most displaced instructions use a 1-instruction scratch space, so set this
7500 here and override below if/when necessary. */
7501 dsc->numinsns = 1;
7502 dsc->insn_addr = from;
7503 dsc->scratch_base = to;
7504 dsc->cleanup = NULL;
7505 dsc->wrote_to_pc = 0;
7506
b434a28f
YQ
7507 if (!displaced_in_arm_mode (regs))
7508 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
7509
4db71c0b
YQ
7510 dsc->is_thumb = 0;
7511 dsc->insn_size = 4;
b434a28f
YQ
7512 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
7513 if (debug_displaced)
7514 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
7515 "at %.8lx\n", (unsigned long) insn,
7516 (unsigned long) from);
7517
cca44b1b 7518 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 7519 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
7520 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
7521 {
7522 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 7523 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
7524 break;
7525
7526 case 0x4: case 0x5: case 0x6:
7ff120b4 7527 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
7528 break;
7529
7530 case 0x7:
7ff120b4 7531 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
7532 break;
7533
7534 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 7535 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7536 break;
7537
7538 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 7539 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
7540 break;
7541 }
7542
7543 if (err)
7544 internal_error (__FILE__, __LINE__,
7545 _("arm_process_displaced_insn: Instruction decode error"));
7546}
7547
7548/* Actually set up the scratch space for a displaced instruction. */
7549
7550void
7551arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
7552 CORE_ADDR to, struct displaced_step_closure *dsc)
7553{
7554 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 7555 unsigned int i, len, offset;
cca44b1b 7556 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b 7557 int size = dsc->is_thumb? 2 : 4;
948f8e3d 7558 const gdb_byte *bkp_insn;
cca44b1b 7559
4db71c0b 7560 offset = 0;
cca44b1b
JB
7561 /* Poke modified instruction(s). */
7562 for (i = 0; i < dsc->numinsns; i++)
7563 {
7564 if (debug_displaced)
4db71c0b
YQ
7565 {
7566 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
7567 if (size == 4)
7568 fprintf_unfiltered (gdb_stdlog, "%.8lx",
7569 dsc->modinsn[i]);
7570 else if (size == 2)
7571 fprintf_unfiltered (gdb_stdlog, "%.4x",
7572 (unsigned short)dsc->modinsn[i]);
7573
7574 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
7575 (unsigned long) to + offset);
7576
7577 }
7578 write_memory_unsigned_integer (to + offset, size,
7579 byte_order_for_code,
cca44b1b 7580 dsc->modinsn[i]);
4db71c0b
YQ
7581 offset += size;
7582 }
7583
7584 /* Choose the correct breakpoint instruction. */
7585 if (dsc->is_thumb)
7586 {
7587 bkp_insn = tdep->thumb_breakpoint;
7588 len = tdep->thumb_breakpoint_size;
7589 }
7590 else
7591 {
7592 bkp_insn = tdep->arm_breakpoint;
7593 len = tdep->arm_breakpoint_size;
cca44b1b
JB
7594 }
7595
7596 /* Put breakpoint afterwards. */
4db71c0b 7597 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
7598
7599 if (debug_displaced)
7600 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
7601 paddress (gdbarch, from), paddress (gdbarch, to));
7602}
7603
7604/* Entry point for copying an instruction into scratch space for displaced
7605 stepping. */
7606
7607struct displaced_step_closure *
7608arm_displaced_step_copy_insn (struct gdbarch *gdbarch,
7609 CORE_ADDR from, CORE_ADDR to,
7610 struct regcache *regs)
7611{
8d749320
SM
7612 struct displaced_step_closure *dsc = XNEW (struct displaced_step_closure);
7613
b434a28f 7614 arm_process_displaced_insn (gdbarch, from, to, regs, dsc);
cca44b1b
JB
7615 arm_displaced_init_closure (gdbarch, from, to, dsc);
7616
7617 return dsc;
7618}
7619
7620/* Entry point for cleaning things up after a displaced instruction has been
7621 single-stepped. */
7622
7623void
7624arm_displaced_step_fixup (struct gdbarch *gdbarch,
7625 struct displaced_step_closure *dsc,
7626 CORE_ADDR from, CORE_ADDR to,
7627 struct regcache *regs)
7628{
7629 if (dsc->cleanup)
7630 dsc->cleanup (gdbarch, regs, dsc);
7631
7632 if (!dsc->wrote_to_pc)
4db71c0b
YQ
7633 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
7634 dsc->insn_addr + dsc->insn_size);
7635
cca44b1b
JB
7636}
7637
7638#include "bfd-in2.h"
7639#include "libcoff.h"
7640
7641static int
7642gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
7643{
9a3c8263 7644 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
9779414d
DJ
7645
7646 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
7647 {
7648 static asymbol *asym;
7649 static combined_entry_type ce;
7650 static struct coff_symbol_struct csym;
7651 static struct bfd fake_bfd;
7652 static bfd_target fake_target;
7653
7654 if (csym.native == NULL)
7655 {
7656 /* Create a fake symbol vector containing a Thumb symbol.
7657 This is solely so that the code in print_insn_little_arm()
7658 and print_insn_big_arm() in opcodes/arm-dis.c will detect
7659 the presence of a Thumb symbol and switch to decoding
7660 Thumb instructions. */
7661
7662 fake_target.flavour = bfd_target_coff_flavour;
7663 fake_bfd.xvec = &fake_target;
7664 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
7665 csym.native = &ce;
7666 csym.symbol.the_bfd = &fake_bfd;
7667 csym.symbol.name = "fake";
7668 asym = (asymbol *) & csym;
7669 }
7670
7671 memaddr = UNMAKE_THUMB_ADDR (memaddr);
7672 info->symbols = &asym;
7673 }
7674 else
7675 info->symbols = NULL;
7676
7677 if (info->endian == BFD_ENDIAN_BIG)
7678 return print_insn_big_arm (memaddr, info);
7679 else
7680 return print_insn_little_arm (memaddr, info);
7681}
7682
7683/* The following define instruction sequences that will cause ARM
7684 cpu's to take an undefined instruction trap. These are used to
7685 signal a breakpoint to GDB.
7686
7687 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
7688 modes. A different instruction is required for each mode. The ARM
7689 cpu's can also be big or little endian. Thus four different
7690 instructions are needed to support all cases.
7691
7692 Note: ARMv4 defines several new instructions that will take the
7693 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
7694 not in fact add the new instructions. The new undefined
7695 instructions in ARMv4 are all instructions that had no defined
7696 behaviour in earlier chips. There is no guarantee that they will
7697 raise an exception, but may be treated as NOP's. In practice, it
7698 may only safe to rely on instructions matching:
7699
7700 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
7701 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
7702 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
7703
0963b4bd 7704 Even this may only true if the condition predicate is true. The
cca44b1b
JB
7705 following use a condition predicate of ALWAYS so it is always TRUE.
7706
7707 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
7708 and NetBSD all use a software interrupt rather than an undefined
7709 instruction to force a trap. This can be handled by by the
7710 abi-specific code during establishment of the gdbarch vector. */
7711
7712#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
7713#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
7714#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
7715#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
7716
948f8e3d
PA
7717static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
7718static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
7719static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
7720static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
cca44b1b
JB
7721
7722/* Determine the type and size of breakpoint to insert at PCPTR. Uses
7723 the program counter value to determine whether a 16-bit or 32-bit
7724 breakpoint should be used. It returns a pointer to a string of
7725 bytes that encode a breakpoint instruction, stores the length of
7726 the string to *lenptr, and adjusts the program counter (if
7727 necessary) to point to the actual memory location where the
7728 breakpoint should be inserted. */
7729
7730static const unsigned char *
7731arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
7732{
7733 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 7734 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 7735
9779414d 7736 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
7737 {
7738 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
7739
7740 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
7741 check whether we are replacing a 32-bit instruction. */
7742 if (tdep->thumb2_breakpoint != NULL)
7743 {
7744 gdb_byte buf[2];
7745 if (target_read_memory (*pcptr, buf, 2) == 0)
7746 {
7747 unsigned short inst1;
7748 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 7749 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
7750 {
7751 *lenptr = tdep->thumb2_breakpoint_size;
7752 return tdep->thumb2_breakpoint;
7753 }
7754 }
7755 }
7756
cca44b1b
JB
7757 *lenptr = tdep->thumb_breakpoint_size;
7758 return tdep->thumb_breakpoint;
7759 }
7760 else
7761 {
7762 *lenptr = tdep->arm_breakpoint_size;
7763 return tdep->arm_breakpoint;
7764 }
7765}
7766
177321bd
DJ
7767static void
7768arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
7769 int *kindptr)
7770{
177321bd
DJ
7771 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
7772
9779414d 7773 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
7774 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
7775 that this is not confused with a 32-bit ARM breakpoint. */
7776 *kindptr = 3;
7777}
7778
cca44b1b
JB
7779/* Extract from an array REGBUF containing the (raw) register state a
7780 function return value of type TYPE, and copy that, in virtual
7781 format, into VALBUF. */
7782
7783static void
7784arm_extract_return_value (struct type *type, struct regcache *regs,
7785 gdb_byte *valbuf)
7786{
7787 struct gdbarch *gdbarch = get_regcache_arch (regs);
7788 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7789
7790 if (TYPE_CODE_FLT == TYPE_CODE (type))
7791 {
7792 switch (gdbarch_tdep (gdbarch)->fp_model)
7793 {
7794 case ARM_FLOAT_FPA:
7795 {
7796 /* The value is in register F0 in internal format. We need to
7797 extract the raw value and then convert it to the desired
7798 internal type. */
7799 bfd_byte tmpbuf[FP_REGISTER_SIZE];
7800
7801 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
7802 convert_from_extended (floatformat_from_type (type), tmpbuf,
7803 valbuf, gdbarch_byte_order (gdbarch));
7804 }
7805 break;
7806
7807 case ARM_FLOAT_SOFT_FPA:
7808 case ARM_FLOAT_SOFT_VFP:
7809 /* ARM_FLOAT_VFP can arise if this is a variadic function so
7810 not using the VFP ABI code. */
7811 case ARM_FLOAT_VFP:
7812 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
7813 if (TYPE_LENGTH (type) > 4)
7814 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
7815 valbuf + INT_REGISTER_SIZE);
7816 break;
7817
7818 default:
0963b4bd
MS
7819 internal_error (__FILE__, __LINE__,
7820 _("arm_extract_return_value: "
7821 "Floating point model not supported"));
cca44b1b
JB
7822 break;
7823 }
7824 }
7825 else if (TYPE_CODE (type) == TYPE_CODE_INT
7826 || TYPE_CODE (type) == TYPE_CODE_CHAR
7827 || TYPE_CODE (type) == TYPE_CODE_BOOL
7828 || TYPE_CODE (type) == TYPE_CODE_PTR
7829 || TYPE_CODE (type) == TYPE_CODE_REF
7830 || TYPE_CODE (type) == TYPE_CODE_ENUM)
7831 {
b021a221
MS
7832 /* If the type is a plain integer, then the access is
7833 straight-forward. Otherwise we have to play around a bit
7834 more. */
cca44b1b
JB
7835 int len = TYPE_LENGTH (type);
7836 int regno = ARM_A1_REGNUM;
7837 ULONGEST tmp;
7838
7839 while (len > 0)
7840 {
7841 /* By using store_unsigned_integer we avoid having to do
7842 anything special for small big-endian values. */
7843 regcache_cooked_read_unsigned (regs, regno++, &tmp);
7844 store_unsigned_integer (valbuf,
7845 (len > INT_REGISTER_SIZE
7846 ? INT_REGISTER_SIZE : len),
7847 byte_order, tmp);
7848 len -= INT_REGISTER_SIZE;
7849 valbuf += INT_REGISTER_SIZE;
7850 }
7851 }
7852 else
7853 {
7854 /* For a structure or union the behaviour is as if the value had
7855 been stored to word-aligned memory and then loaded into
7856 registers with 32-bit load instruction(s). */
7857 int len = TYPE_LENGTH (type);
7858 int regno = ARM_A1_REGNUM;
7859 bfd_byte tmpbuf[INT_REGISTER_SIZE];
7860
7861 while (len > 0)
7862 {
7863 regcache_cooked_read (regs, regno++, tmpbuf);
7864 memcpy (valbuf, tmpbuf,
7865 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
7866 len -= INT_REGISTER_SIZE;
7867 valbuf += INT_REGISTER_SIZE;
7868 }
7869 }
7870}
7871
7872
7873/* Will a function return an aggregate type in memory or in a
7874 register? Return 0 if an aggregate type can be returned in a
7875 register, 1 if it must be returned in memory. */
7876
7877static int
7878arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
7879{
cca44b1b
JB
7880 enum type_code code;
7881
f168693b 7882 type = check_typedef (type);
cca44b1b 7883
b13c8ab2
YQ
7884 /* Simple, non-aggregate types (ie not including vectors and
7885 complex) are always returned in a register (or registers). */
7886 code = TYPE_CODE (type);
7887 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
7888 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
7889 return 0;
cca44b1b 7890
c4312b19
YQ
7891 if (TYPE_CODE_ARRAY == code && TYPE_VECTOR (type))
7892 {
7893 /* Vector values should be returned using ARM registers if they
7894 are not over 16 bytes. */
7895 return (TYPE_LENGTH (type) > 16);
7896 }
7897
b13c8ab2 7898 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
cca44b1b 7899 {
b13c8ab2
YQ
7900 /* The AAPCS says all aggregates not larger than a word are returned
7901 in a register. */
7902 if (TYPE_LENGTH (type) <= INT_REGISTER_SIZE)
7903 return 0;
7904
cca44b1b
JB
7905 return 1;
7906 }
b13c8ab2
YQ
7907 else
7908 {
7909 int nRc;
cca44b1b 7910
b13c8ab2
YQ
7911 /* All aggregate types that won't fit in a register must be returned
7912 in memory. */
7913 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
7914 return 1;
cca44b1b 7915
b13c8ab2
YQ
7916 /* In the ARM ABI, "integer" like aggregate types are returned in
7917 registers. For an aggregate type to be integer like, its size
7918 must be less than or equal to INT_REGISTER_SIZE and the
7919 offset of each addressable subfield must be zero. Note that bit
7920 fields are not addressable, and all addressable subfields of
7921 unions always start at offset zero.
cca44b1b 7922
b13c8ab2
YQ
7923 This function is based on the behaviour of GCC 2.95.1.
7924 See: gcc/arm.c: arm_return_in_memory() for details.
cca44b1b 7925
b13c8ab2
YQ
7926 Note: All versions of GCC before GCC 2.95.2 do not set up the
7927 parameters correctly for a function returning the following
7928 structure: struct { float f;}; This should be returned in memory,
7929 not a register. Richard Earnshaw sent me a patch, but I do not
7930 know of any way to detect if a function like the above has been
7931 compiled with the correct calling convention. */
7932
7933 /* Assume all other aggregate types can be returned in a register.
7934 Run a check for structures, unions and arrays. */
7935 nRc = 0;
67255d04 7936
b13c8ab2
YQ
7937 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
7938 {
7939 int i;
7940 /* Need to check if this struct/union is "integer" like. For
7941 this to be true, its size must be less than or equal to
7942 INT_REGISTER_SIZE and the offset of each addressable
7943 subfield must be zero. Note that bit fields are not
7944 addressable, and unions always start at offset zero. If any
7945 of the subfields is a floating point type, the struct/union
7946 cannot be an integer type. */
7947
7948 /* For each field in the object, check:
7949 1) Is it FP? --> yes, nRc = 1;
7950 2) Is it addressable (bitpos != 0) and
7951 not packed (bitsize == 0)?
7952 --> yes, nRc = 1
7953 */
7954
7955 for (i = 0; i < TYPE_NFIELDS (type); i++)
67255d04 7956 {
b13c8ab2
YQ
7957 enum type_code field_type_code;
7958
7959 field_type_code
7960 = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
7961 i)));
7962
7963 /* Is it a floating point type field? */
7964 if (field_type_code == TYPE_CODE_FLT)
67255d04
RE
7965 {
7966 nRc = 1;
7967 break;
7968 }
b13c8ab2
YQ
7969
7970 /* If bitpos != 0, then we have to care about it. */
7971 if (TYPE_FIELD_BITPOS (type, i) != 0)
7972 {
7973 /* Bitfields are not addressable. If the field bitsize is
7974 zero, then the field is not packed. Hence it cannot be
7975 a bitfield or any other packed type. */
7976 if (TYPE_FIELD_BITSIZE (type, i) == 0)
7977 {
7978 nRc = 1;
7979 break;
7980 }
7981 }
67255d04
RE
7982 }
7983 }
67255d04 7984
b13c8ab2
YQ
7985 return nRc;
7986 }
67255d04
RE
7987}
7988
34e8f22d
RE
7989/* Write into appropriate registers a function return value of type
7990 TYPE, given in virtual format. */
7991
7992static void
b508a996 7993arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 7994 const gdb_byte *valbuf)
34e8f22d 7995{
be8626e0 7996 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 7997 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 7998
34e8f22d
RE
7999 if (TYPE_CODE (type) == TYPE_CODE_FLT)
8000 {
e362b510 8001 gdb_byte buf[MAX_REGISTER_SIZE];
34e8f22d 8002
be8626e0 8003 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
8004 {
8005 case ARM_FLOAT_FPA:
8006
be8626e0
MD
8007 convert_to_extended (floatformat_from_type (type), buf, valbuf,
8008 gdbarch_byte_order (gdbarch));
b508a996 8009 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
8010 break;
8011
fd50bc42 8012 case ARM_FLOAT_SOFT_FPA:
08216dd7 8013 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
8014 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8015 not using the VFP ABI code. */
8016 case ARM_FLOAT_VFP:
b508a996
RE
8017 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
8018 if (TYPE_LENGTH (type) > 4)
8019 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 8020 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
8021 break;
8022
8023 default:
9b20d036
MS
8024 internal_error (__FILE__, __LINE__,
8025 _("arm_store_return_value: Floating "
8026 "point model not supported"));
08216dd7
RE
8027 break;
8028 }
34e8f22d 8029 }
b508a996
RE
8030 else if (TYPE_CODE (type) == TYPE_CODE_INT
8031 || TYPE_CODE (type) == TYPE_CODE_CHAR
8032 || TYPE_CODE (type) == TYPE_CODE_BOOL
8033 || TYPE_CODE (type) == TYPE_CODE_PTR
8034 || TYPE_CODE (type) == TYPE_CODE_REF
8035 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8036 {
8037 if (TYPE_LENGTH (type) <= 4)
8038 {
8039 /* Values of one word or less are zero/sign-extended and
8040 returned in r0. */
7a5ea0d4 8041 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8042 LONGEST val = unpack_long (type, valbuf);
8043
e17a4113 8044 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
8045 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8046 }
8047 else
8048 {
8049 /* Integral values greater than one word are stored in consecutive
8050 registers starting with r0. This will always be a multiple of
8051 the regiser size. */
8052 int len = TYPE_LENGTH (type);
8053 int regno = ARM_A1_REGNUM;
8054
8055 while (len > 0)
8056 {
8057 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
8058 len -= INT_REGISTER_SIZE;
8059 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8060 }
8061 }
8062 }
34e8f22d 8063 else
b508a996
RE
8064 {
8065 /* For a structure or union the behaviour is as if the value had
8066 been stored to word-aligned memory and then loaded into
8067 registers with 32-bit load instruction(s). */
8068 int len = TYPE_LENGTH (type);
8069 int regno = ARM_A1_REGNUM;
7a5ea0d4 8070 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8071
8072 while (len > 0)
8073 {
8074 memcpy (tmpbuf, valbuf,
7a5ea0d4 8075 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 8076 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
8077 len -= INT_REGISTER_SIZE;
8078 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8079 }
8080 }
34e8f22d
RE
8081}
8082
2af48f68
PB
8083
8084/* Handle function return values. */
8085
8086static enum return_value_convention
6a3a010b 8087arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
8088 struct type *valtype, struct regcache *regcache,
8089 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 8090{
7c00367c 8091 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 8092 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
8093 enum arm_vfp_cprc_base_type vfp_base_type;
8094 int vfp_base_count;
8095
8096 if (arm_vfp_abi_for_function (gdbarch, func_type)
8097 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
8098 {
8099 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
8100 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
8101 int i;
8102 for (i = 0; i < vfp_base_count; i++)
8103 {
58d6951d
DJ
8104 if (reg_char == 'q')
8105 {
8106 if (writebuf)
8107 arm_neon_quad_write (gdbarch, regcache, i,
8108 writebuf + i * unit_length);
8109
8110 if (readbuf)
8111 arm_neon_quad_read (gdbarch, regcache, i,
8112 readbuf + i * unit_length);
8113 }
8114 else
8115 {
8116 char name_buf[4];
8117 int regnum;
8118
8c042590 8119 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
58d6951d
DJ
8120 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8121 strlen (name_buf));
8122 if (writebuf)
8123 regcache_cooked_write (regcache, regnum,
8124 writebuf + i * unit_length);
8125 if (readbuf)
8126 regcache_cooked_read (regcache, regnum,
8127 readbuf + i * unit_length);
8128 }
90445bd3
DJ
8129 }
8130 return RETURN_VALUE_REGISTER_CONVENTION;
8131 }
7c00367c 8132
2af48f68
PB
8133 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
8134 || TYPE_CODE (valtype) == TYPE_CODE_UNION
8135 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
8136 {
7c00367c
MK
8137 if (tdep->struct_return == pcc_struct_return
8138 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
8139 return RETURN_VALUE_STRUCT_CONVENTION;
8140 }
b13c8ab2
YQ
8141 else if (TYPE_CODE (valtype) == TYPE_CODE_COMPLEX)
8142 {
8143 if (arm_return_in_memory (gdbarch, valtype))
8144 return RETURN_VALUE_STRUCT_CONVENTION;
8145 }
7052e42c 8146
2af48f68
PB
8147 if (writebuf)
8148 arm_store_return_value (valtype, regcache, writebuf);
8149
8150 if (readbuf)
8151 arm_extract_return_value (valtype, regcache, readbuf);
8152
8153 return RETURN_VALUE_REGISTER_CONVENTION;
8154}
8155
8156
9df628e0 8157static int
60ade65d 8158arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 8159{
e17a4113
UW
8160 struct gdbarch *gdbarch = get_frame_arch (frame);
8161 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8162 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 8163 CORE_ADDR jb_addr;
e362b510 8164 gdb_byte buf[INT_REGISTER_SIZE];
9df628e0 8165
60ade65d 8166 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
8167
8168 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 8169 INT_REGISTER_SIZE))
9df628e0
RE
8170 return 0;
8171
e17a4113 8172 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
8173 return 1;
8174}
8175
faa95490
DJ
8176/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
8177 return the target PC. Otherwise return 0. */
c906108c
SS
8178
8179CORE_ADDR
52f729a7 8180arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 8181{
2c02bd72 8182 const char *name;
faa95490 8183 int namelen;
c906108c
SS
8184 CORE_ADDR start_addr;
8185
8186 /* Find the starting address and name of the function containing the PC. */
8187 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
80d8d390
YQ
8188 {
8189 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
8190 check here. */
8191 start_addr = arm_skip_bx_reg (frame, pc);
8192 if (start_addr != 0)
8193 return start_addr;
8194
8195 return 0;
8196 }
c906108c 8197
faa95490
DJ
8198 /* If PC is in a Thumb call or return stub, return the address of the
8199 target PC, which is in a register. The thunk functions are called
8200 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
8201 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
8202 functions, named __ARM_call_via_r[0-7]. */
61012eef
GB
8203 if (startswith (name, "_call_via_")
8204 || startswith (name, "__ARM_call_via_"))
c906108c 8205 {
ed9a39eb
JM
8206 /* Use the name suffix to determine which register contains the
8207 target PC. */
c5aa993b
JM
8208 static char *table[15] =
8209 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8210 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
8211 };
c906108c 8212 int regno;
faa95490 8213 int offset = strlen (name) - 2;
c906108c
SS
8214
8215 for (regno = 0; regno <= 14; regno++)
faa95490 8216 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 8217 return get_frame_register_unsigned (frame, regno);
c906108c 8218 }
ed9a39eb 8219
faa95490
DJ
8220 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
8221 non-interworking calls to foo. We could decode the stubs
8222 to find the target but it's easier to use the symbol table. */
8223 namelen = strlen (name);
8224 if (name[0] == '_' && name[1] == '_'
8225 && ((namelen > 2 + strlen ("_from_thumb")
61012eef 8226 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
faa95490 8227 || (namelen > 2 + strlen ("_from_arm")
61012eef 8228 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
faa95490
DJ
8229 {
8230 char *target_name;
8231 int target_len = namelen - 2;
3b7344d5 8232 struct bound_minimal_symbol minsym;
faa95490
DJ
8233 struct objfile *objfile;
8234 struct obj_section *sec;
8235
8236 if (name[namelen - 1] == 'b')
8237 target_len -= strlen ("_from_thumb");
8238 else
8239 target_len -= strlen ("_from_arm");
8240
224c3ddb 8241 target_name = (char *) alloca (target_len + 1);
faa95490
DJ
8242 memcpy (target_name, name + 2, target_len);
8243 target_name[target_len] = '\0';
8244
8245 sec = find_pc_section (pc);
8246 objfile = (sec == NULL) ? NULL : sec->objfile;
8247 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
3b7344d5 8248 if (minsym.minsym != NULL)
77e371c0 8249 return BMSYMBOL_VALUE_ADDRESS (minsym);
faa95490
DJ
8250 else
8251 return 0;
8252 }
8253
c5aa993b 8254 return 0; /* not a stub */
c906108c
SS
8255}
8256
afd7eef0
RE
8257static void
8258set_arm_command (char *args, int from_tty)
8259{
edefbb7c
AC
8260 printf_unfiltered (_("\
8261\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
8262 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
8263}
8264
8265static void
8266show_arm_command (char *args, int from_tty)
8267{
26304000 8268 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
8269}
8270
28e97307
DJ
8271static void
8272arm_update_current_architecture (void)
fd50bc42 8273{
28e97307 8274 struct gdbarch_info info;
fd50bc42 8275
28e97307 8276 /* If the current architecture is not ARM, we have nothing to do. */
f5656ead 8277 if (gdbarch_bfd_arch_info (target_gdbarch ())->arch != bfd_arch_arm)
28e97307 8278 return;
fd50bc42 8279
28e97307
DJ
8280 /* Update the architecture. */
8281 gdbarch_info_init (&info);
fd50bc42 8282
28e97307 8283 if (!gdbarch_update_p (info))
9b20d036 8284 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
8285}
8286
8287static void
8288set_fp_model_sfunc (char *args, int from_tty,
8289 struct cmd_list_element *c)
8290{
570dc176 8291 int fp_model;
fd50bc42
RE
8292
8293 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
8294 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
8295 {
aead7601 8296 arm_fp_model = (enum arm_float_model) fp_model;
fd50bc42
RE
8297 break;
8298 }
8299
8300 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 8301 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
8302 current_fp_model);
8303
28e97307 8304 arm_update_current_architecture ();
fd50bc42
RE
8305}
8306
8307static void
08546159
AC
8308show_fp_model (struct ui_file *file, int from_tty,
8309 struct cmd_list_element *c, const char *value)
fd50bc42 8310{
f5656ead 8311 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
fd50bc42 8312
28e97307 8313 if (arm_fp_model == ARM_FLOAT_AUTO
f5656ead 8314 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8315 fprintf_filtered (file, _("\
8316The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
8317 fp_model_strings[tdep->fp_model]);
8318 else
8319 fprintf_filtered (file, _("\
8320The current ARM floating point model is \"%s\".\n"),
8321 fp_model_strings[arm_fp_model]);
8322}
8323
8324static void
8325arm_set_abi (char *args, int from_tty,
8326 struct cmd_list_element *c)
8327{
570dc176 8328 int arm_abi;
28e97307
DJ
8329
8330 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
8331 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
8332 {
aead7601 8333 arm_abi_global = (enum arm_abi_kind) arm_abi;
28e97307
DJ
8334 break;
8335 }
8336
8337 if (arm_abi == ARM_ABI_LAST)
8338 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
8339 arm_abi_string);
8340
8341 arm_update_current_architecture ();
8342}
8343
8344static void
8345arm_show_abi (struct ui_file *file, int from_tty,
8346 struct cmd_list_element *c, const char *value)
8347{
f5656ead 8348 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
28e97307
DJ
8349
8350 if (arm_abi_global == ARM_ABI_AUTO
f5656ead 8351 && gdbarch_bfd_arch_info (target_gdbarch ())->arch == bfd_arch_arm)
28e97307
DJ
8352 fprintf_filtered (file, _("\
8353The current ARM ABI is \"auto\" (currently \"%s\").\n"),
8354 arm_abi_strings[tdep->arm_abi]);
8355 else
8356 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
8357 arm_abi_string);
fd50bc42
RE
8358}
8359
0428b8f5
DJ
8360static void
8361arm_show_fallback_mode (struct ui_file *file, int from_tty,
8362 struct cmd_list_element *c, const char *value)
8363{
0963b4bd
MS
8364 fprintf_filtered (file,
8365 _("The current execution mode assumed "
8366 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
8367 arm_fallback_mode_string);
8368}
8369
8370static void
8371arm_show_force_mode (struct ui_file *file, int from_tty,
8372 struct cmd_list_element *c, const char *value)
8373{
f5656ead 8374 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch ());
0428b8f5 8375
0963b4bd
MS
8376 fprintf_filtered (file,
8377 _("The current execution mode assumed "
8378 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
8379 arm_force_mode_string);
8380}
8381
afd7eef0
RE
8382/* If the user changes the register disassembly style used for info
8383 register and other commands, we have to also switch the style used
8384 in opcodes for disassembly output. This function is run in the "set
8385 arm disassembly" command, and does that. */
bc90b915
FN
8386
8387static void
afd7eef0 8388set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
8389 struct cmd_list_element *c)
8390{
afd7eef0 8391 set_disassembly_style ();
bc90b915
FN
8392}
8393\f
966fbf70 8394/* Return the ARM register name corresponding to register I. */
a208b0cb 8395static const char *
d93859e2 8396arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 8397{
58d6951d
DJ
8398 const int num_regs = gdbarch_num_regs (gdbarch);
8399
8400 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
8401 && i >= num_regs && i < num_regs + 32)
8402 {
8403 static const char *const vfp_pseudo_names[] = {
8404 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
8405 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
8406 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
8407 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
8408 };
8409
8410 return vfp_pseudo_names[i - num_regs];
8411 }
8412
8413 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
8414 && i >= num_regs + 32 && i < num_regs + 32 + 16)
8415 {
8416 static const char *const neon_pseudo_names[] = {
8417 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
8418 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
8419 };
8420
8421 return neon_pseudo_names[i - num_regs - 32];
8422 }
8423
ff6f572f
DJ
8424 if (i >= ARRAY_SIZE (arm_register_names))
8425 /* These registers are only supported on targets which supply
8426 an XML description. */
8427 return "";
8428
966fbf70
RE
8429 return arm_register_names[i];
8430}
8431
bc90b915 8432static void
afd7eef0 8433set_disassembly_style (void)
bc90b915 8434{
123dc839 8435 int current;
bc90b915 8436
123dc839
DJ
8437 /* Find the style that the user wants. */
8438 for (current = 0; current < num_disassembly_options; current++)
8439 if (disassembly_style == valid_disassembly_styles[current])
8440 break;
8441 gdb_assert (current < num_disassembly_options);
bc90b915 8442
94c30b78 8443 /* Synchronize the disassembler. */
bc90b915
FN
8444 set_arm_regname_option (current);
8445}
8446
082fc60d
RE
8447/* Test whether the coff symbol specific value corresponds to a Thumb
8448 function. */
8449
8450static int
8451coff_sym_is_thumb (int val)
8452{
f8bf5763
PM
8453 return (val == C_THUMBEXT
8454 || val == C_THUMBSTAT
8455 || val == C_THUMBEXTFUNC
8456 || val == C_THUMBSTATFUNC
8457 || val == C_THUMBLABEL);
082fc60d
RE
8458}
8459
8460/* arm_coff_make_msymbol_special()
8461 arm_elf_make_msymbol_special()
8462
8463 These functions test whether the COFF or ELF symbol corresponds to
8464 an address in thumb code, and set a "special" bit in a minimal
8465 symbol to indicate that it does. */
8466
34e8f22d 8467static void
082fc60d
RE
8468arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
8469{
467d42c4
UW
8470 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
8471 == ST_BRANCH_TO_THUMB)
082fc60d
RE
8472 MSYMBOL_SET_SPECIAL (msym);
8473}
8474
34e8f22d 8475static void
082fc60d
RE
8476arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
8477{
8478 if (coff_sym_is_thumb (val))
8479 MSYMBOL_SET_SPECIAL (msym);
8480}
8481
60c5725c 8482static void
c1bd65d0 8483arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c 8484{
9a3c8263 8485 struct arm_per_objfile *data = (struct arm_per_objfile *) arg;
60c5725c
DJ
8486 unsigned int i;
8487
8488 for (i = 0; i < objfile->obfd->section_count; i++)
8489 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
8490}
8491
8492static void
8493arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
8494 asymbol *sym)
8495{
8496 const char *name = bfd_asymbol_name (sym);
8497 struct arm_per_objfile *data;
8498 VEC(arm_mapping_symbol_s) **map_p;
8499 struct arm_mapping_symbol new_map_sym;
8500
8501 gdb_assert (name[0] == '$');
8502 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
8503 return;
8504
9a3c8263
SM
8505 data = (struct arm_per_objfile *) objfile_data (objfile,
8506 arm_objfile_data_key);
60c5725c
DJ
8507 if (data == NULL)
8508 {
8509 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
8510 struct arm_per_objfile);
8511 set_objfile_data (objfile, arm_objfile_data_key, data);
8512 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
8513 objfile->obfd->section_count,
8514 VEC(arm_mapping_symbol_s) *);
8515 }
8516 map_p = &data->section_maps[bfd_get_section (sym)->index];
8517
8518 new_map_sym.value = sym->value;
8519 new_map_sym.type = name[1];
8520
8521 /* Assume that most mapping symbols appear in order of increasing
8522 value. If they were randomly distributed, it would be faster to
8523 always push here and then sort at first use. */
8524 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
8525 {
8526 struct arm_mapping_symbol *prev_map_sym;
8527
8528 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
8529 if (prev_map_sym->value >= sym->value)
8530 {
8531 unsigned int idx;
8532 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
8533 arm_compare_mapping_symbols);
8534 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
8535 return;
8536 }
8537 }
8538
8539 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
8540}
8541
756fe439 8542static void
61a1198a 8543arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 8544{
9779414d 8545 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 8546 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
8547
8548 /* If necessary, set the T bit. */
8549 if (arm_apcs_32)
8550 {
9779414d 8551 ULONGEST val, t_bit;
61a1198a 8552 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
8553 t_bit = arm_psr_thumb_bit (gdbarch);
8554 if (arm_pc_is_thumb (gdbarch, pc))
8555 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
8556 val | t_bit);
756fe439 8557 else
61a1198a 8558 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 8559 val & ~t_bit);
756fe439
DJ
8560 }
8561}
123dc839 8562
58d6951d
DJ
8563/* Read the contents of a NEON quad register, by reading from two
8564 double registers. This is used to implement the quad pseudo
8565 registers, and for argument passing in case the quad registers are
8566 missing; vectors are passed in quad registers when using the VFP
8567 ABI, even if a NEON unit is not present. REGNUM is the index of
8568 the quad register, in [0, 15]. */
8569
05d1431c 8570static enum register_status
58d6951d
DJ
8571arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
8572 int regnum, gdb_byte *buf)
8573{
8574 char name_buf[4];
8575 gdb_byte reg_buf[8];
8576 int offset, double_regnum;
05d1431c 8577 enum register_status status;
58d6951d 8578
8c042590 8579 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8580 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8581 strlen (name_buf));
8582
8583 /* d0 is always the least significant half of q0. */
8584 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8585 offset = 8;
8586 else
8587 offset = 0;
8588
05d1431c
PA
8589 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8590 if (status != REG_VALID)
8591 return status;
58d6951d
DJ
8592 memcpy (buf + offset, reg_buf, 8);
8593
8594 offset = 8 - offset;
05d1431c
PA
8595 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
8596 if (status != REG_VALID)
8597 return status;
58d6951d 8598 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
8599
8600 return REG_VALID;
58d6951d
DJ
8601}
8602
05d1431c 8603static enum register_status
58d6951d
DJ
8604arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
8605 int regnum, gdb_byte *buf)
8606{
8607 const int num_regs = gdbarch_num_regs (gdbarch);
8608 char name_buf[4];
8609 gdb_byte reg_buf[8];
8610 int offset, double_regnum;
8611
8612 gdb_assert (regnum >= num_regs);
8613 regnum -= num_regs;
8614
8615 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8616 /* Quad-precision register. */
05d1431c 8617 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
8618 else
8619 {
05d1431c
PA
8620 enum register_status status;
8621
58d6951d
DJ
8622 /* Single-precision register. */
8623 gdb_assert (regnum < 32);
8624
8625 /* s0 is always the least significant half of d0. */
8626 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8627 offset = (regnum & 1) ? 0 : 4;
8628 else
8629 offset = (regnum & 1) ? 4 : 0;
8630
8c042590 8631 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8632 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8633 strlen (name_buf));
8634
05d1431c
PA
8635 status = regcache_raw_read (regcache, double_regnum, reg_buf);
8636 if (status == REG_VALID)
8637 memcpy (buf, reg_buf + offset, 4);
8638 return status;
58d6951d
DJ
8639 }
8640}
8641
8642/* Store the contents of BUF to a NEON quad register, by writing to
8643 two double registers. This is used to implement the quad pseudo
8644 registers, and for argument passing in case the quad registers are
8645 missing; vectors are passed in quad registers when using the VFP
8646 ABI, even if a NEON unit is not present. REGNUM is the index
8647 of the quad register, in [0, 15]. */
8648
8649static void
8650arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
8651 int regnum, const gdb_byte *buf)
8652{
8653 char name_buf[4];
58d6951d
DJ
8654 int offset, double_regnum;
8655
8c042590 8656 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
58d6951d
DJ
8657 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8658 strlen (name_buf));
8659
8660 /* d0 is always the least significant half of q0. */
8661 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8662 offset = 8;
8663 else
8664 offset = 0;
8665
8666 regcache_raw_write (regcache, double_regnum, buf + offset);
8667 offset = 8 - offset;
8668 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
8669}
8670
8671static void
8672arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
8673 int regnum, const gdb_byte *buf)
8674{
8675 const int num_regs = gdbarch_num_regs (gdbarch);
8676 char name_buf[4];
8677 gdb_byte reg_buf[8];
8678 int offset, double_regnum;
8679
8680 gdb_assert (regnum >= num_regs);
8681 regnum -= num_regs;
8682
8683 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
8684 /* Quad-precision register. */
8685 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
8686 else
8687 {
8688 /* Single-precision register. */
8689 gdb_assert (regnum < 32);
8690
8691 /* s0 is always the least significant half of d0. */
8692 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
8693 offset = (regnum & 1) ? 0 : 4;
8694 else
8695 offset = (regnum & 1) ? 4 : 0;
8696
8c042590 8697 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum >> 1);
58d6951d
DJ
8698 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
8699 strlen (name_buf));
8700
8701 regcache_raw_read (regcache, double_regnum, reg_buf);
8702 memcpy (reg_buf + offset, buf, 4);
8703 regcache_raw_write (regcache, double_regnum, reg_buf);
8704 }
8705}
8706
123dc839
DJ
8707static struct value *
8708value_of_arm_user_reg (struct frame_info *frame, const void *baton)
8709{
9a3c8263 8710 const int *reg_p = (const int *) baton;
123dc839
DJ
8711 return value_of_register (*reg_p, frame);
8712}
97e03143 8713\f
70f80edf
JT
8714static enum gdb_osabi
8715arm_elf_osabi_sniffer (bfd *abfd)
97e03143 8716{
2af48f68 8717 unsigned int elfosabi;
70f80edf 8718 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 8719
70f80edf 8720 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 8721
28e97307
DJ
8722 if (elfosabi == ELFOSABI_ARM)
8723 /* GNU tools use this value. Check note sections in this case,
8724 as well. */
8725 bfd_map_over_sections (abfd,
8726 generic_elf_osabi_sniff_abi_tag_sections,
8727 &osabi);
97e03143 8728
28e97307 8729 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 8730 return osabi;
97e03143
RE
8731}
8732
54483882
YQ
8733static int
8734arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
8735 struct reggroup *group)
8736{
2c291032
YQ
8737 /* FPS register's type is INT, but belongs to float_reggroup. Beside
8738 this, FPS register belongs to save_regroup, restore_reggroup, and
8739 all_reggroup, of course. */
54483882 8740 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
8741 return (group == float_reggroup
8742 || group == save_reggroup
8743 || group == restore_reggroup
8744 || group == all_reggroup);
54483882
YQ
8745 else
8746 return default_register_reggroup_p (gdbarch, regnum, group);
8747}
8748
25f8c692
JL
8749\f
8750/* For backward-compatibility we allow two 'g' packet lengths with
8751 the remote protocol depending on whether FPA registers are
8752 supplied. M-profile targets do not have FPA registers, but some
8753 stubs already exist in the wild which use a 'g' packet which
8754 supplies them albeit with dummy values. The packet format which
8755 includes FPA registers should be considered deprecated for
8756 M-profile targets. */
8757
8758static void
8759arm_register_g_packet_guesses (struct gdbarch *gdbarch)
8760{
8761 if (gdbarch_tdep (gdbarch)->is_m)
8762 {
8763 /* If we know from the executable this is an M-profile target,
8764 cater for remote targets whose register set layout is the
8765 same as the FPA layout. */
8766 register_remote_g_packet_guess (gdbarch,
03145bf4 8767 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
8768 (16 * INT_REGISTER_SIZE)
8769 + (8 * FP_REGISTER_SIZE)
8770 + (2 * INT_REGISTER_SIZE),
8771 tdesc_arm_with_m_fpa_layout);
8772
8773 /* The regular M-profile layout. */
8774 register_remote_g_packet_guess (gdbarch,
8775 /* r0-r12,sp,lr,pc; xpsr */
8776 (16 * INT_REGISTER_SIZE)
8777 + INT_REGISTER_SIZE,
8778 tdesc_arm_with_m);
3184d3f9
JL
8779
8780 /* M-profile plus M4F VFP. */
8781 register_remote_g_packet_guess (gdbarch,
8782 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
8783 (16 * INT_REGISTER_SIZE)
8784 + (16 * VFP_REGISTER_SIZE)
8785 + (2 * INT_REGISTER_SIZE),
8786 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
8787 }
8788
8789 /* Otherwise we don't have a useful guess. */
8790}
8791
70f80edf 8792\f
da3c6d4a
MS
8793/* Initialize the current architecture based on INFO. If possible,
8794 re-use an architecture from ARCHES, which is a list of
8795 architectures already created during this debugging session.
97e03143 8796
da3c6d4a
MS
8797 Called e.g. at program startup, when reading a core file, and when
8798 reading a binary file. */
97e03143 8799
39bbf761
RE
8800static struct gdbarch *
8801arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
8802{
97e03143 8803 struct gdbarch_tdep *tdep;
39bbf761 8804 struct gdbarch *gdbarch;
28e97307
DJ
8805 struct gdbarch_list *best_arch;
8806 enum arm_abi_kind arm_abi = arm_abi_global;
8807 enum arm_float_model fp_model = arm_fp_model;
123dc839 8808 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 8809 int i, is_m = 0;
330c6ca9 8810 int vfp_register_count = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
a56cc1ce 8811 int have_wmmx_registers = 0;
58d6951d 8812 int have_neon = 0;
ff6f572f 8813 int have_fpa_registers = 1;
9779414d
DJ
8814 const struct target_desc *tdesc = info.target_desc;
8815
8816 /* If we have an object to base this architecture on, try to determine
8817 its ABI. */
8818
8819 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
8820 {
8821 int ei_osabi, e_flags;
8822
8823 switch (bfd_get_flavour (info.abfd))
8824 {
8825 case bfd_target_aout_flavour:
8826 /* Assume it's an old APCS-style ABI. */
8827 arm_abi = ARM_ABI_APCS;
8828 break;
8829
8830 case bfd_target_coff_flavour:
8831 /* Assume it's an old APCS-style ABI. */
8832 /* XXX WinCE? */
8833 arm_abi = ARM_ABI_APCS;
8834 break;
8835
8836 case bfd_target_elf_flavour:
8837 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
8838 e_flags = elf_elfheader (info.abfd)->e_flags;
8839
8840 if (ei_osabi == ELFOSABI_ARM)
8841 {
8842 /* GNU tools used to use this value, but do not for EABI
8843 objects. There's nowhere to tag an EABI version
8844 anyway, so assume APCS. */
8845 arm_abi = ARM_ABI_APCS;
8846 }
d403db27 8847 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
9779414d
DJ
8848 {
8849 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
8850 int attr_arch, attr_profile;
8851
8852 switch (eabi_ver)
8853 {
8854 case EF_ARM_EABI_UNKNOWN:
8855 /* Assume GNU tools. */
8856 arm_abi = ARM_ABI_APCS;
8857 break;
8858
8859 case EF_ARM_EABI_VER4:
8860 case EF_ARM_EABI_VER5:
8861 arm_abi = ARM_ABI_AAPCS;
8862 /* EABI binaries default to VFP float ordering.
8863 They may also contain build attributes that can
8864 be used to identify if the VFP argument-passing
8865 ABI is in use. */
8866 if (fp_model == ARM_FLOAT_AUTO)
8867 {
8868#ifdef HAVE_ELF
8869 switch (bfd_elf_get_obj_attr_int (info.abfd,
8870 OBJ_ATTR_PROC,
8871 Tag_ABI_VFP_args))
8872 {
b35b0298 8873 case AEABI_VFP_args_base:
9779414d
DJ
8874 /* "The user intended FP parameter/result
8875 passing to conform to AAPCS, base
8876 variant". */
8877 fp_model = ARM_FLOAT_SOFT_VFP;
8878 break;
b35b0298 8879 case AEABI_VFP_args_vfp:
9779414d
DJ
8880 /* "The user intended FP parameter/result
8881 passing to conform to AAPCS, VFP
8882 variant". */
8883 fp_model = ARM_FLOAT_VFP;
8884 break;
b35b0298 8885 case AEABI_VFP_args_toolchain:
9779414d
DJ
8886 /* "The user intended FP parameter/result
8887 passing to conform to tool chain-specific
8888 conventions" - we don't know any such
8889 conventions, so leave it as "auto". */
8890 break;
b35b0298 8891 case AEABI_VFP_args_compatible:
5c294fee
TG
8892 /* "Code is compatible with both the base
8893 and VFP variants; the user did not permit
8894 non-variadic functions to pass FP
8895 parameters/results" - leave it as
8896 "auto". */
8897 break;
9779414d
DJ
8898 default:
8899 /* Attribute value not mentioned in the
5c294fee 8900 November 2012 ABI, so leave it as
9779414d
DJ
8901 "auto". */
8902 break;
8903 }
8904#else
8905 fp_model = ARM_FLOAT_SOFT_VFP;
8906#endif
8907 }
8908 break;
8909
8910 default:
8911 /* Leave it as "auto". */
8912 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
8913 break;
8914 }
8915
8916#ifdef HAVE_ELF
8917 /* Detect M-profile programs. This only works if the
8918 executable file includes build attributes; GCC does
8919 copy them to the executable, but e.g. RealView does
8920 not. */
8921 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
8922 Tag_CPU_arch);
0963b4bd
MS
8923 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
8924 OBJ_ATTR_PROC,
9779414d
DJ
8925 Tag_CPU_arch_profile);
8926 /* GCC specifies the profile for v6-M; RealView only
8927 specifies the profile for architectures starting with
8928 V7 (as opposed to architectures with a tag
8929 numerically greater than TAG_CPU_ARCH_V7). */
8930 if (!tdesc_has_registers (tdesc)
8931 && (attr_arch == TAG_CPU_ARCH_V6_M
8932 || attr_arch == TAG_CPU_ARCH_V6S_M
8933 || attr_profile == 'M'))
25f8c692 8934 is_m = 1;
9779414d
DJ
8935#endif
8936 }
8937
8938 if (fp_model == ARM_FLOAT_AUTO)
8939 {
8940 int e_flags = elf_elfheader (info.abfd)->e_flags;
8941
8942 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
8943 {
8944 case 0:
8945 /* Leave it as "auto". Strictly speaking this case
8946 means FPA, but almost nobody uses that now, and
8947 many toolchains fail to set the appropriate bits
8948 for the floating-point model they use. */
8949 break;
8950 case EF_ARM_SOFT_FLOAT:
8951 fp_model = ARM_FLOAT_SOFT_FPA;
8952 break;
8953 case EF_ARM_VFP_FLOAT:
8954 fp_model = ARM_FLOAT_VFP;
8955 break;
8956 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
8957 fp_model = ARM_FLOAT_SOFT_VFP;
8958 break;
8959 }
8960 }
8961
8962 if (e_flags & EF_ARM_BE8)
8963 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
8964
8965 break;
8966
8967 default:
8968 /* Leave it as "auto". */
8969 break;
8970 }
8971 }
123dc839
DJ
8972
8973 /* Check any target description for validity. */
9779414d 8974 if (tdesc_has_registers (tdesc))
123dc839
DJ
8975 {
8976 /* For most registers we require GDB's default names; but also allow
8977 the numeric names for sp / lr / pc, as a convenience. */
8978 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
8979 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
8980 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
8981
8982 const struct tdesc_feature *feature;
58d6951d 8983 int valid_p;
123dc839 8984
9779414d 8985 feature = tdesc_find_feature (tdesc,
123dc839
DJ
8986 "org.gnu.gdb.arm.core");
8987 if (feature == NULL)
9779414d
DJ
8988 {
8989 feature = tdesc_find_feature (tdesc,
8990 "org.gnu.gdb.arm.m-profile");
8991 if (feature == NULL)
8992 return NULL;
8993 else
8994 is_m = 1;
8995 }
123dc839
DJ
8996
8997 tdesc_data = tdesc_data_alloc ();
8998
8999 valid_p = 1;
9000 for (i = 0; i < ARM_SP_REGNUM; i++)
9001 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9002 arm_register_names[i]);
9003 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9004 ARM_SP_REGNUM,
9005 arm_sp_names);
9006 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9007 ARM_LR_REGNUM,
9008 arm_lr_names);
9009 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9010 ARM_PC_REGNUM,
9011 arm_pc_names);
9779414d
DJ
9012 if (is_m)
9013 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9014 ARM_PS_REGNUM, "xpsr");
9015 else
9016 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9017 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
9018
9019 if (!valid_p)
9020 {
9021 tdesc_data_cleanup (tdesc_data);
9022 return NULL;
9023 }
9024
9779414d 9025 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9026 "org.gnu.gdb.arm.fpa");
9027 if (feature != NULL)
9028 {
9029 valid_p = 1;
9030 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9031 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9032 arm_register_names[i]);
9033 if (!valid_p)
9034 {
9035 tdesc_data_cleanup (tdesc_data);
9036 return NULL;
9037 }
9038 }
ff6f572f
DJ
9039 else
9040 have_fpa_registers = 0;
9041
9779414d 9042 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9043 "org.gnu.gdb.xscale.iwmmxt");
9044 if (feature != NULL)
9045 {
9046 static const char *const iwmmxt_names[] = {
9047 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9048 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9049 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9050 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9051 };
9052
9053 valid_p = 1;
9054 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9055 valid_p
9056 &= tdesc_numbered_register (feature, tdesc_data, i,
9057 iwmmxt_names[i - ARM_WR0_REGNUM]);
9058
9059 /* Check for the control registers, but do not fail if they
9060 are missing. */
9061 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9062 tdesc_numbered_register (feature, tdesc_data, i,
9063 iwmmxt_names[i - ARM_WR0_REGNUM]);
9064
9065 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9066 valid_p
9067 &= tdesc_numbered_register (feature, tdesc_data, i,
9068 iwmmxt_names[i - ARM_WR0_REGNUM]);
9069
9070 if (!valid_p)
9071 {
9072 tdesc_data_cleanup (tdesc_data);
9073 return NULL;
9074 }
a56cc1ce
YQ
9075
9076 have_wmmx_registers = 1;
ff6f572f 9077 }
58d6951d
DJ
9078
9079 /* If we have a VFP unit, check whether the single precision registers
9080 are present. If not, then we will synthesize them as pseudo
9081 registers. */
9779414d 9082 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9083 "org.gnu.gdb.arm.vfp");
9084 if (feature != NULL)
9085 {
9086 static const char *const vfp_double_names[] = {
9087 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9088 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9089 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9090 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9091 };
9092
9093 /* Require the double precision registers. There must be either
9094 16 or 32. */
9095 valid_p = 1;
9096 for (i = 0; i < 32; i++)
9097 {
9098 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9099 ARM_D0_REGNUM + i,
9100 vfp_double_names[i]);
9101 if (!valid_p)
9102 break;
9103 }
2b9e5ea6
UW
9104 if (!valid_p && i == 16)
9105 valid_p = 1;
58d6951d 9106
2b9e5ea6
UW
9107 /* Also require FPSCR. */
9108 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9109 ARM_FPSCR_REGNUM, "fpscr");
9110 if (!valid_p)
58d6951d
DJ
9111 {
9112 tdesc_data_cleanup (tdesc_data);
9113 return NULL;
9114 }
9115
9116 if (tdesc_unnumbered_register (feature, "s0") == 0)
9117 have_vfp_pseudos = 1;
9118
330c6ca9 9119 vfp_register_count = i;
58d6951d
DJ
9120
9121 /* If we have VFP, also check for NEON. The architecture allows
9122 NEON without VFP (integer vector operations only), but GDB
9123 does not support that. */
9779414d 9124 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9125 "org.gnu.gdb.arm.neon");
9126 if (feature != NULL)
9127 {
9128 /* NEON requires 32 double-precision registers. */
9129 if (i != 32)
9130 {
9131 tdesc_data_cleanup (tdesc_data);
9132 return NULL;
9133 }
9134
9135 /* If there are quad registers defined by the stub, use
9136 their type; otherwise (normally) provide them with
9137 the default type. */
9138 if (tdesc_unnumbered_register (feature, "q0") == 0)
9139 have_neon_pseudos = 1;
9140
9141 have_neon = 1;
9142 }
9143 }
123dc839 9144 }
39bbf761 9145
28e97307
DJ
9146 /* If there is already a candidate, use it. */
9147 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
9148 best_arch != NULL;
9149 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
9150 {
b8926edc
DJ
9151 if (arm_abi != ARM_ABI_AUTO
9152 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
9153 continue;
9154
b8926edc
DJ
9155 if (fp_model != ARM_FLOAT_AUTO
9156 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
9157 continue;
9158
58d6951d
DJ
9159 /* There are various other properties in tdep that we do not
9160 need to check here: those derived from a target description,
9161 since gdbarches with a different target description are
9162 automatically disqualified. */
9163
9779414d
DJ
9164 /* Do check is_m, though, since it might come from the binary. */
9165 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
9166 continue;
9167
28e97307
DJ
9168 /* Found a match. */
9169 break;
9170 }
97e03143 9171
28e97307 9172 if (best_arch != NULL)
123dc839
DJ
9173 {
9174 if (tdesc_data != NULL)
9175 tdesc_data_cleanup (tdesc_data);
9176 return best_arch->gdbarch;
9177 }
28e97307 9178
8d749320 9179 tdep = XCNEW (struct gdbarch_tdep);
97e03143
RE
9180 gdbarch = gdbarch_alloc (&info, tdep);
9181
28e97307
DJ
9182 /* Record additional information about the architecture we are defining.
9183 These are gdbarch discriminators, like the OSABI. */
9184 tdep->arm_abi = arm_abi;
9185 tdep->fp_model = fp_model;
9779414d 9186 tdep->is_m = is_m;
ff6f572f 9187 tdep->have_fpa_registers = have_fpa_registers;
a56cc1ce 9188 tdep->have_wmmx_registers = have_wmmx_registers;
330c6ca9
YQ
9189 gdb_assert (vfp_register_count == 0
9190 || vfp_register_count == 16
9191 || vfp_register_count == 32);
9192 tdep->vfp_register_count = vfp_register_count;
58d6951d
DJ
9193 tdep->have_vfp_pseudos = have_vfp_pseudos;
9194 tdep->have_neon_pseudos = have_neon_pseudos;
9195 tdep->have_neon = have_neon;
08216dd7 9196
25f8c692
JL
9197 arm_register_g_packet_guesses (gdbarch);
9198
08216dd7 9199 /* Breakpoints. */
9d4fde75 9200 switch (info.byte_order_for_code)
67255d04
RE
9201 {
9202 case BFD_ENDIAN_BIG:
66e810cd
RE
9203 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
9204 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
9205 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
9206 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
9207
67255d04
RE
9208 break;
9209
9210 case BFD_ENDIAN_LITTLE:
66e810cd
RE
9211 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
9212 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
9213 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
9214 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
9215
67255d04
RE
9216 break;
9217
9218 default:
9219 internal_error (__FILE__, __LINE__,
edefbb7c 9220 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
9221 }
9222
d7b486e7
RE
9223 /* On ARM targets char defaults to unsigned. */
9224 set_gdbarch_char_signed (gdbarch, 0);
9225
cca44b1b
JB
9226 /* Note: for displaced stepping, this includes the breakpoint, and one word
9227 of additional scratch space. This setting isn't used for anything beside
9228 displaced stepping at present. */
9229 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
9230
9df628e0 9231 /* This should be low enough for everything. */
97e03143 9232 tdep->lowest_pc = 0x20;
94c30b78 9233 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 9234
7c00367c
MK
9235 /* The default, for both APCS and AAPCS, is to return small
9236 structures in registers. */
9237 tdep->struct_return = reg_struct_return;
9238
2dd604e7 9239 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 9240 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 9241
756fe439
DJ
9242 set_gdbarch_write_pc (gdbarch, arm_write_pc);
9243
148754e5 9244 /* Frame handling. */
a262aec2 9245 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
9246 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
9247 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
9248
eb5492fa 9249 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 9250
34e8f22d 9251 /* Address manipulation. */
34e8f22d
RE
9252 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
9253
34e8f22d
RE
9254 /* Advance PC across function entry code. */
9255 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
9256
c9cf6e20
MG
9257 /* Detect whether PC is at a point where the stack has been destroyed. */
9258 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
4024ca99 9259
190dce09
UW
9260 /* Skip trampolines. */
9261 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
9262
34e8f22d
RE
9263 /* The stack grows downward. */
9264 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9265
9266 /* Breakpoint manipulation. */
9267 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
9268 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
9269 arm_remote_breakpoint_from_pc);
34e8f22d
RE
9270
9271 /* Information about registers, etc. */
34e8f22d
RE
9272 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
9273 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 9274 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 9275 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 9276 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 9277
ff6f572f
DJ
9278 /* This "info float" is FPA-specific. Use the generic version if we
9279 do not have FPA. */
9280 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
9281 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
9282
26216b98 9283 /* Internal <-> external register number maps. */
ff6f572f 9284 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
9285 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
9286
34e8f22d
RE
9287 set_gdbarch_register_name (gdbarch, arm_register_name);
9288
9289 /* Returning results. */
2af48f68 9290 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 9291
03d48a7d
RE
9292 /* Disassembly. */
9293 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
9294
34e8f22d
RE
9295 /* Minsymbol frobbing. */
9296 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
9297 set_gdbarch_coff_make_msymbol_special (gdbarch,
9298 arm_coff_make_msymbol_special);
60c5725c 9299 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 9300
f9d67f43
DJ
9301 /* Thumb-2 IT block support. */
9302 set_gdbarch_adjust_breakpoint_address (gdbarch,
9303 arm_adjust_breakpoint_address);
9304
0d5de010
DJ
9305 /* Virtual tables. */
9306 set_gdbarch_vbit_in_delta (gdbarch, 1);
9307
97e03143 9308 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 9309 gdbarch_init_osabi (info, gdbarch);
97e03143 9310
b39cc962
DJ
9311 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
9312
eb5492fa 9313 /* Add some default predicates. */
2ae28aa9
YQ
9314 if (is_m)
9315 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
a262aec2
DJ
9316 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
9317 dwarf2_append_unwinders (gdbarch);
0e9e9abd 9318 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 9319 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 9320
97e03143
RE
9321 /* Now we have tuned the configuration, set a few final things,
9322 based on what the OS ABI has told us. */
9323
b8926edc
DJ
9324 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
9325 binaries are always marked. */
9326 if (tdep->arm_abi == ARM_ABI_AUTO)
9327 tdep->arm_abi = ARM_ABI_APCS;
9328
e3039479
UW
9329 /* Watchpoints are not steppable. */
9330 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
9331
b8926edc
DJ
9332 /* We used to default to FPA for generic ARM, but almost nobody
9333 uses that now, and we now provide a way for the user to force
9334 the model. So default to the most useful variant. */
9335 if (tdep->fp_model == ARM_FLOAT_AUTO)
9336 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
9337
9df628e0
RE
9338 if (tdep->jb_pc >= 0)
9339 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
9340
08216dd7 9341 /* Floating point sizes and format. */
8da61cc4 9342 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 9343 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 9344 {
8da61cc4
DJ
9345 set_gdbarch_double_format
9346 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9347 set_gdbarch_long_double_format
9348 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
9349 }
9350 else
9351 {
9352 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
9353 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
9354 }
9355
58d6951d
DJ
9356 if (have_vfp_pseudos)
9357 {
9358 /* NOTE: These are the only pseudo registers used by
9359 the ARM target at the moment. If more are added, a
9360 little more care in numbering will be needed. */
9361
9362 int num_pseudos = 32;
9363 if (have_neon_pseudos)
9364 num_pseudos += 16;
9365 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
9366 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
9367 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
9368 }
9369
123dc839 9370 if (tdesc_data)
58d6951d
DJ
9371 {
9372 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
9373
9779414d 9374 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
9375
9376 /* Override tdesc_register_type to adjust the types of VFP
9377 registers for NEON. */
9378 set_gdbarch_register_type (gdbarch, arm_register_type);
9379 }
123dc839
DJ
9380
9381 /* Add standard register aliases. We add aliases even for those
9382 nanes which are used by the current architecture - it's simpler,
9383 and does no harm, since nothing ever lists user registers. */
9384 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
9385 user_reg_add (gdbarch, arm_register_aliases[i].name,
9386 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
9387
39bbf761
RE
9388 return gdbarch;
9389}
9390
97e03143 9391static void
2af46ca0 9392arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 9393{
2af46ca0 9394 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
9395
9396 if (tdep == NULL)
9397 return;
9398
edefbb7c 9399 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
9400 (unsigned long) tdep->lowest_pc);
9401}
9402
a78f21af
AC
9403extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
9404
c906108c 9405void
ed9a39eb 9406_initialize_arm_tdep (void)
c906108c 9407{
bc90b915
FN
9408 struct ui_file *stb;
9409 long length;
26304000 9410 struct cmd_list_element *new_set, *new_show;
53904c9e
AC
9411 const char *setname;
9412 const char *setdesc;
4bd7b427 9413 const char *const *regnames;
bc90b915
FN
9414 int numregs, i, j;
9415 static char *helptext;
edefbb7c
AC
9416 char regdesc[1024], *rdptr = regdesc;
9417 size_t rest = sizeof (regdesc);
085dd6e6 9418
42cf1509 9419 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 9420
60c5725c 9421 arm_objfile_data_key
c1bd65d0 9422 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 9423
0e9e9abd
UW
9424 /* Add ourselves to objfile event chain. */
9425 observer_attach_new_objfile (arm_exidx_new_objfile);
9426 arm_exidx_data_key
9427 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
9428
70f80edf
JT
9429 /* Register an ELF OS ABI sniffer for ARM binaries. */
9430 gdbarch_register_osabi_sniffer (bfd_arch_arm,
9431 bfd_target_elf_flavour,
9432 arm_elf_osabi_sniffer);
9433
9779414d
DJ
9434 /* Initialize the standard target descriptions. */
9435 initialize_tdesc_arm_with_m ();
25f8c692 9436 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 9437 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
9438 initialize_tdesc_arm_with_iwmmxt ();
9439 initialize_tdesc_arm_with_vfpv2 ();
9440 initialize_tdesc_arm_with_vfpv3 ();
9441 initialize_tdesc_arm_with_neon ();
9779414d 9442
94c30b78 9443 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
9444 num_disassembly_options = get_arm_regname_num_options ();
9445
9446 /* Add root prefix command for all "set arm"/"show arm" commands. */
9447 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 9448 _("Various ARM-specific commands."),
afd7eef0
RE
9449 &setarmcmdlist, "set arm ", 0, &setlist);
9450
9451 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 9452 _("Various ARM-specific commands."),
afd7eef0 9453 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 9454
94c30b78 9455 /* Sync the opcode insn printer with our register viewer. */
bc90b915 9456 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 9457
eefe576e
AC
9458 /* Initialize the array that will be passed to
9459 add_setshow_enum_cmd(). */
8d749320
SM
9460 valid_disassembly_styles = XNEWVEC (const char *,
9461 num_disassembly_options + 1);
afd7eef0 9462 for (i = 0; i < num_disassembly_options; i++)
bc90b915
FN
9463 {
9464 numregs = get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 9465 valid_disassembly_styles[i] = setname;
edefbb7c
AC
9466 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
9467 rdptr += length;
9468 rest -= length;
123dc839
DJ
9469 /* When we find the default names, tell the disassembler to use
9470 them. */
bc90b915
FN
9471 if (!strcmp (setname, "std"))
9472 {
afd7eef0 9473 disassembly_style = setname;
bc90b915
FN
9474 set_arm_regname_option (i);
9475 }
9476 }
94c30b78 9477 /* Mark the end of valid options. */
afd7eef0 9478 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 9479
edefbb7c
AC
9480 /* Create the help text. */
9481 stb = mem_fileopen ();
9482 fprintf_unfiltered (stb, "%s%s%s",
9483 _("The valid values are:\n"),
9484 regdesc,
9485 _("The default is \"std\"."));
759ef836 9486 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 9487 ui_file_delete (stb);
ed9a39eb 9488
edefbb7c
AC
9489 add_setshow_enum_cmd("disassembler", no_class,
9490 valid_disassembly_styles, &disassembly_style,
9491 _("Set the disassembly style."),
9492 _("Show the disassembly style."),
9493 helptext,
2c5b56ce 9494 set_disassembly_style_sfunc,
0963b4bd
MS
9495 NULL, /* FIXME: i18n: The disassembly style is
9496 \"%s\". */
7376b4c2 9497 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
9498
9499 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
9500 _("Set usage of ARM 32-bit mode."),
9501 _("Show usage of ARM 32-bit mode."),
9502 _("When off, a 26-bit PC will be used."),
2c5b56ce 9503 NULL,
0963b4bd
MS
9504 NULL, /* FIXME: i18n: Usage of ARM 32-bit
9505 mode is %s. */
26304000 9506 &setarmcmdlist, &showarmcmdlist);
c906108c 9507
fd50bc42 9508 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
9509 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
9510 _("Set the floating point type."),
9511 _("Show the floating point type."),
9512 _("auto - Determine the FP typefrom the OS-ABI.\n\
9513softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
9514fpa - FPA co-processor (GCC compiled).\n\
9515softvfp - Software FP with pure-endian doubles.\n\
9516vfp - VFP co-processor."),
edefbb7c 9517 set_fp_model_sfunc, show_fp_model,
7376b4c2 9518 &setarmcmdlist, &showarmcmdlist);
fd50bc42 9519
28e97307
DJ
9520 /* Add a command to allow the user to force the ABI. */
9521 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
9522 _("Set the ABI."),
9523 _("Show the ABI."),
9524 NULL, arm_set_abi, arm_show_abi,
9525 &setarmcmdlist, &showarmcmdlist);
9526
0428b8f5
DJ
9527 /* Add two commands to allow the user to force the assumed
9528 execution mode. */
9529 add_setshow_enum_cmd ("fallback-mode", class_support,
9530 arm_mode_strings, &arm_fallback_mode_string,
9531 _("Set the mode assumed when symbols are unavailable."),
9532 _("Show the mode assumed when symbols are unavailable."),
9533 NULL, NULL, arm_show_fallback_mode,
9534 &setarmcmdlist, &showarmcmdlist);
9535 add_setshow_enum_cmd ("force-mode", class_support,
9536 arm_mode_strings, &arm_force_mode_string,
9537 _("Set the mode assumed even when symbols are available."),
9538 _("Show the mode assumed even when symbols are available."),
9539 NULL, NULL, arm_show_force_mode,
9540 &setarmcmdlist, &showarmcmdlist);
9541
6529d2dd 9542 /* Debugging flag. */
edefbb7c
AC
9543 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
9544 _("Set ARM debugging."),
9545 _("Show ARM debugging."),
9546 _("When on, arm-specific debugging is enabled."),
2c5b56ce 9547 NULL,
7915a72c 9548 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 9549 &setdebuglist, &showdebuglist);
c906108c 9550}
72508ac0
PO
9551
9552/* ARM-reversible process record data structures. */
9553
9554#define ARM_INSN_SIZE_BYTES 4
9555#define THUMB_INSN_SIZE_BYTES 2
9556#define THUMB2_INSN_SIZE_BYTES 4
9557
9558
71e396f9
LM
9559/* Position of the bit within a 32-bit ARM instruction
9560 that defines whether the instruction is a load or store. */
72508ac0
PO
9561#define INSN_S_L_BIT_NUM 20
9562
9563#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
9564 do \
9565 { \
9566 unsigned int reg_len = LENGTH; \
9567 if (reg_len) \
9568 { \
9569 REGS = XNEWVEC (uint32_t, reg_len); \
9570 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
9571 } \
9572 } \
9573 while (0)
9574
9575#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
9576 do \
9577 { \
9578 unsigned int mem_len = LENGTH; \
9579 if (mem_len) \
9580 { \
9581 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
9582 memcpy(&MEMS->len, &RECORD_BUF[0], \
9583 sizeof(struct arm_mem_r) * LENGTH); \
9584 } \
9585 } \
9586 while (0)
9587
9588/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
9589#define INSN_RECORDED(ARM_RECORD) \
9590 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
9591
9592/* ARM memory record structure. */
9593struct arm_mem_r
9594{
9595 uint32_t len; /* Record length. */
bfbbec00 9596 uint32_t addr; /* Memory address. */
72508ac0
PO
9597};
9598
9599/* ARM instruction record contains opcode of current insn
9600 and execution state (before entry to decode_insn()),
9601 contains list of to-be-modified registers and
9602 memory blocks (on return from decode_insn()). */
9603
9604typedef struct insn_decode_record_t
9605{
9606 struct gdbarch *gdbarch;
9607 struct regcache *regcache;
9608 CORE_ADDR this_addr; /* Address of the insn being decoded. */
9609 uint32_t arm_insn; /* Should accommodate thumb. */
9610 uint32_t cond; /* Condition code. */
9611 uint32_t opcode; /* Insn opcode. */
9612 uint32_t decode; /* Insn decode bits. */
9613 uint32_t mem_rec_count; /* No of mem records. */
9614 uint32_t reg_rec_count; /* No of reg records. */
9615 uint32_t *arm_regs; /* Registers to be saved for this record. */
9616 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
9617} insn_decode_record;
9618
9619
9620/* Checks ARM SBZ and SBO mandatory fields. */
9621
9622static int
9623sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
9624{
9625 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
9626
9627 if (!len)
9628 return 1;
9629
9630 if (!sbo)
9631 ones = ~ones;
9632
9633 while (ones)
9634 {
9635 if (!(ones & sbo))
9636 {
9637 return 0;
9638 }
9639 ones = ones >> 1;
9640 }
9641 return 1;
9642}
9643
c6ec2b30
OJ
9644enum arm_record_result
9645{
9646 ARM_RECORD_SUCCESS = 0,
9647 ARM_RECORD_FAILURE = 1
9648};
9649
72508ac0
PO
9650typedef enum
9651{
9652 ARM_RECORD_STRH=1,
9653 ARM_RECORD_STRD
9654} arm_record_strx_t;
9655
9656typedef enum
9657{
9658 ARM_RECORD=1,
9659 THUMB_RECORD,
9660 THUMB2_RECORD
9661} record_type_t;
9662
9663
9664static int
9665arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
9666 uint32_t *record_buf_mem, arm_record_strx_t str_type)
9667{
9668
9669 struct regcache *reg_cache = arm_insn_r->regcache;
9670 ULONGEST u_regval[2]= {0};
9671
9672 uint32_t reg_src1 = 0, reg_src2 = 0;
9673 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9674 uint32_t opcode1 = 0;
9675
9676 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
9677 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
9678 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
9679
9680
9681 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
9682 {
9683 /* 1) Handle misc store, immediate offset. */
9684 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9685 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9686 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9687 regcache_raw_read_unsigned (reg_cache, reg_src1,
9688 &u_regval[0]);
9689 if (ARM_PC_REGNUM == reg_src1)
9690 {
9691 /* If R15 was used as Rn, hence current PC+8. */
9692 u_regval[0] = u_regval[0] + 8;
9693 }
9694 offset_8 = (immed_high << 4) | immed_low;
9695 /* Calculate target store address. */
9696 if (14 == arm_insn_r->opcode)
9697 {
9698 tgt_mem_addr = u_regval[0] + offset_8;
9699 }
9700 else
9701 {
9702 tgt_mem_addr = u_regval[0] - offset_8;
9703 }
9704 if (ARM_RECORD_STRH == str_type)
9705 {
9706 record_buf_mem[0] = 2;
9707 record_buf_mem[1] = tgt_mem_addr;
9708 arm_insn_r->mem_rec_count = 1;
9709 }
9710 else if (ARM_RECORD_STRD == str_type)
9711 {
9712 record_buf_mem[0] = 4;
9713 record_buf_mem[1] = tgt_mem_addr;
9714 record_buf_mem[2] = 4;
9715 record_buf_mem[3] = tgt_mem_addr + 4;
9716 arm_insn_r->mem_rec_count = 2;
9717 }
9718 }
9719 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
9720 {
9721 /* 2) Store, register offset. */
9722 /* Get Rm. */
9723 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9724 /* Get Rn. */
9725 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9726 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9727 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9728 if (15 == reg_src2)
9729 {
9730 /* If R15 was used as Rn, hence current PC+8. */
9731 u_regval[0] = u_regval[0] + 8;
9732 }
9733 /* Calculate target store address, Rn +/- Rm, register offset. */
9734 if (12 == arm_insn_r->opcode)
9735 {
9736 tgt_mem_addr = u_regval[0] + u_regval[1];
9737 }
9738 else
9739 {
9740 tgt_mem_addr = u_regval[1] - u_regval[0];
9741 }
9742 if (ARM_RECORD_STRH == str_type)
9743 {
9744 record_buf_mem[0] = 2;
9745 record_buf_mem[1] = tgt_mem_addr;
9746 arm_insn_r->mem_rec_count = 1;
9747 }
9748 else if (ARM_RECORD_STRD == str_type)
9749 {
9750 record_buf_mem[0] = 4;
9751 record_buf_mem[1] = tgt_mem_addr;
9752 record_buf_mem[2] = 4;
9753 record_buf_mem[3] = tgt_mem_addr + 4;
9754 arm_insn_r->mem_rec_count = 2;
9755 }
9756 }
9757 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
9758 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9759 {
9760 /* 3) Store, immediate pre-indexed. */
9761 /* 5) Store, immediate post-indexed. */
9762 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
9763 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
9764 offset_8 = (immed_high << 4) | immed_low;
9765 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
9766 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9767 /* Calculate target store address, Rn +/- Rm, register offset. */
9768 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
9769 {
9770 tgt_mem_addr = u_regval[0] + offset_8;
9771 }
9772 else
9773 {
9774 tgt_mem_addr = u_regval[0] - offset_8;
9775 }
9776 if (ARM_RECORD_STRH == str_type)
9777 {
9778 record_buf_mem[0] = 2;
9779 record_buf_mem[1] = tgt_mem_addr;
9780 arm_insn_r->mem_rec_count = 1;
9781 }
9782 else if (ARM_RECORD_STRD == str_type)
9783 {
9784 record_buf_mem[0] = 4;
9785 record_buf_mem[1] = tgt_mem_addr;
9786 record_buf_mem[2] = 4;
9787 record_buf_mem[3] = tgt_mem_addr + 4;
9788 arm_insn_r->mem_rec_count = 2;
9789 }
9790 /* Record Rn also as it changes. */
9791 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9792 arm_insn_r->reg_rec_count = 1;
9793 }
9794 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
9795 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9796 {
9797 /* 4) Store, register pre-indexed. */
9798 /* 6) Store, register post -indexed. */
9799 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
9800 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
9801 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
9802 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
9803 /* Calculate target store address, Rn +/- Rm, register offset. */
9804 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
9805 {
9806 tgt_mem_addr = u_regval[0] + u_regval[1];
9807 }
9808 else
9809 {
9810 tgt_mem_addr = u_regval[1] - u_regval[0];
9811 }
9812 if (ARM_RECORD_STRH == str_type)
9813 {
9814 record_buf_mem[0] = 2;
9815 record_buf_mem[1] = tgt_mem_addr;
9816 arm_insn_r->mem_rec_count = 1;
9817 }
9818 else if (ARM_RECORD_STRD == str_type)
9819 {
9820 record_buf_mem[0] = 4;
9821 record_buf_mem[1] = tgt_mem_addr;
9822 record_buf_mem[2] = 4;
9823 record_buf_mem[3] = tgt_mem_addr + 4;
9824 arm_insn_r->mem_rec_count = 2;
9825 }
9826 /* Record Rn also as it changes. */
9827 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
9828 arm_insn_r->reg_rec_count = 1;
9829 }
9830 return 0;
9831}
9832
9833/* Handling ARM extension space insns. */
9834
9835static int
9836arm_record_extension_space (insn_decode_record *arm_insn_r)
9837{
9838 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
9839 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
9840 uint32_t record_buf[8], record_buf_mem[8];
9841 uint32_t reg_src1 = 0;
9842 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
9843 struct regcache *reg_cache = arm_insn_r->regcache;
9844 ULONGEST u_regval = 0;
9845
9846 gdb_assert (!INSN_RECORDED(arm_insn_r));
9847 /* Handle unconditional insn extension space. */
9848
9849 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
9850 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9851 if (arm_insn_r->cond)
9852 {
9853 /* PLD has no affect on architectural state, it just affects
9854 the caches. */
9855 if (5 == ((opcode1 & 0xE0) >> 5))
9856 {
9857 /* BLX(1) */
9858 record_buf[0] = ARM_PS_REGNUM;
9859 record_buf[1] = ARM_LR_REGNUM;
9860 arm_insn_r->reg_rec_count = 2;
9861 }
9862 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
9863 }
9864
9865
9866 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
9867 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
9868 {
9869 ret = -1;
9870 /* Undefined instruction on ARM V5; need to handle if later
9871 versions define it. */
9872 }
9873
9874 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
9875 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
9876 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
9877
9878 /* Handle arithmetic insn extension space. */
9879 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
9880 && !INSN_RECORDED(arm_insn_r))
9881 {
9882 /* Handle MLA(S) and MUL(S). */
9883 if (0 <= insn_op1 && 3 >= insn_op1)
9884 {
9885 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9886 record_buf[1] = ARM_PS_REGNUM;
9887 arm_insn_r->reg_rec_count = 2;
9888 }
9889 else if (4 <= insn_op1 && 15 >= insn_op1)
9890 {
9891 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
9892 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
9893 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9894 record_buf[2] = ARM_PS_REGNUM;
9895 arm_insn_r->reg_rec_count = 3;
9896 }
9897 }
9898
9899 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
9900 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
9901 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
9902
9903 /* Handle control insn extension space. */
9904
9905 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
9906 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
9907 {
9908 if (!bit (arm_insn_r->arm_insn,25))
9909 {
9910 if (!bits (arm_insn_r->arm_insn, 4, 7))
9911 {
9912 if ((0 == insn_op1) || (2 == insn_op1))
9913 {
9914 /* MRS. */
9915 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9916 arm_insn_r->reg_rec_count = 1;
9917 }
9918 else if (1 == insn_op1)
9919 {
9920 /* CSPR is going to be changed. */
9921 record_buf[0] = ARM_PS_REGNUM;
9922 arm_insn_r->reg_rec_count = 1;
9923 }
9924 else if (3 == insn_op1)
9925 {
9926 /* SPSR is going to be changed. */
9927 /* We need to get SPSR value, which is yet to be done. */
9928 printf_unfiltered (_("Process record does not support "
9929 "instruction 0x%0x at address %s.\n"),
9930 arm_insn_r->arm_insn,
9931 paddress (arm_insn_r->gdbarch,
9932 arm_insn_r->this_addr));
9933 return -1;
9934 }
9935 }
9936 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
9937 {
9938 if (1 == insn_op1)
9939 {
9940 /* BX. */
9941 record_buf[0] = ARM_PS_REGNUM;
9942 arm_insn_r->reg_rec_count = 1;
9943 }
9944 else if (3 == insn_op1)
9945 {
9946 /* CLZ. */
9947 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9948 arm_insn_r->reg_rec_count = 1;
9949 }
9950 }
9951 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
9952 {
9953 /* BLX. */
9954 record_buf[0] = ARM_PS_REGNUM;
9955 record_buf[1] = ARM_LR_REGNUM;
9956 arm_insn_r->reg_rec_count = 2;
9957 }
9958 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
9959 {
9960 /* QADD, QSUB, QDADD, QDSUB */
9961 record_buf[0] = ARM_PS_REGNUM;
9962 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
9963 arm_insn_r->reg_rec_count = 2;
9964 }
9965 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
9966 {
9967 /* BKPT. */
9968 record_buf[0] = ARM_PS_REGNUM;
9969 record_buf[1] = ARM_LR_REGNUM;
9970 arm_insn_r->reg_rec_count = 2;
9971
9972 /* Save SPSR also;how? */
9973 printf_unfiltered (_("Process record does not support "
9974 "instruction 0x%0x at address %s.\n"),
9975 arm_insn_r->arm_insn,
9976 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
9977 return -1;
9978 }
9979 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
9980 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
9981 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
9982 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
9983 )
9984 {
9985 if (0 == insn_op1 || 1 == insn_op1)
9986 {
9987 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
9988 /* We dont do optimization for SMULW<y> where we
9989 need only Rd. */
9990 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9991 record_buf[1] = ARM_PS_REGNUM;
9992 arm_insn_r->reg_rec_count = 2;
9993 }
9994 else if (2 == insn_op1)
9995 {
9996 /* SMLAL<x><y>. */
9997 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
9998 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
9999 arm_insn_r->reg_rec_count = 2;
10000 }
10001 else if (3 == insn_op1)
10002 {
10003 /* SMUL<x><y>. */
10004 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10005 arm_insn_r->reg_rec_count = 1;
10006 }
10007 }
10008 }
10009 else
10010 {
10011 /* MSR : immediate form. */
10012 if (1 == insn_op1)
10013 {
10014 /* CSPR is going to be changed. */
10015 record_buf[0] = ARM_PS_REGNUM;
10016 arm_insn_r->reg_rec_count = 1;
10017 }
10018 else if (3 == insn_op1)
10019 {
10020 /* SPSR is going to be changed. */
10021 /* we need to get SPSR value, which is yet to be done */
10022 printf_unfiltered (_("Process record does not support "
10023 "instruction 0x%0x at address %s.\n"),
10024 arm_insn_r->arm_insn,
10025 paddress (arm_insn_r->gdbarch,
10026 arm_insn_r->this_addr));
10027 return -1;
10028 }
10029 }
10030 }
10031
10032 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10033 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10034 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10035
10036 /* Handle load/store insn extension space. */
10037
10038 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10039 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10040 && !INSN_RECORDED(arm_insn_r))
10041 {
10042 /* SWP/SWPB. */
10043 if (0 == insn_op1)
10044 {
10045 /* These insn, changes register and memory as well. */
10046 /* SWP or SWPB insn. */
10047 /* Get memory address given by Rn. */
10048 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10049 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10050 /* SWP insn ?, swaps word. */
10051 if (8 == arm_insn_r->opcode)
10052 {
10053 record_buf_mem[0] = 4;
10054 }
10055 else
10056 {
10057 /* SWPB insn, swaps only byte. */
10058 record_buf_mem[0] = 1;
10059 }
10060 record_buf_mem[1] = u_regval;
10061 arm_insn_r->mem_rec_count = 1;
10062 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10063 arm_insn_r->reg_rec_count = 1;
10064 }
10065 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10066 {
10067 /* STRH. */
10068 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10069 ARM_RECORD_STRH);
10070 }
10071 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10072 {
10073 /* LDRD. */
10074 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10075 record_buf[1] = record_buf[0] + 1;
10076 arm_insn_r->reg_rec_count = 2;
10077 }
10078 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10079 {
10080 /* STRD. */
10081 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10082 ARM_RECORD_STRD);
10083 }
10084 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10085 {
10086 /* LDRH, LDRSB, LDRSH. */
10087 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10088 arm_insn_r->reg_rec_count = 1;
10089 }
10090
10091 }
10092
10093 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10094 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10095 && !INSN_RECORDED(arm_insn_r))
10096 {
10097 ret = -1;
10098 /* Handle coprocessor insn extension space. */
10099 }
10100
10101 /* To be done for ARMv5 and later; as of now we return -1. */
10102 if (-1 == ret)
10103 printf_unfiltered (_("Process record does not support instruction x%0x "
10104 "at address %s.\n"),arm_insn_r->arm_insn,
10105 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10106
10107
10108 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10109 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10110
10111 return ret;
10112}
10113
10114/* Handling opcode 000 insns. */
10115
10116static int
10117arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
10118{
10119 struct regcache *reg_cache = arm_insn_r->regcache;
10120 uint32_t record_buf[8], record_buf_mem[8];
10121 ULONGEST u_regval[2] = {0};
10122
10123 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10124 uint32_t immed_high = 0, immed_low = 0, offset_8 = 0, tgt_mem_addr = 0;
10125 uint32_t opcode1 = 0;
10126
10127 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10128 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10129 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10130
10131 /* Data processing insn /multiply insn. */
10132 if (9 == arm_insn_r->decode
10133 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10134 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
10135 {
10136 /* Handle multiply instructions. */
10137 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
10138 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
10139 {
10140 /* Handle MLA and MUL. */
10141 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10142 record_buf[1] = ARM_PS_REGNUM;
10143 arm_insn_r->reg_rec_count = 2;
10144 }
10145 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
10146 {
10147 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
10148 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10149 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10150 record_buf[2] = ARM_PS_REGNUM;
10151 arm_insn_r->reg_rec_count = 3;
10152 }
10153 }
10154 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10155 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
10156 {
10157 /* Handle misc load insns, as 20th bit (L = 1). */
10158 /* LDR insn has a capability to do branching, if
10159 MOV LR, PC is precceded by LDR insn having Rn as R15
10160 in that case, it emulates branch and link insn, and hence we
10161 need to save CSPR and PC as well. I am not sure this is right
10162 place; as opcode = 010 LDR insn make this happen, if R15 was
10163 used. */
10164 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10165 if (15 != reg_dest)
10166 {
10167 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10168 arm_insn_r->reg_rec_count = 1;
10169 }
10170 else
10171 {
10172 record_buf[0] = reg_dest;
10173 record_buf[1] = ARM_PS_REGNUM;
10174 arm_insn_r->reg_rec_count = 2;
10175 }
10176 }
10177 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10178 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
10179 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10180 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
10181 {
10182 /* Handle MSR insn. */
10183 if (9 == arm_insn_r->opcode)
10184 {
10185 /* CSPR is going to be changed. */
10186 record_buf[0] = ARM_PS_REGNUM;
10187 arm_insn_r->reg_rec_count = 1;
10188 }
10189 else
10190 {
10191 /* SPSR is going to be changed. */
10192 /* How to read SPSR value? */
10193 printf_unfiltered (_("Process record does not support instruction "
10194 "0x%0x at address %s.\n"),
10195 arm_insn_r->arm_insn,
10196 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10197 return -1;
10198 }
10199 }
10200 else if (9 == arm_insn_r->decode
10201 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10202 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10203 {
10204 /* Handling SWP, SWPB. */
10205 /* These insn, changes register and memory as well. */
10206 /* SWP or SWPB insn. */
10207
10208 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10209 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10210 /* SWP insn ?, swaps word. */
10211 if (8 == arm_insn_r->opcode)
10212 {
10213 record_buf_mem[0] = 4;
10214 }
10215 else
10216 {
10217 /* SWPB insn, swaps only byte. */
10218 record_buf_mem[0] = 1;
10219 }
10220 record_buf_mem[1] = u_regval[0];
10221 arm_insn_r->mem_rec_count = 1;
10222 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10223 arm_insn_r->reg_rec_count = 1;
10224 }
10225 else if (3 == arm_insn_r->decode && 0x12 == opcode1
10226 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10227 {
10228 /* Handle BLX, branch and link/exchange. */
10229 if (9 == arm_insn_r->opcode)
10230 {
10231 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
10232 and R14 stores the return address. */
10233 record_buf[0] = ARM_PS_REGNUM;
10234 record_buf[1] = ARM_LR_REGNUM;
10235 arm_insn_r->reg_rec_count = 2;
10236 }
10237 }
10238 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
10239 {
10240 /* Handle enhanced software breakpoint insn, BKPT. */
10241 /* CPSR is changed to be executed in ARM state, disabling normal
10242 interrupts, entering abort mode. */
10243 /* According to high vector configuration PC is set. */
10244 /* user hit breakpoint and type reverse, in
10245 that case, we need to go back with previous CPSR and
10246 Program Counter. */
10247 record_buf[0] = ARM_PS_REGNUM;
10248 record_buf[1] = ARM_LR_REGNUM;
10249 arm_insn_r->reg_rec_count = 2;
10250
10251 /* Save SPSR also; how? */
10252 printf_unfiltered (_("Process record does not support instruction "
10253 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10254 paddress (arm_insn_r->gdbarch,
10255 arm_insn_r->this_addr));
10256 return -1;
10257 }
10258 else if (11 == arm_insn_r->decode
10259 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10260 {
10261 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
10262
10263 /* Handle str(x) insn */
10264 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10265 ARM_RECORD_STRH);
10266 }
10267 else if (1 == arm_insn_r->decode && 0x12 == opcode1
10268 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
10269 {
10270 /* Handle BX, branch and link/exchange. */
10271 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
10272 record_buf[0] = ARM_PS_REGNUM;
10273 arm_insn_r->reg_rec_count = 1;
10274 }
10275 else if (1 == arm_insn_r->decode && 0x16 == opcode1
10276 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
10277 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
10278 {
10279 /* Count leading zeros: CLZ. */
10280 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10281 arm_insn_r->reg_rec_count = 1;
10282 }
10283 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
10284 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10285 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
10286 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
10287 )
10288 {
10289 /* Handle MRS insn. */
10290 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10291 arm_insn_r->reg_rec_count = 1;
10292 }
10293 else if (arm_insn_r->opcode <= 15)
10294 {
10295 /* Normal data processing insns. */
10296 /* Out of 11 shifter operands mode, all the insn modifies destination
10297 register, which is specified by 13-16 decode. */
10298 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10299 record_buf[1] = ARM_PS_REGNUM;
10300 arm_insn_r->reg_rec_count = 2;
10301 }
10302 else
10303 {
10304 return -1;
10305 }
10306
10307 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10308 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10309 return 0;
10310}
10311
10312/* Handling opcode 001 insns. */
10313
10314static int
10315arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
10316{
10317 uint32_t record_buf[8], record_buf_mem[8];
10318
10319 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10320 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10321
10322 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
10323 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
10324 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
10325 )
10326 {
10327 /* Handle MSR insn. */
10328 if (9 == arm_insn_r->opcode)
10329 {
10330 /* CSPR is going to be changed. */
10331 record_buf[0] = ARM_PS_REGNUM;
10332 arm_insn_r->reg_rec_count = 1;
10333 }
10334 else
10335 {
10336 /* SPSR is going to be changed. */
10337 }
10338 }
10339 else if (arm_insn_r->opcode <= 15)
10340 {
10341 /* Normal data processing insns. */
10342 /* Out of 11 shifter operands mode, all the insn modifies destination
10343 register, which is specified by 13-16 decode. */
10344 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10345 record_buf[1] = ARM_PS_REGNUM;
10346 arm_insn_r->reg_rec_count = 2;
10347 }
10348 else
10349 {
10350 return -1;
10351 }
10352
10353 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10354 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10355 return 0;
10356}
10357
71e396f9 10358/* Handle ARM mode instructions with opcode 010. */
72508ac0
PO
10359
10360static int
10361arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
10362{
10363 struct regcache *reg_cache = arm_insn_r->regcache;
10364
71e396f9
LM
10365 uint32_t reg_base , reg_dest;
10366 uint32_t offset_12, tgt_mem_addr;
72508ac0 10367 uint32_t record_buf[8], record_buf_mem[8];
71e396f9
LM
10368 unsigned char wback;
10369 ULONGEST u_regval;
72508ac0 10370
71e396f9
LM
10371 /* Calculate wback. */
10372 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
10373 || (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0 10374
71e396f9
LM
10375 arm_insn_r->reg_rec_count = 0;
10376 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0
PO
10377
10378 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10379 {
71e396f9
LM
10380 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
10381 and LDRT. */
10382
72508ac0 10383 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
71e396f9
LM
10384 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
10385
10386 /* The LDR instruction is capable of doing branching. If MOV LR, PC
10387 preceeds a LDR instruction having R15 as reg_base, it
10388 emulates a branch and link instruction, and hence we need to save
10389 CPSR and PC as well. */
10390 if (ARM_PC_REGNUM == reg_dest)
10391 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
10392
10393 /* If wback is true, also save the base register, which is going to be
10394 written to. */
10395 if (wback)
10396 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10397 }
10398 else
10399 {
71e396f9
LM
10400 /* STR (immediate), STRB (immediate), STRBT and STRT. */
10401
72508ac0 10402 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
71e396f9
LM
10403 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10404
10405 /* Handle bit U. */
72508ac0 10406 if (bit (arm_insn_r->arm_insn, 23))
71e396f9
LM
10407 {
10408 /* U == 1: Add the offset. */
10409 tgt_mem_addr = (uint32_t) u_regval + offset_12;
10410 }
72508ac0 10411 else
71e396f9
LM
10412 {
10413 /* U == 0: subtract the offset. */
10414 tgt_mem_addr = (uint32_t) u_regval - offset_12;
10415 }
10416
10417 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
10418 bytes. */
10419 if (bit (arm_insn_r->arm_insn, 22))
10420 {
10421 /* STRB and STRBT: 1 byte. */
10422 record_buf_mem[0] = 1;
10423 }
10424 else
10425 {
10426 /* STR and STRT: 4 bytes. */
10427 record_buf_mem[0] = 4;
10428 }
10429
10430 /* Handle bit P. */
10431 if (bit (arm_insn_r->arm_insn, 24))
10432 record_buf_mem[1] = tgt_mem_addr;
10433 else
10434 record_buf_mem[1] = (uint32_t) u_regval;
72508ac0 10435
72508ac0
PO
10436 arm_insn_r->mem_rec_count = 1;
10437
71e396f9
LM
10438 /* If wback is true, also save the base register, which is going to be
10439 written to. */
10440 if (wback)
10441 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10442 }
10443
10444 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10445 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10446 return 0;
10447}
10448
10449/* Handling opcode 011 insns. */
10450
10451static int
10452arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
10453{
10454 struct regcache *reg_cache = arm_insn_r->regcache;
10455
10456 uint32_t shift_imm = 0;
10457 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
10458 uint32_t offset_12 = 0, tgt_mem_addr = 0;
10459 uint32_t record_buf[8], record_buf_mem[8];
10460
10461 LONGEST s_word;
10462 ULONGEST u_regval[2];
10463
10464 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10465 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10466
10467 /* Handle enhanced store insns and LDRD DSP insn,
10468 order begins according to addressing modes for store insns
10469 STRH insn. */
10470
10471 /* LDR or STR? */
10472 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10473 {
10474 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
10475 /* LDR insn has a capability to do branching, if
10476 MOV LR, PC is precedded by LDR insn having Rn as R15
10477 in that case, it emulates branch and link insn, and hence we
10478 need to save CSPR and PC as well. */
10479 if (15 != reg_dest)
10480 {
10481 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10482 arm_insn_r->reg_rec_count = 1;
10483 }
10484 else
10485 {
10486 record_buf[0] = reg_dest;
10487 record_buf[1] = ARM_PS_REGNUM;
10488 arm_insn_r->reg_rec_count = 2;
10489 }
10490 }
10491 else
10492 {
10493 if (! bits (arm_insn_r->arm_insn, 4, 11))
10494 {
10495 /* Store insn, register offset and register pre-indexed,
10496 register post-indexed. */
10497 /* Get Rm. */
10498 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10499 /* Get Rn. */
10500 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10501 regcache_raw_read_unsigned (reg_cache, reg_src1
10502 , &u_regval[0]);
10503 regcache_raw_read_unsigned (reg_cache, reg_src2
10504 , &u_regval[1]);
10505 if (15 == reg_src2)
10506 {
10507 /* If R15 was used as Rn, hence current PC+8. */
10508 /* Pre-indexed mode doesnt reach here ; illegal insn. */
10509 u_regval[0] = u_regval[0] + 8;
10510 }
10511 /* Calculate target store address, Rn +/- Rm, register offset. */
10512 /* U == 1. */
10513 if (bit (arm_insn_r->arm_insn, 23))
10514 {
10515 tgt_mem_addr = u_regval[0] + u_regval[1];
10516 }
10517 else
10518 {
10519 tgt_mem_addr = u_regval[1] - u_regval[0];
10520 }
10521
10522 switch (arm_insn_r->opcode)
10523 {
10524 /* STR. */
10525 case 8:
10526 case 12:
10527 /* STR. */
10528 case 9:
10529 case 13:
10530 /* STRT. */
10531 case 1:
10532 case 5:
10533 /* STR. */
10534 case 0:
10535 case 4:
10536 record_buf_mem[0] = 4;
10537 break;
10538
10539 /* STRB. */
10540 case 10:
10541 case 14:
10542 /* STRB. */
10543 case 11:
10544 case 15:
10545 /* STRBT. */
10546 case 3:
10547 case 7:
10548 /* STRB. */
10549 case 2:
10550 case 6:
10551 record_buf_mem[0] = 1;
10552 break;
10553
10554 default:
10555 gdb_assert_not_reached ("no decoding pattern found");
10556 break;
10557 }
10558 record_buf_mem[1] = tgt_mem_addr;
10559 arm_insn_r->mem_rec_count = 1;
10560
10561 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10562 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10563 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10564 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10565 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10566 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10567 )
10568 {
10569 /* Rn is going to be changed in pre-indexed mode and
10570 post-indexed mode as well. */
10571 record_buf[0] = reg_src2;
10572 arm_insn_r->reg_rec_count = 1;
10573 }
10574 }
10575 else
10576 {
10577 /* Store insn, scaled register offset; scaled pre-indexed. */
10578 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
10579 /* Get Rm. */
10580 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10581 /* Get Rn. */
10582 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10583 /* Get shift_imm. */
10584 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
10585 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10586 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
10587 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10588 /* Offset_12 used as shift. */
10589 switch (offset_12)
10590 {
10591 case 0:
10592 /* Offset_12 used as index. */
10593 offset_12 = u_regval[0] << shift_imm;
10594 break;
10595
10596 case 1:
10597 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
10598 break;
10599
10600 case 2:
10601 if (!shift_imm)
10602 {
10603 if (bit (u_regval[0], 31))
10604 {
10605 offset_12 = 0xFFFFFFFF;
10606 }
10607 else
10608 {
10609 offset_12 = 0;
10610 }
10611 }
10612 else
10613 {
10614 /* This is arithmetic shift. */
10615 offset_12 = s_word >> shift_imm;
10616 }
10617 break;
10618
10619 case 3:
10620 if (!shift_imm)
10621 {
10622 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
10623 &u_regval[1]);
10624 /* Get C flag value and shift it by 31. */
10625 offset_12 = (((bit (u_regval[1], 29)) << 31) \
10626 | (u_regval[0]) >> 1);
10627 }
10628 else
10629 {
10630 offset_12 = (u_regval[0] >> shift_imm) \
10631 | (u_regval[0] <<
10632 (sizeof(uint32_t) - shift_imm));
10633 }
10634 break;
10635
10636 default:
10637 gdb_assert_not_reached ("no decoding pattern found");
10638 break;
10639 }
10640
10641 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10642 /* bit U set. */
10643 if (bit (arm_insn_r->arm_insn, 23))
10644 {
10645 tgt_mem_addr = u_regval[1] + offset_12;
10646 }
10647 else
10648 {
10649 tgt_mem_addr = u_regval[1] - offset_12;
10650 }
10651
10652 switch (arm_insn_r->opcode)
10653 {
10654 /* STR. */
10655 case 8:
10656 case 12:
10657 /* STR. */
10658 case 9:
10659 case 13:
10660 /* STRT. */
10661 case 1:
10662 case 5:
10663 /* STR. */
10664 case 0:
10665 case 4:
10666 record_buf_mem[0] = 4;
10667 break;
10668
10669 /* STRB. */
10670 case 10:
10671 case 14:
10672 /* STRB. */
10673 case 11:
10674 case 15:
10675 /* STRBT. */
10676 case 3:
10677 case 7:
10678 /* STRB. */
10679 case 2:
10680 case 6:
10681 record_buf_mem[0] = 1;
10682 break;
10683
10684 default:
10685 gdb_assert_not_reached ("no decoding pattern found");
10686 break;
10687 }
10688 record_buf_mem[1] = tgt_mem_addr;
10689 arm_insn_r->mem_rec_count = 1;
10690
10691 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
10692 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10693 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
10694 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
10695 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
10696 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
10697 )
10698 {
10699 /* Rn is going to be changed in register scaled pre-indexed
10700 mode,and scaled post indexed mode. */
10701 record_buf[0] = reg_src2;
10702 arm_insn_r->reg_rec_count = 1;
10703 }
10704 }
10705 }
10706
10707 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10708 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10709 return 0;
10710}
10711
71e396f9 10712/* Handle ARM mode instructions with opcode 100. */
72508ac0
PO
10713
10714static int
10715arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
10716{
10717 struct regcache *reg_cache = arm_insn_r->regcache;
71e396f9
LM
10718 uint32_t register_count = 0, register_bits;
10719 uint32_t reg_base, addr_mode;
72508ac0 10720 uint32_t record_buf[24], record_buf_mem[48];
71e396f9
LM
10721 uint32_t wback;
10722 ULONGEST u_regval;
72508ac0 10723
71e396f9
LM
10724 /* Fetch the list of registers. */
10725 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
10726 arm_insn_r->reg_rec_count = 0;
10727
10728 /* Fetch the base register that contains the address we are loading data
10729 to. */
10730 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
72508ac0 10731
71e396f9
LM
10732 /* Calculate wback. */
10733 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
72508ac0
PO
10734
10735 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
10736 {
71e396f9 10737 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
72508ac0 10738
71e396f9 10739 /* Find out which registers are going to be loaded from memory. */
72508ac0 10740 while (register_bits)
71e396f9
LM
10741 {
10742 if (register_bits & 0x00000001)
10743 record_buf[arm_insn_r->reg_rec_count++] = register_count;
10744 register_bits = register_bits >> 1;
10745 register_count++;
10746 }
72508ac0 10747
71e396f9
LM
10748
10749 /* If wback is true, also save the base register, which is going to be
10750 written to. */
10751 if (wback)
10752 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
10753
10754 /* Save the CPSR register. */
10755 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
72508ac0
PO
10756 }
10757 else
10758 {
71e396f9 10759 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
72508ac0 10760
71e396f9
LM
10761 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
10762
10763 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
10764
10765 /* Find out how many registers are going to be stored to memory. */
72508ac0 10766 while (register_bits)
71e396f9
LM
10767 {
10768 if (register_bits & 0x00000001)
10769 register_count++;
10770 register_bits = register_bits >> 1;
10771 }
72508ac0
PO
10772
10773 switch (addr_mode)
71e396f9
LM
10774 {
10775 /* STMDA (STMED): Decrement after. */
10776 case 0:
10777 record_buf_mem[1] = (uint32_t) u_regval
10778 - register_count * INT_REGISTER_SIZE + 4;
10779 break;
10780 /* STM (STMIA, STMEA): Increment after. */
10781 case 1:
10782 record_buf_mem[1] = (uint32_t) u_regval;
10783 break;
10784 /* STMDB (STMFD): Decrement before. */
10785 case 2:
10786 record_buf_mem[1] = (uint32_t) u_regval
10787 - register_count * INT_REGISTER_SIZE;
10788 break;
10789 /* STMIB (STMFA): Increment before. */
10790 case 3:
10791 record_buf_mem[1] = (uint32_t) u_regval + INT_REGISTER_SIZE;
10792 break;
10793 default:
10794 gdb_assert_not_reached ("no decoding pattern found");
10795 break;
10796 }
72508ac0 10797
71e396f9
LM
10798 record_buf_mem[0] = register_count * INT_REGISTER_SIZE;
10799 arm_insn_r->mem_rec_count = 1;
10800
10801 /* If wback is true, also save the base register, which is going to be
10802 written to. */
10803 if (wback)
10804 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
72508ac0
PO
10805 }
10806
10807 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10808 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
10809 return 0;
10810}
10811
10812/* Handling opcode 101 insns. */
10813
10814static int
10815arm_record_b_bl (insn_decode_record *arm_insn_r)
10816{
10817 uint32_t record_buf[8];
10818
10819 /* Handle B, BL, BLX(1) insns. */
10820 /* B simply branches so we do nothing here. */
10821 /* Note: BLX(1) doesnt fall here but instead it falls into
10822 extension space. */
10823 if (bit (arm_insn_r->arm_insn, 24))
10824 {
10825 record_buf[0] = ARM_LR_REGNUM;
10826 arm_insn_r->reg_rec_count = 1;
10827 }
10828
10829 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10830
10831 return 0;
10832}
10833
10834/* Handling opcode 110 insns. */
10835
10836static int
c6ec2b30 10837arm_record_unsupported_insn (insn_decode_record *arm_insn_r)
72508ac0
PO
10838{
10839 printf_unfiltered (_("Process record does not support instruction "
10840 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
10841 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10842
10843 return -1;
10844}
10845
5a578da5
OJ
10846/* Record handler for vector data transfer instructions. */
10847
10848static int
10849arm_record_vdata_transfer_insn (insn_decode_record *arm_insn_r)
10850{
10851 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
10852 uint32_t record_buf[4];
10853
10854 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10855 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
10856 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
10857 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
10858 bit_l = bit (arm_insn_r->arm_insn, 20);
10859 bit_c = bit (arm_insn_r->arm_insn, 8);
10860
10861 /* Handle VMOV instruction. */
10862 if (bit_l && bit_c)
10863 {
10864 record_buf[0] = reg_t;
10865 arm_insn_r->reg_rec_count = 1;
10866 }
10867 else if (bit_l && !bit_c)
10868 {
10869 /* Handle VMOV instruction. */
10870 if (bits_a == 0x00)
10871 {
10872 if (bit (arm_insn_r->arm_insn, 20))
10873 record_buf[0] = reg_t;
10874 else
10875 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10876 (reg_v << 1));
10877
10878 arm_insn_r->reg_rec_count = 1;
10879 }
10880 /* Handle VMRS instruction. */
10881 else if (bits_a == 0x07)
10882 {
10883 if (reg_t == 15)
10884 reg_t = ARM_PS_REGNUM;
10885
10886 record_buf[0] = reg_t;
10887 arm_insn_r->reg_rec_count = 1;
10888 }
10889 }
10890 else if (!bit_l && !bit_c)
10891 {
10892 /* Handle VMOV instruction. */
10893 if (bits_a == 0x00)
10894 {
10895 if (bit (arm_insn_r->arm_insn, 20))
10896 record_buf[0] = reg_t;
10897 else
10898 record_buf[0] = num_regs + (bit (arm_insn_r->arm_insn, 7) |
10899 (reg_v << 1));
10900
10901 arm_insn_r->reg_rec_count = 1;
10902 }
10903 /* Handle VMSR instruction. */
10904 else if (bits_a == 0x07)
10905 {
10906 record_buf[0] = ARM_FPSCR_REGNUM;
10907 arm_insn_r->reg_rec_count = 1;
10908 }
10909 }
10910 else if (!bit_l && bit_c)
10911 {
10912 /* Handle VMOV instruction. */
10913 if (!(bits_a & 0x04))
10914 {
10915 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
10916 + ARM_D0_REGNUM;
10917 arm_insn_r->reg_rec_count = 1;
10918 }
10919 /* Handle VDUP instruction. */
10920 else
10921 {
10922 if (bit (arm_insn_r->arm_insn, 21))
10923 {
10924 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10925 record_buf[0] = reg_v + ARM_D0_REGNUM;
10926 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
10927 arm_insn_r->reg_rec_count = 2;
10928 }
10929 else
10930 {
10931 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
10932 record_buf[0] = reg_v + ARM_D0_REGNUM;
10933 arm_insn_r->reg_rec_count = 1;
10934 }
10935 }
10936 }
10937
10938 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
10939 return 0;
10940}
10941
f20f80dd
OJ
10942/* Record handler for extension register load/store instructions. */
10943
10944static int
10945arm_record_exreg_ld_st_insn (insn_decode_record *arm_insn_r)
10946{
10947 uint32_t opcode, single_reg;
10948 uint8_t op_vldm_vstm;
10949 uint32_t record_buf[8], record_buf_mem[128];
10950 ULONGEST u_regval = 0;
10951
10952 struct regcache *reg_cache = arm_insn_r->regcache;
10953 const int num_regs = gdbarch_num_regs (arm_insn_r->gdbarch);
10954
10955 opcode = bits (arm_insn_r->arm_insn, 20, 24);
10956 single_reg = bit (arm_insn_r->arm_insn, 8);
10957 op_vldm_vstm = opcode & 0x1b;
10958
10959 /* Handle VMOV instructions. */
10960 if ((opcode & 0x1e) == 0x04)
10961 {
10962 if (bit (arm_insn_r->arm_insn, 4))
10963 {
10964 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10965 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10966 arm_insn_r->reg_rec_count = 2;
10967 }
10968 else
10969 {
10970 uint8_t reg_m = (bits (arm_insn_r->arm_insn, 0, 3) << 1)
10971 | bit (arm_insn_r->arm_insn, 5);
10972
10973 if (!single_reg)
10974 {
10975 record_buf[0] = num_regs + reg_m;
10976 record_buf[1] = num_regs + reg_m + 1;
10977 arm_insn_r->reg_rec_count = 2;
10978 }
10979 else
10980 {
10981 record_buf[0] = reg_m + ARM_D0_REGNUM;
10982 arm_insn_r->reg_rec_count = 1;
10983 }
10984 }
10985 }
10986 /* Handle VSTM and VPUSH instructions. */
10987 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
10988 || op_vldm_vstm == 0x12)
10989 {
10990 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
10991 uint32_t memory_index = 0;
10992
10993 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
10994 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
10995 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
10996 imm_off32 = imm_off8 << 24;
10997 memory_count = imm_off8;
10998
10999 if (bit (arm_insn_r->arm_insn, 23))
11000 start_address = u_regval;
11001 else
11002 start_address = u_regval - imm_off32;
11003
11004 if (bit (arm_insn_r->arm_insn, 21))
11005 {
11006 record_buf[0] = reg_rn;
11007 arm_insn_r->reg_rec_count = 1;
11008 }
11009
11010 while (memory_count > 0)
11011 {
11012 if (!single_reg)
11013 {
11014 record_buf_mem[memory_index] = start_address;
11015 record_buf_mem[memory_index + 1] = 4;
11016 start_address = start_address + 4;
11017 memory_index = memory_index + 2;
11018 }
11019 else
11020 {
11021 record_buf_mem[memory_index] = start_address;
11022 record_buf_mem[memory_index + 1] = 4;
11023 record_buf_mem[memory_index + 2] = start_address + 4;
11024 record_buf_mem[memory_index + 3] = 4;
11025 start_address = start_address + 8;
11026 memory_index = memory_index + 4;
11027 }
11028 memory_count--;
11029 }
11030 arm_insn_r->mem_rec_count = (memory_index >> 1);
11031 }
11032 /* Handle VLDM instructions. */
11033 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
11034 || op_vldm_vstm == 0x13)
11035 {
11036 uint32_t reg_count, reg_vd;
11037 uint32_t reg_index = 0;
11038
11039 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11040 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
11041
11042 if (single_reg)
11043 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11044 else
11045 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11046
11047 if (bit (arm_insn_r->arm_insn, 21))
11048 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
11049
11050 while (reg_count > 0)
11051 {
11052 if (single_reg)
11053 record_buf[reg_index++] = num_regs + reg_vd + reg_count - 1;
11054 else
11055 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
11056
11057 reg_count--;
11058 }
11059 arm_insn_r->reg_rec_count = reg_index;
11060 }
11061 /* VSTR Vector store register. */
11062 else if ((opcode & 0x13) == 0x10)
11063 {
11064 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
11065 uint32_t memory_index = 0;
11066
11067 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
11068 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11069 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
11070 imm_off32 = imm_off8 << 24;
11071 memory_count = imm_off8;
11072
11073 if (bit (arm_insn_r->arm_insn, 23))
11074 start_address = u_regval + imm_off32;
11075 else
11076 start_address = u_regval - imm_off32;
11077
11078 if (single_reg)
11079 {
11080 record_buf_mem[memory_index] = start_address;
11081 record_buf_mem[memory_index + 1] = 4;
11082 arm_insn_r->mem_rec_count = 1;
11083 }
11084 else
11085 {
11086 record_buf_mem[memory_index] = start_address;
11087 record_buf_mem[memory_index + 1] = 4;
11088 record_buf_mem[memory_index + 2] = start_address + 4;
11089 record_buf_mem[memory_index + 3] = 4;
11090 arm_insn_r->mem_rec_count = 2;
11091 }
11092 }
11093 /* VLDR Vector load register. */
11094 else if ((opcode & 0x13) == 0x11)
11095 {
11096 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11097
11098 if (!single_reg)
11099 {
11100 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
11101 record_buf[0] = ARM_D0_REGNUM + reg_vd;
11102 }
11103 else
11104 {
11105 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
11106 record_buf[0] = num_regs + reg_vd;
11107 }
11108 arm_insn_r->reg_rec_count = 1;
11109 }
11110
11111 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11112 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11113 return 0;
11114}
11115
851f26ae
OJ
11116/* Record handler for arm/thumb mode VFP data processing instructions. */
11117
11118static int
11119arm_record_vfp_data_proc_insn (insn_decode_record *arm_insn_r)
11120{
11121 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
11122 uint32_t record_buf[4];
11123 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
11124 enum insn_types curr_insn_type = INSN_INV;
11125
11126 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
11127 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
11128 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
11129 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
11130 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
11131 bit_d = bit (arm_insn_r->arm_insn, 22);
11132 opc1 = opc1 & 0x04;
11133
11134 /* Handle VMLA, VMLS. */
11135 if (opc1 == 0x00)
11136 {
11137 if (bit (arm_insn_r->arm_insn, 10))
11138 {
11139 if (bit (arm_insn_r->arm_insn, 6))
11140 curr_insn_type = INSN_T0;
11141 else
11142 curr_insn_type = INSN_T1;
11143 }
11144 else
11145 {
11146 if (dp_op_sz)
11147 curr_insn_type = INSN_T1;
11148 else
11149 curr_insn_type = INSN_T2;
11150 }
11151 }
11152 /* Handle VNMLA, VNMLS, VNMUL. */
11153 else if (opc1 == 0x01)
11154 {
11155 if (dp_op_sz)
11156 curr_insn_type = INSN_T1;
11157 else
11158 curr_insn_type = INSN_T2;
11159 }
11160 /* Handle VMUL. */
11161 else if (opc1 == 0x02 && !(opc3 & 0x01))
11162 {
11163 if (bit (arm_insn_r->arm_insn, 10))
11164 {
11165 if (bit (arm_insn_r->arm_insn, 6))
11166 curr_insn_type = INSN_T0;
11167 else
11168 curr_insn_type = INSN_T1;
11169 }
11170 else
11171 {
11172 if (dp_op_sz)
11173 curr_insn_type = INSN_T1;
11174 else
11175 curr_insn_type = INSN_T2;
11176 }
11177 }
11178 /* Handle VADD, VSUB. */
11179 else if (opc1 == 0x03)
11180 {
11181 if (!bit (arm_insn_r->arm_insn, 9))
11182 {
11183 if (bit (arm_insn_r->arm_insn, 6))
11184 curr_insn_type = INSN_T0;
11185 else
11186 curr_insn_type = INSN_T1;
11187 }
11188 else
11189 {
11190 if (dp_op_sz)
11191 curr_insn_type = INSN_T1;
11192 else
11193 curr_insn_type = INSN_T2;
11194 }
11195 }
11196 /* Handle VDIV. */
11197 else if (opc1 == 0x0b)
11198 {
11199 if (dp_op_sz)
11200 curr_insn_type = INSN_T1;
11201 else
11202 curr_insn_type = INSN_T2;
11203 }
11204 /* Handle all other vfp data processing instructions. */
11205 else if (opc1 == 0x0b)
11206 {
11207 /* Handle VMOV. */
11208 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
11209 {
11210 if (bit (arm_insn_r->arm_insn, 4))
11211 {
11212 if (bit (arm_insn_r->arm_insn, 6))
11213 curr_insn_type = INSN_T0;
11214 else
11215 curr_insn_type = INSN_T1;
11216 }
11217 else
11218 {
11219 if (dp_op_sz)
11220 curr_insn_type = INSN_T1;
11221 else
11222 curr_insn_type = INSN_T2;
11223 }
11224 }
11225 /* Handle VNEG and VABS. */
11226 else if ((opc2 == 0x01 && opc3 == 0x01)
11227 || (opc2 == 0x00 && opc3 == 0x03))
11228 {
11229 if (!bit (arm_insn_r->arm_insn, 11))
11230 {
11231 if (bit (arm_insn_r->arm_insn, 6))
11232 curr_insn_type = INSN_T0;
11233 else
11234 curr_insn_type = INSN_T1;
11235 }
11236 else
11237 {
11238 if (dp_op_sz)
11239 curr_insn_type = INSN_T1;
11240 else
11241 curr_insn_type = INSN_T2;
11242 }
11243 }
11244 /* Handle VSQRT. */
11245 else if (opc2 == 0x01 && opc3 == 0x03)
11246 {
11247 if (dp_op_sz)
11248 curr_insn_type = INSN_T1;
11249 else
11250 curr_insn_type = INSN_T2;
11251 }
11252 /* Handle VCVT. */
11253 else if (opc2 == 0x07 && opc3 == 0x03)
11254 {
11255 if (!dp_op_sz)
11256 curr_insn_type = INSN_T1;
11257 else
11258 curr_insn_type = INSN_T2;
11259 }
11260 else if (opc3 & 0x01)
11261 {
11262 /* Handle VCVT. */
11263 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
11264 {
11265 if (!bit (arm_insn_r->arm_insn, 18))
11266 curr_insn_type = INSN_T2;
11267 else
11268 {
11269 if (dp_op_sz)
11270 curr_insn_type = INSN_T1;
11271 else
11272 curr_insn_type = INSN_T2;
11273 }
11274 }
11275 /* Handle VCVT. */
11276 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
11277 {
11278 if (dp_op_sz)
11279 curr_insn_type = INSN_T1;
11280 else
11281 curr_insn_type = INSN_T2;
11282 }
11283 /* Handle VCVTB, VCVTT. */
11284 else if ((opc2 & 0x0e) == 0x02)
11285 curr_insn_type = INSN_T2;
11286 /* Handle VCMP, VCMPE. */
11287 else if ((opc2 & 0x0e) == 0x04)
11288 curr_insn_type = INSN_T3;
11289 }
11290 }
11291
11292 switch (curr_insn_type)
11293 {
11294 case INSN_T0:
11295 reg_vd = reg_vd | (bit_d << 4);
11296 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11297 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
11298 arm_insn_r->reg_rec_count = 2;
11299 break;
11300
11301 case INSN_T1:
11302 reg_vd = reg_vd | (bit_d << 4);
11303 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11304 arm_insn_r->reg_rec_count = 1;
11305 break;
11306
11307 case INSN_T2:
11308 reg_vd = (reg_vd << 1) | bit_d;
11309 record_buf[0] = reg_vd + ARM_D0_REGNUM;
11310 arm_insn_r->reg_rec_count = 1;
11311 break;
11312
11313 case INSN_T3:
11314 record_buf[0] = ARM_FPSCR_REGNUM;
11315 arm_insn_r->reg_rec_count = 1;
11316 break;
11317
11318 default:
11319 gdb_assert_not_reached ("no decoding pattern found");
11320 break;
11321 }
11322
11323 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11324 return 0;
11325}
11326
60cc5e93
OJ
11327/* Handling opcode 110 insns. */
11328
11329static int
11330arm_record_asimd_vfp_coproc (insn_decode_record *arm_insn_r)
11331{
11332 uint32_t op, op1, op1_sbit, op1_ebit, coproc;
11333
11334 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11335 op1 = bits (arm_insn_r->arm_insn, 20, 25);
11336 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11337
11338 if ((coproc & 0x0e) == 0x0a)
11339 {
11340 /* Handle extension register ld/st instructions. */
11341 if (!(op1 & 0x20))
f20f80dd 11342 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11343
11344 /* 64-bit transfers between arm core and extension registers. */
11345 if ((op1 & 0x3e) == 0x04)
f20f80dd 11346 return arm_record_exreg_ld_st_insn (arm_insn_r);
60cc5e93
OJ
11347 }
11348 else
11349 {
11350 /* Handle coprocessor ld/st instructions. */
11351 if (!(op1 & 0x3a))
11352 {
11353 /* Store. */
11354 if (!op1_ebit)
11355 return arm_record_unsupported_insn (arm_insn_r);
11356 else
11357 /* Load. */
11358 return arm_record_unsupported_insn (arm_insn_r);
11359 }
11360
11361 /* Move to coprocessor from two arm core registers. */
11362 if (op1 == 0x4)
11363 return arm_record_unsupported_insn (arm_insn_r);
11364
11365 /* Move to two arm core registers from coprocessor. */
11366 if (op1 == 0x5)
11367 {
11368 uint32_t reg_t[2];
11369
11370 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
11371 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
11372 arm_insn_r->reg_rec_count = 2;
11373
11374 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
11375 return 0;
11376 }
11377 }
11378 return arm_record_unsupported_insn (arm_insn_r);
11379}
11380
72508ac0
PO
11381/* Handling opcode 111 insns. */
11382
11383static int
11384arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11385{
60cc5e93 11386 uint32_t op, op1_sbit, op1_ebit, coproc;
72508ac0
PO
11387 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11388 struct regcache *reg_cache = arm_insn_r->regcache;
97dfe206 11389 ULONGEST u_regval = 0;
72508ac0
PO
11390
11391 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
60cc5e93
OJ
11392 coproc = bits (arm_insn_r->arm_insn, 8, 11);
11393 op1_sbit = bit (arm_insn_r->arm_insn, 24);
11394 op1_ebit = bit (arm_insn_r->arm_insn, 20);
11395 op = bit (arm_insn_r->arm_insn, 4);
97dfe206
OJ
11396
11397 /* Handle arm SWI/SVC system call instructions. */
60cc5e93 11398 if (op1_sbit)
97dfe206
OJ
11399 {
11400 if (tdep->arm_syscall_record != NULL)
11401 {
11402 ULONGEST svc_operand, svc_number;
11403
11404 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
11405
11406 if (svc_operand) /* OABI. */
11407 svc_number = svc_operand - 0x900000;
11408 else /* EABI. */
11409 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
11410
60cc5e93 11411 return tdep->arm_syscall_record (reg_cache, svc_number);
97dfe206
OJ
11412 }
11413 else
11414 {
11415 printf_unfiltered (_("no syscall record support\n"));
60cc5e93 11416 return -1;
97dfe206
OJ
11417 }
11418 }
60cc5e93
OJ
11419
11420 if ((coproc & 0x0e) == 0x0a)
11421 {
11422 /* VFP data-processing instructions. */
11423 if (!op1_sbit && !op)
851f26ae 11424 return arm_record_vfp_data_proc_insn (arm_insn_r);
60cc5e93
OJ
11425
11426 /* Advanced SIMD, VFP instructions. */
11427 if (!op1_sbit && op)
5a578da5 11428 return arm_record_vdata_transfer_insn (arm_insn_r);
60cc5e93 11429 }
97dfe206
OJ
11430 else
11431 {
60cc5e93
OJ
11432 /* Coprocessor data operations. */
11433 if (!op1_sbit && !op)
11434 return arm_record_unsupported_insn (arm_insn_r);
11435
11436 /* Move to Coprocessor from ARM core register. */
11437 if (!op1_sbit && !op1_ebit && op)
11438 return arm_record_unsupported_insn (arm_insn_r);
11439
11440 /* Move to arm core register from coprocessor. */
11441 if (!op1_sbit && op1_ebit && op)
11442 {
11443 uint32_t record_buf[1];
11444
11445 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11446 if (record_buf[0] == 15)
11447 record_buf[0] = ARM_PS_REGNUM;
11448
11449 arm_insn_r->reg_rec_count = 1;
11450 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
11451 record_buf);
11452 return 0;
11453 }
97dfe206 11454 }
72508ac0 11455
60cc5e93 11456 return arm_record_unsupported_insn (arm_insn_r);
72508ac0
PO
11457}
11458
11459/* Handling opcode 000 insns. */
11460
11461static int
11462thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11463{
11464 uint32_t record_buf[8];
11465 uint32_t reg_src1 = 0;
11466
11467 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11468
11469 record_buf[0] = ARM_PS_REGNUM;
11470 record_buf[1] = reg_src1;
11471 thumb_insn_r->reg_rec_count = 2;
11472
11473 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11474
11475 return 0;
11476}
11477
11478
11479/* Handling opcode 001 insns. */
11480
11481static int
11482thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11483{
11484 uint32_t record_buf[8];
11485 uint32_t reg_src1 = 0;
11486
11487 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11488
11489 record_buf[0] = ARM_PS_REGNUM;
11490 record_buf[1] = reg_src1;
11491 thumb_insn_r->reg_rec_count = 2;
11492
11493 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11494
11495 return 0;
11496}
11497
11498/* Handling opcode 010 insns. */
11499
11500static int
11501thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11502{
11503 struct regcache *reg_cache = thumb_insn_r->regcache;
11504 uint32_t record_buf[8], record_buf_mem[8];
11505
11506 uint32_t reg_src1 = 0, reg_src2 = 0;
11507 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11508
11509 ULONGEST u_regval[2] = {0};
11510
11511 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11512
11513 if (bit (thumb_insn_r->arm_insn, 12))
11514 {
11515 /* Handle load/store register offset. */
11516 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
11517 if (opcode2 >= 12 && opcode2 <= 15)
11518 {
11519 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11520 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11521 record_buf[0] = reg_src1;
11522 thumb_insn_r->reg_rec_count = 1;
11523 }
11524 else if (opcode2 >= 8 && opcode2 <= 10)
11525 {
11526 /* STR(2), STRB(2), STRH(2) . */
11527 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11528 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11529 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11530 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11531 if (8 == opcode2)
11532 record_buf_mem[0] = 4; /* STR (2). */
11533 else if (10 == opcode2)
11534 record_buf_mem[0] = 1; /* STRB (2). */
11535 else if (9 == opcode2)
11536 record_buf_mem[0] = 2; /* STRH (2). */
11537 record_buf_mem[1] = u_regval[0] + u_regval[1];
11538 thumb_insn_r->mem_rec_count = 1;
11539 }
11540 }
11541 else if (bit (thumb_insn_r->arm_insn, 11))
11542 {
11543 /* Handle load from literal pool. */
11544 /* LDR(3). */
11545 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11546 record_buf[0] = reg_src1;
11547 thumb_insn_r->reg_rec_count = 1;
11548 }
11549 else if (opcode1)
11550 {
11551 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11552 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11553 if ((3 == opcode2) && (!opcode3))
11554 {
11555 /* Branch with exchange. */
11556 record_buf[0] = ARM_PS_REGNUM;
11557 thumb_insn_r->reg_rec_count = 1;
11558 }
11559 else
11560 {
11561 /* Format 8; special data processing insns. */
11562 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11563 record_buf[0] = ARM_PS_REGNUM;
11564 record_buf[1] = reg_src1;
11565 thumb_insn_r->reg_rec_count = 2;
11566 }
11567 }
11568 else
11569 {
11570 /* Format 5; data processing insns. */
11571 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11572 if (bit (thumb_insn_r->arm_insn, 7))
11573 {
11574 reg_src1 = reg_src1 + 8;
11575 }
11576 record_buf[0] = ARM_PS_REGNUM;
11577 record_buf[1] = reg_src1;
11578 thumb_insn_r->reg_rec_count = 2;
11579 }
11580
11581 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11582 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11583 record_buf_mem);
11584
11585 return 0;
11586}
11587
11588/* Handling opcode 001 insns. */
11589
11590static int
11591thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11592{
11593 struct regcache *reg_cache = thumb_insn_r->regcache;
11594 uint32_t record_buf[8], record_buf_mem[8];
11595
11596 uint32_t reg_src1 = 0;
11597 uint32_t opcode = 0, immed_5 = 0;
11598
11599 ULONGEST u_regval = 0;
11600
11601 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11602
11603 if (opcode)
11604 {
11605 /* LDR(1). */
11606 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11607 record_buf[0] = reg_src1;
11608 thumb_insn_r->reg_rec_count = 1;
11609 }
11610 else
11611 {
11612 /* STR(1). */
11613 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11614 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11615 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11616 record_buf_mem[0] = 4;
11617 record_buf_mem[1] = u_regval + (immed_5 * 4);
11618 thumb_insn_r->mem_rec_count = 1;
11619 }
11620
11621 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11622 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11623 record_buf_mem);
11624
11625 return 0;
11626}
11627
11628/* Handling opcode 100 insns. */
11629
11630static int
11631thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
11632{
11633 struct regcache *reg_cache = thumb_insn_r->regcache;
11634 uint32_t record_buf[8], record_buf_mem[8];
11635
11636 uint32_t reg_src1 = 0;
11637 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
11638
11639 ULONGEST u_regval = 0;
11640
11641 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11642
11643 if (3 == opcode)
11644 {
11645 /* LDR(4). */
11646 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11647 record_buf[0] = reg_src1;
11648 thumb_insn_r->reg_rec_count = 1;
11649 }
11650 else if (1 == opcode)
11651 {
11652 /* LDRH(1). */
11653 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11654 record_buf[0] = reg_src1;
11655 thumb_insn_r->reg_rec_count = 1;
11656 }
11657 else if (2 == opcode)
11658 {
11659 /* STR(3). */
11660 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
11661 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
11662 record_buf_mem[0] = 4;
11663 record_buf_mem[1] = u_regval + (immed_8 * 4);
11664 thumb_insn_r->mem_rec_count = 1;
11665 }
11666 else if (0 == opcode)
11667 {
11668 /* STRH(1). */
11669 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11670 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11671 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11672 record_buf_mem[0] = 2;
11673 record_buf_mem[1] = u_regval + (immed_5 * 2);
11674 thumb_insn_r->mem_rec_count = 1;
11675 }
11676
11677 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11678 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11679 record_buf_mem);
11680
11681 return 0;
11682}
11683
11684/* Handling opcode 101 insns. */
11685
11686static int
11687thumb_record_misc (insn_decode_record *thumb_insn_r)
11688{
11689 struct regcache *reg_cache = thumb_insn_r->regcache;
11690
11691 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
11692 uint32_t register_bits = 0, register_count = 0;
11693 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
11694 uint32_t record_buf[24], record_buf_mem[48];
11695 uint32_t reg_src1;
11696
11697 ULONGEST u_regval = 0;
11698
11699 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11700 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11701 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
11702
11703 if (14 == opcode2)
11704 {
11705 /* POP. */
11706 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11707 while (register_bits)
f969241e
OJ
11708 {
11709 if (register_bits & 0x00000001)
11710 record_buf[index++] = register_count;
11711 register_bits = register_bits >> 1;
11712 register_count++;
11713 }
11714 record_buf[index++] = ARM_PS_REGNUM;
11715 record_buf[index++] = ARM_SP_REGNUM;
11716 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11717 }
11718 else if (10 == opcode2)
11719 {
11720 /* PUSH. */
11721 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
9904a494 11722 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
72508ac0
PO
11723 while (register_bits)
11724 {
11725 if (register_bits & 0x00000001)
11726 register_count++;
11727 register_bits = register_bits >> 1;
11728 }
11729 start_address = u_regval - \
11730 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
11731 thumb_insn_r->mem_rec_count = register_count;
11732 while (register_count)
11733 {
11734 record_buf_mem[(register_count * 2) - 1] = start_address;
11735 record_buf_mem[(register_count * 2) - 2] = 4;
11736 start_address = start_address + 4;
11737 register_count--;
11738 }
11739 record_buf[0] = ARM_SP_REGNUM;
11740 thumb_insn_r->reg_rec_count = 1;
11741 }
11742 else if (0x1E == opcode1)
11743 {
11744 /* BKPT insn. */
11745 /* Handle enhanced software breakpoint insn, BKPT. */
11746 /* CPSR is changed to be executed in ARM state, disabling normal
11747 interrupts, entering abort mode. */
11748 /* According to high vector configuration PC is set. */
11749 /* User hits breakpoint and type reverse, in that case, we need to go back with
11750 previous CPSR and Program Counter. */
11751 record_buf[0] = ARM_PS_REGNUM;
11752 record_buf[1] = ARM_LR_REGNUM;
11753 thumb_insn_r->reg_rec_count = 2;
11754 /* We need to save SPSR value, which is not yet done. */
11755 printf_unfiltered (_("Process record does not support instruction "
11756 "0x%0x at address %s.\n"),
11757 thumb_insn_r->arm_insn,
11758 paddress (thumb_insn_r->gdbarch,
11759 thumb_insn_r->this_addr));
11760 return -1;
11761 }
11762 else if ((0 == opcode) || (1 == opcode))
11763 {
11764 /* ADD(5), ADD(6). */
11765 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11766 record_buf[0] = reg_src1;
11767 thumb_insn_r->reg_rec_count = 1;
11768 }
11769 else if (2 == opcode)
11770 {
11771 /* ADD(7), SUB(4). */
11772 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11773 record_buf[0] = ARM_SP_REGNUM;
11774 thumb_insn_r->reg_rec_count = 1;
11775 }
11776
11777 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11778 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11779 record_buf_mem);
11780
11781 return 0;
11782}
11783
11784/* Handling opcode 110 insns. */
11785
11786static int
11787thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
11788{
11789 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
11790 struct regcache *reg_cache = thumb_insn_r->regcache;
11791
11792 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
11793 uint32_t reg_src1 = 0;
11794 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
11795 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
11796 uint32_t record_buf[24], record_buf_mem[48];
11797
11798 ULONGEST u_regval = 0;
11799
11800 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
11801 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
11802
11803 if (1 == opcode2)
11804 {
11805
11806 /* LDMIA. */
11807 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11808 /* Get Rn. */
11809 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11810 while (register_bits)
11811 {
11812 if (register_bits & 0x00000001)
f969241e 11813 record_buf[index++] = register_count;
72508ac0 11814 register_bits = register_bits >> 1;
f969241e 11815 register_count++;
72508ac0 11816 }
f969241e
OJ
11817 record_buf[index++] = reg_src1;
11818 thumb_insn_r->reg_rec_count = index;
72508ac0
PO
11819 }
11820 else if (0 == opcode2)
11821 {
11822 /* It handles both STMIA. */
11823 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
11824 /* Get Rn. */
11825 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11826 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11827 while (register_bits)
11828 {
11829 if (register_bits & 0x00000001)
11830 register_count++;
11831 register_bits = register_bits >> 1;
11832 }
11833 start_address = u_regval;
11834 thumb_insn_r->mem_rec_count = register_count;
11835 while (register_count)
11836 {
11837 record_buf_mem[(register_count * 2) - 1] = start_address;
11838 record_buf_mem[(register_count * 2) - 2] = 4;
11839 start_address = start_address + 4;
11840 register_count--;
11841 }
11842 }
11843 else if (0x1F == opcode1)
11844 {
11845 /* Handle arm syscall insn. */
97dfe206 11846 if (tdep->arm_syscall_record != NULL)
72508ac0 11847 {
97dfe206
OJ
11848 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
11849 ret = tdep->arm_syscall_record (reg_cache, u_regval);
72508ac0
PO
11850 }
11851 else
11852 {
11853 printf_unfiltered (_("no syscall record support\n"));
11854 return -1;
11855 }
11856 }
11857
11858 /* B (1), conditional branch is automatically taken care in process_record,
11859 as PC is saved there. */
11860
11861 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11862 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11863 record_buf_mem);
11864
11865 return ret;
11866}
11867
11868/* Handling opcode 111 insns. */
11869
11870static int
11871thumb_record_branch (insn_decode_record *thumb_insn_r)
11872{
11873 uint32_t record_buf[8];
11874 uint32_t bits_h = 0;
11875
11876 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
11877
11878 if (2 == bits_h || 3 == bits_h)
11879 {
11880 /* BL */
11881 record_buf[0] = ARM_LR_REGNUM;
11882 thumb_insn_r->reg_rec_count = 1;
11883 }
11884 else if (1 == bits_h)
11885 {
11886 /* BLX(1). */
11887 record_buf[0] = ARM_PS_REGNUM;
11888 record_buf[1] = ARM_LR_REGNUM;
11889 thumb_insn_r->reg_rec_count = 2;
11890 }
11891
11892 /* B(2) is automatically taken care in process_record, as PC is
11893 saved there. */
11894
11895 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11896
11897 return 0;
11898}
11899
c6ec2b30
OJ
11900/* Handler for thumb2 load/store multiple instructions. */
11901
11902static int
11903thumb2_record_ld_st_multiple (insn_decode_record *thumb2_insn_r)
11904{
11905 struct regcache *reg_cache = thumb2_insn_r->regcache;
11906
11907 uint32_t reg_rn, op;
11908 uint32_t register_bits = 0, register_count = 0;
11909 uint32_t index = 0, start_address = 0;
11910 uint32_t record_buf[24], record_buf_mem[48];
11911
11912 ULONGEST u_regval = 0;
11913
11914 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
11915 op = bits (thumb2_insn_r->arm_insn, 23, 24);
11916
11917 if (0 == op || 3 == op)
11918 {
11919 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11920 {
11921 /* Handle RFE instruction. */
11922 record_buf[0] = ARM_PS_REGNUM;
11923 thumb2_insn_r->reg_rec_count = 1;
11924 }
11925 else
11926 {
11927 /* Handle SRS instruction after reading banked SP. */
11928 return arm_record_unsupported_insn (thumb2_insn_r);
11929 }
11930 }
11931 else if (1 == op || 2 == op)
11932 {
11933 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11934 {
11935 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
11936 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11937 while (register_bits)
11938 {
11939 if (register_bits & 0x00000001)
11940 record_buf[index++] = register_count;
11941
11942 register_count++;
11943 register_bits = register_bits >> 1;
11944 }
11945 record_buf[index++] = reg_rn;
11946 record_buf[index++] = ARM_PS_REGNUM;
11947 thumb2_insn_r->reg_rec_count = index;
11948 }
11949 else
11950 {
11951 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
11952 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
11953 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
11954 while (register_bits)
11955 {
11956 if (register_bits & 0x00000001)
11957 register_count++;
11958
11959 register_bits = register_bits >> 1;
11960 }
11961
11962 if (1 == op)
11963 {
11964 /* Start address calculation for LDMDB/LDMEA. */
11965 start_address = u_regval;
11966 }
11967 else if (2 == op)
11968 {
11969 /* Start address calculation for LDMDB/LDMEA. */
11970 start_address = u_regval - register_count * 4;
11971 }
11972
11973 thumb2_insn_r->mem_rec_count = register_count;
11974 while (register_count)
11975 {
11976 record_buf_mem[register_count * 2 - 1] = start_address;
11977 record_buf_mem[register_count * 2 - 2] = 4;
11978 start_address = start_address + 4;
11979 register_count--;
11980 }
11981 record_buf[0] = reg_rn;
11982 record_buf[1] = ARM_PS_REGNUM;
11983 thumb2_insn_r->reg_rec_count = 2;
11984 }
11985 }
11986
11987 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
11988 record_buf_mem);
11989 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
11990 record_buf);
11991 return ARM_RECORD_SUCCESS;
11992}
11993
11994/* Handler for thumb2 load/store (dual/exclusive) and table branch
11995 instructions. */
11996
11997static int
11998thumb2_record_ld_st_dual_ex_tbb (insn_decode_record *thumb2_insn_r)
11999{
12000 struct regcache *reg_cache = thumb2_insn_r->regcache;
12001
12002 uint32_t reg_rd, reg_rn, offset_imm;
12003 uint32_t reg_dest1, reg_dest2;
12004 uint32_t address, offset_addr;
12005 uint32_t record_buf[8], record_buf_mem[8];
12006 uint32_t op1, op2, op3;
12007 LONGEST s_word;
12008
12009 ULONGEST u_regval[2];
12010
12011 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
12012 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
12013 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
12014
12015 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12016 {
12017 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
12018 {
12019 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
12020 record_buf[0] = reg_dest1;
12021 record_buf[1] = ARM_PS_REGNUM;
12022 thumb2_insn_r->reg_rec_count = 2;
12023 }
12024
12025 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
12026 {
12027 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12028 record_buf[2] = reg_dest2;
12029 thumb2_insn_r->reg_rec_count = 3;
12030 }
12031 }
12032 else
12033 {
12034 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12035 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12036
12037 if (0 == op1 && 0 == op2)
12038 {
12039 /* Handle STREX. */
12040 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12041 address = u_regval[0] + (offset_imm * 4);
12042 record_buf_mem[0] = 4;
12043 record_buf_mem[1] = address;
12044 thumb2_insn_r->mem_rec_count = 1;
12045 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12046 record_buf[0] = reg_rd;
12047 thumb2_insn_r->reg_rec_count = 1;
12048 }
12049 else if (1 == op1 && 0 == op2)
12050 {
12051 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
12052 record_buf[0] = reg_rd;
12053 thumb2_insn_r->reg_rec_count = 1;
12054 address = u_regval[0];
12055 record_buf_mem[1] = address;
12056
12057 if (4 == op3)
12058 {
12059 /* Handle STREXB. */
12060 record_buf_mem[0] = 1;
12061 thumb2_insn_r->mem_rec_count = 1;
12062 }
12063 else if (5 == op3)
12064 {
12065 /* Handle STREXH. */
12066 record_buf_mem[0] = 2 ;
12067 thumb2_insn_r->mem_rec_count = 1;
12068 }
12069 else if (7 == op3)
12070 {
12071 /* Handle STREXD. */
12072 address = u_regval[0];
12073 record_buf_mem[0] = 4;
12074 record_buf_mem[2] = 4;
12075 record_buf_mem[3] = address + 4;
12076 thumb2_insn_r->mem_rec_count = 2;
12077 }
12078 }
12079 else
12080 {
12081 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12082
12083 if (bit (thumb2_insn_r->arm_insn, 24))
12084 {
12085 if (bit (thumb2_insn_r->arm_insn, 23))
12086 offset_addr = u_regval[0] + (offset_imm * 4);
12087 else
12088 offset_addr = u_regval[0] - (offset_imm * 4);
12089
12090 address = offset_addr;
12091 }
12092 else
12093 address = u_regval[0];
12094
12095 record_buf_mem[0] = 4;
12096 record_buf_mem[1] = address;
12097 record_buf_mem[2] = 4;
12098 record_buf_mem[3] = address + 4;
12099 thumb2_insn_r->mem_rec_count = 2;
12100 record_buf[0] = reg_rn;
12101 thumb2_insn_r->reg_rec_count = 1;
12102 }
12103 }
12104
12105 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12106 record_buf);
12107 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12108 record_buf_mem);
12109 return ARM_RECORD_SUCCESS;
12110}
12111
12112/* Handler for thumb2 data processing (shift register and modified immediate)
12113 instructions. */
12114
12115static int
12116thumb2_record_data_proc_sreg_mimm (insn_decode_record *thumb2_insn_r)
12117{
12118 uint32_t reg_rd, op;
12119 uint32_t record_buf[8];
12120
12121 op = bits (thumb2_insn_r->arm_insn, 21, 24);
12122 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12123
12124 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
12125 {
12126 record_buf[0] = ARM_PS_REGNUM;
12127 thumb2_insn_r->reg_rec_count = 1;
12128 }
12129 else
12130 {
12131 record_buf[0] = reg_rd;
12132 record_buf[1] = ARM_PS_REGNUM;
12133 thumb2_insn_r->reg_rec_count = 2;
12134 }
12135
12136 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12137 record_buf);
12138 return ARM_RECORD_SUCCESS;
12139}
12140
12141/* Generic handler for thumb2 instructions which effect destination and PS
12142 registers. */
12143
12144static int
12145thumb2_record_ps_dest_generic (insn_decode_record *thumb2_insn_r)
12146{
12147 uint32_t reg_rd;
12148 uint32_t record_buf[8];
12149
12150 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
12151
12152 record_buf[0] = reg_rd;
12153 record_buf[1] = ARM_PS_REGNUM;
12154 thumb2_insn_r->reg_rec_count = 2;
12155
12156 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12157 record_buf);
12158 return ARM_RECORD_SUCCESS;
12159}
12160
12161/* Handler for thumb2 branch and miscellaneous control instructions. */
12162
12163static int
12164thumb2_record_branch_misc_cntrl (insn_decode_record *thumb2_insn_r)
12165{
12166 uint32_t op, op1, op2;
12167 uint32_t record_buf[8];
12168
12169 op = bits (thumb2_insn_r->arm_insn, 20, 26);
12170 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
12171 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
12172
12173 /* Handle MSR insn. */
12174 if (!(op1 & 0x2) && 0x38 == op)
12175 {
12176 if (!(op2 & 0x3))
12177 {
12178 /* CPSR is going to be changed. */
12179 record_buf[0] = ARM_PS_REGNUM;
12180 thumb2_insn_r->reg_rec_count = 1;
12181 }
12182 else
12183 {
12184 arm_record_unsupported_insn(thumb2_insn_r);
12185 return -1;
12186 }
12187 }
12188 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
12189 {
12190 /* BLX. */
12191 record_buf[0] = ARM_PS_REGNUM;
12192 record_buf[1] = ARM_LR_REGNUM;
12193 thumb2_insn_r->reg_rec_count = 2;
12194 }
12195
12196 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12197 record_buf);
12198 return ARM_RECORD_SUCCESS;
12199}
12200
12201/* Handler for thumb2 store single data item instructions. */
12202
12203static int
12204thumb2_record_str_single_data (insn_decode_record *thumb2_insn_r)
12205{
12206 struct regcache *reg_cache = thumb2_insn_r->regcache;
12207
12208 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
12209 uint32_t address, offset_addr;
12210 uint32_t record_buf[8], record_buf_mem[8];
12211 uint32_t op1, op2;
12212
12213 ULONGEST u_regval[2];
12214
12215 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
12216 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
12217 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12218 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
12219
12220 if (bit (thumb2_insn_r->arm_insn, 23))
12221 {
12222 /* T2 encoding. */
12223 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
12224 offset_addr = u_regval[0] + offset_imm;
12225 address = offset_addr;
12226 }
12227 else
12228 {
12229 /* T3 encoding. */
12230 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
12231 {
12232 /* Handle STRB (register). */
12233 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
12234 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
12235 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
12236 offset_addr = u_regval[1] << shift_imm;
12237 address = u_regval[0] + offset_addr;
12238 }
12239 else
12240 {
12241 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
12242 if (bit (thumb2_insn_r->arm_insn, 10))
12243 {
12244 if (bit (thumb2_insn_r->arm_insn, 9))
12245 offset_addr = u_regval[0] + offset_imm;
12246 else
12247 offset_addr = u_regval[0] - offset_imm;
12248
12249 address = offset_addr;
12250 }
12251 else
12252 address = u_regval[0];
12253 }
12254 }
12255
12256 switch (op1)
12257 {
12258 /* Store byte instructions. */
12259 case 4:
12260 case 0:
12261 record_buf_mem[0] = 1;
12262 break;
12263 /* Store half word instructions. */
12264 case 1:
12265 case 5:
12266 record_buf_mem[0] = 2;
12267 break;
12268 /* Store word instructions. */
12269 case 2:
12270 case 6:
12271 record_buf_mem[0] = 4;
12272 break;
12273
12274 default:
12275 gdb_assert_not_reached ("no decoding pattern found");
12276 break;
12277 }
12278
12279 record_buf_mem[1] = address;
12280 thumb2_insn_r->mem_rec_count = 1;
12281 record_buf[0] = reg_rn;
12282 thumb2_insn_r->reg_rec_count = 1;
12283
12284 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12285 record_buf);
12286 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12287 record_buf_mem);
12288 return ARM_RECORD_SUCCESS;
12289}
12290
12291/* Handler for thumb2 load memory hints instructions. */
12292
12293static int
12294thumb2_record_ld_mem_hints (insn_decode_record *thumb2_insn_r)
12295{
12296 uint32_t record_buf[8];
12297 uint32_t reg_rt, reg_rn;
12298
12299 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
12300 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12301
12302 if (ARM_PC_REGNUM != reg_rt)
12303 {
12304 record_buf[0] = reg_rt;
12305 record_buf[1] = reg_rn;
12306 record_buf[2] = ARM_PS_REGNUM;
12307 thumb2_insn_r->reg_rec_count = 3;
12308
12309 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12310 record_buf);
12311 return ARM_RECORD_SUCCESS;
12312 }
12313
12314 return ARM_RECORD_FAILURE;
12315}
12316
12317/* Handler for thumb2 load word instructions. */
12318
12319static int
12320thumb2_record_ld_word (insn_decode_record *thumb2_insn_r)
12321{
12322 uint32_t opcode1 = 0, opcode2 = 0;
12323 uint32_t record_buf[8];
12324
12325 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
12326 record_buf[1] = ARM_PS_REGNUM;
12327 thumb2_insn_r->reg_rec_count = 2;
12328
12329 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12330 record_buf);
12331 return ARM_RECORD_SUCCESS;
12332}
12333
12334/* Handler for thumb2 long multiply, long multiply accumulate, and
12335 divide instructions. */
12336
12337static int
12338thumb2_record_lmul_lmla_div (insn_decode_record *thumb2_insn_r)
12339{
12340 uint32_t opcode1 = 0, opcode2 = 0;
12341 uint32_t record_buf[8];
12342 uint32_t reg_src1 = 0;
12343
12344 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
12345 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
12346
12347 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
12348 {
12349 /* Handle SMULL, UMULL, SMULAL. */
12350 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
12351 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12352 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12353 record_buf[2] = ARM_PS_REGNUM;
12354 thumb2_insn_r->reg_rec_count = 3;
12355 }
12356 else if (1 == opcode1 || 3 == opcode2)
12357 {
12358 /* Handle SDIV and UDIV. */
12359 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
12360 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
12361 record_buf[2] = ARM_PS_REGNUM;
12362 thumb2_insn_r->reg_rec_count = 3;
12363 }
12364 else
12365 return ARM_RECORD_FAILURE;
12366
12367 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12368 record_buf);
12369 return ARM_RECORD_SUCCESS;
12370}
12371
60cc5e93
OJ
12372/* Record handler for thumb32 coprocessor instructions. */
12373
12374static int
12375thumb2_record_coproc_insn (insn_decode_record *thumb2_insn_r)
12376{
12377 if (bit (thumb2_insn_r->arm_insn, 25))
12378 return arm_record_coproc_data_proc (thumb2_insn_r);
12379 else
12380 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
12381}
12382
1e1b6563
OJ
12383/* Record handler for advance SIMD structure load/store instructions. */
12384
12385static int
12386thumb2_record_asimd_struct_ld_st (insn_decode_record *thumb2_insn_r)
12387{
12388 struct regcache *reg_cache = thumb2_insn_r->regcache;
12389 uint32_t l_bit, a_bit, b_bits;
12390 uint32_t record_buf[128], record_buf_mem[128];
12391 uint32_t reg_rn, reg_vd, address, f_esize, f_elem;
12392 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
12393 uint8_t f_ebytes;
12394
12395 l_bit = bit (thumb2_insn_r->arm_insn, 21);
12396 a_bit = bit (thumb2_insn_r->arm_insn, 23);
12397 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
12398 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
12399 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
12400 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
12401 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
12402 f_esize = 8 * f_ebytes;
12403 f_elem = 8 / f_ebytes;
12404
12405 if (!l_bit)
12406 {
12407 ULONGEST u_regval = 0;
12408 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12409 address = u_regval;
12410
12411 if (!a_bit)
12412 {
12413 /* Handle VST1. */
12414 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12415 {
12416 if (b_bits == 0x07)
12417 bf_regs = 1;
12418 else if (b_bits == 0x0a)
12419 bf_regs = 2;
12420 else if (b_bits == 0x06)
12421 bf_regs = 3;
12422 else if (b_bits == 0x02)
12423 bf_regs = 4;
12424 else
12425 bf_regs = 0;
12426
12427 for (index_r = 0; index_r < bf_regs; index_r++)
12428 {
12429 for (index_e = 0; index_e < f_elem; index_e++)
12430 {
12431 record_buf_mem[index_m++] = f_ebytes;
12432 record_buf_mem[index_m++] = address;
12433 address = address + f_ebytes;
12434 thumb2_insn_r->mem_rec_count += 1;
12435 }
12436 }
12437 }
12438 /* Handle VST2. */
12439 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12440 {
12441 if (b_bits == 0x09 || b_bits == 0x08)
12442 bf_regs = 1;
12443 else if (b_bits == 0x03)
12444 bf_regs = 2;
12445 else
12446 bf_regs = 0;
12447
12448 for (index_r = 0; index_r < bf_regs; index_r++)
12449 for (index_e = 0; index_e < f_elem; index_e++)
12450 {
12451 for (loop_t = 0; loop_t < 2; loop_t++)
12452 {
12453 record_buf_mem[index_m++] = f_ebytes;
12454 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12455 thumb2_insn_r->mem_rec_count += 1;
12456 }
12457 address = address + (2 * f_ebytes);
12458 }
12459 }
12460 /* Handle VST3. */
12461 else if ((b_bits & 0x0e) == 0x04)
12462 {
12463 for (index_e = 0; index_e < f_elem; index_e++)
12464 {
12465 for (loop_t = 0; loop_t < 3; loop_t++)
12466 {
12467 record_buf_mem[index_m++] = f_ebytes;
12468 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12469 thumb2_insn_r->mem_rec_count += 1;
12470 }
12471 address = address + (3 * f_ebytes);
12472 }
12473 }
12474 /* Handle VST4. */
12475 else if (!(b_bits & 0x0e))
12476 {
12477 for (index_e = 0; index_e < f_elem; index_e++)
12478 {
12479 for (loop_t = 0; loop_t < 4; loop_t++)
12480 {
12481 record_buf_mem[index_m++] = f_ebytes;
12482 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
12483 thumb2_insn_r->mem_rec_count += 1;
12484 }
12485 address = address + (4 * f_ebytes);
12486 }
12487 }
12488 }
12489 else
12490 {
12491 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
12492
12493 if (bft_size == 0x00)
12494 f_ebytes = 1;
12495 else if (bft_size == 0x01)
12496 f_ebytes = 2;
12497 else if (bft_size == 0x02)
12498 f_ebytes = 4;
12499 else
12500 f_ebytes = 0;
12501
12502 /* Handle VST1. */
12503 if (!(b_bits & 0x0b) || b_bits == 0x08)
12504 thumb2_insn_r->mem_rec_count = 1;
12505 /* Handle VST2. */
12506 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
12507 thumb2_insn_r->mem_rec_count = 2;
12508 /* Handle VST3. */
12509 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
12510 thumb2_insn_r->mem_rec_count = 3;
12511 /* Handle VST4. */
12512 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
12513 thumb2_insn_r->mem_rec_count = 4;
12514
12515 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
12516 {
12517 record_buf_mem[index_m] = f_ebytes;
12518 record_buf_mem[index_m] = address + (index_m * f_ebytes);
12519 }
12520 }
12521 }
12522 else
12523 {
12524 if (!a_bit)
12525 {
12526 /* Handle VLD1. */
12527 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
12528 thumb2_insn_r->reg_rec_count = 1;
12529 /* Handle VLD2. */
12530 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
12531 thumb2_insn_r->reg_rec_count = 2;
12532 /* Handle VLD3. */
12533 else if ((b_bits & 0x0e) == 0x04)
12534 thumb2_insn_r->reg_rec_count = 3;
12535 /* Handle VLD4. */
12536 else if (!(b_bits & 0x0e))
12537 thumb2_insn_r->reg_rec_count = 4;
12538 }
12539 else
12540 {
12541 /* Handle VLD1. */
12542 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
12543 thumb2_insn_r->reg_rec_count = 1;
12544 /* Handle VLD2. */
12545 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
12546 thumb2_insn_r->reg_rec_count = 2;
12547 /* Handle VLD3. */
12548 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
12549 thumb2_insn_r->reg_rec_count = 3;
12550 /* Handle VLD4. */
12551 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
12552 thumb2_insn_r->reg_rec_count = 4;
12553
12554 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
12555 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
12556 }
12557 }
12558
12559 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
12560 {
12561 record_buf[index_r] = reg_rn;
12562 thumb2_insn_r->reg_rec_count += 1;
12563 }
12564
12565 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
12566 record_buf);
12567 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
12568 record_buf_mem);
12569 return 0;
12570}
12571
c6ec2b30
OJ
12572/* Decodes thumb2 instruction type and invokes its record handler. */
12573
12574static unsigned int
12575thumb2_record_decode_insn_handler (insn_decode_record *thumb2_insn_r)
12576{
12577 uint32_t op, op1, op2;
12578
12579 op = bit (thumb2_insn_r->arm_insn, 15);
12580 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
12581 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
12582
12583 if (op1 == 0x01)
12584 {
12585 if (!(op2 & 0x64 ))
12586 {
12587 /* Load/store multiple instruction. */
12588 return thumb2_record_ld_st_multiple (thumb2_insn_r);
12589 }
12590 else if (!((op2 & 0x64) ^ 0x04))
12591 {
12592 /* Load/store (dual/exclusive) and table branch instruction. */
12593 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
12594 }
12595 else if (!((op2 & 0x20) ^ 0x20))
12596 {
12597 /* Data-processing (shifted register). */
12598 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12599 }
12600 else if (op2 & 0x40)
12601 {
12602 /* Co-processor instructions. */
60cc5e93 12603 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12604 }
12605 }
12606 else if (op1 == 0x02)
12607 {
12608 if (op)
12609 {
12610 /* Branches and miscellaneous control instructions. */
12611 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
12612 }
12613 else if (op2 & 0x20)
12614 {
12615 /* Data-processing (plain binary immediate) instruction. */
12616 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12617 }
12618 else
12619 {
12620 /* Data-processing (modified immediate). */
12621 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
12622 }
12623 }
12624 else if (op1 == 0x03)
12625 {
12626 if (!(op2 & 0x71 ))
12627 {
12628 /* Store single data item. */
12629 return thumb2_record_str_single_data (thumb2_insn_r);
12630 }
12631 else if (!((op2 & 0x71) ^ 0x10))
12632 {
12633 /* Advanced SIMD or structure load/store instructions. */
1e1b6563 12634 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
c6ec2b30
OJ
12635 }
12636 else if (!((op2 & 0x67) ^ 0x01))
12637 {
12638 /* Load byte, memory hints instruction. */
12639 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12640 }
12641 else if (!((op2 & 0x67) ^ 0x03))
12642 {
12643 /* Load halfword, memory hints instruction. */
12644 return thumb2_record_ld_mem_hints (thumb2_insn_r);
12645 }
12646 else if (!((op2 & 0x67) ^ 0x05))
12647 {
12648 /* Load word instruction. */
12649 return thumb2_record_ld_word (thumb2_insn_r);
12650 }
12651 else if (!((op2 & 0x70) ^ 0x20))
12652 {
12653 /* Data-processing (register) instruction. */
12654 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12655 }
12656 else if (!((op2 & 0x78) ^ 0x30))
12657 {
12658 /* Multiply, multiply accumulate, abs diff instruction. */
12659 return thumb2_record_ps_dest_generic (thumb2_insn_r);
12660 }
12661 else if (!((op2 & 0x78) ^ 0x38))
12662 {
12663 /* Long multiply, long multiply accumulate, and divide. */
12664 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
12665 }
12666 else if (op2 & 0x40)
12667 {
12668 /* Co-processor instructions. */
60cc5e93 12669 return thumb2_record_coproc_insn (thumb2_insn_r);
c6ec2b30
OJ
12670 }
12671 }
12672
12673 return -1;
12674}
72508ac0
PO
12675
12676/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12677and positive val on fauilure. */
12678
12679static int
12680extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
12681{
12682 gdb_byte buf[insn_size];
12683
12684 memset (&buf[0], 0, insn_size);
12685
12686 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
12687 return 1;
12688 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12689 insn_size,
2959fed9 12690 gdbarch_byte_order_for_code (insn_record->gdbarch));
72508ac0
PO
12691 return 0;
12692}
12693
12694typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12695
12696/* Decode arm/thumb insn depending on condition cods and opcodes; and
12697 dispatch it. */
12698
12699static int
12700decode_insn (insn_decode_record *arm_record, record_type_t record_type,
12701 uint32_t insn_size)
12702{
12703
12704 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
0fa9c223 12705 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
72508ac0
PO
12706 {
12707 arm_record_data_proc_misc_ld_str, /* 000. */
12708 arm_record_data_proc_imm, /* 001. */
12709 arm_record_ld_st_imm_offset, /* 010. */
12710 arm_record_ld_st_reg_offset, /* 011. */
12711 arm_record_ld_st_multiple, /* 100. */
12712 arm_record_b_bl, /* 101. */
60cc5e93 12713 arm_record_asimd_vfp_coproc, /* 110. */
72508ac0
PO
12714 arm_record_coproc_data_proc /* 111. */
12715 };
12716
12717 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
0fa9c223 12718 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
72508ac0
PO
12719 { \
12720 thumb_record_shift_add_sub, /* 000. */
12721 thumb_record_add_sub_cmp_mov, /* 001. */
12722 thumb_record_ld_st_reg_offset, /* 010. */
12723 thumb_record_ld_st_imm_offset, /* 011. */
12724 thumb_record_ld_st_stack, /* 100. */
12725 thumb_record_misc, /* 101. */
12726 thumb_record_ldm_stm_swi, /* 110. */
12727 thumb_record_branch /* 111. */
12728 };
12729
12730 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12731 uint32_t insn_id = 0;
12732
12733 if (extract_arm_insn (arm_record, insn_size))
12734 {
12735 if (record_debug)
12736 {
12737 printf_unfiltered (_("Process record: error reading memory at "
12738 "addr %s len = %d.\n"),
12739 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
12740 }
12741 return -1;
12742 }
12743 else if (ARM_RECORD == record_type)
12744 {
12745 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
12746 insn_id = bits (arm_record->arm_insn, 25, 27);
12747 ret = arm_record_extension_space (arm_record);
12748 /* If this insn has fallen into extension space
12749 then we need not decode it anymore. */
12750 if (ret != -1 && !INSN_RECORDED(arm_record))
12751 {
12752 ret = arm_handle_insn[insn_id] (arm_record);
12753 }
12754 }
12755 else if (THUMB_RECORD == record_type)
12756 {
12757 /* As thumb does not have condition codes, we set negative. */
12758 arm_record->cond = -1;
12759 insn_id = bits (arm_record->arm_insn, 13, 15);
12760 ret = thumb_handle_insn[insn_id] (arm_record);
12761 }
12762 else if (THUMB2_RECORD == record_type)
12763 {
c6ec2b30
OJ
12764 /* As thumb does not have condition codes, we set negative. */
12765 arm_record->cond = -1;
12766
12767 /* Swap first half of 32bit thumb instruction with second half. */
12768 arm_record->arm_insn
12769 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
12770
12771 insn_id = thumb2_record_decode_insn_handler (arm_record);
12772
12773 if (insn_id != ARM_RECORD_SUCCESS)
12774 {
12775 arm_record_unsupported_insn (arm_record);
12776 ret = -1;
12777 }
72508ac0
PO
12778 }
12779 else
12780 {
12781 /* Throw assertion. */
12782 gdb_assert_not_reached ("not a valid instruction, could not decode");
12783 }
12784
12785 return ret;
12786}
12787
12788
12789/* Cleans up local record registers and memory allocations. */
12790
12791static void
12792deallocate_reg_mem (insn_decode_record *record)
12793{
12794 xfree (record->arm_regs);
12795 xfree (record->arm_mems);
12796}
12797
12798
12799/* Parse the current instruction and record the values of the registers and
12800 memory that will be changed in current instruction to record_arch_list".
12801 Return -1 if something is wrong. */
12802
12803int
12804arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
12805 CORE_ADDR insn_addr)
12806{
12807
12808 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
12809 uint32_t no_of_rec = 0;
12810 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
12811 ULONGEST t_bit = 0, insn_id = 0;
12812
12813 ULONGEST u_regval = 0;
12814
12815 insn_decode_record arm_record;
12816
12817 memset (&arm_record, 0, sizeof (insn_decode_record));
12818 arm_record.regcache = regcache;
12819 arm_record.this_addr = insn_addr;
12820 arm_record.gdbarch = gdbarch;
12821
12822
12823 if (record_debug > 1)
12824 {
12825 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
12826 "addr = %s\n",
12827 paddress (gdbarch, arm_record.this_addr));
12828 }
12829
12830 if (extract_arm_insn (&arm_record, 2))
12831 {
12832 if (record_debug)
12833 {
12834 printf_unfiltered (_("Process record: error reading memory at "
12835 "addr %s len = %d.\n"),
12836 paddress (arm_record.gdbarch,
12837 arm_record.this_addr), 2);
12838 }
12839 return -1;
12840 }
12841
12842 /* Check the insn, whether it is thumb or arm one. */
12843
12844 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
12845 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
12846
12847
12848 if (!(u_regval & t_bit))
12849 {
12850 /* We are decoding arm insn. */
12851 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
12852 }
12853 else
12854 {
12855 insn_id = bits (arm_record.arm_insn, 11, 15);
12856 /* is it thumb2 insn? */
12857 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
12858 {
12859 ret = decode_insn (&arm_record, THUMB2_RECORD,
12860 THUMB2_INSN_SIZE_BYTES);
12861 }
12862 else
12863 {
12864 /* We are decoding thumb insn. */
12865 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
12866 }
12867 }
12868
12869 if (0 == ret)
12870 {
12871 /* Record registers. */
25ea693b 12872 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
72508ac0
PO
12873 if (arm_record.arm_regs)
12874 {
12875 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
12876 {
25ea693b
MM
12877 if (record_full_arch_list_add_reg
12878 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
72508ac0
PO
12879 ret = -1;
12880 }
12881 }
12882 /* Record memories. */
12883 if (arm_record.arm_mems)
12884 {
12885 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
12886 {
25ea693b 12887 if (record_full_arch_list_add_mem
72508ac0 12888 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
25ea693b 12889 arm_record.arm_mems[no_of_rec].len))
72508ac0
PO
12890 ret = -1;
12891 }
12892 }
12893
25ea693b 12894 if (record_full_arch_list_add_end ())
72508ac0
PO
12895 ret = -1;
12896 }
12897
12898
12899 deallocate_reg_mem (&arm_record);
12900
12901 return ret;
12902}
12903
This page took 1.727687 seconds and 4 git commands to generate.