Add generated source files and fix thinko in aarch64-asm.c
[binutils-gdb.git] / gdb / arm-tdep.c
blobf1aa730579bcd63bf04b8cf9b8f8fecce1d92b0e
1 /* Common target dependent code for GDB on ARM systems.
3 Copyright (C) 1988-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "defs.h"
22 #include <ctype.h>
24 #include "frame.h"
25 #include "language.h"
26 #include "inferior.h"
27 #include "infrun.h"
28 #include "gdbcmd.h"
29 #include "gdbcore.h"
30 #include "dis-asm.h"
31 #include "disasm.h"
32 #include "regcache.h"
33 #include "reggroups.h"
34 #include "target-float.h"
35 #include "value.h"
36 #include "arch-utils.h"
37 #include "osabi.h"
38 #include "frame-unwind.h"
39 #include "frame-base.h"
40 #include "trad-frame.h"
41 #include "objfiles.h"
42 #include "dwarf2.h"
43 #include "dwarf2/frame.h"
44 #include "gdbtypes.h"
45 #include "prologue-value.h"
46 #include "remote.h"
47 #include "target-descriptions.h"
48 #include "user-regs.h"
49 #include "observable.h"
50 #include "count-one-bits.h"
52 #include "arch/arm.h"
53 #include "arch/arm-get-next-pcs.h"
54 #include "arm-tdep.h"
55 #include "sim/sim-arm.h"
57 #include "elf-bfd.h"
58 #include "coff/internal.h"
59 #include "elf/arm.h"
61 #include "record.h"
62 #include "record-full.h"
63 #include <algorithm>
65 #include "producer.h"
67 #if GDB_SELF_TEST
68 #include "gdbsupport/selftest.h"
69 #endif
71 static bool arm_debug;
73 /* Print an "arm" debug statement. */
75 #define arm_debug_printf(fmt, ...) \
76 debug_prefixed_printf_cond (arm_debug, "arm", fmt, ##__VA_ARGS__)
78 /* Macros for setting and testing a bit in a minimal symbol that marks
79 it as Thumb function. The MSB of the minimal symbol's "info" field
80 is used for this purpose.
82 MSYMBOL_SET_SPECIAL Actually sets the "special" bit.
83 MSYMBOL_IS_SPECIAL Tests the "special" bit in a minimal symbol. */
85 #define MSYMBOL_SET_SPECIAL(msym) \
86 (msym)->set_target_flag_1 (true)
88 #define MSYMBOL_IS_SPECIAL(msym) \
89 (msym)->target_flag_1 ()
91 struct arm_mapping_symbol
93 CORE_ADDR value;
94 char type;
96 bool operator< (const arm_mapping_symbol &other) const
97 { return this->value < other.value; }
100 typedef std::vector<arm_mapping_symbol> arm_mapping_symbol_vec;
102 struct arm_per_bfd
104 explicit arm_per_bfd (size_t num_sections)
105 : section_maps (new arm_mapping_symbol_vec[num_sections]),
106 section_maps_sorted (new bool[num_sections] ())
109 DISABLE_COPY_AND_ASSIGN (arm_per_bfd);
111 /* Information about mapping symbols ($a, $d, $t) in the objfile.
113 The format is an array of vectors of arm_mapping_symbols, there is one
114 vector for each section of the objfile (the array is index by BFD section
115 index).
117 For each section, the vector of arm_mapping_symbol is sorted by
118 symbol value (address). */
119 std::unique_ptr<arm_mapping_symbol_vec[]> section_maps;
121 /* For each corresponding element of section_maps above, is this vector
122 sorted. */
123 std::unique_ptr<bool[]> section_maps_sorted;
126 /* Per-bfd data used for mapping symbols. */
127 static const registry<bfd>::key<arm_per_bfd> arm_bfd_data_key;
129 /* The list of available "set arm ..." and "show arm ..." commands. */
130 static struct cmd_list_element *setarmcmdlist = NULL;
131 static struct cmd_list_element *showarmcmdlist = NULL;
133 /* The type of floating-point to use. Keep this in sync with enum
134 arm_float_model, and the help string in _initialize_arm_tdep. */
135 static const char *const fp_model_strings[] =
137 "auto",
138 "softfpa",
139 "fpa",
140 "softvfp",
141 "vfp",
142 NULL
145 /* A variable that can be configured by the user. */
146 static enum arm_float_model arm_fp_model = ARM_FLOAT_AUTO;
147 static const char *current_fp_model = "auto";
149 /* The ABI to use. Keep this in sync with arm_abi_kind. */
150 static const char *const arm_abi_strings[] =
152 "auto",
153 "APCS",
154 "AAPCS",
155 NULL
158 /* A variable that can be configured by the user. */
159 static enum arm_abi_kind arm_abi_global = ARM_ABI_AUTO;
160 static const char *arm_abi_string = "auto";
162 /* The execution mode to assume. */
163 static const char *const arm_mode_strings[] =
165 "auto",
166 "arm",
167 "thumb",
168 NULL
171 static const char *arm_fallback_mode_string = "auto";
172 static const char *arm_force_mode_string = "auto";
174 /* The standard register names, and all the valid aliases for them. Note
175 that `fp', `sp' and `pc' are not added in this alias list, because they
176 have been added as builtin user registers in
177 std-regs.c:_initialize_frame_reg. */
178 static const struct
180 const char *name;
181 int regnum;
182 } arm_register_aliases[] = {
183 /* Basic register numbers. */
184 { "r0", 0 },
185 { "r1", 1 },
186 { "r2", 2 },
187 { "r3", 3 },
188 { "r4", 4 },
189 { "r5", 5 },
190 { "r6", 6 },
191 { "r7", 7 },
192 { "r8", 8 },
193 { "r9", 9 },
194 { "r10", 10 },
195 { "r11", 11 },
196 { "r12", 12 },
197 { "r13", 13 },
198 { "r14", 14 },
199 { "r15", 15 },
200 /* Synonyms (argument and variable registers). */
201 { "a1", 0 },
202 { "a2", 1 },
203 { "a3", 2 },
204 { "a4", 3 },
205 { "v1", 4 },
206 { "v2", 5 },
207 { "v3", 6 },
208 { "v4", 7 },
209 { "v5", 8 },
210 { "v6", 9 },
211 { "v7", 10 },
212 { "v8", 11 },
213 /* Other platform-specific names for r9. */
214 { "sb", 9 },
215 { "tr", 9 },
216 /* Special names. */
217 { "ip", 12 },
218 { "lr", 14 },
219 /* Names used by GCC (not listed in the ARM EABI). */
220 { "sl", 10 },
221 /* A special name from the older ATPCS. */
222 { "wr", 7 },
225 static const char *const arm_register_names[] =
226 {"r0", "r1", "r2", "r3", /* 0 1 2 3 */
227 "r4", "r5", "r6", "r7", /* 4 5 6 7 */
228 "r8", "r9", "r10", "r11", /* 8 9 10 11 */
229 "r12", "sp", "lr", "pc", /* 12 13 14 15 */
230 "f0", "f1", "f2", "f3", /* 16 17 18 19 */
231 "f4", "f5", "f6", "f7", /* 20 21 22 23 */
232 "fps", "cpsr" }; /* 24 25 */
234 /* Holds the current set of options to be passed to the disassembler. */
235 static char *arm_disassembler_options;
237 /* Valid register name styles. */
238 static const char **valid_disassembly_styles;
240 /* Disassembly style to use. Default to "std" register names. */
241 static const char *disassembly_style;
243 /* All possible arm target descriptors. */
244 static struct target_desc *tdesc_arm_list[ARM_FP_TYPE_INVALID][2];
245 static struct target_desc *tdesc_arm_mprofile_list[ARM_M_TYPE_INVALID];
247 /* This is used to keep the bfd arch_info in sync with the disassembly
248 style. */
249 static void set_disassembly_style_sfunc (const char *, int,
250 struct cmd_list_element *);
251 static void show_disassembly_style_sfunc (struct ui_file *, int,
252 struct cmd_list_element *,
253 const char *);
255 static enum register_status arm_neon_quad_read (struct gdbarch *gdbarch,
256 readable_regcache *regcache,
257 int regnum, gdb_byte *buf);
258 static void arm_neon_quad_write (struct gdbarch *gdbarch,
259 struct regcache *regcache,
260 int regnum, const gdb_byte *buf);
262 static CORE_ADDR
263 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
266 /* get_next_pcs operations. */
267 static struct arm_get_next_pcs_ops arm_get_next_pcs_ops = {
268 arm_get_next_pcs_read_memory_unsigned_integer,
269 arm_get_next_pcs_syscall_next_pc,
270 arm_get_next_pcs_addr_bits_remove,
271 arm_get_next_pcs_is_thumb,
272 NULL,
275 struct arm_prologue_cache
277 /* The stack pointer at the time this frame was created; i.e. the
278 caller's stack pointer when this function was called. It is used
279 to identify this frame. */
280 CORE_ADDR sp;
282 /* Additional stack pointers used by M-profile with Security extension. */
283 /* Use msp_s / psp_s to hold the values of msp / psp when there is
284 no Security extension. */
285 CORE_ADDR msp_s;
286 CORE_ADDR msp_ns;
287 CORE_ADDR psp_s;
288 CORE_ADDR psp_ns;
290 /* Active stack pointer. */
291 int active_sp_regnum;
292 int active_msp_regnum;
293 int active_psp_regnum;
295 /* The frame base for this frame is just prev_sp - frame size.
296 FRAMESIZE is the distance from the frame pointer to the
297 initial stack pointer. */
299 int framesize;
301 /* The register used to hold the frame pointer for this frame. */
302 int framereg;
304 /* True if the return address is signed, false otherwise. */
305 std::optional<bool> ra_signed_state;
307 /* Saved register offsets. */
308 trad_frame_saved_reg *saved_regs;
310 arm_prologue_cache() = default;
314 /* Reconstruct T bit in program status register from LR value. */
316 static inline ULONGEST
317 reconstruct_t_bit(struct gdbarch *gdbarch, CORE_ADDR lr, ULONGEST psr)
319 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
320 if (IS_THUMB_ADDR (lr))
321 psr |= t_bit;
322 else
323 psr &= ~t_bit;
325 return psr;
328 /* Initialize CACHE fields for which zero is not adequate (CACHE is
329 expected to have been ZALLOC'ed before calling this function). */
331 static void
332 arm_cache_init (struct arm_prologue_cache *cache, struct gdbarch *gdbarch)
334 cache->active_sp_regnum = ARM_SP_REGNUM;
336 cache->saved_regs = trad_frame_alloc_saved_regs (gdbarch);
339 /* Similar to the previous function, but extracts GDBARCH from FRAME. */
341 static void
342 arm_cache_init (struct arm_prologue_cache *cache, frame_info_ptr frame)
344 struct gdbarch *gdbarch = get_frame_arch (frame);
345 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
347 arm_cache_init (cache, gdbarch);
348 cache->sp = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
350 if (tdep->have_sec_ext)
352 const CORE_ADDR msp_val
353 = get_frame_register_unsigned (frame, tdep->m_profile_msp_regnum);
354 const CORE_ADDR psp_val
355 = get_frame_register_unsigned (frame, tdep->m_profile_psp_regnum);
357 cache->msp_s
358 = get_frame_register_unsigned (frame, tdep->m_profile_msp_s_regnum);
359 cache->msp_ns
360 = get_frame_register_unsigned (frame, tdep->m_profile_msp_ns_regnum);
361 cache->psp_s
362 = get_frame_register_unsigned (frame, tdep->m_profile_psp_s_regnum);
363 cache->psp_ns
364 = get_frame_register_unsigned (frame, tdep->m_profile_psp_ns_regnum);
366 /* Identify what msp is alias for (msp_s or msp_ns). */
367 if (msp_val == cache->msp_s)
368 cache->active_msp_regnum = tdep->m_profile_msp_s_regnum;
369 else if (msp_val == cache->msp_ns)
370 cache->active_msp_regnum = tdep->m_profile_msp_ns_regnum;
371 else
373 warning (_("Invalid state, unable to determine msp alias, assuming "
374 "msp_s."));
375 cache->active_msp_regnum = tdep->m_profile_msp_s_regnum;
378 /* Identify what psp is alias for (psp_s or psp_ns). */
379 if (psp_val == cache->psp_s)
380 cache->active_psp_regnum = tdep->m_profile_psp_s_regnum;
381 else if (psp_val == cache->psp_ns)
382 cache->active_psp_regnum = tdep->m_profile_psp_ns_regnum;
383 else
385 warning (_("Invalid state, unable to determine psp alias, assuming "
386 "psp_s."));
387 cache->active_psp_regnum = tdep->m_profile_psp_s_regnum;
390 /* Identify what sp is alias for (msp_s, msp_ns, psp_s or psp_ns). */
391 if (msp_val == cache->sp)
392 cache->active_sp_regnum = cache->active_msp_regnum;
393 else if (psp_val == cache->sp)
394 cache->active_sp_regnum = cache->active_psp_regnum;
395 else
397 warning (_("Invalid state, unable to determine sp alias, assuming "
398 "msp."));
399 cache->active_sp_regnum = cache->active_msp_regnum;
402 else if (tdep->is_m)
404 cache->msp_s
405 = get_frame_register_unsigned (frame, tdep->m_profile_msp_regnum);
406 cache->psp_s
407 = get_frame_register_unsigned (frame, tdep->m_profile_psp_regnum);
409 /* Identify what sp is alias for (msp or psp). */
410 if (cache->msp_s == cache->sp)
411 cache->active_sp_regnum = tdep->m_profile_msp_regnum;
412 else if (cache->psp_s == cache->sp)
413 cache->active_sp_regnum = tdep->m_profile_psp_regnum;
414 else
416 warning (_("Invalid state, unable to determine sp alias, assuming "
417 "msp."));
418 cache->active_sp_regnum = tdep->m_profile_msp_regnum;
421 else
423 cache->msp_s
424 = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
426 cache->active_sp_regnum = ARM_SP_REGNUM;
430 /* Return the requested stack pointer value (in REGNUM), taking into
431 account whether we have a Security extension or an M-profile
432 CPU. */
434 static CORE_ADDR
435 arm_cache_get_sp_register (struct arm_prologue_cache *cache,
436 arm_gdbarch_tdep *tdep, int regnum)
438 if (tdep->have_sec_ext)
440 if (regnum == tdep->m_profile_msp_s_regnum)
441 return cache->msp_s;
442 if (regnum == tdep->m_profile_msp_ns_regnum)
443 return cache->msp_ns;
444 if (regnum == tdep->m_profile_psp_s_regnum)
445 return cache->psp_s;
446 if (regnum == tdep->m_profile_psp_ns_regnum)
447 return cache->psp_ns;
448 if (regnum == tdep->m_profile_msp_regnum)
449 return arm_cache_get_sp_register (cache, tdep, cache->active_msp_regnum);
450 if (regnum == tdep->m_profile_psp_regnum)
451 return arm_cache_get_sp_register (cache, tdep, cache->active_psp_regnum);
452 if (regnum == ARM_SP_REGNUM)
453 return arm_cache_get_sp_register (cache, tdep, cache->active_sp_regnum);
455 else if (tdep->is_m)
457 if (regnum == tdep->m_profile_msp_regnum)
458 return cache->msp_s;
459 if (regnum == tdep->m_profile_psp_regnum)
460 return cache->psp_s;
461 if (regnum == ARM_SP_REGNUM)
462 return arm_cache_get_sp_register (cache, tdep, cache->active_sp_regnum);
464 else if (regnum == ARM_SP_REGNUM)
465 return cache->sp;
467 gdb_assert_not_reached ("Invalid SP selection");
470 /* Return the previous stack address, depending on which SP register
471 is active. */
473 static CORE_ADDR
474 arm_cache_get_prev_sp_value (struct arm_prologue_cache *cache, arm_gdbarch_tdep *tdep)
476 CORE_ADDR val = arm_cache_get_sp_register (cache, tdep, cache->active_sp_regnum);
477 return val;
480 /* Set the active stack pointer to VAL. */
482 static void
483 arm_cache_set_active_sp_value (struct arm_prologue_cache *cache,
484 arm_gdbarch_tdep *tdep, CORE_ADDR val)
486 if (tdep->have_sec_ext)
488 if (cache->active_sp_regnum == tdep->m_profile_msp_s_regnum)
489 cache->msp_s = val;
490 else if (cache->active_sp_regnum == tdep->m_profile_msp_ns_regnum)
491 cache->msp_ns = val;
492 else if (cache->active_sp_regnum == tdep->m_profile_psp_s_regnum)
493 cache->psp_s = val;
494 else if (cache->active_sp_regnum == tdep->m_profile_psp_ns_regnum)
495 cache->psp_ns = val;
497 return;
499 else if (tdep->is_m)
501 if (cache->active_sp_regnum == tdep->m_profile_msp_regnum)
502 cache->msp_s = val;
503 else if (cache->active_sp_regnum == tdep->m_profile_psp_regnum)
504 cache->psp_s = val;
506 return;
508 else if (cache->active_sp_regnum == ARM_SP_REGNUM)
510 cache->sp = val;
511 return;
514 gdb_assert_not_reached ("Invalid SP selection");
517 /* Return true if REGNUM is one of the alternative stack pointers. */
519 static bool
520 arm_is_alternative_sp_register (arm_gdbarch_tdep *tdep, int regnum)
522 if ((regnum == tdep->m_profile_msp_regnum)
523 || (regnum == tdep->m_profile_msp_s_regnum)
524 || (regnum == tdep->m_profile_msp_ns_regnum)
525 || (regnum == tdep->m_profile_psp_regnum)
526 || (regnum == tdep->m_profile_psp_s_regnum)
527 || (regnum == tdep->m_profile_psp_ns_regnum))
528 return true;
529 else
530 return false;
533 /* Set the active stack pointer to SP_REGNUM. */
535 static void
536 arm_cache_switch_prev_sp (struct arm_prologue_cache *cache,
537 arm_gdbarch_tdep *tdep, int sp_regnum)
539 gdb_assert (arm_is_alternative_sp_register (tdep, sp_regnum));
541 if (tdep->have_sec_ext)
543 gdb_assert (sp_regnum != tdep->m_profile_msp_regnum
544 && sp_regnum != tdep->m_profile_psp_regnum);
546 if (sp_regnum == tdep->m_profile_msp_s_regnum
547 || sp_regnum == tdep->m_profile_psp_s_regnum)
549 cache->active_msp_regnum = tdep->m_profile_msp_s_regnum;
550 cache->active_psp_regnum = tdep->m_profile_psp_s_regnum;
552 else if (sp_regnum == tdep->m_profile_msp_ns_regnum
553 || sp_regnum == tdep->m_profile_psp_ns_regnum)
555 cache->active_msp_regnum = tdep->m_profile_msp_ns_regnum;
556 cache->active_psp_regnum = tdep->m_profile_psp_ns_regnum;
560 cache->active_sp_regnum = sp_regnum;
563 namespace {
565 /* Abstract class to read ARM instructions from memory. */
567 class arm_instruction_reader
569 public:
570 /* Read a 4 bytes instruction from memory using the BYTE_ORDER endianness. */
571 virtual uint32_t read (CORE_ADDR memaddr, bfd_endian byte_order) const = 0;
574 /* Read instructions from target memory. */
576 class target_arm_instruction_reader : public arm_instruction_reader
578 public:
579 uint32_t read (CORE_ADDR memaddr, bfd_endian byte_order) const override
581 return read_code_unsigned_integer (memaddr, 4, byte_order);
585 } /* namespace */
587 static CORE_ADDR arm_analyze_prologue
588 (struct gdbarch *gdbarch, CORE_ADDR prologue_start, CORE_ADDR prologue_end,
589 struct arm_prologue_cache *cache, const arm_instruction_reader &insn_reader);
591 /* Architecture version for displaced stepping. This effects the behaviour of
592 certain instructions, and really should not be hard-wired. */
594 #define DISPLACED_STEPPING_ARCH_VERSION 5
596 /* See arm-tdep.h. */
598 bool arm_apcs_32 = true;
599 bool arm_unwind_secure_frames = true;
601 /* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode. */
604 arm_psr_thumb_bit (struct gdbarch *gdbarch)
606 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
608 if (tdep->is_m)
609 return XPSR_T;
610 else
611 return CPSR_T;
614 /* Determine if the processor is currently executing in Thumb mode. */
617 arm_is_thumb (struct regcache *regcache)
619 ULONGEST cpsr;
620 ULONGEST t_bit = arm_psr_thumb_bit (regcache->arch ());
622 cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
624 return (cpsr & t_bit) != 0;
627 /* Determine if FRAME is executing in Thumb mode. FRAME must be an ARM
628 frame. */
631 arm_frame_is_thumb (frame_info_ptr frame)
633 /* Check the architecture of FRAME. */
634 struct gdbarch *gdbarch = get_frame_arch (frame);
635 gdb_assert (gdbarch_bfd_arch_info (gdbarch)->arch == bfd_arch_arm);
637 /* Every ARM frame unwinder can unwind the T bit of the CPSR, either
638 directly (from a signal frame or dummy frame) or by interpreting
639 the saved LR (from a prologue or DWARF frame). So consult it and
640 trust the unwinders. */
641 CORE_ADDR cpsr = get_frame_register_unsigned (frame, ARM_PS_REGNUM);
643 /* Find and extract the thumb bit. */
644 ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
645 return (cpsr & t_bit) != 0;
648 /* Search for the mapping symbol covering MEMADDR. If one is found,
649 return its type. Otherwise, return 0. If START is non-NULL,
650 set *START to the location of the mapping symbol. */
652 static char
653 arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
655 struct obj_section *sec;
657 /* If there are mapping symbols, consult them. */
658 sec = find_pc_section (memaddr);
659 if (sec != NULL)
661 arm_per_bfd *data = arm_bfd_data_key.get (sec->objfile->obfd.get ());
662 if (data != NULL)
664 unsigned int section_idx = sec->the_bfd_section->index;
665 arm_mapping_symbol_vec &map
666 = data->section_maps[section_idx];
668 /* Sort the vector on first use. */
669 if (!data->section_maps_sorted[section_idx])
671 std::sort (map.begin (), map.end ());
672 data->section_maps_sorted[section_idx] = true;
675 arm_mapping_symbol map_key = { memaddr - sec->addr (), 0 };
676 arm_mapping_symbol_vec::const_iterator it
677 = std::lower_bound (map.begin (), map.end (), map_key);
679 /* std::lower_bound finds the earliest ordered insertion
680 point. If the symbol at this position starts at this exact
681 address, we use that; otherwise, the preceding
682 mapping symbol covers this address. */
683 if (it < map.end ())
685 if (it->value == map_key.value)
687 if (start)
688 *start = it->value + sec->addr ();
689 return it->type;
693 if (it > map.begin ())
695 arm_mapping_symbol_vec::const_iterator prev_it
696 = it - 1;
698 if (start)
699 *start = prev_it->value + sec->addr ();
700 return prev_it->type;
705 return 0;
708 /* Determine if the program counter specified in MEMADDR is in a Thumb
709 function. This function should be called for addresses unrelated to
710 any executing frame; otherwise, prefer arm_frame_is_thumb. */
713 arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
715 struct bound_minimal_symbol sym;
716 char type;
717 arm_displaced_step_copy_insn_closure *dsc = nullptr;
718 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
720 if (gdbarch_displaced_step_copy_insn_closure_by_addr_p (gdbarch))
721 dsc = ((arm_displaced_step_copy_insn_closure * )
722 gdbarch_displaced_step_copy_insn_closure_by_addr
723 (gdbarch, current_inferior (), memaddr));
725 /* If checking the mode of displaced instruction in copy area, the mode
726 should be determined by instruction on the original address. */
727 if (dsc)
729 displaced_debug_printf ("check mode of %.8lx instead of %.8lx",
730 (unsigned long) dsc->insn_addr,
731 (unsigned long) memaddr);
732 memaddr = dsc->insn_addr;
735 /* If bit 0 of the address is set, assume this is a Thumb address. */
736 if (IS_THUMB_ADDR (memaddr))
737 return 1;
739 /* If the user wants to override the symbol table, let him. */
740 if (strcmp (arm_force_mode_string, "arm") == 0)
741 return 0;
742 if (strcmp (arm_force_mode_string, "thumb") == 0)
743 return 1;
745 /* ARM v6-M and v7-M are always in Thumb mode. */
746 if (tdep->is_m)
747 return 1;
749 /* If there are mapping symbols, consult them. */
750 type = arm_find_mapping_symbol (memaddr, NULL);
751 if (type)
752 return type == 't';
754 /* Thumb functions have a "special" bit set in minimal symbols. */
755 sym = lookup_minimal_symbol_by_pc (memaddr);
756 if (sym.minsym)
757 return (MSYMBOL_IS_SPECIAL (sym.minsym));
759 /* If the user wants to override the fallback mode, let them. */
760 if (strcmp (arm_fallback_mode_string, "arm") == 0)
761 return 0;
762 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
763 return 1;
765 /* If we couldn't find any symbol, but we're talking to a running
766 target, then trust the current value of $cpsr. This lets
767 "display/i $pc" always show the correct mode (though if there is
768 a symbol table we will not reach here, so it still may not be
769 displayed in the mode it will be executed). */
770 if (target_has_registers ())
771 return arm_frame_is_thumb (get_current_frame ());
773 /* Otherwise we're out of luck; we assume ARM. */
774 return 0;
777 static inline bool
778 arm_m_addr_is_lockup (CORE_ADDR addr)
780 switch (addr)
782 /* Values for lockup state.
783 For more details see "B1.5.15 Unrecoverable exception cases" in
784 both ARMv6-M and ARMv7-M Architecture Reference Manuals, or
785 see "B4.32 Lockup" in ARMv8-M Architecture Reference Manual. */
786 case 0xeffffffe:
787 case 0xfffffffe:
788 case 0xffffffff:
789 return true;
791 default:
792 /* Address is not lockup. */
793 return false;
797 /* Determine if the address specified equals any of these magic return
798 values, called EXC_RETURN, defined by the ARM v6-M, v7-M and v8-M
799 architectures. Also include lockup magic PC value.
800 Check also for FNC_RETURN if we have the v8-M security extension.
802 From ARMv6-M Reference Manual B1.5.8
803 Table B1-5 Exception return behavior
805 EXC_RETURN Return To Return Stack
806 0xFFFFFFF1 Handler mode Main
807 0xFFFFFFF9 Thread mode Main
808 0xFFFFFFFD Thread mode Process
810 From ARMv7-M Reference Manual B1.5.8
811 Table B1-8 EXC_RETURN definition of exception return behavior, no FP
813 EXC_RETURN Return To Return Stack
814 0xFFFFFFF1 Handler mode Main
815 0xFFFFFFF9 Thread mode Main
816 0xFFFFFFFD Thread mode Process
818 Table B1-9 EXC_RETURN definition of exception return behavior, with
821 EXC_RETURN Return To Return Stack Frame Type
822 0xFFFFFFE1 Handler mode Main Extended
823 0xFFFFFFE9 Thread mode Main Extended
824 0xFFFFFFED Thread mode Process Extended
825 0xFFFFFFF1 Handler mode Main Basic
826 0xFFFFFFF9 Thread mode Main Basic
827 0xFFFFFFFD Thread mode Process Basic
829 For more details see "B1.5.8 Exception return behavior"
830 in both ARMv6-M and ARMv7-M Architecture Reference Manuals.
832 From ARMv8-M Architecture Technical Reference, D1.2.95
833 FType, Mode and SPSEL bits are to be considered when the Security
834 Extension is not implemented.
836 EXC_RETURN Return To Return Stack Frame Type
837 0xFFFFFFA0 Handler mode Main Extended
838 0xFFFFFFA8 Thread mode Main Extended
839 0xFFFFFFAC Thread mode Process Extended
840 0xFFFFFFB0 Handler mode Main Standard
841 0xFFFFFFB8 Thread mode Main Standard
842 0xFFFFFFBC Thread mode Process Standard */
844 static int
845 arm_m_addr_is_magic (struct gdbarch *gdbarch, CORE_ADDR addr)
847 if (arm_m_addr_is_lockup (addr))
848 return 1;
850 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
851 if (tdep->have_sec_ext)
853 switch ((addr & 0xff000000))
855 case 0xff000000: /* EXC_RETURN pattern. */
856 case 0xfe000000: /* FNC_RETURN pattern. */
857 return 1;
858 default:
859 return 0;
862 else
864 switch (addr)
866 /* Values from ARMv8-M Architecture Technical Reference. */
867 case 0xffffffa0:
868 case 0xffffffa8:
869 case 0xffffffac:
870 case 0xffffffb0:
871 case 0xffffffb8:
872 case 0xffffffbc:
873 /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
874 the exception return behavior. */
875 case 0xffffffe1:
876 case 0xffffffe9:
877 case 0xffffffed:
878 case 0xfffffff1:
879 case 0xfffffff9:
880 case 0xfffffffd:
881 /* Address is magic. */
882 return 1;
884 default:
885 /* Address is not magic. */
886 return 0;
891 /* Remove useless bits from addresses in a running program. */
892 static CORE_ADDR
893 arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
895 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
897 /* On M-profile devices, do not strip the low bit from EXC_RETURN
898 (the magic exception return address). */
899 if (tdep->is_m && arm_m_addr_is_magic (gdbarch, val))
900 return val;
902 if (arm_apcs_32)
903 return UNMAKE_THUMB_ADDR (val);
904 else
905 return (val & 0x03fffffc);
908 /* Return 1 if PC is the start of a compiler helper function which
909 can be safely ignored during prologue skipping. IS_THUMB is true
910 if the function is known to be a Thumb function due to the way it
911 is being called. */
912 static int
913 skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
915 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
916 struct bound_minimal_symbol msym;
918 msym = lookup_minimal_symbol_by_pc (pc);
919 if (msym.minsym != NULL
920 && msym.value_address () == pc
921 && msym.minsym->linkage_name () != NULL)
923 const char *name = msym.minsym->linkage_name ();
925 /* The GNU linker's Thumb call stub to foo is named
926 __foo_from_thumb. */
927 if (strstr (name, "_from_thumb") != NULL)
928 name += 2;
930 /* On soft-float targets, __truncdfsf2 is called to convert promoted
931 arguments to their argument types in non-prototyped
932 functions. */
933 if (startswith (name, "__truncdfsf2"))
934 return 1;
935 if (startswith (name, "__aeabi_d2f"))
936 return 1;
938 /* Internal functions related to thread-local storage. */
939 if (startswith (name, "__tls_get_addr"))
940 return 1;
941 if (startswith (name, "__aeabi_read_tp"))
942 return 1;
944 else
946 /* If we run against a stripped glibc, we may be unable to identify
947 special functions by name. Check for one important case,
948 __aeabi_read_tp, by comparing the *code* against the default
949 implementation (this is hand-written ARM assembler in glibc). */
951 if (!is_thumb
952 && read_code_unsigned_integer (pc, 4, byte_order_for_code)
953 == 0xe3e00a0f /* mov r0, #0xffff0fff */
954 && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
955 == 0xe240f01f) /* sub pc, r0, #31 */
956 return 1;
959 return 0;
962 /* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
963 the first 16-bit of instruction, and INSN2 is the second 16-bit of
964 instruction. */
965 #define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
966 ((bits ((insn1), 0, 3) << 12) \
967 | (bits ((insn1), 10, 10) << 11) \
968 | (bits ((insn2), 12, 14) << 8) \
969 | bits ((insn2), 0, 7))
971 /* Extract the immediate from instruction movw/movt of encoding A. INSN is
972 the 32-bit instruction. */
973 #define EXTRACT_MOVW_MOVT_IMM_A(insn) \
974 ((bits ((insn), 16, 19) << 12) \
975 | bits ((insn), 0, 11))
977 /* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
979 static unsigned int
980 thumb_expand_immediate (unsigned int imm)
982 unsigned int count = imm >> 7;
984 if (count < 8)
985 switch (count / 2)
987 case 0:
988 return imm & 0xff;
989 case 1:
990 return (imm & 0xff) | ((imm & 0xff) << 16);
991 case 2:
992 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
993 case 3:
994 return (imm & 0xff) | ((imm & 0xff) << 8)
995 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
998 return (0x80 | (imm & 0x7f)) << (32 - count);
1001 /* Return 1 if the 16-bit Thumb instruction INSN restores SP in
1002 epilogue, 0 otherwise. */
1004 static int
1005 thumb_instruction_restores_sp (unsigned short insn)
1007 return (insn == 0x46bd /* mov sp, r7 */
1008 || (insn & 0xff80) == 0xb000 /* add sp, imm */
1009 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
1012 /* Analyze a Thumb prologue, looking for a recognizable stack frame
1013 and frame pointer. Scan until we encounter a store that could
1014 clobber the stack frame unexpectedly, or an unknown instruction.
1015 Return the last address which is definitely safe to skip for an
1016 initial breakpoint. */
1018 static CORE_ADDR
1019 thumb_analyze_prologue (struct gdbarch *gdbarch,
1020 CORE_ADDR start, CORE_ADDR limit,
1021 struct arm_prologue_cache *cache)
1023 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1024 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1025 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1026 int i;
1027 pv_t regs[16];
1028 CORE_ADDR offset;
1029 CORE_ADDR unrecognized_pc = 0;
1031 for (i = 0; i < 16; i++)
1032 regs[i] = pv_register (i, 0);
1033 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1035 while (start < limit)
1037 unsigned short insn;
1038 std::optional<bool> ra_signed_state;
1040 insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
1042 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
1044 int regno;
1045 int mask;
1047 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1048 break;
1050 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
1051 whether to save LR (R14). */
1052 mask = (insn & 0xff) | ((insn & 0x100) << 6);
1054 /* Calculate offsets of saved R0-R7 and LR. */
1055 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1056 if (mask & (1 << regno))
1058 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1059 -4);
1060 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
1063 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
1065 offset = (insn & 0x7f) << 2; /* get scaled offset */
1066 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1067 -offset);
1069 else if (thumb_instruction_restores_sp (insn))
1071 /* Don't scan past the epilogue. */
1072 break;
1074 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
1075 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
1076 (insn & 0xff) << 2);
1077 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
1078 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1079 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
1080 bits (insn, 6, 8));
1081 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
1082 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1083 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
1084 bits (insn, 0, 7));
1085 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
1086 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
1087 && pv_is_constant (regs[bits (insn, 3, 5)]))
1088 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
1089 regs[bits (insn, 6, 8)]);
1090 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
1091 && pv_is_constant (regs[bits (insn, 3, 6)]))
1093 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
1094 int rm = bits (insn, 3, 6);
1095 regs[rd] = pv_add (regs[rd], regs[rm]);
1097 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
1099 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
1100 int src_reg = (insn & 0x78) >> 3;
1101 regs[dst_reg] = regs[src_reg];
1103 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
1105 /* Handle stores to the stack. Normally pushes are used,
1106 but with GCC -mtpcs-frame, there may be other stores
1107 in the prologue to create the frame. */
1108 int regno = (insn >> 8) & 0x7;
1109 pv_t addr;
1111 offset = (insn & 0xff) << 2;
1112 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
1114 if (stack.store_would_trash (addr))
1115 break;
1117 stack.store (addr, 4, regs[regno]);
1119 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
1121 int rd = bits (insn, 0, 2);
1122 int rn = bits (insn, 3, 5);
1123 pv_t addr;
1125 offset = bits (insn, 6, 10) << 2;
1126 addr = pv_add_constant (regs[rn], offset);
1128 if (stack.store_would_trash (addr))
1129 break;
1131 stack.store (addr, 4, regs[rd]);
1133 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
1134 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
1135 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1136 /* Ignore stores of argument registers to the stack. */
1138 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
1139 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1140 /* Ignore block loads from the stack, potentially copying
1141 parameters from memory. */
1143 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
1144 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
1145 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
1146 /* Similarly ignore single loads from the stack. */
1148 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
1149 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
1150 /* Skip register copies, i.e. saves to another register
1151 instead of the stack. */
1153 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
1154 /* Recognize constant loads; even with small stacks these are necessary
1155 on Thumb. */
1156 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
1157 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
1159 /* Constant pool loads, for the same reason. */
1160 unsigned int constant;
1161 CORE_ADDR loc;
1163 loc = start + 4 + bits (insn, 0, 7) * 4;
1164 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1165 regs[bits (insn, 8, 10)] = pv_constant (constant);
1167 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
1169 unsigned short inst2;
1171 inst2 = read_code_unsigned_integer (start + 2, 2,
1172 byte_order_for_code);
1173 uint32_t whole_insn = (insn << 16) | inst2;
1175 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
1177 /* BL, BLX. Allow some special function calls when
1178 skipping the prologue; GCC generates these before
1179 storing arguments to the stack. */
1180 CORE_ADDR nextpc;
1181 int j1, j2, imm1, imm2;
1183 imm1 = sbits (insn, 0, 10);
1184 imm2 = bits (inst2, 0, 10);
1185 j1 = bit (inst2, 13);
1186 j2 = bit (inst2, 11);
1188 offset = ((imm1 << 12) + (imm2 << 1));
1189 offset ^= ((!j2) << 22) | ((!j1) << 23);
1191 nextpc = start + 4 + offset;
1192 /* For BLX make sure to clear the low bits. */
1193 if (bit (inst2, 12) == 0)
1194 nextpc = nextpc & 0xfffffffc;
1196 if (!skip_prologue_function (gdbarch, nextpc,
1197 bit (inst2, 12) != 0))
1198 break;
1201 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
1202 { registers } */
1203 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1205 pv_t addr = regs[bits (insn, 0, 3)];
1206 int regno;
1208 if (stack.store_would_trash (addr))
1209 break;
1211 /* Calculate offsets of saved registers. */
1212 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1213 if (inst2 & (1 << regno))
1215 addr = pv_add_constant (addr, -4);
1216 stack.store (addr, 4, regs[regno]);
1219 if (insn & 0x0020)
1220 regs[bits (insn, 0, 3)] = addr;
1223 /* vstmdb Rn{!}, { D-registers } (aka vpush). */
1224 else if ((insn & 0xff20) == 0xed20
1225 && (inst2 & 0x0f00) == 0x0b00
1226 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1228 /* Address SP points to. */
1229 pv_t addr = regs[bits (insn, 0, 3)];
1231 /* Number of registers saved. */
1232 unsigned int number = bits (inst2, 0, 7) >> 1;
1234 /* First register to save. */
1235 int vd = bits (inst2, 12, 15) | (bits (insn, 6, 6) << 4);
1237 if (stack.store_would_trash (addr))
1238 break;
1240 /* Calculate offsets of saved registers. */
1241 for (; number > 0; number--)
1243 addr = pv_add_constant (addr, -8);
1244 stack.store (addr, 8, pv_register (ARM_D0_REGNUM
1245 + vd + number, 0));
1248 /* Writeback SP to account for the saved registers. */
1249 regs[bits (insn, 0, 3)] = addr;
1252 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
1253 [Rn, #+/-imm]{!} */
1254 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1256 int regno1 = bits (inst2, 12, 15);
1257 int regno2 = bits (inst2, 8, 11);
1258 pv_t addr = regs[bits (insn, 0, 3)];
1260 offset = inst2 & 0xff;
1261 if (insn & 0x0080)
1262 addr = pv_add_constant (addr, offset);
1263 else
1264 addr = pv_add_constant (addr, -offset);
1266 if (stack.store_would_trash (addr))
1267 break;
1269 stack.store (addr, 4, regs[regno1]);
1270 stack.store (pv_add_constant (addr, 4),
1271 4, regs[regno2]);
1273 if (insn & 0x0020)
1274 regs[bits (insn, 0, 3)] = addr;
1277 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
1278 && (inst2 & 0x0c00) == 0x0c00
1279 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1281 int regno = bits (inst2, 12, 15);
1282 pv_t addr = regs[bits (insn, 0, 3)];
1284 offset = inst2 & 0xff;
1285 if (inst2 & 0x0200)
1286 addr = pv_add_constant (addr, offset);
1287 else
1288 addr = pv_add_constant (addr, -offset);
1290 if (stack.store_would_trash (addr))
1291 break;
1293 stack.store (addr, 4, regs[regno]);
1295 if (inst2 & 0x0100)
1296 regs[bits (insn, 0, 3)] = addr;
1299 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
1300 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1302 int regno = bits (inst2, 12, 15);
1303 pv_t addr;
1305 offset = inst2 & 0xfff;
1306 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
1308 if (stack.store_would_trash (addr))
1309 break;
1311 stack.store (addr, 4, regs[regno]);
1314 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
1315 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1316 /* Ignore stores of argument registers to the stack. */
1319 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
1320 && (inst2 & 0x0d00) == 0x0c00
1321 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1322 /* Ignore stores of argument registers to the stack. */
1325 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
1326 { registers } */
1327 && (inst2 & 0x8000) == 0x0000
1328 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1329 /* Ignore block loads from the stack, potentially copying
1330 parameters from memory. */
1333 else if ((insn & 0xff70) == 0xe950 /* ldrd Rt, Rt2,
1334 [Rn, #+/-imm] */
1335 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1336 /* Similarly ignore dual loads from the stack. */
1339 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
1340 && (inst2 & 0x0d00) == 0x0c00
1341 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1342 /* Similarly ignore single loads from the stack. */
1345 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
1346 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1347 /* Similarly ignore single loads from the stack. */
1350 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
1351 && (inst2 & 0x8000) == 0x0000)
1353 unsigned int imm = ((bits (insn, 10, 10) << 11)
1354 | (bits (inst2, 12, 14) << 8)
1355 | bits (inst2, 0, 7));
1357 regs[bits (inst2, 8, 11)]
1358 = pv_add_constant (regs[bits (insn, 0, 3)],
1359 thumb_expand_immediate (imm));
1362 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
1363 && (inst2 & 0x8000) == 0x0000)
1365 unsigned int imm = ((bits (insn, 10, 10) << 11)
1366 | (bits (inst2, 12, 14) << 8)
1367 | bits (inst2, 0, 7));
1369 regs[bits (inst2, 8, 11)]
1370 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
1373 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
1374 && (inst2 & 0x8000) == 0x0000)
1376 unsigned int imm = ((bits (insn, 10, 10) << 11)
1377 | (bits (inst2, 12, 14) << 8)
1378 | bits (inst2, 0, 7));
1380 regs[bits (inst2, 8, 11)]
1381 = pv_add_constant (regs[bits (insn, 0, 3)],
1382 - (CORE_ADDR) thumb_expand_immediate (imm));
1385 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
1386 && (inst2 & 0x8000) == 0x0000)
1388 unsigned int imm = ((bits (insn, 10, 10) << 11)
1389 | (bits (inst2, 12, 14) << 8)
1390 | bits (inst2, 0, 7));
1392 regs[bits (inst2, 8, 11)]
1393 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1396 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
1398 unsigned int imm = ((bits (insn, 10, 10) << 11)
1399 | (bits (inst2, 12, 14) << 8)
1400 | bits (inst2, 0, 7));
1402 regs[bits (inst2, 8, 11)]
1403 = pv_constant (thumb_expand_immediate (imm));
1406 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
1408 unsigned int imm
1409 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
1411 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1414 else if (insn == 0xea5f /* mov.w Rd,Rm */
1415 && (inst2 & 0xf0f0) == 0)
1417 int dst_reg = (inst2 & 0x0f00) >> 8;
1418 int src_reg = inst2 & 0xf;
1419 regs[dst_reg] = regs[src_reg];
1422 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1424 /* Constant pool loads. */
1425 unsigned int constant;
1426 CORE_ADDR loc;
1428 offset = bits (inst2, 0, 11);
1429 if (insn & 0x0080)
1430 loc = start + 4 + offset;
1431 else
1432 loc = start + 4 - offset;
1434 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1435 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1438 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1440 /* Constant pool loads. */
1441 unsigned int constant;
1442 CORE_ADDR loc;
1444 offset = bits (inst2, 0, 7) << 2;
1445 if (insn & 0x0080)
1446 loc = start + 4 + offset;
1447 else
1448 loc = start + 4 - offset;
1450 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1451 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1453 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1454 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1456 /* Start of ARMv8.1-m PACBTI extension instructions. */
1457 else if (IS_PAC (whole_insn))
1459 /* LR and SP are input registers. PAC is in R12. LR is
1460 signed from this point onwards. NOP space. */
1461 ra_signed_state = true;
1463 else if (IS_PACBTI (whole_insn))
1465 /* LR and SP are input registers. PAC is in R12 and PC is a
1466 valid BTI landing pad. LR is signed from this point onwards.
1467 NOP space. */
1468 ra_signed_state = true;
1470 else if (IS_BTI (whole_insn))
1472 /* Valid BTI landing pad. NOP space. */
1474 else if (IS_PACG (whole_insn))
1476 /* Sign Rn using Rm and store the PAC in Rd. Rd is signed from
1477 this point onwards. */
1478 ra_signed_state = true;
1480 else if (IS_AUT (whole_insn) || IS_AUTG (whole_insn))
1482 /* These instructions appear close to the epilogue, when signed
1483 pointers are getting authenticated. */
1484 ra_signed_state = false;
1486 /* End of ARMv8.1-m PACBTI extension instructions */
1487 else if (thumb2_instruction_changes_pc (insn, inst2))
1489 /* Don't scan past anything that might change control flow. */
1490 break;
1492 else
1494 /* The optimizer might shove anything into the prologue,
1495 so we just skip what we don't recognize. */
1496 unrecognized_pc = start;
1499 /* Make sure we are dealing with a target that supports ARMv8.1-m
1500 PACBTI. */
1501 if (cache != nullptr && tdep->have_pacbti
1502 && ra_signed_state.has_value ())
1504 arm_debug_printf ("Found pacbti instruction at %s",
1505 paddress (gdbarch, start));
1506 arm_debug_printf ("RA is %s",
1507 *ra_signed_state ? "signed" : "not signed");
1508 cache->ra_signed_state = ra_signed_state;
1511 start += 2;
1513 else if (thumb_instruction_changes_pc (insn))
1515 /* Don't scan past anything that might change control flow. */
1516 break;
1518 else
1520 /* The optimizer might shove anything into the prologue,
1521 so we just skip what we don't recognize. */
1522 unrecognized_pc = start;
1525 start += 2;
1528 arm_debug_printf ("Prologue scan stopped at %s",
1529 paddress (gdbarch, start));
1531 if (unrecognized_pc == 0)
1532 unrecognized_pc = start;
1534 if (cache == NULL)
1535 return unrecognized_pc;
1537 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1539 /* Frame pointer is fp. Frame size is constant. */
1540 cache->framereg = ARM_FP_REGNUM;
1541 cache->framesize = -regs[ARM_FP_REGNUM].k;
1543 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1545 /* Frame pointer is r7. Frame size is constant. */
1546 cache->framereg = THUMB_FP_REGNUM;
1547 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1549 else
1551 /* Try the stack pointer... this is a bit desperate. */
1552 cache->framereg = ARM_SP_REGNUM;
1553 cache->framesize = -regs[ARM_SP_REGNUM].k;
1556 for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
1557 if (stack.find_reg (gdbarch, i, &offset))
1559 cache->saved_regs[i].set_addr (offset);
1560 if (i == ARM_SP_REGNUM)
1561 arm_cache_set_active_sp_value(cache, tdep, offset);
1564 return unrecognized_pc;
1568 /* Try to analyze the instructions starting from PC, which load symbol
1569 __stack_chk_guard. Return the address of instruction after loading this
1570 symbol, set the dest register number to *BASEREG, and set the size of
1571 instructions for loading symbol in OFFSET. Return 0 if instructions are
1572 not recognized. */
1574 static CORE_ADDR
1575 arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1576 unsigned int *destreg, int *offset)
1578 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1579 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1580 unsigned int low, high, address;
1582 address = 0;
1583 if (is_thumb)
1585 unsigned short insn1
1586 = read_code_unsigned_integer (pc, 2, byte_order_for_code);
1588 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1590 *destreg = bits (insn1, 8, 10);
1591 *offset = 2;
1592 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1593 address = read_memory_unsigned_integer (address, 4,
1594 byte_order_for_code);
1596 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1598 unsigned short insn2
1599 = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
1601 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1603 insn1
1604 = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
1605 insn2
1606 = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
1608 /* movt Rd, #const */
1609 if ((insn1 & 0xfbc0) == 0xf2c0)
1611 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1612 *destreg = bits (insn2, 8, 11);
1613 *offset = 8;
1614 address = (high << 16 | low);
1618 else
1620 unsigned int insn
1621 = read_code_unsigned_integer (pc, 4, byte_order_for_code);
1623 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
1625 address = bits (insn, 0, 11) + pc + 8;
1626 address = read_memory_unsigned_integer (address, 4,
1627 byte_order_for_code);
1629 *destreg = bits (insn, 12, 15);
1630 *offset = 4;
1632 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1634 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1636 insn
1637 = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
1639 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1641 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1642 *destreg = bits (insn, 12, 15);
1643 *offset = 8;
1644 address = (high << 16 | low);
1649 return address;
1652 /* Try to skip a sequence of instructions used for stack protector. If PC
1653 points to the first instruction of this sequence, return the address of
1654 first instruction after this sequence, otherwise, return original PC.
1656 On arm, this sequence of instructions is composed of mainly three steps,
1657 Step 1: load symbol __stack_chk_guard,
1658 Step 2: load from address of __stack_chk_guard,
1659 Step 3: store it to somewhere else.
1661 Usually, instructions on step 2 and step 3 are the same on various ARM
1662 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1663 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1664 instructions in step 1 vary from different ARM architectures. On ARMv7,
1665 they are,
1667 movw Rn, #:lower16:__stack_chk_guard
1668 movt Rn, #:upper16:__stack_chk_guard
1670 On ARMv5t, it is,
1672 ldr Rn, .Label
1673 ....
1674 .Lable:
1675 .word __stack_chk_guard
1677 Since ldr/str is a very popular instruction, we can't use them as
1678 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1679 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1680 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1682 static CORE_ADDR
1683 arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1685 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1686 unsigned int basereg;
1687 struct bound_minimal_symbol stack_chk_guard;
1688 int offset;
1689 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1690 CORE_ADDR addr;
1692 /* Try to parse the instructions in Step 1. */
1693 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1694 &basereg, &offset);
1695 if (!addr)
1696 return pc;
1698 stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
1699 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1700 Otherwise, this sequence cannot be for stack protector. */
1701 if (stack_chk_guard.minsym == NULL
1702 || !startswith (stack_chk_guard.minsym->linkage_name (), "__stack_chk_guard"))
1703 return pc;
1705 if (is_thumb)
1707 unsigned int destreg;
1708 unsigned short insn
1709 = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
1711 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1712 if ((insn & 0xf800) != 0x6800)
1713 return pc;
1714 if (bits (insn, 3, 5) != basereg)
1715 return pc;
1716 destreg = bits (insn, 0, 2);
1718 insn = read_code_unsigned_integer (pc + offset + 2, 2,
1719 byte_order_for_code);
1720 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1721 if ((insn & 0xf800) != 0x6000)
1722 return pc;
1723 if (destreg != bits (insn, 0, 2))
1724 return pc;
1726 else
1728 unsigned int destreg;
1729 unsigned int insn
1730 = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
1732 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1733 if ((insn & 0x0e500000) != 0x04100000)
1734 return pc;
1735 if (bits (insn, 16, 19) != basereg)
1736 return pc;
1737 destreg = bits (insn, 12, 15);
1738 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1739 insn = read_code_unsigned_integer (pc + offset + 4,
1740 4, byte_order_for_code);
1741 if ((insn & 0x0e500000) != 0x04000000)
1742 return pc;
1743 if (bits (insn, 12, 15) != destreg)
1744 return pc;
1746 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1747 on arm. */
1748 if (is_thumb)
1749 return pc + offset + 4;
1750 else
1751 return pc + offset + 8;
1754 /* Advance the PC across any function entry prologue instructions to
1755 reach some "real" code.
1757 The APCS (ARM Procedure Call Standard) defines the following
1758 prologue:
1760 mov ip, sp
1761 [stmfd sp!, {a1,a2,a3,a4}]
1762 stmfd sp!, {...,fp,ip,lr,pc}
1763 [stfe f7, [sp, #-12]!]
1764 [stfe f6, [sp, #-12]!]
1765 [stfe f5, [sp, #-12]!]
1766 [stfe f4, [sp, #-12]!]
1767 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
1769 static CORE_ADDR
1770 arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1772 CORE_ADDR func_addr, func_end_addr, limit_pc;
1774 /* See if we can determine the end of the prologue via the symbol table.
1775 If so, then return either PC, or the PC after the prologue, whichever
1776 is greater. */
1777 bool func_addr_found
1778 = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr);
1780 /* Whether the function is thumb mode or not. */
1781 bool func_is_thumb = false;
1783 if (func_addr_found)
1785 CORE_ADDR post_prologue_pc
1786 = skip_prologue_using_sal (gdbarch, func_addr);
1787 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
1789 if (post_prologue_pc)
1790 post_prologue_pc
1791 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1794 /* GCC always emits a line note before the prologue and another
1795 one after, even if the two are at the same address or on the
1796 same line. Take advantage of this so that we do not need to
1797 know every instruction that might appear in the prologue. We
1798 will have producer information for most binaries; if it is
1799 missing (e.g. for -gstabs), assuming the GNU tools. */
1800 if (post_prologue_pc
1801 && (cust == NULL
1802 || cust->producer () == NULL
1803 || startswith (cust->producer (), "GNU ")
1804 || producer_is_llvm (cust->producer ())))
1805 return post_prologue_pc;
1807 if (post_prologue_pc != 0)
1809 CORE_ADDR analyzed_limit;
1811 /* For non-GCC compilers, make sure the entire line is an
1812 acceptable prologue; GDB will round this function's
1813 return value up to the end of the following line so we
1814 can not skip just part of a line (and we do not want to).
1816 RealView does not treat the prologue specially, but does
1817 associate prologue code with the opening brace; so this
1818 lets us skip the first line if we think it is the opening
1819 brace. */
1820 func_is_thumb = arm_pc_is_thumb (gdbarch, func_addr);
1821 if (func_is_thumb)
1822 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1823 post_prologue_pc, NULL);
1824 else
1825 analyzed_limit
1826 = arm_analyze_prologue (gdbarch, func_addr, post_prologue_pc,
1827 NULL, target_arm_instruction_reader ());
1829 if (analyzed_limit != post_prologue_pc)
1830 return func_addr;
1832 return post_prologue_pc;
1836 /* Can't determine prologue from the symbol table, need to examine
1837 instructions. */
1839 /* Find an upper limit on the function prologue using the debug
1840 information. If the debug information could not be used to provide
1841 that bound, then use an arbitrary large number as the upper bound. */
1842 /* Like arm_scan_prologue, stop no later than pc + 64. */
1843 limit_pc = skip_prologue_using_sal (gdbarch, pc);
1844 if (limit_pc == 0)
1845 limit_pc = pc + 64; /* Magic. */
1847 /* Set the correct adjustment based on whether the function is thumb mode or
1848 not. We use it to get the address of the last instruction in the
1849 function (as opposed to the first address of the next function). */
1850 CORE_ADDR adjustment = func_is_thumb ? 2 : 4;
1852 limit_pc
1853 = func_end_addr == 0 ? limit_pc : std::min (limit_pc,
1854 func_end_addr - adjustment);
1856 /* Check if this is Thumb code. */
1857 if (arm_pc_is_thumb (gdbarch, pc))
1858 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
1859 else
1860 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL,
1861 target_arm_instruction_reader ());
1864 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1865 This function decodes a Thumb function prologue to determine:
1866 1) the size of the stack frame
1867 2) which registers are saved on it
1868 3) the offsets of saved regs
1869 4) the offset from the stack pointer to the frame pointer
1871 A typical Thumb function prologue would create this stack frame
1872 (offsets relative to FP)
1873 old SP -> 24 stack parameters
1874 20 LR
1875 16 R7
1876 R7 -> 0 local variables (16 bytes)
1877 SP -> -12 additional stack space (12 bytes)
1878 The frame size would thus be 36 bytes, and the frame offset would be
1879 12 bytes. The frame register is R7.
1881 The comments for thumb_skip_prolog() describe the algorithm we use
1882 to detect the end of the prolog. */
1884 static void
1885 thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
1886 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
1888 CORE_ADDR prologue_start;
1889 CORE_ADDR prologue_end;
1891 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1892 &prologue_end))
1894 /* See comment in arm_scan_prologue for an explanation of
1895 this heuristics. */
1896 if (prologue_end > prologue_start + 64)
1898 prologue_end = prologue_start + 64;
1901 else
1902 /* We're in the boondocks: we have no idea where the start of the
1903 function is. */
1904 return;
1906 prologue_end = std::min (prologue_end, prev_pc);
1908 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
1911 /* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1912 otherwise. */
1914 static int
1915 arm_instruction_restores_sp (unsigned int insn)
1917 if (bits (insn, 28, 31) != INST_NV)
1919 if ((insn & 0x0df0f000) == 0x0080d000
1920 /* ADD SP (register or immediate). */
1921 || (insn & 0x0df0f000) == 0x0040d000
1922 /* SUB SP (register or immediate). */
1923 || (insn & 0x0ffffff0) == 0x01a0d000
1924 /* MOV SP. */
1925 || (insn & 0x0fff0000) == 0x08bd0000
1926 /* POP (LDMIA). */
1927 || (insn & 0x0fff0000) == 0x049d0000)
1928 /* POP of a single register. */
1929 return 1;
1932 return 0;
1935 /* Implement immediate value decoding, as described in section A5.2.4
1936 (Modified immediate constants in ARM instructions) of the ARM Architecture
1937 Reference Manual (ARMv7-A and ARMv7-R edition). */
1939 static uint32_t
1940 arm_expand_immediate (uint32_t imm)
1942 /* Immediate values are 12 bits long. */
1943 gdb_assert ((imm & 0xfffff000) == 0);
1945 uint32_t unrotated_value = imm & 0xff;
1946 uint32_t rotate_amount = (imm & 0xf00) >> 7;
1948 if (rotate_amount == 0)
1949 return unrotated_value;
1951 return ((unrotated_value >> rotate_amount)
1952 | (unrotated_value << (32 - rotate_amount)));
1955 /* Analyze an ARM mode prologue starting at PROLOGUE_START and
1956 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1957 fill it in. Return the first address not recognized as a prologue
1958 instruction.
1960 We recognize all the instructions typically found in ARM prologues,
1961 plus harmless instructions which can be skipped (either for analysis
1962 purposes, or a more restrictive set that can be skipped when finding
1963 the end of the prologue). */
1965 static CORE_ADDR
1966 arm_analyze_prologue (struct gdbarch *gdbarch,
1967 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1968 struct arm_prologue_cache *cache,
1969 const arm_instruction_reader &insn_reader)
1971 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1972 int regno;
1973 CORE_ADDR offset, current_pc;
1974 pv_t regs[ARM_FPS_REGNUM];
1975 CORE_ADDR unrecognized_pc = 0;
1976 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1978 /* Search the prologue looking for instructions that set up the
1979 frame pointer, adjust the stack pointer, and save registers.
1981 Be careful, however, and if it doesn't look like a prologue,
1982 don't try to scan it. If, for instance, a frameless function
1983 begins with stmfd sp!, then we will tell ourselves there is
1984 a frame, which will confuse stack traceback, as well as "finish"
1985 and other operations that rely on a knowledge of the stack
1986 traceback. */
1988 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1989 regs[regno] = pv_register (regno, 0);
1990 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1992 for (current_pc = prologue_start;
1993 current_pc < prologue_end;
1994 current_pc += 4)
1996 uint32_t insn = insn_reader.read (current_pc, byte_order_for_code);
1998 if (insn == 0xe1a0c00d) /* mov ip, sp */
2000 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
2001 continue;
2003 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
2004 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2006 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2007 int rd = bits (insn, 12, 15);
2008 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
2009 continue;
2011 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
2012 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2014 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2015 int rd = bits (insn, 12, 15);
2016 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
2017 continue;
2019 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
2020 [sp, #-4]! */
2022 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2023 break;
2024 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2025 stack.store (regs[ARM_SP_REGNUM], 4,
2026 regs[bits (insn, 12, 15)]);
2027 continue;
2029 else if ((insn & 0xffff0000) == 0xe92d0000)
2030 /* stmfd sp!, {..., fp, ip, lr, pc}
2032 stmfd sp!, {a1, a2, a3, a4} */
2034 int mask = insn & 0xffff;
2036 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2037 break;
2039 /* Calculate offsets of saved registers. */
2040 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
2041 if (mask & (1 << regno))
2043 regs[ARM_SP_REGNUM]
2044 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2045 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
2048 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
2049 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
2050 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
2052 /* No need to add this to saved_regs -- it's just an arg reg. */
2053 continue;
2055 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
2056 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
2057 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
2059 /* No need to add this to saved_regs -- it's just an arg reg. */
2060 continue;
2062 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
2063 { registers } */
2064 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2066 /* No need to add this to saved_regs -- it's just arg regs. */
2067 continue;
2069 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
2071 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2072 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
2074 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
2076 uint32_t imm = arm_expand_immediate(insn & 0xfff);
2077 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
2079 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
2080 [sp, -#c]! */
2081 && tdep->have_fpa_registers)
2083 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2084 break;
2086 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2087 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
2088 stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
2090 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
2091 [sp!] */
2092 && tdep->have_fpa_registers)
2094 int n_saved_fp_regs;
2095 unsigned int fp_start_reg, fp_bound_reg;
2097 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2098 break;
2100 if ((insn & 0x800) == 0x800) /* N0 is set */
2102 if ((insn & 0x40000) == 0x40000) /* N1 is set */
2103 n_saved_fp_regs = 3;
2104 else
2105 n_saved_fp_regs = 1;
2107 else
2109 if ((insn & 0x40000) == 0x40000) /* N1 is set */
2110 n_saved_fp_regs = 2;
2111 else
2112 n_saved_fp_regs = 4;
2115 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
2116 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
2117 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
2119 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2120 stack.store (regs[ARM_SP_REGNUM], 12,
2121 regs[fp_start_reg++]);
2124 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
2126 /* Allow some special function calls when skipping the
2127 prologue; GCC generates these before storing arguments to
2128 the stack. */
2129 CORE_ADDR dest = BranchDest (current_pc, insn);
2131 if (skip_prologue_function (gdbarch, dest, 0))
2132 continue;
2133 else
2134 break;
2136 else if ((insn & 0xf0000000) != 0xe0000000)
2137 break; /* Condition not true, exit early. */
2138 else if (arm_instruction_changes_pc (insn))
2139 /* Don't scan past anything that might change control flow. */
2140 break;
2141 else if (arm_instruction_restores_sp (insn))
2143 /* Don't scan past the epilogue. */
2144 break;
2146 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
2147 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2148 /* Ignore block loads from the stack, potentially copying
2149 parameters from memory. */
2150 continue;
2151 else if ((insn & 0xfc500000) == 0xe4100000
2152 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2153 /* Similarly ignore single loads from the stack. */
2154 continue;
2155 else if ((insn & 0xffff0ff0) == 0xe1a00000)
2156 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
2157 register instead of the stack. */
2158 continue;
2159 else
2161 /* The optimizer might shove anything into the prologue, if
2162 we build up cache (cache != NULL) from scanning prologue,
2163 we just skip what we don't recognize and scan further to
2164 make cache as complete as possible. However, if we skip
2165 prologue, we'll stop immediately on unrecognized
2166 instruction. */
2167 unrecognized_pc = current_pc;
2168 if (cache != NULL)
2169 continue;
2170 else
2171 break;
2175 if (unrecognized_pc == 0)
2176 unrecognized_pc = current_pc;
2178 if (cache)
2180 int framereg, framesize;
2182 /* The frame size is just the distance from the frame register
2183 to the original stack pointer. */
2184 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
2186 /* Frame pointer is fp. */
2187 framereg = ARM_FP_REGNUM;
2188 framesize = -regs[ARM_FP_REGNUM].k;
2190 else
2192 /* Try the stack pointer... this is a bit desperate. */
2193 framereg = ARM_SP_REGNUM;
2194 framesize = -regs[ARM_SP_REGNUM].k;
2197 cache->framereg = framereg;
2198 cache->framesize = framesize;
2200 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
2201 if (stack.find_reg (gdbarch, regno, &offset))
2203 cache->saved_regs[regno].set_addr (offset);
2204 if (regno == ARM_SP_REGNUM)
2205 arm_cache_set_active_sp_value(cache, tdep, offset);
2209 arm_debug_printf ("Prologue scan stopped at %s",
2210 paddress (gdbarch, unrecognized_pc));
2212 return unrecognized_pc;
2215 static void
2216 arm_scan_prologue (frame_info_ptr this_frame,
2217 struct arm_prologue_cache *cache)
2219 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2220 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2221 CORE_ADDR prologue_start, prologue_end;
2222 CORE_ADDR prev_pc = get_frame_pc (this_frame);
2223 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
2224 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2226 /* Assume there is no frame until proven otherwise. */
2227 cache->framereg = ARM_SP_REGNUM;
2228 cache->framesize = 0;
2230 /* Check for Thumb prologue. */
2231 if (arm_frame_is_thumb (this_frame))
2233 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
2234 return;
2237 /* Find the function prologue. If we can't find the function in
2238 the symbol table, peek in the stack frame to find the PC. */
2239 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
2240 &prologue_end))
2242 /* One way to find the end of the prologue (which works well
2243 for unoptimized code) is to do the following:
2245 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
2247 if (sal.line == 0)
2248 prologue_end = prev_pc;
2249 else if (sal.end < prologue_end)
2250 prologue_end = sal.end;
2252 This mechanism is very accurate so long as the optimizer
2253 doesn't move any instructions from the function body into the
2254 prologue. If this happens, sal.end will be the last
2255 instruction in the first hunk of prologue code just before
2256 the first instruction that the scheduler has moved from
2257 the body to the prologue.
2259 In order to make sure that we scan all of the prologue
2260 instructions, we use a slightly less accurate mechanism which
2261 may scan more than necessary. To help compensate for this
2262 lack of accuracy, the prologue scanning loop below contains
2263 several clauses which'll cause the loop to terminate early if
2264 an implausible prologue instruction is encountered.
2266 The expression
2268 prologue_start + 64
2270 is a suitable endpoint since it accounts for the largest
2271 possible prologue plus up to five instructions inserted by
2272 the scheduler. */
2274 if (prologue_end > prologue_start + 64)
2276 prologue_end = prologue_start + 64; /* See above. */
2279 else
2281 /* We have no symbol information. Our only option is to assume this
2282 function has a standard stack frame and the normal frame register.
2283 Then, we can find the value of our frame pointer on entrance to
2284 the callee (or at the present moment if this is the innermost frame).
2285 The value stored there should be the address of the stmfd + 8. */
2286 CORE_ADDR frame_loc;
2287 ULONGEST return_value;
2289 /* AAPCS does not use a frame register, so we can abort here. */
2290 if (tdep->arm_abi == ARM_ABI_AAPCS)
2291 return;
2293 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
2294 if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
2295 &return_value))
2296 return;
2297 else
2299 prologue_start = gdbarch_addr_bits_remove
2300 (gdbarch, return_value) - 8;
2301 prologue_end = prologue_start + 64; /* See above. */
2305 if (prev_pc < prologue_end)
2306 prologue_end = prev_pc;
2308 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache,
2309 target_arm_instruction_reader ());
2312 static struct arm_prologue_cache *
2313 arm_make_prologue_cache (frame_info_ptr this_frame)
2315 int reg;
2316 struct arm_prologue_cache *cache;
2317 CORE_ADDR unwound_fp, prev_sp;
2319 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2320 arm_cache_init (cache, this_frame);
2322 arm_scan_prologue (this_frame, cache);
2324 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
2325 if (unwound_fp == 0)
2326 return cache;
2328 arm_gdbarch_tdep *tdep =
2329 gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2331 prev_sp = unwound_fp + cache->framesize;
2332 arm_cache_set_active_sp_value (cache, tdep, prev_sp);
2334 /* Calculate actual addresses of saved registers using offsets
2335 determined by arm_scan_prologue. */
2336 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2337 if (cache->saved_regs[reg].is_addr ())
2338 cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr () +
2339 prev_sp);
2341 return cache;
2344 /* Implementation of the stop_reason hook for arm_prologue frames. */
2346 static enum unwind_stop_reason
2347 arm_prologue_unwind_stop_reason (frame_info_ptr this_frame,
2348 void **this_cache)
2350 struct arm_prologue_cache *cache;
2351 CORE_ADDR pc;
2353 if (*this_cache == NULL)
2354 *this_cache = arm_make_prologue_cache (this_frame);
2355 cache = (struct arm_prologue_cache *) *this_cache;
2357 /* This is meant to halt the backtrace at "_start". */
2358 pc = get_frame_pc (this_frame);
2359 gdbarch *arch = get_frame_arch (this_frame);
2360 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
2361 if (pc <= tdep->lowest_pc)
2362 return UNWIND_OUTERMOST;
2364 /* If we've hit a wall, stop. */
2365 if (arm_cache_get_prev_sp_value (cache, tdep) == 0)
2366 return UNWIND_OUTERMOST;
2368 return UNWIND_NO_REASON;
2371 /* Our frame ID for a normal frame is the current function's starting PC
2372 and the caller's SP when we were called. */
2374 static void
2375 arm_prologue_this_id (frame_info_ptr this_frame,
2376 void **this_cache,
2377 struct frame_id *this_id)
2379 struct arm_prologue_cache *cache;
2380 struct frame_id id;
2381 CORE_ADDR pc, func;
2383 if (*this_cache == NULL)
2384 *this_cache = arm_make_prologue_cache (this_frame);
2385 cache = (struct arm_prologue_cache *) *this_cache;
2387 arm_gdbarch_tdep *tdep
2388 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2390 /* Use function start address as part of the frame ID. If we cannot
2391 identify the start address (due to missing symbol information),
2392 fall back to just using the current PC. */
2393 pc = get_frame_pc (this_frame);
2394 func = get_frame_func (this_frame);
2395 if (!func)
2396 func = pc;
2398 id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func);
2399 *this_id = id;
2402 static struct value *
2403 arm_prologue_prev_register (frame_info_ptr this_frame,
2404 void **this_cache,
2405 int prev_regnum)
2407 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2408 struct arm_prologue_cache *cache;
2409 CORE_ADDR sp_value;
2411 if (*this_cache == NULL)
2412 *this_cache = arm_make_prologue_cache (this_frame);
2413 cache = (struct arm_prologue_cache *) *this_cache;
2415 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2417 /* If this frame has signed the return address, mark it as so. */
2418 if (tdep->have_pacbti && cache->ra_signed_state.has_value ()
2419 && *cache->ra_signed_state)
2420 set_frame_previous_pc_masked (this_frame);
2422 /* If we are asked to unwind the PC, then we need to return the LR
2423 instead. The prologue may save PC, but it will point into this
2424 frame's prologue, not the next frame's resume location. Also
2425 strip the saved T bit. A valid LR may have the low bit set, but
2426 a valid PC never does. */
2427 if (prev_regnum == ARM_PC_REGNUM)
2429 CORE_ADDR lr;
2431 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2432 return frame_unwind_got_constant (this_frame, prev_regnum,
2433 arm_addr_bits_remove (gdbarch, lr));
2436 /* SP is generally not saved to the stack, but this frame is
2437 identified by the next frame's stack pointer at the time of the call.
2438 The value was already reconstructed into PREV_SP. */
2439 if (prev_regnum == ARM_SP_REGNUM)
2440 return frame_unwind_got_constant (this_frame, prev_regnum,
2441 arm_cache_get_prev_sp_value (cache, tdep));
2443 /* The value might be one of the alternative SP, if so, use the
2444 value already constructed. */
2445 if (arm_is_alternative_sp_register (tdep, prev_regnum))
2447 sp_value = arm_cache_get_sp_register (cache, tdep, prev_regnum);
2448 return frame_unwind_got_constant (this_frame, prev_regnum, sp_value);
2451 /* The CPSR may have been changed by the call instruction and by the
2452 called function. The only bit we can reconstruct is the T bit,
2453 by checking the low bit of LR as of the call. This is a reliable
2454 indicator of Thumb-ness except for some ARM v4T pre-interworking
2455 Thumb code, which could get away with a clear low bit as long as
2456 the called function did not use bx. Guess that all other
2457 bits are unchanged; the condition flags are presumably lost,
2458 but the processor status is likely valid. */
2459 if (prev_regnum == ARM_PS_REGNUM)
2461 ULONGEST cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
2462 CORE_ADDR lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2464 cpsr = reconstruct_t_bit (gdbarch, lr, cpsr);
2465 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
2468 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2469 prev_regnum);
2472 static frame_unwind arm_prologue_unwind = {
2473 "arm prologue",
2474 NORMAL_FRAME,
2475 arm_prologue_unwind_stop_reason,
2476 arm_prologue_this_id,
2477 arm_prologue_prev_register,
2478 NULL,
2479 default_frame_sniffer
2482 /* Maintain a list of ARM exception table entries per objfile, similar to the
2483 list of mapping symbols. We only cache entries for standard ARM-defined
2484 personality routines; the cache will contain only the frame unwinding
2485 instructions associated with the entry (not the descriptors). */
2487 struct arm_exidx_entry
2489 CORE_ADDR addr;
2490 gdb_byte *entry;
2492 bool operator< (const arm_exidx_entry &other) const
2494 return addr < other.addr;
2498 struct arm_exidx_data
2500 std::vector<std::vector<arm_exidx_entry>> section_maps;
2503 /* Per-BFD key to store exception handling information. */
2504 static const registry<bfd>::key<arm_exidx_data> arm_exidx_data_key;
2506 static struct obj_section *
2507 arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2509 for (obj_section *osect : objfile->sections ())
2510 if (bfd_section_flags (osect->the_bfd_section) & SEC_ALLOC)
2512 bfd_vma start, size;
2513 start = bfd_section_vma (osect->the_bfd_section);
2514 size = bfd_section_size (osect->the_bfd_section);
2516 if (start <= vma && vma < start + size)
2517 return osect;
2520 return NULL;
2523 /* Parse contents of exception table and exception index sections
2524 of OBJFILE, and fill in the exception table entry cache.
2526 For each entry that refers to a standard ARM-defined personality
2527 routine, extract the frame unwinding instructions (from either
2528 the index or the table section). The unwinding instructions
2529 are normalized by:
2530 - extracting them from the rest of the table data
2531 - converting to host endianness
2532 - appending the implicit 0xb0 ("Finish") code
2534 The extracted and normalized instructions are stored for later
2535 retrieval by the arm_find_exidx_entry routine. */
2537 static void
2538 arm_exidx_new_objfile (struct objfile *objfile)
2540 struct arm_exidx_data *data;
2541 asection *exidx, *extab;
2542 bfd_vma exidx_vma = 0, extab_vma = 0;
2543 LONGEST i;
2545 /* If we've already touched this file, do nothing. */
2546 if (arm_exidx_data_key.get (objfile->obfd.get ()) != nullptr)
2547 return;
2549 /* Read contents of exception table and index. */
2550 exidx = bfd_get_section_by_name (objfile->obfd.get (),
2551 ELF_STRING_ARM_unwind);
2552 gdb::byte_vector exidx_data;
2553 if (exidx)
2555 exidx_vma = bfd_section_vma (exidx);
2556 exidx_data.resize (bfd_section_size (exidx));
2558 if (!bfd_get_section_contents (objfile->obfd.get (), exidx,
2559 exidx_data.data (), 0,
2560 exidx_data.size ()))
2561 return;
2564 extab = bfd_get_section_by_name (objfile->obfd.get (), ".ARM.extab");
2565 gdb::byte_vector extab_data;
2566 if (extab)
2568 extab_vma = bfd_section_vma (extab);
2569 extab_data.resize (bfd_section_size (extab));
2571 if (!bfd_get_section_contents (objfile->obfd.get (), extab,
2572 extab_data.data (), 0,
2573 extab_data.size ()))
2574 return;
2577 /* Allocate exception table data structure. */
2578 data = arm_exidx_data_key.emplace (objfile->obfd.get ());
2579 data->section_maps.resize (objfile->obfd->section_count);
2581 /* Fill in exception table. */
2582 for (i = 0; i < exidx_data.size () / 8; i++)
2584 struct arm_exidx_entry new_exidx_entry;
2585 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data.data () + i * 8);
2586 bfd_vma val = bfd_h_get_32 (objfile->obfd,
2587 exidx_data.data () + i * 8 + 4);
2588 bfd_vma addr = 0, word = 0;
2589 int n_bytes = 0, n_words = 0;
2590 struct obj_section *sec;
2591 gdb_byte *entry = NULL;
2593 /* Extract address of start of function. */
2594 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2595 idx += exidx_vma + i * 8;
2597 /* Find section containing function and compute section offset. */
2598 sec = arm_obj_section_from_vma (objfile, idx);
2599 if (sec == NULL)
2600 continue;
2601 idx -= bfd_section_vma (sec->the_bfd_section);
2603 /* Determine address of exception table entry. */
2604 if (val == 1)
2606 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2608 else if ((val & 0xff000000) == 0x80000000)
2610 /* Exception table entry embedded in .ARM.exidx
2611 -- must be short form. */
2612 word = val;
2613 n_bytes = 3;
2615 else if (!(val & 0x80000000))
2617 /* Exception table entry in .ARM.extab. */
2618 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2619 addr += exidx_vma + i * 8 + 4;
2621 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_data.size ())
2623 word = bfd_h_get_32 (objfile->obfd,
2624 extab_data.data () + addr - extab_vma);
2625 addr += 4;
2627 if ((word & 0xff000000) == 0x80000000)
2629 /* Short form. */
2630 n_bytes = 3;
2632 else if ((word & 0xff000000) == 0x81000000
2633 || (word & 0xff000000) == 0x82000000)
2635 /* Long form. */
2636 n_bytes = 2;
2637 n_words = ((word >> 16) & 0xff);
2639 else if (!(word & 0x80000000))
2641 bfd_vma pers;
2642 struct obj_section *pers_sec;
2643 int gnu_personality = 0;
2645 /* Custom personality routine. */
2646 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2647 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2649 /* Check whether we've got one of the variants of the
2650 GNU personality routines. */
2651 pers_sec = arm_obj_section_from_vma (objfile, pers);
2652 if (pers_sec)
2654 static const char *personality[] =
2656 "__gcc_personality_v0",
2657 "__gxx_personality_v0",
2658 "__gcj_personality_v0",
2659 "__gnu_objc_personality_v0",
2660 NULL
2663 CORE_ADDR pc = pers + pers_sec->offset ();
2664 int k;
2666 for (k = 0; personality[k]; k++)
2667 if (lookup_minimal_symbol_by_pc_name
2668 (pc, personality[k], objfile))
2670 gnu_personality = 1;
2671 break;
2675 /* If so, the next word contains a word count in the high
2676 byte, followed by the same unwind instructions as the
2677 pre-defined forms. */
2678 if (gnu_personality
2679 && addr + 4 <= extab_vma + extab_data.size ())
2681 word = bfd_h_get_32 (objfile->obfd,
2682 (extab_data.data ()
2683 + addr - extab_vma));
2684 addr += 4;
2685 n_bytes = 3;
2686 n_words = ((word >> 24) & 0xff);
2692 /* Sanity check address. */
2693 if (n_words)
2694 if (addr < extab_vma
2695 || addr + 4 * n_words > extab_vma + extab_data.size ())
2696 n_words = n_bytes = 0;
2698 /* The unwind instructions reside in WORD (only the N_BYTES least
2699 significant bytes are valid), followed by N_WORDS words in the
2700 extab section starting at ADDR. */
2701 if (n_bytes || n_words)
2703 gdb_byte *p = entry
2704 = (gdb_byte *) obstack_alloc (&objfile->objfile_obstack,
2705 n_bytes + n_words * 4 + 1);
2707 while (n_bytes--)
2708 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2710 while (n_words--)
2712 word = bfd_h_get_32 (objfile->obfd,
2713 extab_data.data () + addr - extab_vma);
2714 addr += 4;
2716 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2717 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2718 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2719 *p++ = (gdb_byte) (word & 0xff);
2722 /* Implied "Finish" to terminate the list. */
2723 *p++ = 0xb0;
2726 /* Push entry onto vector. They are guaranteed to always
2727 appear in order of increasing addresses. */
2728 new_exidx_entry.addr = idx;
2729 new_exidx_entry.entry = entry;
2730 data->section_maps[sec->the_bfd_section->index].push_back
2731 (new_exidx_entry);
2735 /* Search for the exception table entry covering MEMADDR. If one is found,
2736 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2737 set *START to the start of the region covered by this entry. */
2739 static gdb_byte *
2740 arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2742 struct obj_section *sec;
2744 sec = find_pc_section (memaddr);
2745 if (sec != NULL)
2747 struct arm_exidx_data *data;
2748 struct arm_exidx_entry map_key = { memaddr - sec->addr (), 0 };
2750 data = arm_exidx_data_key.get (sec->objfile->obfd.get ());
2751 if (data != NULL)
2753 std::vector<arm_exidx_entry> &map
2754 = data->section_maps[sec->the_bfd_section->index];
2755 if (!map.empty ())
2757 auto idx = std::lower_bound (map.begin (), map.end (), map_key);
2759 /* std::lower_bound finds the earliest ordered insertion
2760 point. If the following symbol starts at this exact
2761 address, we use that; otherwise, the preceding
2762 exception table entry covers this address. */
2763 if (idx < map.end ())
2765 if (idx->addr == map_key.addr)
2767 if (start)
2768 *start = idx->addr + sec->addr ();
2769 return idx->entry;
2773 if (idx > map.begin ())
2775 idx = idx - 1;
2776 if (start)
2777 *start = idx->addr + sec->addr ();
2778 return idx->entry;
2784 return NULL;
2787 /* Given the current frame THIS_FRAME, and its associated frame unwinding
2788 instruction list from the ARM exception table entry ENTRY, allocate and
2789 return a prologue cache structure describing how to unwind this frame.
2791 Return NULL if the unwinding instruction list contains a "spare",
2792 "reserved" or "refuse to unwind" instruction as defined in section
2793 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2794 for the ARM Architecture" document. */
2796 static struct arm_prologue_cache *
2797 arm_exidx_fill_cache (frame_info_ptr this_frame, gdb_byte *entry)
2799 CORE_ADDR vsp = 0;
2800 int vsp_valid = 0;
2802 struct arm_prologue_cache *cache;
2803 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2804 arm_cache_init (cache, this_frame);
2806 for (;;)
2808 gdb_byte insn;
2810 /* Whenever we reload SP, we actually have to retrieve its
2811 actual value in the current frame. */
2812 if (!vsp_valid)
2814 if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
2816 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
2817 vsp = get_frame_register_unsigned (this_frame, reg);
2819 else
2821 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr ();
2822 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2825 vsp_valid = 1;
2828 /* Decode next unwind instruction. */
2829 insn = *entry++;
2831 if ((insn & 0xc0) == 0)
2833 int offset = insn & 0x3f;
2834 vsp += (offset << 2) + 4;
2836 else if ((insn & 0xc0) == 0x40)
2838 int offset = insn & 0x3f;
2839 vsp -= (offset << 2) + 4;
2841 else if ((insn & 0xf0) == 0x80)
2843 int mask = ((insn & 0xf) << 8) | *entry++;
2844 int i;
2846 /* The special case of an all-zero mask identifies
2847 "Refuse to unwind". We return NULL to fall back
2848 to the prologue analyzer. */
2849 if (mask == 0)
2850 return NULL;
2852 /* Pop registers r4..r15 under mask. */
2853 for (i = 0; i < 12; i++)
2854 if (mask & (1 << i))
2856 cache->saved_regs[4 + i].set_addr (vsp);
2857 vsp += 4;
2860 /* Special-case popping SP -- we need to reload vsp. */
2861 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2862 vsp_valid = 0;
2864 else if ((insn & 0xf0) == 0x90)
2866 int reg = insn & 0xf;
2868 /* Reserved cases. */
2869 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2870 return NULL;
2872 /* Set SP from another register and mark VSP for reload. */
2873 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2874 vsp_valid = 0;
2876 else if ((insn & 0xf0) == 0xa0)
2878 int count = insn & 0x7;
2879 int pop_lr = (insn & 0x8) != 0;
2880 int i;
2882 /* Pop r4..r[4+count]. */
2883 for (i = 0; i <= count; i++)
2885 cache->saved_regs[4 + i].set_addr (vsp);
2886 vsp += 4;
2889 /* If indicated by flag, pop LR as well. */
2890 if (pop_lr)
2892 cache->saved_regs[ARM_LR_REGNUM].set_addr (vsp);
2893 vsp += 4;
2896 else if (insn == 0xb0)
2898 /* We could only have updated PC by popping into it; if so, it
2899 will show up as address. Otherwise, copy LR into PC. */
2900 if (!cache->saved_regs[ARM_PC_REGNUM].is_addr ())
2901 cache->saved_regs[ARM_PC_REGNUM]
2902 = cache->saved_regs[ARM_LR_REGNUM];
2904 /* We're done. */
2905 break;
2907 else if (insn == 0xb1)
2909 int mask = *entry++;
2910 int i;
2912 /* All-zero mask and mask >= 16 is "spare". */
2913 if (mask == 0 || mask >= 16)
2914 return NULL;
2916 /* Pop r0..r3 under mask. */
2917 for (i = 0; i < 4; i++)
2918 if (mask & (1 << i))
2920 cache->saved_regs[i].set_addr (vsp);
2921 vsp += 4;
2924 else if (insn == 0xb2)
2926 ULONGEST offset = 0;
2927 unsigned shift = 0;
2931 offset |= (*entry & 0x7f) << shift;
2932 shift += 7;
2934 while (*entry++ & 0x80);
2936 vsp += 0x204 + (offset << 2);
2938 else if (insn == 0xb3)
2940 int start = *entry >> 4;
2941 int count = (*entry++) & 0xf;
2942 int i;
2944 /* Only registers D0..D15 are valid here. */
2945 if (start + count >= 16)
2946 return NULL;
2948 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2949 for (i = 0; i <= count; i++)
2951 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
2952 vsp += 8;
2955 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2956 vsp += 4;
2958 else if ((insn & 0xf8) == 0xb8)
2960 int count = insn & 0x7;
2961 int i;
2963 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2964 for (i = 0; i <= count; i++)
2966 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
2967 vsp += 8;
2970 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2971 vsp += 4;
2973 else if (insn == 0xc6)
2975 int start = *entry >> 4;
2976 int count = (*entry++) & 0xf;
2977 int i;
2979 /* Only registers WR0..WR15 are valid. */
2980 if (start + count >= 16)
2981 return NULL;
2983 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2984 for (i = 0; i <= count; i++)
2986 cache->saved_regs[ARM_WR0_REGNUM + start + i].set_addr (vsp);
2987 vsp += 8;
2990 else if (insn == 0xc7)
2992 int mask = *entry++;
2993 int i;
2995 /* All-zero mask and mask >= 16 is "spare". */
2996 if (mask == 0 || mask >= 16)
2997 return NULL;
2999 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
3000 for (i = 0; i < 4; i++)
3001 if (mask & (1 << i))
3003 cache->saved_regs[ARM_WCGR0_REGNUM + i].set_addr (vsp);
3004 vsp += 4;
3007 else if ((insn & 0xf8) == 0xc0)
3009 int count = insn & 0x7;
3010 int i;
3012 /* Pop iwmmx registers WR[10]..WR[10+count]. */
3013 for (i = 0; i <= count; i++)
3015 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].set_addr (vsp);
3016 vsp += 8;
3019 else if (insn == 0xc8)
3021 int start = *entry >> 4;
3022 int count = (*entry++) & 0xf;
3023 int i;
3025 /* Only registers D0..D31 are valid. */
3026 if (start + count >= 16)
3027 return NULL;
3029 /* Pop VFP double-precision registers
3030 D[16+start]..D[16+start+count]. */
3031 for (i = 0; i <= count; i++)
3033 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].set_addr (vsp);
3034 vsp += 8;
3037 else if (insn == 0xc9)
3039 int start = *entry >> 4;
3040 int count = (*entry++) & 0xf;
3041 int i;
3043 /* Pop VFP double-precision registers D[start]..D[start+count]. */
3044 for (i = 0; i <= count; i++)
3046 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
3047 vsp += 8;
3050 else if ((insn & 0xf8) == 0xd0)
3052 int count = insn & 0x7;
3053 int i;
3055 /* Pop VFP double-precision registers D[8]..D[8+count]. */
3056 for (i = 0; i <= count; i++)
3058 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
3059 vsp += 8;
3062 else
3064 /* Everything else is "spare". */
3065 return NULL;
3069 /* If we restore SP from a register, assume this was the frame register.
3070 Otherwise just fall back to SP as frame register. */
3071 if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
3072 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
3073 else
3074 cache->framereg = ARM_SP_REGNUM;
3076 /* Determine offset to previous frame. */
3077 cache->framesize
3078 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
3080 /* We already got the previous SP. */
3081 arm_gdbarch_tdep *tdep
3082 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3083 arm_cache_set_active_sp_value (cache, tdep, vsp);
3085 return cache;
3088 /* Unwinding via ARM exception table entries. Note that the sniffer
3089 already computes a filled-in prologue cache, which is then used
3090 with the same arm_prologue_this_id and arm_prologue_prev_register
3091 routines also used for prologue-parsing based unwinding. */
3093 static int
3094 arm_exidx_unwind_sniffer (const struct frame_unwind *self,
3095 frame_info_ptr this_frame,
3096 void **this_prologue_cache)
3098 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3099 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3100 CORE_ADDR addr_in_block, exidx_region, func_start;
3101 struct arm_prologue_cache *cache;
3102 gdb_byte *entry;
3104 /* See if we have an ARM exception table entry covering this address. */
3105 addr_in_block = get_frame_address_in_block (this_frame);
3106 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
3107 if (!entry)
3108 return 0;
3110 /* The ARM exception table does not describe unwind information
3111 for arbitrary PC values, but is guaranteed to be correct only
3112 at call sites. We have to decide here whether we want to use
3113 ARM exception table information for this frame, or fall back
3114 to using prologue parsing. (Note that if we have DWARF CFI,
3115 this sniffer isn't even called -- CFI is always preferred.)
3117 Before we make this decision, however, we check whether we
3118 actually have *symbol* information for the current frame.
3119 If not, prologue parsing would not work anyway, so we might
3120 as well use the exception table and hope for the best. */
3121 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
3123 int exc_valid = 0;
3125 /* If the next frame is "normal", we are at a call site in this
3126 frame, so exception information is guaranteed to be valid. */
3127 if (get_next_frame (this_frame)
3128 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
3129 exc_valid = 1;
3131 /* Some syscalls keep PC pointing to the SVC instruction itself. */
3132 for (int shift = 0; shift <= 1 && !exc_valid; ++shift)
3134 /* We also assume exception information is valid if we're currently
3135 blocked in a system call. The system library is supposed to
3136 ensure this, so that e.g. pthread cancellation works. */
3137 if (arm_frame_is_thumb (this_frame))
3139 ULONGEST insn;
3141 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3142 - (shift ? 2 : 0)),
3143 2, byte_order_for_code,
3144 &insn)
3145 && (insn & 0xff00) == 0xdf00 /* svc */)
3146 exc_valid = 1;
3148 else
3150 ULONGEST insn;
3152 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3153 - (shift ? 4 : 0)),
3154 4, byte_order_for_code,
3155 &insn)
3156 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
3157 exc_valid = 1;
3161 /* Bail out if we don't know that exception information is valid. */
3162 if (!exc_valid)
3163 return 0;
3165 /* The ARM exception index does not mark the *end* of the region
3166 covered by the entry, and some functions will not have any entry.
3167 To correctly recognize the end of the covered region, the linker
3168 should have inserted dummy records with a CANTUNWIND marker.
3170 Unfortunately, current versions of GNU ld do not reliably do
3171 this, and thus we may have found an incorrect entry above.
3172 As a (temporary) sanity check, we only use the entry if it
3173 lies *within* the bounds of the function. Note that this check
3174 might reject perfectly valid entries that just happen to cover
3175 multiple functions; therefore this check ought to be removed
3176 once the linker is fixed. */
3177 if (func_start > exidx_region)
3178 return 0;
3181 /* Decode the list of unwinding instructions into a prologue cache.
3182 Note that this may fail due to e.g. a "refuse to unwind" code. */
3183 cache = arm_exidx_fill_cache (this_frame, entry);
3184 if (!cache)
3185 return 0;
3187 *this_prologue_cache = cache;
3188 return 1;
3191 struct frame_unwind arm_exidx_unwind = {
3192 "arm exidx",
3193 NORMAL_FRAME,
3194 default_frame_unwind_stop_reason,
3195 arm_prologue_this_id,
3196 arm_prologue_prev_register,
3197 NULL,
3198 arm_exidx_unwind_sniffer
3201 static struct arm_prologue_cache *
3202 arm_make_epilogue_frame_cache (frame_info_ptr this_frame)
3204 struct arm_prologue_cache *cache;
3205 int reg;
3207 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3208 arm_cache_init (cache, this_frame);
3210 /* Still rely on the offset calculated from prologue. */
3211 arm_scan_prologue (this_frame, cache);
3213 /* Since we are in epilogue, the SP has been restored. */
3214 arm_gdbarch_tdep *tdep
3215 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3216 arm_cache_set_active_sp_value (cache, tdep,
3217 get_frame_register_unsigned (this_frame,
3218 ARM_SP_REGNUM));
3220 /* Calculate actual addresses of saved registers using offsets
3221 determined by arm_scan_prologue. */
3222 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
3223 if (cache->saved_regs[reg].is_addr ())
3224 cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr ()
3225 + arm_cache_get_prev_sp_value (cache, tdep));
3227 return cache;
3230 /* Implementation of function hook 'this_id' in
3231 'struct frame_uwnind' for epilogue unwinder. */
3233 static void
3234 arm_epilogue_frame_this_id (frame_info_ptr this_frame,
3235 void **this_cache,
3236 struct frame_id *this_id)
3238 struct arm_prologue_cache *cache;
3239 CORE_ADDR pc, func;
3241 if (*this_cache == NULL)
3242 *this_cache = arm_make_epilogue_frame_cache (this_frame);
3243 cache = (struct arm_prologue_cache *) *this_cache;
3245 /* Use function start address as part of the frame ID. If we cannot
3246 identify the start address (due to missing symbol information),
3247 fall back to just using the current PC. */
3248 pc = get_frame_pc (this_frame);
3249 func = get_frame_func (this_frame);
3250 if (func == 0)
3251 func = pc;
3253 arm_gdbarch_tdep *tdep
3254 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3255 *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), pc);
3258 /* Implementation of function hook 'prev_register' in
3259 'struct frame_uwnind' for epilogue unwinder. */
3261 static struct value *
3262 arm_epilogue_frame_prev_register (frame_info_ptr this_frame,
3263 void **this_cache, int regnum)
3265 if (*this_cache == NULL)
3266 *this_cache = arm_make_epilogue_frame_cache (this_frame);
3268 return arm_prologue_prev_register (this_frame, this_cache, regnum);
3271 static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
3272 CORE_ADDR pc);
3273 static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
3274 CORE_ADDR pc);
3276 /* Implementation of function hook 'sniffer' in
3277 'struct frame_uwnind' for epilogue unwinder. */
3279 static int
3280 arm_epilogue_frame_sniffer (const struct frame_unwind *self,
3281 frame_info_ptr this_frame,
3282 void **this_prologue_cache)
3284 if (frame_relative_level (this_frame) == 0)
3286 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3287 CORE_ADDR pc = get_frame_pc (this_frame);
3289 if (arm_frame_is_thumb (this_frame))
3290 return thumb_stack_frame_destroyed_p (gdbarch, pc);
3291 else
3292 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3294 else
3295 return 0;
3298 /* Frame unwinder from epilogue. */
3300 static const struct frame_unwind arm_epilogue_frame_unwind =
3302 "arm epilogue",
3303 NORMAL_FRAME,
3304 default_frame_unwind_stop_reason,
3305 arm_epilogue_frame_this_id,
3306 arm_epilogue_frame_prev_register,
3307 NULL,
3308 arm_epilogue_frame_sniffer,
3311 /* Recognize GCC's trampoline for thumb call-indirect. If we are in a
3312 trampoline, return the target PC. Otherwise return 0.
3314 void call0a (char c, short s, int i, long l) {}
3316 int main (void)
3318 (*pointer_to_call0a) (c, s, i, l);
3321 Instead of calling a stub library function _call_via_xx (xx is
3322 the register name), GCC may inline the trampoline in the object
3323 file as below (register r2 has the address of call0a).
3325 .global main
3326 .type main, %function
3328 bl .L1
3330 .size main, .-main
3332 .L1:
3333 bx r2
3335 The trampoline 'bx r2' doesn't belong to main. */
3337 static CORE_ADDR
3338 arm_skip_bx_reg (frame_info_ptr frame, CORE_ADDR pc)
3340 /* The heuristics of recognizing such trampoline is that FRAME is
3341 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
3342 if (arm_frame_is_thumb (frame))
3344 gdb_byte buf[2];
3346 if (target_read_memory (pc, buf, 2) == 0)
3348 struct gdbarch *gdbarch = get_frame_arch (frame);
3349 enum bfd_endian byte_order_for_code
3350 = gdbarch_byte_order_for_code (gdbarch);
3351 uint16_t insn
3352 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3354 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3356 CORE_ADDR dest
3357 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
3359 /* Clear the LSB so that gdb core sets step-resume
3360 breakpoint at the right address. */
3361 return UNMAKE_THUMB_ADDR (dest);
3366 return 0;
3369 static struct arm_prologue_cache *
3370 arm_make_stub_cache (frame_info_ptr this_frame)
3372 struct arm_prologue_cache *cache;
3374 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3375 arm_cache_init (cache, this_frame);
3377 arm_gdbarch_tdep *tdep
3378 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3379 arm_cache_set_active_sp_value (cache, tdep,
3380 get_frame_register_unsigned (this_frame,
3381 ARM_SP_REGNUM));
3383 return cache;
3386 /* Our frame ID for a stub frame is the current SP and LR. */
3388 static void
3389 arm_stub_this_id (frame_info_ptr this_frame,
3390 void **this_cache,
3391 struct frame_id *this_id)
3393 struct arm_prologue_cache *cache;
3395 if (*this_cache == NULL)
3396 *this_cache = arm_make_stub_cache (this_frame);
3397 cache = (struct arm_prologue_cache *) *this_cache;
3399 arm_gdbarch_tdep *tdep
3400 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3401 *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep),
3402 get_frame_pc (this_frame));
3405 static int
3406 arm_stub_unwind_sniffer (const struct frame_unwind *self,
3407 frame_info_ptr this_frame,
3408 void **this_prologue_cache)
3410 CORE_ADDR addr_in_block;
3411 gdb_byte dummy[4];
3412 CORE_ADDR pc, start_addr;
3413 const char *name;
3415 addr_in_block = get_frame_address_in_block (this_frame);
3416 pc = get_frame_pc (this_frame);
3417 if (in_plt_section (addr_in_block)
3418 /* We also use the stub winder if the target memory is unreadable
3419 to avoid having the prologue unwinder trying to read it. */
3420 || target_read_memory (pc, dummy, 4) != 0)
3421 return 1;
3423 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
3424 && arm_skip_bx_reg (this_frame, pc) != 0)
3425 return 1;
3427 return 0;
3430 struct frame_unwind arm_stub_unwind = {
3431 "arm stub",
3432 NORMAL_FRAME,
3433 default_frame_unwind_stop_reason,
3434 arm_stub_this_id,
3435 arm_prologue_prev_register,
3436 NULL,
3437 arm_stub_unwind_sniffer
3440 /* Put here the code to store, into CACHE->saved_regs, the addresses
3441 of the saved registers of frame described by THIS_FRAME. CACHE is
3442 returned. */
3444 static struct arm_prologue_cache *
3445 arm_m_exception_cache (frame_info_ptr this_frame)
3447 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3448 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
3449 struct arm_prologue_cache *cache;
3451 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3452 arm_cache_init (cache, this_frame);
3454 /* ARMv7-M Architecture Reference "B1.5.6 Exception entry behavior"
3455 describes which bits in LR that define which stack was used prior
3456 to the exception and if FPU is used (causing extended stack frame). */
3458 /* In the lockup state PC contains a lockup magic value.
3459 The PC value of the the next outer frame is irreversibly
3460 lost. The other registers are intact so LR likely contains
3461 PC of some frame next to the outer one, but we cannot analyze
3462 the next outer frame without knowing its PC
3463 therefore we do not know SP fixup for this frame.
3464 Some heuristics to resynchronize SP might be possible.
3465 For simplicity, just terminate the unwinding to prevent it going
3466 astray and attempting to read data/addresses it shouldn't,
3467 which may cause further issues due to side-effects. */
3468 CORE_ADDR pc = get_frame_pc (this_frame);
3469 if (arm_m_addr_is_lockup (pc))
3471 /* The lockup can be real just in the innermost frame
3472 as the CPU is stopped and cannot create more frames.
3473 If we hit lockup magic PC in the other frame, it is
3474 just a sentinel at the top of stack: do not warn then. */
3475 if (frame_relative_level (this_frame) == 0)
3476 warning (_("ARM M in lockup state, stack unwinding terminated."));
3478 /* Terminate any further stack unwinding. */
3479 arm_cache_set_active_sp_value (cache, tdep, 0);
3480 return cache;
3483 CORE_ADDR lr = get_frame_register_unsigned (this_frame, ARM_LR_REGNUM);
3485 /* ARMv7-M Architecture Reference "A2.3.1 Arm core registers"
3486 states that LR is set to 0xffffffff on reset. ARMv8-M Architecture
3487 Reference "B3.3 Registers" states that LR is set to 0xffffffff on warm
3488 reset if Main Extension is implemented, otherwise the value is unknown. */
3489 if (lr == 0xffffffff)
3491 /* Terminate any further stack unwinding. */
3492 arm_cache_set_active_sp_value (cache, tdep, 0);
3493 return cache;
3496 /* Check FNC_RETURN indicator bits (24-31). */
3497 bool fnc_return = (((lr >> 24) & 0xff) == 0xfe);
3498 if (fnc_return)
3500 /* FNC_RETURN is only valid for targets with Security Extension. */
3501 if (!tdep->have_sec_ext)
3503 error (_("While unwinding an exception frame, found unexpected Link "
3504 "Register value %s that requires the security extension, "
3505 "but the extension was not found or is disabled. This "
3506 "should not happen and may be caused by corrupt data or a "
3507 "bug in GDB."), phex (lr, ARM_INT_REGISTER_SIZE));
3510 if (!arm_unwind_secure_frames)
3512 warning (_("Non-secure to secure stack unwinding disabled."));
3514 /* Terminate any further stack unwinding. */
3515 arm_cache_set_active_sp_value (cache, tdep, 0);
3516 return cache;
3519 ULONGEST xpsr = get_frame_register_unsigned (this_frame, ARM_PS_REGNUM);
3520 if ((xpsr & 0x1ff) != 0)
3521 /* Handler mode: This is the mode that exceptions are handled in. */
3522 arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_msp_s_regnum);
3523 else
3524 /* Thread mode: This is the normal mode that programs run in. */
3525 arm_cache_switch_prev_sp (cache, tdep, tdep->m_profile_psp_s_regnum);
3527 CORE_ADDR unwound_sp = arm_cache_get_prev_sp_value (cache, tdep);
3529 /* Stack layout for a function call from Secure to Non-Secure state
3530 (ARMv8-M section B3.16):
3532 SP Offset
3534 +-------------------+
3535 0x08 | |
3536 +-------------------+ <-- Original SP
3537 0x04 | Partial xPSR |
3538 +-------------------+
3539 0x00 | Return Address |
3540 +===================+ <-- New SP */
3542 cache->saved_regs[ARM_PC_REGNUM].set_addr (unwound_sp + 0x00);
3543 cache->saved_regs[ARM_LR_REGNUM].set_addr (unwound_sp + 0x00);
3544 cache->saved_regs[ARM_PS_REGNUM].set_addr (unwound_sp + 0x04);
3546 arm_cache_set_active_sp_value (cache, tdep, unwound_sp + 0x08);
3548 return cache;
3551 /* Check EXC_RETURN indicator bits (24-31). */
3552 bool exc_return = (((lr >> 24) & 0xff) == 0xff);
3553 if (exc_return)
3555 int sp_regnum;
3556 bool secure_stack_used = false;
3557 bool default_callee_register_stacking = false;
3558 bool exception_domain_is_secure = false;
3559 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
3561 /* Check EXC_RETURN bit SPSEL if Main or Thread (process) stack used. */
3562 bool process_stack_used = (bit (lr, 2) != 0);
3564 if (tdep->have_sec_ext)
3566 secure_stack_used = (bit (lr, 6) != 0);
3567 default_callee_register_stacking = (bit (lr, 5) != 0);
3568 exception_domain_is_secure = (bit (lr, 0) != 0);
3570 /* Unwinding from non-secure to secure can trip security
3571 measures. In order to avoid the debugger being
3572 intrusive, rely on the user to configure the requested
3573 mode. */
3574 if (secure_stack_used && !exception_domain_is_secure
3575 && !arm_unwind_secure_frames)
3577 warning (_("Non-secure to secure stack unwinding disabled."));
3579 /* Terminate any further stack unwinding. */
3580 arm_cache_set_active_sp_value (cache, tdep, 0);
3581 return cache;
3584 if (process_stack_used)
3586 if (secure_stack_used)
3587 /* Secure thread (process) stack used, use PSP_S as SP. */
3588 sp_regnum = tdep->m_profile_psp_s_regnum;
3589 else
3590 /* Non-secure thread (process) stack used, use PSP_NS as SP. */
3591 sp_regnum = tdep->m_profile_psp_ns_regnum;
3593 else
3595 if (secure_stack_used)
3596 /* Secure main stack used, use MSP_S as SP. */
3597 sp_regnum = tdep->m_profile_msp_s_regnum;
3598 else
3599 /* Non-secure main stack used, use MSP_NS as SP. */
3600 sp_regnum = tdep->m_profile_msp_ns_regnum;
3603 else
3605 if (process_stack_used)
3606 /* Thread (process) stack used, use PSP as SP. */
3607 sp_regnum = tdep->m_profile_psp_regnum;
3608 else
3609 /* Main stack used, use MSP as SP. */
3610 sp_regnum = tdep->m_profile_msp_regnum;
3613 /* Set the active SP regnum. */
3614 arm_cache_switch_prev_sp (cache, tdep, sp_regnum);
3616 /* Fetch the SP to use for this frame. */
3617 CORE_ADDR unwound_sp = arm_cache_get_prev_sp_value (cache, tdep);
3619 /* Exception entry context stacking are described in ARMv8-M (section
3620 B3.19) and ARMv7-M (sections B1.5.6 and B1.5.7) Architecture Reference
3621 Manuals.
3623 The following figure shows the structure of the stack frame when
3624 Security and Floating-point extensions are present.
3626 SP Offsets
3627 Without With
3628 Callee Regs Callee Regs
3629 (Secure -> Non-Secure)
3630 +-------------------+
3631 0xA8 | | 0xD0
3632 +===================+ --+ <-- Original SP
3633 0xA4 | S31 | 0xCC |
3634 +-------------------+ |
3635 ... | Additional FP context
3636 +-------------------+ |
3637 0x68 | S16 | 0x90 |
3638 +===================+ --+
3639 0x64 | Reserved | 0x8C |
3640 +-------------------+ |
3641 0x60 | FPSCR | 0x88 |
3642 +-------------------+ |
3643 0x5C | S15 | 0x84 | FP context
3644 +-------------------+ |
3645 ... |
3646 +-------------------+ |
3647 0x20 | S0 | 0x48 |
3648 +===================+ --+
3649 0x1C | xPSR | 0x44 |
3650 +-------------------+ |
3651 0x18 | Return address | 0x40 |
3652 +-------------------+ |
3653 0x14 | LR(R14) | 0x3C |
3654 +-------------------+ |
3655 0x10 | R12 | 0x38 | State context
3656 +-------------------+ |
3657 0x0C | R3 | 0x34 |
3658 +-------------------+ |
3659 ... |
3660 +-------------------+ |
3661 0x00 | R0 | 0x28 |
3662 +===================+ --+
3663 | R11 | 0x24 |
3664 +-------------------+ |
3665 ... |
3666 +-------------------+ | Additional state
3667 | R4 | 0x08 | context when
3668 +-------------------+ | transitioning from
3669 | Reserved | 0x04 | Secure to Non-Secure
3670 +-------------------+ |
3671 | Magic signature | 0x00 |
3672 +===================+ --+ <-- New SP */
3674 uint32_t sp_r0_offset = 0;
3676 /* With the Security extension, the hardware saves R4..R11 too. */
3677 if (tdep->have_sec_ext && secure_stack_used
3678 && (!default_callee_register_stacking || !exception_domain_is_secure))
3680 /* Read R4..R11 from the integer callee registers. */
3681 cache->saved_regs[4].set_addr (unwound_sp + 0x08);
3682 cache->saved_regs[5].set_addr (unwound_sp + 0x0C);
3683 cache->saved_regs[6].set_addr (unwound_sp + 0x10);
3684 cache->saved_regs[7].set_addr (unwound_sp + 0x14);
3685 cache->saved_regs[8].set_addr (unwound_sp + 0x18);
3686 cache->saved_regs[9].set_addr (unwound_sp + 0x1C);
3687 cache->saved_regs[10].set_addr (unwound_sp + 0x20);
3688 cache->saved_regs[11].set_addr (unwound_sp + 0x24);
3689 sp_r0_offset = 0x28;
3692 /* The hardware saves eight 32-bit words, comprising xPSR,
3693 ReturnAddress, LR (R14), R12, R3, R2, R1, R0. See details in
3694 "B1.5.6 Exception entry behavior" in
3695 "ARMv7-M Architecture Reference Manual". */
3696 cache->saved_regs[0].set_addr (unwound_sp + sp_r0_offset);
3697 cache->saved_regs[1].set_addr (unwound_sp + sp_r0_offset + 0x04);
3698 cache->saved_regs[2].set_addr (unwound_sp + sp_r0_offset + 0x08);
3699 cache->saved_regs[3].set_addr (unwound_sp + sp_r0_offset + 0x0C);
3700 cache->saved_regs[ARM_IP_REGNUM].set_addr (unwound_sp + sp_r0_offset
3701 + 0x10);
3702 cache->saved_regs[ARM_LR_REGNUM].set_addr (unwound_sp + sp_r0_offset
3703 + 0x14);
3704 cache->saved_regs[ARM_PC_REGNUM].set_addr (unwound_sp + sp_r0_offset
3705 + 0x18);
3706 cache->saved_regs[ARM_PS_REGNUM].set_addr (unwound_sp + sp_r0_offset
3707 + 0x1C);
3709 /* Check EXC_RETURN bit FTYPE if extended stack frame (FPU regs stored)
3710 type used. */
3711 bool extended_frame_used = (bit (lr, 4) == 0);
3712 if (extended_frame_used)
3714 ULONGEST fpccr;
3715 ULONGEST fpcar;
3717 /* Read FPCCR register. */
3718 if (!safe_read_memory_unsigned_integer (FPCCR, ARM_INT_REGISTER_SIZE,
3719 byte_order, &fpccr))
3721 warning (_("Could not fetch required FPCCR content. Further "
3722 "unwinding is impossible."));
3723 arm_cache_set_active_sp_value (cache, tdep, 0);
3724 return cache;
3727 /* Read FPCAR register. */
3728 if (!safe_read_memory_unsigned_integer (FPCAR, ARM_INT_REGISTER_SIZE,
3729 byte_order, &fpcar))
3731 warning (_("Could not fetch FPCAR content. Further unwinding of "
3732 "FP register values will be unreliable."));
3733 fpcar = 0;
3736 bool fpccr_aspen = bit (fpccr, 31);
3737 bool fpccr_lspen = bit (fpccr, 30);
3738 bool fpccr_ts = bit (fpccr, 26);
3739 bool fpccr_lspact = bit (fpccr, 0);
3741 /* The LSPEN and ASPEN bits indicate if the lazy state preservation
3742 for FP registers is enabled or disabled. The LSPACT bit indicate,
3743 together with FPCAR, if the lazy state preservation feature is
3744 active for the current frame or for another frame.
3745 See "Lazy context save of FP state", in B1.5.7, also ARM AN298,
3746 supported by Cortex-M4F architecture for details. */
3747 bool fpcar_points_to_this_frame = ((unwound_sp + sp_r0_offset + 0x20)
3748 == (fpcar & ~0x7));
3749 bool read_fp_regs_from_stack = (!(fpccr_aspen && fpccr_lspen
3750 && fpccr_lspact
3751 && fpcar_points_to_this_frame));
3753 /* Extended stack frame type used. */
3754 if (read_fp_regs_from_stack)
3756 CORE_ADDR addr = unwound_sp + sp_r0_offset + 0x20;
3757 for (int i = 0; i < 8; i++)
3759 cache->saved_regs[ARM_D0_REGNUM + i].set_addr (addr);
3760 addr += 8;
3763 cache->saved_regs[ARM_FPSCR_REGNUM].set_addr (unwound_sp
3764 + sp_r0_offset + 0x60);
3766 if (tdep->have_sec_ext && !default_callee_register_stacking
3767 && fpccr_ts)
3769 /* Handle floating-point callee saved registers. */
3770 if (read_fp_regs_from_stack)
3772 CORE_ADDR addr = unwound_sp + sp_r0_offset + 0x68;
3773 for (int i = 8; i < 16; i++)
3775 cache->saved_regs[ARM_D0_REGNUM + i].set_addr (addr);
3776 addr += 8;
3780 arm_cache_set_active_sp_value (cache, tdep,
3781 unwound_sp + sp_r0_offset + 0xA8);
3783 else
3785 /* Offset 0x64 is reserved. */
3786 arm_cache_set_active_sp_value (cache, tdep,
3787 unwound_sp + sp_r0_offset + 0x68);
3790 else
3792 /* Standard stack frame type used. */
3793 arm_cache_set_active_sp_value (cache, tdep,
3794 unwound_sp + sp_r0_offset + 0x20);
3797 /* If bit 9 of the saved xPSR is set, then there is a four-byte
3798 aligner between the top of the 32-byte stack frame and the
3799 previous context's stack pointer. */
3800 ULONGEST xpsr;
3801 if (!safe_read_memory_unsigned_integer (cache->saved_regs[ARM_PS_REGNUM]
3802 .addr (), ARM_INT_REGISTER_SIZE,
3803 byte_order, &xpsr))
3805 warning (_("Could not fetch required XPSR content. Further "
3806 "unwinding is impossible."));
3807 arm_cache_set_active_sp_value (cache, tdep, 0);
3808 return cache;
3811 if (bit (xpsr, 9) != 0)
3813 CORE_ADDR new_sp = arm_cache_get_prev_sp_value (cache, tdep) + 4;
3814 arm_cache_set_active_sp_value (cache, tdep, new_sp);
3817 return cache;
3820 internal_error (_("While unwinding an exception frame, "
3821 "found unexpected Link Register value "
3822 "%s. This should not happen and may "
3823 "be caused by corrupt data or a bug in"
3824 " GDB."),
3825 phex (lr, ARM_INT_REGISTER_SIZE));
3828 /* Implementation of the stop_reason hook for arm_m_exception frames. */
3830 static enum unwind_stop_reason
3831 arm_m_exception_frame_unwind_stop_reason (frame_info_ptr this_frame,
3832 void **this_cache)
3834 struct arm_prologue_cache *cache;
3835 arm_gdbarch_tdep *tdep
3836 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3838 if (*this_cache == NULL)
3839 *this_cache = arm_m_exception_cache (this_frame);
3840 cache = (struct arm_prologue_cache *) *this_cache;
3842 /* If we've hit a wall, stop. */
3843 if (arm_cache_get_prev_sp_value (cache, tdep) == 0)
3844 return UNWIND_OUTERMOST;
3846 return UNWIND_NO_REASON;
3849 /* Implementation of function hook 'this_id' in
3850 'struct frame_uwnind'. */
3852 static void
3853 arm_m_exception_this_id (frame_info_ptr this_frame,
3854 void **this_cache,
3855 struct frame_id *this_id)
3857 struct arm_prologue_cache *cache;
3859 if (*this_cache == NULL)
3860 *this_cache = arm_m_exception_cache (this_frame);
3861 cache = (struct arm_prologue_cache *) *this_cache;
3863 /* Our frame ID for a stub frame is the current SP and LR. */
3864 arm_gdbarch_tdep *tdep
3865 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3866 *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep),
3867 get_frame_pc (this_frame));
3870 /* Implementation of function hook 'prev_register' in
3871 'struct frame_uwnind'. */
3873 static struct value *
3874 arm_m_exception_prev_register (frame_info_ptr this_frame,
3875 void **this_cache,
3876 int prev_regnum)
3878 struct arm_prologue_cache *cache;
3879 CORE_ADDR sp_value;
3881 if (*this_cache == NULL)
3882 *this_cache = arm_m_exception_cache (this_frame);
3883 cache = (struct arm_prologue_cache *) *this_cache;
3885 /* The value was already reconstructed into PREV_SP. */
3886 arm_gdbarch_tdep *tdep
3887 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3888 if (prev_regnum == ARM_SP_REGNUM)
3889 return frame_unwind_got_constant (this_frame, prev_regnum,
3890 arm_cache_get_prev_sp_value (cache, tdep));
3892 /* If we are asked to unwind the PC, strip the saved T bit. */
3893 if (prev_regnum == ARM_PC_REGNUM)
3895 struct value *value = trad_frame_get_prev_register (this_frame,
3896 cache->saved_regs,
3897 prev_regnum);
3898 CORE_ADDR pc = value_as_address (value);
3899 return frame_unwind_got_constant (this_frame, prev_regnum,
3900 UNMAKE_THUMB_ADDR (pc));
3903 /* The value might be one of the alternative SP, if so, use the
3904 value already constructed. */
3905 if (arm_is_alternative_sp_register (tdep, prev_regnum))
3907 sp_value = arm_cache_get_sp_register (cache, tdep, prev_regnum);
3908 return frame_unwind_got_constant (this_frame, prev_regnum, sp_value);
3911 /* If we are asked to unwind the xPSR, set T bit if PC is in thumb mode.
3912 LR register is unreliable as it contains FNC_RETURN or EXC_RETURN
3913 pattern. */
3914 if (prev_regnum == ARM_PS_REGNUM)
3916 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3917 struct value *value = trad_frame_get_prev_register (this_frame,
3918 cache->saved_regs,
3919 ARM_PC_REGNUM);
3920 CORE_ADDR pc = value_as_address (value);
3921 value = trad_frame_get_prev_register (this_frame, cache->saved_regs,
3922 ARM_PS_REGNUM);
3923 ULONGEST xpsr = value_as_long (value);
3925 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
3926 xpsr = reconstruct_t_bit (gdbarch, pc, xpsr);
3927 return frame_unwind_got_constant (this_frame, ARM_PS_REGNUM, xpsr);
3930 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3931 prev_regnum);
3934 /* Implementation of function hook 'sniffer' in
3935 'struct frame_uwnind'. */
3937 static int
3938 arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3939 frame_info_ptr this_frame,
3940 void **this_prologue_cache)
3942 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3943 CORE_ADDR this_pc = get_frame_pc (this_frame);
3945 /* No need to check is_m; this sniffer is only registered for
3946 M-profile architectures. */
3948 /* Check if exception frame returns to a magic PC value. */
3949 return arm_m_addr_is_magic (gdbarch, this_pc);
3952 /* Frame unwinder for M-profile exceptions (EXC_RETURN on stack),
3953 lockup and secure/nonsecure interstate function calls (FNC_RETURN). */
3955 struct frame_unwind arm_m_exception_unwind =
3957 "arm m exception lockup sec_fnc",
3958 SIGTRAMP_FRAME,
3959 arm_m_exception_frame_unwind_stop_reason,
3960 arm_m_exception_this_id,
3961 arm_m_exception_prev_register,
3962 NULL,
3963 arm_m_exception_unwind_sniffer
3966 static CORE_ADDR
3967 arm_normal_frame_base (frame_info_ptr this_frame, void **this_cache)
3969 struct arm_prologue_cache *cache;
3971 if (*this_cache == NULL)
3972 *this_cache = arm_make_prologue_cache (this_frame);
3973 cache = (struct arm_prologue_cache *) *this_cache;
3975 arm_gdbarch_tdep *tdep
3976 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3977 return arm_cache_get_prev_sp_value (cache, tdep) - cache->framesize;
3980 struct frame_base arm_normal_base = {
3981 &arm_prologue_unwind,
3982 arm_normal_frame_base,
3983 arm_normal_frame_base,
3984 arm_normal_frame_base
3987 struct arm_dwarf2_prev_register_cache
3989 /* Cached value of the corresponding stack pointer for the inner frame. */
3990 CORE_ADDR sp;
3991 CORE_ADDR msp;
3992 CORE_ADDR msp_s;
3993 CORE_ADDR msp_ns;
3994 CORE_ADDR psp;
3995 CORE_ADDR psp_s;
3996 CORE_ADDR psp_ns;
3999 static struct value *
4000 arm_dwarf2_prev_register (frame_info_ptr this_frame, void **this_cache,
4001 int regnum)
4003 struct gdbarch * gdbarch = get_frame_arch (this_frame);
4004 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4005 CORE_ADDR lr;
4006 ULONGEST cpsr;
4007 arm_dwarf2_prev_register_cache *cache
4008 = ((arm_dwarf2_prev_register_cache *)
4009 dwarf2_frame_get_fn_data (this_frame, this_cache,
4010 arm_dwarf2_prev_register));
4012 if (!cache)
4014 const unsigned int size = sizeof (struct arm_dwarf2_prev_register_cache);
4015 cache = ((arm_dwarf2_prev_register_cache *)
4016 dwarf2_frame_allocate_fn_data (this_frame, this_cache,
4017 arm_dwarf2_prev_register, size));
4019 if (tdep->have_sec_ext)
4021 cache->sp
4022 = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
4024 cache->msp_s
4025 = get_frame_register_unsigned (this_frame,
4026 tdep->m_profile_msp_s_regnum);
4027 cache->msp_ns
4028 = get_frame_register_unsigned (this_frame,
4029 tdep->m_profile_msp_ns_regnum);
4030 cache->psp_s
4031 = get_frame_register_unsigned (this_frame,
4032 tdep->m_profile_psp_s_regnum);
4033 cache->psp_ns
4034 = get_frame_register_unsigned (this_frame,
4035 tdep->m_profile_psp_ns_regnum);
4037 else if (tdep->is_m)
4039 cache->sp
4040 = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
4042 cache->msp
4043 = get_frame_register_unsigned (this_frame,
4044 tdep->m_profile_msp_regnum);
4045 cache->psp
4046 = get_frame_register_unsigned (this_frame,
4047 tdep->m_profile_psp_regnum);
4051 if (regnum == ARM_PC_REGNUM)
4053 /* The PC is normally copied from the return column, which
4054 describes saves of LR. However, that version may have an
4055 extra bit set to indicate Thumb state. The bit is not
4056 part of the PC. */
4058 /* Record in the frame whether the return address was signed. */
4059 if (tdep->have_pacbti)
4061 CORE_ADDR ra_auth_code
4062 = frame_unwind_register_unsigned (this_frame,
4063 tdep->pacbti_pseudo_base);
4065 if (ra_auth_code != 0)
4066 set_frame_previous_pc_masked (this_frame);
4069 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
4070 return frame_unwind_got_constant (this_frame, regnum,
4071 arm_addr_bits_remove (gdbarch, lr));
4073 else if (regnum == ARM_PS_REGNUM)
4075 /* Reconstruct the T bit; see arm_prologue_prev_register for details. */
4076 cpsr = get_frame_register_unsigned (this_frame, regnum);
4077 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
4078 cpsr = reconstruct_t_bit (gdbarch, lr, cpsr);
4079 return frame_unwind_got_constant (this_frame, regnum, cpsr);
4081 else if (arm_is_alternative_sp_register (tdep, regnum))
4083 /* Handle the alternative SP registers on Cortex-M. */
4084 bool override_with_sp_value = false;
4085 CORE_ADDR val;
4087 if (tdep->have_sec_ext)
4089 bool is_msp = (regnum == tdep->m_profile_msp_regnum)
4090 && (cache->msp_s == cache->sp || cache->msp_ns == cache->sp);
4091 bool is_msp_s = (regnum == tdep->m_profile_msp_s_regnum)
4092 && (cache->msp_s == cache->sp);
4093 bool is_msp_ns = (regnum == tdep->m_profile_msp_ns_regnum)
4094 && (cache->msp_ns == cache->sp);
4095 bool is_psp = (regnum == tdep->m_profile_psp_regnum)
4096 && (cache->psp_s == cache->sp || cache->psp_ns == cache->sp);
4097 bool is_psp_s = (regnum == tdep->m_profile_psp_s_regnum)
4098 && (cache->psp_s == cache->sp);
4099 bool is_psp_ns = (regnum == tdep->m_profile_psp_ns_regnum)
4100 && (cache->psp_ns == cache->sp);
4102 override_with_sp_value = is_msp || is_msp_s || is_msp_ns
4103 || is_psp || is_psp_s || is_psp_ns;
4106 else if (tdep->is_m)
4108 bool is_msp = (regnum == tdep->m_profile_msp_regnum)
4109 && (cache->sp == cache->msp);
4110 bool is_psp = (regnum == tdep->m_profile_psp_regnum)
4111 && (cache->sp == cache->psp);
4113 override_with_sp_value = is_msp || is_psp;
4116 if (override_with_sp_value)
4118 /* Use value of SP from previous frame. */
4119 frame_info_ptr prev_frame = get_prev_frame (this_frame);
4120 if (prev_frame)
4121 val = get_frame_register_unsigned (prev_frame, ARM_SP_REGNUM);
4122 else
4123 val = get_frame_base (this_frame);
4125 else
4126 /* Use value for the register from previous frame. */
4127 val = get_frame_register_unsigned (this_frame, regnum);
4129 return frame_unwind_got_constant (this_frame, regnum, val);
4132 internal_error (_("Unexpected register %d"), regnum);
4135 /* Implement the stack_frame_destroyed_p gdbarch method. */
4137 static int
4138 thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4140 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4141 unsigned int insn, insn2;
4142 int found_return = 0, found_stack_adjust = 0;
4143 CORE_ADDR func_start, func_end;
4144 CORE_ADDR scan_pc;
4145 gdb_byte buf[4];
4147 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
4148 return 0;
4150 /* The epilogue is a sequence of instructions along the following lines:
4152 - add stack frame size to SP or FP
4153 - [if frame pointer used] restore SP from FP
4154 - restore registers from SP [may include PC]
4155 - a return-type instruction [if PC wasn't already restored]
4157 In a first pass, we scan forward from the current PC and verify the
4158 instructions we find as compatible with this sequence, ending in a
4159 return instruction.
4161 However, this is not sufficient to distinguish indirect function calls
4162 within a function from indirect tail calls in the epilogue in some cases.
4163 Therefore, if we didn't already find any SP-changing instruction during
4164 forward scan, we add a backward scanning heuristic to ensure we actually
4165 are in the epilogue. */
4167 scan_pc = pc;
4168 while (scan_pc < func_end && !found_return)
4170 if (target_read_memory (scan_pc, buf, 2))
4171 break;
4173 scan_pc += 2;
4174 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
4176 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
4177 found_return = 1;
4178 else if (insn == 0x46f7) /* mov pc, lr */
4179 found_return = 1;
4180 else if (thumb_instruction_restores_sp (insn))
4182 if ((insn & 0xff00) == 0xbd00) /* pop <registers, PC> */
4183 found_return = 1;
4185 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instruction */
4187 if (target_read_memory (scan_pc, buf, 2))
4188 break;
4190 scan_pc += 2;
4191 insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
4193 if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
4195 if (insn2 & 0x8000) /* <registers> include PC. */
4196 found_return = 1;
4198 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
4199 && (insn2 & 0x0fff) == 0x0b04)
4201 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC. */
4202 found_return = 1;
4204 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
4205 && (insn2 & 0x0e00) == 0x0a00)
4207 else
4208 break;
4210 else
4211 break;
4214 if (!found_return)
4215 return 0;
4217 /* Since any instruction in the epilogue sequence, with the possible
4218 exception of return itself, updates the stack pointer, we need to
4219 scan backwards for at most one instruction. Try either a 16-bit or
4220 a 32-bit instruction. This is just a heuristic, so we do not worry
4221 too much about false positives. */
4223 if (pc - 4 < func_start)
4224 return 0;
4225 if (target_read_memory (pc - 4, buf, 4))
4226 return 0;
4228 insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
4229 insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
4231 if (thumb_instruction_restores_sp (insn2))
4232 found_stack_adjust = 1;
4233 else if (insn == 0xe8bd) /* ldm.w sp!, <registers> */
4234 found_stack_adjust = 1;
4235 else if (insn == 0xf85d /* ldr.w <Rt>, [sp], #4 */
4236 && (insn2 & 0x0fff) == 0x0b04)
4237 found_stack_adjust = 1;
4238 else if ((insn & 0xffbf) == 0xecbd /* vldm sp!, <list> */
4239 && (insn2 & 0x0e00) == 0x0a00)
4240 found_stack_adjust = 1;
4242 return found_stack_adjust;
4245 static int
4246 arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
4248 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
4249 unsigned int insn;
4250 int found_return;
4251 CORE_ADDR func_start, func_end;
4253 if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
4254 return 0;
4256 /* We are in the epilogue if the previous instruction was a stack
4257 adjustment and the next instruction is a possible return (bx, mov
4258 pc, or pop). We could have to scan backwards to find the stack
4259 adjustment, or forwards to find the return, but this is a decent
4260 approximation. First scan forwards. */
4262 found_return = 0;
4263 insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
4264 if (bits (insn, 28, 31) != INST_NV)
4266 if ((insn & 0x0ffffff0) == 0x012fff10)
4267 /* BX. */
4268 found_return = 1;
4269 else if ((insn & 0x0ffffff0) == 0x01a0f000)
4270 /* MOV PC. */
4271 found_return = 1;
4272 else if ((insn & 0x0fff0000) == 0x08bd0000
4273 && (insn & 0x0000c000) != 0)
4274 /* POP (LDMIA), including PC or LR. */
4275 found_return = 1;
4278 if (!found_return)
4279 return 0;
4281 /* Scan backwards. This is just a heuristic, so do not worry about
4282 false positives from mode changes. */
4284 if (pc < func_start + 4)
4285 return 0;
4287 insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
4288 if (arm_instruction_restores_sp (insn))
4289 return 1;
4291 return 0;
4294 /* Implement the stack_frame_destroyed_p gdbarch method. */
4296 static int
4297 arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4299 if (arm_pc_is_thumb (gdbarch, pc))
4300 return thumb_stack_frame_destroyed_p (gdbarch, pc);
4301 else
4302 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
4305 /* When arguments must be pushed onto the stack, they go on in reverse
4306 order. The code below implements a FILO (stack) to do this. */
4308 struct arm_stack_item
4310 int len;
4311 struct arm_stack_item *prev;
4312 gdb_byte *data;
4315 static struct arm_stack_item *
4316 push_stack_item (struct arm_stack_item *prev, const gdb_byte *contents,
4317 int len)
4319 struct arm_stack_item *si;
4320 si = XNEW (struct arm_stack_item);
4321 si->data = (gdb_byte *) xmalloc (len);
4322 si->len = len;
4323 si->prev = prev;
4324 memcpy (si->data, contents, len);
4325 return si;
4328 static struct arm_stack_item *
4329 pop_stack_item (struct arm_stack_item *si)
4331 struct arm_stack_item *dead = si;
4332 si = si->prev;
4333 xfree (dead->data);
4334 xfree (dead);
4335 return si;
4338 /* Implement the gdbarch type alignment method, overrides the generic
4339 alignment algorithm for anything that is arm specific. */
4341 static ULONGEST
4342 arm_type_align (gdbarch *gdbarch, struct type *t)
4344 t = check_typedef (t);
4345 if (t->code () == TYPE_CODE_ARRAY && t->is_vector ())
4347 /* Use the natural alignment for vector types (the same for
4348 scalar type), but the maximum alignment is 64-bit. */
4349 if (t->length () > 8)
4350 return 8;
4351 else
4352 return t->length ();
4355 /* Allow the common code to calculate the alignment. */
4356 return 0;
4359 /* Possible base types for a candidate for passing and returning in
4360 VFP registers. */
4362 enum arm_vfp_cprc_base_type
4364 VFP_CPRC_UNKNOWN,
4365 VFP_CPRC_SINGLE,
4366 VFP_CPRC_DOUBLE,
4367 VFP_CPRC_VEC64,
4368 VFP_CPRC_VEC128
4371 /* The length of one element of base type B. */
4373 static unsigned
4374 arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
4376 switch (b)
4378 case VFP_CPRC_SINGLE:
4379 return 4;
4380 case VFP_CPRC_DOUBLE:
4381 return 8;
4382 case VFP_CPRC_VEC64:
4383 return 8;
4384 case VFP_CPRC_VEC128:
4385 return 16;
4386 default:
4387 internal_error (_("Invalid VFP CPRC type: %d."),
4388 (int) b);
4392 /* The character ('s', 'd' or 'q') for the type of VFP register used
4393 for passing base type B. */
4395 static int
4396 arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
4398 switch (b)
4400 case VFP_CPRC_SINGLE:
4401 return 's';
4402 case VFP_CPRC_DOUBLE:
4403 return 'd';
4404 case VFP_CPRC_VEC64:
4405 return 'd';
4406 case VFP_CPRC_VEC128:
4407 return 'q';
4408 default:
4409 internal_error (_("Invalid VFP CPRC type: %d."),
4410 (int) b);
4414 /* Determine whether T may be part of a candidate for passing and
4415 returning in VFP registers, ignoring the limit on the total number
4416 of components. If *BASE_TYPE is VFP_CPRC_UNKNOWN, set it to the
4417 classification of the first valid component found; if it is not
4418 VFP_CPRC_UNKNOWN, all components must have the same classification
4419 as *BASE_TYPE. If it is found that T contains a type not permitted
4420 for passing and returning in VFP registers, a type differently
4421 classified from *BASE_TYPE, or two types differently classified
4422 from each other, return -1, otherwise return the total number of
4423 base-type elements found (possibly 0 in an empty structure or
4424 array). Vector types are not currently supported, matching the
4425 generic AAPCS support. */
4427 static int
4428 arm_vfp_cprc_sub_candidate (struct type *t,
4429 enum arm_vfp_cprc_base_type *base_type)
4431 t = check_typedef (t);
4432 switch (t->code ())
4434 case TYPE_CODE_FLT:
4435 switch (t->length ())
4437 case 4:
4438 if (*base_type == VFP_CPRC_UNKNOWN)
4439 *base_type = VFP_CPRC_SINGLE;
4440 else if (*base_type != VFP_CPRC_SINGLE)
4441 return -1;
4442 return 1;
4444 case 8:
4445 if (*base_type == VFP_CPRC_UNKNOWN)
4446 *base_type = VFP_CPRC_DOUBLE;
4447 else if (*base_type != VFP_CPRC_DOUBLE)
4448 return -1;
4449 return 1;
4451 default:
4452 return -1;
4454 break;
4456 case TYPE_CODE_COMPLEX:
4457 /* Arguments of complex T where T is one of the types float or
4458 double get treated as if they are implemented as:
4460 struct complexT
4462 T real;
4463 T imag;
4467 switch (t->length ())
4469 case 8:
4470 if (*base_type == VFP_CPRC_UNKNOWN)
4471 *base_type = VFP_CPRC_SINGLE;
4472 else if (*base_type != VFP_CPRC_SINGLE)
4473 return -1;
4474 return 2;
4476 case 16:
4477 if (*base_type == VFP_CPRC_UNKNOWN)
4478 *base_type = VFP_CPRC_DOUBLE;
4479 else if (*base_type != VFP_CPRC_DOUBLE)
4480 return -1;
4481 return 2;
4483 default:
4484 return -1;
4486 break;
4488 case TYPE_CODE_ARRAY:
4490 if (t->is_vector ())
4492 /* A 64-bit or 128-bit containerized vector type are VFP
4493 CPRCs. */
4494 switch (t->length ())
4496 case 8:
4497 if (*base_type == VFP_CPRC_UNKNOWN)
4498 *base_type = VFP_CPRC_VEC64;
4499 return 1;
4500 case 16:
4501 if (*base_type == VFP_CPRC_UNKNOWN)
4502 *base_type = VFP_CPRC_VEC128;
4503 return 1;
4504 default:
4505 return -1;
4508 else
4510 int count;
4511 unsigned unitlen;
4513 count = arm_vfp_cprc_sub_candidate (t->target_type (),
4514 base_type);
4515 if (count == -1)
4516 return -1;
4517 if (t->length () == 0)
4519 gdb_assert (count == 0);
4520 return 0;
4522 else if (count == 0)
4523 return -1;
4524 unitlen = arm_vfp_cprc_unit_length (*base_type);
4525 gdb_assert ((t->length () % unitlen) == 0);
4526 return t->length () / unitlen;
4529 break;
4531 case TYPE_CODE_STRUCT:
4533 int count = 0;
4534 unsigned unitlen;
4535 int i;
4536 for (i = 0; i < t->num_fields (); i++)
4538 int sub_count = 0;
4540 if (!t->field (i).is_static ())
4541 sub_count = arm_vfp_cprc_sub_candidate (t->field (i).type (),
4542 base_type);
4543 if (sub_count == -1)
4544 return -1;
4545 count += sub_count;
4547 if (t->length () == 0)
4549 gdb_assert (count == 0);
4550 return 0;
4552 else if (count == 0)
4553 return -1;
4554 unitlen = arm_vfp_cprc_unit_length (*base_type);
4555 if (t->length () != unitlen * count)
4556 return -1;
4557 return count;
4560 case TYPE_CODE_UNION:
4562 int count = 0;
4563 unsigned unitlen;
4564 int i;
4565 for (i = 0; i < t->num_fields (); i++)
4567 int sub_count = arm_vfp_cprc_sub_candidate (t->field (i).type (),
4568 base_type);
4569 if (sub_count == -1)
4570 return -1;
4571 count = (count > sub_count ? count : sub_count);
4573 if (t->length () == 0)
4575 gdb_assert (count == 0);
4576 return 0;
4578 else if (count == 0)
4579 return -1;
4580 unitlen = arm_vfp_cprc_unit_length (*base_type);
4581 if (t->length () != unitlen * count)
4582 return -1;
4583 return count;
4586 default:
4587 break;
4590 return -1;
4593 /* Determine whether T is a VFP co-processor register candidate (CPRC)
4594 if passed to or returned from a non-variadic function with the VFP
4595 ABI in effect. Return 1 if it is, 0 otherwise. If it is, set
4596 *BASE_TYPE to the base type for T and *COUNT to the number of
4597 elements of that base type before returning. */
4599 static int
4600 arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
4601 int *count)
4603 enum arm_vfp_cprc_base_type b = VFP_CPRC_UNKNOWN;
4604 int c = arm_vfp_cprc_sub_candidate (t, &b);
4605 if (c <= 0 || c > 4)
4606 return 0;
4607 *base_type = b;
4608 *count = c;
4609 return 1;
4612 /* Return 1 if the VFP ABI should be used for passing arguments to and
4613 returning values from a function of type FUNC_TYPE, 0
4614 otherwise. */
4616 static int
4617 arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
4619 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4621 /* Variadic functions always use the base ABI. Assume that functions
4622 without debug info are not variadic. */
4623 if (func_type && check_typedef (func_type)->has_varargs ())
4624 return 0;
4626 /* The VFP ABI is only supported as a variant of AAPCS. */
4627 if (tdep->arm_abi != ARM_ABI_AAPCS)
4628 return 0;
4630 return tdep->fp_model == ARM_FLOAT_VFP;
4633 /* We currently only support passing parameters in integer registers, which
4634 conforms with GCC's default model, and VFP argument passing following
4635 the VFP variant of AAPCS. Several other variants exist and
4636 we should probably support some of them based on the selected ABI. */
4638 static CORE_ADDR
4639 arm_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
4640 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
4641 struct value **args, CORE_ADDR sp,
4642 function_call_return_method return_method,
4643 CORE_ADDR struct_addr)
4645 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
4646 int argnum;
4647 int argreg;
4648 int nstack;
4649 struct arm_stack_item *si = NULL;
4650 int use_vfp_abi;
4651 struct type *ftype;
4652 unsigned vfp_regs_free = (1 << 16) - 1;
4653 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4655 /* Determine the type of this function and whether the VFP ABI
4656 applies. */
4657 ftype = check_typedef (function->type ());
4658 if (ftype->code () == TYPE_CODE_PTR)
4659 ftype = check_typedef (ftype->target_type ());
4660 use_vfp_abi = arm_vfp_abi_for_function (gdbarch, ftype);
4662 /* Set the return address. For the ARM, the return breakpoint is
4663 always at BP_ADDR. */
4664 if (arm_pc_is_thumb (gdbarch, bp_addr))
4665 bp_addr |= 1;
4666 regcache_cooked_write_unsigned (regcache, ARM_LR_REGNUM, bp_addr);
4668 /* Walk through the list of args and determine how large a temporary
4669 stack is required. Need to take care here as structs may be
4670 passed on the stack, and we have to push them. */
4671 nstack = 0;
4673 argreg = ARM_A1_REGNUM;
4674 nstack = 0;
4676 /* The struct_return pointer occupies the first parameter
4677 passing register. */
4678 if (return_method == return_method_struct)
4680 arm_debug_printf ("struct return in %s = %s",
4681 gdbarch_register_name (gdbarch, argreg),
4682 paddress (gdbarch, struct_addr));
4684 regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
4685 argreg++;
4688 for (argnum = 0; argnum < nargs; argnum++)
4690 int len;
4691 struct type *arg_type;
4692 struct type *target_type;
4693 enum type_code typecode;
4694 const bfd_byte *val;
4695 int align;
4696 enum arm_vfp_cprc_base_type vfp_base_type;
4697 int vfp_base_count;
4698 int may_use_core_reg = 1;
4700 arg_type = check_typedef (args[argnum]->type ());
4701 len = arg_type->length ();
4702 target_type = arg_type->target_type ();
4703 typecode = arg_type->code ();
4704 val = args[argnum]->contents ().data ();
4706 align = type_align (arg_type);
4707 /* Round alignment up to a whole number of words. */
4708 align = (align + ARM_INT_REGISTER_SIZE - 1)
4709 & ~(ARM_INT_REGISTER_SIZE - 1);
4710 /* Different ABIs have different maximum alignments. */
4711 if (tdep->arm_abi == ARM_ABI_APCS)
4713 /* The APCS ABI only requires word alignment. */
4714 align = ARM_INT_REGISTER_SIZE;
4716 else
4718 /* The AAPCS requires at most doubleword alignment. */
4719 if (align > ARM_INT_REGISTER_SIZE * 2)
4720 align = ARM_INT_REGISTER_SIZE * 2;
4723 if (use_vfp_abi
4724 && arm_vfp_call_candidate (arg_type, &vfp_base_type,
4725 &vfp_base_count))
4727 int regno;
4728 int unit_length;
4729 int shift;
4730 unsigned mask;
4732 /* Because this is a CPRC it cannot go in a core register or
4733 cause a core register to be skipped for alignment.
4734 Either it goes in VFP registers and the rest of this loop
4735 iteration is skipped for this argument, or it goes on the
4736 stack (and the stack alignment code is correct for this
4737 case). */
4738 may_use_core_reg = 0;
4740 unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
4741 shift = unit_length / 4;
4742 mask = (1 << (shift * vfp_base_count)) - 1;
4743 for (regno = 0; regno < 16; regno += shift)
4744 if (((vfp_regs_free >> regno) & mask) == mask)
4745 break;
4747 if (regno < 16)
4749 int reg_char;
4750 int reg_scaled;
4751 int i;
4753 vfp_regs_free &= ~(mask << regno);
4754 reg_scaled = regno / shift;
4755 reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
4756 for (i = 0; i < vfp_base_count; i++)
4758 char name_buf[4];
4759 int regnum;
4760 if (reg_char == 'q')
4761 arm_neon_quad_write (gdbarch, regcache, reg_scaled + i,
4762 val + i * unit_length);
4763 else
4765 xsnprintf (name_buf, sizeof (name_buf), "%c%d",
4766 reg_char, reg_scaled + i);
4767 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
4768 strlen (name_buf));
4769 regcache->cooked_write (regnum, val + i * unit_length);
4772 continue;
4774 else
4776 /* This CPRC could not go in VFP registers, so all VFP
4777 registers are now marked as used. */
4778 vfp_regs_free = 0;
4782 /* Push stack padding for doubleword alignment. */
4783 if (nstack & (align - 1))
4785 si = push_stack_item (si, val, ARM_INT_REGISTER_SIZE);
4786 nstack += ARM_INT_REGISTER_SIZE;
4789 /* Doubleword aligned quantities must go in even register pairs. */
4790 if (may_use_core_reg
4791 && argreg <= ARM_LAST_ARG_REGNUM
4792 && align > ARM_INT_REGISTER_SIZE
4793 && argreg & 1)
4794 argreg++;
4796 /* If the argument is a pointer to a function, and it is a
4797 Thumb function, create a LOCAL copy of the value and set
4798 the THUMB bit in it. */
4799 if (TYPE_CODE_PTR == typecode
4800 && target_type != NULL
4801 && TYPE_CODE_FUNC == check_typedef (target_type)->code ())
4803 CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
4804 if (arm_pc_is_thumb (gdbarch, regval))
4806 bfd_byte *copy = (bfd_byte *) alloca (len);
4807 store_unsigned_integer (copy, len, byte_order,
4808 MAKE_THUMB_ADDR (regval));
4809 val = copy;
4813 /* Copy the argument to general registers or the stack in
4814 register-sized pieces. Large arguments are split between
4815 registers and stack. */
4816 while (len > 0)
4818 int partial_len = len < ARM_INT_REGISTER_SIZE
4819 ? len : ARM_INT_REGISTER_SIZE;
4820 CORE_ADDR regval
4821 = extract_unsigned_integer (val, partial_len, byte_order);
4823 if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
4825 /* The argument is being passed in a general purpose
4826 register. */
4827 arm_debug_printf ("arg %d in %s = 0x%s", argnum,
4828 gdbarch_register_name (gdbarch, argreg),
4829 phex (regval, ARM_INT_REGISTER_SIZE));
4831 regcache_cooked_write_unsigned (regcache, argreg, regval);
4832 argreg++;
4834 else
4836 gdb_byte buf[ARM_INT_REGISTER_SIZE];
4838 memset (buf, 0, sizeof (buf));
4839 store_unsigned_integer (buf, partial_len, byte_order, regval);
4841 /* Push the arguments onto the stack. */
4842 arm_debug_printf ("arg %d @ sp + %d", argnum, nstack);
4843 si = push_stack_item (si, buf, ARM_INT_REGISTER_SIZE);
4844 nstack += ARM_INT_REGISTER_SIZE;
4847 len -= partial_len;
4848 val += partial_len;
4851 /* If we have an odd number of words to push, then decrement the stack
4852 by one word now, so first stack argument will be dword aligned. */
4853 if (nstack & 4)
4854 sp -= 4;
4856 while (si)
4858 sp -= si->len;
4859 write_memory (sp, si->data, si->len);
4860 si = pop_stack_item (si);
4863 /* Finally, update teh SP register. */
4864 regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
4866 return sp;
4870 /* Always align the frame to an 8-byte boundary. This is required on
4871 some platforms and harmless on the rest. */
4873 static CORE_ADDR
4874 arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
4876 /* Align the stack to eight bytes. */
4877 return sp & ~ (CORE_ADDR) 7;
4880 static void
4881 print_fpu_flags (struct ui_file *file, int flags)
4883 if (flags & (1 << 0))
4884 gdb_puts ("IVO ", file);
4885 if (flags & (1 << 1))
4886 gdb_puts ("DVZ ", file);
4887 if (flags & (1 << 2))
4888 gdb_puts ("OFL ", file);
4889 if (flags & (1 << 3))
4890 gdb_puts ("UFL ", file);
4891 if (flags & (1 << 4))
4892 gdb_puts ("INX ", file);
4893 gdb_putc ('\n', file);
4896 /* Print interesting information about the floating point processor
4897 (if present) or emulator. */
4898 static void
4899 arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
4900 frame_info_ptr frame, const char *args)
4902 unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
4903 int type;
4905 type = (status >> 24) & 127;
4906 if (status & (1 << 31))
4907 gdb_printf (file, _("Hardware FPU type %d\n"), type);
4908 else
4909 gdb_printf (file, _("Software FPU type %d\n"), type);
4910 /* i18n: [floating point unit] mask */
4911 gdb_puts (_("mask: "), file);
4912 print_fpu_flags (file, status >> 16);
4913 /* i18n: [floating point unit] flags */
4914 gdb_puts (_("flags: "), file);
4915 print_fpu_flags (file, status);
4918 /* Construct the ARM extended floating point type. */
4919 static struct type *
4920 arm_ext_type (struct gdbarch *gdbarch)
4922 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4924 if (!tdep->arm_ext_type)
4926 type_allocator alloc (gdbarch);
4927 tdep->arm_ext_type
4928 = init_float_type (alloc, -1, "builtin_type_arm_ext",
4929 floatformats_arm_ext);
4932 return tdep->arm_ext_type;
4935 static struct type *
4936 arm_neon_double_type (struct gdbarch *gdbarch)
4938 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4940 if (tdep->neon_double_type == NULL)
4942 struct type *t, *elem;
4944 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_d",
4945 TYPE_CODE_UNION);
4946 elem = builtin_type (gdbarch)->builtin_uint8;
4947 append_composite_type_field (t, "u8", init_vector_type (elem, 8));
4948 elem = builtin_type (gdbarch)->builtin_uint16;
4949 append_composite_type_field (t, "u16", init_vector_type (elem, 4));
4950 elem = builtin_type (gdbarch)->builtin_uint32;
4951 append_composite_type_field (t, "u32", init_vector_type (elem, 2));
4952 elem = builtin_type (gdbarch)->builtin_uint64;
4953 append_composite_type_field (t, "u64", elem);
4954 elem = builtin_type (gdbarch)->builtin_float;
4955 append_composite_type_field (t, "f32", init_vector_type (elem, 2));
4956 elem = builtin_type (gdbarch)->builtin_double;
4957 append_composite_type_field (t, "f64", elem);
4959 t->set_is_vector (true);
4960 t->set_name ("neon_d");
4961 tdep->neon_double_type = t;
4964 return tdep->neon_double_type;
4967 /* FIXME: The vector types are not correctly ordered on big-endian
4968 targets. Just as s0 is the low bits of d0, d0[0] is also the low
4969 bits of d0 - regardless of what unit size is being held in d0. So
4970 the offset of the first uint8 in d0 is 7, but the offset of the
4971 first float is 4. This code works as-is for little-endian
4972 targets. */
4974 static struct type *
4975 arm_neon_quad_type (struct gdbarch *gdbarch)
4977 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4979 if (tdep->neon_quad_type == NULL)
4981 struct type *t, *elem;
4983 t = arch_composite_type (gdbarch, "__gdb_builtin_type_neon_q",
4984 TYPE_CODE_UNION);
4985 elem = builtin_type (gdbarch)->builtin_uint8;
4986 append_composite_type_field (t, "u8", init_vector_type (elem, 16));
4987 elem = builtin_type (gdbarch)->builtin_uint16;
4988 append_composite_type_field (t, "u16", init_vector_type (elem, 8));
4989 elem = builtin_type (gdbarch)->builtin_uint32;
4990 append_composite_type_field (t, "u32", init_vector_type (elem, 4));
4991 elem = builtin_type (gdbarch)->builtin_uint64;
4992 append_composite_type_field (t, "u64", init_vector_type (elem, 2));
4993 elem = builtin_type (gdbarch)->builtin_float;
4994 append_composite_type_field (t, "f32", init_vector_type (elem, 4));
4995 elem = builtin_type (gdbarch)->builtin_double;
4996 append_composite_type_field (t, "f64", init_vector_type (elem, 2));
4998 t->set_is_vector (true);
4999 t->set_name ("neon_q");
5000 tdep->neon_quad_type = t;
5003 return tdep->neon_quad_type;
5006 /* Return true if REGNUM is a Q pseudo register. Return false
5007 otherwise.
5009 REGNUM is the raw register number and not a pseudo-relative register
5010 number. */
5012 static bool
5013 is_q_pseudo (struct gdbarch *gdbarch, int regnum)
5015 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5017 /* Q pseudo registers are available for both NEON (Q0~Q15) and
5018 MVE (Q0~Q7) features. */
5019 if (tdep->have_q_pseudos
5020 && regnum >= tdep->q_pseudo_base
5021 && regnum < (tdep->q_pseudo_base + tdep->q_pseudo_count))
5022 return true;
5024 return false;
5027 /* Return true if REGNUM is a VFP S pseudo register. Return false
5028 otherwise.
5030 REGNUM is the raw register number and not a pseudo-relative register
5031 number. */
5033 static bool
5034 is_s_pseudo (struct gdbarch *gdbarch, int regnum)
5036 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5038 if (tdep->have_s_pseudos
5039 && regnum >= tdep->s_pseudo_base
5040 && regnum < (tdep->s_pseudo_base + tdep->s_pseudo_count))
5041 return true;
5043 return false;
5046 /* Return true if REGNUM is a MVE pseudo register (P0). Return false
5047 otherwise.
5049 REGNUM is the raw register number and not a pseudo-relative register
5050 number. */
5052 static bool
5053 is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
5055 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5057 if (tdep->have_mve
5058 && regnum >= tdep->mve_pseudo_base
5059 && regnum < tdep->mve_pseudo_base + tdep->mve_pseudo_count)
5060 return true;
5062 return false;
5065 /* Return true if REGNUM is a PACBTI pseudo register (ra_auth_code). Return
5066 false otherwise.
5068 REGNUM is the raw register number and not a pseudo-relative register
5069 number. */
5071 static bool
5072 is_pacbti_pseudo (struct gdbarch *gdbarch, int regnum)
5074 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5076 if (tdep->have_pacbti
5077 && regnum >= tdep->pacbti_pseudo_base
5078 && regnum < tdep->pacbti_pseudo_base + tdep->pacbti_pseudo_count)
5079 return true;
5081 return false;
5084 /* Return the GDB type object for the "standard" data type of data in
5085 register N. */
5087 static struct type *
5088 arm_register_type (struct gdbarch *gdbarch, int regnum)
5090 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5092 if (is_s_pseudo (gdbarch, regnum))
5093 return builtin_type (gdbarch)->builtin_float;
5095 if (is_q_pseudo (gdbarch, regnum))
5096 return arm_neon_quad_type (gdbarch);
5098 if (is_mve_pseudo (gdbarch, regnum))
5099 return builtin_type (gdbarch)->builtin_int16;
5101 if (is_pacbti_pseudo (gdbarch, regnum))
5102 return builtin_type (gdbarch)->builtin_uint32;
5104 /* If the target description has register information, we are only
5105 in this function so that we can override the types of
5106 double-precision registers for NEON. */
5107 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
5109 struct type *t = tdesc_register_type (gdbarch, regnum);
5111 if (regnum >= ARM_D0_REGNUM && regnum < ARM_D0_REGNUM + 32
5112 && t->code () == TYPE_CODE_FLT
5113 && tdep->have_neon)
5114 return arm_neon_double_type (gdbarch);
5115 else
5116 return t;
5119 if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
5121 if (!tdep->have_fpa_registers)
5122 return builtin_type (gdbarch)->builtin_void;
5124 return arm_ext_type (gdbarch);
5126 else if (regnum == ARM_SP_REGNUM)
5127 return builtin_type (gdbarch)->builtin_data_ptr;
5128 else if (regnum == ARM_PC_REGNUM)
5129 return builtin_type (gdbarch)->builtin_func_ptr;
5130 else if (regnum >= ARRAY_SIZE (arm_register_names))
5131 /* These registers are only supported on targets which supply
5132 an XML description. */
5133 return builtin_type (gdbarch)->builtin_int0;
5134 else
5135 return builtin_type (gdbarch)->builtin_uint32;
5138 /* Map a DWARF register REGNUM onto the appropriate GDB register
5139 number. */
5141 static int
5142 arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
5144 /* Core integer regs. */
5145 if (reg >= 0 && reg <= 15)
5146 return reg;
5148 /* Legacy FPA encoding. These were once used in a way which
5149 overlapped with VFP register numbering, so their use is
5150 discouraged, but GDB doesn't support the ARM toolchain
5151 which used them for VFP. */
5152 if (reg >= 16 && reg <= 23)
5153 return ARM_F0_REGNUM + reg - 16;
5155 /* New assignments for the FPA registers. */
5156 if (reg >= 96 && reg <= 103)
5157 return ARM_F0_REGNUM + reg - 96;
5159 /* WMMX register assignments. */
5160 if (reg >= 104 && reg <= 111)
5161 return ARM_WCGR0_REGNUM + reg - 104;
5163 if (reg >= 112 && reg <= 127)
5164 return ARM_WR0_REGNUM + reg - 112;
5166 /* PACBTI register containing the Pointer Authentication Code. */
5167 if (reg == ARM_DWARF_RA_AUTH_CODE)
5169 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5171 if (tdep->have_pacbti)
5172 return tdep->pacbti_pseudo_base;
5174 return -1;
5177 if (reg >= 192 && reg <= 199)
5178 return ARM_WC0_REGNUM + reg - 192;
5180 /* VFP v2 registers. A double precision value is actually
5181 in d1 rather than s2, but the ABI only defines numbering
5182 for the single precision registers. This will "just work"
5183 in GDB for little endian targets (we'll read eight bytes,
5184 starting in s0 and then progressing to s1), but will be
5185 reversed on big endian targets with VFP. This won't
5186 be a problem for the new Neon quad registers; you're supposed
5187 to use DW_OP_piece for those. */
5188 if (reg >= 64 && reg <= 95)
5190 char name_buf[4];
5192 xsnprintf (name_buf, sizeof (name_buf), "s%d", reg - 64);
5193 return user_reg_map_name_to_regnum (gdbarch, name_buf,
5194 strlen (name_buf));
5197 /* VFP v3 / Neon registers. This range is also used for VFP v2
5198 registers, except that it now describes d0 instead of s0. */
5199 if (reg >= 256 && reg <= 287)
5201 char name_buf[4];
5203 xsnprintf (name_buf, sizeof (name_buf), "d%d", reg - 256);
5204 return user_reg_map_name_to_regnum (gdbarch, name_buf,
5205 strlen (name_buf));
5208 return -1;
5211 /* Map GDB internal REGNUM onto the Arm simulator register numbers. */
5212 static int
5213 arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
5215 int reg = regnum;
5216 gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
5218 if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
5219 return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
5221 if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
5222 return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
5224 if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
5225 return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
5227 if (reg < NUM_GREGS)
5228 return SIM_ARM_R0_REGNUM + reg;
5229 reg -= NUM_GREGS;
5231 if (reg < NUM_FREGS)
5232 return SIM_ARM_FP0_REGNUM + reg;
5233 reg -= NUM_FREGS;
5235 if (reg < NUM_SREGS)
5236 return SIM_ARM_FPS_REGNUM + reg;
5237 reg -= NUM_SREGS;
5239 internal_error (_("Bad REGNUM %d"), regnum);
5242 static const unsigned char op_lit0 = DW_OP_lit0;
5244 static void
5245 arm_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
5246 struct dwarf2_frame_state_reg *reg,
5247 frame_info_ptr this_frame)
5249 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5251 if (is_pacbti_pseudo (gdbarch, regnum))
5253 /* Initialize RA_AUTH_CODE to zero. */
5254 reg->how = DWARF2_FRAME_REG_SAVED_VAL_EXP;
5255 reg->loc.exp.start = &op_lit0;
5256 reg->loc.exp.len = 1;
5257 return;
5260 if (regnum == ARM_PC_REGNUM || regnum == ARM_PS_REGNUM)
5262 reg->how = DWARF2_FRAME_REG_FN;
5263 reg->loc.fn = arm_dwarf2_prev_register;
5265 else if (regnum == ARM_SP_REGNUM)
5266 reg->how = DWARF2_FRAME_REG_CFA;
5267 else if (arm_is_alternative_sp_register (tdep, regnum))
5269 /* Handle the alternative SP registers on Cortex-M. */
5270 reg->how = DWARF2_FRAME_REG_FN;
5271 reg->loc.fn = arm_dwarf2_prev_register;
5275 /* Given BUF, which is OLD_LEN bytes ending at ENDADDR, expand
5276 the buffer to be NEW_LEN bytes ending at ENDADDR. Return
5277 NULL if an error occurs. BUF is freed. */
5279 static gdb_byte *
5280 extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
5281 int old_len, int new_len)
5283 gdb_byte *new_buf;
5284 int bytes_to_read = new_len - old_len;
5286 new_buf = (gdb_byte *) xmalloc (new_len);
5287 memcpy (new_buf + bytes_to_read, buf, old_len);
5288 xfree (buf);
5289 if (target_read_code (endaddr - new_len, new_buf, bytes_to_read) != 0)
5291 xfree (new_buf);
5292 return NULL;
5294 return new_buf;
5297 /* An IT block is at most the 2-byte IT instruction followed by
5298 four 4-byte instructions. The furthest back we must search to
5299 find an IT block that affects the current instruction is thus
5300 2 + 3 * 4 == 14 bytes. */
5301 #define MAX_IT_BLOCK_PREFIX 14
5303 /* Use a quick scan if there are more than this many bytes of
5304 code. */
5305 #define IT_SCAN_THRESHOLD 32
5307 /* Adjust a breakpoint's address to move breakpoints out of IT blocks.
5308 A breakpoint in an IT block may not be hit, depending on the
5309 condition flags. */
5310 static CORE_ADDR
5311 arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
5313 gdb_byte *buf;
5314 char map_type;
5315 CORE_ADDR boundary, func_start;
5316 int buf_len;
5317 enum bfd_endian order = gdbarch_byte_order_for_code (gdbarch);
5318 int i, any, last_it, last_it_count;
5319 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5321 /* If we are using BKPT breakpoints, none of this is necessary. */
5322 if (tdep->thumb2_breakpoint == NULL)
5323 return bpaddr;
5325 /* ARM mode does not have this problem. */
5326 if (!arm_pc_is_thumb (gdbarch, bpaddr))
5327 return bpaddr;
5329 /* We are setting a breakpoint in Thumb code that could potentially
5330 contain an IT block. The first step is to find how much Thumb
5331 code there is; we do not need to read outside of known Thumb
5332 sequences. */
5333 map_type = arm_find_mapping_symbol (bpaddr, &boundary);
5334 if (map_type == 0)
5335 /* Thumb-2 code must have mapping symbols to have a chance. */
5336 return bpaddr;
5338 bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
5340 if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL))
5342 func_start = gdbarch_addr_bits_remove (gdbarch, func_start);
5343 if (func_start > boundary)
5344 boundary = func_start;
5347 /* Search for a candidate IT instruction. We have to do some fancy
5348 footwork to distinguish a real IT instruction from the second
5349 half of a 32-bit instruction, but there is no need for that if
5350 there's no candidate. */
5351 buf_len = std::min (bpaddr - boundary, (CORE_ADDR) MAX_IT_BLOCK_PREFIX);
5352 if (buf_len == 0)
5353 /* No room for an IT instruction. */
5354 return bpaddr;
5356 buf = (gdb_byte *) xmalloc (buf_len);
5357 if (target_read_code (bpaddr - buf_len, buf, buf_len) != 0)
5358 return bpaddr;
5359 any = 0;
5360 for (i = 0; i < buf_len; i += 2)
5362 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5363 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5365 any = 1;
5366 break;
5370 if (any == 0)
5372 xfree (buf);
5373 return bpaddr;
5376 /* OK, the code bytes before this instruction contain at least one
5377 halfword which resembles an IT instruction. We know that it's
5378 Thumb code, but there are still two possibilities. Either the
5379 halfword really is an IT instruction, or it is the second half of
5380 a 32-bit Thumb instruction. The only way we can tell is to
5381 scan forwards from a known instruction boundary. */
5382 if (bpaddr - boundary > IT_SCAN_THRESHOLD)
5384 int definite;
5386 /* There's a lot of code before this instruction. Start with an
5387 optimistic search; it's easy to recognize halfwords that can
5388 not be the start of a 32-bit instruction, and use that to
5389 lock on to the instruction boundaries. */
5390 buf = extend_buffer_earlier (buf, bpaddr, buf_len, IT_SCAN_THRESHOLD);
5391 if (buf == NULL)
5392 return bpaddr;
5393 buf_len = IT_SCAN_THRESHOLD;
5395 definite = 0;
5396 for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
5398 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5399 if (thumb_insn_size (inst1) == 2)
5401 definite = 1;
5402 break;
5406 /* At this point, if DEFINITE, BUF[I] is the first place we
5407 are sure that we know the instruction boundaries, and it is far
5408 enough from BPADDR that we could not miss an IT instruction
5409 affecting BPADDR. If ! DEFINITE, give up - start from a
5410 known boundary. */
5411 if (! definite)
5413 buf = extend_buffer_earlier (buf, bpaddr, buf_len,
5414 bpaddr - boundary);
5415 if (buf == NULL)
5416 return bpaddr;
5417 buf_len = bpaddr - boundary;
5418 i = 0;
5421 else
5423 buf = extend_buffer_earlier (buf, bpaddr, buf_len, bpaddr - boundary);
5424 if (buf == NULL)
5425 return bpaddr;
5426 buf_len = bpaddr - boundary;
5427 i = 0;
5430 /* Scan forwards. Find the last IT instruction before BPADDR. */
5431 last_it = -1;
5432 last_it_count = 0;
5433 while (i < buf_len)
5435 unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5436 last_it_count--;
5437 if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5439 last_it = i;
5440 if (inst1 & 0x0001)
5441 last_it_count = 4;
5442 else if (inst1 & 0x0002)
5443 last_it_count = 3;
5444 else if (inst1 & 0x0004)
5445 last_it_count = 2;
5446 else
5447 last_it_count = 1;
5449 i += thumb_insn_size (inst1);
5452 xfree (buf);
5454 if (last_it == -1)
5455 /* There wasn't really an IT instruction after all. */
5456 return bpaddr;
5458 if (last_it_count < 1)
5459 /* It was too far away. */
5460 return bpaddr;
5462 /* This really is a trouble spot. Move the breakpoint to the IT
5463 instruction. */
5464 return bpaddr - buf_len + last_it;
5467 /* ARM displaced stepping support.
5469 Generally ARM displaced stepping works as follows:
5471 1. When an instruction is to be single-stepped, it is first decoded by
5472 arm_process_displaced_insn. Depending on the type of instruction, it is
5473 then copied to a scratch location, possibly in a modified form. The
5474 copy_* set of functions performs such modification, as necessary. A
5475 breakpoint is placed after the modified instruction in the scratch space
5476 to return control to GDB. Note in particular that instructions which
5477 modify the PC will no longer do so after modification.
5479 2. The instruction is single-stepped, by setting the PC to the scratch
5480 location address, and resuming. Control returns to GDB when the
5481 breakpoint is hit.
5483 3. A cleanup function (cleanup_*) is called corresponding to the copy_*
5484 function used for the current instruction. This function's job is to
5485 put the CPU/memory state back to what it would have been if the
5486 instruction had been executed unmodified in its original location. */
5488 /* NOP instruction (mov r0, r0). */
5489 #define ARM_NOP 0xe1a00000
5490 #define THUMB_NOP 0x4600
5492 /* Helper for register reads for displaced stepping. In particular, this
5493 returns the PC as it would be seen by the instruction at its original
5494 location. */
5496 ULONGEST
5497 displaced_read_reg (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5498 int regno)
5500 ULONGEST ret;
5501 CORE_ADDR from = dsc->insn_addr;
5503 if (regno == ARM_PC_REGNUM)
5505 /* Compute pipeline offset:
5506 - When executing an ARM instruction, PC reads as the address of the
5507 current instruction plus 8.
5508 - When executing a Thumb instruction, PC reads as the address of the
5509 current instruction plus 4. */
5511 if (!dsc->is_thumb)
5512 from += 8;
5513 else
5514 from += 4;
5516 displaced_debug_printf ("read pc value %.8lx",
5517 (unsigned long) from);
5518 return (ULONGEST) from;
5520 else
5522 regcache_cooked_read_unsigned (regs, regno, &ret);
5524 displaced_debug_printf ("read r%d value %.8lx",
5525 regno, (unsigned long) ret);
5527 return ret;
5531 static int
5532 displaced_in_arm_mode (struct regcache *regs)
5534 ULONGEST ps;
5535 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
5537 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5539 return (ps & t_bit) == 0;
5542 /* Write to the PC as from a branch instruction. */
5544 static void
5545 branch_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5546 ULONGEST val)
5548 if (!dsc->is_thumb)
5549 /* Note: If bits 0/1 are set, this branch would be unpredictable for
5550 architecture versions < 6. */
5551 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5552 val & ~(ULONGEST) 0x3);
5553 else
5554 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
5555 val & ~(ULONGEST) 0x1);
5558 /* Write to the PC as from a branch-exchange instruction. */
5560 static void
5561 bx_write_pc (struct regcache *regs, ULONGEST val)
5563 ULONGEST ps;
5564 ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
5566 regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5568 if ((val & 1) == 1)
5570 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
5571 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
5573 else if ((val & 2) == 0)
5575 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
5576 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
5578 else
5580 /* Unpredictable behaviour. Try to do something sensible (switch to ARM
5581 mode, align dest to 4 bytes). */
5582 warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
5583 regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
5584 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
5588 /* Write to the PC as if from a load instruction. */
5590 static void
5591 load_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5592 ULONGEST val)
5594 if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
5595 bx_write_pc (regs, val);
5596 else
5597 branch_write_pc (regs, dsc, val);
5600 /* Write to the PC as if from an ALU instruction. */
5602 static void
5603 alu_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5604 ULONGEST val)
5606 if (DISPLACED_STEPPING_ARCH_VERSION >= 7 && !dsc->is_thumb)
5607 bx_write_pc (regs, val);
5608 else
5609 branch_write_pc (regs, dsc, val);
5612 /* Helper for writing to registers for displaced stepping. Writing to the PC
5613 has a varying effects depending on the instruction which does the write:
5614 this is controlled by the WRITE_PC argument. */
5616 void
5617 displaced_write_reg (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5618 int regno, ULONGEST val, enum pc_write_style write_pc)
5620 if (regno == ARM_PC_REGNUM)
5622 displaced_debug_printf ("writing pc %.8lx", (unsigned long) val);
5624 switch (write_pc)
5626 case BRANCH_WRITE_PC:
5627 branch_write_pc (regs, dsc, val);
5628 break;
5630 case BX_WRITE_PC:
5631 bx_write_pc (regs, val);
5632 break;
5634 case LOAD_WRITE_PC:
5635 load_write_pc (regs, dsc, val);
5636 break;
5638 case ALU_WRITE_PC:
5639 alu_write_pc (regs, dsc, val);
5640 break;
5642 case CANNOT_WRITE_PC:
5643 warning (_("Instruction wrote to PC in an unexpected way when "
5644 "single-stepping"));
5645 break;
5647 default:
5648 internal_error (_("Invalid argument to displaced_write_reg"));
5651 dsc->wrote_to_pc = 1;
5653 else
5655 displaced_debug_printf ("writing r%d value %.8lx",
5656 regno, (unsigned long) val);
5657 regcache_cooked_write_unsigned (regs, regno, val);
5661 /* This function is used to concisely determine if an instruction INSN
5662 references PC. Register fields of interest in INSN should have the
5663 corresponding fields of BITMASK set to 0b1111. The function
5664 returns return 1 if any of these fields in INSN reference the PC
5665 (also 0b1111, r15), else it returns 0. */
5667 static int
5668 insn_references_pc (uint32_t insn, uint32_t bitmask)
5670 uint32_t lowbit = 1;
5672 while (bitmask != 0)
5674 uint32_t mask;
5676 for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
5679 if (!lowbit)
5680 break;
5682 mask = lowbit * 0xf;
5684 if ((insn & mask) == mask)
5685 return 1;
5687 bitmask &= ~mask;
5690 return 0;
5693 /* The simplest copy function. Many instructions have the same effect no
5694 matter what address they are executed at: in those cases, use this. */
5696 static int
5697 arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn, const char *iname,
5698 arm_displaced_step_copy_insn_closure *dsc)
5700 displaced_debug_printf ("copying insn %.8lx, opcode/class '%s' unmodified",
5701 (unsigned long) insn, iname);
5703 dsc->modinsn[0] = insn;
5705 return 0;
5708 static int
5709 thumb_copy_unmodified_32bit (struct gdbarch *gdbarch, uint16_t insn1,
5710 uint16_t insn2, const char *iname,
5711 arm_displaced_step_copy_insn_closure *dsc)
5713 displaced_debug_printf ("copying insn %.4x %.4x, opcode/class '%s' "
5714 "unmodified", insn1, insn2, iname);
5716 dsc->modinsn[0] = insn1;
5717 dsc->modinsn[1] = insn2;
5718 dsc->numinsns = 2;
5720 return 0;
5723 /* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
5724 modification. */
5725 static int
5726 thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
5727 const char *iname,
5728 arm_displaced_step_copy_insn_closure *dsc)
5730 displaced_debug_printf ("copying insn %.4x, opcode/class '%s' unmodified",
5731 insn, iname);
5733 dsc->modinsn[0] = insn;
5735 return 0;
5738 /* Preload instructions with immediate offset. */
5740 static void
5741 cleanup_preload (struct gdbarch *gdbarch, regcache *regs,
5742 arm_displaced_step_copy_insn_closure *dsc)
5744 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5745 if (!dsc->u.preload.immed)
5746 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
5749 static void
5750 install_preload (struct gdbarch *gdbarch, struct regcache *regs,
5751 arm_displaced_step_copy_insn_closure *dsc, unsigned int rn)
5753 ULONGEST rn_val;
5754 /* Preload instructions:
5756 {pli/pld} [rn, #+/-imm]
5758 {pli/pld} [r0, #+/-imm]. */
5760 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5761 rn_val = displaced_read_reg (regs, dsc, rn);
5762 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5763 dsc->u.preload.immed = 1;
5765 dsc->cleanup = &cleanup_preload;
5768 static int
5769 arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5770 arm_displaced_step_copy_insn_closure *dsc)
5772 unsigned int rn = bits (insn, 16, 19);
5774 if (!insn_references_pc (insn, 0x000f0000ul))
5775 return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
5777 displaced_debug_printf ("copying preload insn %.8lx", (unsigned long) insn);
5779 dsc->modinsn[0] = insn & 0xfff0ffff;
5781 install_preload (gdbarch, regs, dsc, rn);
5783 return 0;
5786 static int
5787 thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
5788 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
5790 unsigned int rn = bits (insn1, 0, 3);
5791 unsigned int u_bit = bit (insn1, 7);
5792 int imm12 = bits (insn2, 0, 11);
5793 ULONGEST pc_val;
5795 if (rn != ARM_PC_REGNUM)
5796 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
5798 /* PC is only allowed to use in PLI (immediate,literal) Encoding T3, and
5799 PLD (literal) Encoding T1. */
5800 displaced_debug_printf ("copying pld/pli pc (0x%x) %c imm12 %.4x",
5801 (unsigned int) dsc->insn_addr, u_bit ? '+' : '-',
5802 imm12);
5804 if (!u_bit)
5805 imm12 = -1 * imm12;
5807 /* Rewrite instruction {pli/pld} PC imm12 into:
5808 Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
5810 {pli/pld} [r0, r1]
5812 Cleanup: r0 <- tmp[0], r1 <- tmp[1]. */
5814 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5815 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5817 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5819 displaced_write_reg (regs, dsc, 0, pc_val, CANNOT_WRITE_PC);
5820 displaced_write_reg (regs, dsc, 1, imm12, CANNOT_WRITE_PC);
5821 dsc->u.preload.immed = 0;
5823 /* {pli/pld} [r0, r1] */
5824 dsc->modinsn[0] = insn1 & 0xfff0;
5825 dsc->modinsn[1] = 0xf001;
5826 dsc->numinsns = 2;
5828 dsc->cleanup = &cleanup_preload;
5829 return 0;
5832 /* Preload instructions with register offset. */
5834 static void
5835 install_preload_reg(struct gdbarch *gdbarch, struct regcache *regs,
5836 arm_displaced_step_copy_insn_closure *dsc, unsigned int rn,
5837 unsigned int rm)
5839 ULONGEST rn_val, rm_val;
5841 /* Preload register-offset instructions:
5843 {pli/pld} [rn, rm {, shift}]
5845 {pli/pld} [r0, r1 {, shift}]. */
5847 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5848 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5849 rn_val = displaced_read_reg (regs, dsc, rn);
5850 rm_val = displaced_read_reg (regs, dsc, rm);
5851 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5852 displaced_write_reg (regs, dsc, 1, rm_val, CANNOT_WRITE_PC);
5853 dsc->u.preload.immed = 0;
5855 dsc->cleanup = &cleanup_preload;
5858 static int
5859 arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
5860 struct regcache *regs,
5861 arm_displaced_step_copy_insn_closure *dsc)
5863 unsigned int rn = bits (insn, 16, 19);
5864 unsigned int rm = bits (insn, 0, 3);
5867 if (!insn_references_pc (insn, 0x000f000ful))
5868 return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
5870 displaced_debug_printf ("copying preload insn %.8lx",
5871 (unsigned long) insn);
5873 dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
5875 install_preload_reg (gdbarch, regs, dsc, rn, rm);
5876 return 0;
5879 /* Copy/cleanup coprocessor load and store instructions. */
5881 static void
5882 cleanup_copro_load_store (struct gdbarch *gdbarch,
5883 struct regcache *regs,
5884 arm_displaced_step_copy_insn_closure *dsc)
5886 ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
5888 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5890 if (dsc->u.ldst.writeback)
5891 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
5894 static void
5895 install_copro_load_store (struct gdbarch *gdbarch, struct regcache *regs,
5896 arm_displaced_step_copy_insn_closure *dsc,
5897 int writeback, unsigned int rn)
5899 ULONGEST rn_val;
5901 /* Coprocessor load/store instructions:
5903 {stc/stc2} [<Rn>, #+/-imm] (and other immediate addressing modes)
5905 {stc/stc2} [r0, #+/-imm].
5907 ldc/ldc2 are handled identically. */
5909 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5910 rn_val = displaced_read_reg (regs, dsc, rn);
5911 /* PC should be 4-byte aligned. */
5912 rn_val = rn_val & 0xfffffffc;
5913 displaced_write_reg (regs, dsc, 0, rn_val, CANNOT_WRITE_PC);
5915 dsc->u.ldst.writeback = writeback;
5916 dsc->u.ldst.rn = rn;
5918 dsc->cleanup = &cleanup_copro_load_store;
5921 static int
5922 arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
5923 struct regcache *regs,
5924 arm_displaced_step_copy_insn_closure *dsc)
5926 unsigned int rn = bits (insn, 16, 19);
5928 if (!insn_references_pc (insn, 0x000f0000ul))
5929 return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
5931 displaced_debug_printf ("copying coprocessor load/store insn %.8lx",
5932 (unsigned long) insn);
5934 dsc->modinsn[0] = insn & 0xfff0ffff;
5936 install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
5938 return 0;
5941 static int
5942 thumb2_copy_copro_load_store (struct gdbarch *gdbarch, uint16_t insn1,
5943 uint16_t insn2, struct regcache *regs,
5944 arm_displaced_step_copy_insn_closure *dsc)
5946 unsigned int rn = bits (insn1, 0, 3);
5948 if (rn != ARM_PC_REGNUM)
5949 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
5950 "copro load/store", dsc);
5952 displaced_debug_printf ("copying coprocessor load/store insn %.4x%.4x",
5953 insn1, insn2);
5955 dsc->modinsn[0] = insn1 & 0xfff0;
5956 dsc->modinsn[1] = insn2;
5957 dsc->numinsns = 2;
5959 /* This function is called for copying instruction LDC/LDC2/VLDR, which
5960 doesn't support writeback, so pass 0. */
5961 install_copro_load_store (gdbarch, regs, dsc, 0, rn);
5963 return 0;
5966 /* Clean up branch instructions (actually perform the branch, by setting
5967 PC). */
5969 static void
5970 cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
5971 arm_displaced_step_copy_insn_closure *dsc)
5973 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
5974 int branch_taken = condition_true (dsc->u.branch.cond, status);
5975 enum pc_write_style write_pc = dsc->u.branch.exchange
5976 ? BX_WRITE_PC : BRANCH_WRITE_PC;
5978 if (!branch_taken)
5979 return;
5981 if (dsc->u.branch.link)
5983 /* The value of LR should be the next insn of current one. In order
5984 not to confuse logic handling later insn `bx lr', if current insn mode
5985 is Thumb, the bit 0 of LR value should be set to 1. */
5986 ULONGEST next_insn_addr = dsc->insn_addr + dsc->insn_size;
5988 if (dsc->is_thumb)
5989 next_insn_addr |= 0x1;
5991 displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
5992 CANNOT_WRITE_PC);
5995 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
5998 /* Copy B/BL/BLX instructions with immediate destinations. */
6000 static void
6001 install_b_bl_blx (struct gdbarch *gdbarch, struct regcache *regs,
6002 arm_displaced_step_copy_insn_closure *dsc,
6003 unsigned int cond, int exchange, int link, long offset)
6005 /* Implement "BL<cond> <label>" as:
6007 Preparation: cond <- instruction condition
6008 Insn: mov r0, r0 (nop)
6009 Cleanup: if (condition true) { r14 <- pc; pc <- label }.
6011 B<cond> similar, but don't set r14 in cleanup. */
6013 dsc->u.branch.cond = cond;
6014 dsc->u.branch.link = link;
6015 dsc->u.branch.exchange = exchange;
6017 dsc->u.branch.dest = dsc->insn_addr;
6018 if (link && exchange)
6019 /* For BLX, offset is computed from the Align (PC, 4). */
6020 dsc->u.branch.dest = dsc->u.branch.dest & 0xfffffffc;
6022 if (dsc->is_thumb)
6023 dsc->u.branch.dest += 4 + offset;
6024 else
6025 dsc->u.branch.dest += 8 + offset;
6027 dsc->cleanup = &cleanup_branch;
6029 static int
6030 arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
6031 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6033 unsigned int cond = bits (insn, 28, 31);
6034 int exchange = (cond == 0xf);
6035 int link = exchange || bit (insn, 24);
6036 long offset;
6038 displaced_debug_printf ("copying %s immediate insn %.8lx",
6039 (exchange) ? "blx" : (link) ? "bl" : "b",
6040 (unsigned long) insn);
6041 if (exchange)
6042 /* For BLX, set bit 0 of the destination. The cleanup_branch function will
6043 then arrange the switch into Thumb mode. */
6044 offset = (bits (insn, 0, 23) << 2) | (bit (insn, 24) << 1) | 1;
6045 else
6046 offset = bits (insn, 0, 23) << 2;
6048 if (bit (offset, 25))
6049 offset = offset | ~0x3ffffff;
6051 dsc->modinsn[0] = ARM_NOP;
6053 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
6054 return 0;
6057 static int
6058 thumb2_copy_b_bl_blx (struct gdbarch *gdbarch, uint16_t insn1,
6059 uint16_t insn2, struct regcache *regs,
6060 arm_displaced_step_copy_insn_closure *dsc)
6062 int link = bit (insn2, 14);
6063 int exchange = link && !bit (insn2, 12);
6064 int cond = INST_AL;
6065 long offset = 0;
6066 int j1 = bit (insn2, 13);
6067 int j2 = bit (insn2, 11);
6068 int s = sbits (insn1, 10, 10);
6069 int i1 = !(j1 ^ bit (insn1, 10));
6070 int i2 = !(j2 ^ bit (insn1, 10));
6072 if (!link && !exchange) /* B */
6074 offset = (bits (insn2, 0, 10) << 1);
6075 if (bit (insn2, 12)) /* Encoding T4 */
6077 offset |= (bits (insn1, 0, 9) << 12)
6078 | (i2 << 22)
6079 | (i1 << 23)
6080 | (s << 24);
6081 cond = INST_AL;
6083 else /* Encoding T3 */
6085 offset |= (bits (insn1, 0, 5) << 12)
6086 | (j1 << 18)
6087 | (j2 << 19)
6088 | (s << 20);
6089 cond = bits (insn1, 6, 9);
6092 else
6094 offset = (bits (insn1, 0, 9) << 12);
6095 offset |= ((i2 << 22) | (i1 << 23) | (s << 24));
6096 offset |= exchange ?
6097 (bits (insn2, 1, 10) << 2) : (bits (insn2, 0, 10) << 1);
6100 displaced_debug_printf ("copying %s insn %.4x %.4x with offset %.8lx",
6101 link ? (exchange) ? "blx" : "bl" : "b",
6102 insn1, insn2, offset);
6104 dsc->modinsn[0] = THUMB_NOP;
6106 install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
6107 return 0;
6110 /* Copy B Thumb instructions. */
6111 static int
6112 thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
6113 arm_displaced_step_copy_insn_closure *dsc)
6115 unsigned int cond = 0;
6116 int offset = 0;
6117 unsigned short bit_12_15 = bits (insn, 12, 15);
6118 CORE_ADDR from = dsc->insn_addr;
6120 if (bit_12_15 == 0xd)
6122 /* offset = SignExtend (imm8:0, 32) */
6123 offset = sbits ((insn << 1), 0, 8);
6124 cond = bits (insn, 8, 11);
6126 else if (bit_12_15 == 0xe) /* Encoding T2 */
6128 offset = sbits ((insn << 1), 0, 11);
6129 cond = INST_AL;
6132 displaced_debug_printf ("copying b immediate insn %.4x with offset %d",
6133 insn, offset);
6135 dsc->u.branch.cond = cond;
6136 dsc->u.branch.link = 0;
6137 dsc->u.branch.exchange = 0;
6138 dsc->u.branch.dest = from + 4 + offset;
6140 dsc->modinsn[0] = THUMB_NOP;
6142 dsc->cleanup = &cleanup_branch;
6144 return 0;
6147 /* Copy BX/BLX with register-specified destinations. */
6149 static void
6150 install_bx_blx_reg (struct gdbarch *gdbarch, struct regcache *regs,
6151 arm_displaced_step_copy_insn_closure *dsc, int link,
6152 unsigned int cond, unsigned int rm)
6154 /* Implement {BX,BLX}<cond> <reg>" as:
6156 Preparation: cond <- instruction condition
6157 Insn: mov r0, r0 (nop)
6158 Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
6160 Don't set r14 in cleanup for BX. */
6162 dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
6164 dsc->u.branch.cond = cond;
6165 dsc->u.branch.link = link;
6167 dsc->u.branch.exchange = 1;
6169 dsc->cleanup = &cleanup_branch;
6172 static int
6173 arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
6174 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6176 unsigned int cond = bits (insn, 28, 31);
6177 /* BX: x12xxx1x
6178 BLX: x12xxx3x. */
6179 int link = bit (insn, 5);
6180 unsigned int rm = bits (insn, 0, 3);
6182 displaced_debug_printf ("copying insn %.8lx", (unsigned long) insn);
6184 dsc->modinsn[0] = ARM_NOP;
6186 install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
6187 return 0;
6190 static int
6191 thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
6192 struct regcache *regs,
6193 arm_displaced_step_copy_insn_closure *dsc)
6195 int link = bit (insn, 7);
6196 unsigned int rm = bits (insn, 3, 6);
6198 displaced_debug_printf ("copying insn %.4x", (unsigned short) insn);
6200 dsc->modinsn[0] = THUMB_NOP;
6202 install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
6204 return 0;
6208 /* Copy/cleanup arithmetic/logic instruction with immediate RHS. */
6210 static void
6211 cleanup_alu_imm (struct gdbarch *gdbarch,
6212 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6214 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
6215 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6216 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6217 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6220 static int
6221 arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6222 arm_displaced_step_copy_insn_closure *dsc)
6224 unsigned int rn = bits (insn, 16, 19);
6225 unsigned int rd = bits (insn, 12, 15);
6226 unsigned int op = bits (insn, 21, 24);
6227 int is_mov = (op == 0xd);
6228 ULONGEST rd_val, rn_val;
6230 if (!insn_references_pc (insn, 0x000ff000ul))
6231 return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
6233 displaced_debug_printf ("copying immediate %s insn %.8lx",
6234 is_mov ? "move" : "ALU",
6235 (unsigned long) insn);
6237 /* Instruction is of form:
6239 <op><cond> rd, [rn,] #imm
6241 Rewrite as:
6243 Preparation: tmp1, tmp2 <- r0, r1;
6244 r0, r1 <- rd, rn
6245 Insn: <op><cond> r0, r1, #imm
6246 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6249 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6250 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6251 rn_val = displaced_read_reg (regs, dsc, rn);
6252 rd_val = displaced_read_reg (regs, dsc, rd);
6253 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6254 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6255 dsc->rd = rd;
6257 if (is_mov)
6258 dsc->modinsn[0] = insn & 0xfff00fff;
6259 else
6260 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
6262 dsc->cleanup = &cleanup_alu_imm;
6264 return 0;
6267 static int
6268 thumb2_copy_alu_imm (struct gdbarch *gdbarch, uint16_t insn1,
6269 uint16_t insn2, struct regcache *regs,
6270 arm_displaced_step_copy_insn_closure *dsc)
6272 unsigned int op = bits (insn1, 5, 8);
6273 unsigned int rn, rm, rd;
6274 ULONGEST rd_val, rn_val;
6276 rn = bits (insn1, 0, 3); /* Rn */
6277 rm = bits (insn2, 0, 3); /* Rm */
6278 rd = bits (insn2, 8, 11); /* Rd */
6280 /* This routine is only called for instruction MOV. */
6281 gdb_assert (op == 0x2 && rn == 0xf);
6283 if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
6284 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
6286 displaced_debug_printf ("copying reg %s insn %.4x%.4x", "ALU", insn1, insn2);
6288 /* Instruction is of form:
6290 <op><cond> rd, [rn,] #imm
6292 Rewrite as:
6294 Preparation: tmp1, tmp2 <- r0, r1;
6295 r0, r1 <- rd, rn
6296 Insn: <op><cond> r0, r1, #imm
6297 Cleanup: rd <- r0; r0 <- tmp1; r1 <- tmp2
6300 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6301 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6302 rn_val = displaced_read_reg (regs, dsc, rn);
6303 rd_val = displaced_read_reg (regs, dsc, rd);
6304 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6305 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6306 dsc->rd = rd;
6308 dsc->modinsn[0] = insn1;
6309 dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
6310 dsc->numinsns = 2;
6312 dsc->cleanup = &cleanup_alu_imm;
6314 return 0;
6317 /* Copy/cleanup arithmetic/logic insns with register RHS. */
6319 static void
6320 cleanup_alu_reg (struct gdbarch *gdbarch,
6321 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6323 ULONGEST rd_val;
6324 int i;
6326 rd_val = displaced_read_reg (regs, dsc, 0);
6328 for (i = 0; i < 3; i++)
6329 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6331 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6334 static void
6335 install_alu_reg (struct gdbarch *gdbarch, struct regcache *regs,
6336 arm_displaced_step_copy_insn_closure *dsc,
6337 unsigned int rd, unsigned int rn, unsigned int rm)
6339 ULONGEST rd_val, rn_val, rm_val;
6341 /* Instruction is of form:
6343 <op><cond> rd, [rn,] rm [, <shift>]
6345 Rewrite as:
6347 Preparation: tmp1, tmp2, tmp3 <- r0, r1, r2;
6348 r0, r1, r2 <- rd, rn, rm
6349 Insn: <op><cond> r0, [r1,] r2 [, <shift>]
6350 Cleanup: rd <- r0; r0, r1, r2 <- tmp1, tmp2, tmp3
6353 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6354 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6355 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6356 rd_val = displaced_read_reg (regs, dsc, rd);
6357 rn_val = displaced_read_reg (regs, dsc, rn);
6358 rm_val = displaced_read_reg (regs, dsc, rm);
6359 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6360 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6361 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6362 dsc->rd = rd;
6364 dsc->cleanup = &cleanup_alu_reg;
6367 static int
6368 arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6369 arm_displaced_step_copy_insn_closure *dsc)
6371 unsigned int op = bits (insn, 21, 24);
6372 int is_mov = (op == 0xd);
6374 if (!insn_references_pc (insn, 0x000ff00ful))
6375 return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
6377 displaced_debug_printf ("copying reg %s insn %.8lx",
6378 is_mov ? "move" : "ALU", (unsigned long) insn);
6380 if (is_mov)
6381 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
6382 else
6383 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
6385 install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
6386 bits (insn, 0, 3));
6387 return 0;
6390 static int
6391 thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
6392 struct regcache *regs,
6393 arm_displaced_step_copy_insn_closure *dsc)
6395 unsigned rm, rd;
6397 rm = bits (insn, 3, 6);
6398 rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
6400 if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
6401 return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
6403 displaced_debug_printf ("copying ALU reg insn %.4x", (unsigned short) insn);
6405 dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
6407 install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
6409 return 0;
6412 /* Cleanup/copy arithmetic/logic insns with shifted register RHS. */
6414 static void
6415 cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
6416 struct regcache *regs,
6417 arm_displaced_step_copy_insn_closure *dsc)
6419 ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
6420 int i;
6422 for (i = 0; i < 4; i++)
6423 displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6425 displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6428 static void
6429 install_alu_shifted_reg (struct gdbarch *gdbarch, struct regcache *regs,
6430 arm_displaced_step_copy_insn_closure *dsc,
6431 unsigned int rd, unsigned int rn, unsigned int rm,
6432 unsigned rs)
6434 int i;
6435 ULONGEST rd_val, rn_val, rm_val, rs_val;
6437 /* Instruction is of form:
6439 <op><cond> rd, [rn,] rm, <shift> rs
6441 Rewrite as:
6443 Preparation: tmp1, tmp2, tmp3, tmp4 <- r0, r1, r2, r3
6444 r0, r1, r2, r3 <- rd, rn, rm, rs
6445 Insn: <op><cond> r0, r1, r2, <shift> r3
6446 Cleanup: tmp5 <- r0
6447 r0, r1, r2, r3 <- tmp1, tmp2, tmp3, tmp4
6448 rd <- tmp5
6451 for (i = 0; i < 4; i++)
6452 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6454 rd_val = displaced_read_reg (regs, dsc, rd);
6455 rn_val = displaced_read_reg (regs, dsc, rn);
6456 rm_val = displaced_read_reg (regs, dsc, rm);
6457 rs_val = displaced_read_reg (regs, dsc, rs);
6458 displaced_write_reg (regs, dsc, 0, rd_val, CANNOT_WRITE_PC);
6459 displaced_write_reg (regs, dsc, 1, rn_val, CANNOT_WRITE_PC);
6460 displaced_write_reg (regs, dsc, 2, rm_val, CANNOT_WRITE_PC);
6461 displaced_write_reg (regs, dsc, 3, rs_val, CANNOT_WRITE_PC);
6462 dsc->rd = rd;
6463 dsc->cleanup = &cleanup_alu_shifted_reg;
6466 static int
6467 arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
6468 struct regcache *regs,
6469 arm_displaced_step_copy_insn_closure *dsc)
6471 unsigned int op = bits (insn, 21, 24);
6472 int is_mov = (op == 0xd);
6473 unsigned int rd, rn, rm, rs;
6475 if (!insn_references_pc (insn, 0x000fff0ful))
6476 return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
6478 displaced_debug_printf ("copying shifted reg %s insn %.8lx",
6479 is_mov ? "move" : "ALU",
6480 (unsigned long) insn);
6482 rn = bits (insn, 16, 19);
6483 rm = bits (insn, 0, 3);
6484 rs = bits (insn, 8, 11);
6485 rd = bits (insn, 12, 15);
6487 if (is_mov)
6488 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
6489 else
6490 dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
6492 install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
6494 return 0;
6497 /* Clean up load instructions. */
6499 static void
6500 cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
6501 arm_displaced_step_copy_insn_closure *dsc)
6503 ULONGEST rt_val, rt_val2 = 0, rn_val;
6505 rt_val = displaced_read_reg (regs, dsc, 0);
6506 if (dsc->u.ldst.xfersize == 8)
6507 rt_val2 = displaced_read_reg (regs, dsc, 1);
6508 rn_val = displaced_read_reg (regs, dsc, 2);
6510 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6511 if (dsc->u.ldst.xfersize > 4)
6512 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6513 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6514 if (!dsc->u.ldst.immed)
6515 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6517 /* Handle register writeback. */
6518 if (dsc->u.ldst.writeback)
6519 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6520 /* Put result in right place. */
6521 displaced_write_reg (regs, dsc, dsc->rd, rt_val, LOAD_WRITE_PC);
6522 if (dsc->u.ldst.xfersize == 8)
6523 displaced_write_reg (regs, dsc, dsc->rd + 1, rt_val2, LOAD_WRITE_PC);
6526 /* Clean up store instructions. */
6528 static void
6529 cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
6530 arm_displaced_step_copy_insn_closure *dsc)
6532 ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
6534 displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
6535 if (dsc->u.ldst.xfersize > 4)
6536 displaced_write_reg (regs, dsc, 1, dsc->tmp[1], CANNOT_WRITE_PC);
6537 displaced_write_reg (regs, dsc, 2, dsc->tmp[2], CANNOT_WRITE_PC);
6538 if (!dsc->u.ldst.immed)
6539 displaced_write_reg (regs, dsc, 3, dsc->tmp[3], CANNOT_WRITE_PC);
6540 if (!dsc->u.ldst.restore_r4)
6541 displaced_write_reg (regs, dsc, 4, dsc->tmp[4], CANNOT_WRITE_PC);
6543 /* Writeback. */
6544 if (dsc->u.ldst.writeback)
6545 displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6548 /* Copy "extra" load/store instructions. These are halfword/doubleword
6549 transfers, which have a different encoding to byte/word transfers. */
6551 static int
6552 arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
6553 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6555 unsigned int op1 = bits (insn, 20, 24);
6556 unsigned int op2 = bits (insn, 5, 6);
6557 unsigned int rt = bits (insn, 12, 15);
6558 unsigned int rn = bits (insn, 16, 19);
6559 unsigned int rm = bits (insn, 0, 3);
6560 char load[12] = {0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1};
6561 char bytesize[12] = {2, 2, 2, 2, 8, 1, 8, 1, 8, 2, 8, 2};
6562 int immed = (op1 & 0x4) != 0;
6563 int opcode;
6564 ULONGEST rt_val, rt_val2 = 0, rn_val, rm_val = 0;
6566 if (!insn_references_pc (insn, 0x000ff00ful))
6567 return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
6569 displaced_debug_printf ("copying %sextra load/store insn %.8lx",
6570 unprivileged ? "unprivileged " : "",
6571 (unsigned long) insn);
6573 opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
6575 if (opcode < 0)
6576 internal_error (_("copy_extra_ld_st: instruction decode error"));
6578 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6579 dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
6580 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6581 if (!immed)
6582 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6584 rt_val = displaced_read_reg (regs, dsc, rt);
6585 if (bytesize[opcode] == 8)
6586 rt_val2 = displaced_read_reg (regs, dsc, rt + 1);
6587 rn_val = displaced_read_reg (regs, dsc, rn);
6588 if (!immed)
6589 rm_val = displaced_read_reg (regs, dsc, rm);
6591 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6592 if (bytesize[opcode] == 8)
6593 displaced_write_reg (regs, dsc, 1, rt_val2, CANNOT_WRITE_PC);
6594 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6595 if (!immed)
6596 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
6598 dsc->rd = rt;
6599 dsc->u.ldst.xfersize = bytesize[opcode];
6600 dsc->u.ldst.rn = rn;
6601 dsc->u.ldst.immed = immed;
6602 dsc->u.ldst.writeback = bit (insn, 24) == 0 || bit (insn, 21) != 0;
6603 dsc->u.ldst.restore_r4 = 0;
6605 if (immed)
6606 /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
6608 {ldr,str}<width><cond> r0, [r1,] [r2, #imm]. */
6609 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6610 else
6611 /* {ldr,str}<width><cond> rt, [rt2,] [rn, +/-rm]
6613 {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3]. */
6614 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6616 dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
6618 return 0;
6621 /* Copy byte/half word/word loads and stores. */
6623 static void
6624 install_load_store (struct gdbarch *gdbarch, struct regcache *regs,
6625 arm_displaced_step_copy_insn_closure *dsc, int load,
6626 int immed, int writeback, int size, int usermode,
6627 int rt, int rm, int rn)
6629 ULONGEST rt_val, rn_val, rm_val = 0;
6631 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6632 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6633 if (!immed)
6634 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6635 if (!load)
6636 dsc->tmp[4] = displaced_read_reg (regs, dsc, 4);
6638 rt_val = displaced_read_reg (regs, dsc, rt);
6639 rn_val = displaced_read_reg (regs, dsc, rn);
6640 if (!immed)
6641 rm_val = displaced_read_reg (regs, dsc, rm);
6643 displaced_write_reg (regs, dsc, 0, rt_val, CANNOT_WRITE_PC);
6644 displaced_write_reg (regs, dsc, 2, rn_val, CANNOT_WRITE_PC);
6645 if (!immed)
6646 displaced_write_reg (regs, dsc, 3, rm_val, CANNOT_WRITE_PC);
6647 dsc->rd = rt;
6648 dsc->u.ldst.xfersize = size;
6649 dsc->u.ldst.rn = rn;
6650 dsc->u.ldst.immed = immed;
6651 dsc->u.ldst.writeback = writeback;
6653 /* To write PC we can do:
6655 Before this sequence of instructions:
6656 r0 is the PC value got from displaced_read_reg, so r0 = from + 8;
6657 r2 is the Rn value got from displaced_read_reg.
6659 Insn1: push {pc} Write address of STR instruction + offset on stack
6660 Insn2: pop {r4} Read it back from stack, r4 = addr(Insn1) + offset
6661 Insn3: sub r4, r4, pc r4 = addr(Insn1) + offset - pc
6662 = addr(Insn1) + offset - addr(Insn3) - 8
6663 = offset - 16
6664 Insn4: add r4, r4, #8 r4 = offset - 8
6665 Insn5: add r0, r0, r4 r0 = from + 8 + offset - 8
6666 = from + offset
6667 Insn6: str r0, [r2, #imm] (or str r0, [r2, r3])
6669 Otherwise we don't know what value to write for PC, since the offset is
6670 architecture-dependent (sometimes PC+8, sometimes PC+12). More details
6671 of this can be found in Section "Saving from r15" in
6672 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
6674 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6678 static int
6679 thumb2_copy_load_literal (struct gdbarch *gdbarch, uint16_t insn1,
6680 uint16_t insn2, struct regcache *regs,
6681 arm_displaced_step_copy_insn_closure *dsc, int size)
6683 unsigned int u_bit = bit (insn1, 7);
6684 unsigned int rt = bits (insn2, 12, 15);
6685 int imm12 = bits (insn2, 0, 11);
6686 ULONGEST pc_val;
6688 displaced_debug_printf ("copying ldr pc (0x%x) R%d %c imm12 %.4x",
6689 (unsigned int) dsc->insn_addr, rt, u_bit ? '+' : '-',
6690 imm12);
6692 if (!u_bit)
6693 imm12 = -1 * imm12;
6695 /* Rewrite instruction LDR Rt imm12 into:
6697 Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
6699 LDR R0, R2, R3,
6701 Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2]. */
6704 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
6705 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
6706 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
6708 pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6710 pc_val = pc_val & 0xfffffffc;
6712 displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
6713 displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
6715 dsc->rd = rt;
6717 dsc->u.ldst.xfersize = size;
6718 dsc->u.ldst.immed = 0;
6719 dsc->u.ldst.writeback = 0;
6720 dsc->u.ldst.restore_r4 = 0;
6722 /* LDR R0, R2, R3 */
6723 dsc->modinsn[0] = 0xf852;
6724 dsc->modinsn[1] = 0x3;
6725 dsc->numinsns = 2;
6727 dsc->cleanup = &cleanup_load;
6729 return 0;
6732 static int
6733 thumb2_copy_load_reg_imm (struct gdbarch *gdbarch, uint16_t insn1,
6734 uint16_t insn2, struct regcache *regs,
6735 arm_displaced_step_copy_insn_closure *dsc,
6736 int writeback, int immed)
6738 unsigned int rt = bits (insn2, 12, 15);
6739 unsigned int rn = bits (insn1, 0, 3);
6740 unsigned int rm = bits (insn2, 0, 3); /* Only valid if !immed. */
6741 /* In LDR (register), there is also a register Rm, which is not allowed to
6742 be PC, so we don't have to check it. */
6744 if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
6745 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
6746 dsc);
6748 displaced_debug_printf ("copying ldr r%d [r%d] insn %.4x%.4x",
6749 rt, rn, insn1, insn2);
6751 install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
6752 0, rt, rm, rn);
6754 dsc->u.ldst.restore_r4 = 0;
6756 if (immed)
6757 /* ldr[b]<cond> rt, [rn, #imm], etc.
6759 ldr[b]<cond> r0, [r2, #imm]. */
6761 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6762 dsc->modinsn[1] = insn2 & 0x0fff;
6764 else
6765 /* ldr[b]<cond> rt, [rn, rm], etc.
6767 ldr[b]<cond> r0, [r2, r3]. */
6769 dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6770 dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
6773 dsc->numinsns = 2;
6775 return 0;
6779 static int
6780 arm_copy_ldr_str_ldrb_strb (struct gdbarch *gdbarch, uint32_t insn,
6781 struct regcache *regs,
6782 arm_displaced_step_copy_insn_closure *dsc,
6783 int load, int size, int usermode)
6785 int immed = !bit (insn, 25);
6786 int writeback = (bit (insn, 24) == 0 || bit (insn, 21) != 0);
6787 unsigned int rt = bits (insn, 12, 15);
6788 unsigned int rn = bits (insn, 16, 19);
6789 unsigned int rm = bits (insn, 0, 3); /* Only valid if !immed. */
6791 if (!insn_references_pc (insn, 0x000ff00ful))
6792 return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
6794 displaced_debug_printf ("copying %s%s r%d [r%d] insn %.8lx",
6795 load ? (size == 1 ? "ldrb" : "ldr")
6796 : (size == 1 ? "strb" : "str"),
6797 usermode ? "t" : "",
6798 rt, rn,
6799 (unsigned long) insn);
6801 install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
6802 usermode, rt, rm, rn);
6804 if (load || rt != ARM_PC_REGNUM)
6806 dsc->u.ldst.restore_r4 = 0;
6808 if (immed)
6809 /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
6811 {ldr,str}[b]<cond> r0, [r2, #imm]. */
6812 dsc->modinsn[0] = (insn & 0xfff00fff) | 0x20000;
6813 else
6814 /* {ldr,str}[b]<cond> rt, [rn, rm], etc.
6816 {ldr,str}[b]<cond> r0, [r2, r3]. */
6817 dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6819 else
6821 /* We need to use r4 as scratch. Make sure it's restored afterwards. */
6822 dsc->u.ldst.restore_r4 = 1;
6823 dsc->modinsn[0] = 0xe92d8000; /* push {pc} */
6824 dsc->modinsn[1] = 0xe8bd0010; /* pop {r4} */
6825 dsc->modinsn[2] = 0xe044400f; /* sub r4, r4, pc. */
6826 dsc->modinsn[3] = 0xe2844008; /* add r4, r4, #8. */
6827 dsc->modinsn[4] = 0xe0800004; /* add r0, r0, r4. */
6829 /* As above. */
6830 if (immed)
6831 dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
6832 else
6833 dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
6835 dsc->numinsns = 6;
6838 dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6840 return 0;
6843 /* Cleanup LDM instructions with fully-populated register list. This is an
6844 unfortunate corner case: it's impossible to implement correctly by modifying
6845 the instruction. The issue is as follows: we have an instruction,
6847 ldm rN, {r0-r15}
6849 which we must rewrite to avoid loading PC. A possible solution would be to
6850 do the load in two halves, something like (with suitable cleanup
6851 afterwards):
6853 mov r8, rN
6854 ldm[id][ab] r8!, {r0-r7}
6855 str r7, <temp>
6856 ldm[id][ab] r8, {r7-r14}
6857 <bkpt>
6859 but at present there's no suitable place for <temp>, since the scratch space
6860 is overwritten before the cleanup routine is called. For now, we simply
6861 emulate the instruction. */
6863 static void
6864 cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
6865 arm_displaced_step_copy_insn_closure *dsc)
6867 int inc = dsc->u.block.increment;
6868 int bump_before = dsc->u.block.before ? (inc ? 4 : -4) : 0;
6869 int bump_after = dsc->u.block.before ? 0 : (inc ? 4 : -4);
6870 uint32_t regmask = dsc->u.block.regmask;
6871 int regno = inc ? 0 : 15;
6872 CORE_ADDR xfer_addr = dsc->u.block.xfer_addr;
6873 int exception_return = dsc->u.block.load && dsc->u.block.user
6874 && (regmask & 0x8000) != 0;
6875 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
6876 int do_transfer = condition_true (dsc->u.block.cond, status);
6877 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6879 if (!do_transfer)
6880 return;
6882 /* If the instruction is ldm rN, {...pc}^, I don't think there's anything
6883 sensible we can do here. Complain loudly. */
6884 if (exception_return)
6885 error (_("Cannot single-step exception return"));
6887 /* We don't handle any stores here for now. */
6888 gdb_assert (dsc->u.block.load != 0);
6890 displaced_debug_printf ("emulating block transfer: %s %s %s",
6891 dsc->u.block.load ? "ldm" : "stm",
6892 dsc->u.block.increment ? "inc" : "dec",
6893 dsc->u.block.before ? "before" : "after");
6895 while (regmask)
6897 uint32_t memword;
6899 if (inc)
6900 while (regno <= ARM_PC_REGNUM && (regmask & (1 << regno)) == 0)
6901 regno++;
6902 else
6903 while (regno >= 0 && (regmask & (1 << regno)) == 0)
6904 regno--;
6906 xfer_addr += bump_before;
6908 memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
6909 displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
6911 xfer_addr += bump_after;
6913 regmask &= ~(1 << regno);
6916 if (dsc->u.block.writeback)
6917 displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
6918 CANNOT_WRITE_PC);
6921 /* Clean up an STM which included the PC in the register list. */
6923 static void
6924 cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
6925 arm_displaced_step_copy_insn_closure *dsc)
6927 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
6928 int store_executed = condition_true (dsc->u.block.cond, status);
6929 CORE_ADDR pc_stored_at, transferred_regs
6930 = count_one_bits (dsc->u.block.regmask);
6931 CORE_ADDR stm_insn_addr;
6932 uint32_t pc_val;
6933 long offset;
6934 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
6936 /* If condition code fails, there's nothing else to do. */
6937 if (!store_executed)
6938 return;
6940 if (dsc->u.block.increment)
6942 pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
6944 if (dsc->u.block.before)
6945 pc_stored_at += 4;
6947 else
6949 pc_stored_at = dsc->u.block.xfer_addr;
6951 if (dsc->u.block.before)
6952 pc_stored_at -= 4;
6955 pc_val = read_memory_unsigned_integer (pc_stored_at, 4, byte_order);
6956 stm_insn_addr = dsc->scratch_base;
6957 offset = pc_val - stm_insn_addr;
6959 displaced_debug_printf ("detected PC offset %.8lx for STM instruction",
6960 offset);
6962 /* Rewrite the stored PC to the proper value for the non-displaced original
6963 instruction. */
6964 write_memory_unsigned_integer (pc_stored_at, 4, byte_order,
6965 dsc->insn_addr + offset);
6968 /* Clean up an LDM which includes the PC in the register list. We clumped all
6969 the registers in the transferred list into a contiguous range r0...rX (to
6970 avoid loading PC directly and losing control of the debugged program), so we
6971 must undo that here. */
6973 static void
6974 cleanup_block_load_pc (struct gdbarch *gdbarch,
6975 struct regcache *regs,
6976 arm_displaced_step_copy_insn_closure *dsc)
6978 uint32_t status = displaced_read_reg (regs, dsc, ARM_PS_REGNUM);
6979 int load_executed = condition_true (dsc->u.block.cond, status);
6980 unsigned int mask = dsc->u.block.regmask, write_reg = ARM_PC_REGNUM;
6981 unsigned int regs_loaded = count_one_bits (mask);
6982 unsigned int num_to_shuffle = regs_loaded, clobbered;
6984 /* The method employed here will fail if the register list is fully populated
6985 (we need to avoid loading PC directly). */
6986 gdb_assert (num_to_shuffle < 16);
6988 if (!load_executed)
6989 return;
6991 clobbered = (1 << num_to_shuffle) - 1;
6993 while (num_to_shuffle > 0)
6995 if ((mask & (1 << write_reg)) != 0)
6997 unsigned int read_reg = num_to_shuffle - 1;
6999 if (read_reg != write_reg)
7001 ULONGEST rval = displaced_read_reg (regs, dsc, read_reg);
7002 displaced_write_reg (regs, dsc, write_reg, rval, LOAD_WRITE_PC);
7003 displaced_debug_printf ("LDM: move loaded register r%d to r%d",
7004 read_reg, write_reg);
7006 else
7007 displaced_debug_printf ("LDM: register r%d already in the right "
7008 "place", write_reg);
7010 clobbered &= ~(1 << write_reg);
7012 num_to_shuffle--;
7015 write_reg--;
7018 /* Restore any registers we scribbled over. */
7019 for (write_reg = 0; clobbered != 0; write_reg++)
7021 if ((clobbered & (1 << write_reg)) != 0)
7023 displaced_write_reg (regs, dsc, write_reg, dsc->tmp[write_reg],
7024 CANNOT_WRITE_PC);
7025 displaced_debug_printf ("LDM: restored clobbered register r%d",
7026 write_reg);
7027 clobbered &= ~(1 << write_reg);
7031 /* Perform register writeback manually. */
7032 if (dsc->u.block.writeback)
7034 ULONGEST new_rn_val = dsc->u.block.xfer_addr;
7036 if (dsc->u.block.increment)
7037 new_rn_val += regs_loaded * 4;
7038 else
7039 new_rn_val -= regs_loaded * 4;
7041 displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
7042 CANNOT_WRITE_PC);
7046 /* Handle ldm/stm, apart from some tricky cases which are unlikely to occur
7047 in user-level code (in particular exception return, ldm rn, {...pc}^). */
7049 static int
7050 arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
7051 struct regcache *regs,
7052 arm_displaced_step_copy_insn_closure *dsc)
7054 int load = bit (insn, 20);
7055 int user = bit (insn, 22);
7056 int increment = bit (insn, 23);
7057 int before = bit (insn, 24);
7058 int writeback = bit (insn, 21);
7059 int rn = bits (insn, 16, 19);
7061 /* Block transfers which don't mention PC can be run directly
7062 out-of-line. */
7063 if (rn != ARM_PC_REGNUM && (insn & 0x8000) == 0)
7064 return arm_copy_unmodified (gdbarch, insn, "ldm/stm", dsc);
7066 if (rn == ARM_PC_REGNUM)
7068 warning (_("displaced: Unpredictable LDM or STM with "
7069 "base register r15"));
7070 return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
7073 displaced_debug_printf ("copying block transfer insn %.8lx",
7074 (unsigned long) insn);
7076 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
7077 dsc->u.block.rn = rn;
7079 dsc->u.block.load = load;
7080 dsc->u.block.user = user;
7081 dsc->u.block.increment = increment;
7082 dsc->u.block.before = before;
7083 dsc->u.block.writeback = writeback;
7084 dsc->u.block.cond = bits (insn, 28, 31);
7086 dsc->u.block.regmask = insn & 0xffff;
7088 if (load)
7090 if ((insn & 0xffff) == 0xffff)
7092 /* LDM with a fully-populated register list. This case is
7093 particularly tricky. Implement for now by fully emulating the
7094 instruction (which might not behave perfectly in all cases, but
7095 these instructions should be rare enough for that not to matter
7096 too much). */
7097 dsc->modinsn[0] = ARM_NOP;
7099 dsc->cleanup = &cleanup_block_load_all;
7101 else
7103 /* LDM of a list of registers which includes PC. Implement by
7104 rewriting the list of registers to be transferred into a
7105 contiguous chunk r0...rX before doing the transfer, then shuffling
7106 registers into the correct places in the cleanup routine. */
7107 unsigned int regmask = insn & 0xffff;
7108 unsigned int num_in_list = count_one_bits (regmask), new_regmask;
7109 unsigned int i;
7111 for (i = 0; i < num_in_list; i++)
7112 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7114 /* Writeback makes things complicated. We need to avoid clobbering
7115 the base register with one of the registers in our modified
7116 register list, but just using a different register can't work in
7117 all cases, e.g.:
7119 ldm r14!, {r0-r13,pc}
7121 which would need to be rewritten as:
7123 ldm rN!, {r0-r14}
7125 but that can't work, because there's no free register for N.
7127 Solve this by turning off the writeback bit, and emulating
7128 writeback manually in the cleanup routine. */
7130 if (writeback)
7131 insn &= ~(1 << 21);
7133 new_regmask = (1 << num_in_list) - 1;
7135 displaced_debug_printf ("LDM r%d%s, {..., pc}: original reg list "
7136 "%.4x, modified list %.4x",
7137 rn, writeback ? "!" : "",
7138 (int) insn & 0xffff, new_regmask);
7140 dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
7142 dsc->cleanup = &cleanup_block_load_pc;
7145 else
7147 /* STM of a list of registers which includes PC. Run the instruction
7148 as-is, but out of line: this will store the wrong value for the PC,
7149 so we must manually fix up the memory in the cleanup routine.
7150 Doing things this way has the advantage that we can auto-detect
7151 the offset of the PC write (which is architecture-dependent) in
7152 the cleanup routine. */
7153 dsc->modinsn[0] = insn;
7155 dsc->cleanup = &cleanup_block_store_pc;
7158 return 0;
7161 static int
7162 thumb2_copy_block_xfer (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7163 struct regcache *regs,
7164 arm_displaced_step_copy_insn_closure *dsc)
7166 int rn = bits (insn1, 0, 3);
7167 int load = bit (insn1, 4);
7168 int writeback = bit (insn1, 5);
7170 /* Block transfers which don't mention PC can be run directly
7171 out-of-line. */
7172 if (rn != ARM_PC_REGNUM && (insn2 & 0x8000) == 0)
7173 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ldm/stm", dsc);
7175 if (rn == ARM_PC_REGNUM)
7177 warning (_("displaced: Unpredictable LDM or STM with "
7178 "base register r15"));
7179 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7180 "unpredictable ldm/stm", dsc);
7183 displaced_debug_printf ("copying block transfer insn %.4x%.4x",
7184 insn1, insn2);
7186 /* Clear bit 13, since it should be always zero. */
7187 dsc->u.block.regmask = (insn2 & 0xdfff);
7188 dsc->u.block.rn = rn;
7190 dsc->u.block.load = load;
7191 dsc->u.block.user = 0;
7192 dsc->u.block.increment = bit (insn1, 7);
7193 dsc->u.block.before = bit (insn1, 8);
7194 dsc->u.block.writeback = writeback;
7195 dsc->u.block.cond = INST_AL;
7196 dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
7198 if (load)
7200 if (dsc->u.block.regmask == 0xffff)
7202 /* This branch is impossible to happen. */
7203 gdb_assert (0);
7205 else
7207 unsigned int regmask = dsc->u.block.regmask;
7208 unsigned int num_in_list = count_one_bits (regmask), new_regmask;
7209 unsigned int i;
7211 for (i = 0; i < num_in_list; i++)
7212 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7214 if (writeback)
7215 insn1 &= ~(1 << 5);
7217 new_regmask = (1 << num_in_list) - 1;
7219 displaced_debug_printf ("LDM r%d%s, {..., pc}: original reg list "
7220 "%.4x, modified list %.4x",
7221 rn, writeback ? "!" : "",
7222 (int) dsc->u.block.regmask, new_regmask);
7224 dsc->modinsn[0] = insn1;
7225 dsc->modinsn[1] = (new_regmask & 0xffff);
7226 dsc->numinsns = 2;
7228 dsc->cleanup = &cleanup_block_load_pc;
7231 else
7233 dsc->modinsn[0] = insn1;
7234 dsc->modinsn[1] = insn2;
7235 dsc->numinsns = 2;
7236 dsc->cleanup = &cleanup_block_store_pc;
7238 return 0;
7241 /* Wrapper over read_memory_unsigned_integer for use in arm_get_next_pcs.
7242 This is used to avoid a dependency on BFD's bfd_endian enum. */
7244 ULONGEST
7245 arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
7246 int byte_order)
7248 return read_memory_unsigned_integer (memaddr, len,
7249 (enum bfd_endian) byte_order);
7252 /* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs. */
7254 CORE_ADDR
7255 arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
7256 CORE_ADDR val)
7258 return gdbarch_addr_bits_remove
7259 (gdb::checked_static_cast<regcache *> (self->regcache)->arch (), val);
7262 /* Wrapper over syscall_next_pc for use in get_next_pcs. */
7264 static CORE_ADDR
7265 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
7267 return 0;
7270 /* Wrapper over arm_is_thumb for use in arm_get_next_pcs. */
7273 arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
7275 return arm_is_thumb (gdb::checked_static_cast<regcache *> (self->regcache));
7278 /* single_step() is called just before we want to resume the inferior,
7279 if we want to single-step it but there is no hardware or kernel
7280 single-step support. We find the target of the coming instructions
7281 and breakpoint them. */
7283 std::vector<CORE_ADDR>
7284 arm_software_single_step (struct regcache *regcache)
7286 struct gdbarch *gdbarch = regcache->arch ();
7287 struct arm_get_next_pcs next_pcs_ctx;
7289 arm_get_next_pcs_ctor (&next_pcs_ctx,
7290 &arm_get_next_pcs_ops,
7291 gdbarch_byte_order (gdbarch),
7292 gdbarch_byte_order_for_code (gdbarch),
7294 regcache);
7296 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
7298 for (CORE_ADDR &pc_ref : next_pcs)
7299 pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
7301 return next_pcs;
7304 /* Cleanup/copy SVC (SWI) instructions. These two functions are overridden
7305 for Linux, where some SVC instructions must be treated specially. */
7307 static void
7308 cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
7309 arm_displaced_step_copy_insn_closure *dsc)
7311 CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
7313 displaced_debug_printf ("cleanup for svc, resume at %.8lx",
7314 (unsigned long) resume_addr);
7316 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
7320 /* Common copy routine for svc instruction. */
7322 static int
7323 install_svc (struct gdbarch *gdbarch, struct regcache *regs,
7324 arm_displaced_step_copy_insn_closure *dsc)
7326 /* Preparation: none.
7327 Insn: unmodified svc.
7328 Cleanup: pc <- insn_addr + insn_size. */
7330 /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
7331 instruction. */
7332 dsc->wrote_to_pc = 1;
7334 /* Allow OS-specific code to override SVC handling. */
7335 if (dsc->u.svc.copy_svc_os)
7336 return dsc->u.svc.copy_svc_os (gdbarch, regs, dsc);
7337 else
7339 dsc->cleanup = &cleanup_svc;
7340 return 0;
7344 static int
7345 arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
7346 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7349 displaced_debug_printf ("copying svc insn %.8lx",
7350 (unsigned long) insn);
7352 dsc->modinsn[0] = insn;
7354 return install_svc (gdbarch, regs, dsc);
7357 static int
7358 thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
7359 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7362 displaced_debug_printf ("copying svc insn %.4x", insn);
7364 dsc->modinsn[0] = insn;
7366 return install_svc (gdbarch, regs, dsc);
7369 /* Copy undefined instructions. */
7371 static int
7372 arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
7373 arm_displaced_step_copy_insn_closure *dsc)
7375 displaced_debug_printf ("copying undefined insn %.8lx",
7376 (unsigned long) insn);
7378 dsc->modinsn[0] = insn;
7380 return 0;
7383 static int
7384 thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7385 arm_displaced_step_copy_insn_closure *dsc)
7388 displaced_debug_printf ("copying undefined insn %.4x %.4x",
7389 (unsigned short) insn1, (unsigned short) insn2);
7391 dsc->modinsn[0] = insn1;
7392 dsc->modinsn[1] = insn2;
7393 dsc->numinsns = 2;
7395 return 0;
7398 /* Copy unpredictable instructions. */
7400 static int
7401 arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
7402 arm_displaced_step_copy_insn_closure *dsc)
7404 displaced_debug_printf ("copying unpredictable insn %.8lx",
7405 (unsigned long) insn);
7407 dsc->modinsn[0] = insn;
7409 return 0;
7412 /* The decode_* functions are instruction decoding helpers. They mostly follow
7413 the presentation in the ARM ARM. */
7415 static int
7416 arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
7417 struct regcache *regs,
7418 arm_displaced_step_copy_insn_closure *dsc)
7420 unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
7421 unsigned int rn = bits (insn, 16, 19);
7423 if (op1 == 0x10 && (op2 & 0x2) == 0x0 && (rn & 0x1) == 0x0)
7424 return arm_copy_unmodified (gdbarch, insn, "cps", dsc);
7425 else if (op1 == 0x10 && op2 == 0x0 && (rn & 0x1) == 0x1)
7426 return arm_copy_unmodified (gdbarch, insn, "setend", dsc);
7427 else if ((op1 & 0x60) == 0x20)
7428 return arm_copy_unmodified (gdbarch, insn, "neon dataproc", dsc);
7429 else if ((op1 & 0x71) == 0x40)
7430 return arm_copy_unmodified (gdbarch, insn, "neon elt/struct load/store",
7431 dsc);
7432 else if ((op1 & 0x77) == 0x41)
7433 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
7434 else if ((op1 & 0x77) == 0x45)
7435 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pli. */
7436 else if ((op1 & 0x77) == 0x51)
7438 if (rn != 0xf)
7439 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
7440 else
7441 return arm_copy_unpred (gdbarch, insn, dsc);
7443 else if ((op1 & 0x77) == 0x55)
7444 return arm_copy_preload (gdbarch, insn, regs, dsc); /* pld/pldw. */
7445 else if (op1 == 0x57)
7446 switch (op2)
7448 case 0x1: return arm_copy_unmodified (gdbarch, insn, "clrex", dsc);
7449 case 0x4: return arm_copy_unmodified (gdbarch, insn, "dsb", dsc);
7450 case 0x5: return arm_copy_unmodified (gdbarch, insn, "dmb", dsc);
7451 case 0x6: return arm_copy_unmodified (gdbarch, insn, "isb", dsc);
7452 default: return arm_copy_unpred (gdbarch, insn, dsc);
7454 else if ((op1 & 0x63) == 0x43)
7455 return arm_copy_unpred (gdbarch, insn, dsc);
7456 else if ((op2 & 0x1) == 0x0)
7457 switch (op1 & ~0x80)
7459 case 0x61:
7460 return arm_copy_unmodified (gdbarch, insn, "unallocated mem hint", dsc);
7461 case 0x65:
7462 return arm_copy_preload_reg (gdbarch, insn, regs, dsc); /* pli reg. */
7463 case 0x71: case 0x75:
7464 /* pld/pldw reg. */
7465 return arm_copy_preload_reg (gdbarch, insn, regs, dsc);
7466 case 0x63: case 0x67: case 0x73: case 0x77:
7467 return arm_copy_unpred (gdbarch, insn, dsc);
7468 default:
7469 return arm_copy_undef (gdbarch, insn, dsc);
7471 else
7472 return arm_copy_undef (gdbarch, insn, dsc); /* Probably unreachable. */
7475 static int
7476 arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
7477 struct regcache *regs,
7478 arm_displaced_step_copy_insn_closure *dsc)
7480 if (bit (insn, 27) == 0)
7481 return arm_decode_misc_memhint_neon (gdbarch, insn, regs, dsc);
7482 /* Switch on bits: 0bxxxxx321xxx0xxxxxxxxxxxxxxxxxxxx. */
7483 else switch (((insn & 0x7000000) >> 23) | ((insn & 0x100000) >> 20))
7485 case 0x0: case 0x2:
7486 return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
7488 case 0x1: case 0x3:
7489 return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
7491 case 0x4: case 0x5: case 0x6: case 0x7:
7492 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
7494 case 0x8:
7495 switch ((insn & 0xe00000) >> 21)
7497 case 0x1: case 0x3: case 0x4: case 0x5: case 0x6: case 0x7:
7498 /* stc/stc2. */
7499 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7501 case 0x2:
7502 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
7504 default:
7505 return arm_copy_undef (gdbarch, insn, dsc);
7508 case 0x9:
7510 int rn_f = (bits (insn, 16, 19) == 0xf);
7511 switch ((insn & 0xe00000) >> 21)
7513 case 0x1: case 0x3:
7514 /* ldc/ldc2 imm (undefined for rn == pc). */
7515 return rn_f ? arm_copy_undef (gdbarch, insn, dsc)
7516 : arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7518 case 0x2:
7519 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
7521 case 0x4: case 0x5: case 0x6: case 0x7:
7522 /* ldc/ldc2 lit (undefined for rn != pc). */
7523 return rn_f ? arm_copy_copro_load_store (gdbarch, insn, regs, dsc)
7524 : arm_copy_undef (gdbarch, insn, dsc);
7526 default:
7527 return arm_copy_undef (gdbarch, insn, dsc);
7531 case 0xa:
7532 return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
7534 case 0xb:
7535 if (bits (insn, 16, 19) == 0xf)
7536 /* ldc/ldc2 lit. */
7537 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7538 else
7539 return arm_copy_undef (gdbarch, insn, dsc);
7541 case 0xc:
7542 if (bit (insn, 4))
7543 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
7544 else
7545 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
7547 case 0xd:
7548 if (bit (insn, 4))
7549 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
7550 else
7551 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
7553 default:
7554 return arm_copy_undef (gdbarch, insn, dsc);
7558 /* Decode miscellaneous instructions in dp/misc encoding space. */
7560 static int
7561 arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
7562 struct regcache *regs,
7563 arm_displaced_step_copy_insn_closure *dsc)
7565 unsigned int op2 = bits (insn, 4, 6);
7566 unsigned int op = bits (insn, 21, 22);
7568 switch (op2)
7570 case 0x0:
7571 return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
7573 case 0x1:
7574 if (op == 0x1) /* bx. */
7575 return arm_copy_bx_blx_reg (gdbarch, insn, regs, dsc);
7576 else if (op == 0x3)
7577 return arm_copy_unmodified (gdbarch, insn, "clz", dsc);
7578 else
7579 return arm_copy_undef (gdbarch, insn, dsc);
7581 case 0x2:
7582 if (op == 0x1)
7583 /* Not really supported. */
7584 return arm_copy_unmodified (gdbarch, insn, "bxj", dsc);
7585 else
7586 return arm_copy_undef (gdbarch, insn, dsc);
7588 case 0x3:
7589 if (op == 0x1)
7590 return arm_copy_bx_blx_reg (gdbarch, insn,
7591 regs, dsc); /* blx register. */
7592 else
7593 return arm_copy_undef (gdbarch, insn, dsc);
7595 case 0x5:
7596 return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
7598 case 0x7:
7599 if (op == 0x1)
7600 return arm_copy_unmodified (gdbarch, insn, "bkpt", dsc);
7601 else if (op == 0x3)
7602 /* Not really supported. */
7603 return arm_copy_unmodified (gdbarch, insn, "smc", dsc);
7604 [[fallthrough]];
7606 default:
7607 return arm_copy_undef (gdbarch, insn, dsc);
7611 static int
7612 arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
7613 struct regcache *regs,
7614 arm_displaced_step_copy_insn_closure *dsc)
7616 if (bit (insn, 25))
7617 switch (bits (insn, 20, 24))
7619 case 0x10:
7620 return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
7622 case 0x14:
7623 return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
7625 case 0x12: case 0x16:
7626 return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
7628 default:
7629 return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
7631 else
7633 uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
7635 if ((op1 & 0x19) != 0x10 && (op2 & 0x1) == 0x0)
7636 return arm_copy_alu_reg (gdbarch, insn, regs, dsc);
7637 else if ((op1 & 0x19) != 0x10 && (op2 & 0x9) == 0x1)
7638 return arm_copy_alu_shifted_reg (gdbarch, insn, regs, dsc);
7639 else if ((op1 & 0x19) == 0x10 && (op2 & 0x8) == 0x0)
7640 return arm_decode_miscellaneous (gdbarch, insn, regs, dsc);
7641 else if ((op1 & 0x19) == 0x10 && (op2 & 0x9) == 0x8)
7642 return arm_copy_unmodified (gdbarch, insn, "halfword mul/mla", dsc);
7643 else if ((op1 & 0x10) == 0x00 && op2 == 0x9)
7644 return arm_copy_unmodified (gdbarch, insn, "mul/mla", dsc);
7645 else if ((op1 & 0x10) == 0x10 && op2 == 0x9)
7646 return arm_copy_unmodified (gdbarch, insn, "synch", dsc);
7647 else if (op2 == 0xb || (op2 & 0xd) == 0xd)
7648 /* 2nd arg means "unprivileged". */
7649 return arm_copy_extra_ld_st (gdbarch, insn, (op1 & 0x12) == 0x02, regs,
7650 dsc);
7653 /* Should be unreachable. */
7654 return 1;
7657 static int
7658 arm_decode_ld_st_word_ubyte (struct gdbarch *gdbarch, uint32_t insn,
7659 struct regcache *regs,
7660 arm_displaced_step_copy_insn_closure *dsc)
7662 int a = bit (insn, 25), b = bit (insn, 4);
7663 uint32_t op1 = bits (insn, 20, 24);
7665 if ((!a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02)
7666 || (a && (op1 & 0x05) == 0x00 && (op1 & 0x17) != 0x02 && !b))
7667 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 0);
7668 else if ((!a && (op1 & 0x17) == 0x02)
7669 || (a && (op1 & 0x17) == 0x02 && !b))
7670 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 4, 1);
7671 else if ((!a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03)
7672 || (a && (op1 & 0x05) == 0x01 && (op1 & 0x17) != 0x03 && !b))
7673 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 0);
7674 else if ((!a && (op1 & 0x17) == 0x03)
7675 || (a && (op1 & 0x17) == 0x03 && !b))
7676 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 4, 1);
7677 else if ((!a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06)
7678 || (a && (op1 & 0x05) == 0x04 && (op1 & 0x17) != 0x06 && !b))
7679 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 0);
7680 else if ((!a && (op1 & 0x17) == 0x06)
7681 || (a && (op1 & 0x17) == 0x06 && !b))
7682 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 0, 1, 1);
7683 else if ((!a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07)
7684 || (a && (op1 & 0x05) == 0x05 && (op1 & 0x17) != 0x07 && !b))
7685 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 0);
7686 else if ((!a && (op1 & 0x17) == 0x07)
7687 || (a && (op1 & 0x17) == 0x07 && !b))
7688 return arm_copy_ldr_str_ldrb_strb (gdbarch, insn, regs, dsc, 1, 1, 1);
7690 /* Should be unreachable. */
7691 return 1;
7694 static int
7695 arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
7696 arm_displaced_step_copy_insn_closure *dsc)
7698 switch (bits (insn, 20, 24))
7700 case 0x00: case 0x01: case 0x02: case 0x03:
7701 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
7703 case 0x04: case 0x05: case 0x06: case 0x07:
7704 return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
7706 case 0x08: case 0x09: case 0x0a: case 0x0b:
7707 case 0x0c: case 0x0d: case 0x0e: case 0x0f:
7708 return arm_copy_unmodified (gdbarch, insn,
7709 "decode/pack/unpack/saturate/reverse", dsc);
7711 case 0x18:
7712 if (bits (insn, 5, 7) == 0) /* op2. */
7714 if (bits (insn, 12, 15) == 0xf)
7715 return arm_copy_unmodified (gdbarch, insn, "usad8", dsc);
7716 else
7717 return arm_copy_unmodified (gdbarch, insn, "usada8", dsc);
7719 else
7720 return arm_copy_undef (gdbarch, insn, dsc);
7722 case 0x1a: case 0x1b:
7723 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7724 return arm_copy_unmodified (gdbarch, insn, "sbfx", dsc);
7725 else
7726 return arm_copy_undef (gdbarch, insn, dsc);
7728 case 0x1c: case 0x1d:
7729 if (bits (insn, 5, 6) == 0x0) /* op2[1:0]. */
7731 if (bits (insn, 0, 3) == 0xf)
7732 return arm_copy_unmodified (gdbarch, insn, "bfc", dsc);
7733 else
7734 return arm_copy_unmodified (gdbarch, insn, "bfi", dsc);
7736 else
7737 return arm_copy_undef (gdbarch, insn, dsc);
7739 case 0x1e: case 0x1f:
7740 if (bits (insn, 5, 6) == 0x2) /* op2[1:0]. */
7741 return arm_copy_unmodified (gdbarch, insn, "ubfx", dsc);
7742 else
7743 return arm_copy_undef (gdbarch, insn, dsc);
7746 /* Should be unreachable. */
7747 return 1;
7750 static int
7751 arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7752 struct regcache *regs,
7753 arm_displaced_step_copy_insn_closure *dsc)
7755 if (bit (insn, 25))
7756 return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
7757 else
7758 return arm_copy_block_xfer (gdbarch, insn, regs, dsc);
7761 static int
7762 arm_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint32_t insn,
7763 struct regcache *regs,
7764 arm_displaced_step_copy_insn_closure *dsc)
7766 unsigned int opcode = bits (insn, 20, 24);
7768 switch (opcode)
7770 case 0x04: case 0x05: /* VFP/Neon mrrc/mcrr. */
7771 return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
7773 case 0x08: case 0x0a: case 0x0c: case 0x0e:
7774 case 0x12: case 0x16:
7775 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vstm/vpush", dsc);
7777 case 0x09: case 0x0b: case 0x0d: case 0x0f:
7778 case 0x13: case 0x17:
7779 return arm_copy_unmodified (gdbarch, insn, "vfp/neon vldm/vpop", dsc);
7781 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7782 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7783 /* Note: no writeback for these instructions. Bit 25 will always be
7784 zero though (via caller), so the following works OK. */
7785 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7788 /* Should be unreachable. */
7789 return 1;
7792 /* Decode shifted register instructions. */
7794 static int
7795 thumb2_decode_dp_shift_reg (struct gdbarch *gdbarch, uint16_t insn1,
7796 uint16_t insn2, struct regcache *regs,
7797 arm_displaced_step_copy_insn_closure *dsc)
7799 /* PC is only allowed to be used in instruction MOV. */
7801 unsigned int op = bits (insn1, 5, 8);
7802 unsigned int rn = bits (insn1, 0, 3);
7804 if (op == 0x2 && rn == 0xf) /* MOV */
7805 return thumb2_copy_alu_imm (gdbarch, insn1, insn2, regs, dsc);
7806 else
7807 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7808 "dp (shift reg)", dsc);
7812 /* Decode extension register load/store. Exactly the same as
7813 arm_decode_ext_reg_ld_st. */
7815 static int
7816 thumb2_decode_ext_reg_ld_st (struct gdbarch *gdbarch, uint16_t insn1,
7817 uint16_t insn2, struct regcache *regs,
7818 arm_displaced_step_copy_insn_closure *dsc)
7820 unsigned int opcode = bits (insn1, 4, 8);
7822 switch (opcode)
7824 case 0x04: case 0x05:
7825 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7826 "vfp/neon vmov", dsc);
7828 case 0x08: case 0x0c: /* 01x00 */
7829 case 0x0a: case 0x0e: /* 01x10 */
7830 case 0x12: case 0x16: /* 10x10 */
7831 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7832 "vfp/neon vstm/vpush", dsc);
7834 case 0x09: case 0x0d: /* 01x01 */
7835 case 0x0b: case 0x0f: /* 01x11 */
7836 case 0x13: case 0x17: /* 10x11 */
7837 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7838 "vfp/neon vldm/vpop", dsc);
7840 case 0x10: case 0x14: case 0x18: case 0x1c: /* vstr. */
7841 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7842 "vstr", dsc);
7843 case 0x11: case 0x15: case 0x19: case 0x1d: /* vldr. */
7844 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2, regs, dsc);
7847 /* Should be unreachable. */
7848 return 1;
7851 static int
7852 arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn,
7853 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7855 unsigned int op1 = bits (insn, 20, 25);
7856 int op = bit (insn, 4);
7857 unsigned int coproc = bits (insn, 8, 11);
7859 if ((op1 & 0x20) == 0x00 && (op1 & 0x3a) != 0x00 && (coproc & 0xe) == 0xa)
7860 return arm_decode_ext_reg_ld_st (gdbarch, insn, regs, dsc);
7861 else if ((op1 & 0x21) == 0x00 && (op1 & 0x3a) != 0x00
7862 && (coproc & 0xe) != 0xa)
7863 /* stc/stc2. */
7864 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7865 else if ((op1 & 0x21) == 0x01 && (op1 & 0x3a) != 0x00
7866 && (coproc & 0xe) != 0xa)
7867 /* ldc/ldc2 imm/lit. */
7868 return arm_copy_copro_load_store (gdbarch, insn, regs, dsc);
7869 else if ((op1 & 0x3e) == 0x00)
7870 return arm_copy_undef (gdbarch, insn, dsc);
7871 else if ((op1 & 0x3e) == 0x04 && (coproc & 0xe) == 0xa)
7872 return arm_copy_unmodified (gdbarch, insn, "neon 64bit xfer", dsc);
7873 else if (op1 == 0x04 && (coproc & 0xe) != 0xa)
7874 return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
7875 else if (op1 == 0x05 && (coproc & 0xe) != 0xa)
7876 return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
7877 else if ((op1 & 0x30) == 0x20 && !op)
7879 if ((coproc & 0xe) == 0xa)
7880 return arm_copy_unmodified (gdbarch, insn, "vfp dataproc", dsc);
7881 else
7882 return arm_copy_unmodified (gdbarch, insn, "cdp/cdp2", dsc);
7884 else if ((op1 & 0x30) == 0x20 && op)
7885 return arm_copy_unmodified (gdbarch, insn, "neon 8/16/32 bit xfer", dsc);
7886 else if ((op1 & 0x31) == 0x20 && op && (coproc & 0xe) != 0xa)
7887 return arm_copy_unmodified (gdbarch, insn, "mcr/mcr2", dsc);
7888 else if ((op1 & 0x31) == 0x21 && op && (coproc & 0xe) != 0xa)
7889 return arm_copy_unmodified (gdbarch, insn, "mrc/mrc2", dsc);
7890 else if ((op1 & 0x30) == 0x30)
7891 return arm_copy_svc (gdbarch, insn, regs, dsc);
7892 else
7893 return arm_copy_undef (gdbarch, insn, dsc); /* Possibly unreachable. */
7896 static int
7897 thumb2_decode_svc_copro (struct gdbarch *gdbarch, uint16_t insn1,
7898 uint16_t insn2, struct regcache *regs,
7899 arm_displaced_step_copy_insn_closure *dsc)
7901 unsigned int coproc = bits (insn2, 8, 11);
7902 unsigned int bit_5_8 = bits (insn1, 5, 8);
7903 unsigned int bit_9 = bit (insn1, 9);
7904 unsigned int bit_4 = bit (insn1, 4);
7906 if (bit_9 == 0)
7908 if (bit_5_8 == 2)
7909 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7910 "neon 64bit xfer/mrrc/mrrc2/mcrr/mcrr2",
7911 dsc);
7912 else if (bit_5_8 == 0) /* UNDEFINED. */
7913 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
7914 else
7916 /*coproc is 101x. SIMD/VFP, ext registers load/store. */
7917 if ((coproc & 0xe) == 0xa)
7918 return thumb2_decode_ext_reg_ld_st (gdbarch, insn1, insn2, regs,
7919 dsc);
7920 else /* coproc is not 101x. */
7922 if (bit_4 == 0) /* STC/STC2. */
7923 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7924 "stc/stc2", dsc);
7925 else /* LDC/LDC2 {literal, immediate}. */
7926 return thumb2_copy_copro_load_store (gdbarch, insn1, insn2,
7927 regs, dsc);
7931 else
7932 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
7934 return 0;
7937 static void
7938 install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
7939 arm_displaced_step_copy_insn_closure *dsc, int rd)
7941 /* ADR Rd, #imm
7943 Rewrite as:
7945 Preparation: Rd <- PC
7946 Insn: ADD Rd, #imm
7947 Cleanup: Null.
7950 /* Rd <- PC */
7951 int val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
7952 displaced_write_reg (regs, dsc, rd, val, CANNOT_WRITE_PC);
7955 static int
7956 thumb_copy_pc_relative_16bit (struct gdbarch *gdbarch, struct regcache *regs,
7957 arm_displaced_step_copy_insn_closure *dsc,
7958 int rd, unsigned int imm)
7961 /* Encoding T2: ADDS Rd, #imm */
7962 dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
7964 install_pc_relative (gdbarch, regs, dsc, rd);
7966 return 0;
7969 static int
7970 thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
7971 struct regcache *regs,
7972 arm_displaced_step_copy_insn_closure *dsc)
7974 unsigned int rd = bits (insn, 8, 10);
7975 unsigned int imm8 = bits (insn, 0, 7);
7977 displaced_debug_printf ("copying thumb adr r%d, #%d insn %.4x",
7978 rd, imm8, insn);
7980 return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
7983 static int
7984 thumb_copy_pc_relative_32bit (struct gdbarch *gdbarch, uint16_t insn1,
7985 uint16_t insn2, struct regcache *regs,
7986 arm_displaced_step_copy_insn_closure *dsc)
7988 unsigned int rd = bits (insn2, 8, 11);
7989 /* Since immediate has the same encoding in ADR ADD and SUB, so we simply
7990 extract raw immediate encoding rather than computing immediate. When
7991 generating ADD or SUB instruction, we can simply perform OR operation to
7992 set immediate into ADD. */
7993 unsigned int imm_3_8 = insn2 & 0x70ff;
7994 unsigned int imm_i = insn1 & 0x0400; /* Clear all bits except bit 10. */
7996 displaced_debug_printf ("copying thumb adr r%d, #%d:%d insn %.4x%.4x",
7997 rd, imm_i, imm_3_8, insn1, insn2);
7999 if (bit (insn1, 7)) /* Encoding T2 */
8001 /* Encoding T3: SUB Rd, Rd, #imm */
8002 dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
8003 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8005 else /* Encoding T3 */
8007 /* Encoding T3: ADD Rd, Rd, #imm */
8008 dsc->modinsn[0] = (0xf100 | rd | imm_i);
8009 dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8011 dsc->numinsns = 2;
8013 install_pc_relative (gdbarch, regs, dsc, rd);
8015 return 0;
8018 static int
8019 thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
8020 struct regcache *regs,
8021 arm_displaced_step_copy_insn_closure *dsc)
8023 unsigned int rt = bits (insn1, 8, 10);
8024 unsigned int pc;
8025 int imm8 = (bits (insn1, 0, 7) << 2);
8027 /* LDR Rd, #imm8
8029 Rwrite as:
8031 Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
8033 Insn: LDR R0, [R2, R3];
8034 Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
8036 displaced_debug_printf ("copying thumb ldr r%d [pc #%d]", rt, imm8);
8038 dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
8039 dsc->tmp[2] = displaced_read_reg (regs, dsc, 2);
8040 dsc->tmp[3] = displaced_read_reg (regs, dsc, 3);
8041 pc = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
8042 /* The assembler calculates the required value of the offset from the
8043 Align(PC,4) value of this instruction to the label. */
8044 pc = pc & 0xfffffffc;
8046 displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
8047 displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
8049 dsc->rd = rt;
8050 dsc->u.ldst.xfersize = 4;
8051 dsc->u.ldst.rn = 0;
8052 dsc->u.ldst.immed = 0;
8053 dsc->u.ldst.writeback = 0;
8054 dsc->u.ldst.restore_r4 = 0;
8056 dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
8058 dsc->cleanup = &cleanup_load;
8060 return 0;
8063 /* Copy Thumb cbnz/cbz instruction. */
8065 static int
8066 thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
8067 struct regcache *regs,
8068 arm_displaced_step_copy_insn_closure *dsc)
8070 int non_zero = bit (insn1, 11);
8071 unsigned int imm5 = (bit (insn1, 9) << 6) | (bits (insn1, 3, 7) << 1);
8072 CORE_ADDR from = dsc->insn_addr;
8073 int rn = bits (insn1, 0, 2);
8074 int rn_val = displaced_read_reg (regs, dsc, rn);
8076 dsc->u.branch.cond = (rn_val && non_zero) || (!rn_val && !non_zero);
8077 /* CBNZ and CBZ do not affect the condition flags. If condition is true,
8078 set it INST_AL, so cleanup_branch will know branch is taken, otherwise,
8079 condition is false, let it be, cleanup_branch will do nothing. */
8080 if (dsc->u.branch.cond)
8082 dsc->u.branch.cond = INST_AL;
8083 dsc->u.branch.dest = from + 4 + imm5;
8085 else
8086 dsc->u.branch.dest = from + 2;
8088 dsc->u.branch.link = 0;
8089 dsc->u.branch.exchange = 0;
8091 displaced_debug_printf ("copying %s [r%d = 0x%x] insn %.4x to %.8lx",
8092 non_zero ? "cbnz" : "cbz",
8093 rn, rn_val, insn1, dsc->u.branch.dest);
8095 dsc->modinsn[0] = THUMB_NOP;
8097 dsc->cleanup = &cleanup_branch;
8098 return 0;
8101 /* Copy Table Branch Byte/Halfword */
8102 static int
8103 thumb2_copy_table_branch (struct gdbarch *gdbarch, uint16_t insn1,
8104 uint16_t insn2, struct regcache *regs,
8105 arm_displaced_step_copy_insn_closure *dsc)
8107 ULONGEST rn_val, rm_val;
8108 int is_tbh = bit (insn2, 4);
8109 CORE_ADDR halfwords = 0;
8110 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8112 rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
8113 rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
8115 if (is_tbh)
8117 gdb_byte buf[2];
8119 target_read_memory (rn_val + 2 * rm_val, buf, 2);
8120 halfwords = extract_unsigned_integer (buf, 2, byte_order);
8122 else
8124 gdb_byte buf[1];
8126 target_read_memory (rn_val + rm_val, buf, 1);
8127 halfwords = extract_unsigned_integer (buf, 1, byte_order);
8130 displaced_debug_printf ("%s base 0x%x offset 0x%x offset 0x%x",
8131 is_tbh ? "tbh" : "tbb",
8132 (unsigned int) rn_val, (unsigned int) rm_val,
8133 (unsigned int) halfwords);
8135 dsc->u.branch.cond = INST_AL;
8136 dsc->u.branch.link = 0;
8137 dsc->u.branch.exchange = 0;
8138 dsc->u.branch.dest = dsc->insn_addr + 4 + 2 * halfwords;
8140 dsc->cleanup = &cleanup_branch;
8142 return 0;
8145 static void
8146 cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
8147 arm_displaced_step_copy_insn_closure *dsc)
8149 /* PC <- r7 */
8150 int val = displaced_read_reg (regs, dsc, 7);
8151 displaced_write_reg (regs, dsc, ARM_PC_REGNUM, val, BX_WRITE_PC);
8153 /* r7 <- r8 */
8154 val = displaced_read_reg (regs, dsc, 8);
8155 displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
8157 /* r8 <- tmp[0] */
8158 displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
8162 static int
8163 thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
8164 struct regcache *regs,
8165 arm_displaced_step_copy_insn_closure *dsc)
8167 dsc->u.block.regmask = insn1 & 0x00ff;
8169 /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
8170 to :
8172 (1) register list is full, that is, r0-r7 are used.
8173 Prepare: tmp[0] <- r8
8175 POP {r0, r1, ...., r6, r7}; remove PC from reglist
8176 MOV r8, r7; Move value of r7 to r8;
8177 POP {r7}; Store PC value into r7.
8179 Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
8181 (2) register list is not full, supposing there are N registers in
8182 register list (except PC, 0 <= N <= 7).
8183 Prepare: for each i, 0 - N, tmp[i] <- ri.
8185 POP {r0, r1, ...., rN};
8187 Cleanup: Set registers in original reglist from r0 - rN. Restore r0 - rN
8188 from tmp[] properly.
8190 displaced_debug_printf ("copying thumb pop {%.8x, pc} insn %.4x",
8191 dsc->u.block.regmask, insn1);
8193 if (dsc->u.block.regmask == 0xff)
8195 dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
8197 dsc->modinsn[0] = (insn1 & 0xfeff); /* POP {r0,r1,...,r6, r7} */
8198 dsc->modinsn[1] = 0x46b8; /* MOV r8, r7 */
8199 dsc->modinsn[2] = 0xbc80; /* POP {r7} */
8201 dsc->numinsns = 3;
8202 dsc->cleanup = &cleanup_pop_pc_16bit_all;
8204 else
8206 unsigned int num_in_list = count_one_bits (dsc->u.block.regmask);
8207 unsigned int i;
8208 unsigned int new_regmask;
8210 for (i = 0; i < num_in_list + 1; i++)
8211 dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
8213 new_regmask = (1 << (num_in_list + 1)) - 1;
8215 displaced_debug_printf ("POP {..., pc}: original reg list %.4x, "
8216 "modified list %.4x",
8217 (int) dsc->u.block.regmask, new_regmask);
8219 dsc->u.block.regmask |= 0x8000;
8220 dsc->u.block.writeback = 0;
8221 dsc->u.block.cond = INST_AL;
8223 dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
8225 dsc->cleanup = &cleanup_block_load_pc;
8228 return 0;
8231 static void
8232 thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8233 struct regcache *regs,
8234 arm_displaced_step_copy_insn_closure *dsc)
8236 unsigned short op_bit_12_15 = bits (insn1, 12, 15);
8237 unsigned short op_bit_10_11 = bits (insn1, 10, 11);
8238 int err = 0;
8240 /* 16-bit thumb instructions. */
8241 switch (op_bit_12_15)
8243 /* Shift (imme), add, subtract, move and compare. */
8244 case 0: case 1: case 2: case 3:
8245 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8246 "shift/add/sub/mov/cmp",
8247 dsc);
8248 break;
8249 case 4:
8250 switch (op_bit_10_11)
8252 case 0: /* Data-processing */
8253 err = thumb_copy_unmodified_16bit (gdbarch, insn1,
8254 "data-processing",
8255 dsc);
8256 break;
8257 case 1: /* Special data instructions and branch and exchange. */
8259 unsigned short op = bits (insn1, 7, 9);
8260 if (op == 6 || op == 7) /* BX or BLX */
8261 err = thumb_copy_bx_blx_reg (gdbarch, insn1, regs, dsc);
8262 else if (bits (insn1, 6, 7) != 0) /* ADD/MOV/CMP high registers. */
8263 err = thumb_copy_alu_reg (gdbarch, insn1, regs, dsc);
8264 else
8265 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "special data",
8266 dsc);
8268 break;
8269 default: /* LDR (literal) */
8270 err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
8272 break;
8273 case 5: case 6: case 7: case 8: case 9: /* Load/Store single data item */
8274 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldr/str", dsc);
8275 break;
8276 case 10:
8277 if (op_bit_10_11 < 2) /* Generate PC-relative address */
8278 err = thumb_decode_pc_relative_16bit (gdbarch, insn1, regs, dsc);
8279 else /* Generate SP-relative address */
8280 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "sp-relative", dsc);
8281 break;
8282 case 11: /* Misc 16-bit instructions */
8284 switch (bits (insn1, 8, 11))
8286 case 1: case 3: case 9: case 11: /* CBNZ, CBZ */
8287 err = thumb_copy_cbnz_cbz (gdbarch, insn1, regs, dsc);
8288 break;
8289 case 12: case 13: /* POP */
8290 if (bit (insn1, 8)) /* PC is in register list. */
8291 err = thumb_copy_pop_pc_16bit (gdbarch, insn1, regs, dsc);
8292 else
8293 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "pop", dsc);
8294 break;
8295 case 15: /* If-Then, and hints */
8296 if (bits (insn1, 0, 3))
8297 /* If-Then makes up to four following instructions conditional.
8298 IT instruction itself is not conditional, so handle it as a
8299 common unmodified instruction. */
8300 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "If-Then",
8301 dsc);
8302 else
8303 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "hints", dsc);
8304 break;
8305 default:
8306 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "misc", dsc);
8309 break;
8310 case 12:
8311 if (op_bit_10_11 < 2) /* Store multiple registers */
8312 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "stm", dsc);
8313 else /* Load multiple registers */
8314 err = thumb_copy_unmodified_16bit (gdbarch, insn1, "ldm", dsc);
8315 break;
8316 case 13: /* Conditional branch and supervisor call */
8317 if (bits (insn1, 9, 11) != 7) /* conditional branch */
8318 err = thumb_copy_b (gdbarch, insn1, dsc);
8319 else
8320 err = thumb_copy_svc (gdbarch, insn1, regs, dsc);
8321 break;
8322 case 14: /* Unconditional branch */
8323 err = thumb_copy_b (gdbarch, insn1, dsc);
8324 break;
8325 default:
8326 err = 1;
8329 if (err)
8330 internal_error (_("thumb_process_displaced_16bit_insn: Instruction decode error"));
8333 static int
8334 decode_thumb_32bit_ld_mem_hints (struct gdbarch *gdbarch,
8335 uint16_t insn1, uint16_t insn2,
8336 struct regcache *regs,
8337 arm_displaced_step_copy_insn_closure *dsc)
8339 int rt = bits (insn2, 12, 15);
8340 int rn = bits (insn1, 0, 3);
8341 int op1 = bits (insn1, 7, 8);
8343 switch (bits (insn1, 5, 6))
8345 case 0: /* Load byte and memory hints */
8346 if (rt == 0xf) /* PLD/PLI */
8348 if (rn == 0xf)
8349 /* PLD literal or Encoding T3 of PLI(immediate, literal). */
8350 return thumb2_copy_preload (gdbarch, insn1, insn2, regs, dsc);
8351 else
8352 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8353 "pli/pld", dsc);
8355 else
8357 if (rn == 0xf) /* LDRB/LDRSB (literal) */
8358 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8360 else
8361 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8362 "ldrb{reg, immediate}/ldrbt",
8363 dsc);
8366 break;
8367 case 1: /* Load halfword and memory hints. */
8368 if (rt == 0xf) /* PLD{W} and Unalloc memory hint. */
8369 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8370 "pld/unalloc memhint", dsc);
8371 else
8373 if (rn == 0xf)
8374 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8376 else
8377 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8378 "ldrh/ldrht", dsc);
8380 break;
8381 case 2: /* Load word */
8383 int insn2_bit_8_11 = bits (insn2, 8, 11);
8385 if (rn == 0xf)
8386 return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc, 4);
8387 else if (op1 == 0x1) /* Encoding T3 */
8388 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs, dsc,
8389 0, 1);
8390 else /* op1 == 0x0 */
8392 if (insn2_bit_8_11 == 0xc || (insn2_bit_8_11 & 0x9) == 0x9)
8393 /* LDR (immediate) */
8394 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8395 dsc, bit (insn2, 8), 1);
8396 else if (insn2_bit_8_11 == 0xe) /* LDRT */
8397 return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8398 "ldrt", dsc);
8399 else
8400 /* LDR (register) */
8401 return thumb2_copy_load_reg_imm (gdbarch, insn1, insn2, regs,
8402 dsc, 0, 0);
8404 break;
8406 default:
8407 return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
8408 break;
8410 return 0;
8413 static void
8414 thumb_process_displaced_32bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8415 uint16_t insn2, struct regcache *regs,
8416 arm_displaced_step_copy_insn_closure *dsc)
8418 int err = 0;
8419 unsigned short op = bit (insn2, 15);
8420 unsigned int op1 = bits (insn1, 11, 12);
8422 switch (op1)
8424 case 1:
8426 switch (bits (insn1, 9, 10))
8428 case 0:
8429 if (bit (insn1, 6))
8431 /* Load/store {dual, exclusive}, table branch. */
8432 if (bits (insn1, 7, 8) == 1 && bits (insn1, 4, 5) == 1
8433 && bits (insn2, 5, 7) == 0)
8434 err = thumb2_copy_table_branch (gdbarch, insn1, insn2, regs,
8435 dsc);
8436 else
8437 /* PC is not allowed to use in load/store {dual, exclusive}
8438 instructions. */
8439 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8440 "load/store dual/ex", dsc);
8442 else /* load/store multiple */
8444 switch (bits (insn1, 7, 8))
8446 case 0: case 3: /* SRS, RFE */
8447 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8448 "srs/rfe", dsc);
8449 break;
8450 case 1: case 2: /* LDM/STM/PUSH/POP */
8451 err = thumb2_copy_block_xfer (gdbarch, insn1, insn2, regs, dsc);
8452 break;
8455 break;
8457 case 1:
8458 /* Data-processing (shift register). */
8459 err = thumb2_decode_dp_shift_reg (gdbarch, insn1, insn2, regs,
8460 dsc);
8461 break;
8462 default: /* Coprocessor instructions. */
8463 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8464 break;
8466 break;
8468 case 2: /* op1 = 2 */
8469 if (op) /* Branch and misc control. */
8471 if (bit (insn2, 14) /* BLX/BL */
8472 || bit (insn2, 12) /* Unconditional branch */
8473 || (bits (insn1, 7, 9) != 0x7)) /* Conditional branch */
8474 err = thumb2_copy_b_bl_blx (gdbarch, insn1, insn2, regs, dsc);
8475 else
8476 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8477 "misc ctrl", dsc);
8479 else
8481 if (bit (insn1, 9)) /* Data processing (plain binary imm). */
8483 int dp_op = bits (insn1, 4, 8);
8484 int rn = bits (insn1, 0, 3);
8485 if ((dp_op == 0 || dp_op == 0xa) && rn == 0xf)
8486 err = thumb_copy_pc_relative_32bit (gdbarch, insn1, insn2,
8487 regs, dsc);
8488 else
8489 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8490 "dp/pb", dsc);
8492 else /* Data processing (modified immediate) */
8493 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8494 "dp/mi", dsc);
8496 break;
8497 case 3: /* op1 = 3 */
8498 switch (bits (insn1, 9, 10))
8500 case 0:
8501 if (bit (insn1, 4))
8502 err = decode_thumb_32bit_ld_mem_hints (gdbarch, insn1, insn2,
8503 regs, dsc);
8504 else /* NEON Load/Store and Store single data item */
8505 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8506 "neon elt/struct load/store",
8507 dsc);
8508 break;
8509 case 1: /* op1 = 3, bits (9, 10) == 1 */
8510 switch (bits (insn1, 7, 8))
8512 case 0: case 1: /* Data processing (register) */
8513 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8514 "dp(reg)", dsc);
8515 break;
8516 case 2: /* Multiply and absolute difference */
8517 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8518 "mul/mua/diff", dsc);
8519 break;
8520 case 3: /* Long multiply and divide */
8521 err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8522 "lmul/lmua", dsc);
8523 break;
8525 break;
8526 default: /* Coprocessor instructions */
8527 err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8528 break;
8530 break;
8531 default:
8532 err = 1;
8535 if (err)
8536 internal_error (_("thumb_process_displaced_32bit_insn: Instruction decode error"));
8540 static void
8541 thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8542 struct regcache *regs,
8543 arm_displaced_step_copy_insn_closure *dsc)
8545 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8546 uint16_t insn1
8547 = read_memory_unsigned_integer (from, 2, byte_order_for_code);
8549 displaced_debug_printf ("process thumb insn %.4x at %.8lx",
8550 insn1, (unsigned long) from);
8552 dsc->is_thumb = 1;
8553 dsc->insn_size = thumb_insn_size (insn1);
8554 if (thumb_insn_size (insn1) == 4)
8556 uint16_t insn2
8557 = read_memory_unsigned_integer (from + 2, 2, byte_order_for_code);
8558 thumb_process_displaced_32bit_insn (gdbarch, insn1, insn2, regs, dsc);
8560 else
8561 thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
8564 void
8565 arm_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8566 CORE_ADDR to, struct regcache *regs,
8567 arm_displaced_step_copy_insn_closure *dsc)
8569 int err = 0;
8570 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8571 uint32_t insn;
8573 /* Most displaced instructions use a 1-instruction scratch space, so set this
8574 here and override below if/when necessary. */
8575 dsc->numinsns = 1;
8576 dsc->insn_addr = from;
8577 dsc->scratch_base = to;
8578 dsc->cleanup = NULL;
8579 dsc->wrote_to_pc = 0;
8581 if (!displaced_in_arm_mode (regs))
8582 return thumb_process_displaced_insn (gdbarch, from, regs, dsc);
8584 dsc->is_thumb = 0;
8585 dsc->insn_size = 4;
8586 insn = read_memory_unsigned_integer (from, 4, byte_order_for_code);
8587 displaced_debug_printf ("stepping insn %.8lx at %.8lx",
8588 (unsigned long) insn, (unsigned long) from);
8590 if ((insn & 0xf0000000) == 0xf0000000)
8591 err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
8592 else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
8594 case 0x0: case 0x1: case 0x2: case 0x3:
8595 err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
8596 break;
8598 case 0x4: case 0x5: case 0x6:
8599 err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
8600 break;
8602 case 0x7:
8603 err = arm_decode_media (gdbarch, insn, dsc);
8604 break;
8606 case 0x8: case 0x9: case 0xa: case 0xb:
8607 err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
8608 break;
8610 case 0xc: case 0xd: case 0xe: case 0xf:
8611 err = arm_decode_svc_copro (gdbarch, insn, regs, dsc);
8612 break;
8615 if (err)
8616 internal_error (_("arm_process_displaced_insn: Instruction decode error"));
8619 /* Actually set up the scratch space for a displaced instruction. */
8621 void
8622 arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
8623 CORE_ADDR to,
8624 arm_displaced_step_copy_insn_closure *dsc)
8626 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
8627 unsigned int i, len, offset;
8628 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8629 int size = dsc->is_thumb ? 2 : 4;
8630 const gdb_byte *bkp_insn;
8632 offset = 0;
8633 /* Poke modified instruction(s). */
8634 for (i = 0; i < dsc->numinsns; i++)
8636 if (size == 4)
8637 displaced_debug_printf ("writing insn %.8lx at %.8lx",
8638 dsc->modinsn[i], (unsigned long) to + offset);
8639 else if (size == 2)
8640 displaced_debug_printf ("writing insn %.4x at %.8lx",
8641 (unsigned short) dsc->modinsn[i],
8642 (unsigned long) to + offset);
8644 write_memory_unsigned_integer (to + offset, size,
8645 byte_order_for_code,
8646 dsc->modinsn[i]);
8647 offset += size;
8650 /* Choose the correct breakpoint instruction. */
8651 if (dsc->is_thumb)
8653 bkp_insn = tdep->thumb_breakpoint;
8654 len = tdep->thumb_breakpoint_size;
8656 else
8658 bkp_insn = tdep->arm_breakpoint;
8659 len = tdep->arm_breakpoint_size;
8662 /* Put breakpoint afterwards. */
8663 write_memory (to + offset, bkp_insn, len);
8665 displaced_debug_printf ("copy %s->%s", paddress (gdbarch, from),
8666 paddress (gdbarch, to));
8669 /* Entry point for cleaning things up after a displaced instruction has been
8670 single-stepped. */
8672 void
8673 arm_displaced_step_fixup (struct gdbarch *gdbarch,
8674 struct displaced_step_copy_insn_closure *dsc_,
8675 CORE_ADDR from, CORE_ADDR to,
8676 struct regcache *regs, bool completed_p)
8678 /* The following block exists as a temporary measure while displaced
8679 stepping is fixed architecture at a time within GDB.
8681 In an earlier implementation of displaced stepping, if GDB thought the
8682 displaced instruction had not been executed then this fix up function
8683 was never called. As a consequence, things that should be fixed by
8684 this function were left in an unfixed state.
8686 However, it's not as simple as always calling this function; this
8687 function needs to be updated to decide what should be fixed up based
8688 on whether the displaced step executed or not, which requires each
8689 architecture to be considered individually.
8691 Until this architecture is updated, this block replicates the old
8692 behaviour; we just restore the program counter register, and leave
8693 everything else unfixed. */
8694 if (!completed_p)
8696 CORE_ADDR pc = regcache_read_pc (regs);
8697 pc = from + (pc - to);
8698 regcache_write_pc (regs, pc);
8699 return;
8702 arm_displaced_step_copy_insn_closure *dsc
8703 = (arm_displaced_step_copy_insn_closure *) dsc_;
8705 if (dsc->cleanup)
8706 dsc->cleanup (gdbarch, regs, dsc);
8708 if (!dsc->wrote_to_pc)
8709 regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
8710 dsc->insn_addr + dsc->insn_size);
8714 #include "bfd-in2.h"
8715 #include "libcoff.h"
8717 static int
8718 gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
8720 gdb_disassemble_info *di
8721 = static_cast<gdb_disassemble_info *> (info->application_data);
8722 struct gdbarch *gdbarch = di->arch ();
8724 if (arm_pc_is_thumb (gdbarch, memaddr))
8726 static asymbol *asym;
8727 static combined_entry_type ce;
8728 static struct coff_symbol_struct csym;
8729 static struct bfd fake_bfd;
8730 static bfd_target fake_target;
8732 if (csym.native == NULL)
8734 /* Create a fake symbol vector containing a Thumb symbol.
8735 This is solely so that the code in print_insn_little_arm()
8736 and print_insn_big_arm() in opcodes/arm-dis.c will detect
8737 the presence of a Thumb symbol and switch to decoding
8738 Thumb instructions. */
8740 fake_target.flavour = bfd_target_coff_flavour;
8741 fake_bfd.xvec = &fake_target;
8742 ce.u.syment.n_sclass = C_THUMBEXTFUNC;
8743 csym.native = &ce;
8744 csym.symbol.the_bfd = &fake_bfd;
8745 csym.symbol.name = "fake";
8746 asym = (asymbol *) & csym;
8749 memaddr = UNMAKE_THUMB_ADDR (memaddr);
8750 info->symbols = &asym;
8752 else
8753 info->symbols = NULL;
8755 /* GDB is able to get bfd_mach from the exe_bfd, info->mach is
8756 accurate, so mark USER_SPECIFIED_MACHINE_TYPE bit. Otherwise,
8757 opcodes/arm-dis.c:print_insn reset info->mach, and it will trigger
8758 the assert on the mismatch of info->mach and
8759 bfd_get_mach (current_program_space->exec_bfd ()) in
8760 default_print_insn. */
8761 if (current_program_space->exec_bfd () != NULL
8762 && (current_program_space->exec_bfd ()->arch_info
8763 == gdbarch_bfd_arch_info (gdbarch)))
8764 info->flags |= USER_SPECIFIED_MACHINE_TYPE;
8766 return default_print_insn (memaddr, info);
8769 /* The following define instruction sequences that will cause ARM
8770 cpu's to take an undefined instruction trap. These are used to
8771 signal a breakpoint to GDB.
8773 The newer ARMv4T cpu's are capable of operating in ARM or Thumb
8774 modes. A different instruction is required for each mode. The ARM
8775 cpu's can also be big or little endian. Thus four different
8776 instructions are needed to support all cases.
8778 Note: ARMv4 defines several new instructions that will take the
8779 undefined instruction trap. ARM7TDMI is nominally ARMv4T, but does
8780 not in fact add the new instructions. The new undefined
8781 instructions in ARMv4 are all instructions that had no defined
8782 behaviour in earlier chips. There is no guarantee that they will
8783 raise an exception, but may be treated as NOP's. In practice, it
8784 may only safe to rely on instructions matching:
8786 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
8787 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
8788 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
8790 Even this may only true if the condition predicate is true. The
8791 following use a condition predicate of ALWAYS so it is always TRUE.
8793 There are other ways of forcing a breakpoint. GNU/Linux, RISC iX,
8794 and NetBSD all use a software interrupt rather than an undefined
8795 instruction to force a trap. This can be handled by by the
8796 abi-specific code during establishment of the gdbarch vector. */
8798 #define ARM_LE_BREAKPOINT {0xFE,0xDE,0xFF,0xE7}
8799 #define ARM_BE_BREAKPOINT {0xE7,0xFF,0xDE,0xFE}
8800 #define THUMB_LE_BREAKPOINT {0xbe,0xbe}
8801 #define THUMB_BE_BREAKPOINT {0xbe,0xbe}
8803 static const gdb_byte arm_default_arm_le_breakpoint[] = ARM_LE_BREAKPOINT;
8804 static const gdb_byte arm_default_arm_be_breakpoint[] = ARM_BE_BREAKPOINT;
8805 static const gdb_byte arm_default_thumb_le_breakpoint[] = THUMB_LE_BREAKPOINT;
8806 static const gdb_byte arm_default_thumb_be_breakpoint[] = THUMB_BE_BREAKPOINT;
8808 /* Implement the breakpoint_kind_from_pc gdbarch method. */
8810 static int
8811 arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
8813 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
8814 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8816 if (arm_pc_is_thumb (gdbarch, *pcptr))
8818 *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
8820 /* If we have a separate 32-bit breakpoint instruction for Thumb-2,
8821 check whether we are replacing a 32-bit instruction. */
8822 if (tdep->thumb2_breakpoint != NULL)
8824 gdb_byte buf[2];
8826 if (target_read_memory (*pcptr, buf, 2) == 0)
8828 unsigned short inst1;
8830 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
8831 if (thumb_insn_size (inst1) == 4)
8832 return ARM_BP_KIND_THUMB2;
8836 return ARM_BP_KIND_THUMB;
8838 else
8839 return ARM_BP_KIND_ARM;
8843 /* Implement the sw_breakpoint_from_kind gdbarch method. */
8845 static const gdb_byte *
8846 arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
8848 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
8850 switch (kind)
8852 case ARM_BP_KIND_ARM:
8853 *size = tdep->arm_breakpoint_size;
8854 return tdep->arm_breakpoint;
8855 case ARM_BP_KIND_THUMB:
8856 *size = tdep->thumb_breakpoint_size;
8857 return tdep->thumb_breakpoint;
8858 case ARM_BP_KIND_THUMB2:
8859 *size = tdep->thumb2_breakpoint_size;
8860 return tdep->thumb2_breakpoint;
8861 default:
8862 gdb_assert_not_reached ("unexpected arm breakpoint kind");
8866 /* Implement the breakpoint_kind_from_current_state gdbarch method. */
8868 static int
8869 arm_breakpoint_kind_from_current_state (struct gdbarch *gdbarch,
8870 struct regcache *regcache,
8871 CORE_ADDR *pcptr)
8873 gdb_byte buf[4];
8875 /* Check the memory pointed by PC is readable. */
8876 if (target_read_memory (regcache_read_pc (regcache), buf, 4) == 0)
8878 struct arm_get_next_pcs next_pcs_ctx;
8880 arm_get_next_pcs_ctor (&next_pcs_ctx,
8881 &arm_get_next_pcs_ops,
8882 gdbarch_byte_order (gdbarch),
8883 gdbarch_byte_order_for_code (gdbarch),
8885 regcache);
8887 std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
8889 /* If MEMADDR is the next instruction of current pc, do the
8890 software single step computation, and get the thumb mode by
8891 the destination address. */
8892 for (CORE_ADDR pc : next_pcs)
8894 if (UNMAKE_THUMB_ADDR (pc) == *pcptr)
8896 if (IS_THUMB_ADDR (pc))
8898 *pcptr = MAKE_THUMB_ADDR (*pcptr);
8899 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
8901 else
8902 return ARM_BP_KIND_ARM;
8907 return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
8910 /* Extract from an array REGBUF containing the (raw) register state a
8911 function return value of type TYPE, and copy that, in virtual
8912 format, into VALBUF. */
8914 static void
8915 arm_extract_return_value (struct type *type, struct regcache *regs,
8916 gdb_byte *valbuf)
8918 struct gdbarch *gdbarch = regs->arch ();
8919 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
8920 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
8922 while (type->code () == TYPE_CODE_RANGE)
8923 type = check_typedef (type->target_type ());
8925 if (TYPE_CODE_FLT == type->code ())
8927 switch (tdep->fp_model)
8929 case ARM_FLOAT_FPA:
8931 /* The value is in register F0 in internal format. We need to
8932 extract the raw value and then convert it to the desired
8933 internal type. */
8934 bfd_byte tmpbuf[ARM_FP_REGISTER_SIZE];
8936 regs->cooked_read (ARM_F0_REGNUM, tmpbuf);
8937 target_float_convert (tmpbuf, arm_ext_type (gdbarch),
8938 valbuf, type);
8940 break;
8942 case ARM_FLOAT_SOFT_FPA:
8943 case ARM_FLOAT_SOFT_VFP:
8944 /* ARM_FLOAT_VFP can arise if this is a variadic function so
8945 not using the VFP ABI code. */
8946 case ARM_FLOAT_VFP:
8947 regs->cooked_read (ARM_A1_REGNUM, valbuf);
8948 if (type->length () > 4)
8949 regs->cooked_read (ARM_A1_REGNUM + 1,
8950 valbuf + ARM_INT_REGISTER_SIZE);
8951 break;
8953 default:
8954 internal_error (_("arm_extract_return_value: "
8955 "Floating point model not supported"));
8956 break;
8959 else if (type->code () == TYPE_CODE_INT
8960 || type->code () == TYPE_CODE_CHAR
8961 || type->code () == TYPE_CODE_BOOL
8962 || type->code () == TYPE_CODE_PTR
8963 || TYPE_IS_REFERENCE (type)
8964 || type->code () == TYPE_CODE_ENUM
8965 || is_fixed_point_type (type))
8967 /* If the type is a plain integer, then the access is
8968 straight-forward. Otherwise we have to play around a bit
8969 more. */
8970 int len = type->length ();
8971 int regno = ARM_A1_REGNUM;
8972 ULONGEST tmp;
8974 while (len > 0)
8976 /* By using store_unsigned_integer we avoid having to do
8977 anything special for small big-endian values. */
8978 regcache_cooked_read_unsigned (regs, regno++, &tmp);
8979 store_unsigned_integer (valbuf,
8980 (len > ARM_INT_REGISTER_SIZE
8981 ? ARM_INT_REGISTER_SIZE : len),
8982 byte_order, tmp);
8983 len -= ARM_INT_REGISTER_SIZE;
8984 valbuf += ARM_INT_REGISTER_SIZE;
8987 else
8989 /* For a structure or union the behaviour is as if the value had
8990 been stored to word-aligned memory and then loaded into
8991 registers with 32-bit load instruction(s). */
8992 int len = type->length ();
8993 int regno = ARM_A1_REGNUM;
8994 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
8996 while (len > 0)
8998 regs->cooked_read (regno++, tmpbuf);
8999 memcpy (valbuf, tmpbuf,
9000 len > ARM_INT_REGISTER_SIZE ? ARM_INT_REGISTER_SIZE : len);
9001 len -= ARM_INT_REGISTER_SIZE;
9002 valbuf += ARM_INT_REGISTER_SIZE;
9008 /* Will a function return an aggregate type in memory or in a
9009 register? Return 0 if an aggregate type can be returned in a
9010 register, 1 if it must be returned in memory. */
9012 static int
9013 arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
9015 enum type_code code;
9017 type = check_typedef (type);
9019 /* Simple, non-aggregate types (ie not including vectors and
9020 complex) are always returned in a register (or registers). */
9021 code = type->code ();
9022 if (TYPE_CODE_STRUCT != code && TYPE_CODE_UNION != code
9023 && TYPE_CODE_ARRAY != code && TYPE_CODE_COMPLEX != code)
9024 return 0;
9026 if (TYPE_HAS_DYNAMIC_LENGTH (type))
9027 return 1;
9029 if (TYPE_CODE_ARRAY == code && type->is_vector ())
9031 /* Vector values should be returned using ARM registers if they
9032 are not over 16 bytes. */
9033 return (type->length () > 16);
9036 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9037 if (tdep->arm_abi != ARM_ABI_APCS)
9039 /* The AAPCS says all aggregates not larger than a word are returned
9040 in a register. */
9041 if (type->length () <= ARM_INT_REGISTER_SIZE
9042 && language_pass_by_reference (type).trivially_copyable)
9043 return 0;
9045 return 1;
9047 else
9049 int nRc;
9051 /* All aggregate types that won't fit in a register must be returned
9052 in memory. */
9053 if (type->length () > ARM_INT_REGISTER_SIZE
9054 || !language_pass_by_reference (type).trivially_copyable)
9055 return 1;
9057 /* In the ARM ABI, "integer" like aggregate types are returned in
9058 registers. For an aggregate type to be integer like, its size
9059 must be less than or equal to ARM_INT_REGISTER_SIZE and the
9060 offset of each addressable subfield must be zero. Note that bit
9061 fields are not addressable, and all addressable subfields of
9062 unions always start at offset zero.
9064 This function is based on the behaviour of GCC 2.95.1.
9065 See: gcc/arm.c: arm_return_in_memory() for details.
9067 Note: All versions of GCC before GCC 2.95.2 do not set up the
9068 parameters correctly for a function returning the following
9069 structure: struct { float f;}; This should be returned in memory,
9070 not a register. Richard Earnshaw sent me a patch, but I do not
9071 know of any way to detect if a function like the above has been
9072 compiled with the correct calling convention. */
9074 /* Assume all other aggregate types can be returned in a register.
9075 Run a check for structures, unions and arrays. */
9076 nRc = 0;
9078 if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
9080 int i;
9081 /* Need to check if this struct/union is "integer" like. For
9082 this to be true, its size must be less than or equal to
9083 ARM_INT_REGISTER_SIZE and the offset of each addressable
9084 subfield must be zero. Note that bit fields are not
9085 addressable, and unions always start at offset zero. If any
9086 of the subfields is a floating point type, the struct/union
9087 cannot be an integer type. */
9089 /* For each field in the object, check:
9090 1) Is it FP? --> yes, nRc = 1;
9091 2) Is it addressable (bitpos != 0) and
9092 not packed (bitsize == 0)?
9093 --> yes, nRc = 1
9096 for (i = 0; i < type->num_fields (); i++)
9098 enum type_code field_type_code;
9100 field_type_code
9101 = check_typedef (type->field (i).type ())->code ();
9103 /* Is it a floating point type field? */
9104 if (field_type_code == TYPE_CODE_FLT)
9106 nRc = 1;
9107 break;
9110 /* If bitpos != 0, then we have to care about it. */
9111 if (type->field (i).loc_bitpos () != 0)
9113 /* Bitfields are not addressable. If the field bitsize is
9114 zero, then the field is not packed. Hence it cannot be
9115 a bitfield or any other packed type. */
9116 if (type->field (i).bitsize () == 0)
9118 nRc = 1;
9119 break;
9125 return nRc;
9129 /* Write into appropriate registers a function return value of type
9130 TYPE, given in virtual format. */
9132 static void
9133 arm_store_return_value (struct type *type, struct regcache *regs,
9134 const gdb_byte *valbuf)
9136 struct gdbarch *gdbarch = regs->arch ();
9137 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9139 while (type->code () == TYPE_CODE_RANGE)
9140 type = check_typedef (type->target_type ());
9142 if (type->code () == TYPE_CODE_FLT)
9144 gdb_byte buf[ARM_FP_REGISTER_SIZE];
9145 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9147 switch (tdep->fp_model)
9149 case ARM_FLOAT_FPA:
9151 target_float_convert (valbuf, type, buf, arm_ext_type (gdbarch));
9152 regs->cooked_write (ARM_F0_REGNUM, buf);
9153 break;
9155 case ARM_FLOAT_SOFT_FPA:
9156 case ARM_FLOAT_SOFT_VFP:
9157 /* ARM_FLOAT_VFP can arise if this is a variadic function so
9158 not using the VFP ABI code. */
9159 case ARM_FLOAT_VFP:
9160 regs->cooked_write (ARM_A1_REGNUM, valbuf);
9161 if (type->length () > 4)
9162 regs->cooked_write (ARM_A1_REGNUM + 1,
9163 valbuf + ARM_INT_REGISTER_SIZE);
9164 break;
9166 default:
9167 internal_error (_("arm_store_return_value: Floating "
9168 "point model not supported"));
9169 break;
9172 else if (type->code () == TYPE_CODE_INT
9173 || type->code () == TYPE_CODE_CHAR
9174 || type->code () == TYPE_CODE_BOOL
9175 || type->code () == TYPE_CODE_PTR
9176 || TYPE_IS_REFERENCE (type)
9177 || type->code () == TYPE_CODE_ENUM
9178 || is_fixed_point_type (type))
9180 if (type->length () <= 4)
9182 /* Values of one word or less are zero/sign-extended and
9183 returned in r0. */
9184 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
9186 if (is_fixed_point_type (type))
9188 gdb_mpz unscaled;
9189 unscaled.read (gdb::make_array_view (valbuf, type->length ()),
9190 byte_order, type->is_unsigned ());
9191 unscaled.write (gdb::make_array_view (tmpbuf, sizeof (tmpbuf)),
9192 byte_order, type->is_unsigned ());
9194 else
9196 LONGEST val = unpack_long (type, valbuf);
9197 store_signed_integer (tmpbuf, ARM_INT_REGISTER_SIZE, byte_order, val);
9199 regs->cooked_write (ARM_A1_REGNUM, tmpbuf);
9201 else
9203 /* Integral values greater than one word are stored in consecutive
9204 registers starting with r0. This will always be a multiple of
9205 the regiser size. */
9206 int len = type->length ();
9207 int regno = ARM_A1_REGNUM;
9209 while (len > 0)
9211 regs->cooked_write (regno++, valbuf);
9212 len -= ARM_INT_REGISTER_SIZE;
9213 valbuf += ARM_INT_REGISTER_SIZE;
9217 else
9219 /* For a structure or union the behaviour is as if the value had
9220 been stored to word-aligned memory and then loaded into
9221 registers with 32-bit load instruction(s). */
9222 int len = type->length ();
9223 int regno = ARM_A1_REGNUM;
9224 bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
9226 while (len > 0)
9228 memcpy (tmpbuf, valbuf,
9229 len > ARM_INT_REGISTER_SIZE ? ARM_INT_REGISTER_SIZE : len);
9230 regs->cooked_write (regno++, tmpbuf);
9231 len -= ARM_INT_REGISTER_SIZE;
9232 valbuf += ARM_INT_REGISTER_SIZE;
9238 /* Handle function return values. */
9240 static enum return_value_convention
9241 arm_return_value (struct gdbarch *gdbarch, struct value *function,
9242 struct type *valtype, struct regcache *regcache,
9243 struct value **read_value, const gdb_byte *writebuf)
9245 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9246 struct type *func_type = function ? function->type () : NULL;
9247 enum arm_vfp_cprc_base_type vfp_base_type;
9248 int vfp_base_count;
9250 if (arm_vfp_abi_for_function (gdbarch, func_type)
9251 && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
9253 int reg_char = arm_vfp_cprc_reg_char (vfp_base_type);
9254 int unit_length = arm_vfp_cprc_unit_length (vfp_base_type);
9255 int i;
9257 gdb_byte *readbuf = nullptr;
9258 if (read_value != nullptr)
9260 *read_value = value::allocate (valtype);
9261 readbuf = (*read_value)->contents_raw ().data ();
9264 for (i = 0; i < vfp_base_count; i++)
9266 if (reg_char == 'q')
9268 if (writebuf)
9269 arm_neon_quad_write (gdbarch, regcache, i,
9270 writebuf + i * unit_length);
9272 if (readbuf)
9273 arm_neon_quad_read (gdbarch, regcache, i,
9274 readbuf + i * unit_length);
9276 else
9278 char name_buf[4];
9279 int regnum;
9281 xsnprintf (name_buf, sizeof (name_buf), "%c%d", reg_char, i);
9282 regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9283 strlen (name_buf));
9284 if (writebuf)
9285 regcache->cooked_write (regnum, writebuf + i * unit_length);
9286 if (readbuf)
9287 regcache->cooked_read (regnum, readbuf + i * unit_length);
9290 return RETURN_VALUE_REGISTER_CONVENTION;
9293 if (valtype->code () == TYPE_CODE_STRUCT
9294 || valtype->code () == TYPE_CODE_UNION
9295 || valtype->code () == TYPE_CODE_ARRAY)
9297 /* From the AAPCS document:
9299 Result return:
9301 A Composite Type larger than 4 bytes, or whose size cannot be
9302 determined statically by both caller and callee, is stored in memory
9303 at an address passed as an extra argument when the function was
9304 called (Parameter Passing, rule A.4). The memory to be used for the
9305 result may be modified at any point during the function call.
9307 Parameter Passing:
9309 A.4: If the subroutine is a function that returns a result in memory,
9310 then the address for the result is placed in r0 and the NCRN is set
9311 to r1. */
9312 if (tdep->struct_return == pcc_struct_return
9313 || arm_return_in_memory (gdbarch, valtype))
9315 if (read_value != nullptr)
9317 CORE_ADDR addr;
9319 regcache->cooked_read (ARM_A1_REGNUM, &addr);
9320 *read_value = value_at_non_lval (valtype, addr);
9322 return RETURN_VALUE_ABI_RETURNS_ADDRESS;
9325 else if (valtype->code () == TYPE_CODE_COMPLEX)
9327 if (arm_return_in_memory (gdbarch, valtype))
9328 return RETURN_VALUE_STRUCT_CONVENTION;
9331 if (writebuf)
9332 arm_store_return_value (valtype, regcache, writebuf);
9334 if (read_value != nullptr)
9336 *read_value = value::allocate (valtype);
9337 gdb_byte *readbuf = (*read_value)->contents_raw ().data ();
9338 arm_extract_return_value (valtype, regcache, readbuf);
9341 return RETURN_VALUE_REGISTER_CONVENTION;
9345 static int
9346 arm_get_longjmp_target (frame_info_ptr frame, CORE_ADDR *pc)
9348 struct gdbarch *gdbarch = get_frame_arch (frame);
9349 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9350 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9351 CORE_ADDR jb_addr;
9352 gdb_byte buf[ARM_INT_REGISTER_SIZE];
9354 jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9356 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
9357 ARM_INT_REGISTER_SIZE))
9358 return 0;
9360 *pc = extract_unsigned_integer (buf, ARM_INT_REGISTER_SIZE, byte_order);
9361 return 1;
9363 /* A call to cmse secure entry function "foo" at "a" is modified by
9364 GNU ld as "b".
9365 a) bl xxxx <foo>
9367 <foo>
9368 xxxx:
9370 b) bl yyyy <__acle_se_foo>
9372 section .gnu.sgstubs:
9373 <foo>
9374 yyyy: sg // secure gateway
9375 b.w xxxx <__acle_se_foo> // original_branch_dest
9377 <__acle_se_foo>
9378 xxxx:
9380 When the control at "b", the pc contains "yyyy" (sg address) which is a
9381 trampoline and does not exist in source code. This function returns the
9382 target pc "xxxx". For more details please refer to section 5.4
9383 (Entry functions) and section 3.4.4 (C level development flow of secure code)
9384 of "armv8-m-security-extensions-requirements-on-development-tools-engineering-specification"
9385 document on www.developer.arm.com. */
9387 static CORE_ADDR
9388 arm_skip_cmse_entry (CORE_ADDR pc, const char *name, struct objfile *objfile)
9390 int target_len = strlen (name) + strlen ("__acle_se_") + 1;
9391 char *target_name = (char *) alloca (target_len);
9392 xsnprintf (target_name, target_len, "%s%s", "__acle_se_", name);
9394 struct bound_minimal_symbol minsym
9395 = lookup_minimal_symbol (target_name, NULL, objfile);
9397 if (minsym.minsym != nullptr)
9398 return minsym.value_address ();
9400 return 0;
9403 /* Return true when SEC points to ".gnu.sgstubs" section. */
9405 static bool
9406 arm_is_sgstubs_section (struct obj_section *sec)
9408 return (sec != nullptr
9409 && sec->the_bfd_section != nullptr
9410 && sec->the_bfd_section->name != nullptr
9411 && streq (sec->the_bfd_section->name, ".gnu.sgstubs"));
9414 /* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
9415 return the target PC. Otherwise return 0. */
9417 CORE_ADDR
9418 arm_skip_stub (frame_info_ptr frame, CORE_ADDR pc)
9420 const char *name;
9421 int namelen;
9422 CORE_ADDR start_addr;
9424 /* Find the starting address and name of the function containing the PC. */
9425 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
9427 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
9428 check here. */
9429 start_addr = arm_skip_bx_reg (frame, pc);
9430 if (start_addr != 0)
9431 return start_addr;
9433 return 0;
9436 /* If PC is in a Thumb call or return stub, return the address of the
9437 target PC, which is in a register. The thunk functions are called
9438 _call_via_xx, where x is the register name. The possible names
9439 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
9440 functions, named __ARM_call_via_r[0-7]. */
9441 if (startswith (name, "_call_via_")
9442 || startswith (name, "__ARM_call_via_"))
9444 /* Use the name suffix to determine which register contains the
9445 target PC. */
9446 static const char *table[15] =
9447 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9448 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
9450 int regno;
9451 int offset = strlen (name) - 2;
9453 for (regno = 0; regno <= 14; regno++)
9454 if (strcmp (&name[offset], table[regno]) == 0)
9455 return get_frame_register_unsigned (frame, regno);
9458 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
9459 non-interworking calls to foo. We could decode the stubs
9460 to find the target but it's easier to use the symbol table. */
9461 namelen = strlen (name);
9462 if (name[0] == '_' && name[1] == '_'
9463 && ((namelen > 2 + strlen ("_from_thumb")
9464 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
9465 || (namelen > 2 + strlen ("_from_arm")
9466 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
9468 char *target_name;
9469 int target_len = namelen - 2;
9470 struct bound_minimal_symbol minsym;
9471 struct objfile *objfile;
9472 struct obj_section *sec;
9474 if (name[namelen - 1] == 'b')
9475 target_len -= strlen ("_from_thumb");
9476 else
9477 target_len -= strlen ("_from_arm");
9479 target_name = (char *) alloca (target_len + 1);
9480 memcpy (target_name, name + 2, target_len);
9481 target_name[target_len] = '\0';
9483 sec = find_pc_section (pc);
9484 objfile = (sec == NULL) ? NULL : sec->objfile;
9485 minsym = lookup_minimal_symbol (target_name, NULL, objfile);
9486 if (minsym.minsym != NULL)
9487 return minsym.value_address ();
9488 else
9489 return 0;
9492 struct obj_section *section = find_pc_section (pc);
9494 /* Check whether SECTION points to the ".gnu.sgstubs" section. */
9495 if (arm_is_sgstubs_section (section))
9496 return arm_skip_cmse_entry (pc, name, section->objfile);
9498 return 0; /* not a stub */
9501 static void
9502 arm_update_current_architecture (void)
9504 /* If the current architecture is not ARM, we have nothing to do. */
9505 gdbarch *arch = current_inferior ()->arch ();
9506 if (gdbarch_bfd_arch_info (arch)->arch != bfd_arch_arm)
9507 return;
9509 /* Update the architecture. */
9510 gdbarch_info info;
9511 if (!gdbarch_update_p (info))
9512 internal_error (_("could not update architecture"));
9515 static void
9516 set_fp_model_sfunc (const char *args, int from_tty,
9517 struct cmd_list_element *c)
9519 int fp_model;
9521 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
9522 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
9524 arm_fp_model = (enum arm_float_model) fp_model;
9525 break;
9528 if (fp_model == ARM_FLOAT_LAST)
9529 internal_error (_("Invalid fp model accepted: %s."),
9530 current_fp_model);
9532 arm_update_current_architecture ();
9535 static void
9536 show_fp_model (struct ui_file *file, int from_tty,
9537 struct cmd_list_element *c, const char *value)
9539 gdbarch *arch = current_inferior ()->arch ();
9540 if (arm_fp_model == ARM_FLOAT_AUTO
9541 && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9543 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9545 gdb_printf (file, _("\
9546 The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
9547 fp_model_strings[tdep->fp_model]);
9549 else
9550 gdb_printf (file, _("\
9551 The current ARM floating point model is \"%s\".\n"),
9552 fp_model_strings[arm_fp_model]);
9555 static void
9556 arm_set_abi (const char *args, int from_tty,
9557 struct cmd_list_element *c)
9559 int arm_abi;
9561 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
9562 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
9564 arm_abi_global = (enum arm_abi_kind) arm_abi;
9565 break;
9568 if (arm_abi == ARM_ABI_LAST)
9569 internal_error (_("Invalid ABI accepted: %s."),
9570 arm_abi_string);
9572 arm_update_current_architecture ();
9575 static void
9576 arm_show_abi (struct ui_file *file, int from_tty,
9577 struct cmd_list_element *c, const char *value)
9579 gdbarch *arch = current_inferior ()->arch ();
9580 if (arm_abi_global == ARM_ABI_AUTO
9581 && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9583 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9585 gdb_printf (file, _("\
9586 The current ARM ABI is \"auto\" (currently \"%s\").\n"),
9587 arm_abi_strings[tdep->arm_abi]);
9589 else
9590 gdb_printf (file, _("The current ARM ABI is \"%s\".\n"),
9591 arm_abi_string);
9594 static void
9595 arm_show_fallback_mode (struct ui_file *file, int from_tty,
9596 struct cmd_list_element *c, const char *value)
9598 gdb_printf (file,
9599 _("The current execution mode assumed "
9600 "(when symbols are unavailable) is \"%s\".\n"),
9601 arm_fallback_mode_string);
9604 static void
9605 arm_show_force_mode (struct ui_file *file, int from_tty,
9606 struct cmd_list_element *c, const char *value)
9608 gdb_printf (file,
9609 _("The current execution mode assumed "
9610 "(even when symbols are available) is \"%s\".\n"),
9611 arm_force_mode_string);
9614 static void
9615 arm_show_unwind_secure_frames (struct ui_file *file, int from_tty,
9616 struct cmd_list_element *c, const char *value)
9618 gdb_printf (file,
9619 _("Usage of non-secure to secure exception stack unwinding is %s.\n"),
9620 arm_unwind_secure_frames ? "on" : "off");
9623 /* If the user changes the register disassembly style used for info
9624 register and other commands, we have to also switch the style used
9625 in opcodes for disassembly output. This function is run in the "set
9626 arm disassembly" command, and does that. */
9628 static void
9629 set_disassembly_style_sfunc (const char *args, int from_tty,
9630 struct cmd_list_element *c)
9632 /* Convert the short style name into the long style name (eg, reg-names-*)
9633 before calling the generic set_disassembler_options() function. */
9634 std::string long_name = std::string ("reg-names-") + disassembly_style;
9635 set_disassembler_options (&long_name[0]);
9638 static void
9639 show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
9640 struct cmd_list_element *c, const char *value)
9642 struct gdbarch *gdbarch = get_current_arch ();
9643 char *options = get_disassembler_options (gdbarch);
9644 const char *style = "";
9645 int len = 0;
9646 const char *opt;
9648 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
9649 if (startswith (opt, "reg-names-"))
9651 style = &opt[strlen ("reg-names-")];
9652 len = strcspn (style, ",");
9655 gdb_printf (file, "The disassembly style is \"%.*s\".\n", len, style);
9658 /* Return the ARM register name corresponding to register I. */
9659 static const char *
9660 arm_register_name (struct gdbarch *gdbarch, int i)
9662 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9664 if (is_s_pseudo (gdbarch, i))
9666 static const char *const s_pseudo_names[] = {
9667 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
9668 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
9669 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
9670 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
9673 return s_pseudo_names[i - tdep->s_pseudo_base];
9676 if (is_q_pseudo (gdbarch, i))
9678 static const char *const q_pseudo_names[] = {
9679 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
9680 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
9683 return q_pseudo_names[i - tdep->q_pseudo_base];
9686 if (is_mve_pseudo (gdbarch, i))
9687 return "p0";
9689 /* RA_AUTH_CODE is used for unwinding only. Do not assign it a name. */
9690 if (is_pacbti_pseudo (gdbarch, i))
9691 return "";
9693 if (i >= ARRAY_SIZE (arm_register_names))
9694 /* These registers are only supported on targets which supply
9695 an XML description. */
9696 return "";
9698 /* Non-pseudo registers. */
9699 return arm_register_names[i];
9702 /* Test whether the coff symbol specific value corresponds to a Thumb
9703 function. */
9705 static int
9706 coff_sym_is_thumb (int val)
9708 return (val == C_THUMBEXT
9709 || val == C_THUMBSTAT
9710 || val == C_THUMBEXTFUNC
9711 || val == C_THUMBSTATFUNC
9712 || val == C_THUMBLABEL);
9715 /* arm_coff_make_msymbol_special()
9716 arm_elf_make_msymbol_special()
9718 These functions test whether the COFF or ELF symbol corresponds to
9719 an address in thumb code, and set a "special" bit in a minimal
9720 symbol to indicate that it does. */
9722 static void
9723 arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
9725 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
9727 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
9728 == ST_BRANCH_TO_THUMB)
9729 MSYMBOL_SET_SPECIAL (msym);
9732 static void
9733 arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
9735 if (coff_sym_is_thumb (val))
9736 MSYMBOL_SET_SPECIAL (msym);
9739 static void
9740 arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
9741 asymbol *sym)
9743 const char *name = bfd_asymbol_name (sym);
9744 struct arm_per_bfd *data;
9745 struct arm_mapping_symbol new_map_sym;
9747 gdb_assert (name[0] == '$');
9748 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
9749 return;
9751 data = arm_bfd_data_key.get (objfile->obfd.get ());
9752 if (data == NULL)
9753 data = arm_bfd_data_key.emplace (objfile->obfd.get (),
9754 objfile->obfd->section_count);
9755 arm_mapping_symbol_vec &map
9756 = data->section_maps[bfd_asymbol_section (sym)->index];
9758 new_map_sym.value = sym->value;
9759 new_map_sym.type = name[1];
9761 /* Insert at the end, the vector will be sorted on first use. */
9762 map.push_back (new_map_sym);
9765 static void
9766 arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
9768 struct gdbarch *gdbarch = regcache->arch ();
9769 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
9771 /* If necessary, set the T bit. */
9772 if (arm_apcs_32)
9774 ULONGEST val, t_bit;
9775 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9776 t_bit = arm_psr_thumb_bit (gdbarch);
9777 if (arm_pc_is_thumb (gdbarch, pc))
9778 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779 val | t_bit);
9780 else
9781 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9782 val & ~t_bit);
9786 /* Read the contents of a NEON quad register, by reading from two
9787 double registers. This is used to implement the quad pseudo
9788 registers, and for argument passing in case the quad registers are
9789 missing; vectors are passed in quad registers when using the VFP
9790 ABI, even if a NEON unit is not present. REGNUM is the index of
9791 the quad register, in [0, 15]. */
9793 static enum register_status
9794 arm_neon_quad_read (struct gdbarch *gdbarch, readable_regcache *regcache,
9795 int regnum, gdb_byte *buf)
9797 char name_buf[4];
9798 gdb_byte reg_buf[8];
9799 int double_regnum;
9800 enum register_status status;
9802 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9803 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9804 strlen (name_buf));
9806 status = regcache->raw_read (double_regnum, reg_buf);
9807 if (status != REG_VALID)
9808 return status;
9809 memcpy (buf, reg_buf, 8);
9811 status = regcache->raw_read (double_regnum + 1, reg_buf);
9812 if (status != REG_VALID)
9813 return status;
9814 memcpy (buf + 8, reg_buf, 8);
9816 return REG_VALID;
9819 /* Read the contents of a NEON quad register, by reading from two double
9820 registers, and return it as a value. QUAD_REG_INDEX is the index of the quad
9821 register, in [0, 15]. */
9823 static value *
9824 arm_neon_quad_read_value (gdbarch *gdbarch, frame_info_ptr next_frame,
9825 int pseudo_reg_num, int quad_reg_index)
9827 std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9828 int double_regnum
9829 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9830 raw_reg_name.length ());
9832 return pseudo_from_concat_raw (next_frame, pseudo_reg_num, double_regnum,
9833 double_regnum + 1);
9836 /* Read the contents of the MVE pseudo register REGNUM and return it as a
9837 value. */
9838 static value *
9839 arm_mve_pseudo_read_value (gdbarch *gdbarch, frame_info_ptr next_frame,
9840 int pseudo_reg_num)
9842 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9844 /* P0 is the first 16 bits of VPR. */
9845 return pseudo_from_raw_part (next_frame, pseudo_reg_num,
9846 tdep->mve_vpr_regnum, 0);
9849 static value *
9850 arm_pseudo_read_value (gdbarch *gdbarch, frame_info_ptr next_frame,
9851 const int pseudo_reg_num)
9853 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9855 gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9857 if (is_q_pseudo (gdbarch, pseudo_reg_num))
9859 /* Quad-precision register. */
9860 return arm_neon_quad_read_value (gdbarch, next_frame, pseudo_reg_num,
9861 pseudo_reg_num - tdep->q_pseudo_base);
9863 else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9864 return arm_mve_pseudo_read_value (gdbarch, next_frame, pseudo_reg_num);
9865 else
9867 int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9869 /* Single-precision register. */
9870 gdb_assert (s_reg_index < 32);
9872 /* s0 is always the least significant half of d0. */
9873 int offset;
9874 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9875 offset = (s_reg_index & 1) ? 0 : 4;
9876 else
9877 offset = (s_reg_index & 1) ? 4 : 0;
9879 std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9880 int double_regnum
9881 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9882 raw_reg_name.length ());
9884 return pseudo_from_raw_part (next_frame, pseudo_reg_num, double_regnum,
9885 offset);
9889 /* Store the contents of BUF to a NEON quad register, by writing to
9890 two double registers. This is used to implement the quad pseudo
9891 registers, and for argument passing in case the quad registers are
9892 missing; vectors are passed in quad registers when using the VFP
9893 ABI, even if a NEON unit is not present. REGNUM is the index
9894 of the quad register, in [0, 15]. */
9896 static void
9897 arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
9898 int regnum, const gdb_byte *buf)
9900 char name_buf[4];
9901 int double_regnum;
9903 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9904 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9905 strlen (name_buf));
9907 regcache->raw_write (double_regnum, buf);
9908 regcache->raw_write (double_regnum + 1, buf + 8);
9911 static void
9912 arm_neon_quad_write (gdbarch *gdbarch, frame_info_ptr next_frame,
9913 int quad_reg_index, gdb::array_view<const gdb_byte> buf)
9915 std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9916 int double_regnum
9917 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.data (),
9918 raw_reg_name.length ());
9920 pseudo_to_concat_raw (next_frame, buf, double_regnum, double_regnum + 1);
9923 /* Store the contents of BUF to the MVE pseudo register REGNUM. */
9925 static void
9926 arm_mve_pseudo_write (gdbarch *gdbarch, frame_info_ptr next_frame,
9927 int pseudo_reg_num, gdb::array_view<const gdb_byte> buf)
9929 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9931 /* P0 is the first 16 bits of VPR. */
9932 pseudo_to_raw_part(next_frame, buf, tdep->mve_vpr_regnum, 0);
9935 static void
9936 arm_pseudo_write (gdbarch *gdbarch, frame_info_ptr next_frame,
9937 const int pseudo_reg_num,
9938 gdb::array_view<const gdb_byte> buf)
9940 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9942 gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9944 if (is_q_pseudo (gdbarch, pseudo_reg_num))
9946 /* Quad-precision register. */
9947 arm_neon_quad_write (gdbarch, next_frame,
9948 pseudo_reg_num - tdep->q_pseudo_base, buf);
9950 else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9951 arm_mve_pseudo_write (gdbarch, next_frame, pseudo_reg_num, buf);
9952 else
9954 int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9956 /* Single-precision register. */
9957 gdb_assert (s_reg_index < 32);
9959 /* s0 is always the least significant half of d0. */
9960 int offset;
9961 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9962 offset = (s_reg_index & 1) ? 0 : 4;
9963 else
9964 offset = (s_reg_index & 1) ? 4 : 0;
9966 std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9967 int double_regnum
9968 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9969 raw_reg_name.length ());
9971 pseudo_to_raw_part (next_frame, buf, double_regnum, offset);
9975 static struct value *
9976 value_of_arm_user_reg (frame_info_ptr frame, const void *baton)
9978 const int *reg_p = (const int *) baton;
9979 return value_of_register (*reg_p, get_next_frame_sentinel_okay (frame));
9982 static enum gdb_osabi
9983 arm_elf_osabi_sniffer (bfd *abfd)
9985 unsigned int elfosabi;
9986 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
9988 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
9990 if (elfosabi == ELFOSABI_ARM)
9991 /* GNU tools use this value. Check note sections in this case,
9992 as well. */
9994 for (asection *sect : gdb_bfd_sections (abfd))
9995 generic_elf_osabi_sniff_abi_tag_sections (abfd, sect, &osabi);
9998 /* Anything else will be handled by the generic ELF sniffer. */
9999 return osabi;
10002 static int
10003 arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
10004 const struct reggroup *group)
10006 /* FPS register's type is INT, but belongs to float_reggroup. Beside
10007 this, FPS register belongs to save_regroup, restore_reggroup, and
10008 all_reggroup, of course. */
10009 if (regnum == ARM_FPS_REGNUM)
10010 return (group == float_reggroup
10011 || group == save_reggroup
10012 || group == restore_reggroup
10013 || group == all_reggroup);
10014 else
10015 return default_register_reggroup_p (gdbarch, regnum, group);
10018 /* For backward-compatibility we allow two 'g' packet lengths with
10019 the remote protocol depending on whether FPA registers are
10020 supplied. M-profile targets do not have FPA registers, but some
10021 stubs already exist in the wild which use a 'g' packet which
10022 supplies them albeit with dummy values. The packet format which
10023 includes FPA registers should be considered deprecated for
10024 M-profile targets. */
10026 static void
10027 arm_register_g_packet_guesses (struct gdbarch *gdbarch)
10029 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10031 if (tdep->is_m)
10033 const target_desc *tdesc;
10035 /* If we know from the executable this is an M-profile target,
10036 cater for remote targets whose register set layout is the
10037 same as the FPA layout. */
10038 tdesc = arm_read_mprofile_description (ARM_M_TYPE_WITH_FPA);
10039 register_remote_g_packet_guess (gdbarch,
10040 ARM_CORE_REGS_SIZE + ARM_FP_REGS_SIZE,
10041 tdesc);
10043 /* The regular M-profile layout. */
10044 tdesc = arm_read_mprofile_description (ARM_M_TYPE_M_PROFILE);
10045 register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE,
10046 tdesc);
10048 /* M-profile plus M4F VFP. */
10049 tdesc = arm_read_mprofile_description (ARM_M_TYPE_VFP_D16);
10050 register_remote_g_packet_guess (gdbarch,
10051 ARM_CORE_REGS_SIZE + ARM_VFP2_REGS_SIZE,
10052 tdesc);
10053 /* M-profile plus MVE. */
10054 tdesc = arm_read_mprofile_description (ARM_M_TYPE_MVE);
10055 register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE
10056 + ARM_VFP2_REGS_SIZE
10057 + ARM_INT_REGISTER_SIZE, tdesc);
10059 /* M-profile system (stack pointers). */
10060 tdesc = arm_read_mprofile_description (ARM_M_TYPE_SYSTEM);
10061 register_remote_g_packet_guess (gdbarch, 2 * ARM_INT_REGISTER_SIZE, tdesc);
10064 /* Otherwise we don't have a useful guess. */
10067 /* Implement the code_of_frame_writable gdbarch method. */
10069 static int
10070 arm_code_of_frame_writable (struct gdbarch *gdbarch, frame_info_ptr frame)
10072 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10074 if (tdep->is_m && get_frame_type (frame) == SIGTRAMP_FRAME)
10076 /* M-profile exception frames return to some magic PCs, where
10077 isn't writable at all. */
10078 return 0;
10080 else
10081 return 1;
10084 /* Implement gdbarch_gnu_triplet_regexp. If the arch name is arm then allow it
10085 to be postfixed by a version (eg armv7hl). */
10087 static const char *
10088 arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
10090 if (strcmp (gdbarch_bfd_arch_info (gdbarch)->arch_name, "arm") == 0)
10091 return "arm(v[^- ]*)?";
10092 return gdbarch_bfd_arch_info (gdbarch)->arch_name;
10095 /* Implement the "get_pc_address_flags" gdbarch method. */
10097 static std::string
10098 arm_get_pc_address_flags (frame_info_ptr frame, CORE_ADDR pc)
10100 if (get_frame_pc_masked (frame))
10101 return "PAC";
10103 return "";
10106 /* Initialize the current architecture based on INFO. If possible,
10107 re-use an architecture from ARCHES, which is a list of
10108 architectures already created during this debugging session.
10110 Called e.g. at program startup, when reading a core file, and when
10111 reading a binary file. */
10113 static struct gdbarch *
10114 arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
10116 struct gdbarch_list *best_arch;
10117 enum arm_abi_kind arm_abi = arm_abi_global;
10118 enum arm_float_model fp_model = arm_fp_model;
10119 tdesc_arch_data_up tdesc_data;
10120 int i;
10121 bool is_m = false;
10122 bool have_sec_ext = false;
10123 int vfp_register_count = 0;
10124 bool have_s_pseudos = false, have_q_pseudos = false;
10125 bool have_wmmx_registers = false;
10126 bool have_neon = false;
10127 bool have_fpa_registers = true;
10128 const struct target_desc *tdesc = info.target_desc;
10129 bool have_vfp = false;
10130 bool have_mve = false;
10131 bool have_pacbti = false;
10132 int mve_vpr_regnum = -1;
10133 int register_count = ARM_NUM_REGS;
10134 bool have_m_profile_msp = false;
10135 int m_profile_msp_regnum = -1;
10136 int m_profile_psp_regnum = -1;
10137 int m_profile_msp_ns_regnum = -1;
10138 int m_profile_psp_ns_regnum = -1;
10139 int m_profile_msp_s_regnum = -1;
10140 int m_profile_psp_s_regnum = -1;
10141 int tls_regnum = 0;
10143 /* If we have an object to base this architecture on, try to determine
10144 its ABI. */
10146 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
10148 int ei_osabi, e_flags;
10150 switch (bfd_get_flavour (info.abfd))
10152 case bfd_target_coff_flavour:
10153 /* Assume it's an old APCS-style ABI. */
10154 /* XXX WinCE? */
10155 arm_abi = ARM_ABI_APCS;
10156 break;
10158 case bfd_target_elf_flavour:
10159 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
10160 e_flags = elf_elfheader (info.abfd)->e_flags;
10162 if (ei_osabi == ELFOSABI_ARM)
10164 /* GNU tools used to use this value, but do not for EABI
10165 objects. There's nowhere to tag an EABI version
10166 anyway, so assume APCS. */
10167 arm_abi = ARM_ABI_APCS;
10169 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
10171 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
10173 switch (eabi_ver)
10175 case EF_ARM_EABI_UNKNOWN:
10176 /* Assume GNU tools. */
10177 arm_abi = ARM_ABI_APCS;
10178 break;
10180 case EF_ARM_EABI_VER4:
10181 case EF_ARM_EABI_VER5:
10182 arm_abi = ARM_ABI_AAPCS;
10183 /* EABI binaries default to VFP float ordering.
10184 They may also contain build attributes that can
10185 be used to identify if the VFP argument-passing
10186 ABI is in use. */
10187 if (fp_model == ARM_FLOAT_AUTO)
10189 #ifdef HAVE_ELF
10190 switch (bfd_elf_get_obj_attr_int (info.abfd,
10191 OBJ_ATTR_PROC,
10192 Tag_ABI_VFP_args))
10194 case AEABI_VFP_args_base:
10195 /* "The user intended FP parameter/result
10196 passing to conform to AAPCS, base
10197 variant". */
10198 fp_model = ARM_FLOAT_SOFT_VFP;
10199 break;
10200 case AEABI_VFP_args_vfp:
10201 /* "The user intended FP parameter/result
10202 passing to conform to AAPCS, VFP
10203 variant". */
10204 fp_model = ARM_FLOAT_VFP;
10205 break;
10206 case AEABI_VFP_args_toolchain:
10207 /* "The user intended FP parameter/result
10208 passing to conform to tool chain-specific
10209 conventions" - we don't know any such
10210 conventions, so leave it as "auto". */
10211 break;
10212 case AEABI_VFP_args_compatible:
10213 /* "Code is compatible with both the base
10214 and VFP variants; the user did not permit
10215 non-variadic functions to pass FP
10216 parameters/results" - leave it as
10217 "auto". */
10218 break;
10219 default:
10220 /* Attribute value not mentioned in the
10221 November 2012 ABI, so leave it as
10222 "auto". */
10223 break;
10225 #else
10226 fp_model = ARM_FLOAT_SOFT_VFP;
10227 #endif
10229 break;
10231 default:
10232 /* Leave it as "auto". */
10233 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
10234 break;
10237 #ifdef HAVE_ELF
10238 /* Detect M-profile programs. This only works if the
10239 executable file includes build attributes; GCC does
10240 copy them to the executable, but e.g. RealView does
10241 not. */
10242 int attr_arch
10243 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10244 Tag_CPU_arch);
10245 int attr_profile
10246 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10247 Tag_CPU_arch_profile);
10249 /* GCC specifies the profile for v6-M; RealView only
10250 specifies the profile for architectures starting with
10251 V7 (as opposed to architectures with a tag
10252 numerically greater than TAG_CPU_ARCH_V7). */
10253 if (!tdesc_has_registers (tdesc)
10254 && (attr_arch == TAG_CPU_ARCH_V6_M
10255 || attr_arch == TAG_CPU_ARCH_V6S_M
10256 || attr_arch == TAG_CPU_ARCH_V7E_M
10257 || attr_arch == TAG_CPU_ARCH_V8M_BASE
10258 || attr_arch == TAG_CPU_ARCH_V8M_MAIN
10259 || attr_arch == TAG_CPU_ARCH_V8_1M_MAIN
10260 || attr_profile == 'M'))
10261 is_m = true;
10263 /* Look for attributes that indicate support for ARMv8.1-m
10264 PACBTI. */
10265 if (!tdesc_has_registers (tdesc) && is_m)
10267 int attr_pac_extension
10268 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10269 Tag_PAC_extension);
10271 int attr_bti_extension
10272 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10273 Tag_BTI_extension);
10275 int attr_pacret_use
10276 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10277 Tag_PACRET_use);
10279 int attr_bti_use
10280 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10281 Tag_BTI_use);
10283 if (attr_pac_extension != 0 || attr_bti_extension != 0
10284 || attr_pacret_use != 0 || attr_bti_use != 0)
10285 have_pacbti = true;
10287 #endif
10290 if (fp_model == ARM_FLOAT_AUTO)
10292 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
10294 case 0:
10295 /* Leave it as "auto". Strictly speaking this case
10296 means FPA, but almost nobody uses that now, and
10297 many toolchains fail to set the appropriate bits
10298 for the floating-point model they use. */
10299 break;
10300 case EF_ARM_SOFT_FLOAT:
10301 fp_model = ARM_FLOAT_SOFT_FPA;
10302 break;
10303 case EF_ARM_VFP_FLOAT:
10304 fp_model = ARM_FLOAT_VFP;
10305 break;
10306 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
10307 fp_model = ARM_FLOAT_SOFT_VFP;
10308 break;
10312 if (e_flags & EF_ARM_BE8)
10313 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
10315 break;
10317 default:
10318 /* Leave it as "auto". */
10319 break;
10323 /* Check any target description for validity. */
10324 if (tdesc_has_registers (tdesc))
10326 /* For most registers we require GDB's default names; but also allow
10327 the numeric names for sp / lr / pc, as a convenience. */
10328 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
10329 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
10330 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
10332 const struct tdesc_feature *feature;
10333 int valid_p;
10335 feature = tdesc_find_feature (tdesc,
10336 "org.gnu.gdb.arm.core");
10337 if (feature == NULL)
10339 feature = tdesc_find_feature (tdesc,
10340 "org.gnu.gdb.arm.m-profile");
10341 if (feature == NULL)
10342 return NULL;
10343 else
10344 is_m = true;
10347 tdesc_data = tdesc_data_alloc ();
10349 valid_p = 1;
10350 for (i = 0; i < ARM_SP_REGNUM; i++)
10351 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10352 arm_register_names[i]);
10353 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10354 ARM_SP_REGNUM,
10355 arm_sp_names);
10356 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10357 ARM_LR_REGNUM,
10358 arm_lr_names);
10359 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10360 ARM_PC_REGNUM,
10361 arm_pc_names);
10362 if (is_m)
10363 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10364 ARM_PS_REGNUM, "xpsr");
10365 else
10366 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10367 ARM_PS_REGNUM, "cpsr");
10369 if (!valid_p)
10370 return NULL;
10372 if (is_m)
10374 feature = tdesc_find_feature (tdesc,
10375 "org.gnu.gdb.arm.m-system");
10376 if (feature != nullptr)
10378 /* MSP */
10379 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10380 register_count, "msp");
10381 if (!valid_p)
10383 warning (_("M-profile m-system feature is missing required register msp."));
10384 return nullptr;
10386 have_m_profile_msp = true;
10387 m_profile_msp_regnum = register_count++;
10389 /* PSP */
10390 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10391 register_count, "psp");
10392 if (!valid_p)
10394 warning (_("M-profile m-system feature is missing required register psp."));
10395 return nullptr;
10397 m_profile_psp_regnum = register_count++;
10401 feature = tdesc_find_feature (tdesc,
10402 "org.gnu.gdb.arm.fpa");
10403 if (feature != NULL)
10405 valid_p = 1;
10406 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
10407 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10408 arm_register_names[i]);
10409 if (!valid_p)
10410 return NULL;
10412 else
10413 have_fpa_registers = false;
10415 feature = tdesc_find_feature (tdesc,
10416 "org.gnu.gdb.xscale.iwmmxt");
10417 if (feature != NULL)
10419 static const char *const iwmmxt_names[] = {
10420 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
10421 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
10422 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
10423 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
10426 valid_p = 1;
10427 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
10428 valid_p
10429 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10430 iwmmxt_names[i - ARM_WR0_REGNUM]);
10432 /* Check for the control registers, but do not fail if they
10433 are missing. */
10434 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
10435 tdesc_numbered_register (feature, tdesc_data.get (), i,
10436 iwmmxt_names[i - ARM_WR0_REGNUM]);
10438 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
10439 valid_p
10440 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10441 iwmmxt_names[i - ARM_WR0_REGNUM]);
10443 if (!valid_p)
10444 return NULL;
10446 have_wmmx_registers = true;
10449 /* If we have a VFP unit, check whether the single precision registers
10450 are present. If not, then we will synthesize them as pseudo
10451 registers. */
10452 feature = tdesc_find_feature (tdesc,
10453 "org.gnu.gdb.arm.vfp");
10454 if (feature != NULL)
10456 static const char *const vfp_double_names[] = {
10457 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
10458 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
10459 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
10460 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
10463 /* Require the double precision registers. There must be either
10464 16 or 32. */
10465 valid_p = 1;
10466 for (i = 0; i < 32; i++)
10468 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10469 ARM_D0_REGNUM + i,
10470 vfp_double_names[i]);
10471 if (!valid_p)
10472 break;
10474 if (!valid_p && i == 16)
10475 valid_p = 1;
10477 /* Also require FPSCR. */
10478 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10479 ARM_FPSCR_REGNUM, "fpscr");
10480 if (!valid_p)
10481 return NULL;
10483 have_vfp = true;
10485 if (tdesc_unnumbered_register (feature, "s0") == 0)
10486 have_s_pseudos = true;
10488 vfp_register_count = i;
10490 /* If we have VFP, also check for NEON. The architecture allows
10491 NEON without VFP (integer vector operations only), but GDB
10492 does not support that. */
10493 feature = tdesc_find_feature (tdesc,
10494 "org.gnu.gdb.arm.neon");
10495 if (feature != NULL)
10497 /* NEON requires 32 double-precision registers. */
10498 if (i != 32)
10499 return NULL;
10501 /* If there are quad registers defined by the stub, use
10502 their type; otherwise (normally) provide them with
10503 the default type. */
10504 if (tdesc_unnumbered_register (feature, "q0") == 0)
10505 have_q_pseudos = true;
10509 /* Check for the TLS register feature. */
10510 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.arm.tls");
10511 if (feature != nullptr)
10513 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10514 register_count, "tpidruro");
10515 if (!valid_p)
10516 return nullptr;
10518 tls_regnum = register_count;
10519 register_count++;
10522 /* Check for MVE after all the checks for GPR's, VFP and Neon.
10523 MVE (Helium) is an M-profile extension. */
10524 if (is_m)
10526 /* Do we have the MVE feature? */
10527 feature = tdesc_find_feature (tdesc,"org.gnu.gdb.arm.m-profile-mve");
10529 if (feature != nullptr)
10531 /* If we have MVE, we must always have the VPR register. */
10532 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10533 register_count, "vpr");
10534 if (!valid_p)
10536 warning (_("MVE feature is missing required register vpr."));
10537 return nullptr;
10540 have_mve = true;
10541 mve_vpr_regnum = register_count;
10542 register_count++;
10544 /* We can't have Q pseudo registers available here, as that
10545 would mean we have NEON features, and that is only available
10546 on A and R profiles. */
10547 gdb_assert (!have_q_pseudos);
10549 /* Given we have a M-profile target description, if MVE is
10550 enabled and there are VFP registers, we should have Q
10551 pseudo registers (Q0 ~ Q7). */
10552 if (have_vfp)
10553 have_q_pseudos = true;
10556 /* Do we have the ARMv8.1-m PACBTI feature? */
10557 feature = tdesc_find_feature (tdesc,
10558 "org.gnu.gdb.arm.m-profile-pacbti");
10559 if (feature != nullptr)
10561 /* By advertising this feature, the target acknowledges the
10562 presence of the ARMv8.1-m PACBTI extensions.
10564 We don't care for any particular registers in this group, so
10565 the target is free to include whatever it deems appropriate.
10567 The expectation is for this feature to include the PAC
10568 keys. */
10569 have_pacbti = true;
10572 /* Do we have the Security extension? */
10573 feature = tdesc_find_feature (tdesc,
10574 "org.gnu.gdb.arm.secext");
10575 if (feature != nullptr)
10577 /* Secure/Non-secure stack pointers. */
10578 /* MSP_NS */
10579 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10580 register_count, "msp_ns");
10581 if (!valid_p)
10583 warning (_("M-profile secext feature is missing required register msp_ns."));
10584 return nullptr;
10586 m_profile_msp_ns_regnum = register_count++;
10588 /* PSP_NS */
10589 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10590 register_count, "psp_ns");
10591 if (!valid_p)
10593 warning (_("M-profile secext feature is missing required register psp_ns."));
10594 return nullptr;
10596 m_profile_psp_ns_regnum = register_count++;
10598 /* MSP_S */
10599 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10600 register_count, "msp_s");
10601 if (!valid_p)
10603 warning (_("M-profile secext feature is missing required register msp_s."));
10604 return nullptr;
10606 m_profile_msp_s_regnum = register_count++;
10608 /* PSP_S */
10609 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10610 register_count, "psp_s");
10611 if (!valid_p)
10613 warning (_("M-profile secext feature is missing required register psp_s."));
10614 return nullptr;
10616 m_profile_psp_s_regnum = register_count++;
10618 have_sec_ext = true;
10624 /* If there is already a candidate, use it. */
10625 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
10626 best_arch != NULL;
10627 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
10629 arm_gdbarch_tdep *tdep
10630 = gdbarch_tdep<arm_gdbarch_tdep> (best_arch->gdbarch);
10632 if (arm_abi != ARM_ABI_AUTO && arm_abi != tdep->arm_abi)
10633 continue;
10635 if (fp_model != ARM_FLOAT_AUTO && fp_model != tdep->fp_model)
10636 continue;
10638 /* There are various other properties in tdep that we do not
10639 need to check here: those derived from a target description,
10640 since gdbarches with a different target description are
10641 automatically disqualified. */
10643 /* Do check is_m, though, since it might come from the binary. */
10644 if (is_m != tdep->is_m)
10645 continue;
10647 /* Also check for ARMv8.1-m PACBTI support, since it might come from
10648 the binary. */
10649 if (have_pacbti != tdep->have_pacbti)
10650 continue;
10652 /* Found a match. */
10653 break;
10656 if (best_arch != NULL)
10657 return best_arch->gdbarch;
10659 gdbarch *gdbarch
10660 = gdbarch_alloc (&info, gdbarch_tdep_up (new arm_gdbarch_tdep));
10661 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10663 /* Record additional information about the architecture we are defining.
10664 These are gdbarch discriminators, like the OSABI. */
10665 tdep->arm_abi = arm_abi;
10666 tdep->fp_model = fp_model;
10667 tdep->is_m = is_m;
10668 tdep->have_sec_ext = have_sec_ext;
10669 tdep->have_fpa_registers = have_fpa_registers;
10670 tdep->have_wmmx_registers = have_wmmx_registers;
10671 gdb_assert (vfp_register_count == 0
10672 || vfp_register_count == 16
10673 || vfp_register_count == 32);
10674 tdep->vfp_register_count = vfp_register_count;
10675 tdep->have_s_pseudos = have_s_pseudos;
10676 tdep->have_q_pseudos = have_q_pseudos;
10677 tdep->have_neon = have_neon;
10678 tdep->tls_regnum = tls_regnum;
10680 /* Adjust the MVE feature settings. */
10681 if (have_mve)
10683 tdep->have_mve = true;
10684 tdep->mve_vpr_regnum = mve_vpr_regnum;
10687 /* Adjust the PACBTI feature settings. */
10688 tdep->have_pacbti = have_pacbti;
10690 /* Adjust the M-profile stack pointers settings. */
10691 if (have_m_profile_msp)
10693 tdep->m_profile_msp_regnum = m_profile_msp_regnum;
10694 tdep->m_profile_psp_regnum = m_profile_psp_regnum;
10695 tdep->m_profile_msp_ns_regnum = m_profile_msp_ns_regnum;
10696 tdep->m_profile_psp_ns_regnum = m_profile_psp_ns_regnum;
10697 tdep->m_profile_msp_s_regnum = m_profile_msp_s_regnum;
10698 tdep->m_profile_psp_s_regnum = m_profile_psp_s_regnum;
10701 arm_register_g_packet_guesses (gdbarch);
10703 /* Breakpoints. */
10704 switch (info.byte_order_for_code)
10706 case BFD_ENDIAN_BIG:
10707 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
10708 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
10709 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
10710 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
10712 break;
10714 case BFD_ENDIAN_LITTLE:
10715 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
10716 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
10717 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
10718 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
10720 break;
10722 default:
10723 internal_error (_("arm_gdbarch_init: bad byte order for float format"));
10726 /* On ARM targets char defaults to unsigned. */
10727 set_gdbarch_char_signed (gdbarch, 0);
10729 /* wchar_t is unsigned under the AAPCS. */
10730 if (tdep->arm_abi == ARM_ABI_AAPCS)
10731 set_gdbarch_wchar_signed (gdbarch, 0);
10732 else
10733 set_gdbarch_wchar_signed (gdbarch, 1);
10735 /* Compute type alignment. */
10736 set_gdbarch_type_align (gdbarch, arm_type_align);
10738 /* Note: for displaced stepping, this includes the breakpoint, and one word
10739 of additional scratch space. This setting isn't used for anything beside
10740 displaced stepping at present. */
10741 set_gdbarch_displaced_step_buffer_length
10742 (gdbarch, 4 * ARM_DISPLACED_MODIFIED_INSNS);
10743 set_gdbarch_max_insn_length (gdbarch, 4);
10745 /* This should be low enough for everything. */
10746 tdep->lowest_pc = 0x20;
10747 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
10749 /* The default, for both APCS and AAPCS, is to return small
10750 structures in registers. */
10751 tdep->struct_return = reg_struct_return;
10753 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
10754 set_gdbarch_frame_align (gdbarch, arm_frame_align);
10756 if (is_m)
10757 set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
10759 set_gdbarch_write_pc (gdbarch, arm_write_pc);
10761 frame_base_set_default (gdbarch, &arm_normal_base);
10763 /* Address manipulation. */
10764 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
10766 /* Advance PC across function entry code. */
10767 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
10769 /* Detect whether PC is at a point where the stack has been destroyed. */
10770 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
10772 /* Skip trampolines. */
10773 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
10775 /* The stack grows downward. */
10776 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
10778 /* Breakpoint manipulation. */
10779 set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
10780 set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
10781 set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
10782 arm_breakpoint_kind_from_current_state);
10784 /* Information about registers, etc. */
10785 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
10786 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
10787 set_gdbarch_num_regs (gdbarch, register_count);
10788 set_gdbarch_register_type (gdbarch, arm_register_type);
10789 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
10791 /* This "info float" is FPA-specific. Use the generic version if we
10792 do not have FPA. */
10793 if (tdep->have_fpa_registers)
10794 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
10796 /* Internal <-> external register number maps. */
10797 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
10798 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
10800 set_gdbarch_register_name (gdbarch, arm_register_name);
10802 /* Returning results. */
10803 set_gdbarch_return_value_as_value (gdbarch, arm_return_value);
10805 /* Disassembly. */
10806 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
10808 /* Minsymbol frobbing. */
10809 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
10810 set_gdbarch_coff_make_msymbol_special (gdbarch,
10811 arm_coff_make_msymbol_special);
10812 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
10814 /* Thumb-2 IT block support. */
10815 set_gdbarch_adjust_breakpoint_address (gdbarch,
10816 arm_adjust_breakpoint_address);
10818 /* Virtual tables. */
10819 set_gdbarch_vbit_in_delta (gdbarch, 1);
10821 /* Hook in the ABI-specific overrides, if they have been registered. */
10822 gdbarch_init_osabi (info, gdbarch);
10824 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
10826 /* Add some default predicates. */
10827 if (is_m)
10828 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
10829 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
10830 dwarf2_append_unwinders (gdbarch);
10831 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
10832 frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
10833 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
10835 /* Now we have tuned the configuration, set a few final things,
10836 based on what the OS ABI has told us. */
10838 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
10839 binaries are always marked. */
10840 if (tdep->arm_abi == ARM_ABI_AUTO)
10841 tdep->arm_abi = ARM_ABI_APCS;
10843 /* Watchpoints are not steppable. */
10844 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
10846 /* We used to default to FPA for generic ARM, but almost nobody
10847 uses that now, and we now provide a way for the user to force
10848 the model. So default to the most useful variant. */
10849 if (tdep->fp_model == ARM_FLOAT_AUTO)
10850 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
10852 if (tdep->jb_pc >= 0)
10853 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
10855 /* Floating point sizes and format. */
10856 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
10857 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
10859 set_gdbarch_double_format
10860 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10861 set_gdbarch_long_double_format
10862 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10864 else
10866 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
10867 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
10870 /* Hook used to decorate frames with signed return addresses, only available
10871 for ARMv8.1-m PACBTI. */
10872 if (is_m && have_pacbti)
10873 set_gdbarch_get_pc_address_flags (gdbarch, arm_get_pc_address_flags);
10875 if (tdesc_data != nullptr)
10877 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
10879 tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
10880 register_count = gdbarch_num_regs (gdbarch);
10882 /* Override tdesc_register_type to adjust the types of VFP
10883 registers for NEON. */
10884 set_gdbarch_register_type (gdbarch, arm_register_type);
10887 /* Initialize the pseudo register data. */
10888 int num_pseudos = 0;
10889 if (tdep->have_s_pseudos)
10891 /* VFP single precision pseudo registers (S0~S31). */
10892 tdep->s_pseudo_base = register_count;
10893 tdep->s_pseudo_count = 32;
10894 num_pseudos += tdep->s_pseudo_count;
10896 if (tdep->have_q_pseudos)
10898 /* NEON quad precision pseudo registers (Q0~Q15). */
10899 tdep->q_pseudo_base = register_count + num_pseudos;
10901 if (have_neon)
10902 tdep->q_pseudo_count = 16;
10903 else if (have_mve)
10904 tdep->q_pseudo_count = ARM_MVE_NUM_Q_REGS;
10906 num_pseudos += tdep->q_pseudo_count;
10910 /* Do we have any MVE pseudo registers? */
10911 if (have_mve)
10913 tdep->mve_pseudo_base = register_count + num_pseudos;
10914 tdep->mve_pseudo_count = 1;
10915 num_pseudos += tdep->mve_pseudo_count;
10918 /* Do we have any ARMv8.1-m PACBTI pseudo registers. */
10919 if (have_pacbti)
10921 tdep->pacbti_pseudo_base = register_count + num_pseudos;
10922 tdep->pacbti_pseudo_count = 1;
10923 num_pseudos += tdep->pacbti_pseudo_count;
10926 /* Set some pseudo register hooks, if we have pseudo registers. */
10927 if (tdep->have_s_pseudos || have_mve || have_pacbti)
10929 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
10930 set_gdbarch_pseudo_register_read_value (gdbarch, arm_pseudo_read_value);
10931 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
10934 /* Add standard register aliases. We add aliases even for those
10935 names which are used by the current architecture - it's simpler,
10936 and does no harm, since nothing ever lists user registers. */
10937 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
10938 user_reg_add (gdbarch, arm_register_aliases[i].name,
10939 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
10941 set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
10942 set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
10944 set_gdbarch_gnu_triplet_regexp (gdbarch, arm_gnu_triplet_regexp);
10946 return gdbarch;
10949 static void
10950 arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
10952 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10954 if (tdep == NULL)
10955 return;
10957 gdb_printf (file, _("arm_dump_tdep: fp_model = %i\n"),
10958 (int) tdep->fp_model);
10959 gdb_printf (file, _("arm_dump_tdep: have_fpa_registers = %i\n"),
10960 (int) tdep->have_fpa_registers);
10961 gdb_printf (file, _("arm_dump_tdep: have_wmmx_registers = %i\n"),
10962 (int) tdep->have_wmmx_registers);
10963 gdb_printf (file, _("arm_dump_tdep: vfp_register_count = %i\n"),
10964 (int) tdep->vfp_register_count);
10965 gdb_printf (file, _("arm_dump_tdep: have_s_pseudos = %s\n"),
10966 tdep->have_s_pseudos ? "true" : "false");
10967 gdb_printf (file, _("arm_dump_tdep: s_pseudo_base = %i\n"),
10968 (int) tdep->s_pseudo_base);
10969 gdb_printf (file, _("arm_dump_tdep: s_pseudo_count = %i\n"),
10970 (int) tdep->s_pseudo_count);
10971 gdb_printf (file, _("arm_dump_tdep: have_q_pseudos = %s\n"),
10972 tdep->have_q_pseudos ? "true" : "false");
10973 gdb_printf (file, _("arm_dump_tdep: q_pseudo_base = %i\n"),
10974 (int) tdep->q_pseudo_base);
10975 gdb_printf (file, _("arm_dump_tdep: q_pseudo_count = %i\n"),
10976 (int) tdep->q_pseudo_count);
10977 gdb_printf (file, _("arm_dump_tdep: have_neon = %i\n"),
10978 (int) tdep->have_neon);
10979 gdb_printf (file, _("arm_dump_tdep: have_mve = %s\n"),
10980 tdep->have_mve ? "yes" : "no");
10981 gdb_printf (file, _("arm_dump_tdep: mve_vpr_regnum = %i\n"),
10982 tdep->mve_vpr_regnum);
10983 gdb_printf (file, _("arm_dump_tdep: mve_pseudo_base = %i\n"),
10984 tdep->mve_pseudo_base);
10985 gdb_printf (file, _("arm_dump_tdep: mve_pseudo_count = %i\n"),
10986 tdep->mve_pseudo_count);
10987 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_regnum = %i\n"),
10988 tdep->m_profile_msp_regnum);
10989 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_regnum = %i\n"),
10990 tdep->m_profile_psp_regnum);
10991 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_ns_regnum = %i\n"),
10992 tdep->m_profile_msp_ns_regnum);
10993 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_ns_regnum = %i\n"),
10994 tdep->m_profile_psp_ns_regnum);
10995 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_s_regnum = %i\n"),
10996 tdep->m_profile_msp_s_regnum);
10997 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_s_regnum = %i\n"),
10998 tdep->m_profile_psp_s_regnum);
10999 gdb_printf (file, _("arm_dump_tdep: Lowest pc = 0x%lx\n"),
11000 (unsigned long) tdep->lowest_pc);
11001 gdb_printf (file, _("arm_dump_tdep: have_pacbti = %s\n"),
11002 tdep->have_pacbti ? "yes" : "no");
11003 gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_base = %i\n"),
11004 tdep->pacbti_pseudo_base);
11005 gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_count = %i\n"),
11006 tdep->pacbti_pseudo_count);
11007 gdb_printf (file, _("arm_dump_tdep: is_m = %s\n"),
11008 tdep->is_m ? "yes" : "no");
11011 #if GDB_SELF_TEST
11012 namespace selftests
11014 static void arm_record_test (void);
11015 static void arm_analyze_prologue_test ();
11017 #endif
11019 void _initialize_arm_tdep ();
11020 void
11021 _initialize_arm_tdep ()
11023 long length;
11024 int i, j;
11025 char regdesc[1024], *rdptr = regdesc;
11026 size_t rest = sizeof (regdesc);
11028 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
11030 /* Add ourselves to objfile event chain. */
11031 gdb::observers::new_objfile.attach (arm_exidx_new_objfile, "arm-tdep");
11033 /* Register an ELF OS ABI sniffer for ARM binaries. */
11034 gdbarch_register_osabi_sniffer (bfd_arch_arm,
11035 bfd_target_elf_flavour,
11036 arm_elf_osabi_sniffer);
11038 /* Add root prefix command for all "set arm"/"show arm" commands. */
11039 add_setshow_prefix_cmd ("arm", no_class,
11040 _("Various ARM-specific commands."),
11041 _("Various ARM-specific commands."),
11042 &setarmcmdlist, &showarmcmdlist,
11043 &setlist, &showlist);
11045 arm_disassembler_options = xstrdup ("reg-names-std");
11046 const disasm_options_t *disasm_options
11047 = &disassembler_options_arm ()->options;
11048 int num_disassembly_styles = 0;
11049 for (i = 0; disasm_options->name[i] != NULL; i++)
11050 if (startswith (disasm_options->name[i], "reg-names-"))
11051 num_disassembly_styles++;
11053 /* Initialize the array that will be passed to add_setshow_enum_cmd(). */
11054 valid_disassembly_styles = XNEWVEC (const char *,
11055 num_disassembly_styles + 1);
11056 for (i = j = 0; disasm_options->name[i] != NULL; i++)
11057 if (startswith (disasm_options->name[i], "reg-names-"))
11059 size_t offset = strlen ("reg-names-");
11060 const char *style = disasm_options->name[i];
11061 valid_disassembly_styles[j++] = &style[offset];
11062 if (strcmp (&style[offset], "std") == 0)
11063 disassembly_style = &style[offset];
11064 length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
11065 disasm_options->description[i]);
11066 rdptr += length;
11067 rest -= length;
11069 /* Mark the end of valid options. */
11070 valid_disassembly_styles[num_disassembly_styles] = NULL;
11072 /* Create the help text. */
11073 std::string helptext = string_printf ("%s%s%s",
11074 _("The valid values are:\n"),
11075 regdesc,
11076 _("The default is \"std\"."));
11078 add_setshow_enum_cmd("disassembler", no_class,
11079 valid_disassembly_styles, &disassembly_style,
11080 _("Set the disassembly style."),
11081 _("Show the disassembly style."),
11082 helptext.c_str (),
11083 set_disassembly_style_sfunc,
11084 show_disassembly_style_sfunc,
11085 &setarmcmdlist, &showarmcmdlist);
11087 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
11088 _("Set usage of ARM 32-bit mode."),
11089 _("Show usage of ARM 32-bit mode."),
11090 _("When off, a 26-bit PC will be used."),
11091 NULL,
11092 NULL, /* FIXME: i18n: Usage of ARM 32-bit
11093 mode is %s. */
11094 &setarmcmdlist, &showarmcmdlist);
11096 /* Add a command to allow the user to force the FPU model. */
11097 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
11098 _("Set the floating point type."),
11099 _("Show the floating point type."),
11100 _("auto - Determine the FP typefrom the OS-ABI.\n\
11101 softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
11102 fpa - FPA co-processor (GCC compiled).\n\
11103 softvfp - Software FP with pure-endian doubles.\n\
11104 vfp - VFP co-processor."),
11105 set_fp_model_sfunc, show_fp_model,
11106 &setarmcmdlist, &showarmcmdlist);
11108 /* Add a command to allow the user to force the ABI. */
11109 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
11110 _("Set the ABI."),
11111 _("Show the ABI."),
11112 NULL, arm_set_abi, arm_show_abi,
11113 &setarmcmdlist, &showarmcmdlist);
11115 /* Add two commands to allow the user to force the assumed
11116 execution mode. */
11117 add_setshow_enum_cmd ("fallback-mode", class_support,
11118 arm_mode_strings, &arm_fallback_mode_string,
11119 _("Set the mode assumed when symbols are unavailable."),
11120 _("Show the mode assumed when symbols are unavailable."),
11121 NULL, NULL, arm_show_fallback_mode,
11122 &setarmcmdlist, &showarmcmdlist);
11123 add_setshow_enum_cmd ("force-mode", class_support,
11124 arm_mode_strings, &arm_force_mode_string,
11125 _("Set the mode assumed even when symbols are available."),
11126 _("Show the mode assumed even when symbols are available."),
11127 NULL, NULL, arm_show_force_mode,
11128 &setarmcmdlist, &showarmcmdlist);
11130 /* Add a command to stop triggering security exceptions when
11131 unwinding exception stacks. */
11132 add_setshow_boolean_cmd ("unwind-secure-frames", no_class, &arm_unwind_secure_frames,
11133 _("Set usage of non-secure to secure exception stack unwinding."),
11134 _("Show usage of non-secure to secure exception stack unwinding."),
11135 _("When on, the debugger can trigger memory access traps."),
11136 NULL, arm_show_unwind_secure_frames,
11137 &setarmcmdlist, &showarmcmdlist);
11139 /* Debugging flag. */
11140 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
11141 _("Set ARM debugging."),
11142 _("Show ARM debugging."),
11143 _("When on, arm-specific debugging is enabled."),
11144 NULL,
11145 NULL, /* FIXME: i18n: "ARM debugging is %s. */
11146 &setdebuglist, &showdebuglist);
11148 #if GDB_SELF_TEST
11149 selftests::register_test ("arm-record", selftests::arm_record_test);
11150 selftests::register_test ("arm_analyze_prologue", selftests::arm_analyze_prologue_test);
11151 #endif
11155 /* ARM-reversible process record data structures. */
11157 #define ARM_INSN_SIZE_BYTES 4
11158 #define THUMB_INSN_SIZE_BYTES 2
11159 #define THUMB2_INSN_SIZE_BYTES 4
11162 /* Position of the bit within a 32-bit ARM instruction
11163 that defines whether the instruction is a load or store. */
11164 #define INSN_S_L_BIT_NUM 20
11166 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
11167 do \
11169 unsigned int reg_len = LENGTH; \
11170 if (reg_len) \
11172 REGS = XNEWVEC (uint32_t, reg_len); \
11173 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
11176 while (0)
11178 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
11179 do \
11181 unsigned int mem_len = LENGTH; \
11182 if (mem_len) \
11184 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
11185 memcpy(&MEMS->len, &RECORD_BUF[0], \
11186 sizeof(struct arm_mem_r) * LENGTH); \
11189 while (0)
11191 /* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
11192 #define INSN_RECORDED(ARM_RECORD) \
11193 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
11195 /* ARM memory record structure. */
11196 struct arm_mem_r
11198 uint32_t len; /* Record length. */
11199 uint32_t addr; /* Memory address. */
11202 /* ARM instruction record contains opcode of current insn
11203 and execution state (before entry to decode_insn()),
11204 contains list of to-be-modified registers and
11205 memory blocks (on return from decode_insn()). */
11207 struct arm_insn_decode_record
11209 struct gdbarch *gdbarch;
11210 struct regcache *regcache;
11211 CORE_ADDR this_addr; /* Address of the insn being decoded. */
11212 uint32_t arm_insn; /* Should accommodate thumb. */
11213 uint32_t cond; /* Condition code. */
11214 uint32_t opcode; /* Insn opcode. */
11215 uint32_t decode; /* Insn decode bits. */
11216 uint32_t mem_rec_count; /* No of mem records. */
11217 uint32_t reg_rec_count; /* No of reg records. */
11218 uint32_t *arm_regs; /* Registers to be saved for this record. */
11219 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
11223 /* Checks ARM SBZ and SBO mandatory fields. */
11225 static int
11226 sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
11228 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
11230 if (!len)
11231 return 1;
11233 if (!sbo)
11234 ones = ~ones;
11236 while (ones)
11238 if (!(ones & sbo))
11240 return 0;
11242 ones = ones >> 1;
11244 return 1;
11247 enum arm_record_result
11249 ARM_RECORD_SUCCESS = 0,
11250 ARM_RECORD_FAILURE = 1
11253 enum arm_record_strx_t
11255 ARM_RECORD_STRH=1,
11256 ARM_RECORD_STRD
11259 enum record_type_t
11261 ARM_RECORD=1,
11262 THUMB_RECORD,
11263 THUMB2_RECORD
11267 static int
11268 arm_record_strx (arm_insn_decode_record *arm_insn_r, uint32_t *record_buf,
11269 uint32_t *record_buf_mem, arm_record_strx_t str_type)
11272 struct regcache *reg_cache = arm_insn_r->regcache;
11273 ULONGEST u_regval[2]= {0};
11275 uint32_t reg_src1 = 0, reg_src2 = 0;
11276 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
11278 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11279 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11281 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11283 /* 1) Handle misc store, immediate offset. */
11284 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11285 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11286 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11287 regcache_raw_read_unsigned (reg_cache, reg_src1,
11288 &u_regval[0]);
11289 if (ARM_PC_REGNUM == reg_src1)
11291 /* If R15 was used as Rn, hence current PC+8. */
11292 u_regval[0] = u_regval[0] + 8;
11294 offset_8 = (immed_high << 4) | immed_low;
11295 /* Calculate target store address. */
11296 if (14 == arm_insn_r->opcode)
11298 tgt_mem_addr = u_regval[0] + offset_8;
11300 else
11302 tgt_mem_addr = u_regval[0] - offset_8;
11304 if (ARM_RECORD_STRH == str_type)
11306 record_buf_mem[0] = 2;
11307 record_buf_mem[1] = tgt_mem_addr;
11308 arm_insn_r->mem_rec_count = 1;
11310 else if (ARM_RECORD_STRD == str_type)
11312 record_buf_mem[0] = 4;
11313 record_buf_mem[1] = tgt_mem_addr;
11314 record_buf_mem[2] = 4;
11315 record_buf_mem[3] = tgt_mem_addr + 4;
11316 arm_insn_r->mem_rec_count = 2;
11319 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
11321 /* 2) Store, register offset. */
11322 /* Get Rm. */
11323 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11324 /* Get Rn. */
11325 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11326 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11327 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11328 if (15 == reg_src2)
11330 /* If R15 was used as Rn, hence current PC+8. */
11331 u_regval[0] = u_regval[0] + 8;
11333 /* Calculate target store address, Rn +/- Rm, register offset. */
11334 if (12 == arm_insn_r->opcode)
11336 tgt_mem_addr = u_regval[0] + u_regval[1];
11338 else
11340 tgt_mem_addr = u_regval[1] - u_regval[0];
11342 if (ARM_RECORD_STRH == str_type)
11344 record_buf_mem[0] = 2;
11345 record_buf_mem[1] = tgt_mem_addr;
11346 arm_insn_r->mem_rec_count = 1;
11348 else if (ARM_RECORD_STRD == str_type)
11350 record_buf_mem[0] = 4;
11351 record_buf_mem[1] = tgt_mem_addr;
11352 record_buf_mem[2] = 4;
11353 record_buf_mem[3] = tgt_mem_addr + 4;
11354 arm_insn_r->mem_rec_count = 2;
11357 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11358 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
11360 /* 3) Store, immediate pre-indexed. */
11361 /* 5) Store, immediate post-indexed. */
11362 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11363 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11364 offset_8 = (immed_high << 4) | immed_low;
11365 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11366 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11367 /* Calculate target store address, Rn +/- Rm, register offset. */
11368 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
11370 tgt_mem_addr = u_regval[0] + offset_8;
11372 else
11374 tgt_mem_addr = u_regval[0] - offset_8;
11376 if (ARM_RECORD_STRH == str_type)
11378 record_buf_mem[0] = 2;
11379 record_buf_mem[1] = tgt_mem_addr;
11380 arm_insn_r->mem_rec_count = 1;
11382 else if (ARM_RECORD_STRD == str_type)
11384 record_buf_mem[0] = 4;
11385 record_buf_mem[1] = tgt_mem_addr;
11386 record_buf_mem[2] = 4;
11387 record_buf_mem[3] = tgt_mem_addr + 4;
11388 arm_insn_r->mem_rec_count = 2;
11390 /* Record Rn also as it changes. */
11391 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11392 arm_insn_r->reg_rec_count = 1;
11394 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
11395 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11397 /* 4) Store, register pre-indexed. */
11398 /* 6) Store, register post -indexed. */
11399 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11400 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11401 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11402 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11403 /* Calculate target store address, Rn +/- Rm, register offset. */
11404 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11406 tgt_mem_addr = u_regval[0] + u_regval[1];
11408 else
11410 tgt_mem_addr = u_regval[1] - u_regval[0];
11412 if (ARM_RECORD_STRH == str_type)
11414 record_buf_mem[0] = 2;
11415 record_buf_mem[1] = tgt_mem_addr;
11416 arm_insn_r->mem_rec_count = 1;
11418 else if (ARM_RECORD_STRD == str_type)
11420 record_buf_mem[0] = 4;
11421 record_buf_mem[1] = tgt_mem_addr;
11422 record_buf_mem[2] = 4;
11423 record_buf_mem[3] = tgt_mem_addr + 4;
11424 arm_insn_r->mem_rec_count = 2;
11426 /* Record Rn also as it changes. */
11427 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11428 arm_insn_r->reg_rec_count = 1;
11430 return 0;
11433 /* Handling ARM extension space insns. */
11435 static int
11436 arm_record_extension_space (arm_insn_decode_record *arm_insn_r)
11438 int ret = 0; /* Return value: -1:record failure ; 0:success */
11439 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
11440 uint32_t record_buf[8], record_buf_mem[8];
11441 uint32_t reg_src1 = 0;
11442 struct regcache *reg_cache = arm_insn_r->regcache;
11443 ULONGEST u_regval = 0;
11445 gdb_assert (!INSN_RECORDED(arm_insn_r));
11446 /* Handle unconditional insn extension space. */
11448 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
11449 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11450 if (arm_insn_r->cond)
11452 /* PLD has no affect on architectural state, it just affects
11453 the caches. */
11454 if (5 == ((opcode1 & 0xE0) >> 5))
11456 /* BLX(1) */
11457 record_buf[0] = ARM_PS_REGNUM;
11458 record_buf[1] = ARM_LR_REGNUM;
11459 arm_insn_r->reg_rec_count = 2;
11461 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
11465 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11466 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
11468 ret = -1;
11469 /* Undefined instruction on ARM V5; need to handle if later
11470 versions define it. */
11473 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
11474 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11475 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
11477 /* Handle arithmetic insn extension space. */
11478 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
11479 && !INSN_RECORDED(arm_insn_r))
11481 /* Handle MLA(S) and MUL(S). */
11482 if (in_inclusive_range (insn_op1, 0U, 3U))
11484 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11485 record_buf[1] = ARM_PS_REGNUM;
11486 arm_insn_r->reg_rec_count = 2;
11488 else if (in_inclusive_range (insn_op1, 4U, 15U))
11490 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
11491 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11492 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11493 record_buf[2] = ARM_PS_REGNUM;
11494 arm_insn_r->reg_rec_count = 3;
11498 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
11499 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
11500 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
11502 /* Handle control insn extension space. */
11504 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
11505 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
11507 if (!bit (arm_insn_r->arm_insn,25))
11509 if (!bits (arm_insn_r->arm_insn, 4, 7))
11511 if ((0 == insn_op1) || (2 == insn_op1))
11513 /* MRS. */
11514 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11515 arm_insn_r->reg_rec_count = 1;
11517 else if (1 == insn_op1)
11519 /* CSPR is going to be changed. */
11520 record_buf[0] = ARM_PS_REGNUM;
11521 arm_insn_r->reg_rec_count = 1;
11523 else if (3 == insn_op1)
11525 /* SPSR is going to be changed. */
11526 /* We need to get SPSR value, which is yet to be done. */
11527 return -1;
11530 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
11532 if (1 == insn_op1)
11534 /* BX. */
11535 record_buf[0] = ARM_PS_REGNUM;
11536 arm_insn_r->reg_rec_count = 1;
11538 else if (3 == insn_op1)
11540 /* CLZ. */
11541 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11542 arm_insn_r->reg_rec_count = 1;
11545 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
11547 /* BLX. */
11548 record_buf[0] = ARM_PS_REGNUM;
11549 record_buf[1] = ARM_LR_REGNUM;
11550 arm_insn_r->reg_rec_count = 2;
11552 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
11554 /* QADD, QSUB, QDADD, QDSUB */
11555 record_buf[0] = ARM_PS_REGNUM;
11556 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11557 arm_insn_r->reg_rec_count = 2;
11559 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
11561 /* BKPT. */
11562 record_buf[0] = ARM_PS_REGNUM;
11563 record_buf[1] = ARM_LR_REGNUM;
11564 arm_insn_r->reg_rec_count = 2;
11566 /* Save SPSR also;how? */
11567 return -1;
11569 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
11570 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
11571 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
11572 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
11575 if (0 == insn_op1 || 1 == insn_op1)
11577 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
11578 /* We dont do optimization for SMULW<y> where we
11579 need only Rd. */
11580 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11581 record_buf[1] = ARM_PS_REGNUM;
11582 arm_insn_r->reg_rec_count = 2;
11584 else if (2 == insn_op1)
11586 /* SMLAL<x><y>. */
11587 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11588 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11589 arm_insn_r->reg_rec_count = 2;
11591 else if (3 == insn_op1)
11593 /* SMUL<x><y>. */
11594 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11595 arm_insn_r->reg_rec_count = 1;
11599 else
11601 /* MSR : immediate form. */
11602 if (1 == insn_op1)
11604 /* CSPR is going to be changed. */
11605 record_buf[0] = ARM_PS_REGNUM;
11606 arm_insn_r->reg_rec_count = 1;
11608 else if (3 == insn_op1)
11610 /* SPSR is going to be changed. */
11611 /* we need to get SPSR value, which is yet to be done */
11612 return -1;
11617 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11618 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
11619 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
11621 /* Handle load/store insn extension space. */
11623 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
11624 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
11625 && !INSN_RECORDED(arm_insn_r))
11627 /* SWP/SWPB. */
11628 if (0 == insn_op1)
11630 /* These insn, changes register and memory as well. */
11631 /* SWP or SWPB insn. */
11632 /* Get memory address given by Rn. */
11633 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11634 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11635 /* SWP insn ?, swaps word. */
11636 if (8 == arm_insn_r->opcode)
11638 record_buf_mem[0] = 4;
11640 else
11642 /* SWPB insn, swaps only byte. */
11643 record_buf_mem[0] = 1;
11645 record_buf_mem[1] = u_regval;
11646 arm_insn_r->mem_rec_count = 1;
11647 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11648 arm_insn_r->reg_rec_count = 1;
11650 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11652 /* STRH. */
11653 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11654 ARM_RECORD_STRH);
11656 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11658 /* LDRD. */
11659 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11660 record_buf[1] = record_buf[0] + 1;
11661 arm_insn_r->reg_rec_count = 2;
11663 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11665 /* STRD. */
11666 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11667 ARM_RECORD_STRD);
11669 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
11671 /* LDRH, LDRSB, LDRSH. */
11672 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11673 arm_insn_r->reg_rec_count = 1;
11678 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
11679 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
11680 && !INSN_RECORDED(arm_insn_r))
11682 ret = -1;
11683 /* Handle coprocessor insn extension space. */
11686 /* To be done for ARMv5 and later; as of now we return -1. */
11687 if (-1 == ret)
11688 return ret;
11690 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11691 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11693 return ret;
11696 /* Handling opcode 000 insns. */
11698 static int
11699 arm_record_data_proc_misc_ld_str (arm_insn_decode_record *arm_insn_r)
11701 struct regcache *reg_cache = arm_insn_r->regcache;
11702 uint32_t record_buf[8], record_buf_mem[8];
11703 ULONGEST u_regval[2] = {0};
11705 uint32_t reg_src1 = 0;
11706 uint32_t opcode1 = 0;
11708 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11709 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11710 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
11712 if (!((opcode1 & 0x19) == 0x10))
11714 /* Data-processing (register) and Data-processing (register-shifted
11715 register */
11716 /* Out of 11 shifter operands mode, all the insn modifies destination
11717 register, which is specified by 13-16 decode. */
11718 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11719 record_buf[1] = ARM_PS_REGNUM;
11720 arm_insn_r->reg_rec_count = 2;
11722 else if ((arm_insn_r->decode < 8) && ((opcode1 & 0x19) == 0x10))
11724 /* Miscellaneous instructions */
11726 if (3 == arm_insn_r->decode && 0x12 == opcode1
11727 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11729 /* Handle BLX, branch and link/exchange. */
11730 if (9 == arm_insn_r->opcode)
11732 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
11733 and R14 stores the return address. */
11734 record_buf[0] = ARM_PS_REGNUM;
11735 record_buf[1] = ARM_LR_REGNUM;
11736 arm_insn_r->reg_rec_count = 2;
11739 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
11741 /* Handle enhanced software breakpoint insn, BKPT. */
11742 /* CPSR is changed to be executed in ARM state, disabling normal
11743 interrupts, entering abort mode. */
11744 /* According to high vector configuration PC is set. */
11745 /* user hit breakpoint and type reverse, in
11746 that case, we need to go back with previous CPSR and
11747 Program Counter. */
11748 record_buf[0] = ARM_PS_REGNUM;
11749 record_buf[1] = ARM_LR_REGNUM;
11750 arm_insn_r->reg_rec_count = 2;
11752 /* Save SPSR also; how? */
11753 return -1;
11755 else if (1 == arm_insn_r->decode && 0x12 == opcode1
11756 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11758 /* Handle BX, branch and link/exchange. */
11759 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
11760 record_buf[0] = ARM_PS_REGNUM;
11761 arm_insn_r->reg_rec_count = 1;
11763 else if (1 == arm_insn_r->decode && 0x16 == opcode1
11764 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
11765 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
11767 /* Count leading zeros: CLZ. */
11768 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11769 arm_insn_r->reg_rec_count = 1;
11771 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11772 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11773 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
11774 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0))
11776 /* Handle MRS insn. */
11777 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11778 arm_insn_r->reg_rec_count = 1;
11781 else if (9 == arm_insn_r->decode && opcode1 < 0x10)
11783 /* Multiply and multiply-accumulate */
11785 /* Handle multiply instructions. */
11786 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
11787 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
11789 /* Handle MLA and MUL. */
11790 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11791 record_buf[1] = ARM_PS_REGNUM;
11792 arm_insn_r->reg_rec_count = 2;
11794 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11796 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
11797 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11798 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11799 record_buf[2] = ARM_PS_REGNUM;
11800 arm_insn_r->reg_rec_count = 3;
11803 else if (9 == arm_insn_r->decode && opcode1 > 0x10)
11805 /* Synchronization primitives */
11807 /* Handling SWP, SWPB. */
11808 /* These insn, changes register and memory as well. */
11809 /* SWP or SWPB insn. */
11811 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11812 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11813 /* SWP insn ?, swaps word. */
11814 if (8 == arm_insn_r->opcode)
11816 record_buf_mem[0] = 4;
11818 else
11820 /* SWPB insn, swaps only byte. */
11821 record_buf_mem[0] = 1;
11823 record_buf_mem[1] = u_regval[0];
11824 arm_insn_r->mem_rec_count = 1;
11825 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11826 arm_insn_r->reg_rec_count = 1;
11828 else if (11 == arm_insn_r->decode || 13 == arm_insn_r->decode
11829 || 15 == arm_insn_r->decode)
11831 if ((opcode1 & 0x12) == 2)
11833 /* Extra load/store (unprivileged) */
11834 return -1;
11836 else
11838 /* Extra load/store */
11839 switch (bits (arm_insn_r->arm_insn, 5, 6))
11841 case 1:
11842 if ((opcode1 & 0x05) == 0x0 || (opcode1 & 0x05) == 0x4)
11844 /* STRH (register), STRH (immediate) */
11845 arm_record_strx (arm_insn_r, &record_buf[0],
11846 &record_buf_mem[0], ARM_RECORD_STRH);
11848 else if ((opcode1 & 0x05) == 0x1)
11850 /* LDRH (register) */
11851 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11852 arm_insn_r->reg_rec_count = 1;
11854 if (bit (arm_insn_r->arm_insn, 21))
11856 /* Write back to Rn. */
11857 record_buf[arm_insn_r->reg_rec_count++]
11858 = bits (arm_insn_r->arm_insn, 16, 19);
11861 else if ((opcode1 & 0x05) == 0x5)
11863 /* LDRH (immediate), LDRH (literal) */
11864 int rn = bits (arm_insn_r->arm_insn, 16, 19);
11866 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11867 arm_insn_r->reg_rec_count = 1;
11869 if (rn != 15)
11871 /*LDRH (immediate) */
11872 if (bit (arm_insn_r->arm_insn, 21))
11874 /* Write back to Rn. */
11875 record_buf[arm_insn_r->reg_rec_count++] = rn;
11879 else
11880 return -1;
11881 break;
11882 case 2:
11883 if ((opcode1 & 0x05) == 0x0)
11885 /* LDRD (register) */
11886 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11887 record_buf[1] = record_buf[0] + 1;
11888 arm_insn_r->reg_rec_count = 2;
11890 if (bit (arm_insn_r->arm_insn, 21))
11892 /* Write back to Rn. */
11893 record_buf[arm_insn_r->reg_rec_count++]
11894 = bits (arm_insn_r->arm_insn, 16, 19);
11897 else if ((opcode1 & 0x05) == 0x1)
11899 /* LDRSB (register) */
11900 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11901 arm_insn_r->reg_rec_count = 1;
11903 if (bit (arm_insn_r->arm_insn, 21))
11905 /* Write back to Rn. */
11906 record_buf[arm_insn_r->reg_rec_count++]
11907 = bits (arm_insn_r->arm_insn, 16, 19);
11910 else if ((opcode1 & 0x05) == 0x4 || (opcode1 & 0x05) == 0x5)
11912 /* LDRD (immediate), LDRD (literal), LDRSB (immediate),
11913 LDRSB (literal) */
11914 int rn = bits (arm_insn_r->arm_insn, 16, 19);
11916 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11917 arm_insn_r->reg_rec_count = 1;
11919 if (rn != 15)
11921 /*LDRD (immediate), LDRSB (immediate) */
11922 if (bit (arm_insn_r->arm_insn, 21))
11924 /* Write back to Rn. */
11925 record_buf[arm_insn_r->reg_rec_count++] = rn;
11929 else
11930 return -1;
11931 break;
11932 case 3:
11933 if ((opcode1 & 0x05) == 0x0)
11935 /* STRD (register) */
11936 arm_record_strx (arm_insn_r, &record_buf[0],
11937 &record_buf_mem[0], ARM_RECORD_STRD);
11939 else if ((opcode1 & 0x05) == 0x1)
11941 /* LDRSH (register) */
11942 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11943 arm_insn_r->reg_rec_count = 1;
11945 if (bit (arm_insn_r->arm_insn, 21))
11947 /* Write back to Rn. */
11948 record_buf[arm_insn_r->reg_rec_count++]
11949 = bits (arm_insn_r->arm_insn, 16, 19);
11952 else if ((opcode1 & 0x05) == 0x4)
11954 /* STRD (immediate) */
11955 arm_record_strx (arm_insn_r, &record_buf[0],
11956 &record_buf_mem[0], ARM_RECORD_STRD);
11958 else if ((opcode1 & 0x05) == 0x5)
11960 /* LDRSH (immediate), LDRSH (literal) */
11961 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11962 arm_insn_r->reg_rec_count = 1;
11964 if (bit (arm_insn_r->arm_insn, 21))
11966 /* Write back to Rn. */
11967 record_buf[arm_insn_r->reg_rec_count++]
11968 = bits (arm_insn_r->arm_insn, 16, 19);
11971 else
11972 return -1;
11973 break;
11974 default:
11975 return -1;
11979 else
11981 return -1;
11984 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11985 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11986 return 0;
11989 /* Handling opcode 001 insns. */
11991 static int
11992 arm_record_data_proc_imm (arm_insn_decode_record *arm_insn_r)
11994 uint32_t record_buf[8], record_buf_mem[8];
11996 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11997 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11999 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
12000 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
12001 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
12004 /* Handle MSR insn. */
12005 if (9 == arm_insn_r->opcode)
12007 /* CSPR is going to be changed. */
12008 record_buf[0] = ARM_PS_REGNUM;
12009 arm_insn_r->reg_rec_count = 1;
12011 else
12013 /* SPSR is going to be changed. */
12016 else if (arm_insn_r->opcode <= 15)
12018 /* Normal data processing insns. */
12019 /* Out of 11 shifter operands mode, all the insn modifies destination
12020 register, which is specified by 13-16 decode. */
12021 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12022 record_buf[1] = ARM_PS_REGNUM;
12023 arm_insn_r->reg_rec_count = 2;
12025 else
12027 return -1;
12030 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12031 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12032 return 0;
12035 static int
12036 arm_record_media (arm_insn_decode_record *arm_insn_r)
12038 uint32_t record_buf[8];
12040 switch (bits (arm_insn_r->arm_insn, 22, 24))
12042 case 0:
12043 /* Parallel addition and subtraction, signed */
12044 case 1:
12045 /* Parallel addition and subtraction, unsigned */
12046 case 2:
12047 case 3:
12048 /* Packing, unpacking, saturation and reversal */
12050 int rd = bits (arm_insn_r->arm_insn, 12, 15);
12052 record_buf[arm_insn_r->reg_rec_count++] = rd;
12054 break;
12056 case 4:
12057 case 5:
12058 /* Signed multiplies */
12060 int rd = bits (arm_insn_r->arm_insn, 16, 19);
12061 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
12063 record_buf[arm_insn_r->reg_rec_count++] = rd;
12064 if (op1 == 0x0)
12065 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12066 else if (op1 == 0x4)
12067 record_buf[arm_insn_r->reg_rec_count++]
12068 = bits (arm_insn_r->arm_insn, 12, 15);
12070 break;
12072 case 6:
12074 if (bit (arm_insn_r->arm_insn, 21)
12075 && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
12077 /* SBFX */
12078 record_buf[arm_insn_r->reg_rec_count++]
12079 = bits (arm_insn_r->arm_insn, 12, 15);
12081 else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
12082 && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
12084 /* USAD8 and USADA8 */
12085 record_buf[arm_insn_r->reg_rec_count++]
12086 = bits (arm_insn_r->arm_insn, 16, 19);
12089 break;
12091 case 7:
12093 if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
12094 && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
12096 /* Permanently UNDEFINED */
12097 return -1;
12099 else
12101 /* BFC, BFI and UBFX */
12102 record_buf[arm_insn_r->reg_rec_count++]
12103 = bits (arm_insn_r->arm_insn, 12, 15);
12106 break;
12108 default:
12109 return -1;
12112 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12114 return 0;
12117 /* Handle ARM mode instructions with opcode 010. */
12119 static int
12120 arm_record_ld_st_imm_offset (arm_insn_decode_record *arm_insn_r)
12122 struct regcache *reg_cache = arm_insn_r->regcache;
12124 uint32_t reg_base , reg_dest;
12125 uint32_t offset_12, tgt_mem_addr;
12126 uint32_t record_buf[8], record_buf_mem[8];
12127 unsigned char wback;
12128 ULONGEST u_regval;
12130 /* Calculate wback. */
12131 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
12132 || (bit (arm_insn_r->arm_insn, 21) == 1);
12134 arm_insn_r->reg_rec_count = 0;
12135 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12137 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12139 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
12140 and LDRT. */
12142 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12143 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
12145 /* The LDR instruction is capable of doing branching. If MOV LR, PC
12146 preceeds a LDR instruction having R15 as reg_base, it
12147 emulates a branch and link instruction, and hence we need to save
12148 CPSR and PC as well. */
12149 if (ARM_PC_REGNUM == reg_dest)
12150 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12152 /* If wback is true, also save the base register, which is going to be
12153 written to. */
12154 if (wback)
12155 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12157 else
12159 /* STR (immediate), STRB (immediate), STRBT and STRT. */
12161 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
12162 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12164 /* Handle bit U. */
12165 if (bit (arm_insn_r->arm_insn, 23))
12167 /* U == 1: Add the offset. */
12168 tgt_mem_addr = (uint32_t) u_regval + offset_12;
12170 else
12172 /* U == 0: subtract the offset. */
12173 tgt_mem_addr = (uint32_t) u_regval - offset_12;
12176 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
12177 bytes. */
12178 if (bit (arm_insn_r->arm_insn, 22))
12180 /* STRB and STRBT: 1 byte. */
12181 record_buf_mem[0] = 1;
12183 else
12185 /* STR and STRT: 4 bytes. */
12186 record_buf_mem[0] = 4;
12189 /* Handle bit P. */
12190 if (bit (arm_insn_r->arm_insn, 24))
12191 record_buf_mem[1] = tgt_mem_addr;
12192 else
12193 record_buf_mem[1] = (uint32_t) u_regval;
12195 arm_insn_r->mem_rec_count = 1;
12197 /* If wback is true, also save the base register, which is going to be
12198 written to. */
12199 if (wback)
12200 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12203 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12204 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12205 return 0;
12208 /* Handling opcode 011 insns. */
12210 static int
12211 arm_record_ld_st_reg_offset (arm_insn_decode_record *arm_insn_r)
12213 struct regcache *reg_cache = arm_insn_r->regcache;
12215 uint32_t shift_imm = 0;
12216 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
12217 uint32_t offset_12 = 0, tgt_mem_addr = 0;
12218 uint32_t record_buf[8], record_buf_mem[8];
12220 LONGEST s_word;
12221 ULONGEST u_regval[2];
12223 if (bit (arm_insn_r->arm_insn, 4))
12224 return arm_record_media (arm_insn_r);
12226 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
12227 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
12229 /* Handle enhanced store insns and LDRD DSP insn,
12230 order begins according to addressing modes for store insns
12231 STRH insn. */
12233 /* LDR or STR? */
12234 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12236 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12237 /* LDR insn has a capability to do branching, if
12238 MOV LR, PC is preceded by LDR insn having Rn as R15
12239 in that case, it emulates branch and link insn, and hence we
12240 need to save CSPR and PC as well. */
12241 if (15 != reg_dest)
12243 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12244 arm_insn_r->reg_rec_count = 1;
12246 else
12248 record_buf[0] = reg_dest;
12249 record_buf[1] = ARM_PS_REGNUM;
12250 arm_insn_r->reg_rec_count = 2;
12253 else
12255 if (! bits (arm_insn_r->arm_insn, 4, 11))
12257 /* Store insn, register offset and register pre-indexed,
12258 register post-indexed. */
12259 /* Get Rm. */
12260 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12261 /* Get Rn. */
12262 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12263 regcache_raw_read_unsigned (reg_cache, reg_src1
12264 , &u_regval[0]);
12265 regcache_raw_read_unsigned (reg_cache, reg_src2
12266 , &u_regval[1]);
12267 if (15 == reg_src2)
12269 /* If R15 was used as Rn, hence current PC+8. */
12270 /* Pre-indexed mode doesnt reach here ; illegal insn. */
12271 u_regval[0] = u_regval[0] + 8;
12273 /* Calculate target store address, Rn +/- Rm, register offset. */
12274 /* U == 1. */
12275 if (bit (arm_insn_r->arm_insn, 23))
12277 tgt_mem_addr = u_regval[0] + u_regval[1];
12279 else
12281 tgt_mem_addr = u_regval[1] - u_regval[0];
12284 switch (arm_insn_r->opcode)
12286 /* STR. */
12287 case 8:
12288 case 12:
12289 /* STR. */
12290 case 9:
12291 case 13:
12292 /* STRT. */
12293 case 1:
12294 case 5:
12295 /* STR. */
12296 case 0:
12297 case 4:
12298 record_buf_mem[0] = 4;
12299 break;
12301 /* STRB. */
12302 case 10:
12303 case 14:
12304 /* STRB. */
12305 case 11:
12306 case 15:
12307 /* STRBT. */
12308 case 3:
12309 case 7:
12310 /* STRB. */
12311 case 2:
12312 case 6:
12313 record_buf_mem[0] = 1;
12314 break;
12316 default:
12317 gdb_assert_not_reached ("no decoding pattern found");
12318 break;
12320 record_buf_mem[1] = tgt_mem_addr;
12321 arm_insn_r->mem_rec_count = 1;
12323 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12324 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12325 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12326 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12327 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12328 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12331 /* Rn is going to be changed in pre-indexed mode and
12332 post-indexed mode as well. */
12333 record_buf[0] = reg_src2;
12334 arm_insn_r->reg_rec_count = 1;
12337 else
12339 /* Store insn, scaled register offset; scaled pre-indexed. */
12340 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
12341 /* Get Rm. */
12342 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12343 /* Get Rn. */
12344 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12345 /* Get shift_imm. */
12346 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
12347 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
12348 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
12349 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12350 /* Offset_12 used as shift. */
12351 switch (offset_12)
12353 case 0:
12354 /* Offset_12 used as index. */
12355 offset_12 = u_regval[0] << shift_imm;
12356 break;
12358 case 1:
12359 offset_12 = (!shift_imm) ? 0 : u_regval[0] >> shift_imm;
12360 break;
12362 case 2:
12363 if (!shift_imm)
12365 if (bit (u_regval[0], 31))
12367 offset_12 = 0xFFFFFFFF;
12369 else
12371 offset_12 = 0;
12374 else
12376 /* This is arithmetic shift. */
12377 offset_12 = s_word >> shift_imm;
12379 break;
12381 case 3:
12382 if (!shift_imm)
12384 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
12385 &u_regval[1]);
12386 /* Get C flag value and shift it by 31. */
12387 offset_12 = (((bit (u_regval[1], 29)) << 31) \
12388 | (u_regval[0]) >> 1);
12390 else
12392 offset_12 = (u_regval[0] >> shift_imm) \
12393 | (u_regval[0] <<
12394 (sizeof(uint32_t) - shift_imm));
12396 break;
12398 default:
12399 gdb_assert_not_reached ("no decoding pattern found");
12400 break;
12403 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12404 /* bit U set. */
12405 if (bit (arm_insn_r->arm_insn, 23))
12407 tgt_mem_addr = u_regval[1] + offset_12;
12409 else
12411 tgt_mem_addr = u_regval[1] - offset_12;
12414 switch (arm_insn_r->opcode)
12416 /* STR. */
12417 case 8:
12418 case 12:
12419 /* STR. */
12420 case 9:
12421 case 13:
12422 /* STRT. */
12423 case 1:
12424 case 5:
12425 /* STR. */
12426 case 0:
12427 case 4:
12428 record_buf_mem[0] = 4;
12429 break;
12431 /* STRB. */
12432 case 10:
12433 case 14:
12434 /* STRB. */
12435 case 11:
12436 case 15:
12437 /* STRBT. */
12438 case 3:
12439 case 7:
12440 /* STRB. */
12441 case 2:
12442 case 6:
12443 record_buf_mem[0] = 1;
12444 break;
12446 default:
12447 gdb_assert_not_reached ("no decoding pattern found");
12448 break;
12450 record_buf_mem[1] = tgt_mem_addr;
12451 arm_insn_r->mem_rec_count = 1;
12453 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12454 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12455 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12456 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12457 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12458 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12461 /* Rn is going to be changed in register scaled pre-indexed
12462 mode,and scaled post indexed mode. */
12463 record_buf[0] = reg_src2;
12464 arm_insn_r->reg_rec_count = 1;
12469 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12470 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12471 return 0;
12474 /* Handle ARM mode instructions with opcode 100. */
12476 static int
12477 arm_record_ld_st_multiple (arm_insn_decode_record *arm_insn_r)
12479 struct regcache *reg_cache = arm_insn_r->regcache;
12480 uint32_t register_count = 0, register_bits;
12481 uint32_t reg_base, addr_mode;
12482 uint32_t record_buf[24], record_buf_mem[48];
12483 uint32_t wback;
12484 ULONGEST u_regval;
12486 /* Fetch the list of registers. */
12487 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
12488 arm_insn_r->reg_rec_count = 0;
12490 /* Fetch the base register that contains the address we are loading data
12491 to. */
12492 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12494 /* Calculate wback. */
12495 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
12497 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12499 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
12501 /* Find out which registers are going to be loaded from memory. */
12502 while (register_bits)
12504 if (register_bits & 0x00000001)
12505 record_buf[arm_insn_r->reg_rec_count++] = register_count;
12506 register_bits = register_bits >> 1;
12507 register_count++;
12511 /* If wback is true, also save the base register, which is going to be
12512 written to. */
12513 if (wback)
12514 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12516 /* Save the CPSR register. */
12517 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12519 else
12521 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
12523 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
12525 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12527 /* Find out how many registers are going to be stored to memory. */
12528 while (register_bits)
12530 if (register_bits & 0x00000001)
12531 register_count++;
12532 register_bits = register_bits >> 1;
12535 switch (addr_mode)
12537 /* STMDA (STMED): Decrement after. */
12538 case 0:
12539 record_buf_mem[1] = (uint32_t) u_regval
12540 - register_count * ARM_INT_REGISTER_SIZE + 4;
12541 break;
12542 /* STM (STMIA, STMEA): Increment after. */
12543 case 1:
12544 record_buf_mem[1] = (uint32_t) u_regval;
12545 break;
12546 /* STMDB (STMFD): Decrement before. */
12547 case 2:
12548 record_buf_mem[1] = (uint32_t) u_regval
12549 - register_count * ARM_INT_REGISTER_SIZE;
12550 break;
12551 /* STMIB (STMFA): Increment before. */
12552 case 3:
12553 record_buf_mem[1] = (uint32_t) u_regval + ARM_INT_REGISTER_SIZE;
12554 break;
12555 default:
12556 gdb_assert_not_reached ("no decoding pattern found");
12557 break;
12560 record_buf_mem[0] = register_count * ARM_INT_REGISTER_SIZE;
12561 arm_insn_r->mem_rec_count = 1;
12563 /* If wback is true, also save the base register, which is going to be
12564 written to. */
12565 if (wback)
12566 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12569 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12570 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12571 return 0;
12574 /* Handling opcode 101 insns. */
12576 static int
12577 arm_record_b_bl (arm_insn_decode_record *arm_insn_r)
12579 uint32_t record_buf[8];
12581 /* Handle B, BL, BLX(1) insns. */
12582 /* B simply branches so we do nothing here. */
12583 /* Note: BLX(1) doesnt fall here but instead it falls into
12584 extension space. */
12585 if (bit (arm_insn_r->arm_insn, 24))
12587 record_buf[0] = ARM_LR_REGNUM;
12588 arm_insn_r->reg_rec_count = 1;
12591 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12593 return 0;
12596 static int
12597 arm_record_unsupported_insn (arm_insn_decode_record *arm_insn_r)
12599 gdb_printf (gdb_stderr,
12600 _("Process record does not support instruction "
12601 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
12602 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
12604 return -1;
12607 /* Record handler for vector data transfer instructions. */
12609 static int
12610 arm_record_vdata_transfer_insn (arm_insn_decode_record *arm_insn_r)
12612 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
12613 uint32_t record_buf[4];
12615 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
12616 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
12617 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
12618 bit_l = bit (arm_insn_r->arm_insn, 20);
12619 bit_c = bit (arm_insn_r->arm_insn, 8);
12621 /* Handle VMOV instruction. */
12622 if (bit_l && bit_c)
12624 record_buf[0] = reg_t;
12625 arm_insn_r->reg_rec_count = 1;
12627 else if (bit_l && !bit_c)
12629 /* Handle VMOV instruction. */
12630 if (bits_a == 0x00)
12632 record_buf[0] = reg_t;
12633 arm_insn_r->reg_rec_count = 1;
12635 /* Handle VMRS instruction. */
12636 else if (bits_a == 0x07)
12638 if (reg_t == 15)
12639 reg_t = ARM_PS_REGNUM;
12641 record_buf[0] = reg_t;
12642 arm_insn_r->reg_rec_count = 1;
12645 else if (!bit_l && !bit_c)
12647 /* Handle VMOV instruction. */
12648 if (bits_a == 0x00)
12650 record_buf[0] = ARM_D0_REGNUM + reg_v;
12652 arm_insn_r->reg_rec_count = 1;
12654 /* Handle VMSR instruction. */
12655 else if (bits_a == 0x07)
12657 record_buf[0] = ARM_FPSCR_REGNUM;
12658 arm_insn_r->reg_rec_count = 1;
12661 else if (!bit_l && bit_c)
12663 /* Handle VMOV instruction. */
12664 if (!(bits_a & 0x04))
12666 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
12667 + ARM_D0_REGNUM;
12668 arm_insn_r->reg_rec_count = 1;
12670 /* Handle VDUP instruction. */
12671 else
12673 if (bit (arm_insn_r->arm_insn, 21))
12675 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12676 record_buf[0] = reg_v + ARM_D0_REGNUM;
12677 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
12678 arm_insn_r->reg_rec_count = 2;
12680 else
12682 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12683 record_buf[0] = reg_v + ARM_D0_REGNUM;
12684 arm_insn_r->reg_rec_count = 1;
12689 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12690 return 0;
12693 /* Record handler for extension register load/store instructions. */
12695 static int
12696 arm_record_exreg_ld_st_insn (arm_insn_decode_record *arm_insn_r)
12698 uint32_t opcode, single_reg;
12699 uint8_t op_vldm_vstm;
12700 uint32_t record_buf[8], record_buf_mem[128];
12701 ULONGEST u_regval = 0;
12703 struct regcache *reg_cache = arm_insn_r->regcache;
12705 opcode = bits (arm_insn_r->arm_insn, 20, 24);
12706 single_reg = !bit (arm_insn_r->arm_insn, 8);
12707 op_vldm_vstm = opcode & 0x1b;
12709 /* Handle VMOV instructions. */
12710 if ((opcode & 0x1e) == 0x04)
12712 if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
12714 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12715 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
12716 arm_insn_r->reg_rec_count = 2;
12718 else
12720 uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
12721 uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
12723 if (single_reg)
12725 /* The first S register number m is REG_M:M (M is bit 5),
12726 the corresponding D register number is REG_M:M / 2, which
12727 is REG_M. */
12728 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
12729 /* The second S register number is REG_M:M + 1, the
12730 corresponding D register number is (REG_M:M + 1) / 2.
12731 IOW, if bit M is 1, the first and second S registers
12732 are mapped to different D registers, otherwise, they are
12733 in the same D register. */
12734 if (bit_m)
12736 record_buf[arm_insn_r->reg_rec_count++]
12737 = ARM_D0_REGNUM + reg_m + 1;
12740 else
12742 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
12743 arm_insn_r->reg_rec_count = 1;
12747 /* Handle VSTM and VPUSH instructions. */
12748 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
12749 || op_vldm_vstm == 0x12)
12751 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
12752 uint32_t memory_index = 0;
12754 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12755 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12756 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12757 imm_off32 = imm_off8 << 2;
12758 memory_count = imm_off8;
12760 if (bit (arm_insn_r->arm_insn, 23))
12761 start_address = u_regval;
12762 else
12763 start_address = u_regval - imm_off32;
12765 if (bit (arm_insn_r->arm_insn, 21))
12767 record_buf[0] = reg_rn;
12768 arm_insn_r->reg_rec_count = 1;
12771 while (memory_count > 0)
12773 if (single_reg)
12775 record_buf_mem[memory_index] = 4;
12776 record_buf_mem[memory_index + 1] = start_address;
12777 start_address = start_address + 4;
12778 memory_index = memory_index + 2;
12780 else
12782 record_buf_mem[memory_index] = 4;
12783 record_buf_mem[memory_index + 1] = start_address;
12784 record_buf_mem[memory_index + 2] = 4;
12785 record_buf_mem[memory_index + 3] = start_address + 4;
12786 start_address = start_address + 8;
12787 memory_index = memory_index + 4;
12789 memory_count--;
12791 arm_insn_r->mem_rec_count = (memory_index >> 1);
12793 /* Handle VLDM instructions. */
12794 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
12795 || op_vldm_vstm == 0x13)
12797 uint32_t reg_count, reg_vd;
12798 uint32_t reg_index = 0;
12799 uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
12801 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12802 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
12804 /* REG_VD is the first D register number. If the instruction
12805 loads memory to S registers (SINGLE_REG is TRUE), the register
12806 number is (REG_VD << 1 | bit D), so the corresponding D
12807 register number is (REG_VD << 1 | bit D) / 2 = REG_VD. */
12808 if (!single_reg)
12809 reg_vd = reg_vd | (bit_d << 4);
12811 if (bit (arm_insn_r->arm_insn, 21) /* write back */)
12812 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
12814 /* If the instruction loads memory to D register, REG_COUNT should
12815 be divided by 2, according to the ARM Architecture Reference
12816 Manual. If the instruction loads memory to S register, divide by
12817 2 as well because two S registers are mapped to D register. */
12818 reg_count = reg_count / 2;
12819 if (single_reg && bit_d)
12821 /* Increase the register count if S register list starts from
12822 an odd number (bit d is one). */
12823 reg_count++;
12826 while (reg_count > 0)
12828 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
12829 reg_count--;
12831 arm_insn_r->reg_rec_count = reg_index;
12833 /* VSTR Vector store register. */
12834 else if ((opcode & 0x13) == 0x10)
12836 uint32_t start_address, reg_rn, imm_off32, imm_off8;
12837 uint32_t memory_index = 0;
12839 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12840 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12841 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12842 imm_off32 = imm_off8 << 2;
12844 if (bit (arm_insn_r->arm_insn, 23))
12845 start_address = u_regval + imm_off32;
12846 else
12847 start_address = u_regval - imm_off32;
12849 if (single_reg)
12851 record_buf_mem[memory_index] = 4;
12852 record_buf_mem[memory_index + 1] = start_address;
12853 arm_insn_r->mem_rec_count = 1;
12855 else
12857 record_buf_mem[memory_index] = 4;
12858 record_buf_mem[memory_index + 1] = start_address;
12859 record_buf_mem[memory_index + 2] = 4;
12860 record_buf_mem[memory_index + 3] = start_address + 4;
12861 arm_insn_r->mem_rec_count = 2;
12864 /* VLDR Vector load register. */
12865 else if ((opcode & 0x13) == 0x11)
12867 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12869 if (!single_reg)
12871 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
12872 record_buf[0] = ARM_D0_REGNUM + reg_vd;
12874 else
12876 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
12877 /* Record register D rather than pseudo register S. */
12878 record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
12880 arm_insn_r->reg_rec_count = 1;
12883 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12884 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12885 return 0;
12888 /* Record handler for arm/thumb mode VFP data processing instructions. */
12890 static int
12891 arm_record_vfp_data_proc_insn (arm_insn_decode_record *arm_insn_r)
12893 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
12894 uint32_t record_buf[4];
12895 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
12896 enum insn_types curr_insn_type = INSN_INV;
12898 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12899 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
12900 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
12901 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
12902 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
12903 bit_d = bit (arm_insn_r->arm_insn, 22);
12904 /* Mask off the "D" bit. */
12905 opc1 = opc1 & ~0x04;
12907 /* Handle VMLA, VMLS. */
12908 if (opc1 == 0x00)
12910 if (bit (arm_insn_r->arm_insn, 10))
12912 if (bit (arm_insn_r->arm_insn, 6))
12913 curr_insn_type = INSN_T0;
12914 else
12915 curr_insn_type = INSN_T1;
12917 else
12919 if (dp_op_sz)
12920 curr_insn_type = INSN_T1;
12921 else
12922 curr_insn_type = INSN_T2;
12925 /* Handle VNMLA, VNMLS, VNMUL. */
12926 else if (opc1 == 0x01)
12928 if (dp_op_sz)
12929 curr_insn_type = INSN_T1;
12930 else
12931 curr_insn_type = INSN_T2;
12933 /* Handle VMUL. */
12934 else if (opc1 == 0x02 && !(opc3 & 0x01))
12936 if (bit (arm_insn_r->arm_insn, 10))
12938 if (bit (arm_insn_r->arm_insn, 6))
12939 curr_insn_type = INSN_T0;
12940 else
12941 curr_insn_type = INSN_T1;
12943 else
12945 if (dp_op_sz)
12946 curr_insn_type = INSN_T1;
12947 else
12948 curr_insn_type = INSN_T2;
12951 /* Handle VADD, VSUB. */
12952 else if (opc1 == 0x03)
12954 if (!bit (arm_insn_r->arm_insn, 9))
12956 if (bit (arm_insn_r->arm_insn, 6))
12957 curr_insn_type = INSN_T0;
12958 else
12959 curr_insn_type = INSN_T1;
12961 else
12963 if (dp_op_sz)
12964 curr_insn_type = INSN_T1;
12965 else
12966 curr_insn_type = INSN_T2;
12969 /* Handle VDIV. */
12970 else if (opc1 == 0x08)
12972 if (dp_op_sz)
12973 curr_insn_type = INSN_T1;
12974 else
12975 curr_insn_type = INSN_T2;
12977 /* Handle all other vfp data processing instructions. */
12978 else if (opc1 == 0x0b)
12980 /* Handle VMOV. */
12981 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
12983 if (bit (arm_insn_r->arm_insn, 4))
12985 if (bit (arm_insn_r->arm_insn, 6))
12986 curr_insn_type = INSN_T0;
12987 else
12988 curr_insn_type = INSN_T1;
12990 else
12992 if (dp_op_sz)
12993 curr_insn_type = INSN_T1;
12994 else
12995 curr_insn_type = INSN_T2;
12998 /* Handle VNEG and VABS. */
12999 else if ((opc2 == 0x01 && opc3 == 0x01)
13000 || (opc2 == 0x00 && opc3 == 0x03))
13002 if (!bit (arm_insn_r->arm_insn, 11))
13004 if (bit (arm_insn_r->arm_insn, 6))
13005 curr_insn_type = INSN_T0;
13006 else
13007 curr_insn_type = INSN_T1;
13009 else
13011 if (dp_op_sz)
13012 curr_insn_type = INSN_T1;
13013 else
13014 curr_insn_type = INSN_T2;
13017 /* Handle VSQRT. */
13018 else if (opc2 == 0x01 && opc3 == 0x03)
13020 if (dp_op_sz)
13021 curr_insn_type = INSN_T1;
13022 else
13023 curr_insn_type = INSN_T2;
13025 /* Handle VCVT. */
13026 else if (opc2 == 0x07 && opc3 == 0x03)
13028 if (!dp_op_sz)
13029 curr_insn_type = INSN_T1;
13030 else
13031 curr_insn_type = INSN_T2;
13033 else if (opc3 & 0x01)
13035 /* Handle VCVT. */
13036 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
13038 if (!bit (arm_insn_r->arm_insn, 18))
13039 curr_insn_type = INSN_T2;
13040 else
13042 if (dp_op_sz)
13043 curr_insn_type = INSN_T1;
13044 else
13045 curr_insn_type = INSN_T2;
13048 /* Handle VCVT. */
13049 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
13051 if (dp_op_sz)
13052 curr_insn_type = INSN_T1;
13053 else
13054 curr_insn_type = INSN_T2;
13056 /* Handle VCVTB, VCVTT. */
13057 else if ((opc2 & 0x0e) == 0x02)
13058 curr_insn_type = INSN_T2;
13059 /* Handle VCMP, VCMPE. */
13060 else if ((opc2 & 0x0e) == 0x04)
13061 curr_insn_type = INSN_T3;
13065 switch (curr_insn_type)
13067 case INSN_T0:
13068 reg_vd = reg_vd | (bit_d << 4);
13069 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13070 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
13071 arm_insn_r->reg_rec_count = 2;
13072 break;
13074 case INSN_T1:
13075 reg_vd = reg_vd | (bit_d << 4);
13076 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13077 arm_insn_r->reg_rec_count = 1;
13078 break;
13080 case INSN_T2:
13081 reg_vd = (reg_vd << 1) | bit_d;
13082 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13083 arm_insn_r->reg_rec_count = 1;
13084 break;
13086 case INSN_T3:
13087 record_buf[0] = ARM_FPSCR_REGNUM;
13088 arm_insn_r->reg_rec_count = 1;
13089 break;
13091 default:
13092 gdb_assert_not_reached ("no decoding pattern found");
13093 break;
13096 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
13097 return 0;
13100 /* Handling opcode 110 insns. */
13102 static int
13103 arm_record_asimd_vfp_coproc (arm_insn_decode_record *arm_insn_r)
13105 uint32_t op1, op1_ebit, coproc;
13107 coproc = bits (arm_insn_r->arm_insn, 8, 11);
13108 op1 = bits (arm_insn_r->arm_insn, 20, 25);
13109 op1_ebit = bit (arm_insn_r->arm_insn, 20);
13111 if ((coproc & 0x0e) == 0x0a)
13113 /* Handle extension register ld/st instructions. */
13114 if (!(op1 & 0x20))
13115 return arm_record_exreg_ld_st_insn (arm_insn_r);
13117 /* 64-bit transfers between arm core and extension registers. */
13118 if ((op1 & 0x3e) == 0x04)
13119 return arm_record_exreg_ld_st_insn (arm_insn_r);
13121 else
13123 /* Handle coprocessor ld/st instructions. */
13124 if (!(op1 & 0x3a))
13126 /* Store. */
13127 if (!op1_ebit)
13128 return arm_record_unsupported_insn (arm_insn_r);
13129 else
13130 /* Load. */
13131 return arm_record_unsupported_insn (arm_insn_r);
13134 /* Move to coprocessor from two arm core registers. */
13135 if (op1 == 0x4)
13136 return arm_record_unsupported_insn (arm_insn_r);
13138 /* Move to two arm core registers from coprocessor. */
13139 if (op1 == 0x5)
13141 uint32_t reg_t[2];
13143 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
13144 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
13145 arm_insn_r->reg_rec_count = 2;
13147 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
13148 return 0;
13151 return arm_record_unsupported_insn (arm_insn_r);
13154 /* Handling opcode 111 insns. */
13156 static int
13157 arm_record_coproc_data_proc (arm_insn_decode_record *arm_insn_r)
13159 uint32_t op, op1_ebit, coproc, bits_24_25;
13160 arm_gdbarch_tdep *tdep
13161 = gdbarch_tdep<arm_gdbarch_tdep> (arm_insn_r->gdbarch);
13162 struct regcache *reg_cache = arm_insn_r->regcache;
13164 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
13165 coproc = bits (arm_insn_r->arm_insn, 8, 11);
13166 op1_ebit = bit (arm_insn_r->arm_insn, 20);
13167 op = bit (arm_insn_r->arm_insn, 4);
13168 bits_24_25 = bits (arm_insn_r->arm_insn, 24, 25);
13170 /* Handle arm SWI/SVC system call instructions. */
13171 if (bits_24_25 == 0x3)
13173 if (tdep->arm_syscall_record != NULL)
13175 ULONGEST svc_operand, svc_number;
13177 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
13179 if (svc_operand) /* OABI. */
13180 svc_number = svc_operand - 0x900000;
13181 else /* EABI. */
13182 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
13184 return tdep->arm_syscall_record (reg_cache, svc_number);
13186 else
13188 gdb_printf (gdb_stderr, _("no syscall record support\n"));
13189 return -1;
13192 else if (bits_24_25 == 0x02)
13194 if (op)
13196 if ((coproc & 0x0e) == 0x0a)
13198 /* 8, 16, and 32-bit transfer */
13199 return arm_record_vdata_transfer_insn (arm_insn_r);
13201 else
13203 if (op1_ebit)
13205 /* MRC, MRC2 */
13206 uint32_t record_buf[1];
13208 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
13209 if (record_buf[0] == 15)
13210 record_buf[0] = ARM_PS_REGNUM;
13212 arm_insn_r->reg_rec_count = 1;
13213 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
13214 record_buf);
13215 return 0;
13217 else
13219 /* MCR, MCR2 */
13220 return -1;
13224 else
13226 if ((coproc & 0x0e) == 0x0a)
13228 /* VFP data-processing instructions. */
13229 return arm_record_vfp_data_proc_insn (arm_insn_r);
13231 else
13233 /* CDP, CDP2 */
13234 return -1;
13238 else
13240 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 25);
13242 if (op1 == 5)
13244 if ((coproc & 0x0e) != 0x0a)
13246 /* MRRC, MRRC2 */
13247 return -1;
13250 else if (op1 == 4 || op1 == 5)
13252 if ((coproc & 0x0e) == 0x0a)
13254 /* 64-bit transfers between ARM core and extension */
13255 return -1;
13257 else if (op1 == 4)
13259 /* MCRR, MCRR2 */
13260 return -1;
13263 else if (op1 == 0 || op1 == 1)
13265 /* UNDEFINED */
13266 return -1;
13268 else
13270 if ((coproc & 0x0e) == 0x0a)
13272 /* Extension register load/store */
13274 else
13276 /* STC, STC2, LDC, LDC2 */
13278 return -1;
13282 return -1;
13285 /* Handling opcode 000 insns. */
13287 static int
13288 thumb_record_shift_add_sub (arm_insn_decode_record *thumb_insn_r)
13290 uint32_t record_buf[8];
13291 uint32_t reg_src1 = 0;
13293 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13295 record_buf[0] = ARM_PS_REGNUM;
13296 record_buf[1] = reg_src1;
13297 thumb_insn_r->reg_rec_count = 2;
13299 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13301 return 0;
13305 /* Handling opcode 001 insns. */
13307 static int
13308 thumb_record_add_sub_cmp_mov (arm_insn_decode_record *thumb_insn_r)
13310 uint32_t record_buf[8];
13311 uint32_t reg_src1 = 0;
13313 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13315 record_buf[0] = ARM_PS_REGNUM;
13316 record_buf[1] = reg_src1;
13317 thumb_insn_r->reg_rec_count = 2;
13319 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13321 return 0;
13324 /* Handling opcode 010 insns. */
13326 static int
13327 thumb_record_ld_st_reg_offset (arm_insn_decode_record *thumb_insn_r)
13329 struct regcache *reg_cache = thumb_insn_r->regcache;
13330 uint32_t record_buf[8], record_buf_mem[8];
13332 uint32_t reg_src1 = 0, reg_src2 = 0;
13333 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
13335 ULONGEST u_regval[2] = {0};
13337 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
13339 if (bit (thumb_insn_r->arm_insn, 12))
13341 /* Handle load/store register offset. */
13342 uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
13344 if (in_inclusive_range (opB, 4U, 7U))
13346 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
13347 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
13348 record_buf[0] = reg_src1;
13349 thumb_insn_r->reg_rec_count = 1;
13351 else if (in_inclusive_range (opB, 0U, 2U))
13353 /* STR(2), STRB(2), STRH(2) . */
13354 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13355 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
13356 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
13357 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
13358 if (0 == opB)
13359 record_buf_mem[0] = 4; /* STR (2). */
13360 else if (2 == opB)
13361 record_buf_mem[0] = 1; /* STRB (2). */
13362 else if (1 == opB)
13363 record_buf_mem[0] = 2; /* STRH (2). */
13364 record_buf_mem[1] = u_regval[0] + u_regval[1];
13365 thumb_insn_r->mem_rec_count = 1;
13368 else if (bit (thumb_insn_r->arm_insn, 11))
13370 /* Handle load from literal pool. */
13371 /* LDR(3). */
13372 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13373 record_buf[0] = reg_src1;
13374 thumb_insn_r->reg_rec_count = 1;
13376 else if (opcode1)
13378 /* Special data instructions and branch and exchange */
13379 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
13380 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
13381 if ((3 == opcode2) && (!opcode3))
13383 /* Branch with exchange. */
13384 record_buf[0] = ARM_PS_REGNUM;
13385 thumb_insn_r->reg_rec_count = 1;
13387 else
13389 /* Format 8; special data processing insns. */
13390 record_buf[0] = ARM_PS_REGNUM;
13391 record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
13392 | bits (thumb_insn_r->arm_insn, 0, 2));
13393 thumb_insn_r->reg_rec_count = 2;
13396 else
13398 /* Format 5; data processing insns. */
13399 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13400 if (bit (thumb_insn_r->arm_insn, 7))
13402 reg_src1 = reg_src1 + 8;
13404 record_buf[0] = ARM_PS_REGNUM;
13405 record_buf[1] = reg_src1;
13406 thumb_insn_r->reg_rec_count = 2;
13409 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13410 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13411 record_buf_mem);
13413 return 0;
13416 /* Handling opcode 001 insns. */
13418 static int
13419 thumb_record_ld_st_imm_offset (arm_insn_decode_record *thumb_insn_r)
13421 struct regcache *reg_cache = thumb_insn_r->regcache;
13422 uint32_t record_buf[8], record_buf_mem[8];
13424 uint32_t reg_src1 = 0;
13425 uint32_t opcode = 0, immed_5 = 0;
13427 ULONGEST u_regval = 0;
13429 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13431 if (opcode)
13433 /* LDR(1). */
13434 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13435 record_buf[0] = reg_src1;
13436 thumb_insn_r->reg_rec_count = 1;
13438 else
13440 /* STR(1). */
13441 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13442 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13443 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13444 record_buf_mem[0] = 4;
13445 record_buf_mem[1] = u_regval + (immed_5 * 4);
13446 thumb_insn_r->mem_rec_count = 1;
13449 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13450 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13451 record_buf_mem);
13453 return 0;
13456 /* Handling opcode 100 insns. */
13458 static int
13459 thumb_record_ld_st_stack (arm_insn_decode_record *thumb_insn_r)
13461 struct regcache *reg_cache = thumb_insn_r->regcache;
13462 uint32_t record_buf[8], record_buf_mem[8];
13464 uint32_t reg_src1 = 0;
13465 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
13467 ULONGEST u_regval = 0;
13469 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13471 if (3 == opcode)
13473 /* LDR(4). */
13474 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13475 record_buf[0] = reg_src1;
13476 thumb_insn_r->reg_rec_count = 1;
13478 else if (1 == opcode)
13480 /* LDRH(1). */
13481 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13482 record_buf[0] = reg_src1;
13483 thumb_insn_r->reg_rec_count = 1;
13485 else if (2 == opcode)
13487 /* STR(3). */
13488 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
13489 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13490 record_buf_mem[0] = 4;
13491 record_buf_mem[1] = u_regval + (immed_8 * 4);
13492 thumb_insn_r->mem_rec_count = 1;
13494 else if (0 == opcode)
13496 /* STRH(1). */
13497 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13498 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13499 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13500 record_buf_mem[0] = 2;
13501 record_buf_mem[1] = u_regval + (immed_5 * 2);
13502 thumb_insn_r->mem_rec_count = 1;
13505 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13506 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13507 record_buf_mem);
13509 return 0;
13512 /* Handling opcode 101 insns. */
13514 static int
13515 thumb_record_misc (arm_insn_decode_record *thumb_insn_r)
13517 struct regcache *reg_cache = thumb_insn_r->regcache;
13519 uint32_t opcode = 0;
13520 uint32_t register_bits = 0, register_count = 0;
13521 uint32_t index = 0, start_address = 0;
13522 uint32_t record_buf[24], record_buf_mem[48];
13523 uint32_t reg_src1;
13525 ULONGEST u_regval = 0;
13527 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13529 if (opcode == 0 || opcode == 1)
13531 /* ADR and ADD (SP plus immediate) */
13533 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13534 record_buf[0] = reg_src1;
13535 thumb_insn_r->reg_rec_count = 1;
13537 else
13539 /* Miscellaneous 16-bit instructions */
13540 uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
13542 switch (opcode2)
13544 case 6:
13545 /* SETEND and CPS */
13546 break;
13547 case 0:
13548 /* ADD/SUB (SP plus immediate) */
13549 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13550 record_buf[0] = ARM_SP_REGNUM;
13551 thumb_insn_r->reg_rec_count = 1;
13552 break;
13553 case 1: /* fall through */
13554 case 3: /* fall through */
13555 case 9: /* fall through */
13556 case 11:
13557 /* CBNZ, CBZ */
13558 break;
13559 case 2:
13560 /* SXTH, SXTB, UXTH, UXTB */
13561 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13562 thumb_insn_r->reg_rec_count = 1;
13563 break;
13564 case 4: /* fall through */
13565 case 5:
13566 /* PUSH. */
13567 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13568 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13569 while (register_bits)
13571 if (register_bits & 0x00000001)
13572 register_count++;
13573 register_bits = register_bits >> 1;
13575 start_address = u_regval - \
13576 (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
13577 thumb_insn_r->mem_rec_count = register_count;
13578 while (register_count)
13580 record_buf_mem[(register_count * 2) - 1] = start_address;
13581 record_buf_mem[(register_count * 2) - 2] = 4;
13582 start_address = start_address + 4;
13583 register_count--;
13585 record_buf[0] = ARM_SP_REGNUM;
13586 thumb_insn_r->reg_rec_count = 1;
13587 break;
13588 case 10:
13589 /* REV, REV16, REVSH */
13590 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13591 thumb_insn_r->reg_rec_count = 1;
13592 break;
13593 case 12: /* fall through */
13594 case 13:
13595 /* POP. */
13596 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13597 while (register_bits)
13599 if (register_bits & 0x00000001)
13600 record_buf[index++] = register_count;
13601 register_bits = register_bits >> 1;
13602 register_count++;
13604 record_buf[index++] = ARM_PS_REGNUM;
13605 record_buf[index++] = ARM_SP_REGNUM;
13606 thumb_insn_r->reg_rec_count = index;
13607 break;
13608 case 0xe:
13609 /* BKPT insn. */
13610 /* Handle enhanced software breakpoint insn, BKPT. */
13611 /* CPSR is changed to be executed in ARM state, disabling normal
13612 interrupts, entering abort mode. */
13613 /* According to high vector configuration PC is set. */
13614 /* User hits breakpoint and type reverse, in that case, we need to go back with
13615 previous CPSR and Program Counter. */
13616 record_buf[0] = ARM_PS_REGNUM;
13617 record_buf[1] = ARM_LR_REGNUM;
13618 thumb_insn_r->reg_rec_count = 2;
13619 /* We need to save SPSR value, which is not yet done. */
13620 gdb_printf (gdb_stderr,
13621 _("Process record does not support instruction "
13622 "0x%0x at address %s.\n"),
13623 thumb_insn_r->arm_insn,
13624 paddress (thumb_insn_r->gdbarch,
13625 thumb_insn_r->this_addr));
13626 return -1;
13628 case 0xf:
13629 /* If-Then, and hints */
13630 break;
13631 default:
13632 return -1;
13636 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13637 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13638 record_buf_mem);
13640 return 0;
13643 /* Handling opcode 110 insns. */
13645 static int
13646 thumb_record_ldm_stm_swi (arm_insn_decode_record *thumb_insn_r)
13648 arm_gdbarch_tdep *tdep
13649 = gdbarch_tdep<arm_gdbarch_tdep> (thumb_insn_r->gdbarch);
13650 struct regcache *reg_cache = thumb_insn_r->regcache;
13652 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
13653 uint32_t reg_src1 = 0;
13654 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
13655 uint32_t index = 0, start_address = 0;
13656 uint32_t record_buf[24], record_buf_mem[48];
13658 ULONGEST u_regval = 0;
13660 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
13661 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
13663 if (1 == opcode2)
13666 /* LDMIA. */
13667 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13668 /* Get Rn. */
13669 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13670 while (register_bits)
13672 if (register_bits & 0x00000001)
13673 record_buf[index++] = register_count;
13674 register_bits = register_bits >> 1;
13675 register_count++;
13677 record_buf[index++] = reg_src1;
13678 thumb_insn_r->reg_rec_count = index;
13680 else if (0 == opcode2)
13682 /* It handles both STMIA. */
13683 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13684 /* Get Rn. */
13685 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13686 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13687 while (register_bits)
13689 if (register_bits & 0x00000001)
13690 register_count++;
13691 register_bits = register_bits >> 1;
13693 start_address = u_regval;
13694 thumb_insn_r->mem_rec_count = register_count;
13695 while (register_count)
13697 record_buf_mem[(register_count * 2) - 1] = start_address;
13698 record_buf_mem[(register_count * 2) - 2] = 4;
13699 start_address = start_address + 4;
13700 register_count--;
13703 else if (0x1F == opcode1)
13705 /* Handle arm syscall insn. */
13706 if (tdep->arm_syscall_record != NULL)
13708 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
13709 ret = tdep->arm_syscall_record (reg_cache, u_regval);
13711 else
13713 gdb_printf (gdb_stderr, _("no syscall record support\n"));
13714 return -1;
13718 /* B (1), conditional branch is automatically taken care in process_record,
13719 as PC is saved there. */
13721 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13722 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13723 record_buf_mem);
13725 return ret;
13728 /* Handling opcode 111 insns. */
13730 static int
13731 thumb_record_branch (arm_insn_decode_record *thumb_insn_r)
13733 uint32_t record_buf[8];
13734 uint32_t bits_h = 0;
13736 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
13738 if (2 == bits_h || 3 == bits_h)
13740 /* BL */
13741 record_buf[0] = ARM_LR_REGNUM;
13742 thumb_insn_r->reg_rec_count = 1;
13744 else if (1 == bits_h)
13746 /* BLX(1). */
13747 record_buf[0] = ARM_PS_REGNUM;
13748 record_buf[1] = ARM_LR_REGNUM;
13749 thumb_insn_r->reg_rec_count = 2;
13752 /* B(2) is automatically taken care in process_record, as PC is
13753 saved there. */
13755 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13757 return 0;
13760 /* Handler for thumb2 load/store multiple instructions. */
13762 static int
13763 thumb2_record_ld_st_multiple (arm_insn_decode_record *thumb2_insn_r)
13765 struct regcache *reg_cache = thumb2_insn_r->regcache;
13767 uint32_t reg_rn, op;
13768 uint32_t register_bits = 0, register_count = 0;
13769 uint32_t index = 0, start_address = 0;
13770 uint32_t record_buf[24], record_buf_mem[48];
13772 ULONGEST u_regval = 0;
13774 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13775 op = bits (thumb2_insn_r->arm_insn, 23, 24);
13777 if (0 == op || 3 == op)
13779 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13781 /* Handle RFE instruction. */
13782 record_buf[0] = ARM_PS_REGNUM;
13783 thumb2_insn_r->reg_rec_count = 1;
13785 else
13787 /* Handle SRS instruction after reading banked SP. */
13788 return arm_record_unsupported_insn (thumb2_insn_r);
13791 else if (1 == op || 2 == op)
13793 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13795 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
13796 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13797 while (register_bits)
13799 if (register_bits & 0x00000001)
13800 record_buf[index++] = register_count;
13802 register_count++;
13803 register_bits = register_bits >> 1;
13805 record_buf[index++] = reg_rn;
13806 record_buf[index++] = ARM_PS_REGNUM;
13807 thumb2_insn_r->reg_rec_count = index;
13809 else
13811 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
13812 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13813 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
13814 while (register_bits)
13816 if (register_bits & 0x00000001)
13817 register_count++;
13819 register_bits = register_bits >> 1;
13822 if (1 == op)
13824 /* Start address calculation for LDMDB/LDMEA. */
13825 start_address = u_regval;
13827 else if (2 == op)
13829 /* Start address calculation for LDMDB/LDMEA. */
13830 start_address = u_regval - register_count * 4;
13833 thumb2_insn_r->mem_rec_count = register_count;
13834 while (register_count)
13836 record_buf_mem[register_count * 2 - 1] = start_address;
13837 record_buf_mem[register_count * 2 - 2] = 4;
13838 start_address = start_address + 4;
13839 register_count--;
13841 record_buf[0] = reg_rn;
13842 record_buf[1] = ARM_PS_REGNUM;
13843 thumb2_insn_r->reg_rec_count = 2;
13847 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13848 record_buf_mem);
13849 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13850 record_buf);
13851 return ARM_RECORD_SUCCESS;
13854 /* Handler for thumb2 load/store (dual/exclusive) and table branch
13855 instructions. */
13857 static int
13858 thumb2_record_ld_st_dual_ex_tbb (arm_insn_decode_record *thumb2_insn_r)
13860 struct regcache *reg_cache = thumb2_insn_r->regcache;
13862 uint32_t reg_rd, reg_rn, offset_imm;
13863 uint32_t reg_dest1, reg_dest2;
13864 uint32_t address, offset_addr;
13865 uint32_t record_buf[8], record_buf_mem[8];
13866 uint32_t op1, op2, op3;
13868 ULONGEST u_regval[2];
13870 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
13871 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
13872 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
13874 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13876 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
13878 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
13879 record_buf[0] = reg_dest1;
13880 record_buf[1] = ARM_PS_REGNUM;
13881 thumb2_insn_r->reg_rec_count = 2;
13884 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
13886 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
13887 record_buf[2] = reg_dest2;
13888 thumb2_insn_r->reg_rec_count = 3;
13891 else
13893 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13894 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
13896 if (0 == op1 && 0 == op2)
13898 /* Handle STREX. */
13899 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13900 address = u_regval[0] + (offset_imm * 4);
13901 record_buf_mem[0] = 4;
13902 record_buf_mem[1] = address;
13903 thumb2_insn_r->mem_rec_count = 1;
13904 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13905 record_buf[0] = reg_rd;
13906 thumb2_insn_r->reg_rec_count = 1;
13908 else if (1 == op1 && 0 == op2)
13910 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13911 record_buf[0] = reg_rd;
13912 thumb2_insn_r->reg_rec_count = 1;
13913 address = u_regval[0];
13914 record_buf_mem[1] = address;
13916 if (4 == op3)
13918 /* Handle STREXB. */
13919 record_buf_mem[0] = 1;
13920 thumb2_insn_r->mem_rec_count = 1;
13922 else if (5 == op3)
13924 /* Handle STREXH. */
13925 record_buf_mem[0] = 2 ;
13926 thumb2_insn_r->mem_rec_count = 1;
13928 else if (7 == op3)
13930 /* Handle STREXD. */
13931 address = u_regval[0];
13932 record_buf_mem[0] = 4;
13933 record_buf_mem[2] = 4;
13934 record_buf_mem[3] = address + 4;
13935 thumb2_insn_r->mem_rec_count = 2;
13938 else
13940 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13942 if (bit (thumb2_insn_r->arm_insn, 24))
13944 if (bit (thumb2_insn_r->arm_insn, 23))
13945 offset_addr = u_regval[0] + (offset_imm * 4);
13946 else
13947 offset_addr = u_regval[0] - (offset_imm * 4);
13949 address = offset_addr;
13951 else
13952 address = u_regval[0];
13954 record_buf_mem[0] = 4;
13955 record_buf_mem[1] = address;
13956 record_buf_mem[2] = 4;
13957 record_buf_mem[3] = address + 4;
13958 thumb2_insn_r->mem_rec_count = 2;
13959 record_buf[0] = reg_rn;
13960 thumb2_insn_r->reg_rec_count = 1;
13964 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13965 record_buf);
13966 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13967 record_buf_mem);
13968 return ARM_RECORD_SUCCESS;
13971 /* Handler for thumb2 data processing (shift register and modified immediate)
13972 instructions. */
13974 static int
13975 thumb2_record_data_proc_sreg_mimm (arm_insn_decode_record *thumb2_insn_r)
13977 uint32_t reg_rd, op;
13978 uint32_t record_buf[8];
13980 op = bits (thumb2_insn_r->arm_insn, 21, 24);
13981 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
13983 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
13985 record_buf[0] = ARM_PS_REGNUM;
13986 thumb2_insn_r->reg_rec_count = 1;
13988 else
13990 record_buf[0] = reg_rd;
13991 record_buf[1] = ARM_PS_REGNUM;
13992 thumb2_insn_r->reg_rec_count = 2;
13995 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13996 record_buf);
13997 return ARM_RECORD_SUCCESS;
14000 /* Generic handler for thumb2 instructions which effect destination and PS
14001 registers. */
14003 static int
14004 thumb2_record_ps_dest_generic (arm_insn_decode_record *thumb2_insn_r)
14006 uint32_t reg_rd;
14007 uint32_t record_buf[8];
14009 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
14011 record_buf[0] = reg_rd;
14012 record_buf[1] = ARM_PS_REGNUM;
14013 thumb2_insn_r->reg_rec_count = 2;
14015 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14016 record_buf);
14017 return ARM_RECORD_SUCCESS;
14020 /* Handler for thumb2 branch and miscellaneous control instructions. */
14022 static int
14023 thumb2_record_branch_misc_cntrl (arm_insn_decode_record *thumb2_insn_r)
14025 uint32_t op, op1, op2;
14026 uint32_t record_buf[8];
14028 op = bits (thumb2_insn_r->arm_insn, 20, 26);
14029 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
14030 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
14032 /* Handle MSR insn. */
14033 if (!(op1 & 0x2) && 0x38 == op)
14035 if (!(op2 & 0x3))
14037 /* CPSR is going to be changed. */
14038 record_buf[0] = ARM_PS_REGNUM;
14039 thumb2_insn_r->reg_rec_count = 1;
14041 else
14043 arm_record_unsupported_insn(thumb2_insn_r);
14044 return -1;
14047 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
14049 /* BLX. */
14050 record_buf[0] = ARM_PS_REGNUM;
14051 record_buf[1] = ARM_LR_REGNUM;
14052 thumb2_insn_r->reg_rec_count = 2;
14055 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14056 record_buf);
14057 return ARM_RECORD_SUCCESS;
14060 /* Handler for thumb2 store single data item instructions. */
14062 static int
14063 thumb2_record_str_single_data (arm_insn_decode_record *thumb2_insn_r)
14065 struct regcache *reg_cache = thumb2_insn_r->regcache;
14067 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
14068 uint32_t address, offset_addr;
14069 uint32_t record_buf[8], record_buf_mem[8];
14070 uint32_t op1, op2;
14072 ULONGEST u_regval[2];
14074 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
14075 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
14076 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14077 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
14079 if (bit (thumb2_insn_r->arm_insn, 23))
14081 /* T2 encoding. */
14082 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
14083 offset_addr = u_regval[0] + offset_imm;
14084 address = offset_addr;
14086 else
14088 /* T3 encoding. */
14089 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
14091 /* Handle STRB (register). */
14092 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
14093 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
14094 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
14095 offset_addr = u_regval[1] << shift_imm;
14096 address = u_regval[0] + offset_addr;
14098 else
14100 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
14101 if (bit (thumb2_insn_r->arm_insn, 10))
14103 if (bit (thumb2_insn_r->arm_insn, 9))
14104 offset_addr = u_regval[0] + offset_imm;
14105 else
14106 offset_addr = u_regval[0] - offset_imm;
14108 address = offset_addr;
14110 else
14111 address = u_regval[0];
14115 switch (op1)
14117 /* Store byte instructions. */
14118 case 4:
14119 case 0:
14120 record_buf_mem[0] = 1;
14121 break;
14122 /* Store half word instructions. */
14123 case 1:
14124 case 5:
14125 record_buf_mem[0] = 2;
14126 break;
14127 /* Store word instructions. */
14128 case 2:
14129 case 6:
14130 record_buf_mem[0] = 4;
14131 break;
14133 default:
14134 gdb_assert_not_reached ("no decoding pattern found");
14135 break;
14138 record_buf_mem[1] = address;
14139 thumb2_insn_r->mem_rec_count = 1;
14140 record_buf[0] = reg_rn;
14141 thumb2_insn_r->reg_rec_count = 1;
14143 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14144 record_buf);
14145 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14146 record_buf_mem);
14147 return ARM_RECORD_SUCCESS;
14150 /* Handler for thumb2 load memory hints instructions. */
14152 static int
14153 thumb2_record_ld_mem_hints (arm_insn_decode_record *thumb2_insn_r)
14155 uint32_t record_buf[8];
14156 uint32_t reg_rt, reg_rn;
14158 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
14159 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14161 if (ARM_PC_REGNUM != reg_rt)
14163 record_buf[0] = reg_rt;
14164 record_buf[1] = reg_rn;
14165 record_buf[2] = ARM_PS_REGNUM;
14166 thumb2_insn_r->reg_rec_count = 3;
14168 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14169 record_buf);
14170 return ARM_RECORD_SUCCESS;
14173 return ARM_RECORD_FAILURE;
14176 /* Handler for thumb2 load word instructions. */
14178 static int
14179 thumb2_record_ld_word (arm_insn_decode_record *thumb2_insn_r)
14181 uint32_t record_buf[8];
14183 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
14184 record_buf[1] = ARM_PS_REGNUM;
14185 thumb2_insn_r->reg_rec_count = 2;
14187 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14188 record_buf);
14189 return ARM_RECORD_SUCCESS;
14192 /* Handler for thumb2 long multiply, long multiply accumulate, and
14193 divide instructions. */
14195 static int
14196 thumb2_record_lmul_lmla_div (arm_insn_decode_record *thumb2_insn_r)
14198 uint32_t opcode1 = 0, opcode2 = 0;
14199 uint32_t record_buf[8];
14201 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
14202 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
14204 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
14206 /* Handle SMULL, UMULL, SMULAL. */
14207 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
14208 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14209 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14210 record_buf[2] = ARM_PS_REGNUM;
14211 thumb2_insn_r->reg_rec_count = 3;
14213 else if (1 == opcode1 || 3 == opcode2)
14215 /* Handle SDIV and UDIV. */
14216 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14217 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14218 record_buf[2] = ARM_PS_REGNUM;
14219 thumb2_insn_r->reg_rec_count = 3;
14221 else
14222 return ARM_RECORD_FAILURE;
14224 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14225 record_buf);
14226 return ARM_RECORD_SUCCESS;
14229 /* Record handler for thumb32 coprocessor instructions. */
14231 static int
14232 thumb2_record_coproc_insn (arm_insn_decode_record *thumb2_insn_r)
14234 if (bit (thumb2_insn_r->arm_insn, 25))
14235 return arm_record_coproc_data_proc (thumb2_insn_r);
14236 else
14237 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
14240 /* Record handler for advance SIMD structure load/store instructions. */
14242 static int
14243 thumb2_record_asimd_struct_ld_st (arm_insn_decode_record *thumb2_insn_r)
14245 struct regcache *reg_cache = thumb2_insn_r->regcache;
14246 uint32_t l_bit, a_bit, b_bits;
14247 uint32_t record_buf[128], record_buf_mem[128];
14248 uint32_t reg_rn, reg_vd, address, f_elem;
14249 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
14250 uint8_t f_ebytes;
14252 l_bit = bit (thumb2_insn_r->arm_insn, 21);
14253 a_bit = bit (thumb2_insn_r->arm_insn, 23);
14254 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
14255 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14256 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
14257 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
14258 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
14259 f_elem = 8 / f_ebytes;
14261 if (!l_bit)
14263 ULONGEST u_regval = 0;
14264 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
14265 address = u_regval;
14267 if (!a_bit)
14269 /* Handle VST1. */
14270 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14272 if (b_bits == 0x07)
14273 bf_regs = 1;
14274 else if (b_bits == 0x0a)
14275 bf_regs = 2;
14276 else if (b_bits == 0x06)
14277 bf_regs = 3;
14278 else if (b_bits == 0x02)
14279 bf_regs = 4;
14280 else
14281 bf_regs = 0;
14283 for (index_r = 0; index_r < bf_regs; index_r++)
14285 for (index_e = 0; index_e < f_elem; index_e++)
14287 record_buf_mem[index_m++] = f_ebytes;
14288 record_buf_mem[index_m++] = address;
14289 address = address + f_ebytes;
14290 thumb2_insn_r->mem_rec_count += 1;
14294 /* Handle VST2. */
14295 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14297 if (b_bits == 0x09 || b_bits == 0x08)
14298 bf_regs = 1;
14299 else if (b_bits == 0x03)
14300 bf_regs = 2;
14301 else
14302 bf_regs = 0;
14304 for (index_r = 0; index_r < bf_regs; index_r++)
14305 for (index_e = 0; index_e < f_elem; index_e++)
14307 for (loop_t = 0; loop_t < 2; loop_t++)
14309 record_buf_mem[index_m++] = f_ebytes;
14310 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14311 thumb2_insn_r->mem_rec_count += 1;
14313 address = address + (2 * f_ebytes);
14316 /* Handle VST3. */
14317 else if ((b_bits & 0x0e) == 0x04)
14319 for (index_e = 0; index_e < f_elem; index_e++)
14321 for (loop_t = 0; loop_t < 3; loop_t++)
14323 record_buf_mem[index_m++] = f_ebytes;
14324 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14325 thumb2_insn_r->mem_rec_count += 1;
14327 address = address + (3 * f_ebytes);
14330 /* Handle VST4. */
14331 else if (!(b_bits & 0x0e))
14333 for (index_e = 0; index_e < f_elem; index_e++)
14335 for (loop_t = 0; loop_t < 4; loop_t++)
14337 record_buf_mem[index_m++] = f_ebytes;
14338 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14339 thumb2_insn_r->mem_rec_count += 1;
14341 address = address + (4 * f_ebytes);
14345 else
14347 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
14349 if (bft_size == 0x00)
14350 f_ebytes = 1;
14351 else if (bft_size == 0x01)
14352 f_ebytes = 2;
14353 else if (bft_size == 0x02)
14354 f_ebytes = 4;
14355 else
14356 f_ebytes = 0;
14358 /* Handle VST1. */
14359 if (!(b_bits & 0x0b) || b_bits == 0x08)
14360 thumb2_insn_r->mem_rec_count = 1;
14361 /* Handle VST2. */
14362 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
14363 thumb2_insn_r->mem_rec_count = 2;
14364 /* Handle VST3. */
14365 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
14366 thumb2_insn_r->mem_rec_count = 3;
14367 /* Handle VST4. */
14368 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
14369 thumb2_insn_r->mem_rec_count = 4;
14371 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
14373 record_buf_mem[index_m] = f_ebytes;
14374 record_buf_mem[index_m] = address + (index_m * f_ebytes);
14378 else
14380 if (!a_bit)
14382 /* Handle VLD1. */
14383 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14384 thumb2_insn_r->reg_rec_count = 1;
14385 /* Handle VLD2. */
14386 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14387 thumb2_insn_r->reg_rec_count = 2;
14388 /* Handle VLD3. */
14389 else if ((b_bits & 0x0e) == 0x04)
14390 thumb2_insn_r->reg_rec_count = 3;
14391 /* Handle VLD4. */
14392 else if (!(b_bits & 0x0e))
14393 thumb2_insn_r->reg_rec_count = 4;
14395 else
14397 /* Handle VLD1. */
14398 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
14399 thumb2_insn_r->reg_rec_count = 1;
14400 /* Handle VLD2. */
14401 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
14402 thumb2_insn_r->reg_rec_count = 2;
14403 /* Handle VLD3. */
14404 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
14405 thumb2_insn_r->reg_rec_count = 3;
14406 /* Handle VLD4. */
14407 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
14408 thumb2_insn_r->reg_rec_count = 4;
14410 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
14411 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
14415 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
14417 record_buf[index_r] = reg_rn;
14418 thumb2_insn_r->reg_rec_count += 1;
14421 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14422 record_buf);
14423 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14424 record_buf_mem);
14425 return 0;
14428 /* Decodes thumb2 instruction type and invokes its record handler. */
14430 static unsigned int
14431 thumb2_record_decode_insn_handler (arm_insn_decode_record *thumb2_insn_r)
14433 uint32_t op, op1, op2;
14435 op = bit (thumb2_insn_r->arm_insn, 15);
14436 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
14437 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
14439 if (op1 == 0x01)
14441 if (!(op2 & 0x64 ))
14443 /* Load/store multiple instruction. */
14444 return thumb2_record_ld_st_multiple (thumb2_insn_r);
14446 else if ((op2 & 0x64) == 0x4)
14448 /* Load/store (dual/exclusive) and table branch instruction. */
14449 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
14451 else if ((op2 & 0x60) == 0x20)
14453 /* Data-processing (shifted register). */
14454 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14456 else if (op2 & 0x40)
14458 /* Co-processor instructions. */
14459 return thumb2_record_coproc_insn (thumb2_insn_r);
14462 else if (op1 == 0x02)
14464 if (op)
14466 /* Branches and miscellaneous control instructions. */
14467 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
14469 else if (op2 & 0x20)
14471 /* Data-processing (plain binary immediate) instruction. */
14472 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14474 else
14476 /* Data-processing (modified immediate). */
14477 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14480 else if (op1 == 0x03)
14482 if (!(op2 & 0x71 ))
14484 /* Store single data item. */
14485 return thumb2_record_str_single_data (thumb2_insn_r);
14487 else if (!((op2 & 0x71) ^ 0x10))
14489 /* Advanced SIMD or structure load/store instructions. */
14490 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
14492 else if (!((op2 & 0x67) ^ 0x01))
14494 /* Load byte, memory hints instruction. */
14495 return thumb2_record_ld_mem_hints (thumb2_insn_r);
14497 else if (!((op2 & 0x67) ^ 0x03))
14499 /* Load halfword, memory hints instruction. */
14500 return thumb2_record_ld_mem_hints (thumb2_insn_r);
14502 else if (!((op2 & 0x67) ^ 0x05))
14504 /* Load word instruction. */
14505 return thumb2_record_ld_word (thumb2_insn_r);
14507 else if (!((op2 & 0x70) ^ 0x20))
14509 /* Data-processing (register) instruction. */
14510 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14512 else if (!((op2 & 0x78) ^ 0x30))
14514 /* Multiply, multiply accumulate, abs diff instruction. */
14515 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14517 else if (!((op2 & 0x78) ^ 0x38))
14519 /* Long multiply, long multiply accumulate, and divide. */
14520 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
14522 else if (op2 & 0x40)
14524 /* Co-processor instructions. */
14525 return thumb2_record_coproc_insn (thumb2_insn_r);
14529 return -1;
14532 namespace {
14533 /* Abstract instruction reader. */
14535 class abstract_instruction_reader
14537 public:
14538 /* Read one instruction of size LEN from address MEMADDR and using
14539 BYTE_ORDER endianness. */
14541 virtual ULONGEST read (CORE_ADDR memaddr, const size_t len,
14542 enum bfd_endian byte_order) = 0;
14545 /* Instruction reader from real target. */
14547 class instruction_reader : public abstract_instruction_reader
14549 public:
14550 ULONGEST read (CORE_ADDR memaddr, const size_t len,
14551 enum bfd_endian byte_order) override
14553 return read_code_unsigned_integer (memaddr, len, byte_order);
14557 } // namespace
14559 typedef int (*sti_arm_hdl_fp_t) (arm_insn_decode_record*);
14561 /* Decode arm/thumb insn depending on condition cods and opcodes; and
14562 dispatch it. */
14564 static int
14565 decode_insn (abstract_instruction_reader &reader,
14566 arm_insn_decode_record *arm_record,
14567 record_type_t record_type, uint32_t insn_size)
14570 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
14571 instruction. */
14572 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
14574 arm_record_data_proc_misc_ld_str, /* 000. */
14575 arm_record_data_proc_imm, /* 001. */
14576 arm_record_ld_st_imm_offset, /* 010. */
14577 arm_record_ld_st_reg_offset, /* 011. */
14578 arm_record_ld_st_multiple, /* 100. */
14579 arm_record_b_bl, /* 101. */
14580 arm_record_asimd_vfp_coproc, /* 110. */
14581 arm_record_coproc_data_proc /* 111. */
14584 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
14585 instruction. */
14586 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
14588 thumb_record_shift_add_sub, /* 000. */
14589 thumb_record_add_sub_cmp_mov, /* 001. */
14590 thumb_record_ld_st_reg_offset, /* 010. */
14591 thumb_record_ld_st_imm_offset, /* 011. */
14592 thumb_record_ld_st_stack, /* 100. */
14593 thumb_record_misc, /* 101. */
14594 thumb_record_ldm_stm_swi, /* 110. */
14595 thumb_record_branch /* 111. */
14598 uint32_t ret = 0; /* return value: negative:failure 0:success. */
14599 uint32_t insn_id = 0;
14600 enum bfd_endian code_endian
14601 = gdbarch_byte_order_for_code (arm_record->gdbarch);
14602 arm_record->arm_insn
14603 = reader.read (arm_record->this_addr, insn_size, code_endian);
14605 if (ARM_RECORD == record_type)
14607 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
14608 insn_id = bits (arm_record->arm_insn, 25, 27);
14610 if (arm_record->cond == 0xf)
14611 ret = arm_record_extension_space (arm_record);
14612 else
14614 /* If this insn has fallen into extension space
14615 then we need not decode it anymore. */
14616 ret = arm_handle_insn[insn_id] (arm_record);
14618 if (ret != ARM_RECORD_SUCCESS)
14620 arm_record_unsupported_insn (arm_record);
14621 ret = -1;
14624 else if (THUMB_RECORD == record_type)
14626 /* As thumb does not have condition codes, we set negative. */
14627 arm_record->cond = -1;
14628 insn_id = bits (arm_record->arm_insn, 13, 15);
14629 ret = thumb_handle_insn[insn_id] (arm_record);
14630 if (ret != ARM_RECORD_SUCCESS)
14632 arm_record_unsupported_insn (arm_record);
14633 ret = -1;
14636 else if (THUMB2_RECORD == record_type)
14638 /* As thumb does not have condition codes, we set negative. */
14639 arm_record->cond = -1;
14641 /* Swap first half of 32bit thumb instruction with second half. */
14642 arm_record->arm_insn
14643 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
14645 ret = thumb2_record_decode_insn_handler (arm_record);
14647 if (ret != ARM_RECORD_SUCCESS)
14649 arm_record_unsupported_insn (arm_record);
14650 ret = -1;
14653 else
14655 /* Throw assertion. */
14656 gdb_assert_not_reached ("not a valid instruction, could not decode");
14659 return ret;
14662 #if GDB_SELF_TEST
14663 namespace selftests {
14665 /* Instruction reader class for selftests.
14667 For 16-bit Thumb instructions, an array of uint16_t should be used.
14669 For 32-bit Thumb instructions and regular 32-bit Arm instructions, an array
14670 of uint32_t should be used. */
14672 template<typename T>
14673 class instruction_reader_selftest : public abstract_instruction_reader
14675 public:
14676 template<size_t SIZE>
14677 instruction_reader_selftest (const T (&insns)[SIZE])
14678 : m_insns (insns), m_insns_size (SIZE)
14681 ULONGEST read (CORE_ADDR memaddr, const size_t length,
14682 enum bfd_endian byte_order) override
14684 SELF_CHECK (length == sizeof (T));
14685 SELF_CHECK (memaddr % sizeof (T) == 0);
14686 SELF_CHECK ((memaddr / sizeof (T)) < m_insns_size);
14688 return m_insns[memaddr / sizeof (T)];
14691 private:
14692 const T *m_insns;
14693 const size_t m_insns_size;
14696 static void
14697 arm_record_test (void)
14699 struct gdbarch_info info;
14700 info.bfd_arch_info = bfd_scan_arch ("arm");
14702 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14704 SELF_CHECK (gdbarch != NULL);
14706 /* 16-bit Thumb instructions. */
14708 arm_insn_decode_record arm_record;
14710 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14711 arm_record.gdbarch = gdbarch;
14713 /* Use the endian-free representation of the instructions here. The test
14714 will handle endianness conversions. */
14715 static const uint16_t insns[] = {
14716 /* db b2 uxtb r3, r3 */
14717 0xb2db,
14718 /* cd 58 ldr r5, [r1, r3] */
14719 0x58cd,
14722 instruction_reader_selftest<uint16_t> reader (insns);
14723 int ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14724 THUMB_INSN_SIZE_BYTES);
14726 SELF_CHECK (ret == 0);
14727 SELF_CHECK (arm_record.mem_rec_count == 0);
14728 SELF_CHECK (arm_record.reg_rec_count == 1);
14729 SELF_CHECK (arm_record.arm_regs[0] == 3);
14731 arm_record.this_addr += 2;
14732 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14733 THUMB_INSN_SIZE_BYTES);
14735 SELF_CHECK (ret == 0);
14736 SELF_CHECK (arm_record.mem_rec_count == 0);
14737 SELF_CHECK (arm_record.reg_rec_count == 1);
14738 SELF_CHECK (arm_record.arm_regs[0] == 5);
14741 /* 32-bit Thumb-2 instructions. */
14743 arm_insn_decode_record arm_record;
14745 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14746 arm_record.gdbarch = gdbarch;
14748 /* Use the endian-free representation of the instruction here. The test
14749 will handle endianness conversions. */
14750 static const uint32_t insns[] = {
14751 /* mrc 15, 0, r7, cr13, cr0, {3} */
14752 0x7f70ee1d,
14755 instruction_reader_selftest<uint32_t> reader (insns);
14756 int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14757 THUMB2_INSN_SIZE_BYTES);
14759 SELF_CHECK (ret == 0);
14760 SELF_CHECK (arm_record.mem_rec_count == 0);
14761 SELF_CHECK (arm_record.reg_rec_count == 1);
14762 SELF_CHECK (arm_record.arm_regs[0] == 7);
14765 /* 32-bit instructions. */
14767 arm_insn_decode_record arm_record;
14769 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14770 arm_record.gdbarch = gdbarch;
14772 /* Use the endian-free representation of the instruction here. The test
14773 will handle endianness conversions. */
14774 static const uint32_t insns[] = {
14775 /* mov r5, r0 */
14776 0xe1a05000,
14779 instruction_reader_selftest<uint32_t> reader (insns);
14780 int ret = decode_insn (reader, &arm_record, ARM_RECORD,
14781 ARM_INSN_SIZE_BYTES);
14783 SELF_CHECK (ret == 0);
14787 /* Instruction reader from manually cooked instruction sequences. */
14789 class test_arm_instruction_reader : public arm_instruction_reader
14791 public:
14792 explicit test_arm_instruction_reader (gdb::array_view<const uint32_t> insns)
14793 : m_insns (insns)
14796 uint32_t read (CORE_ADDR memaddr, enum bfd_endian byte_order) const override
14798 SELF_CHECK (memaddr % 4 == 0);
14799 SELF_CHECK (memaddr / 4 < m_insns.size ());
14801 return m_insns[memaddr / 4];
14804 private:
14805 const gdb::array_view<const uint32_t> m_insns;
14808 static void
14809 arm_analyze_prologue_test ()
14811 for (bfd_endian endianness : {BFD_ENDIAN_LITTLE, BFD_ENDIAN_BIG})
14813 struct gdbarch_info info;
14814 info.byte_order = endianness;
14815 info.byte_order_for_code = endianness;
14816 info.bfd_arch_info = bfd_scan_arch ("arm");
14818 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14820 SELF_CHECK (gdbarch != NULL);
14822 /* The "sub" instruction contains an immediate value rotate count of 0,
14823 which resulted in a 32-bit shift of a 32-bit value, caught by
14824 UBSan. */
14825 const uint32_t insns[] = {
14826 0xe92d4ff0, /* push {r4, r5, r6, r7, r8, r9, sl, fp, lr} */
14827 0xe1a05000, /* mov r5, r0 */
14828 0xe5903020, /* ldr r3, [r0, #32] */
14829 0xe24dd044, /* sub sp, sp, #68 ; 0x44 */
14832 test_arm_instruction_reader mem_reader (insns);
14833 arm_prologue_cache cache;
14834 arm_cache_init (&cache, gdbarch);
14836 arm_analyze_prologue (gdbarch, 0, sizeof (insns) - 1, &cache, mem_reader);
14840 } // namespace selftests
14841 #endif /* GDB_SELF_TEST */
14843 /* Cleans up local record registers and memory allocations. */
14845 static void
14846 deallocate_reg_mem (arm_insn_decode_record *record)
14848 xfree (record->arm_regs);
14849 xfree (record->arm_mems);
14853 /* Parse the current instruction and record the values of the registers and
14854 memory that will be changed in current instruction to record_arch_list".
14855 Return -1 if something is wrong. */
14858 arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
14859 CORE_ADDR insn_addr)
14862 uint32_t no_of_rec = 0;
14863 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
14864 ULONGEST t_bit = 0, insn_id = 0;
14866 ULONGEST u_regval = 0;
14868 arm_insn_decode_record arm_record;
14870 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14871 arm_record.regcache = regcache;
14872 arm_record.this_addr = insn_addr;
14873 arm_record.gdbarch = gdbarch;
14876 if (record_debug > 1)
14878 gdb_printf (gdb_stdlog, "Process record: arm_process_record "
14879 "addr = %s\n",
14880 paddress (gdbarch, arm_record.this_addr));
14883 instruction_reader reader;
14884 enum bfd_endian code_endian
14885 = gdbarch_byte_order_for_code (arm_record.gdbarch);
14886 arm_record.arm_insn
14887 = reader.read (arm_record.this_addr, 2, code_endian);
14889 /* Check the insn, whether it is thumb or arm one. */
14891 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
14892 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
14895 if (!(u_regval & t_bit))
14897 /* We are decoding arm insn. */
14898 ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
14900 else
14902 insn_id = bits (arm_record.arm_insn, 11, 15);
14903 /* is it thumb2 insn? */
14904 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
14906 ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14907 THUMB2_INSN_SIZE_BYTES);
14909 else
14911 /* We are decoding thumb insn. */
14912 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14913 THUMB_INSN_SIZE_BYTES);
14917 if (0 == ret)
14919 /* Record registers. */
14920 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
14921 if (arm_record.arm_regs)
14923 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
14925 if (record_full_arch_list_add_reg
14926 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
14927 ret = -1;
14930 /* Record memories. */
14931 if (arm_record.arm_mems)
14933 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
14935 if (record_full_arch_list_add_mem
14936 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
14937 arm_record.arm_mems[no_of_rec].len))
14938 ret = -1;
14942 if (record_full_arch_list_add_end ())
14943 ret = -1;
14947 deallocate_reg_mem (&arm_record);
14949 return ret;
14952 /* See arm-tdep.h. */
14954 const target_desc *
14955 arm_read_description (arm_fp_type fp_type, bool tls)
14957 struct target_desc *tdesc = tdesc_arm_list[fp_type][tls];
14959 if (tdesc == nullptr)
14961 tdesc = arm_create_target_description (fp_type, tls);
14962 tdesc_arm_list[fp_type][tls] = tdesc;
14965 return tdesc;
14968 /* See arm-tdep.h. */
14970 const target_desc *
14971 arm_read_mprofile_description (arm_m_profile_type m_type)
14973 struct target_desc *tdesc = tdesc_arm_mprofile_list[m_type];
14975 if (tdesc == nullptr)
14977 tdesc = arm_create_mprofile_target_description (m_type);
14978 tdesc_arm_mprofile_list[m_type] = tdesc;
14981 return tdesc;