* ldlang.c (load_symbols): Close file and set flags.loaded
[deliverable/binutils-gdb.git] / gdb / arm-tdep.c
CommitLineData
ed9a39eb 1/* Common target dependent code for GDB on ARM systems.
0fd88904 2
0b302171
JB
3 Copyright (C) 1988-1989, 1991-1993, 1995-1996, 1998-2012 Free
4 Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 20
0963b4bd 21#include <ctype.h> /* XXX for isupper (). */
34e8f22d 22
c906108c
SS
23#include "defs.h"
24#include "frame.h"
25#include "inferior.h"
26#include "gdbcmd.h"
27#include "gdbcore.h"
c906108c 28#include "gdb_string.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
RE
47
48#include "arm-tdep.h"
26216b98 49#include "gdb/sim-arm.h"
34e8f22d 50
082fc60d
RE
51#include "elf-bfd.h"
52#include "coff/internal.h"
97e03143 53#include "elf/arm.h"
c906108c 54
26216b98 55#include "gdb_assert.h"
60c5725c 56#include "vec.h"
26216b98 57
72508ac0
PO
58#include "record.h"
59
9779414d 60#include "features/arm-with-m.c"
25f8c692 61#include "features/arm-with-m-fpa-layout.c"
3184d3f9 62#include "features/arm-with-m-vfp-d16.c"
ef7e8358
UW
63#include "features/arm-with-iwmmxt.c"
64#include "features/arm-with-vfpv2.c"
65#include "features/arm-with-vfpv3.c"
66#include "features/arm-with-neon.c"
9779414d 67
6529d2dd
AC
68static int arm_debug;
69
082fc60d
RE
70/* Macros for setting and testing a bit in a minimal symbol that marks
71 it as Thumb function. The MSB of the minimal symbol's "info" field
f594e5e9 72 is used for this purpose.
082fc60d
RE
73
74 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
f594e5e9 75 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
082fc60d 76
0963b4bd 77#define MSYMBOL_SET_SPECIAL(msym) \
b887350f 78 MSYMBOL_TARGET_FLAG_1 (msym) = 1
082fc60d
RE
79
80#define MSYMBOL_IS_SPECIAL(msym) \
b887350f 81 MSYMBOL_TARGET_FLAG_1 (msym)
082fc60d 82
60c5725c
DJ
83/* Per-objfile data used for mapping symbols. */
84static const struct objfile_data *arm_objfile_data_key;
85
86struct arm_mapping_symbol
87{
88 bfd_vma value;
89 char type;
90};
91typedef struct arm_mapping_symbol arm_mapping_symbol_s;
92DEF_VEC_O(arm_mapping_symbol_s);
93
94struct arm_per_objfile
95{
96 VEC(arm_mapping_symbol_s) **section_maps;
97};
98
afd7eef0
RE
99/* The list of available "set arm ..." and "show arm ..." commands. */
100static struct cmd_list_element *setarmcmdlist = NULL;
101static struct cmd_list_element *showarmcmdlist = NULL;
102
fd50bc42
RE
103/* The type of floating-point to use. Keep this in sync with enum
104 arm_float_model, and the help string in _initialize_arm_tdep. */
40478521 105static const char *const fp_model_strings[] =
fd50bc42
RE
106{
107 "auto",
108 "softfpa",
109 "fpa",
110 "softvfp",
28e97307
DJ
111 "vfp",
112 NULL
fd50bc42
RE
113};
114
115/* A variable that can be configured by the user. */
116static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
117static const char *current_fp_model = "auto";
118
28e97307 119/* The ABI to use. Keep this in sync with arm_abi_kind. */
40478521 120static const char *const arm_abi_strings[] =
28e97307
DJ
121{
122 "auto",
123 "APCS",
124 "AAPCS",
125 NULL
126};
127
128/* A variable that can be configured by the user. */
129static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
130static const char *arm_abi_string = "auto";
131
0428b8f5 132/* The execution mode to assume. */
40478521 133static const char *const arm_mode_strings[] =
0428b8f5
DJ
134 {
135 "auto",
136 "arm",
68770265
MGD
137 "thumb",
138 NULL
0428b8f5
DJ
139 };
140
141static const char *arm_fallback_mode_string = "auto";
142static const char *arm_force_mode_string = "auto";
143
18819fa6
UW
144/* Internal override of the execution mode. -1 means no override,
145 0 means override to ARM mode, 1 means override to Thumb mode.
146 The effect is the same as if arm_force_mode has been set by the
147 user (except the internal override has precedence over a user's
148 arm_force_mode override). */
149static int arm_override_mode = -1;
150
94c30b78 151/* Number of different reg name sets (options). */
afd7eef0 152static int num_disassembly_options;
bc90b915 153
f32bf4a4
YQ
154/* The standard register names, and all the valid aliases for them. Note
155 that `fp', `sp' and `pc' are not added in this alias list, because they
156 have been added as builtin user registers in
157 std-regs.c:_initialize_frame_reg. */
123dc839
DJ
158static const struct
159{
160 const char *name;
161 int regnum;
162} arm_register_aliases[] = {
163 /* Basic register numbers. */
164 { "r0", 0 },
165 { "r1", 1 },
166 { "r2", 2 },
167 { "r3", 3 },
168 { "r4", 4 },
169 { "r5", 5 },
170 { "r6", 6 },
171 { "r7", 7 },
172 { "r8", 8 },
173 { "r9", 9 },
174 { "r10", 10 },
175 { "r11", 11 },
176 { "r12", 12 },
177 { "r13", 13 },
178 { "r14", 14 },
179 { "r15", 15 },
180 /* Synonyms (argument and variable registers). */
181 { "a1", 0 },
182 { "a2", 1 },
183 { "a3", 2 },
184 { "a4", 3 },
185 { "v1", 4 },
186 { "v2", 5 },
187 { "v3", 6 },
188 { "v4", 7 },
189 { "v5", 8 },
190 { "v6", 9 },
191 { "v7", 10 },
192 { "v8", 11 },
193 /* Other platform-specific names for r9. */
194 { "sb", 9 },
195 { "tr", 9 },
196 /* Special names. */
197 { "ip", 12 },
123dc839 198 { "lr", 14 },
123dc839
DJ
199 /* Names used by GCC (not listed in the ARM EABI). */
200 { "sl", 10 },
123dc839
DJ
201 /* A special name from the older ATPCS. */
202 { "wr", 7 },
203};
bc90b915 204
123dc839 205static const char *const arm_register_names[] =
da59e081
JM
206{"r0", "r1", "r2", "r3", /* 0 1 2 3 */
207 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
208 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
209 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
210 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
211 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
94c30b78 212 "fps", "cpsr" }; /* 24 25 */
ed9a39eb 213
afd7eef0
RE
214/* Valid register name styles. */
215static const char **valid_disassembly_styles;
ed9a39eb 216
afd7eef0
RE
217/* Disassembly style to use. Default to "std" register names. */
218static const char *disassembly_style;
96baa820 219
ed9a39eb 220/* This is used to keep the bfd arch_info in sync with the disassembly
afd7eef0
RE
221 style. */
222static void set_disassembly_style_sfunc(char *, int,
ed9a39eb 223 struct cmd_list_element *);
afd7eef0 224static void set_disassembly_style (void);
ed9a39eb 225
b508a996 226static void convert_from_extended (const struct floatformat *, const void *,
be8626e0 227 void *, int);
b508a996 228static void convert_to_extended (const struct floatformat *, void *,
be8626e0 229 const void *, int);
ed9a39eb 230
05d1431c
PA
231static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
232 struct regcache *regcache,
233 int regnum, gdb_byte *buf);
58d6951d
DJ
234static void arm_neon_quad_write (struct gdbarch *gdbarch,
235 struct regcache *regcache,
236 int regnum, const gdb_byte *buf);
237
db24da6d
YQ
238static int thumb_insn_size (unsigned short inst1);
239
9b8d791a 240struct arm_prologue_cache
c3b4394c 241{
eb5492fa
DJ
242 /* The stack pointer at the time this frame was created; i.e. the
243 caller's stack pointer when this function was called. It is used
244 to identify this frame. */
245 CORE_ADDR prev_sp;
246
4be43953
DJ
247 /* The frame base for this frame is just prev_sp - frame size.
248 FRAMESIZE is the distance from the frame pointer to the
249 initial stack pointer. */
eb5492fa 250
c3b4394c 251 int framesize;
eb5492fa
DJ
252
253 /* The register used to hold the frame pointer for this frame. */
c3b4394c 254 int framereg;
eb5492fa
DJ
255
256 /* Saved register offsets. */
257 struct trad_frame_saved_reg *saved_regs;
c3b4394c 258};
ed9a39eb 259
0d39a070
DJ
260static CORE_ADDR arm_analyze_prologue (struct gdbarch *gdbarch,
261 CORE_ADDR prologue_start,
262 CORE_ADDR prologue_end,
263 struct arm_prologue_cache *cache);
264
cca44b1b
JB
265/* Architecture version for displaced stepping. This effects the behaviour of
266 certain instructions, and really should not be hard-wired. */
267
268#define DISPLACED_STEPPING_ARCH_VERSION 5
269
bc90b915
FN
270/* Addresses for calling Thumb functions have the bit 0 set.
271 Here are some macros to test, set, or clear bit 0 of addresses. */
272#define IS_THUMB_ADDR(addr) ((addr) & 1)
273#define MAKE_THUMB_ADDR(addr) ((addr) | 1)
274#define UNMAKE_THUMB_ADDR(addr) ((addr) & ~1)
275
94c30b78 276/* Set to true if the 32-bit mode is in use. */
c906108c
SS
277
278int arm_apcs_32 = 1;
279
9779414d
DJ
280/* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
281
478fd957 282int
9779414d
DJ
283arm_psr_thumb_bit (struct gdbarch *gdbarch)
284{
285 if (gdbarch_tdep (gdbarch)->is_m)
286 return XPSR_T;
287 else
288 return CPSR_T;
289}
290
b39cc962
DJ
291/* Determine if FRAME is executing in Thumb mode. */
292
25b41d01 293int
b39cc962
DJ
294arm_frame_is_thumb (struct frame_info *frame)
295{
296 CORE_ADDR cpsr;
9779414d 297 ULONGEST t_bit = arm_psr_thumb_bit (get_frame_arch (frame));
b39cc962
DJ
298
299 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
300 directly (from a signal frame or dummy frame) or by interpreting
301 the saved LR (from a prologue or DWARF frame). So consult it and
302 trust the unwinders. */
303 cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
304
9779414d 305 return (cpsr & t_bit) != 0;
b39cc962
DJ
306}
307
60c5725c
DJ
308/* Callback for VEC_lower_bound. */
309
310static inline int
311arm_compare_mapping_symbols (const struct arm_mapping_symbol *lhs,
312 const struct arm_mapping_symbol *rhs)
313{
314 return lhs->value < rhs->value;
315}
316
f9d67f43
DJ
317/* Search for the mapping symbol covering MEMADDR. If one is found,
318 return its type. Otherwise, return 0. If START is non-NULL,
319 set *START to the location of the mapping symbol. */
c906108c 320
f9d67f43
DJ
321static char
322arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
c906108c 323{
60c5725c 324 struct obj_section *sec;
0428b8f5 325
60c5725c
DJ
326 /* If there are mapping symbols, consult them. */
327 sec = find_pc_section (memaddr);
328 if (sec != NULL)
329 {
330 struct arm_per_objfile *data;
331 VEC(arm_mapping_symbol_s) *map;
aded6f54
PA
332 struct arm_mapping_symbol map_key = { memaddr - obj_section_addr (sec),
333 0 };
60c5725c
DJ
334 unsigned int idx;
335
336 data = objfile_data (sec->objfile, arm_objfile_data_key);
337 if (data != NULL)
338 {
339 map = data->section_maps[sec->the_bfd_section->index];
340 if (!VEC_empty (arm_mapping_symbol_s, map))
341 {
342 struct arm_mapping_symbol *map_sym;
343
344 idx = VEC_lower_bound (arm_mapping_symbol_s, map, &map_key,
345 arm_compare_mapping_symbols);
346
347 /* VEC_lower_bound finds the earliest ordered insertion
348 point. If the following symbol starts at this exact
349 address, we use that; otherwise, the preceding
350 mapping symbol covers this address. */
351 if (idx < VEC_length (arm_mapping_symbol_s, map))
352 {
353 map_sym = VEC_index (arm_mapping_symbol_s, map, idx);
354 if (map_sym->value == map_key.value)
f9d67f43
DJ
355 {
356 if (start)
357 *start = map_sym->value + obj_section_addr (sec);
358 return map_sym->type;
359 }
60c5725c
DJ
360 }
361
362 if (idx > 0)
363 {
364 map_sym = VEC_index (arm_mapping_symbol_s, map, idx - 1);
f9d67f43
DJ
365 if (start)
366 *start = map_sym->value + obj_section_addr (sec);
367 return map_sym->type;
60c5725c
DJ
368 }
369 }
370 }
371 }
372
f9d67f43
DJ
373 return 0;
374}
375
376/* Determine if the program counter specified in MEMADDR is in a Thumb
377 function. This function should be called for addresses unrelated to
378 any executing frame; otherwise, prefer arm_frame_is_thumb. */
379
e3039479 380int
9779414d 381arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
f9d67f43 382{
f9d67f43
DJ
383 struct minimal_symbol *sym;
384 char type;
a42244db
YQ
385 struct displaced_step_closure* dsc
386 = get_displaced_step_closure_by_addr(memaddr);
387
388 /* If checking the mode of displaced instruction in copy area, the mode
389 should be determined by instruction on the original address. */
390 if (dsc)
391 {
392 if (debug_displaced)
393 fprintf_unfiltered (gdb_stdlog,
394 "displaced: check mode of %.8lx instead of %.8lx\n",
395 (unsigned long) dsc->insn_addr,
396 (unsigned long) memaddr);
397 memaddr = dsc->insn_addr;
398 }
f9d67f43
DJ
399
400 /* If bit 0 of the address is set, assume this is a Thumb address. */
401 if (IS_THUMB_ADDR (memaddr))
402 return 1;
403
18819fa6
UW
404 /* Respect internal mode override if active. */
405 if (arm_override_mode != -1)
406 return arm_override_mode;
407
f9d67f43
DJ
408 /* If the user wants to override the symbol table, let him. */
409 if (strcmp (arm_force_mode_string, "arm") == 0)
410 return 0;
411 if (strcmp (arm_force_mode_string, "thumb") == 0)
412 return 1;
413
9779414d
DJ
414 /* ARM v6-M and v7-M are always in Thumb mode. */
415 if (gdbarch_tdep (gdbarch)->is_m)
416 return 1;
417
f9d67f43
DJ
418 /* If there are mapping symbols, consult them. */
419 type = arm_find_mapping_symbol (memaddr, NULL);
420 if (type)
421 return type == 't';
422
ed9a39eb 423 /* Thumb functions have a "special" bit set in minimal symbols. */
c906108c
SS
424 sym = lookup_minimal_symbol_by_pc (memaddr);
425 if (sym)
0428b8f5
DJ
426 return (MSYMBOL_IS_SPECIAL (sym));
427
428 /* If the user wants to override the fallback mode, let them. */
429 if (strcmp (arm_fallback_mode_string, "arm") == 0)
430 return 0;
431 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
432 return 1;
433
434 /* If we couldn't find any symbol, but we're talking to a running
435 target, then trust the current value of $cpsr. This lets
436 "display/i $pc" always show the correct mode (though if there is
437 a symbol table we will not reach here, so it still may not be
18819fa6 438 displayed in the mode it will be executed). */
0428b8f5 439 if (target_has_registers)
18819fa6 440 return arm_frame_is_thumb (get_current_frame ());
0428b8f5
DJ
441
442 /* Otherwise we're out of luck; we assume ARM. */
443 return 0;
c906108c
SS
444}
445
181c1381 446/* Remove useless bits from addresses in a running program. */
34e8f22d 447static CORE_ADDR
24568a2c 448arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
c906108c 449{
a3a2ee65 450 if (arm_apcs_32)
dd6be234 451 return UNMAKE_THUMB_ADDR (val);
c906108c 452 else
a3a2ee65 453 return (val & 0x03fffffc);
c906108c
SS
454}
455
181c1381
RE
456/* When reading symbols, we need to zap the low bit of the address,
457 which may be set to 1 for Thumb functions. */
34e8f22d 458static CORE_ADDR
24568a2c 459arm_smash_text_address (struct gdbarch *gdbarch, CORE_ADDR val)
181c1381
RE
460{
461 return val & ~1;
462}
463
0d39a070 464/* Return 1 if PC is the start of a compiler helper function which
e0634ccf
UW
465 can be safely ignored during prologue skipping. IS_THUMB is true
466 if the function is known to be a Thumb function due to the way it
467 is being called. */
0d39a070 468static int
e0634ccf 469skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
0d39a070 470{
e0634ccf 471 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
0d39a070 472 struct minimal_symbol *msym;
0d39a070
DJ
473
474 msym = lookup_minimal_symbol_by_pc (pc);
e0634ccf
UW
475 if (msym != NULL
476 && SYMBOL_VALUE_ADDRESS (msym) == pc
477 && SYMBOL_LINKAGE_NAME (msym) != NULL)
478 {
479 const char *name = SYMBOL_LINKAGE_NAME (msym);
0d39a070 480
e0634ccf
UW
481 /* The GNU linker's Thumb call stub to foo is named
482 __foo_from_thumb. */
483 if (strstr (name, "_from_thumb") != NULL)
484 name += 2;
0d39a070 485
e0634ccf
UW
486 /* On soft-float targets, __truncdfsf2 is called to convert promoted
487 arguments to their argument types in non-prototyped
488 functions. */
489 if (strncmp (name, "__truncdfsf2", strlen ("__truncdfsf2")) == 0)
490 return 1;
491 if (strncmp (name, "__aeabi_d2f", strlen ("__aeabi_d2f")) == 0)
492 return 1;
0d39a070 493
e0634ccf
UW
494 /* Internal functions related to thread-local storage. */
495 if (strncmp (name, "__tls_get_addr", strlen ("__tls_get_addr")) == 0)
496 return 1;
497 if (strncmp (name, "__aeabi_read_tp", strlen ("__aeabi_read_tp")) == 0)
498 return 1;
499 }
500 else
501 {
502 /* If we run against a stripped glibc, we may be unable to identify
503 special functions by name. Check for one important case,
504 __aeabi_read_tp, by comparing the *code* against the default
505 implementation (this is hand-written ARM assembler in glibc). */
506
507 if (!is_thumb
508 && read_memory_unsigned_integer (pc, 4, byte_order_for_code)
509 == 0xe3e00a0f /* mov r0, #0xffff0fff */
510 && read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code)
511 == 0xe240f01f) /* sub pc, r0, #31 */
512 return 1;
513 }
ec3d575a 514
0d39a070
DJ
515 return 0;
516}
517
518/* Support routines for instruction parsing. */
519#define submask(x) ((1L << ((x) + 1)) - 1)
520#define bit(obj,st) (((obj) >> (st)) & 1)
521#define bits(obj,st,fn) (((obj) >> (st)) & submask ((fn) - (st)))
522#define sbits(obj,st,fn) \
523 ((long) (bits(obj,st,fn) | ((long) bit(obj,fn) * ~ submask (fn - st))))
524#define BranchDest(addr,instr) \
525 ((CORE_ADDR) (((long) (addr)) + 8 + (sbits (instr, 0, 23) << 2)))
526
621c6d5b
YQ
527/* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
528 the first 16-bit of instruction, and INSN2 is the second 16-bit of
529 instruction. */
530#define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
531 ((bits ((insn1), 0, 3) << 12) \
532 | (bits ((insn1), 10, 10) << 11) \
533 | (bits ((insn2), 12, 14) << 8) \
534 | bits ((insn2), 0, 7))
535
536/* Extract the immediate from instruction movw/movt of encoding A. INSN is
537 the 32-bit instruction. */
538#define EXTRACT_MOVW_MOVT_IMM_A(insn) \
539 ((bits ((insn), 16, 19) << 12) \
540 | bits ((insn), 0, 11))
541
ec3d575a
UW
542/* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
543
544static unsigned int
545thumb_expand_immediate (unsigned int imm)
546{
547 unsigned int count = imm >> 7;
548
549 if (count < 8)
550 switch (count / 2)
551 {
552 case 0:
553 return imm & 0xff;
554 case 1:
555 return (imm & 0xff) | ((imm & 0xff) << 16);
556 case 2:
557 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
558 case 3:
559 return (imm & 0xff) | ((imm & 0xff) << 8)
560 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
561 }
562
563 return (0x80 | (imm & 0x7f)) << (32 - count);
564}
565
566/* Return 1 if the 16-bit Thumb instruction INST might change
567 control flow, 0 otherwise. */
568
569static int
570thumb_instruction_changes_pc (unsigned short inst)
571{
572 if ((inst & 0xff00) == 0xbd00) /* pop {rlist, pc} */
573 return 1;
574
575 if ((inst & 0xf000) == 0xd000) /* conditional branch */
576 return 1;
577
578 if ((inst & 0xf800) == 0xe000) /* unconditional branch */
579 return 1;
580
581 if ((inst & 0xff00) == 0x4700) /* bx REG, blx REG */
582 return 1;
583
ad8b5167
UW
584 if ((inst & 0xff87) == 0x4687) /* mov pc, REG */
585 return 1;
586
ec3d575a
UW
587 if ((inst & 0xf500) == 0xb100) /* CBNZ or CBZ. */
588 return 1;
589
590 return 0;
591}
592
593/* Return 1 if the 32-bit Thumb instruction in INST1 and INST2
594 might change control flow, 0 otherwise. */
595
596static int
597thumb2_instruction_changes_pc (unsigned short inst1, unsigned short inst2)
598{
599 if ((inst1 & 0xf800) == 0xf000 && (inst2 & 0x8000) == 0x8000)
600 {
601 /* Branches and miscellaneous control instructions. */
602
603 if ((inst2 & 0x1000) != 0 || (inst2 & 0xd001) == 0xc000)
604 {
605 /* B, BL, BLX. */
606 return 1;
607 }
608 else if (inst1 == 0xf3de && (inst2 & 0xff00) == 0x3f00)
609 {
610 /* SUBS PC, LR, #imm8. */
611 return 1;
612 }
613 else if ((inst2 & 0xd000) == 0x8000 && (inst1 & 0x0380) != 0x0380)
614 {
615 /* Conditional branch. */
616 return 1;
617 }
618
619 return 0;
620 }
621
622 if ((inst1 & 0xfe50) == 0xe810)
623 {
624 /* Load multiple or RFE. */
625
626 if (bit (inst1, 7) && !bit (inst1, 8))
627 {
628 /* LDMIA or POP */
629 if (bit (inst2, 15))
630 return 1;
631 }
632 else if (!bit (inst1, 7) && bit (inst1, 8))
633 {
634 /* LDMDB */
635 if (bit (inst2, 15))
636 return 1;
637 }
638 else if (bit (inst1, 7) && bit (inst1, 8))
639 {
640 /* RFEIA */
641 return 1;
642 }
643 else if (!bit (inst1, 7) && !bit (inst1, 8))
644 {
645 /* RFEDB */
646 return 1;
647 }
648
649 return 0;
650 }
651
652 if ((inst1 & 0xffef) == 0xea4f && (inst2 & 0xfff0) == 0x0f00)
653 {
654 /* MOV PC or MOVS PC. */
655 return 1;
656 }
657
658 if ((inst1 & 0xff70) == 0xf850 && (inst2 & 0xf000) == 0xf000)
659 {
660 /* LDR PC. */
661 if (bits (inst1, 0, 3) == 15)
662 return 1;
663 if (bit (inst1, 7))
664 return 1;
665 if (bit (inst2, 11))
666 return 1;
667 if ((inst2 & 0x0fc0) == 0x0000)
668 return 1;
669
670 return 0;
671 }
672
673 if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
674 {
675 /* TBB. */
676 return 1;
677 }
678
679 if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010)
680 {
681 /* TBH. */
682 return 1;
683 }
684
685 return 0;
686}
687
29d73ae4
DJ
688/* Analyze a Thumb prologue, looking for a recognizable stack frame
689 and frame pointer. Scan until we encounter a store that could
0d39a070
DJ
690 clobber the stack frame unexpectedly, or an unknown instruction.
691 Return the last address which is definitely safe to skip for an
692 initial breakpoint. */
c906108c
SS
693
694static CORE_ADDR
29d73ae4
DJ
695thumb_analyze_prologue (struct gdbarch *gdbarch,
696 CORE_ADDR start, CORE_ADDR limit,
697 struct arm_prologue_cache *cache)
c906108c 698{
0d39a070 699 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
e17a4113 700 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
29d73ae4
DJ
701 int i;
702 pv_t regs[16];
703 struct pv_area *stack;
704 struct cleanup *back_to;
705 CORE_ADDR offset;
ec3d575a 706 CORE_ADDR unrecognized_pc = 0;
da3c6d4a 707
29d73ae4
DJ
708 for (i = 0; i < 16; i++)
709 regs[i] = pv_register (i, 0);
55f960e1 710 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
29d73ae4
DJ
711 back_to = make_cleanup_free_pv_area (stack);
712
29d73ae4 713 while (start < limit)
c906108c 714 {
29d73ae4
DJ
715 unsigned short insn;
716
e17a4113 717 insn = read_memory_unsigned_integer (start, 2, byte_order_for_code);
9d4fde75 718
94c30b78 719 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
da59e081 720 {
29d73ae4
DJ
721 int regno;
722 int mask;
4be43953
DJ
723
724 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
725 break;
29d73ae4
DJ
726
727 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
728 whether to save LR (R14). */
729 mask = (insn & 0xff) | ((insn & 0x100) << 6);
730
731 /* Calculate offsets of saved R0-R7 and LR. */
732 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
733 if (mask & (1 << regno))
734 {
29d73ae4
DJ
735 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
736 -4);
737 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
738 }
da59e081 739 }
da3c6d4a
MS
740 else if ((insn & 0xff00) == 0xb000) /* add sp, #simm OR
741 sub sp, #simm */
da59e081 742 {
29d73ae4
DJ
743 offset = (insn & 0x7f) << 2; /* get scaled offset */
744 if (insn & 0x80) /* Check for SUB. */
745 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
746 -offset);
da59e081 747 else
29d73ae4
DJ
748 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
749 offset);
da59e081 750 }
0d39a070
DJ
751 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
752 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
753 (insn & 0xff) << 2);
754 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
755 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
756 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
757 bits (insn, 6, 8));
758 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
759 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
760 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
761 bits (insn, 0, 7));
762 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
763 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
764 && pv_is_constant (regs[bits (insn, 3, 5)]))
765 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
766 regs[bits (insn, 6, 8)]);
767 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
768 && pv_is_constant (regs[bits (insn, 3, 6)]))
769 {
770 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
771 int rm = bits (insn, 3, 6);
772 regs[rd] = pv_add (regs[rd], regs[rm]);
773 }
29d73ae4 774 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
da59e081 775 {
29d73ae4
DJ
776 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
777 int src_reg = (insn & 0x78) >> 3;
778 regs[dst_reg] = regs[src_reg];
da59e081 779 }
29d73ae4 780 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
da59e081 781 {
29d73ae4
DJ
782 /* Handle stores to the stack. Normally pushes are used,
783 but with GCC -mtpcs-frame, there may be other stores
784 in the prologue to create the frame. */
785 int regno = (insn >> 8) & 0x7;
786 pv_t addr;
787
788 offset = (insn & 0xff) << 2;
789 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
790
791 if (pv_area_store_would_trash (stack, addr))
792 break;
793
794 pv_area_store (stack, addr, 4, regs[regno]);
da59e081 795 }
0d39a070
DJ
796 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
797 {
798 int rd = bits (insn, 0, 2);
799 int rn = bits (insn, 3, 5);
800 pv_t addr;
801
802 offset = bits (insn, 6, 10) << 2;
803 addr = pv_add_constant (regs[rn], offset);
804
805 if (pv_area_store_would_trash (stack, addr))
806 break;
807
808 pv_area_store (stack, addr, 4, regs[rd]);
809 }
810 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
811 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
812 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
813 /* Ignore stores of argument registers to the stack. */
814 ;
815 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
816 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
817 /* Ignore block loads from the stack, potentially copying
818 parameters from memory. */
819 ;
820 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
821 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
822 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
823 /* Similarly ignore single loads from the stack. */
824 ;
825 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
826 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
827 /* Skip register copies, i.e. saves to another register
828 instead of the stack. */
829 ;
830 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
831 /* Recognize constant loads; even with small stacks these are necessary
832 on Thumb. */
833 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
834 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
835 {
836 /* Constant pool loads, for the same reason. */
837 unsigned int constant;
838 CORE_ADDR loc;
839
840 loc = start + 4 + bits (insn, 0, 7) * 4;
841 constant = read_memory_unsigned_integer (loc, 4, byte_order);
842 regs[bits (insn, 8, 10)] = pv_constant (constant);
843 }
db24da6d 844 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
0d39a070 845 {
0d39a070
DJ
846 unsigned short inst2;
847
848 inst2 = read_memory_unsigned_integer (start + 2, 2,
849 byte_order_for_code);
850
851 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
852 {
853 /* BL, BLX. Allow some special function calls when
854 skipping the prologue; GCC generates these before
855 storing arguments to the stack. */
856 CORE_ADDR nextpc;
857 int j1, j2, imm1, imm2;
858
859 imm1 = sbits (insn, 0, 10);
860 imm2 = bits (inst2, 0, 10);
861 j1 = bit (inst2, 13);
862 j2 = bit (inst2, 11);
863
864 offset = ((imm1 << 12) + (imm2 << 1));
865 offset ^= ((!j2) << 22) | ((!j1) << 23);
866
867 nextpc = start + 4 + offset;
868 /* For BLX make sure to clear the low bits. */
869 if (bit (inst2, 12) == 0)
870 nextpc = nextpc & 0xfffffffc;
871
e0634ccf
UW
872 if (!skip_prologue_function (gdbarch, nextpc,
873 bit (inst2, 12) != 0))
0d39a070
DJ
874 break;
875 }
ec3d575a 876
0963b4bd
MS
877 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
878 { registers } */
ec3d575a
UW
879 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
880 {
881 pv_t addr = regs[bits (insn, 0, 3)];
882 int regno;
883
884 if (pv_area_store_would_trash (stack, addr))
885 break;
886
887 /* Calculate offsets of saved registers. */
888 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
889 if (inst2 & (1 << regno))
890 {
891 addr = pv_add_constant (addr, -4);
892 pv_area_store (stack, addr, 4, regs[regno]);
893 }
894
895 if (insn & 0x0020)
896 regs[bits (insn, 0, 3)] = addr;
897 }
898
0963b4bd
MS
899 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
900 [Rn, #+/-imm]{!} */
ec3d575a
UW
901 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
902 {
903 int regno1 = bits (inst2, 12, 15);
904 int regno2 = bits (inst2, 8, 11);
905 pv_t addr = regs[bits (insn, 0, 3)];
906
907 offset = inst2 & 0xff;
908 if (insn & 0x0080)
909 addr = pv_add_constant (addr, offset);
910 else
911 addr = pv_add_constant (addr, -offset);
912
913 if (pv_area_store_would_trash (stack, addr))
914 break;
915
916 pv_area_store (stack, addr, 4, regs[regno1]);
917 pv_area_store (stack, pv_add_constant (addr, 4),
918 4, regs[regno2]);
919
920 if (insn & 0x0020)
921 regs[bits (insn, 0, 3)] = addr;
922 }
923
924 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
925 && (inst2 & 0x0c00) == 0x0c00
926 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
927 {
928 int regno = bits (inst2, 12, 15);
929 pv_t addr = regs[bits (insn, 0, 3)];
930
931 offset = inst2 & 0xff;
932 if (inst2 & 0x0200)
933 addr = pv_add_constant (addr, offset);
934 else
935 addr = pv_add_constant (addr, -offset);
936
937 if (pv_area_store_would_trash (stack, addr))
938 break;
939
940 pv_area_store (stack, addr, 4, regs[regno]);
941
942 if (inst2 & 0x0100)
943 regs[bits (insn, 0, 3)] = addr;
944 }
945
946 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
947 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
948 {
949 int regno = bits (inst2, 12, 15);
950 pv_t addr;
951
952 offset = inst2 & 0xfff;
953 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
954
955 if (pv_area_store_would_trash (stack, addr))
956 break;
957
958 pv_area_store (stack, addr, 4, regs[regno]);
959 }
960
961 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
0d39a070 962 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 963 /* Ignore stores of argument registers to the stack. */
0d39a070 964 ;
ec3d575a
UW
965
966 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
967 && (inst2 & 0x0d00) == 0x0c00
0d39a070 968 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 969 /* Ignore stores of argument registers to the stack. */
0d39a070 970 ;
ec3d575a 971
0963b4bd
MS
972 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
973 { registers } */
ec3d575a
UW
974 && (inst2 & 0x8000) == 0x0000
975 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
976 /* Ignore block loads from the stack, potentially copying
977 parameters from memory. */
0d39a070 978 ;
ec3d575a 979
0963b4bd
MS
980 else if ((insn & 0xffb0) == 0xe950 /* ldrd Rt, Rt2,
981 [Rn, #+/-imm] */
0d39a070 982 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 983 /* Similarly ignore dual loads from the stack. */
0d39a070 984 ;
ec3d575a
UW
985
986 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
987 && (inst2 & 0x0d00) == 0x0c00
0d39a070 988 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 989 /* Similarly ignore single loads from the stack. */
0d39a070 990 ;
ec3d575a
UW
991
992 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
0d39a070 993 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
ec3d575a 994 /* Similarly ignore single loads from the stack. */
0d39a070 995 ;
ec3d575a
UW
996
997 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
998 && (inst2 & 0x8000) == 0x0000)
999 {
1000 unsigned int imm = ((bits (insn, 10, 10) << 11)
1001 | (bits (inst2, 12, 14) << 8)
1002 | bits (inst2, 0, 7));
1003
1004 regs[bits (inst2, 8, 11)]
1005 = pv_add_constant (regs[bits (insn, 0, 3)],
1006 thumb_expand_immediate (imm));
1007 }
1008
1009 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
1010 && (inst2 & 0x8000) == 0x0000)
0d39a070 1011 {
ec3d575a
UW
1012 unsigned int imm = ((bits (insn, 10, 10) << 11)
1013 | (bits (inst2, 12, 14) << 8)
1014 | bits (inst2, 0, 7));
1015
1016 regs[bits (inst2, 8, 11)]
1017 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
1018 }
1019
1020 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
1021 && (inst2 & 0x8000) == 0x0000)
1022 {
1023 unsigned int imm = ((bits (insn, 10, 10) << 11)
1024 | (bits (inst2, 12, 14) << 8)
1025 | bits (inst2, 0, 7));
1026
1027 regs[bits (inst2, 8, 11)]
1028 = pv_add_constant (regs[bits (insn, 0, 3)],
1029 - (CORE_ADDR) thumb_expand_immediate (imm));
1030 }
1031
1032 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
1033 && (inst2 & 0x8000) == 0x0000)
1034 {
1035 unsigned int imm = ((bits (insn, 10, 10) << 11)
1036 | (bits (inst2, 12, 14) << 8)
1037 | bits (inst2, 0, 7));
1038
1039 regs[bits (inst2, 8, 11)]
1040 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1041 }
1042
1043 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
1044 {
1045 unsigned int imm = ((bits (insn, 10, 10) << 11)
1046 | (bits (inst2, 12, 14) << 8)
1047 | bits (inst2, 0, 7));
1048
1049 regs[bits (inst2, 8, 11)]
1050 = pv_constant (thumb_expand_immediate (imm));
1051 }
1052
1053 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
1054 {
621c6d5b
YQ
1055 unsigned int imm
1056 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
ec3d575a
UW
1057
1058 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1059 }
1060
1061 else if (insn == 0xea5f /* mov.w Rd,Rm */
1062 && (inst2 & 0xf0f0) == 0)
1063 {
1064 int dst_reg = (inst2 & 0x0f00) >> 8;
1065 int src_reg = inst2 & 0xf;
1066 regs[dst_reg] = regs[src_reg];
1067 }
1068
1069 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1070 {
1071 /* Constant pool loads. */
1072 unsigned int constant;
1073 CORE_ADDR loc;
1074
1075 offset = bits (insn, 0, 11);
1076 if (insn & 0x0080)
1077 loc = start + 4 + offset;
1078 else
1079 loc = start + 4 - offset;
1080
1081 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1082 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1083 }
1084
1085 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1086 {
1087 /* Constant pool loads. */
1088 unsigned int constant;
1089 CORE_ADDR loc;
1090
1091 offset = bits (insn, 0, 7) << 2;
1092 if (insn & 0x0080)
1093 loc = start + 4 + offset;
1094 else
1095 loc = start + 4 - offset;
1096
1097 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1098 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1099
1100 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1101 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1102 }
1103
1104 else if (thumb2_instruction_changes_pc (insn, inst2))
1105 {
1106 /* Don't scan past anything that might change control flow. */
0d39a070
DJ
1107 break;
1108 }
ec3d575a
UW
1109 else
1110 {
1111 /* The optimizer might shove anything into the prologue,
1112 so we just skip what we don't recognize. */
1113 unrecognized_pc = start;
1114 }
0d39a070
DJ
1115
1116 start += 2;
1117 }
ec3d575a 1118 else if (thumb_instruction_changes_pc (insn))
3d74b771 1119 {
ec3d575a 1120 /* Don't scan past anything that might change control flow. */
da3c6d4a 1121 break;
3d74b771 1122 }
ec3d575a
UW
1123 else
1124 {
1125 /* The optimizer might shove anything into the prologue,
1126 so we just skip what we don't recognize. */
1127 unrecognized_pc = start;
1128 }
29d73ae4
DJ
1129
1130 start += 2;
c906108c
SS
1131 }
1132
0d39a070
DJ
1133 if (arm_debug)
1134 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1135 paddress (gdbarch, start));
1136
ec3d575a
UW
1137 if (unrecognized_pc == 0)
1138 unrecognized_pc = start;
1139
29d73ae4
DJ
1140 if (cache == NULL)
1141 {
1142 do_cleanups (back_to);
ec3d575a 1143 return unrecognized_pc;
29d73ae4
DJ
1144 }
1145
29d73ae4
DJ
1146 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1147 {
1148 /* Frame pointer is fp. Frame size is constant. */
1149 cache->framereg = ARM_FP_REGNUM;
1150 cache->framesize = -regs[ARM_FP_REGNUM].k;
1151 }
1152 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1153 {
1154 /* Frame pointer is r7. Frame size is constant. */
1155 cache->framereg = THUMB_FP_REGNUM;
1156 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1157 }
72a2e3dc 1158 else
29d73ae4
DJ
1159 {
1160 /* Try the stack pointer... this is a bit desperate. */
1161 cache->framereg = ARM_SP_REGNUM;
1162 cache->framesize = -regs[ARM_SP_REGNUM].k;
1163 }
29d73ae4
DJ
1164
1165 for (i = 0; i < 16; i++)
1166 if (pv_area_find_reg (stack, gdbarch, i, &offset))
1167 cache->saved_regs[i].addr = offset;
1168
1169 do_cleanups (back_to);
ec3d575a 1170 return unrecognized_pc;
c906108c
SS
1171}
1172
621c6d5b
YQ
1173
1174/* Try to analyze the instructions starting from PC, which load symbol
1175 __stack_chk_guard. Return the address of instruction after loading this
1176 symbol, set the dest register number to *BASEREG, and set the size of
1177 instructions for loading symbol in OFFSET. Return 0 if instructions are
1178 not recognized. */
1179
1180static CORE_ADDR
1181arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1182 unsigned int *destreg, int *offset)
1183{
1184 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1185 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1186 unsigned int low, high, address;
1187
1188 address = 0;
1189 if (is_thumb)
1190 {
1191 unsigned short insn1
1192 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
1193
1194 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1195 {
1196 *destreg = bits (insn1, 8, 10);
1197 *offset = 2;
1198 address = bits (insn1, 0, 7);
1199 }
1200 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1201 {
1202 unsigned short insn2
1203 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
1204
1205 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1206
1207 insn1
1208 = read_memory_unsigned_integer (pc + 4, 2, byte_order_for_code);
1209 insn2
1210 = read_memory_unsigned_integer (pc + 6, 2, byte_order_for_code);
1211
1212 /* movt Rd, #const */
1213 if ((insn1 & 0xfbc0) == 0xf2c0)
1214 {
1215 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1216 *destreg = bits (insn2, 8, 11);
1217 *offset = 8;
1218 address = (high << 16 | low);
1219 }
1220 }
1221 }
1222 else
1223 {
2e9e421f
UW
1224 unsigned int insn
1225 = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
1226
1227 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, #immed */
1228 {
1229 address = bits (insn, 0, 11);
1230 *destreg = bits (insn, 12, 15);
1231 *offset = 4;
1232 }
1233 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1234 {
1235 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1236
1237 insn
1238 = read_memory_unsigned_integer (pc + 4, 4, byte_order_for_code);
1239
1240 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1241 {
1242 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1243 *destreg = bits (insn, 12, 15);
1244 *offset = 8;
1245 address = (high << 16 | low);
1246 }
1247 }
621c6d5b
YQ
1248 }
1249
1250 return address;
1251}
1252
1253/* Try to skip a sequence of instructions used for stack protector. If PC
0963b4bd
MS
1254 points to the first instruction of this sequence, return the address of
1255 first instruction after this sequence, otherwise, return original PC.
621c6d5b
YQ
1256
1257 On arm, this sequence of instructions is composed of mainly three steps,
1258 Step 1: load symbol __stack_chk_guard,
1259 Step 2: load from address of __stack_chk_guard,
1260 Step 3: store it to somewhere else.
1261
1262 Usually, instructions on step 2 and step 3 are the same on various ARM
1263 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1264 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1265 instructions in step 1 vary from different ARM architectures. On ARMv7,
1266 they are,
1267
1268 movw Rn, #:lower16:__stack_chk_guard
1269 movt Rn, #:upper16:__stack_chk_guard
1270
1271 On ARMv5t, it is,
1272
1273 ldr Rn, .Label
1274 ....
1275 .Lable:
1276 .word __stack_chk_guard
1277
1278 Since ldr/str is a very popular instruction, we can't use them as
1279 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1280 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1281 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1282
1283static CORE_ADDR
1284arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1285{
1286 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
22e048c9 1287 unsigned int basereg;
621c6d5b
YQ
1288 struct minimal_symbol *stack_chk_guard;
1289 int offset;
1290 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1291 CORE_ADDR addr;
1292
1293 /* Try to parse the instructions in Step 1. */
1294 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1295 &basereg, &offset);
1296 if (!addr)
1297 return pc;
1298
1299 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
1300 /* If name of symbol doesn't start with '__stack_chk_guard', this
1301 instruction sequence is not for stack protector. If symbol is
1302 removed, we conservatively think this sequence is for stack protector. */
1303 if (stack_chk_guard
c1c2ab58
UW
1304 && strncmp (SYMBOL_LINKAGE_NAME (stack_chk_guard), "__stack_chk_guard",
1305 strlen ("__stack_chk_guard")) != 0)
621c6d5b
YQ
1306 return pc;
1307
1308 if (is_thumb)
1309 {
1310 unsigned int destreg;
1311 unsigned short insn
1312 = read_memory_unsigned_integer (pc + offset, 2, byte_order_for_code);
1313
1314 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1315 if ((insn & 0xf800) != 0x6800)
1316 return pc;
1317 if (bits (insn, 3, 5) != basereg)
1318 return pc;
1319 destreg = bits (insn, 0, 2);
1320
1321 insn = read_memory_unsigned_integer (pc + offset + 2, 2,
1322 byte_order_for_code);
1323 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1324 if ((insn & 0xf800) != 0x6000)
1325 return pc;
1326 if (destreg != bits (insn, 0, 2))
1327 return pc;
1328 }
1329 else
1330 {
1331 unsigned int destreg;
1332 unsigned int insn
1333 = read_memory_unsigned_integer (pc + offset, 4, byte_order_for_code);
1334
1335 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1336 if ((insn & 0x0e500000) != 0x04100000)
1337 return pc;
1338 if (bits (insn, 16, 19) != basereg)
1339 return pc;
1340 destreg = bits (insn, 12, 15);
1341 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1342 insn = read_memory_unsigned_integer (pc + offset + 4,
1343 4, byte_order_for_code);
1344 if ((insn & 0x0e500000) != 0x04000000)
1345 return pc;
1346 if (bits (insn, 12, 15) != destreg)
1347 return pc;
1348 }
1349 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1350 on arm. */
1351 if (is_thumb)
1352 return pc + offset + 4;
1353 else
1354 return pc + offset + 8;
1355}
1356
da3c6d4a
MS
1357/* Advance the PC across any function entry prologue instructions to
1358 reach some "real" code.
34e8f22d
RE
1359
1360 The APCS (ARM Procedure Call Standard) defines the following
ed9a39eb 1361 prologue:
c906108c 1362
c5aa993b
JM
1363 mov ip, sp
1364 [stmfd sp!, {a1,a2,a3,a4}]
1365 stmfd sp!, {...,fp,ip,lr,pc}
ed9a39eb
JM
1366 [stfe f7, [sp, #-12]!]
1367 [stfe f6, [sp, #-12]!]
1368 [stfe f5, [sp, #-12]!]
1369 [stfe f4, [sp, #-12]!]
0963b4bd 1370 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
c906108c 1371
34e8f22d 1372static CORE_ADDR
6093d2eb 1373arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
c906108c 1374{
e17a4113 1375 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c
SS
1376 unsigned long inst;
1377 CORE_ADDR skip_pc;
a89fea3c 1378 CORE_ADDR func_addr, limit_pc;
c906108c 1379
a89fea3c
JL
1380 /* See if we can determine the end of the prologue via the symbol table.
1381 If so, then return either PC, or the PC after the prologue, whichever
1382 is greater. */
1383 if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
c906108c 1384 {
d80b854b
UW
1385 CORE_ADDR post_prologue_pc
1386 = skip_prologue_using_sal (gdbarch, func_addr);
0d39a070
DJ
1387 struct symtab *s = find_pc_symtab (func_addr);
1388
621c6d5b
YQ
1389 if (post_prologue_pc)
1390 post_prologue_pc
1391 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1392
1393
0d39a070
DJ
1394 /* GCC always emits a line note before the prologue and another
1395 one after, even if the two are at the same address or on the
1396 same line. Take advantage of this so that we do not need to
1397 know every instruction that might appear in the prologue. We
1398 will have producer information for most binaries; if it is
1399 missing (e.g. for -gstabs), assuming the GNU tools. */
1400 if (post_prologue_pc
1401 && (s == NULL
1402 || s->producer == NULL
1403 || strncmp (s->producer, "GNU ", sizeof ("GNU ") - 1) == 0))
1404 return post_prologue_pc;
1405
a89fea3c 1406 if (post_prologue_pc != 0)
0d39a070
DJ
1407 {
1408 CORE_ADDR analyzed_limit;
1409
1410 /* For non-GCC compilers, make sure the entire line is an
1411 acceptable prologue; GDB will round this function's
1412 return value up to the end of the following line so we
1413 can not skip just part of a line (and we do not want to).
1414
1415 RealView does not treat the prologue specially, but does
1416 associate prologue code with the opening brace; so this
1417 lets us skip the first line if we think it is the opening
1418 brace. */
9779414d 1419 if (arm_pc_is_thumb (gdbarch, func_addr))
0d39a070
DJ
1420 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1421 post_prologue_pc, NULL);
1422 else
1423 analyzed_limit = arm_analyze_prologue (gdbarch, func_addr,
1424 post_prologue_pc, NULL);
1425
1426 if (analyzed_limit != post_prologue_pc)
1427 return func_addr;
1428
1429 return post_prologue_pc;
1430 }
c906108c
SS
1431 }
1432
a89fea3c
JL
1433 /* Can't determine prologue from the symbol table, need to examine
1434 instructions. */
c906108c 1435
a89fea3c
JL
1436 /* Find an upper limit on the function prologue using the debug
1437 information. If the debug information could not be used to provide
1438 that bound, then use an arbitrary large number as the upper bound. */
0963b4bd 1439 /* Like arm_scan_prologue, stop no later than pc + 64. */
d80b854b 1440 limit_pc = skip_prologue_using_sal (gdbarch, pc);
a89fea3c
JL
1441 if (limit_pc == 0)
1442 limit_pc = pc + 64; /* Magic. */
1443
c906108c 1444
29d73ae4 1445 /* Check if this is Thumb code. */
9779414d 1446 if (arm_pc_is_thumb (gdbarch, pc))
a89fea3c 1447 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
29d73ae4 1448
a89fea3c 1449 for (skip_pc = pc; skip_pc < limit_pc; skip_pc += 4)
f43845b3 1450 {
e17a4113 1451 inst = read_memory_unsigned_integer (skip_pc, 4, byte_order_for_code);
9d4fde75 1452
b8d5e71d
MS
1453 /* "mov ip, sp" is no longer a required part of the prologue. */
1454 if (inst == 0xe1a0c00d) /* mov ip, sp */
1455 continue;
c906108c 1456
28cd8767
JG
1457 if ((inst & 0xfffff000) == 0xe28dc000) /* add ip, sp #n */
1458 continue;
1459
1460 if ((inst & 0xfffff000) == 0xe24dc000) /* sub ip, sp #n */
1461 continue;
1462
b8d5e71d
MS
1463 /* Some prologues begin with "str lr, [sp, #-4]!". */
1464 if (inst == 0xe52de004) /* str lr, [sp, #-4]! */
1465 continue;
c906108c 1466
b8d5e71d
MS
1467 if ((inst & 0xfffffff0) == 0xe92d0000) /* stmfd sp!,{a1,a2,a3,a4} */
1468 continue;
c906108c 1469
b8d5e71d
MS
1470 if ((inst & 0xfffff800) == 0xe92dd800) /* stmfd sp!,{fp,ip,lr,pc} */
1471 continue;
11d3b27d 1472
b8d5e71d
MS
1473 /* Any insns after this point may float into the code, if it makes
1474 for better instruction scheduling, so we skip them only if we
1475 find them, but still consider the function to be frame-ful. */
f43845b3 1476
b8d5e71d
MS
1477 /* We may have either one sfmfd instruction here, or several stfe
1478 insns, depending on the version of floating point code we
1479 support. */
1480 if ((inst & 0xffbf0fff) == 0xec2d0200) /* sfmfd fn, <cnt>, [sp]! */
1481 continue;
1482
1483 if ((inst & 0xffff8fff) == 0xed6d0103) /* stfe fn, [sp, #-12]! */
1484 continue;
1485
1486 if ((inst & 0xfffff000) == 0xe24cb000) /* sub fp, ip, #nn */
1487 continue;
1488
1489 if ((inst & 0xfffff000) == 0xe24dd000) /* sub sp, sp, #nn */
1490 continue;
1491
f8bf5763
PM
1492 if ((inst & 0xffffc000) == 0xe54b0000 /* strb r(0123),[r11,#-nn] */
1493 || (inst & 0xffffc0f0) == 0xe14b00b0 /* strh r(0123),[r11,#-nn] */
1494 || (inst & 0xffffc000) == 0xe50b0000) /* str r(0123),[r11,#-nn] */
b8d5e71d
MS
1495 continue;
1496
f8bf5763
PM
1497 if ((inst & 0xffffc000) == 0xe5cd0000 /* strb r(0123),[sp,#nn] */
1498 || (inst & 0xffffc0f0) == 0xe1cd00b0 /* strh r(0123),[sp,#nn] */
1499 || (inst & 0xffffc000) == 0xe58d0000) /* str r(0123),[sp,#nn] */
b8d5e71d
MS
1500 continue;
1501
1502 /* Un-recognized instruction; stop scanning. */
1503 break;
f43845b3 1504 }
c906108c 1505
0963b4bd 1506 return skip_pc; /* End of prologue. */
c906108c 1507}
94c30b78 1508
c5aa993b 1509/* *INDENT-OFF* */
c906108c
SS
1510/* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1511 This function decodes a Thumb function prologue to determine:
1512 1) the size of the stack frame
1513 2) which registers are saved on it
1514 3) the offsets of saved regs
1515 4) the offset from the stack pointer to the frame pointer
c906108c 1516
da59e081
JM
1517 A typical Thumb function prologue would create this stack frame
1518 (offsets relative to FP)
c906108c
SS
1519 old SP -> 24 stack parameters
1520 20 LR
1521 16 R7
1522 R7 -> 0 local variables (16 bytes)
1523 SP -> -12 additional stack space (12 bytes)
1524 The frame size would thus be 36 bytes, and the frame offset would be
0963b4bd 1525 12 bytes. The frame register is R7.
da59e081 1526
da3c6d4a
MS
1527 The comments for thumb_skip_prolog() describe the algorithm we use
1528 to detect the end of the prolog. */
c5aa993b
JM
1529/* *INDENT-ON* */
1530
c906108c 1531static void
be8626e0 1532thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
b39cc962 1533 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
c906108c
SS
1534{
1535 CORE_ADDR prologue_start;
1536 CORE_ADDR prologue_end;
c906108c 1537
b39cc962
DJ
1538 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1539 &prologue_end))
c906108c 1540 {
ec3d575a
UW
1541 /* See comment in arm_scan_prologue for an explanation of
1542 this heuristics. */
1543 if (prologue_end > prologue_start + 64)
1544 {
1545 prologue_end = prologue_start + 64;
1546 }
c906108c
SS
1547 }
1548 else
f7060f85
DJ
1549 /* We're in the boondocks: we have no idea where the start of the
1550 function is. */
1551 return;
c906108c 1552
eb5492fa 1553 prologue_end = min (prologue_end, prev_pc);
c906108c 1554
be8626e0 1555 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1556}
1557
0d39a070 1558/* Return 1 if THIS_INSTR might change control flow, 0 otherwise. */
c906108c 1559
0d39a070
DJ
1560static int
1561arm_instruction_changes_pc (uint32_t this_instr)
c906108c 1562{
0d39a070
DJ
1563 if (bits (this_instr, 28, 31) == INST_NV)
1564 /* Unconditional instructions. */
1565 switch (bits (this_instr, 24, 27))
1566 {
1567 case 0xa:
1568 case 0xb:
1569 /* Branch with Link and change to Thumb. */
1570 return 1;
1571 case 0xc:
1572 case 0xd:
1573 case 0xe:
1574 /* Coprocessor register transfer. */
1575 if (bits (this_instr, 12, 15) == 15)
1576 error (_("Invalid update to pc in instruction"));
1577 return 0;
1578 default:
1579 return 0;
1580 }
1581 else
1582 switch (bits (this_instr, 25, 27))
1583 {
1584 case 0x0:
1585 if (bits (this_instr, 23, 24) == 2 && bit (this_instr, 20) == 0)
1586 {
1587 /* Multiplies and extra load/stores. */
1588 if (bit (this_instr, 4) == 1 && bit (this_instr, 7) == 1)
1589 /* Neither multiplies nor extension load/stores are allowed
1590 to modify PC. */
1591 return 0;
1592
1593 /* Otherwise, miscellaneous instructions. */
1594
1595 /* BX <reg>, BXJ <reg>, BLX <reg> */
1596 if (bits (this_instr, 4, 27) == 0x12fff1
1597 || bits (this_instr, 4, 27) == 0x12fff2
1598 || bits (this_instr, 4, 27) == 0x12fff3)
1599 return 1;
1600
1601 /* Other miscellaneous instructions are unpredictable if they
1602 modify PC. */
1603 return 0;
1604 }
1605 /* Data processing instruction. Fall through. */
c906108c 1606
0d39a070
DJ
1607 case 0x1:
1608 if (bits (this_instr, 12, 15) == 15)
1609 return 1;
1610 else
1611 return 0;
c906108c 1612
0d39a070
DJ
1613 case 0x2:
1614 case 0x3:
1615 /* Media instructions and architecturally undefined instructions. */
1616 if (bits (this_instr, 25, 27) == 3 && bit (this_instr, 4) == 1)
1617 return 0;
c906108c 1618
0d39a070
DJ
1619 /* Stores. */
1620 if (bit (this_instr, 20) == 0)
1621 return 0;
2a451106 1622
0d39a070
DJ
1623 /* Loads. */
1624 if (bits (this_instr, 12, 15) == ARM_PC_REGNUM)
1625 return 1;
1626 else
1627 return 0;
2a451106 1628
0d39a070
DJ
1629 case 0x4:
1630 /* Load/store multiple. */
1631 if (bit (this_instr, 20) == 1 && bit (this_instr, 15) == 1)
1632 return 1;
1633 else
1634 return 0;
2a451106 1635
0d39a070
DJ
1636 case 0x5:
1637 /* Branch and branch with link. */
1638 return 1;
2a451106 1639
0d39a070
DJ
1640 case 0x6:
1641 case 0x7:
1642 /* Coprocessor transfers or SWIs can not affect PC. */
1643 return 0;
eb5492fa 1644
0d39a070 1645 default:
9b20d036 1646 internal_error (__FILE__, __LINE__, _("bad value in switch"));
0d39a070
DJ
1647 }
1648}
c906108c 1649
0d39a070
DJ
1650/* Analyze an ARM mode prologue starting at PROLOGUE_START and
1651 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1652 fill it in. Return the first address not recognized as a prologue
1653 instruction.
eb5492fa 1654
0d39a070
DJ
1655 We recognize all the instructions typically found in ARM prologues,
1656 plus harmless instructions which can be skipped (either for analysis
1657 purposes, or a more restrictive set that can be skipped when finding
1658 the end of the prologue). */
1659
1660static CORE_ADDR
1661arm_analyze_prologue (struct gdbarch *gdbarch,
1662 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1663 struct arm_prologue_cache *cache)
1664{
1665 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1666 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1667 int regno;
1668 CORE_ADDR offset, current_pc;
1669 pv_t regs[ARM_FPS_REGNUM];
1670 struct pv_area *stack;
1671 struct cleanup *back_to;
1672 int framereg, framesize;
1673 CORE_ADDR unrecognized_pc = 0;
1674
1675 /* Search the prologue looking for instructions that set up the
96baa820 1676 frame pointer, adjust the stack pointer, and save registers.
ed9a39eb 1677
96baa820
JM
1678 Be careful, however, and if it doesn't look like a prologue,
1679 don't try to scan it. If, for instance, a frameless function
1680 begins with stmfd sp!, then we will tell ourselves there is
b8d5e71d 1681 a frame, which will confuse stack traceback, as well as "finish"
96baa820 1682 and other operations that rely on a knowledge of the stack
0d39a070 1683 traceback. */
d4473757 1684
4be43953
DJ
1685 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1686 regs[regno] = pv_register (regno, 0);
55f960e1 1687 stack = make_pv_area (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
4be43953
DJ
1688 back_to = make_cleanup_free_pv_area (stack);
1689
94c30b78
MS
1690 for (current_pc = prologue_start;
1691 current_pc < prologue_end;
f43845b3 1692 current_pc += 4)
96baa820 1693 {
e17a4113
UW
1694 unsigned int insn
1695 = read_memory_unsigned_integer (current_pc, 4, byte_order_for_code);
9d4fde75 1696
94c30b78 1697 if (insn == 0xe1a0c00d) /* mov ip, sp */
f43845b3 1698 {
4be43953 1699 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
28cd8767
JG
1700 continue;
1701 }
0d39a070
DJ
1702 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
1703 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1704 {
1705 unsigned imm = insn & 0xff; /* immediate value */
1706 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1707 int rd = bits (insn, 12, 15);
28cd8767 1708 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1709 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
28cd8767
JG
1710 continue;
1711 }
0d39a070
DJ
1712 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
1713 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
28cd8767
JG
1714 {
1715 unsigned imm = insn & 0xff; /* immediate value */
1716 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
0d39a070 1717 int rd = bits (insn, 12, 15);
28cd8767 1718 imm = (imm >> rot) | (imm << (32 - rot));
0d39a070 1719 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
f43845b3
MS
1720 continue;
1721 }
0963b4bd
MS
1722 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
1723 [sp, #-4]! */
f43845b3 1724 {
4be43953
DJ
1725 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1726 break;
1727 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
0d39a070
DJ
1728 pv_area_store (stack, regs[ARM_SP_REGNUM], 4,
1729 regs[bits (insn, 12, 15)]);
f43845b3
MS
1730 continue;
1731 }
1732 else if ((insn & 0xffff0000) == 0xe92d0000)
d4473757
KB
1733 /* stmfd sp!, {..., fp, ip, lr, pc}
1734 or
1735 stmfd sp!, {a1, a2, a3, a4} */
c906108c 1736 {
d4473757 1737 int mask = insn & 0xffff;
ed9a39eb 1738
4be43953
DJ
1739 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1740 break;
1741
94c30b78 1742 /* Calculate offsets of saved registers. */
34e8f22d 1743 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
d4473757
KB
1744 if (mask & (1 << regno))
1745 {
0963b4bd
MS
1746 regs[ARM_SP_REGNUM]
1747 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
4be43953 1748 pv_area_store (stack, regs[ARM_SP_REGNUM], 4, regs[regno]);
d4473757
KB
1749 }
1750 }
0d39a070
DJ
1751 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
1752 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
f8bf5763 1753 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
b8d5e71d
MS
1754 {
1755 /* No need to add this to saved_regs -- it's just an arg reg. */
1756 continue;
1757 }
0d39a070
DJ
1758 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
1759 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
f8bf5763 1760 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
f43845b3
MS
1761 {
1762 /* No need to add this to saved_regs -- it's just an arg reg. */
1763 continue;
1764 }
0963b4bd
MS
1765 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
1766 { registers } */
0d39a070
DJ
1767 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1768 {
1769 /* No need to add this to saved_regs -- it's just arg regs. */
1770 continue;
1771 }
d4473757
KB
1772 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
1773 {
94c30b78
MS
1774 unsigned imm = insn & 0xff; /* immediate value */
1775 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1776 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1777 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
d4473757
KB
1778 }
1779 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
1780 {
94c30b78
MS
1781 unsigned imm = insn & 0xff; /* immediate value */
1782 unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
d4473757 1783 imm = (imm >> rot) | (imm << (32 - rot));
4be43953 1784 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
d4473757 1785 }
0963b4bd
MS
1786 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
1787 [sp, -#c]! */
2af46ca0 1788 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757 1789 {
4be43953
DJ
1790 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1791 break;
1792
1793 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
34e8f22d 1794 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
4be43953 1795 pv_area_store (stack, regs[ARM_SP_REGNUM], 12, regs[regno]);
d4473757 1796 }
0963b4bd
MS
1797 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
1798 [sp!] */
2af46ca0 1799 && gdbarch_tdep (gdbarch)->have_fpa_registers)
d4473757
KB
1800 {
1801 int n_saved_fp_regs;
1802 unsigned int fp_start_reg, fp_bound_reg;
1803
4be43953
DJ
1804 if (pv_area_store_would_trash (stack, regs[ARM_SP_REGNUM]))
1805 break;
1806
94c30b78 1807 if ((insn & 0x800) == 0x800) /* N0 is set */
96baa820 1808 {
d4473757
KB
1809 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1810 n_saved_fp_regs = 3;
1811 else
1812 n_saved_fp_regs = 1;
96baa820 1813 }
d4473757 1814 else
96baa820 1815 {
d4473757
KB
1816 if ((insn & 0x40000) == 0x40000) /* N1 is set */
1817 n_saved_fp_regs = 2;
1818 else
1819 n_saved_fp_regs = 4;
96baa820 1820 }
d4473757 1821
34e8f22d 1822 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
d4473757
KB
1823 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
1824 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
96baa820 1825 {
4be43953
DJ
1826 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
1827 pv_area_store (stack, regs[ARM_SP_REGNUM], 12,
1828 regs[fp_start_reg++]);
96baa820 1829 }
c906108c 1830 }
0d39a070
DJ
1831 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
1832 {
1833 /* Allow some special function calls when skipping the
1834 prologue; GCC generates these before storing arguments to
1835 the stack. */
1836 CORE_ADDR dest = BranchDest (current_pc, insn);
1837
e0634ccf 1838 if (skip_prologue_function (gdbarch, dest, 0))
0d39a070
DJ
1839 continue;
1840 else
1841 break;
1842 }
d4473757 1843 else if ((insn & 0xf0000000) != 0xe0000000)
0963b4bd 1844 break; /* Condition not true, exit early. */
0d39a070
DJ
1845 else if (arm_instruction_changes_pc (insn))
1846 /* Don't scan past anything that might change control flow. */
1847 break;
d19f7eee
UW
1848 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
1849 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1850 /* Ignore block loads from the stack, potentially copying
1851 parameters from memory. */
1852 continue;
1853 else if ((insn & 0xfc500000) == 0xe4100000
1854 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
1855 /* Similarly ignore single loads from the stack. */
1856 continue;
0d39a070
DJ
1857 else if ((insn & 0xffff0ff0) == 0xe1a00000)
1858 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
1859 register instead of the stack. */
d4473757 1860 continue;
0d39a070
DJ
1861 else
1862 {
1863 /* The optimizer might shove anything into the prologue,
1864 so we just skip what we don't recognize. */
1865 unrecognized_pc = current_pc;
1866 continue;
1867 }
c906108c
SS
1868 }
1869
0d39a070
DJ
1870 if (unrecognized_pc == 0)
1871 unrecognized_pc = current_pc;
1872
4be43953
DJ
1873 /* The frame size is just the distance from the frame register
1874 to the original stack pointer. */
1875 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1876 {
1877 /* Frame pointer is fp. */
0d39a070
DJ
1878 framereg = ARM_FP_REGNUM;
1879 framesize = -regs[ARM_FP_REGNUM].k;
4be43953 1880 }
72a2e3dc 1881 else
4be43953
DJ
1882 {
1883 /* Try the stack pointer... this is a bit desperate. */
0d39a070
DJ
1884 framereg = ARM_SP_REGNUM;
1885 framesize = -regs[ARM_SP_REGNUM].k;
4be43953 1886 }
4be43953 1887
0d39a070
DJ
1888 if (cache)
1889 {
1890 cache->framereg = framereg;
1891 cache->framesize = framesize;
1892
1893 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1894 if (pv_area_find_reg (stack, gdbarch, regno, &offset))
1895 cache->saved_regs[regno].addr = offset;
1896 }
1897
1898 if (arm_debug)
1899 fprintf_unfiltered (gdb_stdlog, "Prologue scan stopped at %s\n",
1900 paddress (gdbarch, unrecognized_pc));
4be43953
DJ
1901
1902 do_cleanups (back_to);
0d39a070
DJ
1903 return unrecognized_pc;
1904}
1905
1906static void
1907arm_scan_prologue (struct frame_info *this_frame,
1908 struct arm_prologue_cache *cache)
1909{
1910 struct gdbarch *gdbarch = get_frame_arch (this_frame);
1911 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1912 int regno;
1913 CORE_ADDR prologue_start, prologue_end, current_pc;
1914 CORE_ADDR prev_pc = get_frame_pc (this_frame);
1915 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
1916 pv_t regs[ARM_FPS_REGNUM];
1917 struct pv_area *stack;
1918 struct cleanup *back_to;
1919 CORE_ADDR offset;
1920
1921 /* Assume there is no frame until proven otherwise. */
1922 cache->framereg = ARM_SP_REGNUM;
1923 cache->framesize = 0;
1924
1925 /* Check for Thumb prologue. */
1926 if (arm_frame_is_thumb (this_frame))
1927 {
1928 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
1929 return;
1930 }
1931
1932 /* Find the function prologue. If we can't find the function in
1933 the symbol table, peek in the stack frame to find the PC. */
1934 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1935 &prologue_end))
1936 {
1937 /* One way to find the end of the prologue (which works well
1938 for unoptimized code) is to do the following:
1939
1940 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
1941
1942 if (sal.line == 0)
1943 prologue_end = prev_pc;
1944 else if (sal.end < prologue_end)
1945 prologue_end = sal.end;
1946
1947 This mechanism is very accurate so long as the optimizer
1948 doesn't move any instructions from the function body into the
1949 prologue. If this happens, sal.end will be the last
1950 instruction in the first hunk of prologue code just before
1951 the first instruction that the scheduler has moved from
1952 the body to the prologue.
1953
1954 In order to make sure that we scan all of the prologue
1955 instructions, we use a slightly less accurate mechanism which
1956 may scan more than necessary. To help compensate for this
1957 lack of accuracy, the prologue scanning loop below contains
1958 several clauses which'll cause the loop to terminate early if
1959 an implausible prologue instruction is encountered.
1960
1961 The expression
1962
1963 prologue_start + 64
1964
1965 is a suitable endpoint since it accounts for the largest
1966 possible prologue plus up to five instructions inserted by
1967 the scheduler. */
1968
1969 if (prologue_end > prologue_start + 64)
1970 {
1971 prologue_end = prologue_start + 64; /* See above. */
1972 }
1973 }
1974 else
1975 {
1976 /* We have no symbol information. Our only option is to assume this
1977 function has a standard stack frame and the normal frame register.
1978 Then, we can find the value of our frame pointer on entrance to
1979 the callee (or at the present moment if this is the innermost frame).
1980 The value stored there should be the address of the stmfd + 8. */
1981 CORE_ADDR frame_loc;
1982 LONGEST return_value;
1983
1984 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
1985 if (!safe_read_memory_integer (frame_loc, 4, byte_order, &return_value))
1986 return;
1987 else
1988 {
1989 prologue_start = gdbarch_addr_bits_remove
1990 (gdbarch, return_value) - 8;
1991 prologue_end = prologue_start + 64; /* See above. */
1992 }
1993 }
1994
1995 if (prev_pc < prologue_end)
1996 prologue_end = prev_pc;
1997
1998 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
c906108c
SS
1999}
2000
eb5492fa 2001static struct arm_prologue_cache *
a262aec2 2002arm_make_prologue_cache (struct frame_info *this_frame)
c906108c 2003{
eb5492fa
DJ
2004 int reg;
2005 struct arm_prologue_cache *cache;
2006 CORE_ADDR unwound_fp;
c5aa993b 2007
35d5d4ee 2008 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2009 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
c906108c 2010
a262aec2 2011 arm_scan_prologue (this_frame, cache);
848cfffb 2012
a262aec2 2013 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
eb5492fa
DJ
2014 if (unwound_fp == 0)
2015 return cache;
c906108c 2016
4be43953 2017 cache->prev_sp = unwound_fp + cache->framesize;
c906108c 2018
eb5492fa
DJ
2019 /* Calculate actual addresses of saved registers using offsets
2020 determined by arm_scan_prologue. */
a262aec2 2021 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
e28a332c 2022 if (trad_frame_addr_p (cache->saved_regs, reg))
eb5492fa
DJ
2023 cache->saved_regs[reg].addr += cache->prev_sp;
2024
2025 return cache;
c906108c
SS
2026}
2027
eb5492fa
DJ
2028/* Our frame ID for a normal frame is the current function's starting PC
2029 and the caller's SP when we were called. */
c906108c 2030
148754e5 2031static void
a262aec2 2032arm_prologue_this_id (struct frame_info *this_frame,
eb5492fa
DJ
2033 void **this_cache,
2034 struct frame_id *this_id)
c906108c 2035{
eb5492fa
DJ
2036 struct arm_prologue_cache *cache;
2037 struct frame_id id;
2c404490 2038 CORE_ADDR pc, func;
f079148d 2039
eb5492fa 2040 if (*this_cache == NULL)
a262aec2 2041 *this_cache = arm_make_prologue_cache (this_frame);
eb5492fa 2042 cache = *this_cache;
2a451106 2043
2c404490
DJ
2044 /* This is meant to halt the backtrace at "_start". */
2045 pc = get_frame_pc (this_frame);
2046 if (pc <= gdbarch_tdep (get_frame_arch (this_frame))->lowest_pc)
eb5492fa 2047 return;
5a203e44 2048
eb5492fa
DJ
2049 /* If we've hit a wall, stop. */
2050 if (cache->prev_sp == 0)
2051 return;
24de872b 2052
0e9e9abd
UW
2053 /* Use function start address as part of the frame ID. If we cannot
2054 identify the start address (due to missing symbol information),
2055 fall back to just using the current PC. */
2c404490 2056 func = get_frame_func (this_frame);
0e9e9abd
UW
2057 if (!func)
2058 func = pc;
2059
eb5492fa 2060 id = frame_id_build (cache->prev_sp, func);
eb5492fa 2061 *this_id = id;
c906108c
SS
2062}
2063
a262aec2
DJ
2064static struct value *
2065arm_prologue_prev_register (struct frame_info *this_frame,
eb5492fa 2066 void **this_cache,
a262aec2 2067 int prev_regnum)
24de872b 2068{
24568a2c 2069 struct gdbarch *gdbarch = get_frame_arch (this_frame);
24de872b
DJ
2070 struct arm_prologue_cache *cache;
2071
eb5492fa 2072 if (*this_cache == NULL)
a262aec2 2073 *this_cache = arm_make_prologue_cache (this_frame);
eb5492fa 2074 cache = *this_cache;
24de872b 2075
eb5492fa 2076 /* If we are asked to unwind the PC, then we need to return the LR
b39cc962
DJ
2077 instead. The prologue may save PC, but it will point into this
2078 frame's prologue, not the next frame's resume location. Also
2079 strip the saved T bit. A valid LR may have the low bit set, but
2080 a valid PC never does. */
eb5492fa 2081 if (prev_regnum == ARM_PC_REGNUM)
b39cc962
DJ
2082 {
2083 CORE_ADDR lr;
2084
2085 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2086 return frame_unwind_got_constant (this_frame, prev_regnum,
24568a2c 2087 arm_addr_bits_remove (gdbarch, lr));
b39cc962 2088 }
24de872b 2089
eb5492fa 2090 /* SP is generally not saved to the stack, but this frame is
a262aec2 2091 identified by the next frame's stack pointer at the time of the call.
eb5492fa
DJ
2092 The value was already reconstructed into PREV_SP. */
2093 if (prev_regnum == ARM_SP_REGNUM)
a262aec2 2094 return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
eb5492fa 2095
b39cc962
DJ
2096 /* The CPSR may have been changed by the call instruction and by the
2097 called function. The only bit we can reconstruct is the T bit,
2098 by checking the low bit of LR as of the call. This is a reliable
2099 indicator of Thumb-ness except for some ARM v4T pre-interworking
2100 Thumb code, which could get away with a clear low bit as long as
2101 the called function did not use bx. Guess that all other
2102 bits are unchanged; the condition flags are presumably lost,
2103 but the processor status is likely valid. */
2104 if (prev_regnum == ARM_PS_REGNUM)
2105 {
2106 CORE_ADDR lr, cpsr;
9779414d 2107 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2108
2109 cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
2110 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2111 if (IS_THUMB_ADDR (lr))
9779414d 2112 cpsr |= t_bit;
b39cc962 2113 else
9779414d 2114 cpsr &= ~t_bit;
b39cc962
DJ
2115 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
2116 }
2117
a262aec2
DJ
2118 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2119 prev_regnum);
eb5492fa
DJ
2120}
2121
2122struct frame_unwind arm_prologue_unwind = {
2123 NORMAL_FRAME,
8fbca658 2124 default_frame_unwind_stop_reason,
eb5492fa 2125 arm_prologue_this_id,
a262aec2
DJ
2126 arm_prologue_prev_register,
2127 NULL,
2128 default_frame_sniffer
eb5492fa
DJ
2129};
2130
0e9e9abd
UW
2131/* Maintain a list of ARM exception table entries per objfile, similar to the
2132 list of mapping symbols. We only cache entries for standard ARM-defined
2133 personality routines; the cache will contain only the frame unwinding
2134 instructions associated with the entry (not the descriptors). */
2135
2136static const struct objfile_data *arm_exidx_data_key;
2137
2138struct arm_exidx_entry
2139{
2140 bfd_vma addr;
2141 gdb_byte *entry;
2142};
2143typedef struct arm_exidx_entry arm_exidx_entry_s;
2144DEF_VEC_O(arm_exidx_entry_s);
2145
2146struct arm_exidx_data
2147{
2148 VEC(arm_exidx_entry_s) **section_maps;
2149};
2150
2151static void
2152arm_exidx_data_free (struct objfile *objfile, void *arg)
2153{
2154 struct arm_exidx_data *data = arg;
2155 unsigned int i;
2156
2157 for (i = 0; i < objfile->obfd->section_count; i++)
2158 VEC_free (arm_exidx_entry_s, data->section_maps[i]);
2159}
2160
2161static inline int
2162arm_compare_exidx_entries (const struct arm_exidx_entry *lhs,
2163 const struct arm_exidx_entry *rhs)
2164{
2165 return lhs->addr < rhs->addr;
2166}
2167
2168static struct obj_section *
2169arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2170{
2171 struct obj_section *osect;
2172
2173 ALL_OBJFILE_OSECTIONS (objfile, osect)
2174 if (bfd_get_section_flags (objfile->obfd,
2175 osect->the_bfd_section) & SEC_ALLOC)
2176 {
2177 bfd_vma start, size;
2178 start = bfd_get_section_vma (objfile->obfd, osect->the_bfd_section);
2179 size = bfd_get_section_size (osect->the_bfd_section);
2180
2181 if (start <= vma && vma < start + size)
2182 return osect;
2183 }
2184
2185 return NULL;
2186}
2187
2188/* Parse contents of exception table and exception index sections
2189 of OBJFILE, and fill in the exception table entry cache.
2190
2191 For each entry that refers to a standard ARM-defined personality
2192 routine, extract the frame unwinding instructions (from either
2193 the index or the table section). The unwinding instructions
2194 are normalized by:
2195 - extracting them from the rest of the table data
2196 - converting to host endianness
2197 - appending the implicit 0xb0 ("Finish") code
2198
2199 The extracted and normalized instructions are stored for later
2200 retrieval by the arm_find_exidx_entry routine. */
2201
2202static void
2203arm_exidx_new_objfile (struct objfile *objfile)
2204{
3bb47e8b 2205 struct cleanup *cleanups;
0e9e9abd
UW
2206 struct arm_exidx_data *data;
2207 asection *exidx, *extab;
2208 bfd_vma exidx_vma = 0, extab_vma = 0;
2209 bfd_size_type exidx_size = 0, extab_size = 0;
2210 gdb_byte *exidx_data = NULL, *extab_data = NULL;
2211 LONGEST i;
2212
2213 /* If we've already touched this file, do nothing. */
2214 if (!objfile || objfile_data (objfile, arm_exidx_data_key) != NULL)
2215 return;
3bb47e8b 2216 cleanups = make_cleanup (null_cleanup, NULL);
0e9e9abd
UW
2217
2218 /* Read contents of exception table and index. */
2219 exidx = bfd_get_section_by_name (objfile->obfd, ".ARM.exidx");
2220 if (exidx)
2221 {
2222 exidx_vma = bfd_section_vma (objfile->obfd, exidx);
2223 exidx_size = bfd_get_section_size (exidx);
2224 exidx_data = xmalloc (exidx_size);
2225 make_cleanup (xfree, exidx_data);
2226
2227 if (!bfd_get_section_contents (objfile->obfd, exidx,
2228 exidx_data, 0, exidx_size))
2229 {
2230 do_cleanups (cleanups);
2231 return;
2232 }
2233 }
2234
2235 extab = bfd_get_section_by_name (objfile->obfd, ".ARM.extab");
2236 if (extab)
2237 {
2238 extab_vma = bfd_section_vma (objfile->obfd, extab);
2239 extab_size = bfd_get_section_size (extab);
2240 extab_data = xmalloc (extab_size);
2241 make_cleanup (xfree, extab_data);
2242
2243 if (!bfd_get_section_contents (objfile->obfd, extab,
2244 extab_data, 0, extab_size))
2245 {
2246 do_cleanups (cleanups);
2247 return;
2248 }
2249 }
2250
2251 /* Allocate exception table data structure. */
2252 data = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct arm_exidx_data);
2253 set_objfile_data (objfile, arm_exidx_data_key, data);
2254 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
2255 objfile->obfd->section_count,
2256 VEC(arm_exidx_entry_s) *);
2257
2258 /* Fill in exception table. */
2259 for (i = 0; i < exidx_size / 8; i++)
2260 {
2261 struct arm_exidx_entry new_exidx_entry;
2262 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8);
2263 bfd_vma val = bfd_h_get_32 (objfile->obfd, exidx_data + i * 8 + 4);
2264 bfd_vma addr = 0, word = 0;
2265 int n_bytes = 0, n_words = 0;
2266 struct obj_section *sec;
2267 gdb_byte *entry = NULL;
2268
2269 /* Extract address of start of function. */
2270 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2271 idx += exidx_vma + i * 8;
2272
2273 /* Find section containing function and compute section offset. */
2274 sec = arm_obj_section_from_vma (objfile, idx);
2275 if (sec == NULL)
2276 continue;
2277 idx -= bfd_get_section_vma (objfile->obfd, sec->the_bfd_section);
2278
2279 /* Determine address of exception table entry. */
2280 if (val == 1)
2281 {
2282 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2283 }
2284 else if ((val & 0xff000000) == 0x80000000)
2285 {
2286 /* Exception table entry embedded in .ARM.exidx
2287 -- must be short form. */
2288 word = val;
2289 n_bytes = 3;
2290 }
2291 else if (!(val & 0x80000000))
2292 {
2293 /* Exception table entry in .ARM.extab. */
2294 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2295 addr += exidx_vma + i * 8 + 4;
2296
2297 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_size)
2298 {
2299 word = bfd_h_get_32 (objfile->obfd,
2300 extab_data + addr - extab_vma);
2301 addr += 4;
2302
2303 if ((word & 0xff000000) == 0x80000000)
2304 {
2305 /* Short form. */
2306 n_bytes = 3;
2307 }
2308 else if ((word & 0xff000000) == 0x81000000
2309 || (word & 0xff000000) == 0x82000000)
2310 {
2311 /* Long form. */
2312 n_bytes = 2;
2313 n_words = ((word >> 16) & 0xff);
2314 }
2315 else if (!(word & 0x80000000))
2316 {
2317 bfd_vma pers;
2318 struct obj_section *pers_sec;
2319 int gnu_personality = 0;
2320
2321 /* Custom personality routine. */
2322 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2323 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2324
2325 /* Check whether we've got one of the variants of the
2326 GNU personality routines. */
2327 pers_sec = arm_obj_section_from_vma (objfile, pers);
2328 if (pers_sec)
2329 {
2330 static const char *personality[] =
2331 {
2332 "__gcc_personality_v0",
2333 "__gxx_personality_v0",
2334 "__gcj_personality_v0",
2335 "__gnu_objc_personality_v0",
2336 NULL
2337 };
2338
2339 CORE_ADDR pc = pers + obj_section_offset (pers_sec);
2340 int k;
2341
2342 for (k = 0; personality[k]; k++)
2343 if (lookup_minimal_symbol_by_pc_name
2344 (pc, personality[k], objfile))
2345 {
2346 gnu_personality = 1;
2347 break;
2348 }
2349 }
2350
2351 /* If so, the next word contains a word count in the high
2352 byte, followed by the same unwind instructions as the
2353 pre-defined forms. */
2354 if (gnu_personality
2355 && addr + 4 <= extab_vma + extab_size)
2356 {
2357 word = bfd_h_get_32 (objfile->obfd,
2358 extab_data + addr - extab_vma);
2359 addr += 4;
2360 n_bytes = 3;
2361 n_words = ((word >> 24) & 0xff);
2362 }
2363 }
2364 }
2365 }
2366
2367 /* Sanity check address. */
2368 if (n_words)
2369 if (addr < extab_vma || addr + 4 * n_words > extab_vma + extab_size)
2370 n_words = n_bytes = 0;
2371
2372 /* The unwind instructions reside in WORD (only the N_BYTES least
2373 significant bytes are valid), followed by N_WORDS words in the
2374 extab section starting at ADDR. */
2375 if (n_bytes || n_words)
2376 {
2377 gdb_byte *p = entry = obstack_alloc (&objfile->objfile_obstack,
2378 n_bytes + n_words * 4 + 1);
2379
2380 while (n_bytes--)
2381 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2382
2383 while (n_words--)
2384 {
2385 word = bfd_h_get_32 (objfile->obfd,
2386 extab_data + addr - extab_vma);
2387 addr += 4;
2388
2389 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2390 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2391 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2392 *p++ = (gdb_byte) (word & 0xff);
2393 }
2394
2395 /* Implied "Finish" to terminate the list. */
2396 *p++ = 0xb0;
2397 }
2398
2399 /* Push entry onto vector. They are guaranteed to always
2400 appear in order of increasing addresses. */
2401 new_exidx_entry.addr = idx;
2402 new_exidx_entry.entry = entry;
2403 VEC_safe_push (arm_exidx_entry_s,
2404 data->section_maps[sec->the_bfd_section->index],
2405 &new_exidx_entry);
2406 }
2407
2408 do_cleanups (cleanups);
2409}
2410
2411/* Search for the exception table entry covering MEMADDR. If one is found,
2412 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2413 set *START to the start of the region covered by this entry. */
2414
2415static gdb_byte *
2416arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2417{
2418 struct obj_section *sec;
2419
2420 sec = find_pc_section (memaddr);
2421 if (sec != NULL)
2422 {
2423 struct arm_exidx_data *data;
2424 VEC(arm_exidx_entry_s) *map;
2425 struct arm_exidx_entry map_key = { memaddr - obj_section_addr (sec), 0 };
2426 unsigned int idx;
2427
2428 data = objfile_data (sec->objfile, arm_exidx_data_key);
2429 if (data != NULL)
2430 {
2431 map = data->section_maps[sec->the_bfd_section->index];
2432 if (!VEC_empty (arm_exidx_entry_s, map))
2433 {
2434 struct arm_exidx_entry *map_sym;
2435
2436 idx = VEC_lower_bound (arm_exidx_entry_s, map, &map_key,
2437 arm_compare_exidx_entries);
2438
2439 /* VEC_lower_bound finds the earliest ordered insertion
2440 point. If the following symbol starts at this exact
2441 address, we use that; otherwise, the preceding
2442 exception table entry covers this address. */
2443 if (idx < VEC_length (arm_exidx_entry_s, map))
2444 {
2445 map_sym = VEC_index (arm_exidx_entry_s, map, idx);
2446 if (map_sym->addr == map_key.addr)
2447 {
2448 if (start)
2449 *start = map_sym->addr + obj_section_addr (sec);
2450 return map_sym->entry;
2451 }
2452 }
2453
2454 if (idx > 0)
2455 {
2456 map_sym = VEC_index (arm_exidx_entry_s, map, idx - 1);
2457 if (start)
2458 *start = map_sym->addr + obj_section_addr (sec);
2459 return map_sym->entry;
2460 }
2461 }
2462 }
2463 }
2464
2465 return NULL;
2466}
2467
2468/* Given the current frame THIS_FRAME, and its associated frame unwinding
2469 instruction list from the ARM exception table entry ENTRY, allocate and
2470 return a prologue cache structure describing how to unwind this frame.
2471
2472 Return NULL if the unwinding instruction list contains a "spare",
2473 "reserved" or "refuse to unwind" instruction as defined in section
2474 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2475 for the ARM Architecture" document. */
2476
2477static struct arm_prologue_cache *
2478arm_exidx_fill_cache (struct frame_info *this_frame, gdb_byte *entry)
2479{
2480 CORE_ADDR vsp = 0;
2481 int vsp_valid = 0;
2482
2483 struct arm_prologue_cache *cache;
2484 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2485 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
2486
2487 for (;;)
2488 {
2489 gdb_byte insn;
2490
2491 /* Whenever we reload SP, we actually have to retrieve its
2492 actual value in the current frame. */
2493 if (!vsp_valid)
2494 {
2495 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2496 {
2497 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2498 vsp = get_frame_register_unsigned (this_frame, reg);
2499 }
2500 else
2501 {
2502 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr;
2503 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2504 }
2505
2506 vsp_valid = 1;
2507 }
2508
2509 /* Decode next unwind instruction. */
2510 insn = *entry++;
2511
2512 if ((insn & 0xc0) == 0)
2513 {
2514 int offset = insn & 0x3f;
2515 vsp += (offset << 2) + 4;
2516 }
2517 else if ((insn & 0xc0) == 0x40)
2518 {
2519 int offset = insn & 0x3f;
2520 vsp -= (offset << 2) + 4;
2521 }
2522 else if ((insn & 0xf0) == 0x80)
2523 {
2524 int mask = ((insn & 0xf) << 8) | *entry++;
2525 int i;
2526
2527 /* The special case of an all-zero mask identifies
2528 "Refuse to unwind". We return NULL to fall back
2529 to the prologue analyzer. */
2530 if (mask == 0)
2531 return NULL;
2532
2533 /* Pop registers r4..r15 under mask. */
2534 for (i = 0; i < 12; i++)
2535 if (mask & (1 << i))
2536 {
2537 cache->saved_regs[4 + i].addr = vsp;
2538 vsp += 4;
2539 }
2540
2541 /* Special-case popping SP -- we need to reload vsp. */
2542 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2543 vsp_valid = 0;
2544 }
2545 else if ((insn & 0xf0) == 0x90)
2546 {
2547 int reg = insn & 0xf;
2548
2549 /* Reserved cases. */
2550 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2551 return NULL;
2552
2553 /* Set SP from another register and mark VSP for reload. */
2554 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2555 vsp_valid = 0;
2556 }
2557 else if ((insn & 0xf0) == 0xa0)
2558 {
2559 int count = insn & 0x7;
2560 int pop_lr = (insn & 0x8) != 0;
2561 int i;
2562
2563 /* Pop r4..r[4+count]. */
2564 for (i = 0; i <= count; i++)
2565 {
2566 cache->saved_regs[4 + i].addr = vsp;
2567 vsp += 4;
2568 }
2569
2570 /* If indicated by flag, pop LR as well. */
2571 if (pop_lr)
2572 {
2573 cache->saved_regs[ARM_LR_REGNUM].addr = vsp;
2574 vsp += 4;
2575 }
2576 }
2577 else if (insn == 0xb0)
2578 {
2579 /* We could only have updated PC by popping into it; if so, it
2580 will show up as address. Otherwise, copy LR into PC. */
2581 if (!trad_frame_addr_p (cache->saved_regs, ARM_PC_REGNUM))
2582 cache->saved_regs[ARM_PC_REGNUM]
2583 = cache->saved_regs[ARM_LR_REGNUM];
2584
2585 /* We're done. */
2586 break;
2587 }
2588 else if (insn == 0xb1)
2589 {
2590 int mask = *entry++;
2591 int i;
2592
2593 /* All-zero mask and mask >= 16 is "spare". */
2594 if (mask == 0 || mask >= 16)
2595 return NULL;
2596
2597 /* Pop r0..r3 under mask. */
2598 for (i = 0; i < 4; i++)
2599 if (mask & (1 << i))
2600 {
2601 cache->saved_regs[i].addr = vsp;
2602 vsp += 4;
2603 }
2604 }
2605 else if (insn == 0xb2)
2606 {
2607 ULONGEST offset = 0;
2608 unsigned shift = 0;
2609
2610 do
2611 {
2612 offset |= (*entry & 0x7f) << shift;
2613 shift += 7;
2614 }
2615 while (*entry++ & 0x80);
2616
2617 vsp += 0x204 + (offset << 2);
2618 }
2619 else if (insn == 0xb3)
2620 {
2621 int start = *entry >> 4;
2622 int count = (*entry++) & 0xf;
2623 int i;
2624
2625 /* Only registers D0..D15 are valid here. */
2626 if (start + count >= 16)
2627 return NULL;
2628
2629 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2630 for (i = 0; i <= count; i++)
2631 {
2632 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2633 vsp += 8;
2634 }
2635
2636 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2637 vsp += 4;
2638 }
2639 else if ((insn & 0xf8) == 0xb8)
2640 {
2641 int count = insn & 0x7;
2642 int i;
2643
2644 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2645 for (i = 0; i <= count; i++)
2646 {
2647 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2648 vsp += 8;
2649 }
2650
2651 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2652 vsp += 4;
2653 }
2654 else if (insn == 0xc6)
2655 {
2656 int start = *entry >> 4;
2657 int count = (*entry++) & 0xf;
2658 int i;
2659
2660 /* Only registers WR0..WR15 are valid. */
2661 if (start + count >= 16)
2662 return NULL;
2663
2664 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2665 for (i = 0; i <= count; i++)
2666 {
2667 cache->saved_regs[ARM_WR0_REGNUM + start + i].addr = vsp;
2668 vsp += 8;
2669 }
2670 }
2671 else if (insn == 0xc7)
2672 {
2673 int mask = *entry++;
2674 int i;
2675
2676 /* All-zero mask and mask >= 16 is "spare". */
2677 if (mask == 0 || mask >= 16)
2678 return NULL;
2679
2680 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2681 for (i = 0; i < 4; i++)
2682 if (mask & (1 << i))
2683 {
2684 cache->saved_regs[ARM_WCGR0_REGNUM + i].addr = vsp;
2685 vsp += 4;
2686 }
2687 }
2688 else if ((insn & 0xf8) == 0xc0)
2689 {
2690 int count = insn & 0x7;
2691 int i;
2692
2693 /* Pop iwmmx registers WR[10]..WR[10+count]. */
2694 for (i = 0; i <= count; i++)
2695 {
2696 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].addr = vsp;
2697 vsp += 8;
2698 }
2699 }
2700 else if (insn == 0xc8)
2701 {
2702 int start = *entry >> 4;
2703 int count = (*entry++) & 0xf;
2704 int i;
2705
2706 /* Only registers D0..D31 are valid. */
2707 if (start + count >= 16)
2708 return NULL;
2709
2710 /* Pop VFP double-precision registers
2711 D[16+start]..D[16+start+count]. */
2712 for (i = 0; i <= count; i++)
2713 {
2714 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].addr = vsp;
2715 vsp += 8;
2716 }
2717 }
2718 else if (insn == 0xc9)
2719 {
2720 int start = *entry >> 4;
2721 int count = (*entry++) & 0xf;
2722 int i;
2723
2724 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2725 for (i = 0; i <= count; i++)
2726 {
2727 cache->saved_regs[ARM_D0_REGNUM + start + i].addr = vsp;
2728 vsp += 8;
2729 }
2730 }
2731 else if ((insn & 0xf8) == 0xd0)
2732 {
2733 int count = insn & 0x7;
2734 int i;
2735
2736 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2737 for (i = 0; i <= count; i++)
2738 {
2739 cache->saved_regs[ARM_D0_REGNUM + 8 + i].addr = vsp;
2740 vsp += 8;
2741 }
2742 }
2743 else
2744 {
2745 /* Everything else is "spare". */
2746 return NULL;
2747 }
2748 }
2749
2750 /* If we restore SP from a register, assume this was the frame register.
2751 Otherwise just fall back to SP as frame register. */
2752 if (trad_frame_realreg_p (cache->saved_regs, ARM_SP_REGNUM))
2753 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg;
2754 else
2755 cache->framereg = ARM_SP_REGNUM;
2756
2757 /* Determine offset to previous frame. */
2758 cache->framesize
2759 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
2760
2761 /* We already got the previous SP. */
2762 cache->prev_sp = vsp;
2763
2764 return cache;
2765}
2766
2767/* Unwinding via ARM exception table entries. Note that the sniffer
2768 already computes a filled-in prologue cache, which is then used
2769 with the same arm_prologue_this_id and arm_prologue_prev_register
2770 routines also used for prologue-parsing based unwinding. */
2771
2772static int
2773arm_exidx_unwind_sniffer (const struct frame_unwind *self,
2774 struct frame_info *this_frame,
2775 void **this_prologue_cache)
2776{
2777 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2778 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
2779 CORE_ADDR addr_in_block, exidx_region, func_start;
2780 struct arm_prologue_cache *cache;
2781 gdb_byte *entry;
2782
2783 /* See if we have an ARM exception table entry covering this address. */
2784 addr_in_block = get_frame_address_in_block (this_frame);
2785 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
2786 if (!entry)
2787 return 0;
2788
2789 /* The ARM exception table does not describe unwind information
2790 for arbitrary PC values, but is guaranteed to be correct only
2791 at call sites. We have to decide here whether we want to use
2792 ARM exception table information for this frame, or fall back
2793 to using prologue parsing. (Note that if we have DWARF CFI,
2794 this sniffer isn't even called -- CFI is always preferred.)
2795
2796 Before we make this decision, however, we check whether we
2797 actually have *symbol* information for the current frame.
2798 If not, prologue parsing would not work anyway, so we might
2799 as well use the exception table and hope for the best. */
2800 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
2801 {
2802 int exc_valid = 0;
2803
2804 /* If the next frame is "normal", we are at a call site in this
2805 frame, so exception information is guaranteed to be valid. */
2806 if (get_next_frame (this_frame)
2807 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
2808 exc_valid = 1;
2809
2810 /* We also assume exception information is valid if we're currently
2811 blocked in a system call. The system library is supposed to
2812 ensure this, so that e.g. pthread cancellation works. */
2813 if (arm_frame_is_thumb (this_frame))
2814 {
2815 LONGEST insn;
2816
2817 if (safe_read_memory_integer (get_frame_pc (this_frame) - 2, 2,
2818 byte_order_for_code, &insn)
2819 && (insn & 0xff00) == 0xdf00 /* svc */)
2820 exc_valid = 1;
2821 }
2822 else
2823 {
2824 LONGEST insn;
2825
2826 if (safe_read_memory_integer (get_frame_pc (this_frame) - 4, 4,
2827 byte_order_for_code, &insn)
2828 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
2829 exc_valid = 1;
2830 }
2831
2832 /* Bail out if we don't know that exception information is valid. */
2833 if (!exc_valid)
2834 return 0;
2835
2836 /* The ARM exception index does not mark the *end* of the region
2837 covered by the entry, and some functions will not have any entry.
2838 To correctly recognize the end of the covered region, the linker
2839 should have inserted dummy records with a CANTUNWIND marker.
2840
2841 Unfortunately, current versions of GNU ld do not reliably do
2842 this, and thus we may have found an incorrect entry above.
2843 As a (temporary) sanity check, we only use the entry if it
2844 lies *within* the bounds of the function. Note that this check
2845 might reject perfectly valid entries that just happen to cover
2846 multiple functions; therefore this check ought to be removed
2847 once the linker is fixed. */
2848 if (func_start > exidx_region)
2849 return 0;
2850 }
2851
2852 /* Decode the list of unwinding instructions into a prologue cache.
2853 Note that this may fail due to e.g. a "refuse to unwind" code. */
2854 cache = arm_exidx_fill_cache (this_frame, entry);
2855 if (!cache)
2856 return 0;
2857
2858 *this_prologue_cache = cache;
2859 return 1;
2860}
2861
2862struct frame_unwind arm_exidx_unwind = {
2863 NORMAL_FRAME,
8fbca658 2864 default_frame_unwind_stop_reason,
0e9e9abd
UW
2865 arm_prologue_this_id,
2866 arm_prologue_prev_register,
2867 NULL,
2868 arm_exidx_unwind_sniffer
2869};
2870
909cf6ea 2871static struct arm_prologue_cache *
a262aec2 2872arm_make_stub_cache (struct frame_info *this_frame)
909cf6ea 2873{
909cf6ea 2874 struct arm_prologue_cache *cache;
909cf6ea 2875
35d5d4ee 2876 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
a262aec2 2877 cache->saved_regs = trad_frame_alloc_saved_regs (this_frame);
909cf6ea 2878
a262aec2 2879 cache->prev_sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
909cf6ea
DJ
2880
2881 return cache;
2882}
2883
2884/* Our frame ID for a stub frame is the current SP and LR. */
2885
2886static void
a262aec2 2887arm_stub_this_id (struct frame_info *this_frame,
909cf6ea
DJ
2888 void **this_cache,
2889 struct frame_id *this_id)
2890{
2891 struct arm_prologue_cache *cache;
2892
2893 if (*this_cache == NULL)
a262aec2 2894 *this_cache = arm_make_stub_cache (this_frame);
909cf6ea
DJ
2895 cache = *this_cache;
2896
a262aec2 2897 *this_id = frame_id_build (cache->prev_sp, get_frame_pc (this_frame));
909cf6ea
DJ
2898}
2899
a262aec2
DJ
2900static int
2901arm_stub_unwind_sniffer (const struct frame_unwind *self,
2902 struct frame_info *this_frame,
2903 void **this_prologue_cache)
909cf6ea 2904{
93d42b30 2905 CORE_ADDR addr_in_block;
909cf6ea
DJ
2906 char dummy[4];
2907
a262aec2 2908 addr_in_block = get_frame_address_in_block (this_frame);
93d42b30 2909 if (in_plt_section (addr_in_block, NULL)
fc36e839
DE
2910 /* We also use the stub winder if the target memory is unreadable
2911 to avoid having the prologue unwinder trying to read it. */
a262aec2
DJ
2912 || target_read_memory (get_frame_pc (this_frame), dummy, 4) != 0)
2913 return 1;
909cf6ea 2914
a262aec2 2915 return 0;
909cf6ea
DJ
2916}
2917
a262aec2
DJ
2918struct frame_unwind arm_stub_unwind = {
2919 NORMAL_FRAME,
8fbca658 2920 default_frame_unwind_stop_reason,
a262aec2
DJ
2921 arm_stub_this_id,
2922 arm_prologue_prev_register,
2923 NULL,
2924 arm_stub_unwind_sniffer
2925};
2926
24de872b 2927static CORE_ADDR
a262aec2 2928arm_normal_frame_base (struct frame_info *this_frame, void **this_cache)
24de872b
DJ
2929{
2930 struct arm_prologue_cache *cache;
2931
eb5492fa 2932 if (*this_cache == NULL)
a262aec2 2933 *this_cache = arm_make_prologue_cache (this_frame);
eb5492fa
DJ
2934 cache = *this_cache;
2935
4be43953 2936 return cache->prev_sp - cache->framesize;
24de872b
DJ
2937}
2938
eb5492fa
DJ
2939struct frame_base arm_normal_base = {
2940 &arm_prologue_unwind,
2941 arm_normal_frame_base,
2942 arm_normal_frame_base,
2943 arm_normal_frame_base
2944};
2945
a262aec2 2946/* Assuming THIS_FRAME is a dummy, return the frame ID of that
eb5492fa
DJ
2947 dummy frame. The frame ID's base needs to match the TOS value
2948 saved by save_dummy_frame_tos() and returned from
2949 arm_push_dummy_call, and the PC needs to match the dummy frame's
2950 breakpoint. */
c906108c 2951
eb5492fa 2952static struct frame_id
a262aec2 2953arm_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
c906108c 2954{
0963b4bd
MS
2955 return frame_id_build (get_frame_register_unsigned (this_frame,
2956 ARM_SP_REGNUM),
a262aec2 2957 get_frame_pc (this_frame));
eb5492fa 2958}
c3b4394c 2959
eb5492fa
DJ
2960/* Given THIS_FRAME, find the previous frame's resume PC (which will
2961 be used to construct the previous frame's ID, after looking up the
2962 containing function). */
c3b4394c 2963
eb5492fa
DJ
2964static CORE_ADDR
2965arm_unwind_pc (struct gdbarch *gdbarch, struct frame_info *this_frame)
2966{
2967 CORE_ADDR pc;
2968 pc = frame_unwind_register_unsigned (this_frame, ARM_PC_REGNUM);
24568a2c 2969 return arm_addr_bits_remove (gdbarch, pc);
eb5492fa
DJ
2970}
2971
2972static CORE_ADDR
2973arm_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
2974{
2975 return frame_unwind_register_unsigned (this_frame, ARM_SP_REGNUM);
c906108c
SS
2976}
2977
b39cc962
DJ
2978static struct value *
2979arm_dwarf2_prev_register (struct frame_info *this_frame, void **this_cache,
2980 int regnum)
2981{
24568a2c 2982 struct gdbarch * gdbarch = get_frame_arch (this_frame);
b39cc962 2983 CORE_ADDR lr, cpsr;
9779414d 2984 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
b39cc962
DJ
2985
2986 switch (regnum)
2987 {
2988 case ARM_PC_REGNUM:
2989 /* The PC is normally copied from the return column, which
2990 describes saves of LR. However, that version may have an
2991 extra bit set to indicate Thumb state. The bit is not
2992 part of the PC. */
2993 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2994 return frame_unwind_got_constant (this_frame, regnum,
24568a2c 2995 arm_addr_bits_remove (gdbarch, lr));
b39cc962
DJ
2996
2997 case ARM_PS_REGNUM:
2998 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
ca38c58e 2999 cpsr = get_frame_register_unsigned (this_frame, regnum);
b39cc962
DJ
3000 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
3001 if (IS_THUMB_ADDR (lr))
9779414d 3002 cpsr |= t_bit;
b39cc962 3003 else
9779414d 3004 cpsr &= ~t_bit;
ca38c58e 3005 return frame_unwind_got_constant (this_frame, regnum, cpsr);
b39cc962
DJ
3006
3007 default:
3008 internal_error (__FILE__, __LINE__,
3009 _("Unexpected register %d"), regnum);
3010 }
3011}
3012
3013static void
3014arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
3015 struct dwarf2_frame_state_reg *reg,
3016 struct frame_info *this_frame)
3017{
3018 switch (regnum)
3019 {
3020 case ARM_PC_REGNUM:
3021 case ARM_PS_REGNUM:
3022 reg->how = DWARF2_FRAME_REG_FN;
3023 reg->loc.fn = arm_dwarf2_prev_register;
3024 break;
3025 case ARM_SP_REGNUM:
3026 reg->how = DWARF2_FRAME_REG_CFA;
3027 break;
3028 }
3029}
3030
4024ca99
UW
3031/* Return true if we are in the function's epilogue, i.e. after the
3032 instruction that destroyed the function's stack frame. */
3033
3034static int
3035thumb_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3036{
3037 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3038 unsigned int insn, insn2;
3039 int found_return = 0, found_stack_adjust = 0;
3040 CORE_ADDR func_start, func_end;
3041 CORE_ADDR scan_pc;
3042 gdb_byte buf[4];
3043
3044 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3045 return 0;
3046
3047 /* The epilogue is a sequence of instructions along the following lines:
3048
3049 - add stack frame size to SP or FP
3050 - [if frame pointer used] restore SP from FP
3051 - restore registers from SP [may include PC]
3052 - a return-type instruction [if PC wasn't already restored]
3053
3054 In a first pass, we scan forward from the current PC and verify the
3055 instructions we find as compatible with this sequence, ending in a
3056 return instruction.
3057
3058 However, this is not sufficient to distinguish indirect function calls
3059 within a function from indirect tail calls in the epilogue in some cases.
3060 Therefore, if we didn't already find any SP-changing instruction during
3061 forward scan, we add a backward scanning heuristic to ensure we actually
3062 are in the epilogue. */
3063
3064 scan_pc = pc;
3065 while (scan_pc < func_end && !found_return)
3066 {
3067 if (target_read_memory (scan_pc, buf, 2))
3068 break;
3069
3070 scan_pc += 2;
3071 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3072
3073 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3074 found_return = 1;
3075 else if (insn == 0x46f7) /* mov pc, lr */
3076 found_return = 1;
3077 else if (insn == 0x46bd) /* mov sp, r7 */
3078 found_stack_adjust = 1;
3079 else if ((insn & 0xff00) == 0xb000) /* add sp, imm or sub sp, imm */
3080 found_stack_adjust = 1;
3081 else if ((insn & 0xfe00) == 0xbc00) /* pop <registers> */
3082 {
3083 found_stack_adjust = 1;
3084 if (insn & 0x0100) /* <registers> include PC. */
3085 found_return = 1;
3086 }
db24da6d 3087 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4024ca99
UW
3088 {
3089 if (target_read_memory (scan_pc, buf, 2))
3090 break;
3091
3092 scan_pc += 2;
3093 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3094
3095 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3096 {
3097 found_stack_adjust = 1;
3098 if (insn2 & 0x8000) /* <registers> include PC. */
3099 found_return = 1;
3100 }
3101 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3102 && (insn2 & 0x0fff) == 0x0b04)
3103 {
3104 found_stack_adjust = 1;
3105 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
3106 found_return = 1;
3107 }
3108 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3109 && (insn2 & 0x0e00) == 0x0a00)
3110 found_stack_adjust = 1;
3111 else
3112 break;
3113 }
3114 else
3115 break;
3116 }
3117
3118 if (!found_return)
3119 return 0;
3120
3121 /* Since any instruction in the epilogue sequence, with the possible
3122 exception of return itself, updates the stack pointer, we need to
3123 scan backwards for at most one instruction. Try either a 16-bit or
3124 a 32-bit instruction. This is just a heuristic, so we do not worry
0963b4bd 3125 too much about false positives. */
4024ca99
UW
3126
3127 if (!found_stack_adjust)
3128 {
3129 if (pc - 4 < func_start)
3130 return 0;
3131 if (target_read_memory (pc - 4, buf, 4))
3132 return 0;
3133
3134 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
3135 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
3136
3137 if (insn2 == 0x46bd) /* mov sp, r7 */
3138 found_stack_adjust = 1;
3139 else if ((insn2 & 0xff00) == 0xb000) /* add sp, imm or sub sp, imm */
3140 found_stack_adjust = 1;
3141 else if ((insn2 & 0xff00) == 0xbc00) /* pop <registers> without PC */
3142 found_stack_adjust = 1;
3143 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
3144 found_stack_adjust = 1;
3145 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
3146 && (insn2 & 0x0fff) == 0x0b04)
3147 found_stack_adjust = 1;
3148 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
3149 && (insn2 & 0x0e00) == 0x0a00)
3150 found_stack_adjust = 1;
3151 }
3152
3153 return found_stack_adjust;
3154}
3155
3156/* Return true if we are in the function's epilogue, i.e. after the
3157 instruction that destroyed the function's stack frame. */
3158
3159static int
3160arm_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
3161{
3162 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3163 unsigned int insn;
3164 int found_return, found_stack_adjust;
3165 CORE_ADDR func_start, func_end;
3166
3167 if (arm_pc_is_thumb (gdbarch, pc))
3168 return thumb_in_function_epilogue_p (gdbarch, pc);
3169
3170 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
3171 return 0;
3172
3173 /* We are in the epilogue if the previous instruction was a stack
3174 adjustment and the next instruction is a possible return (bx, mov
3175 pc, or pop). We could have to scan backwards to find the stack
3176 adjustment, or forwards to find the return, but this is a decent
3177 approximation. First scan forwards. */
3178
3179 found_return = 0;
3180 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
3181 if (bits (insn, 28, 31) != INST_NV)
3182 {
3183 if ((insn & 0x0ffffff0) == 0x012fff10)
3184 /* BX. */
3185 found_return = 1;
3186 else if ((insn & 0x0ffffff0) == 0x01a0f000)
3187 /* MOV PC. */
3188 found_return = 1;
3189 else if ((insn & 0x0fff0000) == 0x08bd0000
3190 && (insn & 0x0000c000) != 0)
3191 /* POP (LDMIA), including PC or LR. */
3192 found_return = 1;
3193 }
3194
3195 if (!found_return)
3196 return 0;
3197
3198 /* Scan backwards. This is just a heuristic, so do not worry about
3199 false positives from mode changes. */
3200
3201 if (pc < func_start + 4)
3202 return 0;
3203
73c964d6 3204 found_stack_adjust = 0;
4024ca99
UW
3205 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
3206 if (bits (insn, 28, 31) != INST_NV)
3207 {
3208 if ((insn & 0x0df0f000) == 0x0080d000)
3209 /* ADD SP (register or immediate). */
3210 found_stack_adjust = 1;
3211 else if ((insn & 0x0df0f000) == 0x0040d000)
3212 /* SUB SP (register or immediate). */
3213 found_stack_adjust = 1;
3214 else if ((insn & 0x0ffffff0) == 0x01a0d000)
3215 /* MOV SP. */
77bc0675 3216 found_stack_adjust = 1;
4024ca99
UW
3217 else if ((insn & 0x0fff0000) == 0x08bd0000)
3218 /* POP (LDMIA). */
3219 found_stack_adjust = 1;
3220 }
3221
3222 if (found_stack_adjust)
3223 return 1;
3224
3225 return 0;
3226}
3227
3228
2dd604e7
RE
3229/* When arguments must be pushed onto the stack, they go on in reverse
3230 order. The code below implements a FILO (stack) to do this. */
3231
3232struct stack_item
3233{
3234 int len;
3235 struct stack_item *prev;
3236 void *data;
3237};
3238
3239static struct stack_item *
8c6363cf 3240push_stack_item (struct stack_item *prev, const void *contents, int len)
2dd604e7
RE
3241{
3242 struct stack_item *si;
3243 si = xmalloc (sizeof (struct stack_item));
226c7fbc 3244 si->data = xmalloc (len);
2dd604e7
RE
3245 si->len = len;
3246 si->prev = prev;
3247 memcpy (si->data, contents, len);
3248 return si;
3249}
3250
3251static struct stack_item *
3252pop_stack_item (struct stack_item *si)
3253{
3254 struct stack_item *dead = si;
3255 si = si->prev;
3256 xfree (dead->data);
3257 xfree (dead);
3258 return si;
3259}
3260
2af48f68
PB
3261
3262/* Return the alignment (in bytes) of the given type. */
3263
3264static int
3265arm_type_align (struct type *t)
3266{
3267 int n;
3268 int align;
3269 int falign;
3270
3271 t = check_typedef (t);
3272 switch (TYPE_CODE (t))
3273 {
3274 default:
3275 /* Should never happen. */
3276 internal_error (__FILE__, __LINE__, _("unknown type alignment"));
3277 return 4;
3278
3279 case TYPE_CODE_PTR:
3280 case TYPE_CODE_ENUM:
3281 case TYPE_CODE_INT:
3282 case TYPE_CODE_FLT:
3283 case TYPE_CODE_SET:
3284 case TYPE_CODE_RANGE:
3285 case TYPE_CODE_BITSTRING:
3286 case TYPE_CODE_REF:
3287 case TYPE_CODE_CHAR:
3288 case TYPE_CODE_BOOL:
3289 return TYPE_LENGTH (t);
3290
3291 case TYPE_CODE_ARRAY:
3292 case TYPE_CODE_COMPLEX:
3293 /* TODO: What about vector types? */
3294 return arm_type_align (TYPE_TARGET_TYPE (t));
3295
3296 case TYPE_CODE_STRUCT:
3297 case TYPE_CODE_UNION:
3298 align = 1;
3299 for (n = 0; n < TYPE_NFIELDS (t); n++)
3300 {
3301 falign = arm_type_align (TYPE_FIELD_TYPE (t, n));
3302 if (falign > align)
3303 align = falign;
3304 }
3305 return align;
3306 }
3307}
3308
90445bd3
DJ
3309/* Possible base types for a candidate for passing and returning in
3310 VFP registers. */
3311
3312enum arm_vfp_cprc_base_type
3313{
3314 VFP_CPRC_UNKNOWN,
3315 VFP_CPRC_SINGLE,
3316 VFP_CPRC_DOUBLE,
3317 VFP_CPRC_VEC64,
3318 VFP_CPRC_VEC128
3319};
3320
3321/* The length of one element of base type B. */
3322
3323static unsigned
3324arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
3325{
3326 switch (b)
3327 {
3328 case VFP_CPRC_SINGLE:
3329 return 4;
3330 case VFP_CPRC_DOUBLE:
3331 return 8;
3332 case VFP_CPRC_VEC64:
3333 return 8;
3334 case VFP_CPRC_VEC128:
3335 return 16;
3336 default:
3337 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3338 (int) b);
3339 }
3340}
3341
3342/* The character ('s', 'd' or 'q') for the type of VFP register used
3343 for passing base type B. */
3344
3345static int
3346arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
3347{
3348 switch (b)
3349 {
3350 case VFP_CPRC_SINGLE:
3351 return 's';
3352 case VFP_CPRC_DOUBLE:
3353 return 'd';
3354 case VFP_CPRC_VEC64:
3355 return 'd';
3356 case VFP_CPRC_VEC128:
3357 return 'q';
3358 default:
3359 internal_error (__FILE__, __LINE__, _("Invalid VFP CPRC type: %d."),
3360 (int) b);
3361 }
3362}
3363
3364/* Determine whether T may be part of a candidate for passing and
3365 returning in VFP registers, ignoring the limit on the total number
3366 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
3367 classification of the first valid component found; if it is not
3368 VFP_CPRC_UNKNOWN, all components must have the same classification
3369 as *BASE_TYPE. If it is found that T contains a type not permitted
3370 for passing and returning in VFP registers, a type differently
3371 classified from *BASE_TYPE, or two types differently classified
3372 from each other, return -1, otherwise return the total number of
3373 base-type elements found (possibly 0 in an empty structure or
3374 array). Vectors and complex types are not currently supported,
3375 matching the generic AAPCS support. */
3376
3377static int
3378arm_vfp_cprc_sub_candidate (struct type *t,
3379 enum arm_vfp_cprc_base_type *base_type)
3380{
3381 t = check_typedef (t);
3382 switch (TYPE_CODE (t))
3383 {
3384 case TYPE_CODE_FLT:
3385 switch (TYPE_LENGTH (t))
3386 {
3387 case 4:
3388 if (*base_type == VFP_CPRC_UNKNOWN)
3389 *base_type = VFP_CPRC_SINGLE;
3390 else if (*base_type != VFP_CPRC_SINGLE)
3391 return -1;
3392 return 1;
3393
3394 case 8:
3395 if (*base_type == VFP_CPRC_UNKNOWN)
3396 *base_type = VFP_CPRC_DOUBLE;
3397 else if (*base_type != VFP_CPRC_DOUBLE)
3398 return -1;
3399 return 1;
3400
3401 default:
3402 return -1;
3403 }
3404 break;
3405
3406 case TYPE_CODE_ARRAY:
3407 {
3408 int count;
3409 unsigned unitlen;
3410 count = arm_vfp_cprc_sub_candidate (TYPE_TARGET_TYPE (t), base_type);
3411 if (count == -1)
3412 return -1;
3413 if (TYPE_LENGTH (t) == 0)
3414 {
3415 gdb_assert (count == 0);
3416 return 0;
3417 }
3418 else if (count == 0)
3419 return -1;
3420 unitlen = arm_vfp_cprc_unit_length (*base_type);
3421 gdb_assert ((TYPE_LENGTH (t) % unitlen) == 0);
3422 return TYPE_LENGTH (t) / unitlen;
3423 }
3424 break;
3425
3426 case TYPE_CODE_STRUCT:
3427 {
3428 int count = 0;
3429 unsigned unitlen;
3430 int i;
3431 for (i = 0; i < TYPE_NFIELDS (t); i++)
3432 {
3433 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3434 base_type);
3435 if (sub_count == -1)
3436 return -1;
3437 count += sub_count;
3438 }
3439 if (TYPE_LENGTH (t) == 0)
3440 {
3441 gdb_assert (count == 0);
3442 return 0;
3443 }
3444 else if (count == 0)
3445 return -1;
3446 unitlen = arm_vfp_cprc_unit_length (*base_type);
3447 if (TYPE_LENGTH (t) != unitlen * count)
3448 return -1;
3449 return count;
3450 }
3451
3452 case TYPE_CODE_UNION:
3453 {
3454 int count = 0;
3455 unsigned unitlen;
3456 int i;
3457 for (i = 0; i < TYPE_NFIELDS (t); i++)
3458 {
3459 int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
3460 base_type);
3461 if (sub_count == -1)
3462 return -1;
3463 count = (count > sub_count ? count : sub_count);
3464 }
3465 if (TYPE_LENGTH (t) == 0)
3466 {
3467 gdb_assert (count == 0);
3468 return 0;
3469 }
3470 else if (count == 0)
3471 return -1;
3472 unitlen = arm_vfp_cprc_unit_length (*base_type);
3473 if (TYPE_LENGTH (t) != unitlen * count)
3474 return -1;
3475 return count;
3476 }
3477
3478 default:
3479 break;
3480 }
3481
3482 return -1;
3483}
3484
3485/* Determine whether T is a VFP co-processor register candidate (CPRC)
3486 if passed to or returned from a non-variadic function with the VFP
3487 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
3488 *BASE_TYPE to the base type for T and *COUNT to the number of
3489 elements of that base type before returning. */
3490
3491static int
3492arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
3493 int *count)
3494{
3495 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
3496 int c = arm_vfp_cprc_sub_candidate (t, &b);
3497 if (c <= 0 || c > 4)
3498 return 0;
3499 *base_type = b;
3500 *count = c;
3501 return 1;
3502}
3503
3504/* Return 1 if the VFP ABI should be used for passing arguments to and
3505 returning values from a function of type FUNC_TYPE, 0
3506 otherwise. */
3507
3508static int
3509arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
3510{
3511 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3512 /* Variadic functions always use the base ABI. Assume that functions
3513 without debug info are not variadic. */
3514 if (func_type && TYPE_VARARGS (check_typedef (func_type)))
3515 return 0;
3516 /* The VFP ABI is only supported as a variant of AAPCS. */
3517 if (tdep->arm_abi != ARM_ABI_AAPCS)
3518 return 0;
3519 return gdbarch_tdep (gdbarch)->fp_model == ARM_FLOAT_VFP;
3520}
3521
3522/* We currently only support passing parameters in integer registers, which
3523 conforms with GCC's default model, and VFP argument passing following
3524 the VFP variant of AAPCS. Several other variants exist and
2dd604e7
RE
3525 we should probably support some of them based on the selected ABI. */
3526
3527static CORE_ADDR
7d9b040b 3528arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
6a65450a
AC
3529 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
3530 struct value **args, CORE_ADDR sp, int struct_return,
3531 CORE_ADDR struct_addr)
2dd604e7 3532{
e17a4113 3533 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2dd604e7
RE
3534 int argnum;
3535 int argreg;
3536 int nstack;
3537 struct stack_item *si = NULL;
90445bd3
DJ
3538 int use_vfp_abi;
3539 struct type *ftype;
3540 unsigned vfp_regs_free = (1 << 16) - 1;
3541
3542 /* Determine the type of this function and whether the VFP ABI
3543 applies. */
3544 ftype = check_typedef (value_type (function));
3545 if (TYPE_CODE (ftype) == TYPE_CODE_PTR)
3546 ftype = check_typedef (TYPE_TARGET_TYPE (ftype));
3547 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
2dd604e7 3548
6a65450a
AC
3549 /* Set the return address. For the ARM, the return breakpoint is
3550 always at BP_ADDR. */
9779414d 3551 if (arm_pc_is_thumb (gdbarch, bp_addr))
9dca5578 3552 bp_addr |= 1;
6a65450a 3553 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
2dd604e7
RE
3554
3555 /* Walk through the list of args and determine how large a temporary
3556 stack is required. Need to take care here as structs may be
7a9dd1b2 3557 passed on the stack, and we have to push them. */
2dd604e7
RE
3558 nstack = 0;
3559
3560 argreg = ARM_A1_REGNUM;
3561 nstack = 0;
3562
2dd604e7
RE
3563 /* The struct_return pointer occupies the first parameter
3564 passing register. */
3565 if (struct_return)
3566 {
3567 if (arm_debug)
5af949e3 3568 fprintf_unfiltered (gdb_stdlog, "struct return in %s = %s\n",
2af46ca0 3569 gdbarch_register_name (gdbarch, argreg),
5af949e3 3570 paddress (gdbarch, struct_addr));
2dd604e7
RE
3571 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
3572 argreg++;
3573 }
3574
3575 for (argnum = 0; argnum < nargs; argnum++)
3576 {
3577 int len;
3578 struct type *arg_type;
3579 struct type *target_type;
3580 enum type_code typecode;
8c6363cf 3581 const bfd_byte *val;
2af48f68 3582 int align;
90445bd3
DJ
3583 enum arm_vfp_cprc_base_type vfp_base_type;
3584 int vfp_base_count;
3585 int may_use_core_reg = 1;
2dd604e7 3586
df407dfe 3587 arg_type = check_typedef (value_type (args[argnum]));
2dd604e7
RE
3588 len = TYPE_LENGTH (arg_type);
3589 target_type = TYPE_TARGET_TYPE (arg_type);
3590 typecode = TYPE_CODE (arg_type);
8c6363cf 3591 val = value_contents (args[argnum]);
2dd604e7 3592
2af48f68
PB
3593 align = arm_type_align (arg_type);
3594 /* Round alignment up to a whole number of words. */
3595 align = (align + INT_REGISTER_SIZE - 1) & ~(INT_REGISTER_SIZE - 1);
3596 /* Different ABIs have different maximum alignments. */
3597 if (gdbarch_tdep (gdbarch)->arm_abi == ARM_ABI_APCS)
3598 {
3599 /* The APCS ABI only requires word alignment. */
3600 align = INT_REGISTER_SIZE;
3601 }
3602 else
3603 {
3604 /* The AAPCS requires at most doubleword alignment. */
3605 if (align > INT_REGISTER_SIZE * 2)
3606 align = INT_REGISTER_SIZE * 2;
3607 }
3608
90445bd3
DJ
3609 if (use_vfp_abi
3610 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
3611 &vfp_base_count))
3612 {
3613 int regno;
3614 int unit_length;
3615 int shift;
3616 unsigned mask;
3617
3618 /* Because this is a CPRC it cannot go in a core register or
3619 cause a core register to be skipped for alignment.
3620 Either it goes in VFP registers and the rest of this loop
3621 iteration is skipped for this argument, or it goes on the
3622 stack (and the stack alignment code is correct for this
3623 case). */
3624 may_use_core_reg = 0;
3625
3626 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
3627 shift = unit_length / 4;
3628 mask = (1 << (shift * vfp_base_count)) - 1;
3629 for (regno = 0; regno < 16; regno += shift)
3630 if (((vfp_regs_free >> regno) & mask) == mask)
3631 break;
3632
3633 if (regno < 16)
3634 {
3635 int reg_char;
3636 int reg_scaled;
3637 int i;
3638
3639 vfp_regs_free &= ~(mask << regno);
3640 reg_scaled = regno / shift;
3641 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
3642 for (i = 0; i < vfp_base_count; i++)
3643 {
3644 char name_buf[4];
3645 int regnum;
58d6951d
DJ
3646 if (reg_char == 'q')
3647 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
90445bd3 3648 val + i * unit_length);
58d6951d
DJ
3649 else
3650 {
3651 sprintf (name_buf, "%c%d", reg_char, reg_scaled + i);
3652 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
3653 strlen (name_buf));
3654 regcache_cooked_write (regcache, regnum,
3655 val + i * unit_length);
3656 }
90445bd3
DJ
3657 }
3658 continue;
3659 }
3660 else
3661 {
3662 /* This CPRC could not go in VFP registers, so all VFP
3663 registers are now marked as used. */
3664 vfp_regs_free = 0;
3665 }
3666 }
3667
2af48f68
PB
3668 /* Push stack padding for dowubleword alignment. */
3669 if (nstack & (align - 1))
3670 {
3671 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3672 nstack += INT_REGISTER_SIZE;
3673 }
3674
3675 /* Doubleword aligned quantities must go in even register pairs. */
90445bd3
DJ
3676 if (may_use_core_reg
3677 && argreg <= ARM_LAST_ARG_REGNUM
2af48f68
PB
3678 && align > INT_REGISTER_SIZE
3679 && argreg & 1)
3680 argreg++;
3681
2dd604e7
RE
3682 /* If the argument is a pointer to a function, and it is a
3683 Thumb function, create a LOCAL copy of the value and set
3684 the THUMB bit in it. */
3685 if (TYPE_CODE_PTR == typecode
3686 && target_type != NULL
f96b8fa0 3687 && TYPE_CODE_FUNC == TYPE_CODE (check_typedef (target_type)))
2dd604e7 3688 {
e17a4113 3689 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
9779414d 3690 if (arm_pc_is_thumb (gdbarch, regval))
2dd604e7 3691 {
8c6363cf
TT
3692 bfd_byte *copy = alloca (len);
3693 store_unsigned_integer (copy, len, byte_order,
e17a4113 3694 MAKE_THUMB_ADDR (regval));
8c6363cf 3695 val = copy;
2dd604e7
RE
3696 }
3697 }
3698
3699 /* Copy the argument to general registers or the stack in
3700 register-sized pieces. Large arguments are split between
3701 registers and stack. */
3702 while (len > 0)
3703 {
f0c9063c 3704 int partial_len = len < INT_REGISTER_SIZE ? len : INT_REGISTER_SIZE;
2dd604e7 3705
90445bd3 3706 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
2dd604e7
RE
3707 {
3708 /* The argument is being passed in a general purpose
3709 register. */
e17a4113
UW
3710 CORE_ADDR regval
3711 = extract_unsigned_integer (val, partial_len, byte_order);
3712 if (byte_order == BFD_ENDIAN_BIG)
8bf8793c 3713 regval <<= (INT_REGISTER_SIZE - partial_len) * 8;
2dd604e7
RE
3714 if (arm_debug)
3715 fprintf_unfiltered (gdb_stdlog, "arg %d in %s = 0x%s\n",
c9f4d572
UW
3716 argnum,
3717 gdbarch_register_name
2af46ca0 3718 (gdbarch, argreg),
f0c9063c 3719 phex (regval, INT_REGISTER_SIZE));
2dd604e7
RE
3720 regcache_cooked_write_unsigned (regcache, argreg, regval);
3721 argreg++;
3722 }
3723 else
3724 {
3725 /* Push the arguments onto the stack. */
3726 if (arm_debug)
3727 fprintf_unfiltered (gdb_stdlog, "arg %d @ sp + %d\n",
3728 argnum, nstack);
f0c9063c
UW
3729 si = push_stack_item (si, val, INT_REGISTER_SIZE);
3730 nstack += INT_REGISTER_SIZE;
2dd604e7
RE
3731 }
3732
3733 len -= partial_len;
3734 val += partial_len;
3735 }
3736 }
3737 /* If we have an odd number of words to push, then decrement the stack
3738 by one word now, so first stack argument will be dword aligned. */
3739 if (nstack & 4)
3740 sp -= 4;
3741
3742 while (si)
3743 {
3744 sp -= si->len;
3745 write_memory (sp, si->data, si->len);
3746 si = pop_stack_item (si);
3747 }
3748
3749 /* Finally, update teh SP register. */
3750 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
3751
3752 return sp;
3753}
3754
f53f0d0b
PB
3755
3756/* Always align the frame to an 8-byte boundary. This is required on
3757 some platforms and harmless on the rest. */
3758
3759static CORE_ADDR
3760arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
3761{
3762 /* Align the stack to eight bytes. */
3763 return sp & ~ (CORE_ADDR) 7;
3764}
3765
c906108c 3766static void
ed9a39eb 3767print_fpu_flags (int flags)
c906108c 3768{
c5aa993b
JM
3769 if (flags & (1 << 0))
3770 fputs ("IVO ", stdout);
3771 if (flags & (1 << 1))
3772 fputs ("DVZ ", stdout);
3773 if (flags & (1 << 2))
3774 fputs ("OFL ", stdout);
3775 if (flags & (1 << 3))
3776 fputs ("UFL ", stdout);
3777 if (flags & (1 << 4))
3778 fputs ("INX ", stdout);
3779 putchar ('\n');
c906108c
SS
3780}
3781
5e74b15c
RE
3782/* Print interesting information about the floating point processor
3783 (if present) or emulator. */
34e8f22d 3784static void
d855c300 3785arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
23e3a7ac 3786 struct frame_info *frame, const char *args)
c906108c 3787{
9c9acae0 3788 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
c5aa993b
JM
3789 int type;
3790
3791 type = (status >> 24) & 127;
edefbb7c
AC
3792 if (status & (1 << 31))
3793 printf (_("Hardware FPU type %d\n"), type);
3794 else
3795 printf (_("Software FPU type %d\n"), type);
3796 /* i18n: [floating point unit] mask */
3797 fputs (_("mask: "), stdout);
c5aa993b 3798 print_fpu_flags (status >> 16);
edefbb7c
AC
3799 /* i18n: [floating point unit] flags */
3800 fputs (_("flags: "), stdout);
c5aa993b 3801 print_fpu_flags (status);
c906108c
SS
3802}
3803
27067745
UW
3804/* Construct the ARM extended floating point type. */
3805static struct type *
3806arm_ext_type (struct gdbarch *gdbarch)
3807{
3808 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3809
3810 if (!tdep->arm_ext_type)
3811 tdep->arm_ext_type
e9bb382b 3812 = arch_float_type (gdbarch, -1, "builtin_type_arm_ext",
27067745
UW
3813 floatformats_arm_ext);
3814
3815 return tdep->arm_ext_type;
3816}
3817
58d6951d
DJ
3818static struct type *
3819arm_neon_double_type (struct gdbarch *gdbarch)
3820{
3821 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3822
3823 if (tdep->neon_double_type == NULL)
3824 {
3825 struct type *t, *elem;
3826
3827 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
3828 TYPE_CODE_UNION);
3829 elem = builtin_type (gdbarch)->builtin_uint8;
3830 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
3831 elem = builtin_type (gdbarch)->builtin_uint16;
3832 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
3833 elem = builtin_type (gdbarch)->builtin_uint32;
3834 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
3835 elem = builtin_type (gdbarch)->builtin_uint64;
3836 append_composite_type_field (t, "u64", elem);
3837 elem = builtin_type (gdbarch)->builtin_float;
3838 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
3839 elem = builtin_type (gdbarch)->builtin_double;
3840 append_composite_type_field (t, "f64", elem);
3841
3842 TYPE_VECTOR (t) = 1;
3843 TYPE_NAME (t) = "neon_d";
3844 tdep->neon_double_type = t;
3845 }
3846
3847 return tdep->neon_double_type;
3848}
3849
3850/* FIXME: The vector types are not correctly ordered on big-endian
3851 targets. Just as s0 is the low bits of d0, d0[0] is also the low
3852 bits of d0 - regardless of what unit size is being held in d0. So
3853 the offset of the first uint8 in d0 is 7, but the offset of the
3854 first float is 4. This code works as-is for little-endian
3855 targets. */
3856
3857static struct type *
3858arm_neon_quad_type (struct gdbarch *gdbarch)
3859{
3860 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
3861
3862 if (tdep->neon_quad_type == NULL)
3863 {
3864 struct type *t, *elem;
3865
3866 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
3867 TYPE_CODE_UNION);
3868 elem = builtin_type (gdbarch)->builtin_uint8;
3869 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
3870 elem = builtin_type (gdbarch)->builtin_uint16;
3871 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
3872 elem = builtin_type (gdbarch)->builtin_uint32;
3873 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
3874 elem = builtin_type (gdbarch)->builtin_uint64;
3875 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
3876 elem = builtin_type (gdbarch)->builtin_float;
3877 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
3878 elem = builtin_type (gdbarch)->builtin_double;
3879 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
3880
3881 TYPE_VECTOR (t) = 1;
3882 TYPE_NAME (t) = "neon_q";
3883 tdep->neon_quad_type = t;
3884 }
3885
3886 return tdep->neon_quad_type;
3887}
3888
34e8f22d
RE
3889/* Return the GDB type object for the "standard" data type of data in
3890 register N. */
3891
3892static struct type *
7a5ea0d4 3893arm_register_type (struct gdbarch *gdbarch, int regnum)
032758dc 3894{
58d6951d
DJ
3895 int num_regs = gdbarch_num_regs (gdbarch);
3896
3897 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
3898 && regnum >= num_regs && regnum < num_regs + 32)
3899 return builtin_type (gdbarch)->builtin_float;
3900
3901 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
3902 && regnum >= num_regs + 32 && regnum < num_regs + 32 + 16)
3903 return arm_neon_quad_type (gdbarch);
3904
3905 /* If the target description has register information, we are only
3906 in this function so that we can override the types of
3907 double-precision registers for NEON. */
3908 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
3909 {
3910 struct type *t = tdesc_register_type (gdbarch, regnum);
3911
3912 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
3913 && TYPE_CODE (t) == TYPE_CODE_FLT
3914 && gdbarch_tdep (gdbarch)->have_neon)
3915 return arm_neon_double_type (gdbarch);
3916 else
3917 return t;
3918 }
3919
34e8f22d 3920 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
58d6951d
DJ
3921 {
3922 if (!gdbarch_tdep (gdbarch)->have_fpa_registers)
3923 return builtin_type (gdbarch)->builtin_void;
3924
3925 return arm_ext_type (gdbarch);
3926 }
e4c16157 3927 else if (regnum == ARM_SP_REGNUM)
0dfff4cb 3928 return builtin_type (gdbarch)->builtin_data_ptr;
e4c16157 3929 else if (regnum == ARM_PC_REGNUM)
0dfff4cb 3930 return builtin_type (gdbarch)->builtin_func_ptr;
ff6f572f
DJ
3931 else if (regnum >= ARRAY_SIZE (arm_register_names))
3932 /* These registers are only supported on targets which supply
3933 an XML description. */
df4df182 3934 return builtin_type (gdbarch)->builtin_int0;
032758dc 3935 else
df4df182 3936 return builtin_type (gdbarch)->builtin_uint32;
032758dc
AC
3937}
3938
ff6f572f
DJ
3939/* Map a DWARF register REGNUM onto the appropriate GDB register
3940 number. */
3941
3942static int
d3f73121 3943arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
ff6f572f
DJ
3944{
3945 /* Core integer regs. */
3946 if (reg >= 0 && reg <= 15)
3947 return reg;
3948
3949 /* Legacy FPA encoding. These were once used in a way which
3950 overlapped with VFP register numbering, so their use is
3951 discouraged, but GDB doesn't support the ARM toolchain
3952 which used them for VFP. */
3953 if (reg >= 16 && reg <= 23)
3954 return ARM_F0_REGNUM + reg - 16;
3955
3956 /* New assignments for the FPA registers. */
3957 if (reg >= 96 && reg <= 103)
3958 return ARM_F0_REGNUM + reg - 96;
3959
3960 /* WMMX register assignments. */
3961 if (reg >= 104 && reg <= 111)
3962 return ARM_WCGR0_REGNUM + reg - 104;
3963
3964 if (reg >= 112 && reg <= 127)
3965 return ARM_WR0_REGNUM + reg - 112;
3966
3967 if (reg >= 192 && reg <= 199)
3968 return ARM_WC0_REGNUM + reg - 192;
3969
58d6951d
DJ
3970 /* VFP v2 registers. A double precision value is actually
3971 in d1 rather than s2, but the ABI only defines numbering
3972 for the single precision registers. This will "just work"
3973 in GDB for little endian targets (we'll read eight bytes,
3974 starting in s0 and then progressing to s1), but will be
3975 reversed on big endian targets with VFP. This won't
3976 be a problem for the new Neon quad registers; you're supposed
3977 to use DW_OP_piece for those. */
3978 if (reg >= 64 && reg <= 95)
3979 {
3980 char name_buf[4];
3981
3982 sprintf (name_buf, "s%d", reg - 64);
3983 return user_reg_map_name_to_regnum (gdbarch, name_buf,
3984 strlen (name_buf));
3985 }
3986
3987 /* VFP v3 / Neon registers. This range is also used for VFP v2
3988 registers, except that it now describes d0 instead of s0. */
3989 if (reg >= 256 && reg <= 287)
3990 {
3991 char name_buf[4];
3992
3993 sprintf (name_buf, "d%d", reg - 256);
3994 return user_reg_map_name_to_regnum (gdbarch, name_buf,
3995 strlen (name_buf));
3996 }
3997
ff6f572f
DJ
3998 return -1;
3999}
4000
26216b98
AC
4001/* Map GDB internal REGNUM onto the Arm simulator register numbers. */
4002static int
e7faf938 4003arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
26216b98
AC
4004{
4005 int reg = regnum;
e7faf938 4006 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
26216b98 4007
ff6f572f
DJ
4008 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
4009 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
4010
4011 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
4012 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
4013
4014 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
4015 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
4016
26216b98
AC
4017 if (reg < NUM_GREGS)
4018 return SIM_ARM_R0_REGNUM + reg;
4019 reg -= NUM_GREGS;
4020
4021 if (reg < NUM_FREGS)
4022 return SIM_ARM_FP0_REGNUM + reg;
4023 reg -= NUM_FREGS;
4024
4025 if (reg < NUM_SREGS)
4026 return SIM_ARM_FPS_REGNUM + reg;
4027 reg -= NUM_SREGS;
4028
edefbb7c 4029 internal_error (__FILE__, __LINE__, _("Bad REGNUM %d"), regnum);
26216b98 4030}
34e8f22d 4031
a37b3cc0
AC
4032/* NOTE: cagney/2001-08-20: Both convert_from_extended() and
4033 convert_to_extended() use floatformat_arm_ext_littlebyte_bigword.
4034 It is thought that this is is the floating-point register format on
4035 little-endian systems. */
c906108c 4036
ed9a39eb 4037static void
b508a996 4038convert_from_extended (const struct floatformat *fmt, const void *ptr,
be8626e0 4039 void *dbl, int endianess)
c906108c 4040{
a37b3cc0 4041 DOUBLEST d;
be8626e0
MD
4042
4043 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4044 floatformat_to_doublest (&floatformat_arm_ext_big, ptr, &d);
4045 else
4046 floatformat_to_doublest (&floatformat_arm_ext_littlebyte_bigword,
4047 ptr, &d);
b508a996 4048 floatformat_from_doublest (fmt, &d, dbl);
c906108c
SS
4049}
4050
34e8f22d 4051static void
be8626e0
MD
4052convert_to_extended (const struct floatformat *fmt, void *dbl, const void *ptr,
4053 int endianess)
c906108c 4054{
a37b3cc0 4055 DOUBLEST d;
be8626e0 4056
b508a996 4057 floatformat_to_doublest (fmt, ptr, &d);
be8626e0 4058 if (endianess == BFD_ENDIAN_BIG)
a37b3cc0
AC
4059 floatformat_from_doublest (&floatformat_arm_ext_big, &d, dbl);
4060 else
4061 floatformat_from_doublest (&floatformat_arm_ext_littlebyte_bigword,
4062 &d, dbl);
c906108c 4063}
ed9a39eb 4064
c906108c 4065static int
ed9a39eb 4066condition_true (unsigned long cond, unsigned long status_reg)
c906108c
SS
4067{
4068 if (cond == INST_AL || cond == INST_NV)
4069 return 1;
4070
4071 switch (cond)
4072 {
4073 case INST_EQ:
4074 return ((status_reg & FLAG_Z) != 0);
4075 case INST_NE:
4076 return ((status_reg & FLAG_Z) == 0);
4077 case INST_CS:
4078 return ((status_reg & FLAG_C) != 0);
4079 case INST_CC:
4080 return ((status_reg & FLAG_C) == 0);
4081 case INST_MI:
4082 return ((status_reg & FLAG_N) != 0);
4083 case INST_PL:
4084 return ((status_reg & FLAG_N) == 0);
4085 case INST_VS:
4086 return ((status_reg & FLAG_V) != 0);
4087 case INST_VC:
4088 return ((status_reg & FLAG_V) == 0);
4089 case INST_HI:
4090 return ((status_reg & (FLAG_C | FLAG_Z)) == FLAG_C);
4091 case INST_LS:
4092 return ((status_reg & (FLAG_C | FLAG_Z)) != FLAG_C);
4093 case INST_GE:
4094 return (((status_reg & FLAG_N) == 0) == ((status_reg & FLAG_V) == 0));
4095 case INST_LT:
4096 return (((status_reg & FLAG_N) == 0) != ((status_reg & FLAG_V) == 0));
4097 case INST_GT:
f8bf5763
PM
4098 return (((status_reg & FLAG_Z) == 0)
4099 && (((status_reg & FLAG_N) == 0)
4100 == ((status_reg & FLAG_V) == 0)));
c906108c 4101 case INST_LE:
f8bf5763
PM
4102 return (((status_reg & FLAG_Z) != 0)
4103 || (((status_reg & FLAG_N) == 0)
4104 != ((status_reg & FLAG_V) == 0)));
c906108c
SS
4105 }
4106 return 1;
4107}
4108
c906108c 4109static unsigned long
0b1b3e42
UW
4110shifted_reg_val (struct frame_info *frame, unsigned long inst, int carry,
4111 unsigned long pc_val, unsigned long status_reg)
c906108c
SS
4112{
4113 unsigned long res, shift;
4114 int rm = bits (inst, 0, 3);
4115 unsigned long shifttype = bits (inst, 5, 6);
c5aa993b
JM
4116
4117 if (bit (inst, 4))
c906108c
SS
4118 {
4119 int rs = bits (inst, 8, 11);
0b1b3e42
UW
4120 shift = (rs == 15 ? pc_val + 8
4121 : get_frame_register_unsigned (frame, rs)) & 0xFF;
c906108c
SS
4122 }
4123 else
4124 shift = bits (inst, 7, 11);
c5aa993b 4125
bf9f652a 4126 res = (rm == ARM_PC_REGNUM
0d39a070 4127 ? (pc_val + (bit (inst, 4) ? 12 : 8))
0b1b3e42 4128 : get_frame_register_unsigned (frame, rm));
c906108c
SS
4129
4130 switch (shifttype)
4131 {
c5aa993b 4132 case 0: /* LSL */
c906108c
SS
4133 res = shift >= 32 ? 0 : res << shift;
4134 break;
c5aa993b
JM
4135
4136 case 1: /* LSR */
c906108c
SS
4137 res = shift >= 32 ? 0 : res >> shift;
4138 break;
4139
c5aa993b
JM
4140 case 2: /* ASR */
4141 if (shift >= 32)
4142 shift = 31;
c906108c
SS
4143 res = ((res & 0x80000000L)
4144 ? ~((~res) >> shift) : res >> shift);
4145 break;
4146
c5aa993b 4147 case 3: /* ROR/RRX */
c906108c
SS
4148 shift &= 31;
4149 if (shift == 0)
4150 res = (res >> 1) | (carry ? 0x80000000L : 0);
4151 else
c5aa993b 4152 res = (res >> shift) | (res << (32 - shift));
c906108c
SS
4153 break;
4154 }
4155
4156 return res & 0xffffffff;
4157}
4158
c906108c
SS
4159/* Return number of 1-bits in VAL. */
4160
4161static int
ed9a39eb 4162bitcount (unsigned long val)
c906108c
SS
4163{
4164 int nbits;
4165 for (nbits = 0; val != 0; nbits++)
0963b4bd 4166 val &= val - 1; /* Delete rightmost 1-bit in val. */
c906108c
SS
4167 return nbits;
4168}
4169
177321bd
DJ
4170/* Return the size in bytes of the complete Thumb instruction whose
4171 first halfword is INST1. */
4172
4173static int
4174thumb_insn_size (unsigned short inst1)
4175{
4176 if ((inst1 & 0xe000) == 0xe000 && (inst1 & 0x1800) != 0)
4177 return 4;
4178 else
4179 return 2;
4180}
4181
4182static int
4183thumb_advance_itstate (unsigned int itstate)
4184{
4185 /* Preserve IT[7:5], the first three bits of the condition. Shift
4186 the upcoming condition flags left by one bit. */
4187 itstate = (itstate & 0xe0) | ((itstate << 1) & 0x1f);
4188
4189 /* If we have finished the IT block, clear the state. */
4190 if ((itstate & 0x0f) == 0)
4191 itstate = 0;
4192
4193 return itstate;
4194}
4195
4196/* Find the next PC after the current instruction executes. In some
4197 cases we can not statically determine the answer (see the IT state
4198 handling in this function); in that case, a breakpoint may be
4199 inserted in addition to the returned PC, which will be used to set
4200 another breakpoint by our caller. */
4201
ad527d2e 4202static CORE_ADDR
18819fa6 4203thumb_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc)
c906108c 4204{
2af46ca0 4205 struct gdbarch *gdbarch = get_frame_arch (frame);
177321bd 4206 struct address_space *aspace = get_frame_address_space (frame);
e17a4113
UW
4207 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4208 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c5aa993b 4209 unsigned long pc_val = ((unsigned long) pc) + 4; /* PC after prefetch */
e17a4113 4210 unsigned short inst1;
0963b4bd 4211 CORE_ADDR nextpc = pc + 2; /* Default is next instruction. */
c906108c 4212 unsigned long offset;
177321bd 4213 ULONGEST status, itstate;
c906108c 4214
50e98be4
DJ
4215 nextpc = MAKE_THUMB_ADDR (nextpc);
4216 pc_val = MAKE_THUMB_ADDR (pc_val);
4217
e17a4113 4218 inst1 = read_memory_unsigned_integer (pc, 2, byte_order_for_code);
9d4fde75 4219
9dca5578
DJ
4220 /* Thumb-2 conditional execution support. There are eight bits in
4221 the CPSR which describe conditional execution state. Once
4222 reconstructed (they're in a funny order), the low five bits
4223 describe the low bit of the condition for each instruction and
4224 how many instructions remain. The high three bits describe the
4225 base condition. One of the low four bits will be set if an IT
4226 block is active. These bits read as zero on earlier
4227 processors. */
4228 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
177321bd 4229 itstate = ((status >> 8) & 0xfc) | ((status >> 25) & 0x3);
9dca5578 4230
177321bd
DJ
4231 /* If-Then handling. On GNU/Linux, where this routine is used, we
4232 use an undefined instruction as a breakpoint. Unlike BKPT, IT
4233 can disable execution of the undefined instruction. So we might
4234 miss the breakpoint if we set it on a skipped conditional
4235 instruction. Because conditional instructions can change the
4236 flags, affecting the execution of further instructions, we may
4237 need to set two breakpoints. */
9dca5578 4238
177321bd
DJ
4239 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint != NULL)
4240 {
4241 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
4242 {
4243 /* An IT instruction. Because this instruction does not
4244 modify the flags, we can accurately predict the next
4245 executed instruction. */
4246 itstate = inst1 & 0x00ff;
4247 pc += thumb_insn_size (inst1);
4248
4249 while (itstate != 0 && ! condition_true (itstate >> 4, status))
4250 {
0963b4bd
MS
4251 inst1 = read_memory_unsigned_integer (pc, 2,
4252 byte_order_for_code);
177321bd
DJ
4253 pc += thumb_insn_size (inst1);
4254 itstate = thumb_advance_itstate (itstate);
4255 }
4256
50e98be4 4257 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4258 }
4259 else if (itstate != 0)
4260 {
4261 /* We are in a conditional block. Check the condition. */
4262 if (! condition_true (itstate >> 4, status))
4263 {
4264 /* Advance to the next executed instruction. */
4265 pc += thumb_insn_size (inst1);
4266 itstate = thumb_advance_itstate (itstate);
4267
4268 while (itstate != 0 && ! condition_true (itstate >> 4, status))
4269 {
0963b4bd
MS
4270 inst1 = read_memory_unsigned_integer (pc, 2,
4271 byte_order_for_code);
177321bd
DJ
4272 pc += thumb_insn_size (inst1);
4273 itstate = thumb_advance_itstate (itstate);
4274 }
4275
50e98be4 4276 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4277 }
4278 else if ((itstate & 0x0f) == 0x08)
4279 {
4280 /* This is the last instruction of the conditional
4281 block, and it is executed. We can handle it normally
4282 because the following instruction is not conditional,
4283 and we must handle it normally because it is
4284 permitted to branch. Fall through. */
4285 }
4286 else
4287 {
4288 int cond_negated;
4289
4290 /* There are conditional instructions after this one.
4291 If this instruction modifies the flags, then we can
4292 not predict what the next executed instruction will
4293 be. Fortunately, this instruction is architecturally
4294 forbidden to branch; we know it will fall through.
4295 Start by skipping past it. */
4296 pc += thumb_insn_size (inst1);
4297 itstate = thumb_advance_itstate (itstate);
4298
4299 /* Set a breakpoint on the following instruction. */
4300 gdb_assert ((itstate & 0x0f) != 0);
18819fa6
UW
4301 arm_insert_single_step_breakpoint (gdbarch, aspace,
4302 MAKE_THUMB_ADDR (pc));
177321bd
DJ
4303 cond_negated = (itstate >> 4) & 1;
4304
4305 /* Skip all following instructions with the same
4306 condition. If there is a later instruction in the IT
4307 block with the opposite condition, set the other
4308 breakpoint there. If not, then set a breakpoint on
4309 the instruction after the IT block. */
4310 do
4311 {
0963b4bd
MS
4312 inst1 = read_memory_unsigned_integer (pc, 2,
4313 byte_order_for_code);
177321bd
DJ
4314 pc += thumb_insn_size (inst1);
4315 itstate = thumb_advance_itstate (itstate);
4316 }
4317 while (itstate != 0 && ((itstate >> 4) & 1) == cond_negated);
4318
50e98be4 4319 return MAKE_THUMB_ADDR (pc);
177321bd
DJ
4320 }
4321 }
4322 }
4323 else if (itstate & 0x0f)
9dca5578
DJ
4324 {
4325 /* We are in a conditional block. Check the condition. */
177321bd 4326 int cond = itstate >> 4;
9dca5578
DJ
4327
4328 if (! condition_true (cond, status))
db24da6d
YQ
4329 /* Advance to the next instruction. All the 32-bit
4330 instructions share a common prefix. */
4331 return MAKE_THUMB_ADDR (pc + thumb_insn_size (inst1));
177321bd
DJ
4332
4333 /* Otherwise, handle the instruction normally. */
9dca5578
DJ
4334 }
4335
c906108c
SS
4336 if ((inst1 & 0xff00) == 0xbd00) /* pop {rlist, pc} */
4337 {
4338 CORE_ADDR sp;
4339
4340 /* Fetch the saved PC from the stack. It's stored above
4341 all of the other registers. */
f0c9063c 4342 offset = bitcount (bits (inst1, 0, 7)) * INT_REGISTER_SIZE;
0b1b3e42 4343 sp = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
e17a4113 4344 nextpc = read_memory_unsigned_integer (sp + offset, 4, byte_order);
c906108c
SS
4345 }
4346 else if ((inst1 & 0xf000) == 0xd000) /* conditional branch */
4347 {
c5aa993b 4348 unsigned long cond = bits (inst1, 8, 11);
25b41d01
YQ
4349 if (cond == 0x0f) /* 0x0f = SWI */
4350 {
4351 struct gdbarch_tdep *tdep;
4352 tdep = gdbarch_tdep (gdbarch);
4353
4354 if (tdep->syscall_next_pc != NULL)
4355 nextpc = tdep->syscall_next_pc (frame);
4356
4357 }
4358 else if (cond != 0x0f && condition_true (cond, status))
c906108c
SS
4359 nextpc = pc_val + (sbits (inst1, 0, 7) << 1);
4360 }
4361 else if ((inst1 & 0xf800) == 0xe000) /* unconditional branch */
4362 {
4363 nextpc = pc_val + (sbits (inst1, 0, 10) << 1);
4364 }
db24da6d 4365 else if (thumb_insn_size (inst1) == 4) /* 32-bit instruction */
c906108c 4366 {
e17a4113
UW
4367 unsigned short inst2;
4368 inst2 = read_memory_unsigned_integer (pc + 2, 2, byte_order_for_code);
9dca5578
DJ
4369
4370 /* Default to the next instruction. */
4371 nextpc = pc + 4;
50e98be4 4372 nextpc = MAKE_THUMB_ADDR (nextpc);
9dca5578
DJ
4373
4374 if ((inst1 & 0xf800) == 0xf000 && (inst2 & 0x8000) == 0x8000)
4375 {
4376 /* Branches and miscellaneous control instructions. */
4377
4378 if ((inst2 & 0x1000) != 0 || (inst2 & 0xd001) == 0xc000)
4379 {
4380 /* B, BL, BLX. */
4381 int j1, j2, imm1, imm2;
4382
4383 imm1 = sbits (inst1, 0, 10);
4384 imm2 = bits (inst2, 0, 10);
4385 j1 = bit (inst2, 13);
4386 j2 = bit (inst2, 11);
4387
4388 offset = ((imm1 << 12) + (imm2 << 1));
4389 offset ^= ((!j2) << 22) | ((!j1) << 23);
4390
4391 nextpc = pc_val + offset;
4392 /* For BLX make sure to clear the low bits. */
4393 if (bit (inst2, 12) == 0)
4394 nextpc = nextpc & 0xfffffffc;
4395 }
4396 else if (inst1 == 0xf3de && (inst2 & 0xff00) == 0x3f00)
4397 {
4398 /* SUBS PC, LR, #imm8. */
4399 nextpc = get_frame_register_unsigned (frame, ARM_LR_REGNUM);
4400 nextpc -= inst2 & 0x00ff;
4401 }
4069ebbe 4402 else if ((inst2 & 0xd000) == 0x8000 && (inst1 & 0x0380) != 0x0380)
9dca5578
DJ
4403 {
4404 /* Conditional branch. */
4405 if (condition_true (bits (inst1, 6, 9), status))
4406 {
4407 int sign, j1, j2, imm1, imm2;
4408
4409 sign = sbits (inst1, 10, 10);
4410 imm1 = bits (inst1, 0, 5);
4411 imm2 = bits (inst2, 0, 10);
4412 j1 = bit (inst2, 13);
4413 j2 = bit (inst2, 11);
4414
4415 offset = (sign << 20) + (j2 << 19) + (j1 << 18);
4416 offset += (imm1 << 12) + (imm2 << 1);
4417
4418 nextpc = pc_val + offset;
4419 }
4420 }
4421 }
4422 else if ((inst1 & 0xfe50) == 0xe810)
4423 {
4424 /* Load multiple or RFE. */
4425 int rn, offset, load_pc = 1;
4426
4427 rn = bits (inst1, 0, 3);
4428 if (bit (inst1, 7) && !bit (inst1, 8))
4429 {
4430 /* LDMIA or POP */
4431 if (!bit (inst2, 15))
4432 load_pc = 0;
4433 offset = bitcount (inst2) * 4 - 4;
4434 }
4435 else if (!bit (inst1, 7) && bit (inst1, 8))
4436 {
4437 /* LDMDB */
4438 if (!bit (inst2, 15))
4439 load_pc = 0;
4440 offset = -4;
4441 }
4442 else if (bit (inst1, 7) && bit (inst1, 8))
4443 {
4444 /* RFEIA */
4445 offset = 0;
4446 }
4447 else if (!bit (inst1, 7) && !bit (inst1, 8))
4448 {
4449 /* RFEDB */
4450 offset = -8;
4451 }
4452 else
4453 load_pc = 0;
4454
4455 if (load_pc)
4456 {
4457 CORE_ADDR addr = get_frame_register_unsigned (frame, rn);
4458 nextpc = get_frame_memory_unsigned (frame, addr + offset, 4);
4459 }
4460 }
4461 else if ((inst1 & 0xffef) == 0xea4f && (inst2 & 0xfff0) == 0x0f00)
4462 {
4463 /* MOV PC or MOVS PC. */
4464 nextpc = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
50e98be4 4465 nextpc = MAKE_THUMB_ADDR (nextpc);
9dca5578
DJ
4466 }
4467 else if ((inst1 & 0xff70) == 0xf850 && (inst2 & 0xf000) == 0xf000)
4468 {
4469 /* LDR PC. */
4470 CORE_ADDR base;
4471 int rn, load_pc = 1;
4472
4473 rn = bits (inst1, 0, 3);
4474 base = get_frame_register_unsigned (frame, rn);
bf9f652a 4475 if (rn == ARM_PC_REGNUM)
9dca5578
DJ
4476 {
4477 base = (base + 4) & ~(CORE_ADDR) 0x3;
4478 if (bit (inst1, 7))
4479 base += bits (inst2, 0, 11);
4480 else
4481 base -= bits (inst2, 0, 11);
4482 }
4483 else if (bit (inst1, 7))
4484 base += bits (inst2, 0, 11);
4485 else if (bit (inst2, 11))
4486 {
4487 if (bit (inst2, 10))
4488 {
4489 if (bit (inst2, 9))
4490 base += bits (inst2, 0, 7);
4491 else
4492 base -= bits (inst2, 0, 7);
4493 }
4494 }
4495 else if ((inst2 & 0x0fc0) == 0x0000)
4496 {
4497 int shift = bits (inst2, 4, 5), rm = bits (inst2, 0, 3);
4498 base += get_frame_register_unsigned (frame, rm) << shift;
4499 }
4500 else
4501 /* Reserved. */
4502 load_pc = 0;
4503
4504 if (load_pc)
4505 nextpc = get_frame_memory_unsigned (frame, base, 4);
4506 }
4507 else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf000)
4508 {
4509 /* TBB. */
d476da0e
RE
4510 CORE_ADDR tbl_reg, table, offset, length;
4511
4512 tbl_reg = bits (inst1, 0, 3);
4513 if (tbl_reg == 0x0f)
4514 table = pc + 4; /* Regcache copy of PC isn't right yet. */
4515 else
4516 table = get_frame_register_unsigned (frame, tbl_reg);
9dca5578 4517
9dca5578
DJ
4518 offset = get_frame_register_unsigned (frame, bits (inst2, 0, 3));
4519 length = 2 * get_frame_memory_unsigned (frame, table + offset, 1);
4520 nextpc = pc_val + length;
4521 }
d476da0e 4522 else if ((inst1 & 0xfff0) == 0xe8d0 && (inst2 & 0xfff0) == 0xf010)
9dca5578
DJ
4523 {
4524 /* TBH. */
d476da0e
RE
4525 CORE_ADDR tbl_reg, table, offset, length;
4526
4527 tbl_reg = bits (inst1, 0, 3);
4528 if (tbl_reg == 0x0f)
4529 table = pc + 4; /* Regcache copy of PC isn't right yet. */
4530 else
4531 table = get_frame_register_unsigned (frame, tbl_reg);
9dca5578 4532
9dca5578
DJ
4533 offset = 2 * get_frame_register_unsigned (frame, bits (inst2, 0, 3));
4534 length = 2 * get_frame_memory_unsigned (frame, table + offset, 2);
4535 nextpc = pc_val + length;
4536 }
c906108c 4537 }
aa17d93e 4538 else if ((inst1 & 0xff00) == 0x4700) /* bx REG, blx REG */
9498281f
DJ
4539 {
4540 if (bits (inst1, 3, 6) == 0x0f)
4541 nextpc = pc_val;
4542 else
0b1b3e42 4543 nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
9498281f 4544 }
ad8b5167
UW
4545 else if ((inst1 & 0xff87) == 0x4687) /* mov pc, REG */
4546 {
4547 if (bits (inst1, 3, 6) == 0x0f)
4548 nextpc = pc_val;
4549 else
4550 nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6));
4551
4552 nextpc = MAKE_THUMB_ADDR (nextpc);
4553 }
9dca5578
DJ
4554 else if ((inst1 & 0xf500) == 0xb100)
4555 {
4556 /* CBNZ or CBZ. */
4557 int imm = (bit (inst1, 9) << 6) + (bits (inst1, 3, 7) << 1);
4558 ULONGEST reg = get_frame_register_unsigned (frame, bits (inst1, 0, 2));
4559
4560 if (bit (inst1, 11) && reg != 0)
4561 nextpc = pc_val + imm;
4562 else if (!bit (inst1, 11) && reg == 0)
4563 nextpc = pc_val + imm;
4564 }
c906108c
SS
4565 return nextpc;
4566}
4567
50e98be4 4568/* Get the raw next address. PC is the current program counter, in
18819fa6 4569 FRAME, which is assumed to be executing in ARM mode.
50e98be4
DJ
4570
4571 The value returned has the execution state of the next instruction
4572 encoded in it. Use IS_THUMB_ADDR () to see whether the instruction is
4573 in Thumb-State, and gdbarch_addr_bits_remove () to get the plain memory
0963b4bd
MS
4574 address. */
4575
50e98be4 4576static CORE_ADDR
18819fa6 4577arm_get_next_pc_raw (struct frame_info *frame, CORE_ADDR pc)
c906108c 4578{
2af46ca0 4579 struct gdbarch *gdbarch = get_frame_arch (frame);
e17a4113
UW
4580 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4581 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
c906108c
SS
4582 unsigned long pc_val;
4583 unsigned long this_instr;
4584 unsigned long status;
4585 CORE_ADDR nextpc;
4586
c906108c 4587 pc_val = (unsigned long) pc;
e17a4113 4588 this_instr = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
9d4fde75 4589
0b1b3e42 4590 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
c5aa993b 4591 nextpc = (CORE_ADDR) (pc_val + 4); /* Default case */
c906108c 4592
daddc3c1
DJ
4593 if (bits (this_instr, 28, 31) == INST_NV)
4594 switch (bits (this_instr, 24, 27))
4595 {
4596 case 0xa:
4597 case 0xb:
4598 {
4599 /* Branch with Link and change to Thumb. */
4600 nextpc = BranchDest (pc, this_instr);
4601 nextpc |= bit (this_instr, 24) << 1;
50e98be4 4602 nextpc = MAKE_THUMB_ADDR (nextpc);
daddc3c1
DJ
4603 break;
4604 }
4605 case 0xc:
4606 case 0xd:
4607 case 0xe:
4608 /* Coprocessor register transfer. */
4609 if (bits (this_instr, 12, 15) == 15)
4610 error (_("Invalid update to pc in instruction"));
4611 break;
4612 }
4613 else if (condition_true (bits (this_instr, 28, 31), status))
c906108c
SS
4614 {
4615 switch (bits (this_instr, 24, 27))
4616 {
c5aa993b 4617 case 0x0:
94c30b78 4618 case 0x1: /* data processing */
c5aa993b
JM
4619 case 0x2:
4620 case 0x3:
c906108c
SS
4621 {
4622 unsigned long operand1, operand2, result = 0;
4623 unsigned long rn;
4624 int c;
c5aa993b 4625
c906108c
SS
4626 if (bits (this_instr, 12, 15) != 15)
4627 break;
4628
4629 if (bits (this_instr, 22, 25) == 0
c5aa993b 4630 && bits (this_instr, 4, 7) == 9) /* multiply */
edefbb7c 4631 error (_("Invalid update to pc in instruction"));
c906108c 4632
9498281f 4633 /* BX <reg>, BLX <reg> */
e150acc7
PB
4634 if (bits (this_instr, 4, 27) == 0x12fff1
4635 || bits (this_instr, 4, 27) == 0x12fff3)
9498281f
DJ
4636 {
4637 rn = bits (this_instr, 0, 3);
bf9f652a
YQ
4638 nextpc = ((rn == ARM_PC_REGNUM)
4639 ? (pc_val + 8)
4640 : get_frame_register_unsigned (frame, rn));
4641
9498281f
DJ
4642 return nextpc;
4643 }
4644
0963b4bd 4645 /* Multiply into PC. */
c906108c
SS
4646 c = (status & FLAG_C) ? 1 : 0;
4647 rn = bits (this_instr, 16, 19);
bf9f652a
YQ
4648 operand1 = ((rn == ARM_PC_REGNUM)
4649 ? (pc_val + 8)
4650 : get_frame_register_unsigned (frame, rn));
c5aa993b 4651
c906108c
SS
4652 if (bit (this_instr, 25))
4653 {
4654 unsigned long immval = bits (this_instr, 0, 7);
4655 unsigned long rotate = 2 * bits (this_instr, 8, 11);
c5aa993b
JM
4656 operand2 = ((immval >> rotate) | (immval << (32 - rotate)))
4657 & 0xffffffff;
c906108c 4658 }
0963b4bd
MS
4659 else /* operand 2 is a shifted register. */
4660 operand2 = shifted_reg_val (frame, this_instr, c,
4661 pc_val, status);
c5aa993b 4662
c906108c
SS
4663 switch (bits (this_instr, 21, 24))
4664 {
c5aa993b 4665 case 0x0: /*and */
c906108c
SS
4666 result = operand1 & operand2;
4667 break;
4668
c5aa993b 4669 case 0x1: /*eor */
c906108c
SS
4670 result = operand1 ^ operand2;
4671 break;
4672
c5aa993b 4673 case 0x2: /*sub */
c906108c
SS
4674 result = operand1 - operand2;
4675 break;
4676
c5aa993b 4677 case 0x3: /*rsb */
c906108c
SS
4678 result = operand2 - operand1;
4679 break;
4680
c5aa993b 4681 case 0x4: /*add */
c906108c
SS
4682 result = operand1 + operand2;
4683 break;
4684
c5aa993b 4685 case 0x5: /*adc */
c906108c
SS
4686 result = operand1 + operand2 + c;
4687 break;
4688
c5aa993b 4689 case 0x6: /*sbc */
c906108c
SS
4690 result = operand1 - operand2 + c;
4691 break;
4692
c5aa993b 4693 case 0x7: /*rsc */
c906108c
SS
4694 result = operand2 - operand1 + c;
4695 break;
4696
c5aa993b
JM
4697 case 0x8:
4698 case 0x9:
4699 case 0xa:
4700 case 0xb: /* tst, teq, cmp, cmn */
c906108c
SS
4701 result = (unsigned long) nextpc;
4702 break;
4703
c5aa993b 4704 case 0xc: /*orr */
c906108c
SS
4705 result = operand1 | operand2;
4706 break;
4707
c5aa993b 4708 case 0xd: /*mov */
c906108c
SS
4709 /* Always step into a function. */
4710 result = operand2;
c5aa993b 4711 break;
c906108c 4712
c5aa993b 4713 case 0xe: /*bic */
c906108c
SS
4714 result = operand1 & ~operand2;
4715 break;
4716
c5aa993b 4717 case 0xf: /*mvn */
c906108c
SS
4718 result = ~operand2;
4719 break;
4720 }
c906108c 4721
50e98be4
DJ
4722 /* In 26-bit APCS the bottom two bits of the result are
4723 ignored, and we always end up in ARM state. */
4724 if (!arm_apcs_32)
4725 nextpc = arm_addr_bits_remove (gdbarch, result);
4726 else
4727 nextpc = result;
4728
c906108c
SS
4729 break;
4730 }
c5aa993b
JM
4731
4732 case 0x4:
4733 case 0x5: /* data transfer */
4734 case 0x6:
4735 case 0x7:
c906108c
SS
4736 if (bit (this_instr, 20))
4737 {
4738 /* load */
4739 if (bits (this_instr, 12, 15) == 15)
4740 {
4741 /* rd == pc */
c5aa993b 4742 unsigned long rn;
c906108c 4743 unsigned long base;
c5aa993b 4744
c906108c 4745 if (bit (this_instr, 22))
edefbb7c 4746 error (_("Invalid update to pc in instruction"));
c906108c
SS
4747
4748 /* byte write to PC */
4749 rn = bits (this_instr, 16, 19);
bf9f652a
YQ
4750 base = ((rn == ARM_PC_REGNUM)
4751 ? (pc_val + 8)
4752 : get_frame_register_unsigned (frame, rn));
4753
c906108c
SS
4754 if (bit (this_instr, 24))
4755 {
4756 /* pre-indexed */
4757 int c = (status & FLAG_C) ? 1 : 0;
4758 unsigned long offset =
c5aa993b 4759 (bit (this_instr, 25)
0b1b3e42 4760 ? shifted_reg_val (frame, this_instr, c, pc_val, status)
c5aa993b 4761 : bits (this_instr, 0, 11));
c906108c
SS
4762
4763 if (bit (this_instr, 23))
4764 base += offset;
4765 else
4766 base -= offset;
4767 }
51370a33
YQ
4768 nextpc =
4769 (CORE_ADDR) read_memory_unsigned_integer ((CORE_ADDR) base,
4770 4, byte_order);
c906108c
SS
4771 }
4772 }
4773 break;
c5aa993b
JM
4774
4775 case 0x8:
4776 case 0x9: /* block transfer */
c906108c
SS
4777 if (bit (this_instr, 20))
4778 {
4779 /* LDM */
4780 if (bit (this_instr, 15))
4781 {
4782 /* loading pc */
4783 int offset = 0;
51370a33
YQ
4784 unsigned long rn_val
4785 = get_frame_register_unsigned (frame,
4786 bits (this_instr, 16, 19));
c906108c
SS
4787
4788 if (bit (this_instr, 23))
4789 {
4790 /* up */
4791 unsigned long reglist = bits (this_instr, 0, 14);
4792 offset = bitcount (reglist) * 4;
c5aa993b 4793 if (bit (this_instr, 24)) /* pre */
c906108c
SS
4794 offset += 4;
4795 }
4796 else if (bit (this_instr, 24))
4797 offset = -4;
c5aa993b 4798
51370a33
YQ
4799 nextpc =
4800 (CORE_ADDR) read_memory_unsigned_integer ((CORE_ADDR)
4801 (rn_val + offset),
4802 4, byte_order);
c906108c
SS
4803 }
4804 }
4805 break;
c5aa993b
JM
4806
4807 case 0xb: /* branch & link */
4808 case 0xa: /* branch */
c906108c
SS
4809 {
4810 nextpc = BranchDest (pc, this_instr);
c906108c
SS
4811 break;
4812 }
c5aa993b
JM
4813
4814 case 0xc:
4815 case 0xd:
4816 case 0xe: /* coproc ops */
25b41d01 4817 break;
c5aa993b 4818 case 0xf: /* SWI */
25b41d01
YQ
4819 {
4820 struct gdbarch_tdep *tdep;
4821 tdep = gdbarch_tdep (gdbarch);
4822
4823 if (tdep->syscall_next_pc != NULL)
4824 nextpc = tdep->syscall_next_pc (frame);
4825
4826 }
c906108c
SS
4827 break;
4828
4829 default:
edefbb7c 4830 fprintf_filtered (gdb_stderr, _("Bad bit-field extraction\n"));
c906108c
SS
4831 return (pc);
4832 }
4833 }
4834
4835 return nextpc;
4836}
4837
18819fa6
UW
4838/* Determine next PC after current instruction executes. Will call either
4839 arm_get_next_pc_raw or thumb_get_next_pc_raw. Error out if infinite
4840 loop is detected. */
4841
50e98be4
DJ
4842CORE_ADDR
4843arm_get_next_pc (struct frame_info *frame, CORE_ADDR pc)
4844{
18819fa6
UW
4845 CORE_ADDR nextpc;
4846
4847 if (arm_frame_is_thumb (frame))
4848 {
4849 nextpc = thumb_get_next_pc_raw (frame, pc);
4850 if (nextpc == MAKE_THUMB_ADDR (pc))
4851 error (_("Infinite loop detected"));
4852 }
4853 else
4854 {
4855 nextpc = arm_get_next_pc_raw (frame, pc);
4856 if (nextpc == pc)
4857 error (_("Infinite loop detected"));
4858 }
4859
50e98be4
DJ
4860 return nextpc;
4861}
4862
18819fa6
UW
4863/* Like insert_single_step_breakpoint, but make sure we use a breakpoint
4864 of the appropriate mode (as encoded in the PC value), even if this
4865 differs from what would be expected according to the symbol tables. */
4866
4867void
4868arm_insert_single_step_breakpoint (struct gdbarch *gdbarch,
4869 struct address_space *aspace,
4870 CORE_ADDR pc)
4871{
4872 struct cleanup *old_chain
4873 = make_cleanup_restore_integer (&arm_override_mode);
4874
4875 arm_override_mode = IS_THUMB_ADDR (pc);
4876 pc = gdbarch_addr_bits_remove (gdbarch, pc);
4877
4878 insert_single_step_breakpoint (gdbarch, aspace, pc);
4879
4880 do_cleanups (old_chain);
4881}
4882
35f73cfc
UW
4883/* Checks for an atomic sequence of instructions beginning with a LDREX{,B,H,D}
4884 instruction and ending with a STREX{,B,H,D} instruction. If such a sequence
4885 is found, attempt to step through it. A breakpoint is placed at the end of
4886 the sequence. */
4887
4888static int
4889thumb_deal_with_atomic_sequence_raw (struct frame_info *frame)
4890{
4891 struct gdbarch *gdbarch = get_frame_arch (frame);
4892 struct address_space *aspace = get_frame_address_space (frame);
4893 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4894 CORE_ADDR pc = get_frame_pc (frame);
4895 CORE_ADDR breaks[2] = {-1, -1};
4896 CORE_ADDR loc = pc;
4897 unsigned short insn1, insn2;
4898 int insn_count;
4899 int index;
4900 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
4901 const int atomic_sequence_length = 16; /* Instruction sequence length. */
4902 ULONGEST status, itstate;
4903
4904 /* We currently do not support atomic sequences within an IT block. */
4905 status = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
4906 itstate = ((status >> 8) & 0xfc) | ((status >> 25) & 0x3);
4907 if (itstate & 0x0f)
4908 return 0;
4909
4910 /* Assume all atomic sequences start with a ldrex{,b,h,d} instruction. */
4911 insn1 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
4912 loc += 2;
4913 if (thumb_insn_size (insn1) != 4)
4914 return 0;
4915
4916 insn2 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
4917 loc += 2;
4918 if (!((insn1 & 0xfff0) == 0xe850
4919 || ((insn1 & 0xfff0) == 0xe8d0 && (insn2 & 0x00c0) == 0x0040)))
4920 return 0;
4921
4922 /* Assume that no atomic sequence is longer than "atomic_sequence_length"
4923 instructions. */
4924 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
4925 {
4926 insn1 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
4927 loc += 2;
4928
4929 if (thumb_insn_size (insn1) != 4)
4930 {
4931 /* Assume that there is at most one conditional branch in the
4932 atomic sequence. If a conditional branch is found, put a
4933 breakpoint in its destination address. */
4934 if ((insn1 & 0xf000) == 0xd000 && bits (insn1, 8, 11) != 0x0f)
4935 {
4936 if (last_breakpoint > 0)
4937 return 0; /* More than one conditional branch found,
4938 fallback to the standard code. */
4939
4940 breaks[1] = loc + 2 + (sbits (insn1, 0, 7) << 1);
4941 last_breakpoint++;
4942 }
4943
4944 /* We do not support atomic sequences that use any *other*
4945 instructions but conditional branches to change the PC.
4946 Fall back to standard code to avoid losing control of
4947 execution. */
4948 else if (thumb_instruction_changes_pc (insn1))
4949 return 0;
4950 }
4951 else
4952 {
4953 insn2 = read_memory_unsigned_integer (loc, 2, byte_order_for_code);
4954 loc += 2;
4955
4956 /* Assume that there is at most one conditional branch in the
4957 atomic sequence. If a conditional branch is found, put a
4958 breakpoint in its destination address. */
4959 if ((insn1 & 0xf800) == 0xf000
4960 && (insn2 & 0xd000) == 0x8000
4961 && (insn1 & 0x0380) != 0x0380)
4962 {
4963 int sign, j1, j2, imm1, imm2;
4964 unsigned int offset;
4965
4966 sign = sbits (insn1, 10, 10);
4967 imm1 = bits (insn1, 0, 5);
4968 imm2 = bits (insn2, 0, 10);
4969 j1 = bit (insn2, 13);
4970 j2 = bit (insn2, 11);
4971
4972 offset = (sign << 20) + (j2 << 19) + (j1 << 18);
4973 offset += (imm1 << 12) + (imm2 << 1);
4974
4975 if (last_breakpoint > 0)
4976 return 0; /* More than one conditional branch found,
4977 fallback to the standard code. */
4978
4979 breaks[1] = loc + offset;
4980 last_breakpoint++;
4981 }
4982
4983 /* We do not support atomic sequences that use any *other*
4984 instructions but conditional branches to change the PC.
4985 Fall back to standard code to avoid losing control of
4986 execution. */
4987 else if (thumb2_instruction_changes_pc (insn1, insn2))
4988 return 0;
4989
4990 /* If we find a strex{,b,h,d}, we're done. */
4991 if ((insn1 & 0xfff0) == 0xe840
4992 || ((insn1 & 0xfff0) == 0xe8c0 && (insn2 & 0x00c0) == 0x0040))
4993 break;
4994 }
4995 }
4996
4997 /* If we didn't find the strex{,b,h,d}, we cannot handle the sequence. */
4998 if (insn_count == atomic_sequence_length)
4999 return 0;
5000
5001 /* Insert a breakpoint right after the end of the atomic sequence. */
5002 breaks[0] = loc;
5003
5004 /* Check for duplicated breakpoints. Check also for a breakpoint
5005 placed (branch instruction's destination) anywhere in sequence. */
5006 if (last_breakpoint
5007 && (breaks[1] == breaks[0]
5008 || (breaks[1] >= pc && breaks[1] < loc)))
5009 last_breakpoint = 0;
5010
5011 /* Effectively inserts the breakpoints. */
5012 for (index = 0; index <= last_breakpoint; index++)
5013 arm_insert_single_step_breakpoint (gdbarch, aspace,
5014 MAKE_THUMB_ADDR (breaks[index]));
5015
5016 return 1;
5017}
5018
5019static int
5020arm_deal_with_atomic_sequence_raw (struct frame_info *frame)
5021{
5022 struct gdbarch *gdbarch = get_frame_arch (frame);
5023 struct address_space *aspace = get_frame_address_space (frame);
5024 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
5025 CORE_ADDR pc = get_frame_pc (frame);
5026 CORE_ADDR breaks[2] = {-1, -1};
5027 CORE_ADDR loc = pc;
5028 unsigned int insn;
5029 int insn_count;
5030 int index;
5031 int last_breakpoint = 0; /* Defaults to 0 (no breakpoints placed). */
5032 const int atomic_sequence_length = 16; /* Instruction sequence length. */
5033
5034 /* Assume all atomic sequences start with a ldrex{,b,h,d} instruction.
5035 Note that we do not currently support conditionally executed atomic
5036 instructions. */
5037 insn = read_memory_unsigned_integer (loc, 4, byte_order_for_code);
5038 loc += 4;
5039 if ((insn & 0xff9000f0) != 0xe1900090)
5040 return 0;
5041
5042 /* Assume that no atomic sequence is longer than "atomic_sequence_length"
5043 instructions. */
5044 for (insn_count = 0; insn_count < atomic_sequence_length; ++insn_count)
5045 {
5046 insn = read_memory_unsigned_integer (loc, 4, byte_order_for_code);
5047 loc += 4;
5048
5049 /* Assume that there is at most one conditional branch in the atomic
5050 sequence. If a conditional branch is found, put a breakpoint in
5051 its destination address. */
5052 if (bits (insn, 24, 27) == 0xa)
5053 {
5054 if (last_breakpoint > 0)
5055 return 0; /* More than one conditional branch found, fallback
5056 to the standard single-step code. */
5057
5058 breaks[1] = BranchDest (loc - 4, insn);
5059 last_breakpoint++;
5060 }
5061
5062 /* We do not support atomic sequences that use any *other* instructions
5063 but conditional branches to change the PC. Fall back to standard
5064 code to avoid losing control of execution. */
5065 else if (arm_instruction_changes_pc (insn))
5066 return 0;
5067
5068 /* If we find a strex{,b,h,d}, we're done. */
5069 if ((insn & 0xff9000f0) == 0xe1800090)
5070 break;
5071 }
5072
5073 /* If we didn't find the strex{,b,h,d}, we cannot handle the sequence. */
5074 if (insn_count == atomic_sequence_length)
5075 return 0;
5076
5077 /* Insert a breakpoint right after the end of the atomic sequence. */
5078 breaks[0] = loc;
5079
5080 /* Check for duplicated breakpoints. Check also for a breakpoint
5081 placed (branch instruction's destination) anywhere in sequence. */
5082 if (last_breakpoint
5083 && (breaks[1] == breaks[0]
5084 || (breaks[1] >= pc && breaks[1] < loc)))
5085 last_breakpoint = 0;
5086
5087 /* Effectively inserts the breakpoints. */
5088 for (index = 0; index <= last_breakpoint; index++)
5089 arm_insert_single_step_breakpoint (gdbarch, aspace, breaks[index]);
5090
5091 return 1;
5092}
5093
5094int
5095arm_deal_with_atomic_sequence (struct frame_info *frame)
5096{
5097 if (arm_frame_is_thumb (frame))
5098 return thumb_deal_with_atomic_sequence_raw (frame);
5099 else
5100 return arm_deal_with_atomic_sequence_raw (frame);
5101}
5102
9512d7fd
FN
5103/* single_step() is called just before we want to resume the inferior,
5104 if we want to single-step it but there is no hardware or kernel
5105 single-step support. We find the target of the coming instruction
e0cd558a 5106 and breakpoint it. */
9512d7fd 5107
190dce09 5108int
0b1b3e42 5109arm_software_single_step (struct frame_info *frame)
9512d7fd 5110{
a6d9a66e 5111 struct gdbarch *gdbarch = get_frame_arch (frame);
6c95b8df 5112 struct address_space *aspace = get_frame_address_space (frame);
35f73cfc
UW
5113 CORE_ADDR next_pc;
5114
5115 if (arm_deal_with_atomic_sequence (frame))
5116 return 1;
18819fa6 5117
35f73cfc 5118 next_pc = arm_get_next_pc (frame, get_frame_pc (frame));
18819fa6 5119 arm_insert_single_step_breakpoint (gdbarch, aspace, next_pc);
e6590a1b
UW
5120
5121 return 1;
9512d7fd 5122}
9512d7fd 5123
f9d67f43
DJ
5124/* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
5125 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
5126 NULL if an error occurs. BUF is freed. */
5127
5128static gdb_byte *
5129extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
5130 int old_len, int new_len)
5131{
22e048c9 5132 gdb_byte *new_buf;
f9d67f43
DJ
5133 int bytes_to_read = new_len - old_len;
5134
5135 new_buf = xmalloc (new_len);
5136 memcpy (new_buf + bytes_to_read, buf, old_len);
5137 xfree (buf);
5138 if (target_read_memory (endaddr - new_len, new_buf, bytes_to_read) != 0)
5139 {
5140 xfree (new_buf);
5141 return NULL;
5142 }
5143 return new_buf;
5144}
5145
5146/* An IT block is at most the 2-byte IT instruction followed by
5147 four 4-byte instructions. The furthest back we must search to
5148 find an IT block that affects the current instruction is thus
5149 2 + 3 * 4 == 14 bytes. */
5150#define MAX_IT_BLOCK_PREFIX 14
5151
5152/* Use a quick scan if there are more than this many bytes of
5153 code. */
5154#define IT_SCAN_THRESHOLD 32
5155
5156/* Adjust a breakpoint's address to move breakpoints out of IT blocks.
5157 A breakpoint in an IT block may not be hit, depending on the
5158 condition flags. */
5159static CORE_ADDR
5160arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
5161{
5162 gdb_byte *buf;
5163 char map_type;
5164 CORE_ADDR boundary, func_start;
22e048c9 5165 int buf_len;
f9d67f43
DJ
5166 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
5167 int i, any, last_it, last_it_count;
5168
5169 /* If we are using BKPT breakpoints, none of this is necessary. */
5170 if (gdbarch_tdep (gdbarch)->thumb2_breakpoint == NULL)
5171 return bpaddr;
5172
5173 /* ARM mode does not have this problem. */
9779414d 5174 if (!arm_pc_is_thumb (gdbarch, bpaddr))
f9d67f43
DJ
5175 return bpaddr;
5176
5177 /* We are setting a breakpoint in Thumb code that could potentially
5178 contain an IT block. The first step is to find how much Thumb
5179 code there is; we do not need to read outside of known Thumb
5180 sequences. */
5181 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
5182 if (map_type == 0)
5183 /* Thumb-2 code must have mapping symbols to have a chance. */
5184 return bpaddr;
5185
5186 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
5187
5188 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)
5189 && func_start > boundary)
5190 boundary = func_start;
5191
5192 /* Search for a candidate IT instruction. We have to do some fancy
5193 footwork to distinguish a real IT instruction from the second
5194 half of a 32-bit instruction, but there is no need for that if
5195 there's no candidate. */
5196 buf_len = min (bpaddr - boundary, MAX_IT_BLOCK_PREFIX);
5197 if (buf_len == 0)
5198 /* No room for an IT instruction. */
5199 return bpaddr;
5200
5201 buf = xmalloc (buf_len);
5202 if (target_read_memory (bpaddr - buf_len, buf, buf_len) != 0)
5203 return bpaddr;
5204 any = 0;
5205 for (i = 0; i < buf_len; i += 2)
5206 {
5207 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5208 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5209 {
5210 any = 1;
5211 break;
5212 }
5213 }
5214 if (any == 0)
5215 {
5216 xfree (buf);
5217 return bpaddr;
5218 }
5219
5220 /* OK, the code bytes before this instruction contain at least one
5221 halfword which resembles an IT instruction. We know that it's
5222 Thumb code, but there are still two possibilities. Either the
5223 halfword really is an IT instruction, or it is the second half of
5224 a 32-bit Thumb instruction. The only way we can tell is to
5225 scan forwards from a known instruction boundary. */
5226 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
5227 {
5228 int definite;
5229
5230 /* There's a lot of code before this instruction. Start with an
5231 optimistic search; it's easy to recognize halfwords that can
5232 not be the start of a 32-bit instruction, and use that to
5233 lock on to the instruction boundaries. */
5234 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
5235 if (buf == NULL)
5236 return bpaddr;
5237 buf_len = IT_SCAN_THRESHOLD;
5238
5239 definite = 0;
5240 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
5241 {
5242 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5243 if (thumb_insn_size (inst1) == 2)
5244 {
5245 definite = 1;
5246 break;
5247 }
5248 }
5249
5250 /* At this point, if DEFINITE, BUF[I] is the first place we
5251 are sure that we know the instruction boundaries, and it is far
5252 enough from BPADDR that we could not miss an IT instruction
5253 affecting BPADDR. If ! DEFINITE, give up - start from a
5254 known boundary. */
5255 if (! definite)
5256 {
0963b4bd
MS
5257 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
5258 bpaddr - boundary);
f9d67f43
DJ
5259 if (buf == NULL)
5260 return bpaddr;
5261 buf_len = bpaddr - boundary;
5262 i = 0;
5263 }
5264 }
5265 else
5266 {
5267 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
5268 if (buf == NULL)
5269 return bpaddr;
5270 buf_len = bpaddr - boundary;
5271 i = 0;
5272 }
5273
5274 /* Scan forwards. Find the last IT instruction before BPADDR. */
5275 last_it = -1;
5276 last_it_count = 0;
5277 while (i < buf_len)
5278 {
5279 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5280 last_it_count--;
5281 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5282 {
5283 last_it = i;
5284 if (inst1 & 0x0001)
5285 last_it_count = 4;
5286 else if (inst1 & 0x0002)
5287 last_it_count = 3;
5288 else if (inst1 & 0x0004)
5289 last_it_count = 2;
5290 else
5291 last_it_count = 1;
5292 }
5293 i += thumb_insn_size (inst1);
5294 }
5295
5296 xfree (buf);
5297
5298 if (last_it == -1)
5299 /* There wasn't really an IT instruction after all. */
5300 return bpaddr;
5301
5302 if (last_it_count < 1)
5303 /* It was too far away. */
5304 return bpaddr;
5305
5306 /* This really is a trouble spot. Move the breakpoint to the IT
5307 instruction. */
5308 return bpaddr - buf_len + last_it;
5309}
5310
cca44b1b 5311/* ARM displaced stepping support.
c906108c 5312
cca44b1b 5313 Generally ARM displaced stepping works as follows:
c906108c 5314
cca44b1b
JB
5315 1. When an instruction is to be single-stepped, it is first decoded by
5316 arm_process_displaced_insn (called from arm_displaced_step_copy_insn).
5317 Depending on the type of instruction, it is then copied to a scratch
5318 location, possibly in a modified form. The copy_* set of functions
0963b4bd 5319 performs such modification, as necessary. A breakpoint is placed after
cca44b1b
JB
5320 the modified instruction in the scratch space to return control to GDB.
5321 Note in particular that instructions which modify the PC will no longer
5322 do so after modification.
c5aa993b 5323
cca44b1b
JB
5324 2. The instruction is single-stepped, by setting the PC to the scratch
5325 location address, and resuming. Control returns to GDB when the
5326 breakpoint is hit.
c5aa993b 5327
cca44b1b
JB
5328 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
5329 function used for the current instruction. This function's job is to
5330 put the CPU/memory state back to what it would have been if the
5331 instruction had been executed unmodified in its original location. */
c5aa993b 5332
cca44b1b
JB
5333/* NOP instruction (mov r0, r0). */
5334#define ARM_NOP 0xe1a00000
34518530 5335#define THUMB_NOP 0x4600
cca44b1b
JB
5336
5337/* Helper for register reads for displaced stepping. In particular, this
5338 returns the PC as it would be seen by the instruction at its original
5339 location. */
5340
5341ULONGEST
36073a92
YQ
5342displaced_read_reg (struct regcache *regs, struct displaced_step_closure *dsc,
5343 int regno)
cca44b1b
JB
5344{
5345 ULONGEST ret;
36073a92 5346 CORE_ADDR from = dsc->insn_addr;
cca44b1b 5347
bf9f652a 5348 if (regno == ARM_PC_REGNUM)
cca44b1b 5349 {
4db71c0b
YQ
5350 /* Compute pipeline offset:
5351 - When executing an ARM instruction, PC reads as the address of the
5352 current instruction plus 8.
5353 - When executing a Thumb instruction, PC reads as the address of the
5354 current instruction plus 4. */
5355
36073a92 5356 if (!dsc->is_thumb)
4db71c0b
YQ
5357 from += 8;
5358 else
5359 from += 4;
5360
cca44b1b
JB
5361 if (debug_displaced)
5362 fprintf_unfiltered (gdb_stdlog, "displaced: read pc value %.8lx\n",
4db71c0b
YQ
5363 (unsigned long) from);
5364 return (ULONGEST) from;
cca44b1b 5365 }
c906108c 5366 else
cca44b1b
JB
5367 {
5368 regcache_cooked_read_unsigned (regs, regno, &ret);
5369 if (debug_displaced)
5370 fprintf_unfiltered (gdb_stdlog, "displaced: read r%d value %.8lx\n",
5371 regno, (unsigned long) ret);
5372 return ret;
5373 }
c906108c
SS
5374}
5375
cca44b1b
JB
5376static int
5377displaced_in_arm_mode (struct regcache *regs)
5378{
5379 ULONGEST ps;
9779414d 5380 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
66e810cd 5381
cca44b1b 5382 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
66e810cd 5383
9779414d 5384 return (ps & t_bit) == 0;
cca44b1b 5385}
66e810cd 5386
cca44b1b 5387/* Write to the PC as from a branch instruction. */
c906108c 5388
cca44b1b 5389static void
36073a92
YQ
5390branch_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5391 ULONGEST val)
c906108c 5392{
36073a92 5393 if (!dsc->is_thumb)
cca44b1b
JB
5394 /* Note: If bits 0/1 are set, this branch would be unpredictable for
5395 architecture versions < 6. */
0963b4bd
MS
5396 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5397 val & ~(ULONGEST) 0x3);
cca44b1b 5398 else
0963b4bd
MS
5399 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5400 val & ~(ULONGEST) 0x1);
cca44b1b 5401}
66e810cd 5402
cca44b1b
JB
5403/* Write to the PC as from a branch-exchange instruction. */
5404
5405static void
5406bx_write_pc (struct regcache *regs, ULONGEST val)
5407{
5408 ULONGEST ps;
9779414d 5409 ULONGEST t_bit = arm_psr_thumb_bit (get_regcache_arch (regs));
cca44b1b
JB
5410
5411 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5412
5413 if ((val & 1) == 1)
c906108c 5414 {
9779414d 5415 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
cca44b1b
JB
5416 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
5417 }
5418 else if ((val & 2) == 0)
5419 {
9779414d 5420 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 5421 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
c906108c
SS
5422 }
5423 else
5424 {
cca44b1b
JB
5425 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
5426 mode, align dest to 4 bytes). */
5427 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
9779414d 5428 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
cca44b1b 5429 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
c906108c
SS
5430 }
5431}
ed9a39eb 5432
cca44b1b 5433/* Write to the PC as if from a load instruction. */
ed9a39eb 5434
34e8f22d 5435static void
36073a92
YQ
5436load_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5437 ULONGEST val)
ed9a39eb 5438{
cca44b1b
JB
5439 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
5440 bx_write_pc (regs, val);
5441 else
36073a92 5442 branch_write_pc (regs, dsc, val);
cca44b1b 5443}
be8626e0 5444
cca44b1b
JB
5445/* Write to the PC as if from an ALU instruction. */
5446
5447static void
36073a92
YQ
5448alu_write_pc (struct regcache *regs, struct displaced_step_closure *dsc,
5449 ULONGEST val)
cca44b1b 5450{
36073a92 5451 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
cca44b1b
JB
5452 bx_write_pc (regs, val);
5453 else
36073a92 5454 branch_write_pc (regs, dsc, val);
cca44b1b
JB
5455}
5456
5457/* Helper for writing to registers for displaced stepping. Writing to the PC
5458 has a varying effects depending on the instruction which does the write:
5459 this is controlled by the WRITE_PC argument. */
5460
5461void
5462displaced_write_reg (struct regcache *regs, struct displaced_step_closure *dsc,
5463 int regno, ULONGEST val, enum pc_write_style write_pc)
5464{
bf9f652a 5465 if (regno == ARM_PC_REGNUM)
08216dd7 5466 {
cca44b1b
JB
5467 if (debug_displaced)
5468 fprintf_unfiltered (gdb_stdlog, "displaced: writing pc %.8lx\n",
5469 (unsigned long) val);
5470 switch (write_pc)
08216dd7 5471 {
cca44b1b 5472 case BRANCH_WRITE_PC:
36073a92 5473 branch_write_pc (regs, dsc, val);
08216dd7
RE
5474 break;
5475
cca44b1b
JB
5476 case BX_WRITE_PC:
5477 bx_write_pc (regs, val);
5478 break;
5479
5480 case LOAD_WRITE_PC:
36073a92 5481 load_write_pc (regs, dsc, val);
cca44b1b
JB
5482 break;
5483
5484 case ALU_WRITE_PC:
36073a92 5485 alu_write_pc (regs, dsc, val);
cca44b1b
JB
5486 break;
5487
5488 case CANNOT_WRITE_PC:
5489 warning (_("Instruction wrote to PC in an unexpected way when "
5490 "single-stepping"));
08216dd7
RE
5491 break;
5492
5493 default:
97b9747c
JB
5494 internal_error (__FILE__, __LINE__,
5495 _("Invalid argument to displaced_write_reg"));
08216dd7 5496 }
b508a996 5497
cca44b1b 5498 dsc->wrote_to_pc = 1;
b508a996 5499 }
ed9a39eb 5500 else
b508a996 5501 {
cca44b1b
JB
5502 if (debug_displaced)
5503 fprintf_unfiltered (gdb_stdlog, "displaced: writing r%d value %.8lx\n",
5504 regno, (unsigned long) val);
5505 regcache_cooked_write_unsigned (regs, regno, val);
b508a996 5506 }
34e8f22d
RE
5507}
5508
cca44b1b
JB
5509/* This function is used to concisely determine if an instruction INSN
5510 references PC. Register fields of interest in INSN should have the
0963b4bd
MS
5511 corresponding fields of BITMASK set to 0b1111. The function
5512 returns return 1 if any of these fields in INSN reference the PC
5513 (also 0b1111, r15), else it returns 0. */
67255d04
RE
5514
5515static int
cca44b1b 5516insn_references_pc (uint32_t insn, uint32_t bitmask)
67255d04 5517{
cca44b1b 5518 uint32_t lowbit = 1;
67255d04 5519
cca44b1b
JB
5520 while (bitmask != 0)
5521 {
5522 uint32_t mask;
44e1a9eb 5523
cca44b1b
JB
5524 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
5525 ;
67255d04 5526
cca44b1b
JB
5527 if (!lowbit)
5528 break;
67255d04 5529
cca44b1b 5530 mask = lowbit * 0xf;
67255d04 5531
cca44b1b
JB
5532 if ((insn & mask) == mask)
5533 return 1;
5534
5535 bitmask &= ~mask;
67255d04
RE
5536 }
5537
cca44b1b
JB
5538 return 0;
5539}
2af48f68 5540
cca44b1b
JB
5541/* The simplest copy function. Many instructions have the same effect no
5542 matter what address they are executed at: in those cases, use this. */
67255d04 5543
cca44b1b 5544static int
7ff120b4
YQ
5545arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn,
5546 const char *iname, struct displaced_step_closure *dsc)
cca44b1b
JB
5547{
5548 if (debug_displaced)
5549 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx, "
5550 "opcode/class '%s' unmodified\n", (unsigned long) insn,
5551 iname);
67255d04 5552
cca44b1b 5553 dsc->modinsn[0] = insn;
67255d04 5554
cca44b1b
JB
5555 return 0;
5556}
5557
34518530
YQ
5558static int
5559thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
5560 uint16_t insn2, const char *iname,
5561 struct displaced_step_closure *dsc)
5562{
5563 if (debug_displaced)
5564 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x %.4x, "
5565 "opcode/class '%s' unmodified\n", insn1, insn2,
5566 iname);
5567
5568 dsc->modinsn[0] = insn1;
5569 dsc->modinsn[1] = insn2;
5570 dsc->numinsns = 2;
5571
5572 return 0;
5573}
5574
5575/* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
5576 modification. */
5577static int
5578thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, unsigned int insn,
5579 const char *iname,
5580 struct displaced_step_closure *dsc)
5581{
5582 if (debug_displaced)
5583 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x, "
5584 "opcode/class '%s' unmodified\n", insn,
5585 iname);
5586
5587 dsc->modinsn[0] = insn;
5588
5589 return 0;
5590}
5591
cca44b1b
JB
5592/* Preload instructions with immediate offset. */
5593
5594static void
6e39997a 5595cleanup_preload (struct gdbarch *gdbarch,
cca44b1b
JB
5596 struct regcache *regs, struct displaced_step_closure *dsc)
5597{
5598 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5599 if (!dsc->u.preload.immed)
5600 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5601}
5602
7ff120b4
YQ
5603static void
5604install_preload (struct gdbarch *gdbarch, struct regcache *regs,
5605 struct displaced_step_closure *dsc, unsigned int rn)
cca44b1b 5606{
cca44b1b 5607 ULONGEST rn_val;
cca44b1b
JB
5608 /* Preload instructions:
5609
5610 {pli/pld} [rn, #+/-imm]
5611 ->
5612 {pli/pld} [r0, #+/-imm]. */
5613
36073a92
YQ
5614 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5615 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 5616 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
cca44b1b
JB
5617 dsc->u.preload.immed = 1;
5618
cca44b1b 5619 dsc->cleanup = &cleanup_preload;
cca44b1b
JB
5620}
5621
cca44b1b 5622static int
7ff120b4 5623arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
cca44b1b
JB
5624 struct displaced_step_closure *dsc)
5625{
5626 unsigned int rn = bits (insn, 16, 19);
cca44b1b 5627
7ff120b4
YQ
5628 if (!insn_references_pc (insn, 0x000f0000ul))
5629 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
cca44b1b
JB
5630
5631 if (debug_displaced)
5632 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
5633 (unsigned long) insn);
5634
7ff120b4
YQ
5635 dsc->modinsn[0] = insn & 0xfff0ffff;
5636
5637 install_preload (gdbarch, regs, dsc, rn);
5638
5639 return 0;
5640}
5641
34518530
YQ
5642static int
5643thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
5644 struct regcache *regs, struct displaced_step_closure *dsc)
5645{
5646 unsigned int rn = bits (insn1, 0, 3);
5647 unsigned int u_bit = bit (insn1, 7);
5648 int imm12 = bits (insn2, 0, 11);
5649 ULONGEST pc_val;
5650
5651 if (rn != ARM_PC_REGNUM)
5652 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
5653
5654 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
5655 PLD (literal) Encoding T1. */
5656 if (debug_displaced)
5657 fprintf_unfiltered (gdb_stdlog,
5658 "displaced: copying pld/pli pc (0x%x) %c imm12 %.4x\n",
5659 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
5660 imm12);
5661
5662 if (!u_bit)
5663 imm12 = -1 * imm12;
5664
5665 /* Rewrite instruction {pli/pld} PC imm12 into:
5666 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
5667
5668 {pli/pld} [r0, r1]
5669
5670 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
5671
5672 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5673 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5674
5675 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5676
5677 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
5678 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
5679 dsc->u.preload.immed = 0;
5680
5681 /* {pli/pld} [r0, r1] */
5682 dsc->modinsn[0] = insn1 & 0xfff0;
5683 dsc->modinsn[1] = 0xf001;
5684 dsc->numinsns = 2;
5685
5686 dsc->cleanup = &cleanup_preload;
5687 return 0;
5688}
5689
7ff120b4
YQ
5690/* Preload instructions with register offset. */
5691
5692static void
5693install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
5694 struct displaced_step_closure *dsc, unsigned int rn,
5695 unsigned int rm)
5696{
5697 ULONGEST rn_val, rm_val;
5698
cca44b1b
JB
5699 /* Preload register-offset instructions:
5700
5701 {pli/pld} [rn, rm {, shift}]
5702 ->
5703 {pli/pld} [r0, r1 {, shift}]. */
5704
36073a92
YQ
5705 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5706 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5707 rn_val = displaced_read_reg (regs, dsc, rn);
5708 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
5709 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5710 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
cca44b1b
JB
5711 dsc->u.preload.immed = 0;
5712
cca44b1b 5713 dsc->cleanup = &cleanup_preload;
7ff120b4
YQ
5714}
5715
5716static int
5717arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
5718 struct regcache *regs,
5719 struct displaced_step_closure *dsc)
5720{
5721 unsigned int rn = bits (insn, 16, 19);
5722 unsigned int rm = bits (insn, 0, 3);
5723
5724
5725 if (!insn_references_pc (insn, 0x000f000ful))
5726 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
5727
5728 if (debug_displaced)
5729 fprintf_unfiltered (gdb_stdlog, "displaced: copying preload insn %.8lx\n",
5730 (unsigned long) insn);
5731
5732 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
cca44b1b 5733
7ff120b4 5734 install_preload_reg (gdbarch, regs, dsc, rn, rm);
cca44b1b
JB
5735 return 0;
5736}
5737
5738/* Copy/cleanup coprocessor load and store instructions. */
5739
5740static void
6e39997a 5741cleanup_copro_load_store (struct gdbarch *gdbarch,
cca44b1b
JB
5742 struct regcache *regs,
5743 struct displaced_step_closure *dsc)
5744{
36073a92 5745 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
5746
5747 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5748
5749 if (dsc->u.ldst.writeback)
5750 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
5751}
5752
7ff120b4
YQ
5753static void
5754install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5755 struct displaced_step_closure *dsc,
5756 int writeback, unsigned int rn)
cca44b1b 5757{
cca44b1b 5758 ULONGEST rn_val;
cca44b1b 5759
cca44b1b
JB
5760 /* Coprocessor load/store instructions:
5761
5762 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
5763 ->
5764 {stc/stc2} [r0, #+/-imm].
5765
5766 ldc/ldc2 are handled identically. */
5767
36073a92
YQ
5768 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5769 rn_val = displaced_read_reg (regs, dsc, rn);
2b16b2e3
YQ
5770 /* PC should be 4-byte aligned. */
5771 rn_val = rn_val & 0xfffffffc;
cca44b1b
JB
5772 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5773
7ff120b4 5774 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
5775 dsc->u.ldst.rn = rn;
5776
7ff120b4
YQ
5777 dsc->cleanup = &cleanup_copro_load_store;
5778}
5779
5780static int
5781arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
5782 struct regcache *regs,
5783 struct displaced_step_closure *dsc)
5784{
5785 unsigned int rn = bits (insn, 16, 19);
5786
5787 if (!insn_references_pc (insn, 0x000f0000ul))
5788 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
5789
5790 if (debug_displaced)
5791 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
5792 "load/store insn %.8lx\n", (unsigned long) insn);
5793
cca44b1b
JB
5794 dsc->modinsn[0] = insn & 0xfff0ffff;
5795
7ff120b4 5796 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
cca44b1b
JB
5797
5798 return 0;
5799}
5800
34518530
YQ
5801static int
5802thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
5803 uint16_t insn2, struct regcache *regs,
5804 struct displaced_step_closure *dsc)
5805{
5806 unsigned int rn = bits (insn1, 0, 3);
5807
5808 if (rn != ARM_PC_REGNUM)
5809 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
5810 "copro load/store", dsc);
5811
5812 if (debug_displaced)
5813 fprintf_unfiltered (gdb_stdlog, "displaced: copying coprocessor "
5814 "load/store insn %.4x%.4x\n", insn1, insn2);
5815
5816 dsc->modinsn[0] = insn1 & 0xfff0;
5817 dsc->modinsn[1] = insn2;
5818 dsc->numinsns = 2;
5819
5820 /* This function is called for copying instruction LDC/LDC2/VLDR, which
5821 doesn't support writeback, so pass 0. */
5822 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
5823
5824 return 0;
5825}
5826
cca44b1b
JB
5827/* Clean up branch instructions (actually perform the branch, by setting
5828 PC). */
5829
5830static void
6e39997a 5831cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
5832 struct displaced_step_closure *dsc)
5833{
36073a92 5834 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
5835 int branch_taken = condition_true (dsc->u.branch.cond, status);
5836 enum pc_write_style write_pc = dsc->u.branch.exchange
5837 ? BX_WRITE_PC : BRANCH_WRITE_PC;
5838
5839 if (!branch_taken)
5840 return;
5841
5842 if (dsc->u.branch.link)
5843 {
8c8dba6d
YQ
5844 /* The value of LR should be the next insn of current one. In order
5845 not to confuse logic hanlding later insn `bx lr', if current insn mode
5846 is Thumb, the bit 0 of LR value should be set to 1. */
5847 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
5848
5849 if (dsc->is_thumb)
5850 next_insn_addr |= 0x1;
5851
5852 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
5853 CANNOT_WRITE_PC);
cca44b1b
JB
5854 }
5855
bf9f652a 5856 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
cca44b1b
JB
5857}
5858
5859/* Copy B/BL/BLX instructions with immediate destinations. */
5860
7ff120b4
YQ
5861static void
5862install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
5863 struct displaced_step_closure *dsc,
5864 unsigned int cond, int exchange, int link, long offset)
5865{
5866 /* Implement "BL<cond> <label>" as:
5867
5868 Preparation: cond <- instruction condition
5869 Insn: mov r0, r0 (nop)
5870 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
5871
5872 B<cond> similar, but don't set r14 in cleanup. */
5873
5874 dsc->u.branch.cond = cond;
5875 dsc->u.branch.link = link;
5876 dsc->u.branch.exchange = exchange;
5877
2b16b2e3
YQ
5878 dsc->u.branch.dest = dsc->insn_addr;
5879 if (link && exchange)
5880 /* For BLX, offset is computed from the Align (PC, 4). */
5881 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
5882
7ff120b4 5883 if (dsc->is_thumb)
2b16b2e3 5884 dsc->u.branch.dest += 4 + offset;
7ff120b4 5885 else
2b16b2e3 5886 dsc->u.branch.dest += 8 + offset;
7ff120b4
YQ
5887
5888 dsc->cleanup = &cleanup_branch;
5889}
cca44b1b 5890static int
7ff120b4
YQ
5891arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
5892 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
5893{
5894 unsigned int cond = bits (insn, 28, 31);
5895 int exchange = (cond == 0xf);
5896 int link = exchange || bit (insn, 24);
cca44b1b
JB
5897 long offset;
5898
5899 if (debug_displaced)
5900 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s immediate insn "
5901 "%.8lx\n", (exchange) ? "blx" : (link) ? "bl" : "b",
5902 (unsigned long) insn);
cca44b1b
JB
5903 if (exchange)
5904 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
5905 then arrange the switch into Thumb mode. */
5906 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
5907 else
5908 offset = bits (insn, 0, 23) << 2;
5909
5910 if (bit (offset, 25))
5911 offset = offset | ~0x3ffffff;
5912
cca44b1b
JB
5913 dsc->modinsn[0] = ARM_NOP;
5914
7ff120b4 5915 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
cca44b1b
JB
5916 return 0;
5917}
5918
34518530
YQ
5919static int
5920thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
5921 uint16_t insn2, struct regcache *regs,
5922 struct displaced_step_closure *dsc)
5923{
5924 int link = bit (insn2, 14);
5925 int exchange = link && !bit (insn2, 12);
5926 int cond = INST_AL;
5927 long offset = 0;
5928 int j1 = bit (insn2, 13);
5929 int j2 = bit (insn2, 11);
5930 int s = sbits (insn1, 10, 10);
5931 int i1 = !(j1 ^ bit (insn1, 10));
5932 int i2 = !(j2 ^ bit (insn1, 10));
5933
5934 if (!link && !exchange) /* B */
5935 {
5936 offset = (bits (insn2, 0, 10) << 1);
5937 if (bit (insn2, 12)) /* Encoding T4 */
5938 {
5939 offset |= (bits (insn1, 0, 9) << 12)
5940 | (i2 << 22)
5941 | (i1 << 23)
5942 | (s << 24);
5943 cond = INST_AL;
5944 }
5945 else /* Encoding T3 */
5946 {
5947 offset |= (bits (insn1, 0, 5) << 12)
5948 | (j1 << 18)
5949 | (j2 << 19)
5950 | (s << 20);
5951 cond = bits (insn1, 6, 9);
5952 }
5953 }
5954 else
5955 {
5956 offset = (bits (insn1, 0, 9) << 12);
5957 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
5958 offset |= exchange ?
5959 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
5960 }
5961
5962 if (debug_displaced)
5963 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s insn "
5964 "%.4x %.4x with offset %.8lx\n",
5965 link ? (exchange) ? "blx" : "bl" : "b",
5966 insn1, insn2, offset);
5967
5968 dsc->modinsn[0] = THUMB_NOP;
5969
5970 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
5971 return 0;
5972}
5973
5974/* Copy B Thumb instructions. */
5975static int
5976thumb_copy_b (struct gdbarch *gdbarch, unsigned short insn,
5977 struct displaced_step_closure *dsc)
5978{
5979 unsigned int cond = 0;
5980 int offset = 0;
5981 unsigned short bit_12_15 = bits (insn, 12, 15);
5982 CORE_ADDR from = dsc->insn_addr;
5983
5984 if (bit_12_15 == 0xd)
5985 {
5986 /* offset = SignExtend (imm8:0, 32) */
5987 offset = sbits ((insn << 1), 0, 8);
5988 cond = bits (insn, 8, 11);
5989 }
5990 else if (bit_12_15 == 0xe) /* Encoding T2 */
5991 {
5992 offset = sbits ((insn << 1), 0, 11);
5993 cond = INST_AL;
5994 }
5995
5996 if (debug_displaced)
5997 fprintf_unfiltered (gdb_stdlog,
5998 "displaced: copying b immediate insn %.4x "
5999 "with offset %d\n", insn, offset);
6000
6001 dsc->u.branch.cond = cond;
6002 dsc->u.branch.link = 0;
6003 dsc->u.branch.exchange = 0;
6004 dsc->u.branch.dest = from + 4 + offset;
6005
6006 dsc->modinsn[0] = THUMB_NOP;
6007
6008 dsc->cleanup = &cleanup_branch;
6009
6010 return 0;
6011}
6012
cca44b1b
JB
6013/* Copy BX/BLX with register-specified destinations. */
6014
7ff120b4
YQ
6015static void
6016install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
6017 struct displaced_step_closure *dsc, int link,
6018 unsigned int cond, unsigned int rm)
cca44b1b 6019{
cca44b1b
JB
6020 /* Implement {BX,BLX}<cond> <reg>" as:
6021
6022 Preparation: cond <- instruction condition
6023 Insn: mov r0, r0 (nop)
6024 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
6025
6026 Don't set r14 in cleanup for BX. */
6027
36073a92 6028 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6029
6030 dsc->u.branch.cond = cond;
6031 dsc->u.branch.link = link;
cca44b1b 6032
7ff120b4 6033 dsc->u.branch.exchange = 1;
cca44b1b
JB
6034
6035 dsc->cleanup = &cleanup_branch;
7ff120b4 6036}
cca44b1b 6037
7ff120b4
YQ
6038static int
6039arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
6040 struct regcache *regs, struct displaced_step_closure *dsc)
6041{
6042 unsigned int cond = bits (insn, 28, 31);
6043 /* BX: x12xxx1x
6044 BLX: x12xxx3x. */
6045 int link = bit (insn, 5);
6046 unsigned int rm = bits (insn, 0, 3);
6047
6048 if (debug_displaced)
6049 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.8lx",
6050 (unsigned long) insn);
6051
6052 dsc->modinsn[0] = ARM_NOP;
6053
6054 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
cca44b1b
JB
6055 return 0;
6056}
6057
34518530
YQ
6058static int
6059thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
6060 struct regcache *regs,
6061 struct displaced_step_closure *dsc)
6062{
6063 int link = bit (insn, 7);
6064 unsigned int rm = bits (insn, 3, 6);
6065
6066 if (debug_displaced)
6067 fprintf_unfiltered (gdb_stdlog, "displaced: copying insn %.4x",
6068 (unsigned short) insn);
6069
6070 dsc->modinsn[0] = THUMB_NOP;
6071
6072 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
6073
6074 return 0;
6075}
6076
6077
0963b4bd 6078/* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
cca44b1b
JB
6079
6080static void
6e39997a 6081cleanup_alu_imm (struct gdbarch *gdbarch,
cca44b1b
JB
6082 struct regcache *regs, struct displaced_step_closure *dsc)
6083{
36073a92 6084 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6085 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6086 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6087 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6088}
6089
6090static int
7ff120b4
YQ
6091arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6092 struct displaced_step_closure *dsc)
cca44b1b
JB
6093{
6094 unsigned int rn = bits (insn, 16, 19);
6095 unsigned int rd = bits (insn, 12, 15);
6096 unsigned int op = bits (insn, 21, 24);
6097 int is_mov = (op == 0xd);
6098 ULONGEST rd_val, rn_val;
cca44b1b
JB
6099
6100 if (!insn_references_pc (insn, 0x000ff000ul))
7ff120b4 6101 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
cca44b1b
JB
6102
6103 if (debug_displaced)
6104 fprintf_unfiltered (gdb_stdlog, "displaced: copying immediate %s insn "
6105 "%.8lx\n", is_mov ? "move" : "ALU",
6106 (unsigned long) insn);
6107
6108 /* Instruction is of form:
6109
6110 <op><cond> rd, [rn,] #imm
6111
6112 Rewrite as:
6113
6114 Preparation: tmp1, tmp2 <- r0, r1;
6115 r0, r1 <- rd, rn
6116 Insn: <op><cond> r0, r1, #imm
6117 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6118 */
6119
36073a92
YQ
6120 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6121 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6122 rn_val = displaced_read_reg (regs, dsc, rn);
6123 rd_val = displaced_read_reg (regs, dsc, rd);
cca44b1b
JB
6124 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6125 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6126 dsc->rd = rd;
6127
6128 if (is_mov)
6129 dsc->modinsn[0] = insn & 0xfff00fff;
6130 else
6131 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
6132
6133 dsc->cleanup = &cleanup_alu_imm;
6134
6135 return 0;
6136}
6137
34518530
YQ
6138static int
6139thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
6140 uint16_t insn2, struct regcache *regs,
6141 struct displaced_step_closure *dsc)
6142{
6143 unsigned int op = bits (insn1, 5, 8);
6144 unsigned int rn, rm, rd;
6145 ULONGEST rd_val, rn_val;
6146
6147 rn = bits (insn1, 0, 3); /* Rn */
6148 rm = bits (insn2, 0, 3); /* Rm */
6149 rd = bits (insn2, 8, 11); /* Rd */
6150
6151 /* This routine is only called for instruction MOV. */
6152 gdb_assert (op == 0x2 && rn == 0xf);
6153
6154 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
6155 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
6156
6157 if (debug_displaced)
6158 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x%.4x\n",
6159 "ALU", insn1, insn2);
6160
6161 /* Instruction is of form:
6162
6163 <op><cond> rd, [rn,] #imm
6164
6165 Rewrite as:
6166
6167 Preparation: tmp1, tmp2 <- r0, r1;
6168 r0, r1 <- rd, rn
6169 Insn: <op><cond> r0, r1, #imm
6170 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6171 */
6172
6173 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6174 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6175 rn_val = displaced_read_reg (regs, dsc, rn);
6176 rd_val = displaced_read_reg (regs, dsc, rd);
6177 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6178 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6179 dsc->rd = rd;
6180
6181 dsc->modinsn[0] = insn1;
6182 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
6183 dsc->numinsns = 2;
6184
6185 dsc->cleanup = &cleanup_alu_imm;
6186
6187 return 0;
6188}
6189
cca44b1b
JB
6190/* Copy/cleanup arithmetic/logic insns with register RHS. */
6191
6192static void
6e39997a 6193cleanup_alu_reg (struct gdbarch *gdbarch,
cca44b1b
JB
6194 struct regcache *regs, struct displaced_step_closure *dsc)
6195{
6196 ULONGEST rd_val;
6197 int i;
6198
36073a92 6199 rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6200
6201 for (i = 0; i < 3; i++)
6202 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6203
6204 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6205}
6206
7ff120b4
YQ
6207static void
6208install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
6209 struct displaced_step_closure *dsc,
6210 unsigned int rd, unsigned int rn, unsigned int rm)
cca44b1b 6211{
cca44b1b 6212 ULONGEST rd_val, rn_val, rm_val;
cca44b1b 6213
cca44b1b
JB
6214 /* Instruction is of form:
6215
6216 <op><cond> rd, [rn,] rm [, <shift>]
6217
6218 Rewrite as:
6219
6220 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
6221 r0, r1, r2 <- rd, rn, rm
6222 Insn: <op><cond> r0, r1, r2 [, <shift>]
6223 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
6224 */
6225
36073a92
YQ
6226 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6227 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6228 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6229 rd_val = displaced_read_reg (regs, dsc, rd);
6230 rn_val = displaced_read_reg (regs, dsc, rn);
6231 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6232 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6233 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6234 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6235 dsc->rd = rd;
6236
7ff120b4
YQ
6237 dsc->cleanup = &cleanup_alu_reg;
6238}
6239
6240static int
6241arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6242 struct displaced_step_closure *dsc)
6243{
6244 unsigned int op = bits (insn, 21, 24);
6245 int is_mov = (op == 0xd);
6246
6247 if (!insn_references_pc (insn, 0x000ff00ful))
6248 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
6249
6250 if (debug_displaced)
6251 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.8lx\n",
6252 is_mov ? "move" : "ALU", (unsigned long) insn);
6253
cca44b1b
JB
6254 if (is_mov)
6255 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
6256 else
6257 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
6258
7ff120b4
YQ
6259 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
6260 bits (insn, 0, 3));
cca44b1b
JB
6261 return 0;
6262}
6263
34518530
YQ
6264static int
6265thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
6266 struct regcache *regs,
6267 struct displaced_step_closure *dsc)
6268{
6269 unsigned rn, rm, rd;
6270
6271 rd = bits (insn, 3, 6);
6272 rn = (bit (insn, 7) << 3) | bits (insn, 0, 2);
6273 rm = 2;
6274
6275 if (rd != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
6276 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
6277
6278 if (debug_displaced)
6279 fprintf_unfiltered (gdb_stdlog, "displaced: copying reg %s insn %.4x\n",
6280 "ALU", (unsigned short) insn);
6281
6282 dsc->modinsn[0] = ((insn & 0xff00) | 0x08);
6283
6284 install_alu_reg (gdbarch, regs, dsc, rd, rn, rm);
6285
6286 return 0;
6287}
6288
cca44b1b
JB
6289/* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
6290
6291static void
6e39997a 6292cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
cca44b1b
JB
6293 struct regcache *regs,
6294 struct displaced_step_closure *dsc)
6295{
36073a92 6296 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
cca44b1b
JB
6297 int i;
6298
6299 for (i = 0; i < 4; i++)
6300 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6301
6302 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6303}
6304
7ff120b4
YQ
6305static void
6306install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
6307 struct displaced_step_closure *dsc,
6308 unsigned int rd, unsigned int rn, unsigned int rm,
6309 unsigned rs)
cca44b1b 6310{
7ff120b4 6311 int i;
cca44b1b 6312 ULONGEST rd_val, rn_val, rm_val, rs_val;
cca44b1b 6313
cca44b1b
JB
6314 /* Instruction is of form:
6315
6316 <op><cond> rd, [rn,] rm, <shift> rs
6317
6318 Rewrite as:
6319
6320 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
6321 r0, r1, r2, r3 <- rd, rn, rm, rs
6322 Insn: <op><cond> r0, r1, r2, <shift> r3
6323 Cleanup: tmp5 <- r0
6324 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
6325 rd <- tmp5
6326 */
6327
6328 for (i = 0; i < 4; i++)
36073a92 6329 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b 6330
36073a92
YQ
6331 rd_val = displaced_read_reg (regs, dsc, rd);
6332 rn_val = displaced_read_reg (regs, dsc, rn);
6333 rm_val = displaced_read_reg (regs, dsc, rm);
6334 rs_val = displaced_read_reg (regs, dsc, rs);
cca44b1b
JB
6335 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6336 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6337 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6338 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
6339 dsc->rd = rd;
7ff120b4
YQ
6340 dsc->cleanup = &cleanup_alu_shifted_reg;
6341}
6342
6343static int
6344arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
6345 struct regcache *regs,
6346 struct displaced_step_closure *dsc)
6347{
6348 unsigned int op = bits (insn, 21, 24);
6349 int is_mov = (op == 0xd);
6350 unsigned int rd, rn, rm, rs;
6351
6352 if (!insn_references_pc (insn, 0x000fff0ful))
6353 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
6354
6355 if (debug_displaced)
6356 fprintf_unfiltered (gdb_stdlog, "displaced: copying shifted reg %s insn "
6357 "%.8lx\n", is_mov ? "move" : "ALU",
6358 (unsigned long) insn);
6359
6360 rn = bits (insn, 16, 19);
6361 rm = bits (insn, 0, 3);
6362 rs = bits (insn, 8, 11);
6363 rd = bits (insn, 12, 15);
cca44b1b
JB
6364
6365 if (is_mov)
6366 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
6367 else
6368 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
6369
7ff120b4 6370 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
cca44b1b
JB
6371
6372 return 0;
6373}
6374
6375/* Clean up load instructions. */
6376
6377static void
6e39997a 6378cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
6379 struct displaced_step_closure *dsc)
6380{
6381 ULONGEST rt_val, rt_val2 = 0, rn_val;
cca44b1b 6382
36073a92 6383 rt_val = displaced_read_reg (regs, dsc, 0);
cca44b1b 6384 if (dsc->u.ldst.xfersize == 8)
36073a92
YQ
6385 rt_val2 = displaced_read_reg (regs, dsc, 1);
6386 rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
6387
6388 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6389 if (dsc->u.ldst.xfersize > 4)
6390 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6391 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6392 if (!dsc->u.ldst.immed)
6393 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6394
6395 /* Handle register writeback. */
6396 if (dsc->u.ldst.writeback)
6397 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6398 /* Put result in right place. */
6399 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
6400 if (dsc->u.ldst.xfersize == 8)
6401 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
6402}
6403
6404/* Clean up store instructions. */
6405
6406static void
6e39997a 6407cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
cca44b1b
JB
6408 struct displaced_step_closure *dsc)
6409{
36073a92 6410 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
cca44b1b
JB
6411
6412 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6413 if (dsc->u.ldst.xfersize > 4)
6414 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6415 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6416 if (!dsc->u.ldst.immed)
6417 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6418 if (!dsc->u.ldst.restore_r4)
6419 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
6420
6421 /* Writeback. */
6422 if (dsc->u.ldst.writeback)
6423 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6424}
6425
6426/* Copy "extra" load/store instructions. These are halfword/doubleword
6427 transfers, which have a different encoding to byte/word transfers. */
6428
6429static int
7ff120b4
YQ
6430arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unpriveleged,
6431 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
6432{
6433 unsigned int op1 = bits (insn, 20, 24);
6434 unsigned int op2 = bits (insn, 5, 6);
6435 unsigned int rt = bits (insn, 12, 15);
6436 unsigned int rn = bits (insn, 16, 19);
6437 unsigned int rm = bits (insn, 0, 3);
6438 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
6439 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
6440 int immed = (op1 & 0x4) != 0;
6441 int opcode;
6442 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
cca44b1b
JB
6443
6444 if (!insn_references_pc (insn, 0x000ff00ful))
7ff120b4 6445 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
cca44b1b
JB
6446
6447 if (debug_displaced)
6448 fprintf_unfiltered (gdb_stdlog, "displaced: copying %sextra load/store "
6449 "insn %.8lx\n", unpriveleged ? "unpriveleged " : "",
6450 (unsigned long) insn);
6451
6452 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
6453
6454 if (opcode < 0)
6455 internal_error (__FILE__, __LINE__,
6456 _("copy_extra_ld_st: instruction decode error"));
6457
36073a92
YQ
6458 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6459 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6460 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 6461 if (!immed)
36073a92 6462 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 6463
36073a92 6464 rt_val = displaced_read_reg (regs, dsc, rt);
cca44b1b 6465 if (bytesize[opcode] == 8)
36073a92
YQ
6466 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
6467 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 6468 if (!immed)
36073a92 6469 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6470
6471 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6472 if (bytesize[opcode] == 8)
6473 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
6474 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6475 if (!immed)
6476 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
6477
6478 dsc->rd = rt;
6479 dsc->u.ldst.xfersize = bytesize[opcode];
6480 dsc->u.ldst.rn = rn;
6481 dsc->u.ldst.immed = immed;
6482 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
6483 dsc->u.ldst.restore_r4 = 0;
6484
6485 if (immed)
6486 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
6487 ->
6488 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
6489 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6490 else
6491 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
6492 ->
6493 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
6494 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6495
6496 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
6497
6498 return 0;
6499}
6500
0f6f04ba 6501/* Copy byte/half word/word loads and stores. */
cca44b1b 6502
7ff120b4 6503static void
0f6f04ba
YQ
6504install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
6505 struct displaced_step_closure *dsc, int load,
6506 int immed, int writeback, int size, int usermode,
6507 int rt, int rm, int rn)
cca44b1b 6508{
cca44b1b 6509 ULONGEST rt_val, rn_val, rm_val = 0;
cca44b1b 6510
36073a92
YQ
6511 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6512 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
cca44b1b 6513 if (!immed)
36073a92 6514 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
cca44b1b 6515 if (!load)
36073a92 6516 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
cca44b1b 6517
36073a92
YQ
6518 rt_val = displaced_read_reg (regs, dsc, rt);
6519 rn_val = displaced_read_reg (regs, dsc, rn);
cca44b1b 6520 if (!immed)
36073a92 6521 rm_val = displaced_read_reg (regs, dsc, rm);
cca44b1b
JB
6522
6523 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6524 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6525 if (!immed)
6526 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
cca44b1b 6527 dsc->rd = rt;
0f6f04ba 6528 dsc->u.ldst.xfersize = size;
cca44b1b
JB
6529 dsc->u.ldst.rn = rn;
6530 dsc->u.ldst.immed = immed;
7ff120b4 6531 dsc->u.ldst.writeback = writeback;
cca44b1b
JB
6532
6533 /* To write PC we can do:
6534
494e194e
YQ
6535 Before this sequence of instructions:
6536 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
6537 r2 is the Rn value got from dispalced_read_reg.
6538
6539 Insn1: push {pc} Write address of STR instruction + offset on stack
6540 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
6541 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
6542 = addr(Insn1) + offset - addr(Insn3) - 8
6543 = offset - 16
6544 Insn4: add r4, r4, #8 r4 = offset - 8
6545 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
6546 = from + offset
6547 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
cca44b1b
JB
6548
6549 Otherwise we don't know what value to write for PC, since the offset is
494e194e
YQ
6550 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
6551 of this can be found in Section "Saving from r15" in
6552 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
cca44b1b 6553
7ff120b4
YQ
6554 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6555}
6556
34518530
YQ
6557
6558static int
6559thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
6560 uint16_t insn2, struct regcache *regs,
6561 struct displaced_step_closure *dsc, int size)
6562{
6563 unsigned int u_bit = bit (insn1, 7);
6564 unsigned int rt = bits (insn2, 12, 15);
6565 int imm12 = bits (insn2, 0, 11);
6566 ULONGEST pc_val;
6567
6568 if (debug_displaced)
6569 fprintf_unfiltered (gdb_stdlog,
6570 "displaced: copying ldr pc (0x%x) R%d %c imm12 %.4x\n",
6571 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
6572 imm12);
6573
6574 if (!u_bit)
6575 imm12 = -1 * imm12;
6576
6577 /* Rewrite instruction LDR Rt imm12 into:
6578
6579 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
6580
6581 LDR R0, R2, R3,
6582
6583 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
6584
6585
6586 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6587 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6588 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6589
6590 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6591
6592 pc_val = pc_val & 0xfffffffc;
6593
6594 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
6595 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
6596
6597 dsc->rd = rt;
6598
6599 dsc->u.ldst.xfersize = size;
6600 dsc->u.ldst.immed = 0;
6601 dsc->u.ldst.writeback = 0;
6602 dsc->u.ldst.restore_r4 = 0;
6603
6604 /* LDR R0, R2, R3 */
6605 dsc->modinsn[0] = 0xf852;
6606 dsc->modinsn[1] = 0x3;
6607 dsc->numinsns = 2;
6608
6609 dsc->cleanup = &cleanup_load;
6610
6611 return 0;
6612}
6613
6614static int
6615thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
6616 uint16_t insn2, struct regcache *regs,
6617 struct displaced_step_closure *dsc,
6618 int writeback, int immed)
6619{
6620 unsigned int rt = bits (insn2, 12, 15);
6621 unsigned int rn = bits (insn1, 0, 3);
6622 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
6623 /* In LDR (register), there is also a register Rm, which is not allowed to
6624 be PC, so we don't have to check it. */
6625
6626 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
6627 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
6628 dsc);
6629
6630 if (debug_displaced)
6631 fprintf_unfiltered (gdb_stdlog,
6632 "displaced: copying ldr r%d [r%d] insn %.4x%.4x\n",
6633 rt, rn, insn1, insn2);
6634
6635 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
6636 0, rt, rm, rn);
6637
6638 dsc->u.ldst.restore_r4 = 0;
6639
6640 if (immed)
6641 /* ldr[b]<cond> rt, [rn, #imm], etc.
6642 ->
6643 ldr[b]<cond> r0, [r2, #imm]. */
6644 {
6645 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6646 dsc->modinsn[1] = insn2 & 0x0fff;
6647 }
6648 else
6649 /* ldr[b]<cond> rt, [rn, rm], etc.
6650 ->
6651 ldr[b]<cond> r0, [r2, r3]. */
6652 {
6653 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6654 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
6655 }
6656
6657 dsc->numinsns = 2;
6658
6659 return 0;
6660}
6661
6662
7ff120b4
YQ
6663static int
6664arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
6665 struct regcache *regs,
6666 struct displaced_step_closure *dsc,
0f6f04ba 6667 int load, int size, int usermode)
7ff120b4
YQ
6668{
6669 int immed = !bit (insn, 25);
6670 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
6671 unsigned int rt = bits (insn, 12, 15);
6672 unsigned int rn = bits (insn, 16, 19);
6673 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
6674
6675 if (!insn_references_pc (insn, 0x000ff00ful))
6676 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
6677
6678 if (debug_displaced)
6679 fprintf_unfiltered (gdb_stdlog,
6680 "displaced: copying %s%s r%d [r%d] insn %.8lx\n",
0f6f04ba
YQ
6681 load ? (size == 1 ? "ldrb" : "ldr")
6682 : (size == 1 ? "strb" : "str"), usermode ? "t" : "",
7ff120b4
YQ
6683 rt, rn,
6684 (unsigned long) insn);
6685
0f6f04ba
YQ
6686 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
6687 usermode, rt, rm, rn);
7ff120b4 6688
bf9f652a 6689 if (load || rt != ARM_PC_REGNUM)
cca44b1b
JB
6690 {
6691 dsc->u.ldst.restore_r4 = 0;
6692
6693 if (immed)
6694 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
6695 ->
6696 {ldr,str}[b]<cond> r0, [r2, #imm]. */
6697 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6698 else
6699 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
6700 ->
6701 {ldr,str}[b]<cond> r0, [r2, r3]. */
6702 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6703 }
6704 else
6705 {
6706 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
6707 dsc->u.ldst.restore_r4 = 1;
494e194e
YQ
6708 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
6709 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
cca44b1b
JB
6710 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
6711 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
6712 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
6713
6714 /* As above. */
6715 if (immed)
6716 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
6717 else
6718 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
6719
cca44b1b
JB
6720 dsc->numinsns = 6;
6721 }
6722
6723 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6724
6725 return 0;
6726}
6727
6728/* Cleanup LDM instructions with fully-populated register list. This is an
6729 unfortunate corner case: it's impossible to implement correctly by modifying
6730 the instruction. The issue is as follows: we have an instruction,
6731
6732 ldm rN, {r0-r15}
6733
6734 which we must rewrite to avoid loading PC. A possible solution would be to
6735 do the load in two halves, something like (with suitable cleanup
6736 afterwards):
6737
6738 mov r8, rN
6739 ldm[id][ab] r8!, {r0-r7}
6740 str r7, <temp>
6741 ldm[id][ab] r8, {r7-r14}
6742 <bkpt>
6743
6744 but at present there's no suitable place for <temp>, since the scratch space
6745 is overwritten before the cleanup routine is called. For now, we simply
6746 emulate the instruction. */
6747
6748static void
6749cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
6750 struct displaced_step_closure *dsc)
6751{
cca44b1b
JB
6752 int inc = dsc->u.block.increment;
6753 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
6754 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
6755 uint32_t regmask = dsc->u.block.regmask;
6756 int regno = inc ? 0 : 15;
6757 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
6758 int exception_return = dsc->u.block.load && dsc->u.block.user
6759 && (regmask & 0x8000) != 0;
36073a92 6760 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
6761 int do_transfer = condition_true (dsc->u.block.cond, status);
6762 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6763
6764 if (!do_transfer)
6765 return;
6766
6767 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
6768 sensible we can do here. Complain loudly. */
6769 if (exception_return)
6770 error (_("Cannot single-step exception return"));
6771
6772 /* We don't handle any stores here for now. */
6773 gdb_assert (dsc->u.block.load != 0);
6774
6775 if (debug_displaced)
6776 fprintf_unfiltered (gdb_stdlog, "displaced: emulating block transfer: "
6777 "%s %s %s\n", dsc->u.block.load ? "ldm" : "stm",
6778 dsc->u.block.increment ? "inc" : "dec",
6779 dsc->u.block.before ? "before" : "after");
6780
6781 while (regmask)
6782 {
6783 uint32_t memword;
6784
6785 if (inc)
bf9f652a 6786 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
cca44b1b
JB
6787 regno++;
6788 else
6789 while (regno >= 0 && (regmask & (1 << regno)) == 0)
6790 regno--;
6791
6792 xfer_addr += bump_before;
6793
6794 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
6795 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
6796
6797 xfer_addr += bump_after;
6798
6799 regmask &= ~(1 << regno);
6800 }
6801
6802 if (dsc->u.block.writeback)
6803 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
6804 CANNOT_WRITE_PC);
6805}
6806
6807/* Clean up an STM which included the PC in the register list. */
6808
6809static void
6810cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
6811 struct displaced_step_closure *dsc)
6812{
36073a92 6813 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
cca44b1b
JB
6814 int store_executed = condition_true (dsc->u.block.cond, status);
6815 CORE_ADDR pc_stored_at, transferred_regs = bitcount (dsc->u.block.regmask);
6816 CORE_ADDR stm_insn_addr;
6817 uint32_t pc_val;
6818 long offset;
6819 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6820
6821 /* If condition code fails, there's nothing else to do. */
6822 if (!store_executed)
6823 return;
6824
6825 if (dsc->u.block.increment)
6826 {
6827 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
6828
6829 if (dsc->u.block.before)
6830 pc_stored_at += 4;
6831 }
6832 else
6833 {
6834 pc_stored_at = dsc->u.block.xfer_addr;
6835
6836 if (dsc->u.block.before)
6837 pc_stored_at -= 4;
6838 }
6839
6840 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
6841 stm_insn_addr = dsc->scratch_base;
6842 offset = pc_val - stm_insn_addr;
6843
6844 if (debug_displaced)
6845 fprintf_unfiltered (gdb_stdlog, "displaced: detected PC offset %.8lx for "
6846 "STM instruction\n", offset);
6847
6848 /* Rewrite the stored PC to the proper value for the non-displaced original
6849 instruction. */
6850 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
6851 dsc->insn_addr + offset);
6852}
6853
6854/* Clean up an LDM which includes the PC in the register list. We clumped all
6855 the registers in the transferred list into a contiguous range r0...rX (to
6856 avoid loading PC directly and losing control of the debugged program), so we
6857 must undo that here. */
6858
6859static void
6e39997a 6860cleanup_block_load_pc (struct gdbarch *gdbarch,
cca44b1b
JB
6861 struct regcache *regs,
6862 struct displaced_step_closure *dsc)
6863{
36073a92 6864 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
22e048c9 6865 int load_executed = condition_true (dsc->u.block.cond, status);
bf9f652a 6866 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
cca44b1b
JB
6867 unsigned int regs_loaded = bitcount (mask);
6868 unsigned int num_to_shuffle = regs_loaded, clobbered;
6869
6870 /* The method employed here will fail if the register list is fully populated
6871 (we need to avoid loading PC directly). */
6872 gdb_assert (num_to_shuffle < 16);
6873
6874 if (!load_executed)
6875 return;
6876
6877 clobbered = (1 << num_to_shuffle) - 1;
6878
6879 while (num_to_shuffle > 0)
6880 {
6881 if ((mask & (1 << write_reg)) != 0)
6882 {
6883 unsigned int read_reg = num_to_shuffle - 1;
6884
6885 if (read_reg != write_reg)
6886 {
36073a92 6887 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
cca44b1b
JB
6888 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
6889 if (debug_displaced)
6890 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: move "
6891 "loaded register r%d to r%d\n"), read_reg,
6892 write_reg);
6893 }
6894 else if (debug_displaced)
6895 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: register "
6896 "r%d already in the right place\n"),
6897 write_reg);
6898
6899 clobbered &= ~(1 << write_reg);
6900
6901 num_to_shuffle--;
6902 }
6903
6904 write_reg--;
6905 }
6906
6907 /* Restore any registers we scribbled over. */
6908 for (write_reg = 0; clobbered != 0; write_reg++)
6909 {
6910 if ((clobbered & (1 << write_reg)) != 0)
6911 {
6912 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
6913 CANNOT_WRITE_PC);
6914 if (debug_displaced)
6915 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM: restored "
6916 "clobbered register r%d\n"), write_reg);
6917 clobbered &= ~(1 << write_reg);
6918 }
6919 }
6920
6921 /* Perform register writeback manually. */
6922 if (dsc->u.block.writeback)
6923 {
6924 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
6925
6926 if (dsc->u.block.increment)
6927 new_rn_val += regs_loaded * 4;
6928 else
6929 new_rn_val -= regs_loaded * 4;
6930
6931 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
6932 CANNOT_WRITE_PC);
6933 }
6934}
6935
6936/* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
6937 in user-level code (in particular exception return, ldm rn, {...pc}^). */
6938
6939static int
7ff120b4
YQ
6940arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
6941 struct regcache *regs,
6942 struct displaced_step_closure *dsc)
cca44b1b
JB
6943{
6944 int load = bit (insn, 20);
6945 int user = bit (insn, 22);
6946 int increment = bit (insn, 23);
6947 int before = bit (insn, 24);
6948 int writeback = bit (insn, 21);
6949 int rn = bits (insn, 16, 19);
cca44b1b 6950
0963b4bd
MS
6951 /* Block transfers which don't mention PC can be run directly
6952 out-of-line. */
bf9f652a 6953 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7ff120b4 6954 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
cca44b1b 6955
bf9f652a 6956 if (rn == ARM_PC_REGNUM)
cca44b1b 6957 {
0963b4bd
MS
6958 warning (_("displaced: Unpredictable LDM or STM with "
6959 "base register r15"));
7ff120b4 6960 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
cca44b1b
JB
6961 }
6962
6963 if (debug_displaced)
6964 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
6965 "%.8lx\n", (unsigned long) insn);
6966
36073a92 6967 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b
JB
6968 dsc->u.block.rn = rn;
6969
6970 dsc->u.block.load = load;
6971 dsc->u.block.user = user;
6972 dsc->u.block.increment = increment;
6973 dsc->u.block.before = before;
6974 dsc->u.block.writeback = writeback;
6975 dsc->u.block.cond = bits (insn, 28, 31);
6976
6977 dsc->u.block.regmask = insn & 0xffff;
6978
6979 if (load)
6980 {
6981 if ((insn & 0xffff) == 0xffff)
6982 {
6983 /* LDM with a fully-populated register list. This case is
6984 particularly tricky. Implement for now by fully emulating the
6985 instruction (which might not behave perfectly in all cases, but
6986 these instructions should be rare enough for that not to matter
6987 too much). */
6988 dsc->modinsn[0] = ARM_NOP;
6989
6990 dsc->cleanup = &cleanup_block_load_all;
6991 }
6992 else
6993 {
6994 /* LDM of a list of registers which includes PC. Implement by
6995 rewriting the list of registers to be transferred into a
6996 contiguous chunk r0...rX before doing the transfer, then shuffling
6997 registers into the correct places in the cleanup routine. */
6998 unsigned int regmask = insn & 0xffff;
6999 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
7000 unsigned int to = 0, from = 0, i, new_rn;
7001
7002 for (i = 0; i < num_in_list; i++)
36073a92 7003 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
cca44b1b
JB
7004
7005 /* Writeback makes things complicated. We need to avoid clobbering
7006 the base register with one of the registers in our modified
7007 register list, but just using a different register can't work in
7008 all cases, e.g.:
7009
7010 ldm r14!, {r0-r13,pc}
7011
7012 which would need to be rewritten as:
7013
7014 ldm rN!, {r0-r14}
7015
7016 but that can't work, because there's no free register for N.
7017
7018 Solve this by turning off the writeback bit, and emulating
7019 writeback manually in the cleanup routine. */
7020
7021 if (writeback)
7022 insn &= ~(1 << 21);
7023
7024 new_regmask = (1 << num_in_list) - 1;
7025
7026 if (debug_displaced)
7027 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
7028 "{..., pc}: original reg list %.4x, modified "
7029 "list %.4x\n"), rn, writeback ? "!" : "",
7030 (int) insn & 0xffff, new_regmask);
7031
7032 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
7033
7034 dsc->cleanup = &cleanup_block_load_pc;
7035 }
7036 }
7037 else
7038 {
7039 /* STM of a list of registers which includes PC. Run the instruction
7040 as-is, but out of line: this will store the wrong value for the PC,
7041 so we must manually fix up the memory in the cleanup routine.
7042 Doing things this way has the advantage that we can auto-detect
7043 the offset of the PC write (which is architecture-dependent) in
7044 the cleanup routine. */
7045 dsc->modinsn[0] = insn;
7046
7047 dsc->cleanup = &cleanup_block_store_pc;
7048 }
7049
7050 return 0;
7051}
7052
34518530
YQ
7053static int
7054thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7055 struct regcache *regs,
7056 struct displaced_step_closure *dsc)
cca44b1b 7057{
34518530
YQ
7058 int rn = bits (insn1, 0, 3);
7059 int load = bit (insn1, 4);
7060 int writeback = bit (insn1, 5);
cca44b1b 7061
34518530
YQ
7062 /* Block transfers which don't mention PC can be run directly
7063 out-of-line. */
7064 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
7065 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7ff120b4 7066
34518530
YQ
7067 if (rn == ARM_PC_REGNUM)
7068 {
7069 warning (_("displaced: Unpredictable LDM or STM with "
7070 "base register r15"));
7071 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7072 "unpredictable ldm/stm", dsc);
7073 }
cca44b1b
JB
7074
7075 if (debug_displaced)
34518530
YQ
7076 fprintf_unfiltered (gdb_stdlog, "displaced: copying block transfer insn "
7077 "%.4x%.4x\n", insn1, insn2);
cca44b1b 7078
34518530
YQ
7079 /* Clear bit 13, since it should be always zero. */
7080 dsc->u.block.regmask = (insn2 & 0xdfff);
7081 dsc->u.block.rn = rn;
cca44b1b 7082
34518530
YQ
7083 dsc->u.block.load = load;
7084 dsc->u.block.user = 0;
7085 dsc->u.block.increment = bit (insn1, 7);
7086 dsc->u.block.before = bit (insn1, 8);
7087 dsc->u.block.writeback = writeback;
7088 dsc->u.block.cond = INST_AL;
7089 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
cca44b1b 7090
34518530
YQ
7091 if (load)
7092 {
7093 if (dsc->u.block.regmask == 0xffff)
7094 {
7095 /* This branch is impossible to happen. */
7096 gdb_assert (0);
7097 }
7098 else
7099 {
7100 unsigned int regmask = dsc->u.block.regmask;
7101 unsigned int num_in_list = bitcount (regmask), new_regmask, bit = 1;
7102 unsigned int to = 0, from = 0, i, new_rn;
7103
7104 for (i = 0; i < num_in_list; i++)
7105 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7106
7107 if (writeback)
7108 insn1 &= ~(1 << 5);
7109
7110 new_regmask = (1 << num_in_list) - 1;
7111
7112 if (debug_displaced)
7113 fprintf_unfiltered (gdb_stdlog, _("displaced: LDM r%d%s, "
7114 "{..., pc}: original reg list %.4x, modified "
7115 "list %.4x\n"), rn, writeback ? "!" : "",
7116 (int) dsc->u.block.regmask, new_regmask);
7117
7118 dsc->modinsn[0] = insn1;
7119 dsc->modinsn[1] = (new_regmask & 0xffff);
7120 dsc->numinsns = 2;
7121
7122 dsc->cleanup = &cleanup_block_load_pc;
7123 }
7124 }
7125 else
7126 {
7127 dsc->modinsn[0] = insn1;
7128 dsc->modinsn[1] = insn2;
7129 dsc->numinsns = 2;
7130 dsc->cleanup = &cleanup_block_store_pc;
7131 }
7132 return 0;
7133}
7134
7135/* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
7136 for Linux, where some SVC instructions must be treated specially. */
7137
7138static void
7139cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
7140 struct displaced_step_closure *dsc)
7141{
7142 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
7143
7144 if (debug_displaced)
7145 fprintf_unfiltered (gdb_stdlog, "displaced: cleanup for svc, resume at "
7146 "%.8lx\n", (unsigned long) resume_addr);
7147
7148 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
7149}
7150
7151
7152/* Common copy routine for svc instruciton. */
7153
7154static int
7155install_svc (struct gdbarch *gdbarch, struct regcache *regs,
7156 struct displaced_step_closure *dsc)
7157{
7158 /* Preparation: none.
7159 Insn: unmodified svc.
7160 Cleanup: pc <- insn_addr + insn_size. */
7161
7162 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
7163 instruction. */
7164 dsc->wrote_to_pc = 1;
7165
7166 /* Allow OS-specific code to override SVC handling. */
bd18283a
YQ
7167 if (dsc->u.svc.copy_svc_os)
7168 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
7169 else
7170 {
7171 dsc->cleanup = &cleanup_svc;
7172 return 0;
7173 }
34518530
YQ
7174}
7175
7176static int
7177arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
7178 struct regcache *regs, struct displaced_step_closure *dsc)
7179{
7180
7181 if (debug_displaced)
7182 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.8lx\n",
7183 (unsigned long) insn);
7184
7185 dsc->modinsn[0] = insn;
7186
7187 return install_svc (gdbarch, regs, dsc);
7188}
7189
7190static int
7191thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
7192 struct regcache *regs, struct displaced_step_closure *dsc)
7193{
7194
7195 if (debug_displaced)
7196 fprintf_unfiltered (gdb_stdlog, "displaced: copying svc insn %.4x\n",
7197 insn);
bd18283a 7198
34518530
YQ
7199 dsc->modinsn[0] = insn;
7200
7201 return install_svc (gdbarch, regs, dsc);
cca44b1b
JB
7202}
7203
7204/* Copy undefined instructions. */
7205
7206static int
7ff120b4
YQ
7207arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
7208 struct displaced_step_closure *dsc)
cca44b1b
JB
7209{
7210 if (debug_displaced)
0963b4bd
MS
7211 fprintf_unfiltered (gdb_stdlog,
7212 "displaced: copying undefined insn %.8lx\n",
cca44b1b
JB
7213 (unsigned long) insn);
7214
7215 dsc->modinsn[0] = insn;
7216
7217 return 0;
7218}
7219
34518530
YQ
7220static int
7221thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7222 struct displaced_step_closure *dsc)
7223{
7224
7225 if (debug_displaced)
7226 fprintf_unfiltered (gdb_stdlog, "displaced: copying undefined insn "
7227 "%.4x %.4x\n", (unsigned short) insn1,
7228 (unsigned short) insn2);
7229
7230 dsc->modinsn[0] = insn1;
7231 dsc->modinsn[1] = insn2;
7232 dsc->numinsns = 2;
7233
7234 return 0;
7235}
7236
cca44b1b
JB
7237/* Copy unpredictable instructions. */
7238
7239static int
7ff120b4
YQ
7240arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
7241 struct displaced_step_closure *dsc)
cca44b1b
JB
7242{
7243 if (debug_displaced)
7244 fprintf_unfiltered (gdb_stdlog, "displaced: copying unpredictable insn "
7245 "%.8lx\n", (unsigned long) insn);
7246
7247 dsc->modinsn[0] = insn;
7248
7249 return 0;
7250}
7251
7252/* The decode_* functions are instruction decoding helpers. They mostly follow
7253 the presentation in the ARM ARM. */
7254
7255static int
7ff120b4
YQ
7256arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
7257 struct regcache *regs,
7258 struct displaced_step_closure *dsc)
cca44b1b
JB
7259{
7260 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
7261 unsigned int rn = bits (insn, 16, 19);
7262
7263 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0xe) == 0x0)
7ff120b4 7264 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
cca44b1b 7265 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0xe) == 0x1)
7ff120b4 7266 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
cca44b1b 7267 else if ((op1 & 0x60) == 0x20)
7ff120b4 7268 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
cca44b1b 7269 else if ((op1 & 0x71) == 0x40)
7ff120b4
YQ
7270 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
7271 dsc);
cca44b1b 7272 else if ((op1 & 0x77) == 0x41)
7ff120b4 7273 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 7274 else if ((op1 & 0x77) == 0x45)
7ff120b4 7275 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
cca44b1b
JB
7276 else if ((op1 & 0x77) == 0x51)
7277 {
7278 if (rn != 0xf)
7ff120b4 7279 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b 7280 else
7ff120b4 7281 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7282 }
7283 else if ((op1 & 0x77) == 0x55)
7ff120b4 7284 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
cca44b1b
JB
7285 else if (op1 == 0x57)
7286 switch (op2)
7287 {
7ff120b4
YQ
7288 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
7289 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
7290 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
7291 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
7292 default: return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7293 }
7294 else if ((op1 & 0x63) == 0x43)
7ff120b4 7295 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b
JB
7296 else if ((op2 & 0x1) == 0x0)
7297 switch (op1 & ~0x80)
7298 {
7299 case 0x61:
7ff120b4 7300 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
cca44b1b 7301 case 0x65:
7ff120b4 7302 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
cca44b1b
JB
7303 case 0x71: case 0x75:
7304 /* pld/pldw reg. */
7ff120b4 7305 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
cca44b1b 7306 case 0x63: case 0x67: case 0x73: case 0x77:
7ff120b4 7307 return arm_copy_unpred (gdbarch, insn, dsc);
cca44b1b 7308 default:
7ff120b4 7309 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7310 }
7311 else
7ff120b4 7312 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
cca44b1b
JB
7313}
7314
7315static int
7ff120b4
YQ
7316arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
7317 struct regcache *regs,
7318 struct displaced_step_closure *dsc)
cca44b1b
JB
7319{
7320 if (bit (insn, 27) == 0)
7ff120b4 7321 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
cca44b1b
JB
7322 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
7323 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
7324 {
7325 case 0x0: case 0x2:
7ff120b4 7326 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
cca44b1b
JB
7327
7328 case 0x1: case 0x3:
7ff120b4 7329 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
cca44b1b
JB
7330
7331 case 0x4: case 0x5: case 0x6: case 0x7:
7ff120b4 7332 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b
JB
7333
7334 case 0x8:
7335 switch ((insn & 0xe00000) >> 21)
7336 {
7337 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
7338 /* stc/stc2. */
7ff120b4 7339 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7340
7341 case 0x2:
7ff120b4 7342 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b
JB
7343
7344 default:
7ff120b4 7345 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7346 }
7347
7348 case 0x9:
7349 {
7350 int rn_f = (bits (insn, 16, 19) == 0xf);
7351 switch ((insn & 0xe00000) >> 21)
7352 {
7353 case 0x1: case 0x3:
7354 /* ldc/ldc2 imm (undefined for rn == pc). */
7ff120b4
YQ
7355 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
7356 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7357
7358 case 0x2:
7ff120b4 7359 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
7360
7361 case 0x4: case 0x5: case 0x6: case 0x7:
7362 /* ldc/ldc2 lit (undefined for rn != pc). */
7ff120b4
YQ
7363 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
7364 : arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7365
7366 default:
7ff120b4 7367 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7368 }
7369 }
7370
7371 case 0xa:
7ff120b4 7372 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
cca44b1b
JB
7373
7374 case 0xb:
7375 if (bits (insn, 16, 19) == 0xf)
7376 /* ldc/ldc2 lit. */
7ff120b4 7377 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 7378 else
7ff120b4 7379 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7380
7381 case 0xc:
7382 if (bit (insn, 4))
7ff120b4 7383 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 7384 else
7ff120b4 7385 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7386
7387 case 0xd:
7388 if (bit (insn, 4))
7ff120b4 7389 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 7390 else
7ff120b4 7391 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7392
7393 default:
7ff120b4 7394 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7395 }
7396}
7397
7398/* Decode miscellaneous instructions in dp/misc encoding space. */
7399
7400static int
7ff120b4
YQ
7401arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
7402 struct regcache *regs,
7403 struct displaced_step_closure *dsc)
cca44b1b
JB
7404{
7405 unsigned int op2 = bits (insn, 4, 6);
7406 unsigned int op = bits (insn, 21, 22);
7407 unsigned int op1 = bits (insn, 16, 19);
7408
7409 switch (op2)
7410 {
7411 case 0x0:
7ff120b4 7412 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
cca44b1b
JB
7413
7414 case 0x1:
7415 if (op == 0x1) /* bx. */
7ff120b4 7416 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
cca44b1b 7417 else if (op == 0x3)
7ff120b4 7418 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
cca44b1b 7419 else
7ff120b4 7420 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7421
7422 case 0x2:
7423 if (op == 0x1)
7424 /* Not really supported. */
7ff120b4 7425 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
cca44b1b 7426 else
7ff120b4 7427 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7428
7429 case 0x3:
7430 if (op == 0x1)
7ff120b4 7431 return arm_copy_bx_blx_reg (gdbarch, insn,
0963b4bd 7432 regs, dsc); /* blx register. */
cca44b1b 7433 else
7ff120b4 7434 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7435
7436 case 0x5:
7ff120b4 7437 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
cca44b1b
JB
7438
7439 case 0x7:
7440 if (op == 0x1)
7ff120b4 7441 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
cca44b1b
JB
7442 else if (op == 0x3)
7443 /* Not really supported. */
7ff120b4 7444 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
cca44b1b
JB
7445
7446 default:
7ff120b4 7447 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7448 }
7449}
7450
7451static int
7ff120b4
YQ
7452arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
7453 struct regcache *regs,
7454 struct displaced_step_closure *dsc)
cca44b1b
JB
7455{
7456 if (bit (insn, 25))
7457 switch (bits (insn, 20, 24))
7458 {
7459 case 0x10:
7ff120b4 7460 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
cca44b1b
JB
7461
7462 case 0x14:
7ff120b4 7463 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
cca44b1b
JB
7464
7465 case 0x12: case 0x16:
7ff120b4 7466 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
cca44b1b
JB
7467
7468 default:
7ff120b4 7469 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
cca44b1b
JB
7470 }
7471 else
7472 {
7473 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
7474
7475 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7ff120b4 7476 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
cca44b1b 7477 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7ff120b4 7478 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
cca44b1b 7479 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7ff120b4 7480 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
cca44b1b 7481 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7ff120b4 7482 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
cca44b1b 7483 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7ff120b4 7484 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
cca44b1b 7485 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7ff120b4 7486 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
cca44b1b
JB
7487 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
7488 /* 2nd arg means "unpriveleged". */
7ff120b4
YQ
7489 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
7490 dsc);
cca44b1b
JB
7491 }
7492
7493 /* Should be unreachable. */
7494 return 1;
7495}
7496
7497static int
7ff120b4
YQ
7498arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
7499 struct regcache *regs,
7500 struct displaced_step_closure *dsc)
cca44b1b
JB
7501{
7502 int a = bit (insn, 25), b = bit (insn, 4);
7503 uint32_t op1 = bits (insn, 20, 24);
7504 int rn_f = bits (insn, 16, 19) == 0xf;
7505
7506 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
7507 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
0f6f04ba 7508 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
cca44b1b
JB
7509 else if ((!a && (op1 & 0x17) == 0x02)
7510 || (a && (op1 & 0x17) == 0x02 && !b))
0f6f04ba 7511 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
cca44b1b
JB
7512 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
7513 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
0f6f04ba 7514 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
cca44b1b
JB
7515 else if ((!a && (op1 & 0x17) == 0x03)
7516 || (a && (op1 & 0x17) == 0x03 && !b))
0f6f04ba 7517 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
cca44b1b
JB
7518 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
7519 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7ff120b4 7520 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
cca44b1b
JB
7521 else if ((!a && (op1 & 0x17) == 0x06)
7522 || (a && (op1 & 0x17) == 0x06 && !b))
7ff120b4 7523 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
cca44b1b
JB
7524 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
7525 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7ff120b4 7526 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
cca44b1b
JB
7527 else if ((!a && (op1 & 0x17) == 0x07)
7528 || (a && (op1 & 0x17) == 0x07 && !b))
7ff120b4 7529 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
cca44b1b
JB
7530
7531 /* Should be unreachable. */
7532 return 1;
7533}
7534
7535static int
7ff120b4
YQ
7536arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
7537 struct displaced_step_closure *dsc)
cca44b1b
JB
7538{
7539 switch (bits (insn, 20, 24))
7540 {
7541 case 0x00: case 0x01: case 0x02: case 0x03:
7ff120b4 7542 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
cca44b1b
JB
7543
7544 case 0x04: case 0x05: case 0x06: case 0x07:
7ff120b4 7545 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
cca44b1b
JB
7546
7547 case 0x08: case 0x09: case 0x0a: case 0x0b:
7548 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7ff120b4 7549 return arm_copy_unmodified (gdbarch, insn,
cca44b1b
JB
7550 "decode/pack/unpack/saturate/reverse", dsc);
7551
7552 case 0x18:
7553 if (bits (insn, 5, 7) == 0) /* op2. */
7554 {
7555 if (bits (insn, 12, 15) == 0xf)
7ff120b4 7556 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
cca44b1b 7557 else
7ff120b4 7558 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
cca44b1b
JB
7559 }
7560 else
7ff120b4 7561 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7562
7563 case 0x1a: case 0x1b:
7564 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 7565 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
cca44b1b 7566 else
7ff120b4 7567 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7568
7569 case 0x1c: case 0x1d:
7570 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
7571 {
7572 if (bits (insn, 0, 3) == 0xf)
7ff120b4 7573 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
cca44b1b 7574 else
7ff120b4 7575 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
cca44b1b
JB
7576 }
7577 else
7ff120b4 7578 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7579
7580 case 0x1e: case 0x1f:
7581 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7ff120b4 7582 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
cca44b1b 7583 else
7ff120b4 7584 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b
JB
7585 }
7586
7587 /* Should be unreachable. */
7588 return 1;
7589}
7590
7591static int
7ff120b4
YQ
7592arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, int32_t insn,
7593 struct regcache *regs,
7594 struct displaced_step_closure *dsc)
cca44b1b
JB
7595{
7596 if (bit (insn, 25))
7ff120b4 7597 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
cca44b1b 7598 else
7ff120b4 7599 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
cca44b1b
JB
7600}
7601
7602static int
7ff120b4
YQ
7603arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
7604 struct regcache *regs,
7605 struct displaced_step_closure *dsc)
cca44b1b
JB
7606{
7607 unsigned int opcode = bits (insn, 20, 24);
7608
7609 switch (opcode)
7610 {
7611 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7ff120b4 7612 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
cca44b1b
JB
7613
7614 case 0x08: case 0x0a: case 0x0c: case 0x0e:
7615 case 0x12: case 0x16:
7ff120b4 7616 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
cca44b1b
JB
7617
7618 case 0x09: case 0x0b: case 0x0d: case 0x0f:
7619 case 0x13: case 0x17:
7ff120b4 7620 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
cca44b1b
JB
7621
7622 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7623 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7624 /* Note: no writeback for these instructions. Bit 25 will always be
7625 zero though (via caller), so the following works OK. */
7ff120b4 7626 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7627 }
7628
7629 /* Should be unreachable. */
7630 return 1;
7631}
7632
34518530
YQ
7633/* Decode shifted register instructions. */
7634
7635static int
7636thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
7637 uint16_t insn2, struct regcache *regs,
7638 struct displaced_step_closure *dsc)
7639{
7640 /* PC is only allowed to be used in instruction MOV. */
7641
7642 unsigned int op = bits (insn1, 5, 8);
7643 unsigned int rn = bits (insn1, 0, 3);
7644
7645 if (op == 0x2 && rn == 0xf) /* MOV */
7646 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
7647 else
7648 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7649 "dp (shift reg)", dsc);
7650}
7651
7652
7653/* Decode extension register load/store. Exactly the same as
7654 arm_decode_ext_reg_ld_st. */
7655
7656static int
7657thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
7658 uint16_t insn2, struct regcache *regs,
7659 struct displaced_step_closure *dsc)
7660{
7661 unsigned int opcode = bits (insn1, 4, 8);
7662
7663 switch (opcode)
7664 {
7665 case 0x04: case 0x05:
7666 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7667 "vfp/neon vmov", dsc);
7668
7669 case 0x08: case 0x0c: /* 01x00 */
7670 case 0x0a: case 0x0e: /* 01x10 */
7671 case 0x12: case 0x16: /* 10x10 */
7672 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7673 "vfp/neon vstm/vpush", dsc);
7674
7675 case 0x09: case 0x0d: /* 01x01 */
7676 case 0x0b: case 0x0f: /* 01x11 */
7677 case 0x13: case 0x17: /* 10x11 */
7678 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7679 "vfp/neon vldm/vpop", dsc);
7680
7681 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7682 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7683 "vstr", dsc);
7684 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7685 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
7686 }
7687
7688 /* Should be unreachable. */
7689 return 1;
7690}
7691
cca44b1b 7692static int
7ff120b4
YQ
7693arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn, CORE_ADDR to,
7694 struct regcache *regs, struct displaced_step_closure *dsc)
cca44b1b
JB
7695{
7696 unsigned int op1 = bits (insn, 20, 25);
7697 int op = bit (insn, 4);
7698 unsigned int coproc = bits (insn, 8, 11);
7699 unsigned int rn = bits (insn, 16, 19);
7700
7701 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7ff120b4 7702 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
cca44b1b
JB
7703 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
7704 && (coproc & 0xe) != 0xa)
7705 /* stc/stc2. */
7ff120b4 7706 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b
JB
7707 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
7708 && (coproc & 0xe) != 0xa)
7709 /* ldc/ldc2 imm/lit. */
7ff120b4 7710 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
cca44b1b 7711 else if ((op1 & 0x3e) == 0x00)
7ff120b4 7712 return arm_copy_undef (gdbarch, insn, dsc);
cca44b1b 7713 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7ff120b4 7714 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
cca44b1b 7715 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7ff120b4 7716 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
cca44b1b 7717 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7ff120b4 7718 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
cca44b1b
JB
7719 else if ((op1 & 0x30) == 0x20 && !op)
7720 {
7721 if ((coproc & 0xe) == 0xa)
7ff120b4 7722 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
cca44b1b 7723 else
7ff120b4 7724 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
cca44b1b
JB
7725 }
7726 else if ((op1 & 0x30) == 0x20 && op)
7ff120b4 7727 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
cca44b1b 7728 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7ff120b4 7729 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
cca44b1b 7730 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7ff120b4 7731 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
cca44b1b 7732 else if ((op1 & 0x30) == 0x30)
7ff120b4 7733 return arm_copy_svc (gdbarch, insn, regs, dsc);
cca44b1b 7734 else
7ff120b4 7735 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
cca44b1b
JB
7736}
7737
34518530
YQ
7738static int
7739thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
7740 uint16_t insn2, struct regcache *regs,
7741 struct displaced_step_closure *dsc)
7742{
7743 unsigned int coproc = bits (insn2, 8, 11);
7744 unsigned int op1 = bits (insn1, 4, 9);
7745 unsigned int bit_5_8 = bits (insn1, 5, 8);
7746 unsigned int bit_9 = bit (insn1, 9);
7747 unsigned int bit_4 = bit (insn1, 4);
7748 unsigned int rn = bits (insn1, 0, 3);
7749
7750 if (bit_9 == 0)
7751 {
7752 if (bit_5_8 == 2)
7753 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7754 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
7755 dsc);
7756 else if (bit_5_8 == 0) /* UNDEFINED. */
7757 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7758 else
7759 {
7760 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
7761 if ((coproc & 0xe) == 0xa)
7762 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
7763 dsc);
7764 else /* coproc is not 101x. */
7765 {
7766 if (bit_4 == 0) /* STC/STC2. */
7767 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7768 "stc/stc2", dsc);
7769 else /* LDC/LDC2 {literal, immeidate}. */
7770 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
7771 regs, dsc);
7772 }
7773 }
7774 }
7775 else
7776 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
7777
7778 return 0;
7779}
7780
7781static void
7782install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
7783 struct displaced_step_closure *dsc, int rd)
7784{
7785 /* ADR Rd, #imm
7786
7787 Rewrite as:
7788
7789 Preparation: Rd <- PC
7790 Insn: ADD Rd, #imm
7791 Cleanup: Null.
7792 */
7793
7794 /* Rd <- PC */
7795 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
7796 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
7797}
7798
7799static int
7800thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
7801 struct displaced_step_closure *dsc,
7802 int rd, unsigned int imm)
7803{
7804
7805 /* Encoding T2: ADDS Rd, #imm */
7806 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
7807
7808 install_pc_relative (gdbarch, regs, dsc, rd);
7809
7810 return 0;
7811}
7812
7813static int
7814thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
7815 struct regcache *regs,
7816 struct displaced_step_closure *dsc)
7817{
7818 unsigned int rd = bits (insn, 8, 10);
7819 unsigned int imm8 = bits (insn, 0, 7);
7820
7821 if (debug_displaced)
7822 fprintf_unfiltered (gdb_stdlog,
7823 "displaced: copying thumb adr r%d, #%d insn %.4x\n",
7824 rd, imm8, insn);
7825
7826 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
7827}
7828
7829static int
7830thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
7831 uint16_t insn2, struct regcache *regs,
7832 struct displaced_step_closure *dsc)
7833{
7834 unsigned int rd = bits (insn2, 8, 11);
7835 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
7836 extract raw immediate encoding rather than computing immediate. When
7837 generating ADD or SUB instruction, we can simply perform OR operation to
7838 set immediate into ADD. */
7839 unsigned int imm_3_8 = insn2 & 0x70ff;
7840 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
7841
7842 if (debug_displaced)
7843 fprintf_unfiltered (gdb_stdlog,
7844 "displaced: copying thumb adr r%d, #%d:%d insn %.4x%.4x\n",
7845 rd, imm_i, imm_3_8, insn1, insn2);
7846
7847 if (bit (insn1, 7)) /* Encoding T2 */
7848 {
7849 /* Encoding T3: SUB Rd, Rd, #imm */
7850 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
7851 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
7852 }
7853 else /* Encoding T3 */
7854 {
7855 /* Encoding T3: ADD Rd, Rd, #imm */
7856 dsc->modinsn[0] = (0xf100 | rd | imm_i);
7857 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
7858 }
7859 dsc->numinsns = 2;
7860
7861 install_pc_relative (gdbarch, regs, dsc, rd);
7862
7863 return 0;
7864}
7865
7866static int
7867thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, unsigned short insn1,
7868 struct regcache *regs,
7869 struct displaced_step_closure *dsc)
7870{
7871 unsigned int rt = bits (insn1, 8, 10);
7872 unsigned int pc;
7873 int imm8 = (bits (insn1, 0, 7) << 2);
7874 CORE_ADDR from = dsc->insn_addr;
7875
7876 /* LDR Rd, #imm8
7877
7878 Rwrite as:
7879
7880 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
7881
7882 Insn: LDR R0, [R2, R3];
7883 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
7884
7885 if (debug_displaced)
7886 fprintf_unfiltered (gdb_stdlog,
7887 "displaced: copying thumb ldr r%d [pc #%d]\n"
7888 , rt, imm8);
7889
7890 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
7891 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
7892 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
7893 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
7894 /* The assembler calculates the required value of the offset from the
7895 Align(PC,4) value of this instruction to the label. */
7896 pc = pc & 0xfffffffc;
7897
7898 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
7899 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
7900
7901 dsc->rd = rt;
7902 dsc->u.ldst.xfersize = 4;
7903 dsc->u.ldst.rn = 0;
7904 dsc->u.ldst.immed = 0;
7905 dsc->u.ldst.writeback = 0;
7906 dsc->u.ldst.restore_r4 = 0;
7907
7908 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
7909
7910 dsc->cleanup = &cleanup_load;
7911
7912 return 0;
7913}
7914
7915/* Copy Thumb cbnz/cbz insruction. */
7916
7917static int
7918thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
7919 struct regcache *regs,
7920 struct displaced_step_closure *dsc)
7921{
7922 int non_zero = bit (insn1, 11);
7923 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
7924 CORE_ADDR from = dsc->insn_addr;
7925 int rn = bits (insn1, 0, 2);
7926 int rn_val = displaced_read_reg (regs, dsc, rn);
7927
7928 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
7929 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
7930 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
7931 condition is false, let it be, cleanup_branch will do nothing. */
7932 if (dsc->u.branch.cond)
7933 {
7934 dsc->u.branch.cond = INST_AL;
7935 dsc->u.branch.dest = from + 4 + imm5;
7936 }
7937 else
7938 dsc->u.branch.dest = from + 2;
7939
7940 dsc->u.branch.link = 0;
7941 dsc->u.branch.exchange = 0;
7942
7943 if (debug_displaced)
7944 fprintf_unfiltered (gdb_stdlog, "displaced: copying %s [r%d = 0x%x]"
7945 " insn %.4x to %.8lx\n", non_zero ? "cbnz" : "cbz",
7946 rn, rn_val, insn1, dsc->u.branch.dest);
7947
7948 dsc->modinsn[0] = THUMB_NOP;
7949
7950 dsc->cleanup = &cleanup_branch;
7951 return 0;
7952}
7953
7954/* Copy Table Branch Byte/Halfword */
7955static int
7956thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
7957 uint16_t insn2, struct regcache *regs,
7958 struct displaced_step_closure *dsc)
7959{
7960 ULONGEST rn_val, rm_val;
7961 int is_tbh = bit (insn2, 4);
7962 CORE_ADDR halfwords = 0;
7963 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7964
7965 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
7966 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
7967
7968 if (is_tbh)
7969 {
7970 gdb_byte buf[2];
7971
7972 target_read_memory (rn_val + 2 * rm_val, buf, 2);
7973 halfwords = extract_unsigned_integer (buf, 2, byte_order);
7974 }
7975 else
7976 {
7977 gdb_byte buf[1];
7978
7979 target_read_memory (rn_val + rm_val, buf, 1);
7980 halfwords = extract_unsigned_integer (buf, 1, byte_order);
7981 }
7982
7983 if (debug_displaced)
7984 fprintf_unfiltered (gdb_stdlog, "displaced: %s base 0x%x offset 0x%x"
7985 " offset 0x%x\n", is_tbh ? "tbh" : "tbb",
7986 (unsigned int) rn_val, (unsigned int) rm_val,
7987 (unsigned int) halfwords);
7988
7989 dsc->u.branch.cond = INST_AL;
7990 dsc->u.branch.link = 0;
7991 dsc->u.branch.exchange = 0;
7992 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
7993
7994 dsc->cleanup = &cleanup_branch;
7995
7996 return 0;
7997}
7998
7999static void
8000cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
8001 struct displaced_step_closure *dsc)
8002{
8003 /* PC <- r7 */
8004 int val = displaced_read_reg (regs, dsc, 7);
8005 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
8006
8007 /* r7 <- r8 */
8008 val = displaced_read_reg (regs, dsc, 8);
8009 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
8010
8011 /* r8 <- tmp[0] */
8012 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
8013
8014}
8015
8016static int
8017thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, unsigned short insn1,
8018 struct regcache *regs,
8019 struct displaced_step_closure *dsc)
8020{
8021 dsc->u.block.regmask = insn1 & 0x00ff;
8022
8023 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
8024 to :
8025
8026 (1) register list is full, that is, r0-r7 are used.
8027 Prepare: tmp[0] <- r8
8028
8029 POP {r0, r1, ...., r6, r7}; remove PC from reglist
8030 MOV r8, r7; Move value of r7 to r8;
8031 POP {r7}; Store PC value into r7.
8032
8033 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
8034
8035 (2) register list is not full, supposing there are N registers in
8036 register list (except PC, 0 <= N <= 7).
8037 Prepare: for each i, 0 - N, tmp[i] <- ri.
8038
8039 POP {r0, r1, ...., rN};
8040
8041 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
8042 from tmp[] properly.
8043 */
8044 if (debug_displaced)
8045 fprintf_unfiltered (gdb_stdlog,
8046 "displaced: copying thumb pop {%.8x, pc} insn %.4x\n",
8047 dsc->u.block.regmask, insn1);
8048
8049 if (dsc->u.block.regmask == 0xff)
8050 {
8051 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
8052
8053 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
8054 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
8055 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
8056
8057 dsc->numinsns = 3;
8058 dsc->cleanup = &cleanup_pop_pc_16bit_all;
8059 }
8060 else
8061 {
8062 unsigned int num_in_list = bitcount (dsc->u.block.regmask);
8063 unsigned int new_regmask, bit = 1;
8064 unsigned int to = 0, from = 0, i, new_rn;
8065
8066 for (i = 0; i < num_in_list + 1; i++)
8067 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
8068
8069 new_regmask = (1 << (num_in_list + 1)) - 1;
8070
8071 if (debug_displaced)
8072 fprintf_unfiltered (gdb_stdlog, _("displaced: POP "
8073 "{..., pc}: original reg list %.4x,"
8074 " modified list %.4x\n"),
8075 (int) dsc->u.block.regmask, new_regmask);
8076
8077 dsc->u.block.regmask |= 0x8000;
8078 dsc->u.block.writeback = 0;
8079 dsc->u.block.cond = INST_AL;
8080
8081 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
8082
8083 dsc->cleanup = &cleanup_block_load_pc;
8084 }
8085
8086 return 0;
8087}
8088
8089static void
8090thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8091 struct regcache *regs,
8092 struct displaced_step_closure *dsc)
8093{
8094 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
8095 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
8096 int err = 0;
8097
8098 /* 16-bit thumb instructions. */
8099 switch (op_bit_12_15)
8100 {
8101 /* Shift (imme), add, subtract, move and compare. */
8102 case 0: case 1: case 2: case 3:
8103 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8104 "shift/add/sub/mov/cmp",
8105 dsc);
8106 break;
8107 case 4:
8108 switch (op_bit_10_11)
8109 {
8110 case 0: /* Data-processing */
8111 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8112 "data-processing",
8113 dsc);
8114 break;
8115 case 1: /* Special data instructions and branch and exchange. */
8116 {
8117 unsigned short op = bits (insn1, 7, 9);
8118 if (op == 6 || op == 7) /* BX or BLX */
8119 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
8120 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
8121 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
8122 else
8123 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
8124 dsc);
8125 }
8126 break;
8127 default: /* LDR (literal) */
8128 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
8129 }
8130 break;
8131 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
8132 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
8133 break;
8134 case 10:
8135 if (op_bit_10_11 < 2) /* Generate PC-relative address */
8136 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
8137 else /* Generate SP-relative address */
8138 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
8139 break;
8140 case 11: /* Misc 16-bit instructions */
8141 {
8142 switch (bits (insn1, 8, 11))
8143 {
8144 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
8145 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
8146 break;
8147 case 12: case 13: /* POP */
8148 if (bit (insn1, 8)) /* PC is in register list. */
8149 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
8150 else
8151 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
8152 break;
8153 case 15: /* If-Then, and hints */
8154 if (bits (insn1, 0, 3))
8155 /* If-Then makes up to four following instructions conditional.
8156 IT instruction itself is not conditional, so handle it as a
8157 common unmodified instruction. */
8158 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
8159 dsc);
8160 else
8161 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
8162 break;
8163 default:
8164 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
8165 }
8166 }
8167 break;
8168 case 12:
8169 if (op_bit_10_11 < 2) /* Store multiple registers */
8170 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
8171 else /* Load multiple registers */
8172 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
8173 break;
8174 case 13: /* Conditional branch and supervisor call */
8175 if (bits (insn1, 9, 11) != 7) /* conditional branch */
8176 err = thumb_copy_b (gdbarch, insn1, dsc);
8177 else
8178 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
8179 break;
8180 case 14: /* Unconditional branch */
8181 err = thumb_copy_b (gdbarch, insn1, dsc);
8182 break;
8183 default:
8184 err = 1;
8185 }
8186
8187 if (err)
8188 internal_error (__FILE__, __LINE__,
8189 _("thumb_process_displaced_16bit_insn: Instruction decode error"));
8190}
8191
8192static int
8193decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
8194 uint16_t insn1, uint16_t insn2,
8195 struct regcache *regs,
8196 struct displaced_step_closure *dsc)
8197{
8198 int rt = bits (insn2, 12, 15);
8199 int rn = bits (insn1, 0, 3);
8200 int op1 = bits (insn1, 7, 8);
8201 int err = 0;
8202
8203 switch (bits (insn1, 5, 6))
8204 {
8205 case 0: /* Load byte and memory hints */
8206 if (rt == 0xf) /* PLD/PLI */
8207 {
8208 if (rn == 0xf)
8209 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
8210 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
8211 else
8212 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8213 "pli/pld", dsc);
8214 }
8215 else
8216 {
8217 if (rn == 0xf) /* LDRB/LDRSB (literal) */
8218 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8219 1);
8220 else
8221 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8222 "ldrb{reg, immediate}/ldrbt",
8223 dsc);
8224 }
8225
8226 break;
8227 case 1: /* Load halfword and memory hints. */
8228 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
8229 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8230 "pld/unalloc memhint", dsc);
8231 else
8232 {
8233 if (rn == 0xf)
8234 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8235 2);
8236 else
8237 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8238 "ldrh/ldrht", dsc);
8239 }
8240 break;
8241 case 2: /* Load word */
8242 {
8243 int insn2_bit_8_11 = bits (insn2, 8, 11);
8244
8245 if (rn == 0xf)
8246 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
8247 else if (op1 == 0x1) /* Encoding T3 */
8248 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
8249 0, 1);
8250 else /* op1 == 0x0 */
8251 {
8252 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
8253 /* LDR (immediate) */
8254 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8255 dsc, bit (insn2, 8), 1);
8256 else if (insn2_bit_8_11 == 0xe) /* LDRT */
8257 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8258 "ldrt", dsc);
8259 else
8260 /* LDR (register) */
8261 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8262 dsc, 0, 0);
8263 }
8264 break;
8265 }
8266 default:
8267 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
8268 break;
8269 }
8270 return 0;
8271}
8272
8273static void
8274thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8275 uint16_t insn2, struct regcache *regs,
8276 struct displaced_step_closure *dsc)
8277{
8278 int err = 0;
8279 unsigned short op = bit (insn2, 15);
8280 unsigned int op1 = bits (insn1, 11, 12);
8281
8282 switch (op1)
8283 {
8284 case 1:
8285 {
8286 switch (bits (insn1, 9, 10))
8287 {
8288 case 0:
8289 if (bit (insn1, 6))
8290 {
8291 /* Load/store {dual, execlusive}, table branch. */
8292 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
8293 && bits (insn2, 5, 7) == 0)
8294 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
8295 dsc);
8296 else
8297 /* PC is not allowed to use in load/store {dual, exclusive}
8298 instructions. */
8299 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8300 "load/store dual/ex", dsc);
8301 }
8302 else /* load/store multiple */
8303 {
8304 switch (bits (insn1, 7, 8))
8305 {
8306 case 0: case 3: /* SRS, RFE */
8307 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8308 "srs/rfe", dsc);
8309 break;
8310 case 1: case 2: /* LDM/STM/PUSH/POP */
8311 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
8312 break;
8313 }
8314 }
8315 break;
8316
8317 case 1:
8318 /* Data-processing (shift register). */
8319 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
8320 dsc);
8321 break;
8322 default: /* Coprocessor instructions. */
8323 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8324 break;
8325 }
8326 break;
8327 }
8328 case 2: /* op1 = 2 */
8329 if (op) /* Branch and misc control. */
8330 {
8331 if (bit (insn2, 14) /* BLX/BL */
8332 || bit (insn2, 12) /* Unconditional branch */
8333 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
8334 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
8335 else
8336 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8337 "misc ctrl", dsc);
8338 }
8339 else
8340 {
8341 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
8342 {
8343 int op = bits (insn1, 4, 8);
8344 int rn = bits (insn1, 0, 3);
8345 if ((op == 0 || op == 0xa) && rn == 0xf)
8346 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
8347 regs, dsc);
8348 else
8349 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8350 "dp/pb", dsc);
8351 }
8352 else /* Data processing (modified immeidate) */
8353 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8354 "dp/mi", dsc);
8355 }
8356 break;
8357 case 3: /* op1 = 3 */
8358 switch (bits (insn1, 9, 10))
8359 {
8360 case 0:
8361 if (bit (insn1, 4))
8362 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
8363 regs, dsc);
8364 else /* NEON Load/Store and Store single data item */
8365 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8366 "neon elt/struct load/store",
8367 dsc);
8368 break;
8369 case 1: /* op1 = 3, bits (9, 10) == 1 */
8370 switch (bits (insn1, 7, 8))
8371 {
8372 case 0: case 1: /* Data processing (register) */
8373 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8374 "dp(reg)", dsc);
8375 break;
8376 case 2: /* Multiply and absolute difference */
8377 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8378 "mul/mua/diff", dsc);
8379 break;
8380 case 3: /* Long multiply and divide */
8381 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8382 "lmul/lmua", dsc);
8383 break;
8384 }
8385 break;
8386 default: /* Coprocessor instructions */
8387 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8388 break;
8389 }
8390 break;
8391 default:
8392 err = 1;
8393 }
8394
8395 if (err)
8396 internal_error (__FILE__, __LINE__,
8397 _("thumb_process_displaced_32bit_insn: Instruction decode error"));
8398
8399}
8400
b434a28f
YQ
8401static void
8402thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8403 CORE_ADDR to, struct regcache *regs,
8404 struct displaced_step_closure *dsc)
8405{
34518530
YQ
8406 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8407 uint16_t insn1
8408 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
8409
8410 if (debug_displaced)
8411 fprintf_unfiltered (gdb_stdlog, "displaced: process thumb insn %.4x "
8412 "at %.8lx\n", insn1, (unsigned long) from);
8413
8414 dsc->is_thumb = 1;
8415 dsc->insn_size = thumb_insn_size (insn1);
8416 if (thumb_insn_size (insn1) == 4)
8417 {
8418 uint16_t insn2
8419 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
8420 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
8421 }
8422 else
8423 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
b434a28f
YQ
8424}
8425
cca44b1b 8426void
b434a28f
YQ
8427arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8428 CORE_ADDR to, struct regcache *regs,
cca44b1b
JB
8429 struct displaced_step_closure *dsc)
8430{
8431 int err = 0;
b434a28f
YQ
8432 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8433 uint32_t insn;
cca44b1b
JB
8434
8435 /* Most displaced instructions use a 1-instruction scratch space, so set this
8436 here and override below if/when necessary. */
8437 dsc->numinsns = 1;
8438 dsc->insn_addr = from;
8439 dsc->scratch_base = to;
8440 dsc->cleanup = NULL;
8441 dsc->wrote_to_pc = 0;
8442
b434a28f
YQ
8443 if (!displaced_in_arm_mode (regs))
8444 return thumb_process_displaced_insn (gdbarch, from, to, regs, dsc);
8445
4db71c0b
YQ
8446 dsc->is_thumb = 0;
8447 dsc->insn_size = 4;
b434a28f
YQ
8448 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
8449 if (debug_displaced)
8450 fprintf_unfiltered (gdb_stdlog, "displaced: stepping insn %.8lx "
8451 "at %.8lx\n", (unsigned long) insn,
8452 (unsigned long) from);
8453
cca44b1b 8454 if ((insn & 0xf0000000) == 0xf0000000)
7ff120b4 8455 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
cca44b1b
JB
8456 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
8457 {
8458 case 0x0: case 0x1: case 0x2: case 0x3:
7ff120b4 8459 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
cca44b1b
JB
8460 break;
8461
8462 case 0x4: case 0x5: case 0x6:
7ff120b4 8463 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
cca44b1b
JB
8464 break;
8465
8466 case 0x7:
7ff120b4 8467 err = arm_decode_media (gdbarch, insn, dsc);
cca44b1b
JB
8468 break;
8469
8470 case 0x8: case 0x9: case 0xa: case 0xb:
7ff120b4 8471 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
cca44b1b
JB
8472 break;
8473
8474 case 0xc: case 0xd: case 0xe: case 0xf:
7ff120b4 8475 err = arm_decode_svc_copro (gdbarch, insn, to, regs, dsc);
cca44b1b
JB
8476 break;
8477 }
8478
8479 if (err)
8480 internal_error (__FILE__, __LINE__,
8481 _("arm_process_displaced_insn: Instruction decode error"));
8482}
8483
8484/* Actually set up the scratch space for a displaced instruction. */
8485
8486void
8487arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
8488 CORE_ADDR to, struct displaced_step_closure *dsc)
8489{
8490 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
4db71c0b 8491 unsigned int i, len, offset;
cca44b1b 8492 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4db71c0b
YQ
8493 int size = dsc->is_thumb? 2 : 4;
8494 const unsigned char *bkp_insn;
cca44b1b 8495
4db71c0b 8496 offset = 0;
cca44b1b
JB
8497 /* Poke modified instruction(s). */
8498 for (i = 0; i < dsc->numinsns; i++)
8499 {
8500 if (debug_displaced)
4db71c0b
YQ
8501 {
8502 fprintf_unfiltered (gdb_stdlog, "displaced: writing insn ");
8503 if (size == 4)
8504 fprintf_unfiltered (gdb_stdlog, "%.8lx",
8505 dsc->modinsn[i]);
8506 else if (size == 2)
8507 fprintf_unfiltered (gdb_stdlog, "%.4x",
8508 (unsigned short)dsc->modinsn[i]);
8509
8510 fprintf_unfiltered (gdb_stdlog, " at %.8lx\n",
8511 (unsigned long) to + offset);
8512
8513 }
8514 write_memory_unsigned_integer (to + offset, size,
8515 byte_order_for_code,
cca44b1b 8516 dsc->modinsn[i]);
4db71c0b
YQ
8517 offset += size;
8518 }
8519
8520 /* Choose the correct breakpoint instruction. */
8521 if (dsc->is_thumb)
8522 {
8523 bkp_insn = tdep->thumb_breakpoint;
8524 len = tdep->thumb_breakpoint_size;
8525 }
8526 else
8527 {
8528 bkp_insn = tdep->arm_breakpoint;
8529 len = tdep->arm_breakpoint_size;
cca44b1b
JB
8530 }
8531
8532 /* Put breakpoint afterwards. */
4db71c0b 8533 write_memory (to + offset, bkp_insn, len);
cca44b1b
JB
8534
8535 if (debug_displaced)
8536 fprintf_unfiltered (gdb_stdlog, "displaced: copy %s->%s: ",
8537 paddress (gdbarch, from), paddress (gdbarch, to));
8538}
8539
8540/* Entry point for copying an instruction into scratch space for displaced
8541 stepping. */
8542
8543struct displaced_step_closure *
8544arm_displaced_step_copy_insn (struct gdbarch *gdbarch,
8545 CORE_ADDR from, CORE_ADDR to,
8546 struct regcache *regs)
8547{
8548 struct displaced_step_closure *dsc
8549 = xmalloc (sizeof (struct displaced_step_closure));
b434a28f 8550 arm_process_displaced_insn (gdbarch, from, to, regs, dsc);
cca44b1b
JB
8551 arm_displaced_init_closure (gdbarch, from, to, dsc);
8552
8553 return dsc;
8554}
8555
8556/* Entry point for cleaning things up after a displaced instruction has been
8557 single-stepped. */
8558
8559void
8560arm_displaced_step_fixup (struct gdbarch *gdbarch,
8561 struct displaced_step_closure *dsc,
8562 CORE_ADDR from, CORE_ADDR to,
8563 struct regcache *regs)
8564{
8565 if (dsc->cleanup)
8566 dsc->cleanup (gdbarch, regs, dsc);
8567
8568 if (!dsc->wrote_to_pc)
4db71c0b
YQ
8569 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
8570 dsc->insn_addr + dsc->insn_size);
8571
cca44b1b
JB
8572}
8573
8574#include "bfd-in2.h"
8575#include "libcoff.h"
8576
8577static int
8578gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
8579{
9779414d
DJ
8580 struct gdbarch *gdbarch = info->application_data;
8581
8582 if (arm_pc_is_thumb (gdbarch, memaddr))
cca44b1b
JB
8583 {
8584 static asymbol *asym;
8585 static combined_entry_type ce;
8586 static struct coff_symbol_struct csym;
8587 static struct bfd fake_bfd;
8588 static bfd_target fake_target;
8589
8590 if (csym.native == NULL)
8591 {
8592 /* Create a fake symbol vector containing a Thumb symbol.
8593 This is solely so that the code in print_insn_little_arm()
8594 and print_insn_big_arm() in opcodes/arm-dis.c will detect
8595 the presence of a Thumb symbol and switch to decoding
8596 Thumb instructions. */
8597
8598 fake_target.flavour = bfd_target_coff_flavour;
8599 fake_bfd.xvec = &fake_target;
8600 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
8601 csym.native = &ce;
8602 csym.symbol.the_bfd = &fake_bfd;
8603 csym.symbol.name = "fake";
8604 asym = (asymbol *) & csym;
8605 }
8606
8607 memaddr = UNMAKE_THUMB_ADDR (memaddr);
8608 info->symbols = &asym;
8609 }
8610 else
8611 info->symbols = NULL;
8612
8613 if (info->endian == BFD_ENDIAN_BIG)
8614 return print_insn_big_arm (memaddr, info);
8615 else
8616 return print_insn_little_arm (memaddr, info);
8617}
8618
8619/* The following define instruction sequences that will cause ARM
8620 cpu's to take an undefined instruction trap. These are used to
8621 signal a breakpoint to GDB.
8622
8623 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
8624 modes. A different instruction is required for each mode. The ARM
8625 cpu's can also be big or little endian. Thus four different
8626 instructions are needed to support all cases.
8627
8628 Note: ARMv4 defines several new instructions that will take the
8629 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
8630 not in fact add the new instructions. The new undefined
8631 instructions in ARMv4 are all instructions that had no defined
8632 behaviour in earlier chips. There is no guarantee that they will
8633 raise an exception, but may be treated as NOP's. In practice, it
8634 may only safe to rely on instructions matching:
8635
8636 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
8637 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
8638 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
8639
0963b4bd 8640 Even this may only true if the condition predicate is true. The
cca44b1b
JB
8641 following use a condition predicate of ALWAYS so it is always TRUE.
8642
8643 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
8644 and NetBSD all use a software interrupt rather than an undefined
8645 instruction to force a trap. This can be handled by by the
8646 abi-specific code during establishment of the gdbarch vector. */
8647
8648#define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
8649#define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
8650#define THUMB_LE_BREAKPOINT {0xbe,0xbe}
8651#define THUMB_BE_BREAKPOINT {0xbe,0xbe}
8652
8653static const char arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
8654static const char arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
8655static const char arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
8656static const char arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
8657
8658/* Determine the type and size of breakpoint to insert at PCPTR. Uses
8659 the program counter value to determine whether a 16-bit or 32-bit
8660 breakpoint should be used. It returns a pointer to a string of
8661 bytes that encode a breakpoint instruction, stores the length of
8662 the string to *lenptr, and adjusts the program counter (if
8663 necessary) to point to the actual memory location where the
8664 breakpoint should be inserted. */
8665
8666static const unsigned char *
8667arm_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr, int *lenptr)
8668{
8669 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
177321bd 8670 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
cca44b1b 8671
9779414d 8672 if (arm_pc_is_thumb (gdbarch, *pcptr))
cca44b1b
JB
8673 {
8674 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
177321bd
DJ
8675
8676 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
8677 check whether we are replacing a 32-bit instruction. */
8678 if (tdep->thumb2_breakpoint != NULL)
8679 {
8680 gdb_byte buf[2];
8681 if (target_read_memory (*pcptr, buf, 2) == 0)
8682 {
8683 unsigned short inst1;
8684 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
db24da6d 8685 if (thumb_insn_size (inst1) == 4)
177321bd
DJ
8686 {
8687 *lenptr = tdep->thumb2_breakpoint_size;
8688 return tdep->thumb2_breakpoint;
8689 }
8690 }
8691 }
8692
cca44b1b
JB
8693 *lenptr = tdep->thumb_breakpoint_size;
8694 return tdep->thumb_breakpoint;
8695 }
8696 else
8697 {
8698 *lenptr = tdep->arm_breakpoint_size;
8699 return tdep->arm_breakpoint;
8700 }
8701}
8702
177321bd
DJ
8703static void
8704arm_remote_breakpoint_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr,
8705 int *kindptr)
8706{
177321bd
DJ
8707 arm_breakpoint_from_pc (gdbarch, pcptr, kindptr);
8708
9779414d 8709 if (arm_pc_is_thumb (gdbarch, *pcptr) && *kindptr == 4)
177321bd
DJ
8710 /* The documented magic value for a 32-bit Thumb-2 breakpoint, so
8711 that this is not confused with a 32-bit ARM breakpoint. */
8712 *kindptr = 3;
8713}
8714
cca44b1b
JB
8715/* Extract from an array REGBUF containing the (raw) register state a
8716 function return value of type TYPE, and copy that, in virtual
8717 format, into VALBUF. */
8718
8719static void
8720arm_extract_return_value (struct type *type, struct regcache *regs,
8721 gdb_byte *valbuf)
8722{
8723 struct gdbarch *gdbarch = get_regcache_arch (regs);
8724 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8725
8726 if (TYPE_CODE_FLT == TYPE_CODE (type))
8727 {
8728 switch (gdbarch_tdep (gdbarch)->fp_model)
8729 {
8730 case ARM_FLOAT_FPA:
8731 {
8732 /* The value is in register F0 in internal format. We need to
8733 extract the raw value and then convert it to the desired
8734 internal type. */
8735 bfd_byte tmpbuf[FP_REGISTER_SIZE];
8736
8737 regcache_cooked_read (regs, ARM_F0_REGNUM, tmpbuf);
8738 convert_from_extended (floatformat_from_type (type), tmpbuf,
8739 valbuf, gdbarch_byte_order (gdbarch));
8740 }
8741 break;
8742
8743 case ARM_FLOAT_SOFT_FPA:
8744 case ARM_FLOAT_SOFT_VFP:
8745 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8746 not using the VFP ABI code. */
8747 case ARM_FLOAT_VFP:
8748 regcache_cooked_read (regs, ARM_A1_REGNUM, valbuf);
8749 if (TYPE_LENGTH (type) > 4)
8750 regcache_cooked_read (regs, ARM_A1_REGNUM + 1,
8751 valbuf + INT_REGISTER_SIZE);
8752 break;
8753
8754 default:
0963b4bd
MS
8755 internal_error (__FILE__, __LINE__,
8756 _("arm_extract_return_value: "
8757 "Floating point model not supported"));
cca44b1b
JB
8758 break;
8759 }
8760 }
8761 else if (TYPE_CODE (type) == TYPE_CODE_INT
8762 || TYPE_CODE (type) == TYPE_CODE_CHAR
8763 || TYPE_CODE (type) == TYPE_CODE_BOOL
8764 || TYPE_CODE (type) == TYPE_CODE_PTR
8765 || TYPE_CODE (type) == TYPE_CODE_REF
8766 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8767 {
b021a221
MS
8768 /* If the type is a plain integer, then the access is
8769 straight-forward. Otherwise we have to play around a bit
8770 more. */
cca44b1b
JB
8771 int len = TYPE_LENGTH (type);
8772 int regno = ARM_A1_REGNUM;
8773 ULONGEST tmp;
8774
8775 while (len > 0)
8776 {
8777 /* By using store_unsigned_integer we avoid having to do
8778 anything special for small big-endian values. */
8779 regcache_cooked_read_unsigned (regs, regno++, &tmp);
8780 store_unsigned_integer (valbuf,
8781 (len > INT_REGISTER_SIZE
8782 ? INT_REGISTER_SIZE : len),
8783 byte_order, tmp);
8784 len -= INT_REGISTER_SIZE;
8785 valbuf += INT_REGISTER_SIZE;
8786 }
8787 }
8788 else
8789 {
8790 /* For a structure or union the behaviour is as if the value had
8791 been stored to word-aligned memory and then loaded into
8792 registers with 32-bit load instruction(s). */
8793 int len = TYPE_LENGTH (type);
8794 int regno = ARM_A1_REGNUM;
8795 bfd_byte tmpbuf[INT_REGISTER_SIZE];
8796
8797 while (len > 0)
8798 {
8799 regcache_cooked_read (regs, regno++, tmpbuf);
8800 memcpy (valbuf, tmpbuf,
8801 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
8802 len -= INT_REGISTER_SIZE;
8803 valbuf += INT_REGISTER_SIZE;
8804 }
8805 }
8806}
8807
8808
8809/* Will a function return an aggregate type in memory or in a
8810 register? Return 0 if an aggregate type can be returned in a
8811 register, 1 if it must be returned in memory. */
8812
8813static int
8814arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
8815{
8816 int nRc;
8817 enum type_code code;
8818
8819 CHECK_TYPEDEF (type);
8820
8821 /* In the ARM ABI, "integer" like aggregate types are returned in
8822 registers. For an aggregate type to be integer like, its size
8823 must be less than or equal to INT_REGISTER_SIZE and the
8824 offset of each addressable subfield must be zero. Note that bit
8825 fields are not addressable, and all addressable subfields of
8826 unions always start at offset zero.
8827
8828 This function is based on the behaviour of GCC 2.95.1.
8829 See: gcc/arm.c: arm_return_in_memory() for details.
8830
8831 Note: All versions of GCC before GCC 2.95.2 do not set up the
8832 parameters correctly for a function returning the following
8833 structure: struct { float f;}; This should be returned in memory,
8834 not a register. Richard Earnshaw sent me a patch, but I do not
8835 know of any way to detect if a function like the above has been
8836 compiled with the correct calling convention. */
8837
8838 /* All aggregate types that won't fit in a register must be returned
8839 in memory. */
8840 if (TYPE_LENGTH (type) > INT_REGISTER_SIZE)
8841 {
8842 return 1;
8843 }
8844
8845 /* The AAPCS says all aggregates not larger than a word are returned
8846 in a register. */
8847 if (gdbarch_tdep (gdbarch)->arm_abi != ARM_ABI_APCS)
8848 return 0;
8849
8850 /* The only aggregate types that can be returned in a register are
8851 structs and unions. Arrays must be returned in memory. */
8852 code = TYPE_CODE (type);
8853 if ((TYPE_CODE_STRUCT != code) && (TYPE_CODE_UNION != code))
8854 {
8855 return 1;
8856 }
8857
8858 /* Assume all other aggregate types can be returned in a register.
8859 Run a check for structures, unions and arrays. */
8860 nRc = 0;
8861
8862 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
8863 {
8864 int i;
8865 /* Need to check if this struct/union is "integer" like. For
8866 this to be true, its size must be less than or equal to
8867 INT_REGISTER_SIZE and the offset of each addressable
8868 subfield must be zero. Note that bit fields are not
8869 addressable, and unions always start at offset zero. If any
8870 of the subfields is a floating point type, the struct/union
8871 cannot be an integer type. */
8872
8873 /* For each field in the object, check:
8874 1) Is it FP? --> yes, nRc = 1;
67255d04
RE
8875 2) Is it addressable (bitpos != 0) and
8876 not packed (bitsize == 0)?
8877 --> yes, nRc = 1
8878 */
8879
8880 for (i = 0; i < TYPE_NFIELDS (type); i++)
8881 {
8882 enum type_code field_type_code;
0963b4bd
MS
8883 field_type_code = TYPE_CODE (check_typedef (TYPE_FIELD_TYPE (type,
8884 i)));
67255d04
RE
8885
8886 /* Is it a floating point type field? */
8887 if (field_type_code == TYPE_CODE_FLT)
8888 {
8889 nRc = 1;
8890 break;
8891 }
8892
8893 /* If bitpos != 0, then we have to care about it. */
8894 if (TYPE_FIELD_BITPOS (type, i) != 0)
8895 {
8896 /* Bitfields are not addressable. If the field bitsize is
8897 zero, then the field is not packed. Hence it cannot be
8898 a bitfield or any other packed type. */
8899 if (TYPE_FIELD_BITSIZE (type, i) == 0)
8900 {
8901 nRc = 1;
8902 break;
8903 }
8904 }
8905 }
8906 }
8907
8908 return nRc;
8909}
8910
34e8f22d
RE
8911/* Write into appropriate registers a function return value of type
8912 TYPE, given in virtual format. */
8913
8914static void
b508a996 8915arm_store_return_value (struct type *type, struct regcache *regs,
5238cf52 8916 const gdb_byte *valbuf)
34e8f22d 8917{
be8626e0 8918 struct gdbarch *gdbarch = get_regcache_arch (regs);
e17a4113 8919 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
be8626e0 8920
34e8f22d
RE
8921 if (TYPE_CODE (type) == TYPE_CODE_FLT)
8922 {
7a5ea0d4 8923 char buf[MAX_REGISTER_SIZE];
34e8f22d 8924
be8626e0 8925 switch (gdbarch_tdep (gdbarch)->fp_model)
08216dd7
RE
8926 {
8927 case ARM_FLOAT_FPA:
8928
be8626e0
MD
8929 convert_to_extended (floatformat_from_type (type), buf, valbuf,
8930 gdbarch_byte_order (gdbarch));
b508a996 8931 regcache_cooked_write (regs, ARM_F0_REGNUM, buf);
08216dd7
RE
8932 break;
8933
fd50bc42 8934 case ARM_FLOAT_SOFT_FPA:
08216dd7 8935 case ARM_FLOAT_SOFT_VFP:
90445bd3
DJ
8936 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8937 not using the VFP ABI code. */
8938 case ARM_FLOAT_VFP:
b508a996
RE
8939 regcache_cooked_write (regs, ARM_A1_REGNUM, valbuf);
8940 if (TYPE_LENGTH (type) > 4)
8941 regcache_cooked_write (regs, ARM_A1_REGNUM + 1,
7a5ea0d4 8942 valbuf + INT_REGISTER_SIZE);
08216dd7
RE
8943 break;
8944
8945 default:
9b20d036
MS
8946 internal_error (__FILE__, __LINE__,
8947 _("arm_store_return_value: Floating "
8948 "point model not supported"));
08216dd7
RE
8949 break;
8950 }
34e8f22d 8951 }
b508a996
RE
8952 else if (TYPE_CODE (type) == TYPE_CODE_INT
8953 || TYPE_CODE (type) == TYPE_CODE_CHAR
8954 || TYPE_CODE (type) == TYPE_CODE_BOOL
8955 || TYPE_CODE (type) == TYPE_CODE_PTR
8956 || TYPE_CODE (type) == TYPE_CODE_REF
8957 || TYPE_CODE (type) == TYPE_CODE_ENUM)
8958 {
8959 if (TYPE_LENGTH (type) <= 4)
8960 {
8961 /* Values of one word or less are zero/sign-extended and
8962 returned in r0. */
7a5ea0d4 8963 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8964 LONGEST val = unpack_long (type, valbuf);
8965
e17a4113 8966 store_signed_integer (tmpbuf, INT_REGISTER_SIZE, byte_order, val);
b508a996
RE
8967 regcache_cooked_write (regs, ARM_A1_REGNUM, tmpbuf);
8968 }
8969 else
8970 {
8971 /* Integral values greater than one word are stored in consecutive
8972 registers starting with r0. This will always be a multiple of
8973 the regiser size. */
8974 int len = TYPE_LENGTH (type);
8975 int regno = ARM_A1_REGNUM;
8976
8977 while (len > 0)
8978 {
8979 regcache_cooked_write (regs, regno++, valbuf);
7a5ea0d4
DJ
8980 len -= INT_REGISTER_SIZE;
8981 valbuf += INT_REGISTER_SIZE;
b508a996
RE
8982 }
8983 }
8984 }
34e8f22d 8985 else
b508a996
RE
8986 {
8987 /* For a structure or union the behaviour is as if the value had
8988 been stored to word-aligned memory and then loaded into
8989 registers with 32-bit load instruction(s). */
8990 int len = TYPE_LENGTH (type);
8991 int regno = ARM_A1_REGNUM;
7a5ea0d4 8992 bfd_byte tmpbuf[INT_REGISTER_SIZE];
b508a996
RE
8993
8994 while (len > 0)
8995 {
8996 memcpy (tmpbuf, valbuf,
7a5ea0d4 8997 len > INT_REGISTER_SIZE ? INT_REGISTER_SIZE : len);
b508a996 8998 regcache_cooked_write (regs, regno++, tmpbuf);
7a5ea0d4
DJ
8999 len -= INT_REGISTER_SIZE;
9000 valbuf += INT_REGISTER_SIZE;
b508a996
RE
9001 }
9002 }
34e8f22d
RE
9003}
9004
2af48f68
PB
9005
9006/* Handle function return values. */
9007
9008static enum return_value_convention
6a3a010b 9009arm_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
9010 struct type *valtype, struct regcache *regcache,
9011 gdb_byte *readbuf, const gdb_byte *writebuf)
2af48f68 9012{
7c00367c 9013 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
6a3a010b 9014 struct type *func_type = function ? value_type (function) : NULL;
90445bd3
DJ
9015 enum arm_vfp_cprc_base_type vfp_base_type;
9016 int vfp_base_count;
9017
9018 if (arm_vfp_abi_for_function (gdbarch, func_type)
9019 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
9020 {
9021 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
9022 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
9023 int i;
9024 for (i = 0; i < vfp_base_count; i++)
9025 {
58d6951d
DJ
9026 if (reg_char == 'q')
9027 {
9028 if (writebuf)
9029 arm_neon_quad_write (gdbarch, regcache, i,
9030 writebuf + i * unit_length);
9031
9032 if (readbuf)
9033 arm_neon_quad_read (gdbarch, regcache, i,
9034 readbuf + i * unit_length);
9035 }
9036 else
9037 {
9038 char name_buf[4];
9039 int regnum;
9040
9041 sprintf (name_buf, "%c%d", reg_char, i);
9042 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9043 strlen (name_buf));
9044 if (writebuf)
9045 regcache_cooked_write (regcache, regnum,
9046 writebuf + i * unit_length);
9047 if (readbuf)
9048 regcache_cooked_read (regcache, regnum,
9049 readbuf + i * unit_length);
9050 }
90445bd3
DJ
9051 }
9052 return RETURN_VALUE_REGISTER_CONVENTION;
9053 }
7c00367c 9054
2af48f68
PB
9055 if (TYPE_CODE (valtype) == TYPE_CODE_STRUCT
9056 || TYPE_CODE (valtype) == TYPE_CODE_UNION
9057 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
9058 {
7c00367c
MK
9059 if (tdep->struct_return == pcc_struct_return
9060 || arm_return_in_memory (gdbarch, valtype))
2af48f68
PB
9061 return RETURN_VALUE_STRUCT_CONVENTION;
9062 }
9063
7052e42c
UW
9064 /* AAPCS returns complex types longer than a register in memory. */
9065 if (tdep->arm_abi != ARM_ABI_APCS
9066 && TYPE_CODE (valtype) == TYPE_CODE_COMPLEX
9067 && TYPE_LENGTH (valtype) > INT_REGISTER_SIZE)
9068 return RETURN_VALUE_STRUCT_CONVENTION;
9069
2af48f68
PB
9070 if (writebuf)
9071 arm_store_return_value (valtype, regcache, writebuf);
9072
9073 if (readbuf)
9074 arm_extract_return_value (valtype, regcache, readbuf);
9075
9076 return RETURN_VALUE_REGISTER_CONVENTION;
9077}
9078
9079
9df628e0 9080static int
60ade65d 9081arm_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
9df628e0 9082{
e17a4113
UW
9083 struct gdbarch *gdbarch = get_frame_arch (frame);
9084 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
9085 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9df628e0 9086 CORE_ADDR jb_addr;
7a5ea0d4 9087 char buf[INT_REGISTER_SIZE];
9df628e0 9088
60ade65d 9089 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9df628e0
RE
9090
9091 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
7a5ea0d4 9092 INT_REGISTER_SIZE))
9df628e0
RE
9093 return 0;
9094
e17a4113 9095 *pc = extract_unsigned_integer (buf, INT_REGISTER_SIZE, byte_order);
9df628e0
RE
9096 return 1;
9097}
9098
faa95490
DJ
9099/* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
9100 return the target PC. Otherwise return 0. */
c906108c
SS
9101
9102CORE_ADDR
52f729a7 9103arm_skip_stub (struct frame_info *frame, CORE_ADDR pc)
c906108c 9104{
2c02bd72 9105 const char *name;
faa95490 9106 int namelen;
c906108c
SS
9107 CORE_ADDR start_addr;
9108
9109 /* Find the starting address and name of the function containing the PC. */
9110 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
9111 return 0;
9112
faa95490
DJ
9113 /* If PC is in a Thumb call or return stub, return the address of the
9114 target PC, which is in a register. The thunk functions are called
9115 _call_via_xx, where x is the register name. The possible names
3d8d5e79
DJ
9116 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
9117 functions, named __ARM_call_via_r[0-7]. */
9118 if (strncmp (name, "_call_via_", 10) == 0
9119 || strncmp (name, "__ARM_call_via_", strlen ("__ARM_call_via_")) == 0)
c906108c 9120 {
ed9a39eb
JM
9121 /* Use the name suffix to determine which register contains the
9122 target PC. */
c5aa993b
JM
9123 static char *table[15] =
9124 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9125 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
9126 };
c906108c 9127 int regno;
faa95490 9128 int offset = strlen (name) - 2;
c906108c
SS
9129
9130 for (regno = 0; regno <= 14; regno++)
faa95490 9131 if (strcmp (&name[offset], table[regno]) == 0)
52f729a7 9132 return get_frame_register_unsigned (frame, regno);
c906108c 9133 }
ed9a39eb 9134
faa95490
DJ
9135 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
9136 non-interworking calls to foo. We could decode the stubs
9137 to find the target but it's easier to use the symbol table. */
9138 namelen = strlen (name);
9139 if (name[0] == '_' && name[1] == '_'
9140 && ((namelen > 2 + strlen ("_from_thumb")
9141 && strncmp (name + namelen - strlen ("_from_thumb"), "_from_thumb",
9142 strlen ("_from_thumb")) == 0)
9143 || (namelen > 2 + strlen ("_from_arm")
9144 && strncmp (name + namelen - strlen ("_from_arm"), "_from_arm",
9145 strlen ("_from_arm")) == 0)))
9146 {
9147 char *target_name;
9148 int target_len = namelen - 2;
9149 struct minimal_symbol *minsym;
9150 struct objfile *objfile;
9151 struct obj_section *sec;
9152
9153 if (name[namelen - 1] == 'b')
9154 target_len -= strlen ("_from_thumb");
9155 else
9156 target_len -= strlen ("_from_arm");
9157
9158 target_name = alloca (target_len + 1);
9159 memcpy (target_name, name + 2, target_len);
9160 target_name[target_len] = '\0';
9161
9162 sec = find_pc_section (pc);
9163 objfile = (sec == NULL) ? NULL : sec->objfile;
9164 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
9165 if (minsym != NULL)
9166 return SYMBOL_VALUE_ADDRESS (minsym);
9167 else
9168 return 0;
9169 }
9170
c5aa993b 9171 return 0; /* not a stub */
c906108c
SS
9172}
9173
afd7eef0
RE
9174static void
9175set_arm_command (char *args, int from_tty)
9176{
edefbb7c
AC
9177 printf_unfiltered (_("\
9178\"set arm\" must be followed by an apporpriate subcommand.\n"));
afd7eef0
RE
9179 help_list (setarmcmdlist, "set arm ", all_commands, gdb_stdout);
9180}
9181
9182static void
9183show_arm_command (char *args, int from_tty)
9184{
26304000 9185 cmd_show_list (showarmcmdlist, from_tty, "");
afd7eef0
RE
9186}
9187
28e97307
DJ
9188static void
9189arm_update_current_architecture (void)
fd50bc42 9190{
28e97307 9191 struct gdbarch_info info;
fd50bc42 9192
28e97307 9193 /* If the current architecture is not ARM, we have nothing to do. */
1cf3db46 9194 if (gdbarch_bfd_arch_info (target_gdbarch)->arch != bfd_arch_arm)
28e97307 9195 return;
fd50bc42 9196
28e97307
DJ
9197 /* Update the architecture. */
9198 gdbarch_info_init (&info);
fd50bc42 9199
28e97307 9200 if (!gdbarch_update_p (info))
9b20d036 9201 internal_error (__FILE__, __LINE__, _("could not update architecture"));
fd50bc42
RE
9202}
9203
9204static void
9205set_fp_model_sfunc (char *args, int from_tty,
9206 struct cmd_list_element *c)
9207{
9208 enum arm_float_model fp_model;
9209
9210 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
9211 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
9212 {
9213 arm_fp_model = fp_model;
9214 break;
9215 }
9216
9217 if (fp_model == ARM_FLOAT_LAST)
edefbb7c 9218 internal_error (__FILE__, __LINE__, _("Invalid fp model accepted: %s."),
fd50bc42
RE
9219 current_fp_model);
9220
28e97307 9221 arm_update_current_architecture ();
fd50bc42
RE
9222}
9223
9224static void
08546159
AC
9225show_fp_model (struct ui_file *file, int from_tty,
9226 struct cmd_list_element *c, const char *value)
fd50bc42 9227{
1cf3db46 9228 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch);
fd50bc42 9229
28e97307 9230 if (arm_fp_model == ARM_FLOAT_AUTO
1cf3db46 9231 && gdbarch_bfd_arch_info (target_gdbarch)->arch == bfd_arch_arm)
28e97307
DJ
9232 fprintf_filtered (file, _("\
9233The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
9234 fp_model_strings[tdep->fp_model]);
9235 else
9236 fprintf_filtered (file, _("\
9237The current ARM floating point model is \"%s\".\n"),
9238 fp_model_strings[arm_fp_model]);
9239}
9240
9241static void
9242arm_set_abi (char *args, int from_tty,
9243 struct cmd_list_element *c)
9244{
9245 enum arm_abi_kind arm_abi;
9246
9247 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
9248 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
9249 {
9250 arm_abi_global = arm_abi;
9251 break;
9252 }
9253
9254 if (arm_abi == ARM_ABI_LAST)
9255 internal_error (__FILE__, __LINE__, _("Invalid ABI accepted: %s."),
9256 arm_abi_string);
9257
9258 arm_update_current_architecture ();
9259}
9260
9261static void
9262arm_show_abi (struct ui_file *file, int from_tty,
9263 struct cmd_list_element *c, const char *value)
9264{
1cf3db46 9265 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch);
28e97307
DJ
9266
9267 if (arm_abi_global == ARM_ABI_AUTO
1cf3db46 9268 && gdbarch_bfd_arch_info (target_gdbarch)->arch == bfd_arch_arm)
28e97307
DJ
9269 fprintf_filtered (file, _("\
9270The current ARM ABI is \"auto\" (currently \"%s\").\n"),
9271 arm_abi_strings[tdep->arm_abi]);
9272 else
9273 fprintf_filtered (file, _("The current ARM ABI is \"%s\".\n"),
9274 arm_abi_string);
fd50bc42
RE
9275}
9276
0428b8f5
DJ
9277static void
9278arm_show_fallback_mode (struct ui_file *file, int from_tty,
9279 struct cmd_list_element *c, const char *value)
9280{
0963b4bd
MS
9281 fprintf_filtered (file,
9282 _("The current execution mode assumed "
9283 "(when symbols are unavailable) is \"%s\".\n"),
0428b8f5
DJ
9284 arm_fallback_mode_string);
9285}
9286
9287static void
9288arm_show_force_mode (struct ui_file *file, int from_tty,
9289 struct cmd_list_element *c, const char *value)
9290{
1cf3db46 9291 struct gdbarch_tdep *tdep = gdbarch_tdep (target_gdbarch);
0428b8f5 9292
0963b4bd
MS
9293 fprintf_filtered (file,
9294 _("The current execution mode assumed "
9295 "(even when symbols are available) is \"%s\".\n"),
0428b8f5
DJ
9296 arm_force_mode_string);
9297}
9298
afd7eef0
RE
9299/* If the user changes the register disassembly style used for info
9300 register and other commands, we have to also switch the style used
9301 in opcodes for disassembly output. This function is run in the "set
9302 arm disassembly" command, and does that. */
bc90b915
FN
9303
9304static void
afd7eef0 9305set_disassembly_style_sfunc (char *args, int from_tty,
bc90b915
FN
9306 struct cmd_list_element *c)
9307{
afd7eef0 9308 set_disassembly_style ();
bc90b915
FN
9309}
9310\f
966fbf70 9311/* Return the ARM register name corresponding to register I. */
a208b0cb 9312static const char *
d93859e2 9313arm_register_name (struct gdbarch *gdbarch, int i)
966fbf70 9314{
58d6951d
DJ
9315 const int num_regs = gdbarch_num_regs (gdbarch);
9316
9317 if (gdbarch_tdep (gdbarch)->have_vfp_pseudos
9318 && i >= num_regs && i < num_regs + 32)
9319 {
9320 static const char *const vfp_pseudo_names[] = {
9321 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
9322 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
9323 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
9324 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
9325 };
9326
9327 return vfp_pseudo_names[i - num_regs];
9328 }
9329
9330 if (gdbarch_tdep (gdbarch)->have_neon_pseudos
9331 && i >= num_regs + 32 && i < num_regs + 32 + 16)
9332 {
9333 static const char *const neon_pseudo_names[] = {
9334 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
9335 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
9336 };
9337
9338 return neon_pseudo_names[i - num_regs - 32];
9339 }
9340
ff6f572f
DJ
9341 if (i >= ARRAY_SIZE (arm_register_names))
9342 /* These registers are only supported on targets which supply
9343 an XML description. */
9344 return "";
9345
966fbf70
RE
9346 return arm_register_names[i];
9347}
9348
bc90b915 9349static void
afd7eef0 9350set_disassembly_style (void)
bc90b915 9351{
123dc839 9352 int current;
bc90b915 9353
123dc839
DJ
9354 /* Find the style that the user wants. */
9355 for (current = 0; current < num_disassembly_options; current++)
9356 if (disassembly_style == valid_disassembly_styles[current])
9357 break;
9358 gdb_assert (current < num_disassembly_options);
bc90b915 9359
94c30b78 9360 /* Synchronize the disassembler. */
bc90b915
FN
9361 set_arm_regname_option (current);
9362}
9363
082fc60d
RE
9364/* Test whether the coff symbol specific value corresponds to a Thumb
9365 function. */
9366
9367static int
9368coff_sym_is_thumb (int val)
9369{
f8bf5763
PM
9370 return (val == C_THUMBEXT
9371 || val == C_THUMBSTAT
9372 || val == C_THUMBEXTFUNC
9373 || val == C_THUMBSTATFUNC
9374 || val == C_THUMBLABEL);
082fc60d
RE
9375}
9376
9377/* arm_coff_make_msymbol_special()
9378 arm_elf_make_msymbol_special()
9379
9380 These functions test whether the COFF or ELF symbol corresponds to
9381 an address in thumb code, and set a "special" bit in a minimal
9382 symbol to indicate that it does. */
9383
34e8f22d 9384static void
082fc60d
RE
9385arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
9386{
467d42c4
UW
9387 if (ARM_SYM_BRANCH_TYPE (&((elf_symbol_type *)sym)->internal_elf_sym)
9388 == ST_BRANCH_TO_THUMB)
082fc60d
RE
9389 MSYMBOL_SET_SPECIAL (msym);
9390}
9391
34e8f22d 9392static void
082fc60d
RE
9393arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
9394{
9395 if (coff_sym_is_thumb (val))
9396 MSYMBOL_SET_SPECIAL (msym);
9397}
9398
60c5725c 9399static void
c1bd65d0 9400arm_objfile_data_free (struct objfile *objfile, void *arg)
60c5725c
DJ
9401{
9402 struct arm_per_objfile *data = arg;
9403 unsigned int i;
9404
9405 for (i = 0; i < objfile->obfd->section_count; i++)
9406 VEC_free (arm_mapping_symbol_s, data->section_maps[i]);
9407}
9408
9409static void
9410arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
9411 asymbol *sym)
9412{
9413 const char *name = bfd_asymbol_name (sym);
9414 struct arm_per_objfile *data;
9415 VEC(arm_mapping_symbol_s) **map_p;
9416 struct arm_mapping_symbol new_map_sym;
9417
9418 gdb_assert (name[0] == '$');
9419 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
9420 return;
9421
9422 data = objfile_data (objfile, arm_objfile_data_key);
9423 if (data == NULL)
9424 {
9425 data = OBSTACK_ZALLOC (&objfile->objfile_obstack,
9426 struct arm_per_objfile);
9427 set_objfile_data (objfile, arm_objfile_data_key, data);
9428 data->section_maps = OBSTACK_CALLOC (&objfile->objfile_obstack,
9429 objfile->obfd->section_count,
9430 VEC(arm_mapping_symbol_s) *);
9431 }
9432 map_p = &data->section_maps[bfd_get_section (sym)->index];
9433
9434 new_map_sym.value = sym->value;
9435 new_map_sym.type = name[1];
9436
9437 /* Assume that most mapping symbols appear in order of increasing
9438 value. If they were randomly distributed, it would be faster to
9439 always push here and then sort at first use. */
9440 if (!VEC_empty (arm_mapping_symbol_s, *map_p))
9441 {
9442 struct arm_mapping_symbol *prev_map_sym;
9443
9444 prev_map_sym = VEC_last (arm_mapping_symbol_s, *map_p);
9445 if (prev_map_sym->value >= sym->value)
9446 {
9447 unsigned int idx;
9448 idx = VEC_lower_bound (arm_mapping_symbol_s, *map_p, &new_map_sym,
9449 arm_compare_mapping_symbols);
9450 VEC_safe_insert (arm_mapping_symbol_s, *map_p, idx, &new_map_sym);
9451 return;
9452 }
9453 }
9454
9455 VEC_safe_push (arm_mapping_symbol_s, *map_p, &new_map_sym);
9456}
9457
756fe439 9458static void
61a1198a 9459arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
756fe439 9460{
9779414d 9461 struct gdbarch *gdbarch = get_regcache_arch (regcache);
61a1198a 9462 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
756fe439
DJ
9463
9464 /* If necessary, set the T bit. */
9465 if (arm_apcs_32)
9466 {
9779414d 9467 ULONGEST val, t_bit;
61a1198a 9468 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9779414d
DJ
9469 t_bit = arm_psr_thumb_bit (gdbarch);
9470 if (arm_pc_is_thumb (gdbarch, pc))
9471 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9472 val | t_bit);
756fe439 9473 else
61a1198a 9474 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779414d 9475 val & ~t_bit);
756fe439
DJ
9476 }
9477}
123dc839 9478
58d6951d
DJ
9479/* Read the contents of a NEON quad register, by reading from two
9480 double registers. This is used to implement the quad pseudo
9481 registers, and for argument passing in case the quad registers are
9482 missing; vectors are passed in quad registers when using the VFP
9483 ABI, even if a NEON unit is not present. REGNUM is the index of
9484 the quad register, in [0, 15]. */
9485
05d1431c 9486static enum register_status
58d6951d
DJ
9487arm_neon_quad_read (struct gdbarch *gdbarch, struct regcache *regcache,
9488 int regnum, gdb_byte *buf)
9489{
9490 char name_buf[4];
9491 gdb_byte reg_buf[8];
9492 int offset, double_regnum;
05d1431c 9493 enum register_status status;
58d6951d
DJ
9494
9495 sprintf (name_buf, "d%d", regnum << 1);
9496 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9497 strlen (name_buf));
9498
9499 /* d0 is always the least significant half of q0. */
9500 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9501 offset = 8;
9502 else
9503 offset = 0;
9504
05d1431c
PA
9505 status = regcache_raw_read (regcache, double_regnum, reg_buf);
9506 if (status != REG_VALID)
9507 return status;
58d6951d
DJ
9508 memcpy (buf + offset, reg_buf, 8);
9509
9510 offset = 8 - offset;
05d1431c
PA
9511 status = regcache_raw_read (regcache, double_regnum + 1, reg_buf);
9512 if (status != REG_VALID)
9513 return status;
58d6951d 9514 memcpy (buf + offset, reg_buf, 8);
05d1431c
PA
9515
9516 return REG_VALID;
58d6951d
DJ
9517}
9518
05d1431c 9519static enum register_status
58d6951d
DJ
9520arm_pseudo_read (struct gdbarch *gdbarch, struct regcache *regcache,
9521 int regnum, gdb_byte *buf)
9522{
9523 const int num_regs = gdbarch_num_regs (gdbarch);
9524 char name_buf[4];
9525 gdb_byte reg_buf[8];
9526 int offset, double_regnum;
9527
9528 gdb_assert (regnum >= num_regs);
9529 regnum -= num_regs;
9530
9531 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
9532 /* Quad-precision register. */
05d1431c 9533 return arm_neon_quad_read (gdbarch, regcache, regnum - 32, buf);
58d6951d
DJ
9534 else
9535 {
05d1431c
PA
9536 enum register_status status;
9537
58d6951d
DJ
9538 /* Single-precision register. */
9539 gdb_assert (regnum < 32);
9540
9541 /* s0 is always the least significant half of d0. */
9542 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9543 offset = (regnum & 1) ? 0 : 4;
9544 else
9545 offset = (regnum & 1) ? 4 : 0;
9546
9547 sprintf (name_buf, "d%d", regnum >> 1);
9548 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9549 strlen (name_buf));
9550
05d1431c
PA
9551 status = regcache_raw_read (regcache, double_regnum, reg_buf);
9552 if (status == REG_VALID)
9553 memcpy (buf, reg_buf + offset, 4);
9554 return status;
58d6951d
DJ
9555 }
9556}
9557
9558/* Store the contents of BUF to a NEON quad register, by writing to
9559 two double registers. This is used to implement the quad pseudo
9560 registers, and for argument passing in case the quad registers are
9561 missing; vectors are passed in quad registers when using the VFP
9562 ABI, even if a NEON unit is not present. REGNUM is the index
9563 of the quad register, in [0, 15]. */
9564
9565static void
9566arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
9567 int regnum, const gdb_byte *buf)
9568{
9569 char name_buf[4];
58d6951d
DJ
9570 int offset, double_regnum;
9571
9572 sprintf (name_buf, "d%d", regnum << 1);
9573 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9574 strlen (name_buf));
9575
9576 /* d0 is always the least significant half of q0. */
9577 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9578 offset = 8;
9579 else
9580 offset = 0;
9581
9582 regcache_raw_write (regcache, double_regnum, buf + offset);
9583 offset = 8 - offset;
9584 regcache_raw_write (regcache, double_regnum + 1, buf + offset);
9585}
9586
9587static void
9588arm_pseudo_write (struct gdbarch *gdbarch, struct regcache *regcache,
9589 int regnum, const gdb_byte *buf)
9590{
9591 const int num_regs = gdbarch_num_regs (gdbarch);
9592 char name_buf[4];
9593 gdb_byte reg_buf[8];
9594 int offset, double_regnum;
9595
9596 gdb_assert (regnum >= num_regs);
9597 regnum -= num_regs;
9598
9599 if (gdbarch_tdep (gdbarch)->have_neon_pseudos && regnum >= 32 && regnum < 48)
9600 /* Quad-precision register. */
9601 arm_neon_quad_write (gdbarch, regcache, regnum - 32, buf);
9602 else
9603 {
9604 /* Single-precision register. */
9605 gdb_assert (regnum < 32);
9606
9607 /* s0 is always the least significant half of d0. */
9608 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9609 offset = (regnum & 1) ? 0 : 4;
9610 else
9611 offset = (regnum & 1) ? 4 : 0;
9612
9613 sprintf (name_buf, "d%d", regnum >> 1);
9614 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9615 strlen (name_buf));
9616
9617 regcache_raw_read (regcache, double_regnum, reg_buf);
9618 memcpy (reg_buf + offset, buf, 4);
9619 regcache_raw_write (regcache, double_regnum, reg_buf);
9620 }
9621}
9622
123dc839
DJ
9623static struct value *
9624value_of_arm_user_reg (struct frame_info *frame, const void *baton)
9625{
9626 const int *reg_p = baton;
9627 return value_of_register (*reg_p, frame);
9628}
97e03143 9629\f
70f80edf
JT
9630static enum gdb_osabi
9631arm_elf_osabi_sniffer (bfd *abfd)
97e03143 9632{
2af48f68 9633 unsigned int elfosabi;
70f80edf 9634 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
97e03143 9635
70f80edf 9636 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
97e03143 9637
28e97307
DJ
9638 if (elfosabi == ELFOSABI_ARM)
9639 /* GNU tools use this value. Check note sections in this case,
9640 as well. */
9641 bfd_map_over_sections (abfd,
9642 generic_elf_osabi_sniff_abi_tag_sections,
9643 &osabi);
97e03143 9644
28e97307 9645 /* Anything else will be handled by the generic ELF sniffer. */
70f80edf 9646 return osabi;
97e03143
RE
9647}
9648
54483882
YQ
9649static int
9650arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
9651 struct reggroup *group)
9652{
2c291032
YQ
9653 /* FPS register's type is INT, but belongs to float_reggroup. Beside
9654 this, FPS register belongs to save_regroup, restore_reggroup, and
9655 all_reggroup, of course. */
54483882 9656 if (regnum == ARM_FPS_REGNUM)
2c291032
YQ
9657 return (group == float_reggroup
9658 || group == save_reggroup
9659 || group == restore_reggroup
9660 || group == all_reggroup);
54483882
YQ
9661 else
9662 return default_register_reggroup_p (gdbarch, regnum, group);
9663}
9664
25f8c692
JL
9665\f
9666/* For backward-compatibility we allow two 'g' packet lengths with
9667 the remote protocol depending on whether FPA registers are
9668 supplied. M-profile targets do not have FPA registers, but some
9669 stubs already exist in the wild which use a 'g' packet which
9670 supplies them albeit with dummy values. The packet format which
9671 includes FPA registers should be considered deprecated for
9672 M-profile targets. */
9673
9674static void
9675arm_register_g_packet_guesses (struct gdbarch *gdbarch)
9676{
9677 if (gdbarch_tdep (gdbarch)->is_m)
9678 {
9679 /* If we know from the executable this is an M-profile target,
9680 cater for remote targets whose register set layout is the
9681 same as the FPA layout. */
9682 register_remote_g_packet_guess (gdbarch,
03145bf4 9683 /* r0-r12,sp,lr,pc; f0-f7; fps,xpsr */
25f8c692
JL
9684 (16 * INT_REGISTER_SIZE)
9685 + (8 * FP_REGISTER_SIZE)
9686 + (2 * INT_REGISTER_SIZE),
9687 tdesc_arm_with_m_fpa_layout);
9688
9689 /* The regular M-profile layout. */
9690 register_remote_g_packet_guess (gdbarch,
9691 /* r0-r12,sp,lr,pc; xpsr */
9692 (16 * INT_REGISTER_SIZE)
9693 + INT_REGISTER_SIZE,
9694 tdesc_arm_with_m);
3184d3f9
JL
9695
9696 /* M-profile plus M4F VFP. */
9697 register_remote_g_packet_guess (gdbarch,
9698 /* r0-r12,sp,lr,pc; d0-d15; fpscr,xpsr */
9699 (16 * INT_REGISTER_SIZE)
9700 + (16 * VFP_REGISTER_SIZE)
9701 + (2 * INT_REGISTER_SIZE),
9702 tdesc_arm_with_m_vfp_d16);
25f8c692
JL
9703 }
9704
9705 /* Otherwise we don't have a useful guess. */
9706}
9707
70f80edf 9708\f
da3c6d4a
MS
9709/* Initialize the current architecture based on INFO. If possible,
9710 re-use an architecture from ARCHES, which is a list of
9711 architectures already created during this debugging session.
97e03143 9712
da3c6d4a
MS
9713 Called e.g. at program startup, when reading a core file, and when
9714 reading a binary file. */
97e03143 9715
39bbf761
RE
9716static struct gdbarch *
9717arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
9718{
97e03143 9719 struct gdbarch_tdep *tdep;
39bbf761 9720 struct gdbarch *gdbarch;
28e97307
DJ
9721 struct gdbarch_list *best_arch;
9722 enum arm_abi_kind arm_abi = arm_abi_global;
9723 enum arm_float_model fp_model = arm_fp_model;
123dc839 9724 struct tdesc_arch_data *tdesc_data = NULL;
9779414d 9725 int i, is_m = 0;
58d6951d
DJ
9726 int have_vfp_registers = 0, have_vfp_pseudos = 0, have_neon_pseudos = 0;
9727 int have_neon = 0;
ff6f572f 9728 int have_fpa_registers = 1;
9779414d
DJ
9729 const struct target_desc *tdesc = info.target_desc;
9730
9731 /* If we have an object to base this architecture on, try to determine
9732 its ABI. */
9733
9734 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
9735 {
9736 int ei_osabi, e_flags;
9737
9738 switch (bfd_get_flavour (info.abfd))
9739 {
9740 case bfd_target_aout_flavour:
9741 /* Assume it's an old APCS-style ABI. */
9742 arm_abi = ARM_ABI_APCS;
9743 break;
9744
9745 case bfd_target_coff_flavour:
9746 /* Assume it's an old APCS-style ABI. */
9747 /* XXX WinCE? */
9748 arm_abi = ARM_ABI_APCS;
9749 break;
9750
9751 case bfd_target_elf_flavour:
9752 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
9753 e_flags = elf_elfheader (info.abfd)->e_flags;
9754
9755 if (ei_osabi == ELFOSABI_ARM)
9756 {
9757 /* GNU tools used to use this value, but do not for EABI
9758 objects. There's nowhere to tag an EABI version
9759 anyway, so assume APCS. */
9760 arm_abi = ARM_ABI_APCS;
9761 }
9762 else if (ei_osabi == ELFOSABI_NONE)
9763 {
9764 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
9765 int attr_arch, attr_profile;
9766
9767 switch (eabi_ver)
9768 {
9769 case EF_ARM_EABI_UNKNOWN:
9770 /* Assume GNU tools. */
9771 arm_abi = ARM_ABI_APCS;
9772 break;
9773
9774 case EF_ARM_EABI_VER4:
9775 case EF_ARM_EABI_VER5:
9776 arm_abi = ARM_ABI_AAPCS;
9777 /* EABI binaries default to VFP float ordering.
9778 They may also contain build attributes that can
9779 be used to identify if the VFP argument-passing
9780 ABI is in use. */
9781 if (fp_model == ARM_FLOAT_AUTO)
9782 {
9783#ifdef HAVE_ELF
9784 switch (bfd_elf_get_obj_attr_int (info.abfd,
9785 OBJ_ATTR_PROC,
9786 Tag_ABI_VFP_args))
9787 {
9788 case 0:
9789 /* "The user intended FP parameter/result
9790 passing to conform to AAPCS, base
9791 variant". */
9792 fp_model = ARM_FLOAT_SOFT_VFP;
9793 break;
9794 case 1:
9795 /* "The user intended FP parameter/result
9796 passing to conform to AAPCS, VFP
9797 variant". */
9798 fp_model = ARM_FLOAT_VFP;
9799 break;
9800 case 2:
9801 /* "The user intended FP parameter/result
9802 passing to conform to tool chain-specific
9803 conventions" - we don't know any such
9804 conventions, so leave it as "auto". */
9805 break;
9806 default:
9807 /* Attribute value not mentioned in the
9808 October 2008 ABI, so leave it as
9809 "auto". */
9810 break;
9811 }
9812#else
9813 fp_model = ARM_FLOAT_SOFT_VFP;
9814#endif
9815 }
9816 break;
9817
9818 default:
9819 /* Leave it as "auto". */
9820 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
9821 break;
9822 }
9823
9824#ifdef HAVE_ELF
9825 /* Detect M-profile programs. This only works if the
9826 executable file includes build attributes; GCC does
9827 copy them to the executable, but e.g. RealView does
9828 not. */
9829 attr_arch = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
9830 Tag_CPU_arch);
0963b4bd
MS
9831 attr_profile = bfd_elf_get_obj_attr_int (info.abfd,
9832 OBJ_ATTR_PROC,
9779414d
DJ
9833 Tag_CPU_arch_profile);
9834 /* GCC specifies the profile for v6-M; RealView only
9835 specifies the profile for architectures starting with
9836 V7 (as opposed to architectures with a tag
9837 numerically greater than TAG_CPU_ARCH_V7). */
9838 if (!tdesc_has_registers (tdesc)
9839 && (attr_arch == TAG_CPU_ARCH_V6_M
9840 || attr_arch == TAG_CPU_ARCH_V6S_M
9841 || attr_profile == 'M'))
25f8c692 9842 is_m = 1;
9779414d
DJ
9843#endif
9844 }
9845
9846 if (fp_model == ARM_FLOAT_AUTO)
9847 {
9848 int e_flags = elf_elfheader (info.abfd)->e_flags;
9849
9850 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
9851 {
9852 case 0:
9853 /* Leave it as "auto". Strictly speaking this case
9854 means FPA, but almost nobody uses that now, and
9855 many toolchains fail to set the appropriate bits
9856 for the floating-point model they use. */
9857 break;
9858 case EF_ARM_SOFT_FLOAT:
9859 fp_model = ARM_FLOAT_SOFT_FPA;
9860 break;
9861 case EF_ARM_VFP_FLOAT:
9862 fp_model = ARM_FLOAT_VFP;
9863 break;
9864 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
9865 fp_model = ARM_FLOAT_SOFT_VFP;
9866 break;
9867 }
9868 }
9869
9870 if (e_flags & EF_ARM_BE8)
9871 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
9872
9873 break;
9874
9875 default:
9876 /* Leave it as "auto". */
9877 break;
9878 }
9879 }
123dc839
DJ
9880
9881 /* Check any target description for validity. */
9779414d 9882 if (tdesc_has_registers (tdesc))
123dc839
DJ
9883 {
9884 /* For most registers we require GDB's default names; but also allow
9885 the numeric names for sp / lr / pc, as a convenience. */
9886 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
9887 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
9888 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
9889
9890 const struct tdesc_feature *feature;
58d6951d 9891 int valid_p;
123dc839 9892
9779414d 9893 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9894 "org.gnu.gdb.arm.core");
9895 if (feature == NULL)
9779414d
DJ
9896 {
9897 feature = tdesc_find_feature (tdesc,
9898 "org.gnu.gdb.arm.m-profile");
9899 if (feature == NULL)
9900 return NULL;
9901 else
9902 is_m = 1;
9903 }
123dc839
DJ
9904
9905 tdesc_data = tdesc_data_alloc ();
9906
9907 valid_p = 1;
9908 for (i = 0; i < ARM_SP_REGNUM; i++)
9909 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9910 arm_register_names[i]);
9911 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9912 ARM_SP_REGNUM,
9913 arm_sp_names);
9914 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9915 ARM_LR_REGNUM,
9916 arm_lr_names);
9917 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data,
9918 ARM_PC_REGNUM,
9919 arm_pc_names);
9779414d
DJ
9920 if (is_m)
9921 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9922 ARM_PS_REGNUM, "xpsr");
9923 else
9924 valid_p &= tdesc_numbered_register (feature, tdesc_data,
9925 ARM_PS_REGNUM, "cpsr");
123dc839
DJ
9926
9927 if (!valid_p)
9928 {
9929 tdesc_data_cleanup (tdesc_data);
9930 return NULL;
9931 }
9932
9779414d 9933 feature = tdesc_find_feature (tdesc,
123dc839
DJ
9934 "org.gnu.gdb.arm.fpa");
9935 if (feature != NULL)
9936 {
9937 valid_p = 1;
9938 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
9939 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
9940 arm_register_names[i]);
9941 if (!valid_p)
9942 {
9943 tdesc_data_cleanup (tdesc_data);
9944 return NULL;
9945 }
9946 }
ff6f572f
DJ
9947 else
9948 have_fpa_registers = 0;
9949
9779414d 9950 feature = tdesc_find_feature (tdesc,
ff6f572f
DJ
9951 "org.gnu.gdb.xscale.iwmmxt");
9952 if (feature != NULL)
9953 {
9954 static const char *const iwmmxt_names[] = {
9955 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
9956 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
9957 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
9958 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
9959 };
9960
9961 valid_p = 1;
9962 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
9963 valid_p
9964 &= tdesc_numbered_register (feature, tdesc_data, i,
9965 iwmmxt_names[i - ARM_WR0_REGNUM]);
9966
9967 /* Check for the control registers, but do not fail if they
9968 are missing. */
9969 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
9970 tdesc_numbered_register (feature, tdesc_data, i,
9971 iwmmxt_names[i - ARM_WR0_REGNUM]);
9972
9973 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
9974 valid_p
9975 &= tdesc_numbered_register (feature, tdesc_data, i,
9976 iwmmxt_names[i - ARM_WR0_REGNUM]);
9977
9978 if (!valid_p)
9979 {
9980 tdesc_data_cleanup (tdesc_data);
9981 return NULL;
9982 }
9983 }
58d6951d
DJ
9984
9985 /* If we have a VFP unit, check whether the single precision registers
9986 are present. If not, then we will synthesize them as pseudo
9987 registers. */
9779414d 9988 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
9989 "org.gnu.gdb.arm.vfp");
9990 if (feature != NULL)
9991 {
9992 static const char *const vfp_double_names[] = {
9993 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
9994 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
9995 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
9996 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
9997 };
9998
9999 /* Require the double precision registers. There must be either
10000 16 or 32. */
10001 valid_p = 1;
10002 for (i = 0; i < 32; i++)
10003 {
10004 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10005 ARM_D0_REGNUM + i,
10006 vfp_double_names[i]);
10007 if (!valid_p)
10008 break;
10009 }
2b9e5ea6
UW
10010 if (!valid_p && i == 16)
10011 valid_p = 1;
58d6951d 10012
2b9e5ea6
UW
10013 /* Also require FPSCR. */
10014 valid_p &= tdesc_numbered_register (feature, tdesc_data,
10015 ARM_FPSCR_REGNUM, "fpscr");
10016 if (!valid_p)
58d6951d
DJ
10017 {
10018 tdesc_data_cleanup (tdesc_data);
10019 return NULL;
10020 }
10021
10022 if (tdesc_unnumbered_register (feature, "s0") == 0)
10023 have_vfp_pseudos = 1;
10024
10025 have_vfp_registers = 1;
10026
10027 /* If we have VFP, also check for NEON. The architecture allows
10028 NEON without VFP (integer vector operations only), but GDB
10029 does not support that. */
9779414d 10030 feature = tdesc_find_feature (tdesc,
58d6951d
DJ
10031 "org.gnu.gdb.arm.neon");
10032 if (feature != NULL)
10033 {
10034 /* NEON requires 32 double-precision registers. */
10035 if (i != 32)
10036 {
10037 tdesc_data_cleanup (tdesc_data);
10038 return NULL;
10039 }
10040
10041 /* If there are quad registers defined by the stub, use
10042 their type; otherwise (normally) provide them with
10043 the default type. */
10044 if (tdesc_unnumbered_register (feature, "q0") == 0)
10045 have_neon_pseudos = 1;
10046
10047 have_neon = 1;
10048 }
10049 }
123dc839 10050 }
39bbf761 10051
28e97307
DJ
10052 /* If there is already a candidate, use it. */
10053 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
10054 best_arch != NULL;
10055 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
10056 {
b8926edc
DJ
10057 if (arm_abi != ARM_ABI_AUTO
10058 && arm_abi != gdbarch_tdep (best_arch->gdbarch)->arm_abi)
28e97307
DJ
10059 continue;
10060
b8926edc
DJ
10061 if (fp_model != ARM_FLOAT_AUTO
10062 && fp_model != gdbarch_tdep (best_arch->gdbarch)->fp_model)
28e97307
DJ
10063 continue;
10064
58d6951d
DJ
10065 /* There are various other properties in tdep that we do not
10066 need to check here: those derived from a target description,
10067 since gdbarches with a different target description are
10068 automatically disqualified. */
10069
9779414d
DJ
10070 /* Do check is_m, though, since it might come from the binary. */
10071 if (is_m != gdbarch_tdep (best_arch->gdbarch)->is_m)
10072 continue;
10073
28e97307
DJ
10074 /* Found a match. */
10075 break;
10076 }
97e03143 10077
28e97307 10078 if (best_arch != NULL)
123dc839
DJ
10079 {
10080 if (tdesc_data != NULL)
10081 tdesc_data_cleanup (tdesc_data);
10082 return best_arch->gdbarch;
10083 }
28e97307
DJ
10084
10085 tdep = xcalloc (1, sizeof (struct gdbarch_tdep));
97e03143
RE
10086 gdbarch = gdbarch_alloc (&info, tdep);
10087
28e97307
DJ
10088 /* Record additional information about the architecture we are defining.
10089 These are gdbarch discriminators, like the OSABI. */
10090 tdep->arm_abi = arm_abi;
10091 tdep->fp_model = fp_model;
9779414d 10092 tdep->is_m = is_m;
ff6f572f 10093 tdep->have_fpa_registers = have_fpa_registers;
58d6951d
DJ
10094 tdep->have_vfp_registers = have_vfp_registers;
10095 tdep->have_vfp_pseudos = have_vfp_pseudos;
10096 tdep->have_neon_pseudos = have_neon_pseudos;
10097 tdep->have_neon = have_neon;
08216dd7 10098
25f8c692
JL
10099 arm_register_g_packet_guesses (gdbarch);
10100
08216dd7 10101 /* Breakpoints. */
9d4fde75 10102 switch (info.byte_order_for_code)
67255d04
RE
10103 {
10104 case BFD_ENDIAN_BIG:
66e810cd
RE
10105 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
10106 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
10107 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
10108 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
10109
67255d04
RE
10110 break;
10111
10112 case BFD_ENDIAN_LITTLE:
66e810cd
RE
10113 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
10114 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
10115 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
10116 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
10117
67255d04
RE
10118 break;
10119
10120 default:
10121 internal_error (__FILE__, __LINE__,
edefbb7c 10122 _("arm_gdbarch_init: bad byte order for float format"));
67255d04
RE
10123 }
10124
d7b486e7
RE
10125 /* On ARM targets char defaults to unsigned. */
10126 set_gdbarch_char_signed (gdbarch, 0);
10127
cca44b1b
JB
10128 /* Note: for displaced stepping, this includes the breakpoint, and one word
10129 of additional scratch space. This setting isn't used for anything beside
10130 displaced stepping at present. */
10131 set_gdbarch_max_insn_length (gdbarch, 4 * DISPLACED_MODIFIED_INSNS);
10132
9df628e0 10133 /* This should be low enough for everything. */
97e03143 10134 tdep->lowest_pc = 0x20;
94c30b78 10135 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
97e03143 10136
7c00367c
MK
10137 /* The default, for both APCS and AAPCS, is to return small
10138 structures in registers. */
10139 tdep->struct_return = reg_struct_return;
10140
2dd604e7 10141 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
f53f0d0b 10142 set_gdbarch_frame_align (gdbarch, arm_frame_align);
39bbf761 10143
756fe439
DJ
10144 set_gdbarch_write_pc (gdbarch, arm_write_pc);
10145
148754e5 10146 /* Frame handling. */
a262aec2 10147 set_gdbarch_dummy_id (gdbarch, arm_dummy_id);
eb5492fa
DJ
10148 set_gdbarch_unwind_pc (gdbarch, arm_unwind_pc);
10149 set_gdbarch_unwind_sp (gdbarch, arm_unwind_sp);
10150
eb5492fa 10151 frame_base_set_default (gdbarch, &arm_normal_base);
148754e5 10152
34e8f22d
RE
10153 /* Address manipulation. */
10154 set_gdbarch_smash_text_address (gdbarch, arm_smash_text_address);
10155 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
10156
34e8f22d
RE
10157 /* Advance PC across function entry code. */
10158 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
10159
4024ca99
UW
10160 /* Detect whether PC is in function epilogue. */
10161 set_gdbarch_in_function_epilogue_p (gdbarch, arm_in_function_epilogue_p);
10162
190dce09
UW
10163 /* Skip trampolines. */
10164 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
10165
34e8f22d
RE
10166 /* The stack grows downward. */
10167 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
10168
10169 /* Breakpoint manipulation. */
10170 set_gdbarch_breakpoint_from_pc (gdbarch, arm_breakpoint_from_pc);
177321bd
DJ
10171 set_gdbarch_remote_breakpoint_from_pc (gdbarch,
10172 arm_remote_breakpoint_from_pc);
34e8f22d
RE
10173
10174 /* Information about registers, etc. */
34e8f22d
RE
10175 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
10176 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
ff6f572f 10177 set_gdbarch_num_regs (gdbarch, ARM_NUM_REGS);
7a5ea0d4 10178 set_gdbarch_register_type (gdbarch, arm_register_type);
54483882 10179 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
34e8f22d 10180
ff6f572f
DJ
10181 /* This "info float" is FPA-specific. Use the generic version if we
10182 do not have FPA. */
10183 if (gdbarch_tdep (gdbarch)->have_fpa_registers)
10184 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
10185
26216b98 10186 /* Internal <-> external register number maps. */
ff6f572f 10187 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
26216b98
AC
10188 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
10189
34e8f22d
RE
10190 set_gdbarch_register_name (gdbarch, arm_register_name);
10191
10192 /* Returning results. */
2af48f68 10193 set_gdbarch_return_value (gdbarch, arm_return_value);
34e8f22d 10194
03d48a7d
RE
10195 /* Disassembly. */
10196 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
10197
34e8f22d
RE
10198 /* Minsymbol frobbing. */
10199 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
10200 set_gdbarch_coff_make_msymbol_special (gdbarch,
10201 arm_coff_make_msymbol_special);
60c5725c 10202 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
34e8f22d 10203
f9d67f43
DJ
10204 /* Thumb-2 IT block support. */
10205 set_gdbarch_adjust_breakpoint_address (gdbarch,
10206 arm_adjust_breakpoint_address);
10207
0d5de010
DJ
10208 /* Virtual tables. */
10209 set_gdbarch_vbit_in_delta (gdbarch, 1);
10210
97e03143 10211 /* Hook in the ABI-specific overrides, if they have been registered. */
4be87837 10212 gdbarch_init_osabi (info, gdbarch);
97e03143 10213
b39cc962
DJ
10214 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
10215
eb5492fa 10216 /* Add some default predicates. */
a262aec2
DJ
10217 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
10218 dwarf2_append_unwinders (gdbarch);
0e9e9abd 10219 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
a262aec2 10220 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
eb5492fa 10221
97e03143
RE
10222 /* Now we have tuned the configuration, set a few final things,
10223 based on what the OS ABI has told us. */
10224
b8926edc
DJ
10225 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
10226 binaries are always marked. */
10227 if (tdep->arm_abi == ARM_ABI_AUTO)
10228 tdep->arm_abi = ARM_ABI_APCS;
10229
e3039479
UW
10230 /* Watchpoints are not steppable. */
10231 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
10232
b8926edc
DJ
10233 /* We used to default to FPA for generic ARM, but almost nobody
10234 uses that now, and we now provide a way for the user to force
10235 the model. So default to the most useful variant. */
10236 if (tdep->fp_model == ARM_FLOAT_AUTO)
10237 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
10238
9df628e0
RE
10239 if (tdep->jb_pc >= 0)
10240 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
10241
08216dd7 10242 /* Floating point sizes and format. */
8da61cc4 10243 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
b8926edc 10244 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
08216dd7 10245 {
8da61cc4
DJ
10246 set_gdbarch_double_format
10247 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10248 set_gdbarch_long_double_format
10249 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10250 }
10251 else
10252 {
10253 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
10254 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
08216dd7
RE
10255 }
10256
58d6951d
DJ
10257 if (have_vfp_pseudos)
10258 {
10259 /* NOTE: These are the only pseudo registers used by
10260 the ARM target at the moment. If more are added, a
10261 little more care in numbering will be needed. */
10262
10263 int num_pseudos = 32;
10264 if (have_neon_pseudos)
10265 num_pseudos += 16;
10266 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
10267 set_gdbarch_pseudo_register_read (gdbarch, arm_pseudo_read);
10268 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
10269 }
10270
123dc839 10271 if (tdesc_data)
58d6951d
DJ
10272 {
10273 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
10274
9779414d 10275 tdesc_use_registers (gdbarch, tdesc, tdesc_data);
58d6951d
DJ
10276
10277 /* Override tdesc_register_type to adjust the types of VFP
10278 registers for NEON. */
10279 set_gdbarch_register_type (gdbarch, arm_register_type);
10280 }
123dc839
DJ
10281
10282 /* Add standard register aliases. We add aliases even for those
10283 nanes which are used by the current architecture - it's simpler,
10284 and does no harm, since nothing ever lists user registers. */
10285 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
10286 user_reg_add (gdbarch, arm_register_aliases[i].name,
10287 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
10288
39bbf761
RE
10289 return gdbarch;
10290}
10291
97e03143 10292static void
2af46ca0 10293arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
97e03143 10294{
2af46ca0 10295 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
97e03143
RE
10296
10297 if (tdep == NULL)
10298 return;
10299
edefbb7c 10300 fprintf_unfiltered (file, _("arm_dump_tdep: Lowest pc = 0x%lx"),
97e03143
RE
10301 (unsigned long) tdep->lowest_pc);
10302}
10303
a78f21af
AC
10304extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */
10305
c906108c 10306void
ed9a39eb 10307_initialize_arm_tdep (void)
c906108c 10308{
bc90b915
FN
10309 struct ui_file *stb;
10310 long length;
26304000 10311 struct cmd_list_element *new_set, *new_show;
53904c9e
AC
10312 const char *setname;
10313 const char *setdesc;
4bd7b427 10314 const char *const *regnames;
bc90b915
FN
10315 int numregs, i, j;
10316 static char *helptext;
edefbb7c
AC
10317 char regdesc[1024], *rdptr = regdesc;
10318 size_t rest = sizeof (regdesc);
085dd6e6 10319
42cf1509 10320 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
97e03143 10321
60c5725c 10322 arm_objfile_data_key
c1bd65d0 10323 = register_objfile_data_with_cleanup (NULL, arm_objfile_data_free);
60c5725c 10324
0e9e9abd
UW
10325 /* Add ourselves to objfile event chain. */
10326 observer_attach_new_objfile (arm_exidx_new_objfile);
10327 arm_exidx_data_key
10328 = register_objfile_data_with_cleanup (NULL, arm_exidx_data_free);
10329
70f80edf
JT
10330 /* Register an ELF OS ABI sniffer for ARM binaries. */
10331 gdbarch_register_osabi_sniffer (bfd_arch_arm,
10332 bfd_target_elf_flavour,
10333 arm_elf_osabi_sniffer);
10334
9779414d
DJ
10335 /* Initialize the standard target descriptions. */
10336 initialize_tdesc_arm_with_m ();
25f8c692 10337 initialize_tdesc_arm_with_m_fpa_layout ();
3184d3f9 10338 initialize_tdesc_arm_with_m_vfp_d16 ();
ef7e8358
UW
10339 initialize_tdesc_arm_with_iwmmxt ();
10340 initialize_tdesc_arm_with_vfpv2 ();
10341 initialize_tdesc_arm_with_vfpv3 ();
10342 initialize_tdesc_arm_with_neon ();
9779414d 10343
94c30b78 10344 /* Get the number of possible sets of register names defined in opcodes. */
afd7eef0
RE
10345 num_disassembly_options = get_arm_regname_num_options ();
10346
10347 /* Add root prefix command for all "set arm"/"show arm" commands. */
10348 add_prefix_cmd ("arm", no_class, set_arm_command,
edefbb7c 10349 _("Various ARM-specific commands."),
afd7eef0
RE
10350 &setarmcmdlist, "set arm ", 0, &setlist);
10351
10352 add_prefix_cmd ("arm", no_class, show_arm_command,
edefbb7c 10353 _("Various ARM-specific commands."),
afd7eef0 10354 &showarmcmdlist, "show arm ", 0, &showlist);
bc90b915 10355
94c30b78 10356 /* Sync the opcode insn printer with our register viewer. */
bc90b915 10357 parse_arm_disassembler_option ("reg-names-std");
c5aa993b 10358
eefe576e
AC
10359 /* Initialize the array that will be passed to
10360 add_setshow_enum_cmd(). */
afd7eef0
RE
10361 valid_disassembly_styles
10362 = xmalloc ((num_disassembly_options + 1) * sizeof (char *));
10363 for (i = 0; i < num_disassembly_options; i++)
bc90b915
FN
10364 {
10365 numregs = get_arm_regnames (i, &setname, &setdesc, &regnames);
afd7eef0 10366 valid_disassembly_styles[i] = setname;
edefbb7c
AC
10367 length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc);
10368 rdptr += length;
10369 rest -= length;
123dc839
DJ
10370 /* When we find the default names, tell the disassembler to use
10371 them. */
bc90b915
FN
10372 if (!strcmp (setname, "std"))
10373 {
afd7eef0 10374 disassembly_style = setname;
bc90b915
FN
10375 set_arm_regname_option (i);
10376 }
10377 }
94c30b78 10378 /* Mark the end of valid options. */
afd7eef0 10379 valid_disassembly_styles[num_disassembly_options] = NULL;
c906108c 10380
edefbb7c
AC
10381 /* Create the help text. */
10382 stb = mem_fileopen ();
10383 fprintf_unfiltered (stb, "%s%s%s",
10384 _("The valid values are:\n"),
10385 regdesc,
10386 _("The default is \"std\"."));
759ef836 10387 helptext = ui_file_xstrdup (stb, NULL);
bc90b915 10388 ui_file_delete (stb);
ed9a39eb 10389
edefbb7c
AC
10390 add_setshow_enum_cmd("disassembler", no_class,
10391 valid_disassembly_styles, &disassembly_style,
10392 _("Set the disassembly style."),
10393 _("Show the disassembly style."),
10394 helptext,
2c5b56ce 10395 set_disassembly_style_sfunc,
0963b4bd
MS
10396 NULL, /* FIXME: i18n: The disassembly style is
10397 \"%s\". */
7376b4c2 10398 &setarmcmdlist, &showarmcmdlist);
edefbb7c
AC
10399
10400 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
10401 _("Set usage of ARM 32-bit mode."),
10402 _("Show usage of ARM 32-bit mode."),
10403 _("When off, a 26-bit PC will be used."),
2c5b56ce 10404 NULL,
0963b4bd
MS
10405 NULL, /* FIXME: i18n: Usage of ARM 32-bit
10406 mode is %s. */
26304000 10407 &setarmcmdlist, &showarmcmdlist);
c906108c 10408
fd50bc42 10409 /* Add a command to allow the user to force the FPU model. */
edefbb7c
AC
10410 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
10411 _("Set the floating point type."),
10412 _("Show the floating point type."),
10413 _("auto - Determine the FP typefrom the OS-ABI.\n\
10414softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
10415fpa - FPA co-processor (GCC compiled).\n\
10416softvfp - Software FP with pure-endian doubles.\n\
10417vfp - VFP co-processor."),
edefbb7c 10418 set_fp_model_sfunc, show_fp_model,
7376b4c2 10419 &setarmcmdlist, &showarmcmdlist);
fd50bc42 10420
28e97307
DJ
10421 /* Add a command to allow the user to force the ABI. */
10422 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
10423 _("Set the ABI."),
10424 _("Show the ABI."),
10425 NULL, arm_set_abi, arm_show_abi,
10426 &setarmcmdlist, &showarmcmdlist);
10427
0428b8f5
DJ
10428 /* Add two commands to allow the user to force the assumed
10429 execution mode. */
10430 add_setshow_enum_cmd ("fallback-mode", class_support,
10431 arm_mode_strings, &arm_fallback_mode_string,
10432 _("Set the mode assumed when symbols are unavailable."),
10433 _("Show the mode assumed when symbols are unavailable."),
10434 NULL, NULL, arm_show_fallback_mode,
10435 &setarmcmdlist, &showarmcmdlist);
10436 add_setshow_enum_cmd ("force-mode", class_support,
10437 arm_mode_strings, &arm_force_mode_string,
10438 _("Set the mode assumed even when symbols are available."),
10439 _("Show the mode assumed even when symbols are available."),
10440 NULL, NULL, arm_show_force_mode,
10441 &setarmcmdlist, &showarmcmdlist);
10442
6529d2dd 10443 /* Debugging flag. */
edefbb7c
AC
10444 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
10445 _("Set ARM debugging."),
10446 _("Show ARM debugging."),
10447 _("When on, arm-specific debugging is enabled."),
2c5b56ce 10448 NULL,
7915a72c 10449 NULL, /* FIXME: i18n: "ARM debugging is %s. */
26304000 10450 &setdebuglist, &showdebuglist);
c906108c 10451}
72508ac0
PO
10452
10453/* ARM-reversible process record data structures. */
10454
10455#define ARM_INSN_SIZE_BYTES 4
10456#define THUMB_INSN_SIZE_BYTES 2
10457#define THUMB2_INSN_SIZE_BYTES 4
10458
10459
10460#define INSN_S_L_BIT_NUM 20
10461
10462#define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
10463 do \
10464 { \
10465 unsigned int reg_len = LENGTH; \
10466 if (reg_len) \
10467 { \
10468 REGS = XNEWVEC (uint32_t, reg_len); \
10469 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
10470 } \
10471 } \
10472 while (0)
10473
10474#define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
10475 do \
10476 { \
10477 unsigned int mem_len = LENGTH; \
10478 if (mem_len) \
10479 { \
10480 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
10481 memcpy(&MEMS->len, &RECORD_BUF[0], \
10482 sizeof(struct arm_mem_r) * LENGTH); \
10483 } \
10484 } \
10485 while (0)
10486
10487/* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
10488#define INSN_RECORDED(ARM_RECORD) \
10489 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
10490
10491/* ARM memory record structure. */
10492struct arm_mem_r
10493{
10494 uint32_t len; /* Record length. */
10495 CORE_ADDR addr; /* Memory address. */
10496};
10497
10498/* ARM instruction record contains opcode of current insn
10499 and execution state (before entry to decode_insn()),
10500 contains list of to-be-modified registers and
10501 memory blocks (on return from decode_insn()). */
10502
10503typedef struct insn_decode_record_t
10504{
10505 struct gdbarch *gdbarch;
10506 struct regcache *regcache;
10507 CORE_ADDR this_addr; /* Address of the insn being decoded. */
10508 uint32_t arm_insn; /* Should accommodate thumb. */
10509 uint32_t cond; /* Condition code. */
10510 uint32_t opcode; /* Insn opcode. */
10511 uint32_t decode; /* Insn decode bits. */
10512 uint32_t mem_rec_count; /* No of mem records. */
10513 uint32_t reg_rec_count; /* No of reg records. */
10514 uint32_t *arm_regs; /* Registers to be saved for this record. */
10515 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
10516} insn_decode_record;
10517
10518
10519/* Checks ARM SBZ and SBO mandatory fields. */
10520
10521static int
10522sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
10523{
10524 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
10525
10526 if (!len)
10527 return 1;
10528
10529 if (!sbo)
10530 ones = ~ones;
10531
10532 while (ones)
10533 {
10534 if (!(ones & sbo))
10535 {
10536 return 0;
10537 }
10538 ones = ones >> 1;
10539 }
10540 return 1;
10541}
10542
10543typedef enum
10544{
10545 ARM_RECORD_STRH=1,
10546 ARM_RECORD_STRD
10547} arm_record_strx_t;
10548
10549typedef enum
10550{
10551 ARM_RECORD=1,
10552 THUMB_RECORD,
10553 THUMB2_RECORD
10554} record_type_t;
10555
10556
10557static int
10558arm_record_strx (insn_decode_record *arm_insn_r, uint32_t *record_buf,
10559 uint32_t *record_buf_mem, arm_record_strx_t str_type)
10560{
10561
10562 struct regcache *reg_cache = arm_insn_r->regcache;
10563 ULONGEST u_regval[2]= {0};
10564
10565 uint32_t reg_src1 = 0, reg_src2 = 0;
10566 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
10567 uint32_t opcode1 = 0;
10568
10569 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
10570 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
10571 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
10572
10573
10574 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
10575 {
10576 /* 1) Handle misc store, immediate offset. */
10577 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
10578 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
10579 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10580 regcache_raw_read_unsigned (reg_cache, reg_src1,
10581 &u_regval[0]);
10582 if (ARM_PC_REGNUM == reg_src1)
10583 {
10584 /* If R15 was used as Rn, hence current PC+8. */
10585 u_regval[0] = u_regval[0] + 8;
10586 }
10587 offset_8 = (immed_high << 4) | immed_low;
10588 /* Calculate target store address. */
10589 if (14 == arm_insn_r->opcode)
10590 {
10591 tgt_mem_addr = u_regval[0] + offset_8;
10592 }
10593 else
10594 {
10595 tgt_mem_addr = u_regval[0] - offset_8;
10596 }
10597 if (ARM_RECORD_STRH == str_type)
10598 {
10599 record_buf_mem[0] = 2;
10600 record_buf_mem[1] = tgt_mem_addr;
10601 arm_insn_r->mem_rec_count = 1;
10602 }
10603 else if (ARM_RECORD_STRD == str_type)
10604 {
10605 record_buf_mem[0] = 4;
10606 record_buf_mem[1] = tgt_mem_addr;
10607 record_buf_mem[2] = 4;
10608 record_buf_mem[3] = tgt_mem_addr + 4;
10609 arm_insn_r->mem_rec_count = 2;
10610 }
10611 }
10612 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
10613 {
10614 /* 2) Store, register offset. */
10615 /* Get Rm. */
10616 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10617 /* Get Rn. */
10618 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10619 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10620 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10621 if (15 == reg_src2)
10622 {
10623 /* If R15 was used as Rn, hence current PC+8. */
10624 u_regval[0] = u_regval[0] + 8;
10625 }
10626 /* Calculate target store address, Rn +/- Rm, register offset. */
10627 if (12 == arm_insn_r->opcode)
10628 {
10629 tgt_mem_addr = u_regval[0] + u_regval[1];
10630 }
10631 else
10632 {
10633 tgt_mem_addr = u_regval[1] - u_regval[0];
10634 }
10635 if (ARM_RECORD_STRH == str_type)
10636 {
10637 record_buf_mem[0] = 2;
10638 record_buf_mem[1] = tgt_mem_addr;
10639 arm_insn_r->mem_rec_count = 1;
10640 }
10641 else if (ARM_RECORD_STRD == str_type)
10642 {
10643 record_buf_mem[0] = 4;
10644 record_buf_mem[1] = tgt_mem_addr;
10645 record_buf_mem[2] = 4;
10646 record_buf_mem[3] = tgt_mem_addr + 4;
10647 arm_insn_r->mem_rec_count = 2;
10648 }
10649 }
10650 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
10651 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
10652 {
10653 /* 3) Store, immediate pre-indexed. */
10654 /* 5) Store, immediate post-indexed. */
10655 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
10656 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
10657 offset_8 = (immed_high << 4) | immed_low;
10658 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10659 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10660 /* Calculate target store address, Rn +/- Rm, register offset. */
10661 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
10662 {
10663 tgt_mem_addr = u_regval[0] + offset_8;
10664 }
10665 else
10666 {
10667 tgt_mem_addr = u_regval[0] - offset_8;
10668 }
10669 if (ARM_RECORD_STRH == str_type)
10670 {
10671 record_buf_mem[0] = 2;
10672 record_buf_mem[1] = tgt_mem_addr;
10673 arm_insn_r->mem_rec_count = 1;
10674 }
10675 else if (ARM_RECORD_STRD == str_type)
10676 {
10677 record_buf_mem[0] = 4;
10678 record_buf_mem[1] = tgt_mem_addr;
10679 record_buf_mem[2] = 4;
10680 record_buf_mem[3] = tgt_mem_addr + 4;
10681 arm_insn_r->mem_rec_count = 2;
10682 }
10683 /* Record Rn also as it changes. */
10684 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
10685 arm_insn_r->reg_rec_count = 1;
10686 }
10687 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
10688 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
10689 {
10690 /* 4) Store, register pre-indexed. */
10691 /* 6) Store, register post -indexed. */
10692 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
10693 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
10694 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
10695 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
10696 /* Calculate target store address, Rn +/- Rm, register offset. */
10697 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
10698 {
10699 tgt_mem_addr = u_regval[0] + u_regval[1];
10700 }
10701 else
10702 {
10703 tgt_mem_addr = u_regval[1] - u_regval[0];
10704 }
10705 if (ARM_RECORD_STRH == str_type)
10706 {
10707 record_buf_mem[0] = 2;
10708 record_buf_mem[1] = tgt_mem_addr;
10709 arm_insn_r->mem_rec_count = 1;
10710 }
10711 else if (ARM_RECORD_STRD == str_type)
10712 {
10713 record_buf_mem[0] = 4;
10714 record_buf_mem[1] = tgt_mem_addr;
10715 record_buf_mem[2] = 4;
10716 record_buf_mem[3] = tgt_mem_addr + 4;
10717 arm_insn_r->mem_rec_count = 2;
10718 }
10719 /* Record Rn also as it changes. */
10720 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
10721 arm_insn_r->reg_rec_count = 1;
10722 }
10723 return 0;
10724}
10725
10726/* Handling ARM extension space insns. */
10727
10728static int
10729arm_record_extension_space (insn_decode_record *arm_insn_r)
10730{
10731 uint32_t ret = 0; /* Return value: -1:record failure ; 0:success */
10732 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
10733 uint32_t record_buf[8], record_buf_mem[8];
10734 uint32_t reg_src1 = 0;
10735 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
10736 struct regcache *reg_cache = arm_insn_r->regcache;
10737 ULONGEST u_regval = 0;
10738
10739 gdb_assert (!INSN_RECORDED(arm_insn_r));
10740 /* Handle unconditional insn extension space. */
10741
10742 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
10743 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
10744 if (arm_insn_r->cond)
10745 {
10746 /* PLD has no affect on architectural state, it just affects
10747 the caches. */
10748 if (5 == ((opcode1 & 0xE0) >> 5))
10749 {
10750 /* BLX(1) */
10751 record_buf[0] = ARM_PS_REGNUM;
10752 record_buf[1] = ARM_LR_REGNUM;
10753 arm_insn_r->reg_rec_count = 2;
10754 }
10755 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
10756 }
10757
10758
10759 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10760 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
10761 {
10762 ret = -1;
10763 /* Undefined instruction on ARM V5; need to handle if later
10764 versions define it. */
10765 }
10766
10767 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
10768 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
10769 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
10770
10771 /* Handle arithmetic insn extension space. */
10772 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
10773 && !INSN_RECORDED(arm_insn_r))
10774 {
10775 /* Handle MLA(S) and MUL(S). */
10776 if (0 <= insn_op1 && 3 >= insn_op1)
10777 {
10778 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10779 record_buf[1] = ARM_PS_REGNUM;
10780 arm_insn_r->reg_rec_count = 2;
10781 }
10782 else if (4 <= insn_op1 && 15 >= insn_op1)
10783 {
10784 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
10785 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
10786 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10787 record_buf[2] = ARM_PS_REGNUM;
10788 arm_insn_r->reg_rec_count = 3;
10789 }
10790 }
10791
10792 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
10793 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
10794 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
10795
10796 /* Handle control insn extension space. */
10797
10798 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
10799 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
10800 {
10801 if (!bit (arm_insn_r->arm_insn,25))
10802 {
10803 if (!bits (arm_insn_r->arm_insn, 4, 7))
10804 {
10805 if ((0 == insn_op1) || (2 == insn_op1))
10806 {
10807 /* MRS. */
10808 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10809 arm_insn_r->reg_rec_count = 1;
10810 }
10811 else if (1 == insn_op1)
10812 {
10813 /* CSPR is going to be changed. */
10814 record_buf[0] = ARM_PS_REGNUM;
10815 arm_insn_r->reg_rec_count = 1;
10816 }
10817 else if (3 == insn_op1)
10818 {
10819 /* SPSR is going to be changed. */
10820 /* We need to get SPSR value, which is yet to be done. */
10821 printf_unfiltered (_("Process record does not support "
10822 "instruction 0x%0x at address %s.\n"),
10823 arm_insn_r->arm_insn,
10824 paddress (arm_insn_r->gdbarch,
10825 arm_insn_r->this_addr));
10826 return -1;
10827 }
10828 }
10829 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
10830 {
10831 if (1 == insn_op1)
10832 {
10833 /* BX. */
10834 record_buf[0] = ARM_PS_REGNUM;
10835 arm_insn_r->reg_rec_count = 1;
10836 }
10837 else if (3 == insn_op1)
10838 {
10839 /* CLZ. */
10840 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10841 arm_insn_r->reg_rec_count = 1;
10842 }
10843 }
10844 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
10845 {
10846 /* BLX. */
10847 record_buf[0] = ARM_PS_REGNUM;
10848 record_buf[1] = ARM_LR_REGNUM;
10849 arm_insn_r->reg_rec_count = 2;
10850 }
10851 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
10852 {
10853 /* QADD, QSUB, QDADD, QDSUB */
10854 record_buf[0] = ARM_PS_REGNUM;
10855 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
10856 arm_insn_r->reg_rec_count = 2;
10857 }
10858 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
10859 {
10860 /* BKPT. */
10861 record_buf[0] = ARM_PS_REGNUM;
10862 record_buf[1] = ARM_LR_REGNUM;
10863 arm_insn_r->reg_rec_count = 2;
10864
10865 /* Save SPSR also;how? */
10866 printf_unfiltered (_("Process record does not support "
10867 "instruction 0x%0x at address %s.\n"),
10868 arm_insn_r->arm_insn,
10869 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10870 return -1;
10871 }
10872 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
10873 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
10874 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
10875 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
10876 )
10877 {
10878 if (0 == insn_op1 || 1 == insn_op1)
10879 {
10880 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
10881 /* We dont do optimization for SMULW<y> where we
10882 need only Rd. */
10883 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10884 record_buf[1] = ARM_PS_REGNUM;
10885 arm_insn_r->reg_rec_count = 2;
10886 }
10887 else if (2 == insn_op1)
10888 {
10889 /* SMLAL<x><y>. */
10890 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10891 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
10892 arm_insn_r->reg_rec_count = 2;
10893 }
10894 else if (3 == insn_op1)
10895 {
10896 /* SMUL<x><y>. */
10897 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10898 arm_insn_r->reg_rec_count = 1;
10899 }
10900 }
10901 }
10902 else
10903 {
10904 /* MSR : immediate form. */
10905 if (1 == insn_op1)
10906 {
10907 /* CSPR is going to be changed. */
10908 record_buf[0] = ARM_PS_REGNUM;
10909 arm_insn_r->reg_rec_count = 1;
10910 }
10911 else if (3 == insn_op1)
10912 {
10913 /* SPSR is going to be changed. */
10914 /* we need to get SPSR value, which is yet to be done */
10915 printf_unfiltered (_("Process record does not support "
10916 "instruction 0x%0x at address %s.\n"),
10917 arm_insn_r->arm_insn,
10918 paddress (arm_insn_r->gdbarch,
10919 arm_insn_r->this_addr));
10920 return -1;
10921 }
10922 }
10923 }
10924
10925 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
10926 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
10927 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
10928
10929 /* Handle load/store insn extension space. */
10930
10931 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
10932 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
10933 && !INSN_RECORDED(arm_insn_r))
10934 {
10935 /* SWP/SWPB. */
10936 if (0 == insn_op1)
10937 {
10938 /* These insn, changes register and memory as well. */
10939 /* SWP or SWPB insn. */
10940 /* Get memory address given by Rn. */
10941 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
10942 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
10943 /* SWP insn ?, swaps word. */
10944 if (8 == arm_insn_r->opcode)
10945 {
10946 record_buf_mem[0] = 4;
10947 }
10948 else
10949 {
10950 /* SWPB insn, swaps only byte. */
10951 record_buf_mem[0] = 1;
10952 }
10953 record_buf_mem[1] = u_regval;
10954 arm_insn_r->mem_rec_count = 1;
10955 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10956 arm_insn_r->reg_rec_count = 1;
10957 }
10958 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10959 {
10960 /* STRH. */
10961 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10962 ARM_RECORD_STRH);
10963 }
10964 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10965 {
10966 /* LDRD. */
10967 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10968 record_buf[1] = record_buf[0] + 1;
10969 arm_insn_r->reg_rec_count = 2;
10970 }
10971 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
10972 {
10973 /* STRD. */
10974 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
10975 ARM_RECORD_STRD);
10976 }
10977 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
10978 {
10979 /* LDRH, LDRSB, LDRSH. */
10980 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
10981 arm_insn_r->reg_rec_count = 1;
10982 }
10983
10984 }
10985
10986 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
10987 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
10988 && !INSN_RECORDED(arm_insn_r))
10989 {
10990 ret = -1;
10991 /* Handle coprocessor insn extension space. */
10992 }
10993
10994 /* To be done for ARMv5 and later; as of now we return -1. */
10995 if (-1 == ret)
10996 printf_unfiltered (_("Process record does not support instruction x%0x "
10997 "at address %s.\n"),arm_insn_r->arm_insn,
10998 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
10999
11000
11001 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11002 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11003
11004 return ret;
11005}
11006
11007/* Handling opcode 000 insns. */
11008
11009static int
11010arm_record_data_proc_misc_ld_str (insn_decode_record *arm_insn_r)
11011{
11012 struct regcache *reg_cache = arm_insn_r->regcache;
11013 uint32_t record_buf[8], record_buf_mem[8];
11014 ULONGEST u_regval[2] = {0};
11015
11016 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
11017 uint32_t immed_high = 0, immed_low = 0, offset_8 = 0, tgt_mem_addr = 0;
11018 uint32_t opcode1 = 0;
11019
11020 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11021 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11022 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
11023
11024 /* Data processing insn /multiply insn. */
11025 if (9 == arm_insn_r->decode
11026 && ((4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11027 || (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)))
11028 {
11029 /* Handle multiply instructions. */
11030 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
11031 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
11032 {
11033 /* Handle MLA and MUL. */
11034 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11035 record_buf[1] = ARM_PS_REGNUM;
11036 arm_insn_r->reg_rec_count = 2;
11037 }
11038 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11039 {
11040 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
11041 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11042 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11043 record_buf[2] = ARM_PS_REGNUM;
11044 arm_insn_r->reg_rec_count = 3;
11045 }
11046 }
11047 else if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11048 && (11 == arm_insn_r->decode || 13 == arm_insn_r->decode))
11049 {
11050 /* Handle misc load insns, as 20th bit (L = 1). */
11051 /* LDR insn has a capability to do branching, if
11052 MOV LR, PC is precceded by LDR insn having Rn as R15
11053 in that case, it emulates branch and link insn, and hence we
11054 need to save CSPR and PC as well. I am not sure this is right
11055 place; as opcode = 010 LDR insn make this happen, if R15 was
11056 used. */
11057 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
11058 if (15 != reg_dest)
11059 {
11060 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11061 arm_insn_r->reg_rec_count = 1;
11062 }
11063 else
11064 {
11065 record_buf[0] = reg_dest;
11066 record_buf[1] = ARM_PS_REGNUM;
11067 arm_insn_r->reg_rec_count = 2;
11068 }
11069 }
11070 else if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
11071 && sbo_sbz (arm_insn_r->arm_insn, 5, 12, 0)
11072 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
11073 && 2 == bits (arm_insn_r->arm_insn, 20, 21))
11074 {
11075 /* Handle MSR insn. */
11076 if (9 == arm_insn_r->opcode)
11077 {
11078 /* CSPR is going to be changed. */
11079 record_buf[0] = ARM_PS_REGNUM;
11080 arm_insn_r->reg_rec_count = 1;
11081 }
11082 else
11083 {
11084 /* SPSR is going to be changed. */
11085 /* How to read SPSR value? */
11086 printf_unfiltered (_("Process record does not support instruction "
11087 "0x%0x at address %s.\n"),
11088 arm_insn_r->arm_insn,
11089 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11090 return -1;
11091 }
11092 }
11093 else if (9 == arm_insn_r->decode
11094 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11095 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11096 {
11097 /* Handling SWP, SWPB. */
11098 /* These insn, changes register and memory as well. */
11099 /* SWP or SWPB insn. */
11100
11101 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11102 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11103 /* SWP insn ?, swaps word. */
11104 if (8 == arm_insn_r->opcode)
11105 {
11106 record_buf_mem[0] = 4;
11107 }
11108 else
11109 {
11110 /* SWPB insn, swaps only byte. */
11111 record_buf_mem[0] = 1;
11112 }
11113 record_buf_mem[1] = u_regval[0];
11114 arm_insn_r->mem_rec_count = 1;
11115 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11116 arm_insn_r->reg_rec_count = 1;
11117 }
11118 else if (3 == arm_insn_r->decode && 0x12 == opcode1
11119 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11120 {
11121 /* Handle BLX, branch and link/exchange. */
11122 if (9 == arm_insn_r->opcode)
11123 {
11124 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
11125 and R14 stores the return address. */
11126 record_buf[0] = ARM_PS_REGNUM;
11127 record_buf[1] = ARM_LR_REGNUM;
11128 arm_insn_r->reg_rec_count = 2;
11129 }
11130 }
11131 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
11132 {
11133 /* Handle enhanced software breakpoint insn, BKPT. */
11134 /* CPSR is changed to be executed in ARM state, disabling normal
11135 interrupts, entering abort mode. */
11136 /* According to high vector configuration PC is set. */
11137 /* user hit breakpoint and type reverse, in
11138 that case, we need to go back with previous CPSR and
11139 Program Counter. */
11140 record_buf[0] = ARM_PS_REGNUM;
11141 record_buf[1] = ARM_LR_REGNUM;
11142 arm_insn_r->reg_rec_count = 2;
11143
11144 /* Save SPSR also; how? */
11145 printf_unfiltered (_("Process record does not support instruction "
11146 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11147 paddress (arm_insn_r->gdbarch,
11148 arm_insn_r->this_addr));
11149 return -1;
11150 }
11151 else if (11 == arm_insn_r->decode
11152 && !bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11153 {
11154 /* Handle enhanced store insns and DSP insns (e.g. LDRD). */
11155
11156 /* Handle str(x) insn */
11157 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11158 ARM_RECORD_STRH);
11159 }
11160 else if (1 == arm_insn_r->decode && 0x12 == opcode1
11161 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11162 {
11163 /* Handle BX, branch and link/exchange. */
11164 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
11165 record_buf[0] = ARM_PS_REGNUM;
11166 arm_insn_r->reg_rec_count = 1;
11167 }
11168 else if (1 == arm_insn_r->decode && 0x16 == opcode1
11169 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
11170 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
11171 {
11172 /* Count leading zeros: CLZ. */
11173 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11174 arm_insn_r->reg_rec_count = 1;
11175 }
11176 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11177 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11178 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
11179 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0)
11180 )
11181 {
11182 /* Handle MRS insn. */
11183 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11184 arm_insn_r->reg_rec_count = 1;
11185 }
11186 else if (arm_insn_r->opcode <= 15)
11187 {
11188 /* Normal data processing insns. */
11189 /* Out of 11 shifter operands mode, all the insn modifies destination
11190 register, which is specified by 13-16 decode. */
11191 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11192 record_buf[1] = ARM_PS_REGNUM;
11193 arm_insn_r->reg_rec_count = 2;
11194 }
11195 else
11196 {
11197 return -1;
11198 }
11199
11200 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11201 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11202 return 0;
11203}
11204
11205/* Handling opcode 001 insns. */
11206
11207static int
11208arm_record_data_proc_imm (insn_decode_record *arm_insn_r)
11209{
11210 uint32_t record_buf[8], record_buf_mem[8];
11211
11212 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11213 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11214
11215 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
11216 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
11217 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
11218 )
11219 {
11220 /* Handle MSR insn. */
11221 if (9 == arm_insn_r->opcode)
11222 {
11223 /* CSPR is going to be changed. */
11224 record_buf[0] = ARM_PS_REGNUM;
11225 arm_insn_r->reg_rec_count = 1;
11226 }
11227 else
11228 {
11229 /* SPSR is going to be changed. */
11230 }
11231 }
11232 else if (arm_insn_r->opcode <= 15)
11233 {
11234 /* Normal data processing insns. */
11235 /* Out of 11 shifter operands mode, all the insn modifies destination
11236 register, which is specified by 13-16 decode. */
11237 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11238 record_buf[1] = ARM_PS_REGNUM;
11239 arm_insn_r->reg_rec_count = 2;
11240 }
11241 else
11242 {
11243 return -1;
11244 }
11245
11246 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11247 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11248 return 0;
11249}
11250
11251/* Handling opcode 010 insns. */
11252
11253static int
11254arm_record_ld_st_imm_offset (insn_decode_record *arm_insn_r)
11255{
11256 struct regcache *reg_cache = arm_insn_r->regcache;
11257
11258 uint32_t reg_src1 = 0 , reg_dest = 0;
11259 uint32_t offset_12 = 0, tgt_mem_addr = 0;
11260 uint32_t record_buf[8], record_buf_mem[8];
11261
11262 ULONGEST u_regval = 0;
11263
11264 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11265 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11266
11267 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11268 {
11269 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
11270 /* LDR insn has a capability to do branching, if
11271 MOV LR, PC is precedded by LDR insn having Rn as R15
11272 in that case, it emulates branch and link insn, and hence we
11273 need to save CSPR and PC as well. */
11274 if (ARM_PC_REGNUM != reg_dest)
11275 {
11276 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11277 arm_insn_r->reg_rec_count = 1;
11278 }
11279 else
11280 {
11281 record_buf[0] = reg_dest;
11282 record_buf[1] = ARM_PS_REGNUM;
11283 arm_insn_r->reg_rec_count = 2;
11284 }
11285 }
11286 else
11287 {
11288 /* Store, immediate offset, immediate pre-indexed,
11289 immediate post-indexed. */
11290 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11291 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
11292 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11293 /* U == 1 */
11294 if (bit (arm_insn_r->arm_insn, 23))
11295 {
11296 tgt_mem_addr = u_regval + offset_12;
11297 }
11298 else
11299 {
11300 tgt_mem_addr = u_regval - offset_12;
11301 }
11302
11303 switch (arm_insn_r->opcode)
11304 {
11305 /* STR. */
11306 case 8:
11307 case 12:
11308 /* STR. */
11309 case 9:
11310 case 13:
11311 /* STRT. */
11312 case 1:
11313 case 5:
11314 /* STR. */
11315 case 4:
11316 case 0:
11317 record_buf_mem[0] = 4;
11318 break;
11319
11320 /* STRB. */
11321 case 10:
11322 case 14:
11323 /* STRB. */
11324 case 11:
11325 case 15:
11326 /* STRBT. */
11327 case 3:
11328 case 7:
11329 /* STRB. */
11330 case 2:
11331 case 6:
11332 record_buf_mem[0] = 1;
11333 break;
11334
11335 default:
11336 gdb_assert_not_reached ("no decoding pattern found");
11337 break;
11338 }
11339 record_buf_mem[1] = tgt_mem_addr;
11340 arm_insn_r->mem_rec_count = 1;
11341
11342 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
11343 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11344 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
11345 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
11346 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
11347 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
11348 )
11349 {
11350 /* We are handling pre-indexed mode; post-indexed mode;
11351 where Rn is going to be changed. */
11352 record_buf[0] = reg_src1;
11353 arm_insn_r->reg_rec_count = 1;
11354 }
11355 }
11356
11357 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11358 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11359 return 0;
11360}
11361
11362/* Handling opcode 011 insns. */
11363
11364static int
11365arm_record_ld_st_reg_offset (insn_decode_record *arm_insn_r)
11366{
11367 struct regcache *reg_cache = arm_insn_r->regcache;
11368
11369 uint32_t shift_imm = 0;
11370 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
11371 uint32_t offset_12 = 0, tgt_mem_addr = 0;
11372 uint32_t record_buf[8], record_buf_mem[8];
11373
11374 LONGEST s_word;
11375 ULONGEST u_regval[2];
11376
11377 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11378 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11379
11380 /* Handle enhanced store insns and LDRD DSP insn,
11381 order begins according to addressing modes for store insns
11382 STRH insn. */
11383
11384 /* LDR or STR? */
11385 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11386 {
11387 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
11388 /* LDR insn has a capability to do branching, if
11389 MOV LR, PC is precedded by LDR insn having Rn as R15
11390 in that case, it emulates branch and link insn, and hence we
11391 need to save CSPR and PC as well. */
11392 if (15 != reg_dest)
11393 {
11394 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11395 arm_insn_r->reg_rec_count = 1;
11396 }
11397 else
11398 {
11399 record_buf[0] = reg_dest;
11400 record_buf[1] = ARM_PS_REGNUM;
11401 arm_insn_r->reg_rec_count = 2;
11402 }
11403 }
11404 else
11405 {
11406 if (! bits (arm_insn_r->arm_insn, 4, 11))
11407 {
11408 /* Store insn, register offset and register pre-indexed,
11409 register post-indexed. */
11410 /* Get Rm. */
11411 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11412 /* Get Rn. */
11413 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11414 regcache_raw_read_unsigned (reg_cache, reg_src1
11415 , &u_regval[0]);
11416 regcache_raw_read_unsigned (reg_cache, reg_src2
11417 , &u_regval[1]);
11418 if (15 == reg_src2)
11419 {
11420 /* If R15 was used as Rn, hence current PC+8. */
11421 /* Pre-indexed mode doesnt reach here ; illegal insn. */
11422 u_regval[0] = u_regval[0] + 8;
11423 }
11424 /* Calculate target store address, Rn +/- Rm, register offset. */
11425 /* U == 1. */
11426 if (bit (arm_insn_r->arm_insn, 23))
11427 {
11428 tgt_mem_addr = u_regval[0] + u_regval[1];
11429 }
11430 else
11431 {
11432 tgt_mem_addr = u_regval[1] - u_regval[0];
11433 }
11434
11435 switch (arm_insn_r->opcode)
11436 {
11437 /* STR. */
11438 case 8:
11439 case 12:
11440 /* STR. */
11441 case 9:
11442 case 13:
11443 /* STRT. */
11444 case 1:
11445 case 5:
11446 /* STR. */
11447 case 0:
11448 case 4:
11449 record_buf_mem[0] = 4;
11450 break;
11451
11452 /* STRB. */
11453 case 10:
11454 case 14:
11455 /* STRB. */
11456 case 11:
11457 case 15:
11458 /* STRBT. */
11459 case 3:
11460 case 7:
11461 /* STRB. */
11462 case 2:
11463 case 6:
11464 record_buf_mem[0] = 1;
11465 break;
11466
11467 default:
11468 gdb_assert_not_reached ("no decoding pattern found");
11469 break;
11470 }
11471 record_buf_mem[1] = tgt_mem_addr;
11472 arm_insn_r->mem_rec_count = 1;
11473
11474 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
11475 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11476 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
11477 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
11478 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
11479 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
11480 )
11481 {
11482 /* Rn is going to be changed in pre-indexed mode and
11483 post-indexed mode as well. */
11484 record_buf[0] = reg_src2;
11485 arm_insn_r->reg_rec_count = 1;
11486 }
11487 }
11488 else
11489 {
11490 /* Store insn, scaled register offset; scaled pre-indexed. */
11491 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
11492 /* Get Rm. */
11493 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11494 /* Get Rn. */
11495 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11496 /* Get shift_imm. */
11497 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
11498 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11499 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
11500 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11501 /* Offset_12 used as shift. */
11502 switch (offset_12)
11503 {
11504 case 0:
11505 /* Offset_12 used as index. */
11506 offset_12 = u_regval[0] << shift_imm;
11507 break;
11508
11509 case 1:
11510 offset_12 = (!shift_imm)?0:u_regval[0] >> shift_imm;
11511 break;
11512
11513 case 2:
11514 if (!shift_imm)
11515 {
11516 if (bit (u_regval[0], 31))
11517 {
11518 offset_12 = 0xFFFFFFFF;
11519 }
11520 else
11521 {
11522 offset_12 = 0;
11523 }
11524 }
11525 else
11526 {
11527 /* This is arithmetic shift. */
11528 offset_12 = s_word >> shift_imm;
11529 }
11530 break;
11531
11532 case 3:
11533 if (!shift_imm)
11534 {
11535 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
11536 &u_regval[1]);
11537 /* Get C flag value and shift it by 31. */
11538 offset_12 = (((bit (u_regval[1], 29)) << 31) \
11539 | (u_regval[0]) >> 1);
11540 }
11541 else
11542 {
11543 offset_12 = (u_regval[0] >> shift_imm) \
11544 | (u_regval[0] <<
11545 (sizeof(uint32_t) - shift_imm));
11546 }
11547 break;
11548
11549 default:
11550 gdb_assert_not_reached ("no decoding pattern found");
11551 break;
11552 }
11553
11554 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11555 /* bit U set. */
11556 if (bit (arm_insn_r->arm_insn, 23))
11557 {
11558 tgt_mem_addr = u_regval[1] + offset_12;
11559 }
11560 else
11561 {
11562 tgt_mem_addr = u_regval[1] - offset_12;
11563 }
11564
11565 switch (arm_insn_r->opcode)
11566 {
11567 /* STR. */
11568 case 8:
11569 case 12:
11570 /* STR. */
11571 case 9:
11572 case 13:
11573 /* STRT. */
11574 case 1:
11575 case 5:
11576 /* STR. */
11577 case 0:
11578 case 4:
11579 record_buf_mem[0] = 4;
11580 break;
11581
11582 /* STRB. */
11583 case 10:
11584 case 14:
11585 /* STRB. */
11586 case 11:
11587 case 15:
11588 /* STRBT. */
11589 case 3:
11590 case 7:
11591 /* STRB. */
11592 case 2:
11593 case 6:
11594 record_buf_mem[0] = 1;
11595 break;
11596
11597 default:
11598 gdb_assert_not_reached ("no decoding pattern found");
11599 break;
11600 }
11601 record_buf_mem[1] = tgt_mem_addr;
11602 arm_insn_r->mem_rec_count = 1;
11603
11604 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
11605 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11606 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
11607 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
11608 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
11609 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
11610 )
11611 {
11612 /* Rn is going to be changed in register scaled pre-indexed
11613 mode,and scaled post indexed mode. */
11614 record_buf[0] = reg_src2;
11615 arm_insn_r->reg_rec_count = 1;
11616 }
11617 }
11618 }
11619
11620 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11621 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11622 return 0;
11623}
11624
11625/* Handling opcode 100 insns. */
11626
11627static int
11628arm_record_ld_st_multiple (insn_decode_record *arm_insn_r)
11629{
11630 struct regcache *reg_cache = arm_insn_r->regcache;
11631
11632 uint32_t register_list[16] = {0}, register_count = 0, register_bits = 0;
11633 uint32_t reg_src1 = 0, addr_mode = 0, no_of_regs = 0;
11634 uint32_t start_address = 0, index = 0;
11635 uint32_t record_buf[24], record_buf_mem[48];
11636
11637 ULONGEST u_regval[2] = {0};
11638
11639 /* This mode is exclusively for load and store multiple. */
11640 /* Handle incremenrt after/before and decrment after.before mode;
11641 Rn is changing depending on W bit, but as of now we store Rn too
11642 without optimization. */
11643
11644 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
11645 {
11646 /* LDM (1,2,3) where LDM (3) changes CPSR too. */
11647
11648 if (bit (arm_insn_r->arm_insn, 20) && !bit (arm_insn_r->arm_insn, 22))
11649 {
11650 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
11651 no_of_regs = 15;
11652 }
11653 else
11654 {
11655 register_bits = bits (arm_insn_r->arm_insn, 0, 14);
11656 no_of_regs = 14;
11657 }
11658 /* Get Rn. */
11659 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11660 while (register_bits)
11661 {
11662 if (register_bits & 0x00000001)
11663 register_list[register_count++] = 1;
11664 register_bits = register_bits >> 1;
11665 }
11666
11667 /* Extra space for Base Register and CPSR; wihtout optimization. */
11668 record_buf[register_count] = reg_src1;
11669 record_buf[register_count + 1] = ARM_PS_REGNUM;
11670 arm_insn_r->reg_rec_count = register_count + 2;
11671
11672 for (register_count = 0; register_count < no_of_regs; register_count++)
11673 {
11674 if (register_list[register_count])
11675 {
11676 /* Register_count gives total no of registers
11677 and dually working as reg number. */
11678 record_buf[index] = register_count;
11679 index++;
11680 }
11681 }
11682
11683 }
11684 else
11685 {
11686 /* It handles both STM(1) and STM(2). */
11687 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
11688
11689 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
11690 /* Get Rn. */
11691 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11692 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11693 while (register_bits)
11694 {
11695 if (register_bits & 0x00000001)
11696 register_count++;
11697 register_bits = register_bits >> 1;
11698 }
11699
11700 switch (addr_mode)
11701 {
11702 /* Decrement after. */
11703 case 0:
11704 start_address = (u_regval[0]) - (register_count * 4) + 4;
11705 arm_insn_r->mem_rec_count = register_count;
11706 while (register_count)
11707 {
11708 record_buf_mem[(register_count * 2) - 1] = start_address;
11709 record_buf_mem[(register_count * 2) - 2] = 4;
11710 start_address = start_address + 4;
11711 register_count--;
11712 }
11713 break;
11714
11715 /* Increment after. */
11716 case 1:
11717 start_address = u_regval[0];
11718 arm_insn_r->mem_rec_count = register_count;
11719 while (register_count)
11720 {
11721 record_buf_mem[(register_count * 2) - 1] = start_address;
11722 record_buf_mem[(register_count * 2) - 2] = 4;
11723 start_address = start_address + 4;
11724 register_count--;
11725 }
11726 break;
11727
11728 /* Decrement before. */
11729 case 2:
11730
11731 start_address = (u_regval[0]) - (register_count * 4);
11732 arm_insn_r->mem_rec_count = register_count;
11733 while (register_count)
11734 {
11735 record_buf_mem[(register_count * 2) - 1] = start_address;
11736 record_buf_mem[(register_count * 2) - 2] = 4;
11737 start_address = start_address + 4;
11738 register_count--;
11739 }
11740 break;
11741
11742 /* Increment before. */
11743 case 3:
11744 start_address = u_regval[0] + 4;
11745 arm_insn_r->mem_rec_count = register_count;
11746 while (register_count)
11747 {
11748 record_buf_mem[(register_count * 2) - 1] = start_address;
11749 record_buf_mem[(register_count * 2) - 2] = 4;
11750 start_address = start_address + 4;
11751 register_count--;
11752 }
11753 break;
11754
11755 default:
11756 gdb_assert_not_reached ("no decoding pattern found");
11757 break;
11758 }
11759
11760 /* Base register also changes; based on condition and W bit. */
11761 /* We save it anyway without optimization. */
11762 record_buf[0] = reg_src1;
11763 arm_insn_r->reg_rec_count = 1;
11764 }
11765
11766 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11767 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11768 return 0;
11769}
11770
11771/* Handling opcode 101 insns. */
11772
11773static int
11774arm_record_b_bl (insn_decode_record *arm_insn_r)
11775{
11776 uint32_t record_buf[8];
11777
11778 /* Handle B, BL, BLX(1) insns. */
11779 /* B simply branches so we do nothing here. */
11780 /* Note: BLX(1) doesnt fall here but instead it falls into
11781 extension space. */
11782 if (bit (arm_insn_r->arm_insn, 24))
11783 {
11784 record_buf[0] = ARM_LR_REGNUM;
11785 arm_insn_r->reg_rec_count = 1;
11786 }
11787
11788 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11789
11790 return 0;
11791}
11792
11793/* Handling opcode 110 insns. */
11794
11795static int
11796arm_record_coproc (insn_decode_record *arm_insn_r)
11797{
11798 printf_unfiltered (_("Process record does not support instruction "
11799 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11800 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11801
11802 return -1;
11803}
11804
11805/* Handling opcode 111 insns. */
11806
11807static int
11808arm_record_coproc_data_proc (insn_decode_record *arm_insn_r)
11809{
11810 struct gdbarch_tdep *tdep = gdbarch_tdep (arm_insn_r->gdbarch);
11811 struct regcache *reg_cache = arm_insn_r->regcache;
11812 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
11813
11814 /* Handle SWI insn; system call would be handled over here. */
11815
11816 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
11817 if (15 == arm_insn_r->opcode)
11818 {
11819 /* Handle arm syscall insn. */
11820 if (tdep->arm_swi_record != NULL)
11821 {
11822 ret = tdep->arm_swi_record(reg_cache);
11823 }
11824 else
11825 {
11826 printf_unfiltered (_("no syscall record support\n"));
11827 ret = -1;
11828 }
11829 }
11830
11831 printf_unfiltered (_("Process record does not support instruction "
11832 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
11833 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
11834 return ret;
11835}
11836
11837/* Handling opcode 000 insns. */
11838
11839static int
11840thumb_record_shift_add_sub (insn_decode_record *thumb_insn_r)
11841{
11842 uint32_t record_buf[8];
11843 uint32_t reg_src1 = 0;
11844
11845 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11846
11847 record_buf[0] = ARM_PS_REGNUM;
11848 record_buf[1] = reg_src1;
11849 thumb_insn_r->reg_rec_count = 2;
11850
11851 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11852
11853 return 0;
11854}
11855
11856
11857/* Handling opcode 001 insns. */
11858
11859static int
11860thumb_record_add_sub_cmp_mov (insn_decode_record *thumb_insn_r)
11861{
11862 uint32_t record_buf[8];
11863 uint32_t reg_src1 = 0;
11864
11865 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11866
11867 record_buf[0] = ARM_PS_REGNUM;
11868 record_buf[1] = reg_src1;
11869 thumb_insn_r->reg_rec_count = 2;
11870
11871 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11872
11873 return 0;
11874}
11875
11876/* Handling opcode 010 insns. */
11877
11878static int
11879thumb_record_ld_st_reg_offset (insn_decode_record *thumb_insn_r)
11880{
11881 struct regcache *reg_cache = thumb_insn_r->regcache;
11882 uint32_t record_buf[8], record_buf_mem[8];
11883
11884 uint32_t reg_src1 = 0, reg_src2 = 0;
11885 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
11886
11887 ULONGEST u_regval[2] = {0};
11888
11889 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
11890
11891 if (bit (thumb_insn_r->arm_insn, 12))
11892 {
11893 /* Handle load/store register offset. */
11894 opcode2 = bits (thumb_insn_r->arm_insn, 9, 10);
11895 if (opcode2 >= 12 && opcode2 <= 15)
11896 {
11897 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
11898 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
11899 record_buf[0] = reg_src1;
11900 thumb_insn_r->reg_rec_count = 1;
11901 }
11902 else if (opcode2 >= 8 && opcode2 <= 10)
11903 {
11904 /* STR(2), STRB(2), STRH(2) . */
11905 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11906 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
11907 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11908 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11909 if (8 == opcode2)
11910 record_buf_mem[0] = 4; /* STR (2). */
11911 else if (10 == opcode2)
11912 record_buf_mem[0] = 1; /* STRB (2). */
11913 else if (9 == opcode2)
11914 record_buf_mem[0] = 2; /* STRH (2). */
11915 record_buf_mem[1] = u_regval[0] + u_regval[1];
11916 thumb_insn_r->mem_rec_count = 1;
11917 }
11918 }
11919 else if (bit (thumb_insn_r->arm_insn, 11))
11920 {
11921 /* Handle load from literal pool. */
11922 /* LDR(3). */
11923 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
11924 record_buf[0] = reg_src1;
11925 thumb_insn_r->reg_rec_count = 1;
11926 }
11927 else if (opcode1)
11928 {
11929 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
11930 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
11931 if ((3 == opcode2) && (!opcode3))
11932 {
11933 /* Branch with exchange. */
11934 record_buf[0] = ARM_PS_REGNUM;
11935 thumb_insn_r->reg_rec_count = 1;
11936 }
11937 else
11938 {
11939 /* Format 8; special data processing insns. */
11940 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11941 record_buf[0] = ARM_PS_REGNUM;
11942 record_buf[1] = reg_src1;
11943 thumb_insn_r->reg_rec_count = 2;
11944 }
11945 }
11946 else
11947 {
11948 /* Format 5; data processing insns. */
11949 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11950 if (bit (thumb_insn_r->arm_insn, 7))
11951 {
11952 reg_src1 = reg_src1 + 8;
11953 }
11954 record_buf[0] = ARM_PS_REGNUM;
11955 record_buf[1] = reg_src1;
11956 thumb_insn_r->reg_rec_count = 2;
11957 }
11958
11959 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
11960 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
11961 record_buf_mem);
11962
11963 return 0;
11964}
11965
11966/* Handling opcode 001 insns. */
11967
11968static int
11969thumb_record_ld_st_imm_offset (insn_decode_record *thumb_insn_r)
11970{
11971 struct regcache *reg_cache = thumb_insn_r->regcache;
11972 uint32_t record_buf[8], record_buf_mem[8];
11973
11974 uint32_t reg_src1 = 0;
11975 uint32_t opcode = 0, immed_5 = 0;
11976
11977 ULONGEST u_regval = 0;
11978
11979 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
11980
11981 if (opcode)
11982 {
11983 /* LDR(1). */
11984 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
11985 record_buf[0] = reg_src1;
11986 thumb_insn_r->reg_rec_count = 1;
11987 }
11988 else
11989 {
11990 /* STR(1). */
11991 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
11992 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
11993 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11994 record_buf_mem[0] = 4;
11995 record_buf_mem[1] = u_regval + (immed_5 * 4);
11996 thumb_insn_r->mem_rec_count = 1;
11997 }
11998
11999 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12000 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12001 record_buf_mem);
12002
12003 return 0;
12004}
12005
12006/* Handling opcode 100 insns. */
12007
12008static int
12009thumb_record_ld_st_stack (insn_decode_record *thumb_insn_r)
12010{
12011 struct regcache *reg_cache = thumb_insn_r->regcache;
12012 uint32_t record_buf[8], record_buf_mem[8];
12013
12014 uint32_t reg_src1 = 0;
12015 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
12016
12017 ULONGEST u_regval = 0;
12018
12019 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
12020
12021 if (3 == opcode)
12022 {
12023 /* LDR(4). */
12024 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12025 record_buf[0] = reg_src1;
12026 thumb_insn_r->reg_rec_count = 1;
12027 }
12028 else if (1 == opcode)
12029 {
12030 /* LDRH(1). */
12031 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
12032 record_buf[0] = reg_src1;
12033 thumb_insn_r->reg_rec_count = 1;
12034 }
12035 else if (2 == opcode)
12036 {
12037 /* STR(3). */
12038 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
12039 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
12040 record_buf_mem[0] = 4;
12041 record_buf_mem[1] = u_regval + (immed_8 * 4);
12042 thumb_insn_r->mem_rec_count = 1;
12043 }
12044 else if (0 == opcode)
12045 {
12046 /* STRH(1). */
12047 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
12048 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
12049 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12050 record_buf_mem[0] = 2;
12051 record_buf_mem[1] = u_regval + (immed_5 * 2);
12052 thumb_insn_r->mem_rec_count = 1;
12053 }
12054
12055 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12056 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12057 record_buf_mem);
12058
12059 return 0;
12060}
12061
12062/* Handling opcode 101 insns. */
12063
12064static int
12065thumb_record_misc (insn_decode_record *thumb_insn_r)
12066{
12067 struct regcache *reg_cache = thumb_insn_r->regcache;
12068
12069 uint32_t opcode = 0, opcode1 = 0, opcode2 = 0;
12070 uint32_t register_bits = 0, register_count = 0;
12071 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
12072 uint32_t record_buf[24], record_buf_mem[48];
12073 uint32_t reg_src1;
12074
12075 ULONGEST u_regval = 0;
12076
12077 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
12078 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12079 opcode2 = bits (thumb_insn_r->arm_insn, 9, 12);
12080
12081 if (14 == opcode2)
12082 {
12083 /* POP. */
12084 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12085 while (register_bits)
12086 {
12087 if (register_bits & 0x00000001)
12088 register_list[register_count++] = 1;
12089 register_bits = register_bits >> 1;
12090 }
12091 record_buf[register_count] = ARM_PS_REGNUM;
12092 record_buf[register_count + 1] = ARM_SP_REGNUM;
12093 thumb_insn_r->reg_rec_count = register_count + 2;
12094 for (register_count = 0; register_count < 8; register_count++)
12095 {
12096 if (register_list[register_count])
12097 {
12098 record_buf[index] = register_count;
12099 index++;
12100 }
12101 }
12102 }
12103 else if (10 == opcode2)
12104 {
12105 /* PUSH. */
12106 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12107 regcache_raw_read_unsigned (reg_cache, ARM_PC_REGNUM, &u_regval);
12108 while (register_bits)
12109 {
12110 if (register_bits & 0x00000001)
12111 register_count++;
12112 register_bits = register_bits >> 1;
12113 }
12114 start_address = u_regval - \
12115 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
12116 thumb_insn_r->mem_rec_count = register_count;
12117 while (register_count)
12118 {
12119 record_buf_mem[(register_count * 2) - 1] = start_address;
12120 record_buf_mem[(register_count * 2) - 2] = 4;
12121 start_address = start_address + 4;
12122 register_count--;
12123 }
12124 record_buf[0] = ARM_SP_REGNUM;
12125 thumb_insn_r->reg_rec_count = 1;
12126 }
12127 else if (0x1E == opcode1)
12128 {
12129 /* BKPT insn. */
12130 /* Handle enhanced software breakpoint insn, BKPT. */
12131 /* CPSR is changed to be executed in ARM state, disabling normal
12132 interrupts, entering abort mode. */
12133 /* According to high vector configuration PC is set. */
12134 /* User hits breakpoint and type reverse, in that case, we need to go back with
12135 previous CPSR and Program Counter. */
12136 record_buf[0] = ARM_PS_REGNUM;
12137 record_buf[1] = ARM_LR_REGNUM;
12138 thumb_insn_r->reg_rec_count = 2;
12139 /* We need to save SPSR value, which is not yet done. */
12140 printf_unfiltered (_("Process record does not support instruction "
12141 "0x%0x at address %s.\n"),
12142 thumb_insn_r->arm_insn,
12143 paddress (thumb_insn_r->gdbarch,
12144 thumb_insn_r->this_addr));
12145 return -1;
12146 }
12147 else if ((0 == opcode) || (1 == opcode))
12148 {
12149 /* ADD(5), ADD(6). */
12150 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12151 record_buf[0] = reg_src1;
12152 thumb_insn_r->reg_rec_count = 1;
12153 }
12154 else if (2 == opcode)
12155 {
12156 /* ADD(7), SUB(4). */
12157 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12158 record_buf[0] = ARM_SP_REGNUM;
12159 thumb_insn_r->reg_rec_count = 1;
12160 }
12161
12162 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12163 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12164 record_buf_mem);
12165
12166 return 0;
12167}
12168
12169/* Handling opcode 110 insns. */
12170
12171static int
12172thumb_record_ldm_stm_swi (insn_decode_record *thumb_insn_r)
12173{
12174 struct gdbarch_tdep *tdep = gdbarch_tdep (thumb_insn_r->gdbarch);
12175 struct regcache *reg_cache = thumb_insn_r->regcache;
12176
12177 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
12178 uint32_t reg_src1 = 0;
12179 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
12180 uint32_t register_list[8] = {0}, index = 0, start_address = 0;
12181 uint32_t record_buf[24], record_buf_mem[48];
12182
12183 ULONGEST u_regval = 0;
12184
12185 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
12186 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
12187
12188 if (1 == opcode2)
12189 {
12190
12191 /* LDMIA. */
12192 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12193 /* Get Rn. */
12194 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12195 while (register_bits)
12196 {
12197 if (register_bits & 0x00000001)
12198 register_list[register_count++] = 1;
12199 register_bits = register_bits >> 1;
12200 }
12201 record_buf[register_count] = reg_src1;
12202 thumb_insn_r->reg_rec_count = register_count + 1;
12203 for (register_count = 0; register_count < 8; register_count++)
12204 {
12205 if (register_list[register_count])
12206 {
12207 record_buf[index] = register_count;
12208 index++;
12209 }
12210 }
12211 }
12212 else if (0 == opcode2)
12213 {
12214 /* It handles both STMIA. */
12215 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
12216 /* Get Rn. */
12217 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
12218 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
12219 while (register_bits)
12220 {
12221 if (register_bits & 0x00000001)
12222 register_count++;
12223 register_bits = register_bits >> 1;
12224 }
12225 start_address = u_regval;
12226 thumb_insn_r->mem_rec_count = register_count;
12227 while (register_count)
12228 {
12229 record_buf_mem[(register_count * 2) - 1] = start_address;
12230 record_buf_mem[(register_count * 2) - 2] = 4;
12231 start_address = start_address + 4;
12232 register_count--;
12233 }
12234 }
12235 else if (0x1F == opcode1)
12236 {
12237 /* Handle arm syscall insn. */
12238 if (tdep->arm_swi_record != NULL)
12239 {
12240 ret = tdep->arm_swi_record(reg_cache);
12241 }
12242 else
12243 {
12244 printf_unfiltered (_("no syscall record support\n"));
12245 return -1;
12246 }
12247 }
12248
12249 /* B (1), conditional branch is automatically taken care in process_record,
12250 as PC is saved there. */
12251
12252 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12253 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
12254 record_buf_mem);
12255
12256 return ret;
12257}
12258
12259/* Handling opcode 111 insns. */
12260
12261static int
12262thumb_record_branch (insn_decode_record *thumb_insn_r)
12263{
12264 uint32_t record_buf[8];
12265 uint32_t bits_h = 0;
12266
12267 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
12268
12269 if (2 == bits_h || 3 == bits_h)
12270 {
12271 /* BL */
12272 record_buf[0] = ARM_LR_REGNUM;
12273 thumb_insn_r->reg_rec_count = 1;
12274 }
12275 else if (1 == bits_h)
12276 {
12277 /* BLX(1). */
12278 record_buf[0] = ARM_PS_REGNUM;
12279 record_buf[1] = ARM_LR_REGNUM;
12280 thumb_insn_r->reg_rec_count = 2;
12281 }
12282
12283 /* B(2) is automatically taken care in process_record, as PC is
12284 saved there. */
12285
12286 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
12287
12288 return 0;
12289}
12290
12291
12292/* Extracts arm/thumb/thumb2 insn depending on the size, and returns 0 on success
12293and positive val on fauilure. */
12294
12295static int
12296extract_arm_insn (insn_decode_record *insn_record, uint32_t insn_size)
12297{
12298 gdb_byte buf[insn_size];
12299
12300 memset (&buf[0], 0, insn_size);
12301
12302 if (target_read_memory (insn_record->this_addr, &buf[0], insn_size))
12303 return 1;
12304 insn_record->arm_insn = (uint32_t) extract_unsigned_integer (&buf[0],
12305 insn_size,
12306 gdbarch_byte_order (insn_record->gdbarch));
12307 return 0;
12308}
12309
12310typedef int (*sti_arm_hdl_fp_t) (insn_decode_record*);
12311
12312/* Decode arm/thumb insn depending on condition cods and opcodes; and
12313 dispatch it. */
12314
12315static int
12316decode_insn (insn_decode_record *arm_record, record_type_t record_type,
12317 uint32_t insn_size)
12318{
12319
12320 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm instruction. */
12321 static const sti_arm_hdl_fp_t const arm_handle_insn[8] =
12322 {
12323 arm_record_data_proc_misc_ld_str, /* 000. */
12324 arm_record_data_proc_imm, /* 001. */
12325 arm_record_ld_st_imm_offset, /* 010. */
12326 arm_record_ld_st_reg_offset, /* 011. */
12327 arm_record_ld_st_multiple, /* 100. */
12328 arm_record_b_bl, /* 101. */
12329 arm_record_coproc, /* 110. */
12330 arm_record_coproc_data_proc /* 111. */
12331 };
12332
12333 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb instruction. */
12334 static const sti_arm_hdl_fp_t const thumb_handle_insn[8] =
12335 { \
12336 thumb_record_shift_add_sub, /* 000. */
12337 thumb_record_add_sub_cmp_mov, /* 001. */
12338 thumb_record_ld_st_reg_offset, /* 010. */
12339 thumb_record_ld_st_imm_offset, /* 011. */
12340 thumb_record_ld_st_stack, /* 100. */
12341 thumb_record_misc, /* 101. */
12342 thumb_record_ldm_stm_swi, /* 110. */
12343 thumb_record_branch /* 111. */
12344 };
12345
12346 uint32_t ret = 0; /* return value: negative:failure 0:success. */
12347 uint32_t insn_id = 0;
12348
12349 if (extract_arm_insn (arm_record, insn_size))
12350 {
12351 if (record_debug)
12352 {
12353 printf_unfiltered (_("Process record: error reading memory at "
12354 "addr %s len = %d.\n"),
12355 paddress (arm_record->gdbarch, arm_record->this_addr), insn_size);
12356 }
12357 return -1;
12358 }
12359 else if (ARM_RECORD == record_type)
12360 {
12361 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
12362 insn_id = bits (arm_record->arm_insn, 25, 27);
12363 ret = arm_record_extension_space (arm_record);
12364 /* If this insn has fallen into extension space
12365 then we need not decode it anymore. */
12366 if (ret != -1 && !INSN_RECORDED(arm_record))
12367 {
12368 ret = arm_handle_insn[insn_id] (arm_record);
12369 }
12370 }
12371 else if (THUMB_RECORD == record_type)
12372 {
12373 /* As thumb does not have condition codes, we set negative. */
12374 arm_record->cond = -1;
12375 insn_id = bits (arm_record->arm_insn, 13, 15);
12376 ret = thumb_handle_insn[insn_id] (arm_record);
12377 }
12378 else if (THUMB2_RECORD == record_type)
12379 {
12380 printf_unfiltered (_("Process record doesnt support thumb32 instruction "
12381 "0x%0x at address %s.\n"),arm_record->arm_insn,
12382 paddress (arm_record->gdbarch,
12383 arm_record->this_addr));
12384 ret = -1;
12385 }
12386 else
12387 {
12388 /* Throw assertion. */
12389 gdb_assert_not_reached ("not a valid instruction, could not decode");
12390 }
12391
12392 return ret;
12393}
12394
12395
12396/* Cleans up local record registers and memory allocations. */
12397
12398static void
12399deallocate_reg_mem (insn_decode_record *record)
12400{
12401 xfree (record->arm_regs);
12402 xfree (record->arm_mems);
12403}
12404
12405
12406/* Parse the current instruction and record the values of the registers and
12407 memory that will be changed in current instruction to record_arch_list".
12408 Return -1 if something is wrong. */
12409
12410int
12411arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
12412 CORE_ADDR insn_addr)
12413{
12414
12415 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
12416 uint32_t no_of_rec = 0;
12417 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
12418 ULONGEST t_bit = 0, insn_id = 0;
12419
12420 ULONGEST u_regval = 0;
12421
12422 insn_decode_record arm_record;
12423
12424 memset (&arm_record, 0, sizeof (insn_decode_record));
12425 arm_record.regcache = regcache;
12426 arm_record.this_addr = insn_addr;
12427 arm_record.gdbarch = gdbarch;
12428
12429
12430 if (record_debug > 1)
12431 {
12432 fprintf_unfiltered (gdb_stdlog, "Process record: arm_process_record "
12433 "addr = %s\n",
12434 paddress (gdbarch, arm_record.this_addr));
12435 }
12436
12437 if (extract_arm_insn (&arm_record, 2))
12438 {
12439 if (record_debug)
12440 {
12441 printf_unfiltered (_("Process record: error reading memory at "
12442 "addr %s len = %d.\n"),
12443 paddress (arm_record.gdbarch,
12444 arm_record.this_addr), 2);
12445 }
12446 return -1;
12447 }
12448
12449 /* Check the insn, whether it is thumb or arm one. */
12450
12451 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
12452 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
12453
12454
12455 if (!(u_regval & t_bit))
12456 {
12457 /* We are decoding arm insn. */
12458 ret = decode_insn (&arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
12459 }
12460 else
12461 {
12462 insn_id = bits (arm_record.arm_insn, 11, 15);
12463 /* is it thumb2 insn? */
12464 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
12465 {
12466 ret = decode_insn (&arm_record, THUMB2_RECORD,
12467 THUMB2_INSN_SIZE_BYTES);
12468 }
12469 else
12470 {
12471 /* We are decoding thumb insn. */
12472 ret = decode_insn (&arm_record, THUMB_RECORD, THUMB_INSN_SIZE_BYTES);
12473 }
12474 }
12475
12476 if (0 == ret)
12477 {
12478 /* Record registers. */
12479 record_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
12480 if (arm_record.arm_regs)
12481 {
12482 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
12483 {
12484 if (record_arch_list_add_reg (arm_record.regcache ,
12485 arm_record.arm_regs[no_of_rec]))
12486 ret = -1;
12487 }
12488 }
12489 /* Record memories. */
12490 if (arm_record.arm_mems)
12491 {
12492 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
12493 {
12494 if (record_arch_list_add_mem
12495 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
12496 arm_record.arm_mems[no_of_rec].len))
12497 ret = -1;
12498 }
12499 }
12500
12501 if (record_arch_list_add_end ())
12502 ret = -1;
12503 }
12504
12505
12506 deallocate_reg_mem (&arm_record);
12507
12508 return ret;
12509}
12510
This page took 1.451342 seconds and 4 git commands to generate.