Add translations for various sub-directories
[binutils-gdb.git] / gdb / arm-tdep.c
blob0c15215b30c6896d3eba9eb5bb7992d4871b22c5
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/>. */
21 #include <ctype.h>
23 #include "extract-store-integer.h"
24 #include "frame.h"
25 #include "language.h"
26 #include "inferior.h"
27 #include "infrun.h"
28 #include "cli/cli-cmds.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 std::string 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, const 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 behavior 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 (const 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 char type;
716 arm_displaced_step_copy_insn_closure *dsc = nullptr;
717 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
719 if (gdbarch_displaced_step_copy_insn_closure_by_addr_p (gdbarch))
720 dsc = ((arm_displaced_step_copy_insn_closure * )
721 gdbarch_displaced_step_copy_insn_closure_by_addr
722 (gdbarch, current_inferior (), memaddr));
724 /* If checking the mode of displaced instruction in copy area, the mode
725 should be determined by instruction on the original address. */
726 if (dsc)
728 displaced_debug_printf ("check mode of %.8lx instead of %.8lx",
729 (unsigned long) dsc->insn_addr,
730 (unsigned long) memaddr);
731 memaddr = dsc->insn_addr;
734 /* If bit 0 of the address is set, assume this is a Thumb address. */
735 if (IS_THUMB_ADDR (memaddr))
736 return 1;
738 /* If the user wants to override the symbol table, let him. */
739 if (strcmp (arm_force_mode_string, "arm") == 0)
740 return 0;
741 if (strcmp (arm_force_mode_string, "thumb") == 0)
742 return 1;
744 /* ARM v6-M and v7-M are always in Thumb mode. */
745 if (tdep->is_m)
746 return 1;
748 /* If there are mapping symbols, consult them. */
749 type = arm_find_mapping_symbol (memaddr, NULL);
750 if (type)
751 return type == 't';
753 /* Thumb functions have a "special" bit set in minimal symbols. */
754 bound_minimal_symbol sym = lookup_minimal_symbol_by_pc (memaddr);
755 if (sym.minsym)
756 return (MSYMBOL_IS_SPECIAL (sym.minsym));
758 /* If the user wants to override the fallback mode, let them. */
759 if (strcmp (arm_fallback_mode_string, "arm") == 0)
760 return 0;
761 if (strcmp (arm_fallback_mode_string, "thumb") == 0)
762 return 1;
764 /* If we couldn't find any symbol, but we're talking to a running
765 target, then trust the current value of $cpsr. This lets
766 "display/i $pc" always show the correct mode (though if there is
767 a symbol table we will not reach here, so it still may not be
768 displayed in the mode it will be executed). */
769 if (target_has_registers ())
770 return arm_frame_is_thumb (get_current_frame ());
772 /* Otherwise we're out of luck; we assume ARM. */
773 return 0;
776 static inline bool
777 arm_m_addr_is_lockup (CORE_ADDR addr)
779 switch (addr)
781 /* Values for lockup state.
782 For more details see "B1.5.15 Unrecoverable exception cases" in
783 both ARMv6-M and ARMv7-M Architecture Reference Manuals, or
784 see "B4.32 Lockup" in ARMv8-M Architecture Reference Manual. */
785 case 0xeffffffe:
786 case 0xfffffffe:
787 case 0xffffffff:
788 return true;
790 default:
791 /* Address is not lockup. */
792 return false;
796 /* Determine if the address specified equals any of these magic return
797 values, called EXC_RETURN, defined by the ARM v6-M, v7-M and v8-M
798 architectures. Also include lockup magic PC value.
799 Check also for FNC_RETURN if we have the v8-M security extension.
801 From ARMv6-M Reference Manual B1.5.8
802 Table B1-5 Exception return behavior
804 EXC_RETURN Return To Return Stack
805 0xFFFFFFF1 Handler mode Main
806 0xFFFFFFF9 Thread mode Main
807 0xFFFFFFFD Thread mode Process
809 From ARMv7-M Reference Manual B1.5.8
810 Table B1-8 EXC_RETURN definition of exception return behavior, no FP
812 EXC_RETURN Return To Return Stack
813 0xFFFFFFF1 Handler mode Main
814 0xFFFFFFF9 Thread mode Main
815 0xFFFFFFFD Thread mode Process
817 Table B1-9 EXC_RETURN definition of exception return behavior, with
820 EXC_RETURN Return To Return Stack Frame Type
821 0xFFFFFFE1 Handler mode Main Extended
822 0xFFFFFFE9 Thread mode Main Extended
823 0xFFFFFFED Thread mode Process Extended
824 0xFFFFFFF1 Handler mode Main Basic
825 0xFFFFFFF9 Thread mode Main Basic
826 0xFFFFFFFD Thread mode Process Basic
828 For more details see "B1.5.8 Exception return behavior"
829 in both ARMv6-M and ARMv7-M Architecture Reference Manuals.
831 From ARMv8-M Architecture Technical Reference, D1.2.95
832 FType, Mode and SPSEL bits are to be considered when the Security
833 Extension is not implemented.
835 EXC_RETURN Return To Return Stack Frame Type
836 0xFFFFFFA0 Handler mode Main Extended
837 0xFFFFFFA8 Thread mode Main Extended
838 0xFFFFFFAC Thread mode Process Extended
839 0xFFFFFFB0 Handler mode Main Standard
840 0xFFFFFFB8 Thread mode Main Standard
841 0xFFFFFFBC Thread mode Process Standard */
843 static int
844 arm_m_addr_is_magic (struct gdbarch *gdbarch, CORE_ADDR addr)
846 if (arm_m_addr_is_lockup (addr))
847 return 1;
849 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
850 if (tdep->have_sec_ext)
852 switch ((addr & 0xff000000))
854 case 0xff000000: /* EXC_RETURN pattern. */
855 case 0xfe000000: /* FNC_RETURN pattern. */
856 return 1;
857 default:
858 return 0;
861 else
863 switch (addr)
865 /* Values from ARMv8-M Architecture Technical Reference. */
866 case 0xffffffa0:
867 case 0xffffffa8:
868 case 0xffffffac:
869 case 0xffffffb0:
870 case 0xffffffb8:
871 case 0xffffffbc:
872 /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
873 the exception return behavior. */
874 case 0xffffffe1:
875 case 0xffffffe9:
876 case 0xffffffed:
877 case 0xfffffff1:
878 case 0xfffffff9:
879 case 0xfffffffd:
880 /* Address is magic. */
881 return 1;
883 default:
884 /* Address is not magic. */
885 return 0;
890 /* Remove useless bits from addresses in a running program. */
891 static CORE_ADDR
892 arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
894 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
896 /* On M-profile devices, do not strip the low bit from EXC_RETURN
897 (the magic exception return address). */
898 if (tdep->is_m && arm_m_addr_is_magic (gdbarch, val))
899 return val;
901 if (arm_apcs_32)
902 return UNMAKE_THUMB_ADDR (val);
903 else
904 return (val & 0x03fffffc);
907 /* Return 1 if PC is the start of a compiler helper function which
908 can be safely ignored during prologue skipping. IS_THUMB is true
909 if the function is known to be a Thumb function due to the way it
910 is being called. */
911 static int
912 skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
914 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
916 bound_minimal_symbol msym = lookup_minimal_symbol_by_pc (pc);
917 if (msym.minsym != NULL
918 && msym.value_address () == pc
919 && msym.minsym->linkage_name () != NULL)
921 const char *name = msym.minsym->linkage_name ();
923 /* The GNU linker's Thumb call stub to foo is named
924 __foo_from_thumb. */
925 if (strstr (name, "_from_thumb") != NULL)
926 name += 2;
928 /* On soft-float targets, __truncdfsf2 is called to convert promoted
929 arguments to their argument types in non-prototyped
930 functions. */
931 if (startswith (name, "__truncdfsf2"))
932 return 1;
933 if (startswith (name, "__aeabi_d2f"))
934 return 1;
936 /* Internal functions related to thread-local storage. */
937 if (startswith (name, "__tls_get_addr"))
938 return 1;
939 if (startswith (name, "__aeabi_read_tp"))
940 return 1;
942 else
944 /* If we run against a stripped glibc, we may be unable to identify
945 special functions by name. Check for one important case,
946 __aeabi_read_tp, by comparing the *code* against the default
947 implementation (this is hand-written ARM assembler in glibc). */
949 if (!is_thumb
950 && read_code_unsigned_integer (pc, 4, byte_order_for_code)
951 == 0xe3e00a0f /* mov r0, #0xffff0fff */
952 && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
953 == 0xe240f01f) /* sub pc, r0, #31 */
954 return 1;
957 return 0;
960 /* Extract the immediate from instruction movw/movt of encoding T. INSN1 is
961 the first 16-bit of instruction, and INSN2 is the second 16-bit of
962 instruction. */
963 #define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
964 ((bits ((insn1), 0, 3) << 12) \
965 | (bits ((insn1), 10, 10) << 11) \
966 | (bits ((insn2), 12, 14) << 8) \
967 | bits ((insn2), 0, 7))
969 /* Extract the immediate from instruction movw/movt of encoding A. INSN is
970 the 32-bit instruction. */
971 #define EXTRACT_MOVW_MOVT_IMM_A(insn) \
972 ((bits ((insn), 16, 19) << 12) \
973 | bits ((insn), 0, 11))
975 /* Decode immediate value; implements ThumbExpandImmediate pseudo-op. */
977 static unsigned int
978 thumb_expand_immediate (unsigned int imm)
980 unsigned int count = imm >> 7;
982 if (count < 8)
983 switch (count / 2)
985 case 0:
986 return imm & 0xff;
987 case 1:
988 return (imm & 0xff) | ((imm & 0xff) << 16);
989 case 2:
990 return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
991 case 3:
992 return (imm & 0xff) | ((imm & 0xff) << 8)
993 | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
996 return (0x80 | (imm & 0x7f)) << (32 - count);
999 /* Return 1 if the 16-bit Thumb instruction INSN restores SP in
1000 epilogue, 0 otherwise. */
1002 static int
1003 thumb_instruction_restores_sp (unsigned short insn)
1005 return (insn == 0x46bd /* mov sp, r7 */
1006 || (insn & 0xff80) == 0xb000 /* add sp, imm */
1007 || (insn & 0xfe00) == 0xbc00); /* pop <registers> */
1010 /* Analyze a Thumb prologue, looking for a recognizable stack frame
1011 and frame pointer. Scan until we encounter a store that could
1012 clobber the stack frame unexpectedly, or an unknown instruction.
1013 Return the last address which is definitely safe to skip for an
1014 initial breakpoint. */
1016 static CORE_ADDR
1017 thumb_analyze_prologue (struct gdbarch *gdbarch,
1018 CORE_ADDR start, CORE_ADDR limit,
1019 struct arm_prologue_cache *cache)
1021 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1022 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1023 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1024 int i;
1025 pv_t regs[16];
1026 CORE_ADDR offset;
1027 CORE_ADDR unrecognized_pc = 0;
1029 for (i = 0; i < 16; i++)
1030 regs[i] = pv_register (i, 0);
1031 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1033 while (start < limit)
1035 unsigned short insn;
1036 std::optional<bool> ra_signed_state;
1038 insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
1040 if ((insn & 0xfe00) == 0xb400) /* push { rlist } */
1042 int regno;
1043 int mask;
1045 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1046 break;
1048 /* Bits 0-7 contain a mask for registers R0-R7. Bit 8 says
1049 whether to save LR (R14). */
1050 mask = (insn & 0xff) | ((insn & 0x100) << 6);
1052 /* Calculate offsets of saved R0-R7 and LR. */
1053 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1054 if (mask & (1 << regno))
1056 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1057 -4);
1058 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
1061 else if ((insn & 0xff80) == 0xb080) /* sub sp, #imm */
1063 offset = (insn & 0x7f) << 2; /* get scaled offset */
1064 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1065 -offset);
1067 else if (thumb_instruction_restores_sp (insn))
1069 /* Don't scan past the epilogue. */
1070 break;
1072 else if ((insn & 0xf800) == 0xa800) /* add Rd, sp, #imm */
1073 regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
1074 (insn & 0xff) << 2);
1075 else if ((insn & 0xfe00) == 0x1c00 /* add Rd, Rn, #imm */
1076 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1077 regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
1078 bits (insn, 6, 8));
1079 else if ((insn & 0xf800) == 0x3000 /* add Rd, #imm */
1080 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1081 regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
1082 bits (insn, 0, 7));
1083 else if ((insn & 0xfe00) == 0x1800 /* add Rd, Rn, Rm */
1084 && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
1085 && pv_is_constant (regs[bits (insn, 3, 5)]))
1086 regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
1087 regs[bits (insn, 6, 8)]);
1088 else if ((insn & 0xff00) == 0x4400 /* add Rd, Rm */
1089 && pv_is_constant (regs[bits (insn, 3, 6)]))
1091 int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
1092 int rm = bits (insn, 3, 6);
1093 regs[rd] = pv_add (regs[rd], regs[rm]);
1095 else if ((insn & 0xff00) == 0x4600) /* mov hi, lo or mov lo, hi */
1097 int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
1098 int src_reg = (insn & 0x78) >> 3;
1099 regs[dst_reg] = regs[src_reg];
1101 else if ((insn & 0xf800) == 0x9000) /* str rd, [sp, #off] */
1103 /* Handle stores to the stack. Normally pushes are used,
1104 but with GCC -mtpcs-frame, there may be other stores
1105 in the prologue to create the frame. */
1106 int regno = (insn >> 8) & 0x7;
1107 pv_t addr;
1109 offset = (insn & 0xff) << 2;
1110 addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
1112 if (stack.store_would_trash (addr))
1113 break;
1115 stack.store (addr, 4, regs[regno]);
1117 else if ((insn & 0xf800) == 0x6000) /* str rd, [rn, #off] */
1119 int rd = bits (insn, 0, 2);
1120 int rn = bits (insn, 3, 5);
1121 pv_t addr;
1123 offset = bits (insn, 6, 10) << 2;
1124 addr = pv_add_constant (regs[rn], offset);
1126 if (stack.store_would_trash (addr))
1127 break;
1129 stack.store (addr, 4, regs[rd]);
1131 else if (((insn & 0xf800) == 0x7000 /* strb Rd, [Rn, #off] */
1132 || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
1133 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1134 /* Ignore stores of argument registers to the stack. */
1136 else if ((insn & 0xf800) == 0xc800 /* ldmia Rn!, { registers } */
1137 && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1138 /* Ignore block loads from the stack, potentially copying
1139 parameters from memory. */
1141 else if ((insn & 0xf800) == 0x9800 /* ldr Rd, [Rn, #immed] */
1142 || ((insn & 0xf800) == 0x6800 /* ldr Rd, [sp, #immed] */
1143 && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
1144 /* Similarly ignore single loads from the stack. */
1146 else if ((insn & 0xffc0) == 0x0000 /* lsls Rd, Rm, #0 */
1147 || (insn & 0xffc0) == 0x1c00) /* add Rd, Rn, #0 */
1148 /* Skip register copies, i.e. saves to another register
1149 instead of the stack. */
1151 else if ((insn & 0xf800) == 0x2000) /* movs Rd, #imm */
1152 /* Recognize constant loads; even with small stacks these are necessary
1153 on Thumb. */
1154 regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
1155 else if ((insn & 0xf800) == 0x4800) /* ldr Rd, [pc, #imm] */
1157 /* Constant pool loads, for the same reason. */
1158 unsigned int constant;
1159 CORE_ADDR loc;
1161 loc = start + 4 + bits (insn, 0, 7) * 4;
1162 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1163 regs[bits (insn, 8, 10)] = pv_constant (constant);
1165 else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions. */
1167 unsigned short inst2;
1169 inst2 = read_code_unsigned_integer (start + 2, 2,
1170 byte_order_for_code);
1171 uint32_t whole_insn = (insn << 16) | inst2;
1173 if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
1175 /* BL, BLX. Allow some special function calls when
1176 skipping the prologue; GCC generates these before
1177 storing arguments to the stack. */
1178 CORE_ADDR nextpc;
1179 int j1, j2, imm1, imm2;
1181 imm1 = sbits (insn, 0, 10);
1182 imm2 = bits (inst2, 0, 10);
1183 j1 = bit (inst2, 13);
1184 j2 = bit (inst2, 11);
1186 offset = ((imm1 << 12) + (imm2 << 1));
1187 offset ^= ((!j2) << 22) | ((!j1) << 23);
1189 nextpc = start + 4 + offset;
1190 /* For BLX make sure to clear the low bits. */
1191 if (bit (inst2, 12) == 0)
1192 nextpc = nextpc & 0xfffffffc;
1194 if (!skip_prologue_function (gdbarch, nextpc,
1195 bit (inst2, 12) != 0))
1196 break;
1199 else if ((insn & 0xffd0) == 0xe900 /* stmdb Rn{!},
1200 { registers } */
1201 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1203 pv_t addr = regs[bits (insn, 0, 3)];
1204 int regno;
1206 if (stack.store_would_trash (addr))
1207 break;
1209 /* Calculate offsets of saved registers. */
1210 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1211 if (inst2 & (1 << regno))
1213 addr = pv_add_constant (addr, -4);
1214 stack.store (addr, 4, regs[regno]);
1217 if (insn & 0x0020)
1218 regs[bits (insn, 0, 3)] = addr;
1221 /* vstmdb Rn{!}, { D-registers } (aka vpush). */
1222 else if ((insn & 0xff20) == 0xed20
1223 && (inst2 & 0x0f00) == 0x0b00
1224 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1226 /* Address SP points to. */
1227 pv_t addr = regs[bits (insn, 0, 3)];
1229 /* Number of registers saved. */
1230 unsigned int number = bits (inst2, 0, 7) >> 1;
1232 /* First register to save. */
1233 int vd = bits (inst2, 12, 15) | (bits (insn, 6, 6) << 4);
1235 if (stack.store_would_trash (addr))
1236 break;
1238 /* Calculate offsets of saved registers. */
1239 for (; number > 0; number--)
1241 addr = pv_add_constant (addr, -8);
1242 stack.store (addr, 8, pv_register (ARM_D0_REGNUM
1243 + vd + number, 0));
1246 /* Writeback SP to account for the saved registers. */
1247 regs[bits (insn, 0, 3)] = addr;
1250 else if ((insn & 0xff50) == 0xe940 /* strd Rt, Rt2,
1251 [Rn, #+/-imm]{!} */
1252 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1254 int regno1 = bits (inst2, 12, 15);
1255 int regno2 = bits (inst2, 8, 11);
1256 pv_t addr = regs[bits (insn, 0, 3)];
1258 offset = inst2 & 0xff;
1259 if (insn & 0x0080)
1260 addr = pv_add_constant (addr, offset);
1261 else
1262 addr = pv_add_constant (addr, -offset);
1264 if (stack.store_would_trash (addr))
1265 break;
1267 stack.store (addr, 4, regs[regno1]);
1268 stack.store (pv_add_constant (addr, 4),
1269 4, regs[regno2]);
1271 if (insn & 0x0020)
1272 regs[bits (insn, 0, 3)] = addr;
1275 else if ((insn & 0xfff0) == 0xf8c0 /* str Rt,[Rn,+/-#imm]{!} */
1276 && (inst2 & 0x0c00) == 0x0c00
1277 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1279 int regno = bits (inst2, 12, 15);
1280 pv_t addr = regs[bits (insn, 0, 3)];
1282 offset = inst2 & 0xff;
1283 if (inst2 & 0x0200)
1284 addr = pv_add_constant (addr, offset);
1285 else
1286 addr = pv_add_constant (addr, -offset);
1288 if (stack.store_would_trash (addr))
1289 break;
1291 stack.store (addr, 4, regs[regno]);
1293 if (inst2 & 0x0100)
1294 regs[bits (insn, 0, 3)] = addr;
1297 else if ((insn & 0xfff0) == 0xf8c0 /* str.w Rt,[Rn,#imm] */
1298 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1300 int regno = bits (inst2, 12, 15);
1301 pv_t addr;
1303 offset = inst2 & 0xfff;
1304 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
1306 if (stack.store_would_trash (addr))
1307 break;
1309 stack.store (addr, 4, regs[regno]);
1312 else if ((insn & 0xffd0) == 0xf880 /* str{bh}.w Rt,[Rn,#imm] */
1313 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1314 /* Ignore stores of argument registers to the stack. */
1317 else if ((insn & 0xffd0) == 0xf800 /* str{bh} Rt,[Rn,#+/-imm] */
1318 && (inst2 & 0x0d00) == 0x0c00
1319 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1320 /* Ignore stores of argument registers to the stack. */
1323 else if ((insn & 0xffd0) == 0xe890 /* ldmia Rn[!],
1324 { registers } */
1325 && (inst2 & 0x8000) == 0x0000
1326 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1327 /* Ignore block loads from the stack, potentially copying
1328 parameters from memory. */
1331 else if ((insn & 0xff70) == 0xe950 /* ldrd Rt, Rt2,
1332 [Rn, #+/-imm] */
1333 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1334 /* Similarly ignore dual loads from the stack. */
1337 else if ((insn & 0xfff0) == 0xf850 /* ldr Rt,[Rn,#+/-imm] */
1338 && (inst2 & 0x0d00) == 0x0c00
1339 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1340 /* Similarly ignore single loads from the stack. */
1343 else if ((insn & 0xfff0) == 0xf8d0 /* ldr.w Rt,[Rn,#imm] */
1344 && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1345 /* Similarly ignore single loads from the stack. */
1348 else if ((insn & 0xfbf0) == 0xf100 /* add.w Rd, Rn, #imm */
1349 && (inst2 & 0x8000) == 0x0000)
1351 unsigned int imm = ((bits (insn, 10, 10) << 11)
1352 | (bits (inst2, 12, 14) << 8)
1353 | bits (inst2, 0, 7));
1355 regs[bits (inst2, 8, 11)]
1356 = pv_add_constant (regs[bits (insn, 0, 3)],
1357 thumb_expand_immediate (imm));
1360 else if ((insn & 0xfbf0) == 0xf200 /* addw Rd, Rn, #imm */
1361 && (inst2 & 0x8000) == 0x0000)
1363 unsigned int imm = ((bits (insn, 10, 10) << 11)
1364 | (bits (inst2, 12, 14) << 8)
1365 | bits (inst2, 0, 7));
1367 regs[bits (inst2, 8, 11)]
1368 = pv_add_constant (regs[bits (insn, 0, 3)], imm);
1371 else if ((insn & 0xfbf0) == 0xf1a0 /* sub.w Rd, Rn, #imm */
1372 && (inst2 & 0x8000) == 0x0000)
1374 unsigned int imm = ((bits (insn, 10, 10) << 11)
1375 | (bits (inst2, 12, 14) << 8)
1376 | bits (inst2, 0, 7));
1378 regs[bits (inst2, 8, 11)]
1379 = pv_add_constant (regs[bits (insn, 0, 3)],
1380 - (CORE_ADDR) thumb_expand_immediate (imm));
1383 else if ((insn & 0xfbf0) == 0xf2a0 /* subw Rd, Rn, #imm */
1384 && (inst2 & 0x8000) == 0x0000)
1386 unsigned int imm = ((bits (insn, 10, 10) << 11)
1387 | (bits (inst2, 12, 14) << 8)
1388 | bits (inst2, 0, 7));
1390 regs[bits (inst2, 8, 11)]
1391 = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1394 else if ((insn & 0xfbff) == 0xf04f) /* mov.w Rd, #const */
1396 unsigned int imm = ((bits (insn, 10, 10) << 11)
1397 | (bits (inst2, 12, 14) << 8)
1398 | bits (inst2, 0, 7));
1400 regs[bits (inst2, 8, 11)]
1401 = pv_constant (thumb_expand_immediate (imm));
1404 else if ((insn & 0xfbf0) == 0xf240) /* movw Rd, #const */
1406 unsigned int imm
1407 = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
1409 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1412 else if (insn == 0xea5f /* mov.w Rd,Rm */
1413 && (inst2 & 0xf0f0) == 0)
1415 int dst_reg = (inst2 & 0x0f00) >> 8;
1416 int src_reg = inst2 & 0xf;
1417 regs[dst_reg] = regs[src_reg];
1420 else if ((insn & 0xff7f) == 0xf85f) /* ldr.w Rt,<label> */
1422 /* Constant pool loads. */
1423 unsigned int constant;
1424 CORE_ADDR loc;
1426 offset = bits (inst2, 0, 11);
1427 if (insn & 0x0080)
1428 loc = start + 4 + offset;
1429 else
1430 loc = start + 4 - offset;
1432 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1433 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1436 else if ((insn & 0xff7f) == 0xe95f) /* ldrd Rt,Rt2,<label> */
1438 /* Constant pool loads. */
1439 unsigned int constant;
1440 CORE_ADDR loc;
1442 offset = bits (inst2, 0, 7) << 2;
1443 if (insn & 0x0080)
1444 loc = start + 4 + offset;
1445 else
1446 loc = start + 4 - offset;
1448 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1449 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1451 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1452 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1454 /* Start of ARMv8.1-m PACBTI extension instructions. */
1455 else if (IS_PAC (whole_insn))
1457 /* LR and SP are input registers. PAC is in R12. LR is
1458 signed from this point onwards. NOP space. */
1459 ra_signed_state = true;
1461 else if (IS_PACBTI (whole_insn))
1463 /* LR and SP are input registers. PAC is in R12 and PC is a
1464 valid BTI landing pad. LR is signed from this point onwards.
1465 NOP space. */
1466 ra_signed_state = true;
1468 else if (IS_BTI (whole_insn))
1470 /* Valid BTI landing pad. NOP space. */
1472 else if (IS_PACG (whole_insn))
1474 /* Sign Rn using Rm and store the PAC in Rd. Rd is signed from
1475 this point onwards. */
1476 ra_signed_state = true;
1478 else if (IS_AUT (whole_insn) || IS_AUTG (whole_insn))
1480 /* These instructions appear close to the epilogue, when signed
1481 pointers are getting authenticated. */
1482 ra_signed_state = false;
1484 /* End of ARMv8.1-m PACBTI extension instructions */
1485 else if (thumb2_instruction_changes_pc (insn, inst2))
1487 /* Don't scan past anything that might change control flow. */
1488 break;
1490 else
1492 /* The optimizer might shove anything into the prologue,
1493 so we just skip what we don't recognize. */
1494 unrecognized_pc = start;
1497 /* Make sure we are dealing with a target that supports ARMv8.1-m
1498 PACBTI. */
1499 if (cache != nullptr && tdep->have_pacbti
1500 && ra_signed_state.has_value ())
1502 arm_debug_printf ("Found pacbti instruction at %s",
1503 paddress (gdbarch, start));
1504 arm_debug_printf ("RA is %s",
1505 *ra_signed_state ? "signed" : "not signed");
1506 cache->ra_signed_state = ra_signed_state;
1509 start += 2;
1511 else if (thumb_instruction_changes_pc (insn))
1513 /* Don't scan past anything that might change control flow. */
1514 break;
1516 else
1518 /* The optimizer might shove anything into the prologue,
1519 so we just skip what we don't recognize. */
1520 unrecognized_pc = start;
1523 start += 2;
1526 arm_debug_printf ("Prologue scan stopped at %s",
1527 paddress (gdbarch, start));
1529 if (unrecognized_pc == 0)
1530 unrecognized_pc = start;
1532 if (cache == NULL)
1533 return unrecognized_pc;
1535 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1537 /* Frame pointer is fp. Frame size is constant. */
1538 cache->framereg = ARM_FP_REGNUM;
1539 cache->framesize = -regs[ARM_FP_REGNUM].k;
1541 else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1543 /* Frame pointer is r7. Frame size is constant. */
1544 cache->framereg = THUMB_FP_REGNUM;
1545 cache->framesize = -regs[THUMB_FP_REGNUM].k;
1547 else
1549 /* Try the stack pointer... this is a bit desperate. */
1550 cache->framereg = ARM_SP_REGNUM;
1551 cache->framesize = -regs[ARM_SP_REGNUM].k;
1554 for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
1555 if (stack.find_reg (gdbarch, i, &offset))
1557 cache->saved_regs[i].set_addr (offset);
1558 if (i == ARM_SP_REGNUM)
1559 arm_cache_set_active_sp_value(cache, tdep, offset);
1562 return unrecognized_pc;
1566 /* Try to analyze the instructions starting from PC, which load symbol
1567 __stack_chk_guard. Return the address of instruction after loading this
1568 symbol, set the dest register number to *BASEREG, and set the size of
1569 instructions for loading symbol in OFFSET. Return 0 if instructions are
1570 not recognized. */
1572 static CORE_ADDR
1573 arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1574 unsigned int *destreg, int *offset)
1576 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1577 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1578 unsigned int low, high, address;
1580 address = 0;
1581 if (is_thumb)
1583 unsigned short insn1
1584 = read_code_unsigned_integer (pc, 2, byte_order_for_code);
1586 if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1588 *destreg = bits (insn1, 8, 10);
1589 *offset = 2;
1590 address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1591 address = read_memory_unsigned_integer (address, 4,
1592 byte_order_for_code);
1594 else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1596 unsigned short insn2
1597 = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
1599 low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1601 insn1
1602 = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
1603 insn2
1604 = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
1606 /* movt Rd, #const */
1607 if ((insn1 & 0xfbc0) == 0xf2c0)
1609 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1610 *destreg = bits (insn2, 8, 11);
1611 *offset = 8;
1612 address = (high << 16 | low);
1616 else
1618 unsigned int insn
1619 = read_code_unsigned_integer (pc, 4, byte_order_for_code);
1621 if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
1623 address = bits (insn, 0, 11) + pc + 8;
1624 address = read_memory_unsigned_integer (address, 4,
1625 byte_order_for_code);
1627 *destreg = bits (insn, 12, 15);
1628 *offset = 4;
1630 else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1632 low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1634 insn
1635 = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
1637 if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1639 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1640 *destreg = bits (insn, 12, 15);
1641 *offset = 8;
1642 address = (high << 16 | low);
1647 return address;
1650 /* Try to skip a sequence of instructions used for stack protector. If PC
1651 points to the first instruction of this sequence, return the address of
1652 first instruction after this sequence, otherwise, return original PC.
1654 On arm, this sequence of instructions is composed of mainly three steps,
1655 Step 1: load symbol __stack_chk_guard,
1656 Step 2: load from address of __stack_chk_guard,
1657 Step 3: store it to somewhere else.
1659 Usually, instructions on step 2 and step 3 are the same on various ARM
1660 architectures. On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1661 on step 3, it is also one instruction 'str Rx, [r7, #immd]'. However,
1662 instructions in step 1 vary from different ARM architectures. On ARMv7,
1663 they are,
1665 movw Rn, #:lower16:__stack_chk_guard
1666 movt Rn, #:upper16:__stack_chk_guard
1668 On ARMv5t, it is,
1670 ldr Rn, .Label
1671 ....
1672 .Lable:
1673 .word __stack_chk_guard
1675 Since ldr/str is a very popular instruction, we can't use them as
1676 'fingerprint' or 'signature' of stack protector sequence. Here we choose
1677 sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1678 stripped, as the 'fingerprint' of a stack protector cdoe sequence. */
1680 static CORE_ADDR
1681 arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1683 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1684 unsigned int basereg;
1685 int offset;
1686 int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1687 CORE_ADDR addr;
1689 /* Try to parse the instructions in Step 1. */
1690 addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1691 &basereg, &offset);
1692 if (!addr)
1693 return pc;
1695 bound_minimal_symbol stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
1696 /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1697 Otherwise, this sequence cannot be for stack protector. */
1698 if (stack_chk_guard.minsym == NULL
1699 || !startswith (stack_chk_guard.minsym->linkage_name (), "__stack_chk_guard"))
1700 return pc;
1702 if (is_thumb)
1704 unsigned int destreg;
1705 unsigned short insn
1706 = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
1708 /* Step 2: ldr Rd, [Rn, #immed], encoding T1. */
1709 if ((insn & 0xf800) != 0x6800)
1710 return pc;
1711 if (bits (insn, 3, 5) != basereg)
1712 return pc;
1713 destreg = bits (insn, 0, 2);
1715 insn = read_code_unsigned_integer (pc + offset + 2, 2,
1716 byte_order_for_code);
1717 /* Step 3: str Rd, [Rn, #immed], encoding T1. */
1718 if ((insn & 0xf800) != 0x6000)
1719 return pc;
1720 if (destreg != bits (insn, 0, 2))
1721 return pc;
1723 else
1725 unsigned int destreg;
1726 unsigned int insn
1727 = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
1729 /* Step 2: ldr Rd, [Rn, #immed], encoding A1. */
1730 if ((insn & 0x0e500000) != 0x04100000)
1731 return pc;
1732 if (bits (insn, 16, 19) != basereg)
1733 return pc;
1734 destreg = bits (insn, 12, 15);
1735 /* Step 3: str Rd, [Rn, #immed], encoding A1. */
1736 insn = read_code_unsigned_integer (pc + offset + 4,
1737 4, byte_order_for_code);
1738 if ((insn & 0x0e500000) != 0x04000000)
1739 return pc;
1740 if (bits (insn, 12, 15) != destreg)
1741 return pc;
1743 /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1744 on arm. */
1745 if (is_thumb)
1746 return pc + offset + 4;
1747 else
1748 return pc + offset + 8;
1751 /* Advance the PC across any function entry prologue instructions to
1752 reach some "real" code.
1754 The APCS (ARM Procedure Call Standard) defines the following
1755 prologue:
1757 mov ip, sp
1758 [stmfd sp!, {a1,a2,a3,a4}]
1759 stmfd sp!, {...,fp,ip,lr,pc}
1760 [stfe f7, [sp, #-12]!]
1761 [stfe f6, [sp, #-12]!]
1762 [stfe f5, [sp, #-12]!]
1763 [stfe f4, [sp, #-12]!]
1764 sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn. */
1766 static CORE_ADDR
1767 arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1769 CORE_ADDR func_addr, func_end_addr, limit_pc;
1771 /* See if we can determine the end of the prologue via the symbol table.
1772 If so, then return either PC, or the PC after the prologue, whichever
1773 is greater. */
1774 bool func_addr_found
1775 = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr);
1777 /* Whether the function is thumb mode or not. */
1778 bool func_is_thumb = false;
1780 if (func_addr_found)
1782 CORE_ADDR post_prologue_pc
1783 = skip_prologue_using_sal (gdbarch, func_addr);
1784 struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
1786 if (post_prologue_pc)
1787 post_prologue_pc
1788 = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1791 /* GCC always emits a line note before the prologue and another
1792 one after, even if the two are at the same address or on the
1793 same line. Take advantage of this so that we do not need to
1794 know every instruction that might appear in the prologue. We
1795 will have producer information for most binaries; if it is
1796 missing (e.g. for -gstabs), assuming the GNU tools. */
1797 if (post_prologue_pc
1798 && (cust == NULL
1799 || cust->producer () == NULL
1800 || startswith (cust->producer (), "GNU ")
1801 || producer_is_llvm (cust->producer ())))
1802 return post_prologue_pc;
1804 if (post_prologue_pc != 0)
1806 CORE_ADDR analyzed_limit;
1808 /* For non-GCC compilers, make sure the entire line is an
1809 acceptable prologue; GDB will round this function's
1810 return value up to the end of the following line so we
1811 can not skip just part of a line (and we do not want to).
1813 RealView does not treat the prologue specially, but does
1814 associate prologue code with the opening brace; so this
1815 lets us skip the first line if we think it is the opening
1816 brace. */
1817 func_is_thumb = arm_pc_is_thumb (gdbarch, func_addr);
1818 if (func_is_thumb)
1819 analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1820 post_prologue_pc, NULL);
1821 else
1822 analyzed_limit
1823 = arm_analyze_prologue (gdbarch, func_addr, post_prologue_pc,
1824 NULL, target_arm_instruction_reader ());
1826 if (analyzed_limit != post_prologue_pc)
1827 return func_addr;
1829 return post_prologue_pc;
1833 /* Can't determine prologue from the symbol table, need to examine
1834 instructions. */
1836 /* Find an upper limit on the function prologue using the debug
1837 information. If the debug information could not be used to provide
1838 that bound, then use an arbitrary large number as the upper bound. */
1839 /* Like arm_scan_prologue, stop no later than pc + 64. */
1840 limit_pc = skip_prologue_using_sal (gdbarch, pc);
1841 if (limit_pc == 0)
1842 limit_pc = pc + 64; /* Magic. */
1844 /* Set the correct adjustment based on whether the function is thumb mode or
1845 not. We use it to get the address of the last instruction in the
1846 function (as opposed to the first address of the next function). */
1847 CORE_ADDR adjustment = func_is_thumb ? 2 : 4;
1849 limit_pc
1850 = func_end_addr == 0 ? limit_pc : std::min (limit_pc,
1851 func_end_addr - adjustment);
1853 /* Check if this is Thumb code. */
1854 if (arm_pc_is_thumb (gdbarch, pc))
1855 return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
1856 else
1857 return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL,
1858 target_arm_instruction_reader ());
1861 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1862 This function decodes a Thumb function prologue to determine:
1863 1) the size of the stack frame
1864 2) which registers are saved on it
1865 3) the offsets of saved regs
1866 4) the offset from the stack pointer to the frame pointer
1868 A typical Thumb function prologue would create this stack frame
1869 (offsets relative to FP)
1870 old SP -> 24 stack parameters
1871 20 LR
1872 16 R7
1873 R7 -> 0 local variables (16 bytes)
1874 SP -> -12 additional stack space (12 bytes)
1875 The frame size would thus be 36 bytes, and the frame offset would be
1876 12 bytes. The frame register is R7.
1878 The comments for thumb_skip_prolog() describe the algorithm we use
1879 to detect the end of the prolog. */
1881 static void
1882 thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
1883 CORE_ADDR block_addr, struct arm_prologue_cache *cache)
1885 CORE_ADDR prologue_start;
1886 CORE_ADDR prologue_end;
1888 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1889 &prologue_end))
1891 /* See comment in arm_scan_prologue for an explanation of
1892 this heuristics. */
1893 if (prologue_end > prologue_start + 64)
1895 prologue_end = prologue_start + 64;
1898 else
1899 /* We're in the boondocks: we have no idea where the start of the
1900 function is. */
1901 return;
1903 prologue_end = std::min (prologue_end, prev_pc);
1905 thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
1908 /* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1909 otherwise. */
1911 static int
1912 arm_instruction_restores_sp (unsigned int insn)
1914 if (bits (insn, 28, 31) != INST_NV)
1916 if ((insn & 0x0df0f000) == 0x0080d000
1917 /* ADD SP (register or immediate). */
1918 || (insn & 0x0df0f000) == 0x0040d000
1919 /* SUB SP (register or immediate). */
1920 || (insn & 0x0ffffff0) == 0x01a0d000
1921 /* MOV SP. */
1922 || (insn & 0x0fff0000) == 0x08bd0000
1923 /* POP (LDMIA). */
1924 || (insn & 0x0fff0000) == 0x049d0000)
1925 /* POP of a single register. */
1926 return 1;
1929 return 0;
1932 /* Implement immediate value decoding, as described in section A5.2.4
1933 (Modified immediate constants in ARM instructions) of the ARM Architecture
1934 Reference Manual (ARMv7-A and ARMv7-R edition). */
1936 static uint32_t
1937 arm_expand_immediate (uint32_t imm)
1939 /* Immediate values are 12 bits long. */
1940 gdb_assert ((imm & 0xfffff000) == 0);
1942 uint32_t unrotated_value = imm & 0xff;
1943 uint32_t rotate_amount = (imm & 0xf00) >> 7;
1945 if (rotate_amount == 0)
1946 return unrotated_value;
1948 return ((unrotated_value >> rotate_amount)
1949 | (unrotated_value << (32 - rotate_amount)));
1952 /* Analyze an ARM mode prologue starting at PROLOGUE_START and
1953 continuing no further than PROLOGUE_END. If CACHE is non-NULL,
1954 fill it in. Return the first address not recognized as a prologue
1955 instruction.
1957 We recognize all the instructions typically found in ARM prologues,
1958 plus harmless instructions which can be skipped (either for analysis
1959 purposes, or a more restrictive set that can be skipped when finding
1960 the end of the prologue). */
1962 static CORE_ADDR
1963 arm_analyze_prologue (struct gdbarch *gdbarch,
1964 CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1965 struct arm_prologue_cache *cache,
1966 const arm_instruction_reader &insn_reader)
1968 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1969 int regno;
1970 CORE_ADDR offset, current_pc;
1971 pv_t regs[ARM_FPS_REGNUM];
1972 CORE_ADDR unrecognized_pc = 0;
1973 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1975 /* Search the prologue looking for instructions that set up the
1976 frame pointer, adjust the stack pointer, and save registers.
1978 Be careful, however, and if it doesn't look like a prologue,
1979 don't try to scan it. If, for instance, a frameless function
1980 begins with stmfd sp!, then we will tell ourselves there is
1981 a frame, which will confuse stack traceback, as well as "finish"
1982 and other operations that rely on a knowledge of the stack
1983 traceback. */
1985 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1986 regs[regno] = pv_register (regno, 0);
1987 pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1989 for (current_pc = prologue_start;
1990 current_pc < prologue_end;
1991 current_pc += 4)
1993 uint32_t insn = insn_reader.read (current_pc, byte_order_for_code);
1995 if (insn == 0xe1a0c00d) /* mov ip, sp */
1997 regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
1998 continue;
2000 else if ((insn & 0xfff00000) == 0xe2800000 /* add Rd, Rn, #n */
2001 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2003 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2004 int rd = bits (insn, 12, 15);
2005 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
2006 continue;
2008 else if ((insn & 0xfff00000) == 0xe2400000 /* sub Rd, Rn, #n */
2009 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2011 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2012 int rd = bits (insn, 12, 15);
2013 regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
2014 continue;
2016 else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
2017 [sp, #-4]! */
2019 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2020 break;
2021 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2022 stack.store (regs[ARM_SP_REGNUM], 4,
2023 regs[bits (insn, 12, 15)]);
2024 continue;
2026 else if ((insn & 0xffff0000) == 0xe92d0000)
2027 /* stmfd sp!, {..., fp, ip, lr, pc}
2029 stmfd sp!, {a1, a2, a3, a4} */
2031 int mask = insn & 0xffff;
2033 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2034 break;
2036 /* Calculate offsets of saved registers. */
2037 for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
2038 if (mask & (1 << regno))
2040 regs[ARM_SP_REGNUM]
2041 = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2042 stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
2045 else if ((insn & 0xffff0000) == 0xe54b0000 /* strb rx,[r11,#-n] */
2046 || (insn & 0xffff00f0) == 0xe14b00b0 /* strh rx,[r11,#-n] */
2047 || (insn & 0xffffc000) == 0xe50b0000) /* str rx,[r11,#-n] */
2049 /* No need to add this to saved_regs -- it's just an arg reg. */
2050 continue;
2052 else if ((insn & 0xffff0000) == 0xe5cd0000 /* strb rx,[sp,#n] */
2053 || (insn & 0xffff00f0) == 0xe1cd00b0 /* strh rx,[sp,#n] */
2054 || (insn & 0xffffc000) == 0xe58d0000) /* str rx,[sp,#n] */
2056 /* No need to add this to saved_regs -- it's just an arg reg. */
2057 continue;
2059 else if ((insn & 0xfff00000) == 0xe8800000 /* stm Rn,
2060 { registers } */
2061 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2063 /* No need to add this to saved_regs -- it's just arg regs. */
2064 continue;
2066 else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
2068 uint32_t imm = arm_expand_immediate (insn & 0xfff);
2069 regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
2071 else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
2073 uint32_t imm = arm_expand_immediate(insn & 0xfff);
2074 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
2076 else if ((insn & 0xffff7fff) == 0xed6d0103 /* stfe f?,
2077 [sp, -#c]! */
2078 && tdep->have_fpa_registers)
2080 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2081 break;
2083 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2084 regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
2085 stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
2087 else if ((insn & 0xffbf0fff) == 0xec2d0200 /* sfmfd f0, 4,
2088 [sp!] */
2089 && tdep->have_fpa_registers)
2091 int n_saved_fp_regs;
2092 unsigned int fp_start_reg, fp_bound_reg;
2094 if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2095 break;
2097 if ((insn & 0x800) == 0x800) /* N0 is set */
2099 if ((insn & 0x40000) == 0x40000) /* N1 is set */
2100 n_saved_fp_regs = 3;
2101 else
2102 n_saved_fp_regs = 1;
2104 else
2106 if ((insn & 0x40000) == 0x40000) /* N1 is set */
2107 n_saved_fp_regs = 2;
2108 else
2109 n_saved_fp_regs = 4;
2112 fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
2113 fp_bound_reg = fp_start_reg + n_saved_fp_regs;
2114 for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
2116 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2117 stack.store (regs[ARM_SP_REGNUM], 12,
2118 regs[fp_start_reg++]);
2121 else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
2123 /* Allow some special function calls when skipping the
2124 prologue; GCC generates these before storing arguments to
2125 the stack. */
2126 CORE_ADDR dest = BranchDest (current_pc, insn);
2128 if (skip_prologue_function (gdbarch, dest, 0))
2129 continue;
2130 else
2131 break;
2133 else if ((insn & 0xf0000000) != 0xe0000000)
2134 break; /* Condition not true, exit early. */
2135 else if (arm_instruction_changes_pc (insn))
2136 /* Don't scan past anything that might change control flow. */
2137 break;
2138 else if (arm_instruction_restores_sp (insn))
2140 /* Don't scan past the epilogue. */
2141 break;
2143 else if ((insn & 0xfe500000) == 0xe8100000 /* ldm */
2144 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2145 /* Ignore block loads from the stack, potentially copying
2146 parameters from memory. */
2147 continue;
2148 else if ((insn & 0xfc500000) == 0xe4100000
2149 && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2150 /* Similarly ignore single loads from the stack. */
2151 continue;
2152 else if ((insn & 0xffff0ff0) == 0xe1a00000)
2153 /* MOV Rd, Rm. Skip register copies, i.e. saves to another
2154 register instead of the stack. */
2155 continue;
2156 else
2158 /* The optimizer might shove anything into the prologue, if
2159 we build up cache (cache != NULL) from scanning prologue,
2160 we just skip what we don't recognize and scan further to
2161 make cache as complete as possible. However, if we skip
2162 prologue, we'll stop immediately on unrecognized
2163 instruction. */
2164 unrecognized_pc = current_pc;
2165 if (cache != NULL)
2166 continue;
2167 else
2168 break;
2172 if (unrecognized_pc == 0)
2173 unrecognized_pc = current_pc;
2175 if (cache)
2177 int framereg, framesize;
2179 /* The frame size is just the distance from the frame register
2180 to the original stack pointer. */
2181 if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
2183 /* Frame pointer is fp. */
2184 framereg = ARM_FP_REGNUM;
2185 framesize = -regs[ARM_FP_REGNUM].k;
2187 else
2189 /* Try the stack pointer... this is a bit desperate. */
2190 framereg = ARM_SP_REGNUM;
2191 framesize = -regs[ARM_SP_REGNUM].k;
2194 cache->framereg = framereg;
2195 cache->framesize = framesize;
2197 for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
2198 if (stack.find_reg (gdbarch, regno, &offset))
2200 cache->saved_regs[regno].set_addr (offset);
2201 if (regno == ARM_SP_REGNUM)
2202 arm_cache_set_active_sp_value(cache, tdep, offset);
2206 arm_debug_printf ("Prologue scan stopped at %s",
2207 paddress (gdbarch, unrecognized_pc));
2209 return unrecognized_pc;
2212 static void
2213 arm_scan_prologue (const frame_info_ptr &this_frame,
2214 struct arm_prologue_cache *cache)
2216 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2217 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2218 CORE_ADDR prologue_start, prologue_end;
2219 CORE_ADDR prev_pc = get_frame_pc (this_frame);
2220 CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
2221 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2223 /* Assume there is no frame until proven otherwise. */
2224 cache->framereg = ARM_SP_REGNUM;
2225 cache->framesize = 0;
2227 /* Check for Thumb prologue. */
2228 if (arm_frame_is_thumb (this_frame))
2230 thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
2231 return;
2234 /* Find the function prologue. If we can't find the function in
2235 the symbol table, peek in the stack frame to find the PC. */
2236 if (find_pc_partial_function (block_addr, NULL, &prologue_start,
2237 &prologue_end))
2239 /* One way to find the end of the prologue (which works well
2240 for unoptimized code) is to do the following:
2242 struct symtab_and_line sal = find_pc_line (prologue_start, 0);
2244 if (sal.line == 0)
2245 prologue_end = prev_pc;
2246 else if (sal.end < prologue_end)
2247 prologue_end = sal.end;
2249 This mechanism is very accurate so long as the optimizer
2250 doesn't move any instructions from the function body into the
2251 prologue. If this happens, sal.end will be the last
2252 instruction in the first hunk of prologue code just before
2253 the first instruction that the scheduler has moved from
2254 the body to the prologue.
2256 In order to make sure that we scan all of the prologue
2257 instructions, we use a slightly less accurate mechanism which
2258 may scan more than necessary. To help compensate for this
2259 lack of accuracy, the prologue scanning loop below contains
2260 several clauses which'll cause the loop to terminate early if
2261 an implausible prologue instruction is encountered.
2263 The expression
2265 prologue_start + 64
2267 is a suitable endpoint since it accounts for the largest
2268 possible prologue plus up to five instructions inserted by
2269 the scheduler. */
2271 if (prologue_end > prologue_start + 64)
2273 prologue_end = prologue_start + 64; /* See above. */
2276 else
2278 /* We have no symbol information. Our only option is to assume this
2279 function has a standard stack frame and the normal frame register.
2280 Then, we can find the value of our frame pointer on entrance to
2281 the callee (or at the present moment if this is the innermost frame).
2282 The value stored there should be the address of the stmfd + 8. */
2283 CORE_ADDR frame_loc;
2284 ULONGEST return_value;
2286 /* AAPCS does not use a frame register, so we can abort here. */
2287 if (tdep->arm_abi == ARM_ABI_AAPCS)
2288 return;
2290 frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
2291 if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
2292 &return_value))
2293 return;
2294 else
2296 prologue_start = gdbarch_addr_bits_remove
2297 (gdbarch, return_value) - 8;
2298 prologue_end = prologue_start + 64; /* See above. */
2302 if (prev_pc < prologue_end)
2303 prologue_end = prev_pc;
2305 arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache,
2306 target_arm_instruction_reader ());
2309 static struct arm_prologue_cache *
2310 arm_make_prologue_cache (const frame_info_ptr &this_frame)
2312 int reg;
2313 struct arm_prologue_cache *cache;
2314 CORE_ADDR unwound_fp, prev_sp;
2316 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2317 arm_cache_init (cache, this_frame);
2319 arm_scan_prologue (this_frame, cache);
2321 unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
2322 if (unwound_fp == 0)
2323 return cache;
2325 arm_gdbarch_tdep *tdep =
2326 gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2328 prev_sp = unwound_fp + cache->framesize;
2329 arm_cache_set_active_sp_value (cache, tdep, prev_sp);
2331 /* Calculate actual addresses of saved registers using offsets
2332 determined by arm_scan_prologue. */
2333 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2334 if (cache->saved_regs[reg].is_addr ())
2335 cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr () +
2336 prev_sp);
2338 return cache;
2341 /* Implementation of the stop_reason hook for arm_prologue frames. */
2343 static enum unwind_stop_reason
2344 arm_prologue_unwind_stop_reason (const frame_info_ptr &this_frame,
2345 void **this_cache)
2347 struct arm_prologue_cache *cache;
2348 CORE_ADDR pc;
2350 if (*this_cache == NULL)
2351 *this_cache = arm_make_prologue_cache (this_frame);
2352 cache = (struct arm_prologue_cache *) *this_cache;
2354 /* This is meant to halt the backtrace at "_start". */
2355 pc = get_frame_pc (this_frame);
2356 gdbarch *arch = get_frame_arch (this_frame);
2357 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
2358 if (pc <= tdep->lowest_pc)
2359 return UNWIND_OUTERMOST;
2361 /* If we've hit a wall, stop. */
2362 if (arm_cache_get_prev_sp_value (cache, tdep) == 0)
2363 return UNWIND_OUTERMOST;
2365 return UNWIND_NO_REASON;
2368 /* Our frame ID for a normal frame is the current function's starting PC
2369 and the caller's SP when we were called. */
2371 static void
2372 arm_prologue_this_id (const frame_info_ptr &this_frame,
2373 void **this_cache,
2374 struct frame_id *this_id)
2376 struct arm_prologue_cache *cache;
2377 struct frame_id id;
2378 CORE_ADDR pc, func;
2380 if (*this_cache == NULL)
2381 *this_cache = arm_make_prologue_cache (this_frame);
2382 cache = (struct arm_prologue_cache *) *this_cache;
2384 arm_gdbarch_tdep *tdep
2385 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2387 /* Use function start address as part of the frame ID. If we cannot
2388 identify the start address (due to missing symbol information),
2389 fall back to just using the current PC. */
2390 pc = get_frame_pc (this_frame);
2391 func = get_frame_func (this_frame);
2392 if (!func)
2393 func = pc;
2395 id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func);
2396 *this_id = id;
2399 static struct value *
2400 arm_prologue_prev_register (const frame_info_ptr &this_frame,
2401 void **this_cache,
2402 int prev_regnum)
2404 struct gdbarch *gdbarch = get_frame_arch (this_frame);
2405 struct arm_prologue_cache *cache;
2406 CORE_ADDR sp_value;
2408 if (*this_cache == NULL)
2409 *this_cache = arm_make_prologue_cache (this_frame);
2410 cache = (struct arm_prologue_cache *) *this_cache;
2412 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2414 /* If this frame has signed the return address, mark it as so. */
2415 if (tdep->have_pacbti && cache->ra_signed_state.has_value ()
2416 && *cache->ra_signed_state)
2417 set_frame_previous_pc_masked (this_frame);
2419 /* If we are asked to unwind the PC, then we need to return the LR
2420 instead. The prologue may save PC, but it will point into this
2421 frame's prologue, not the next frame's resume location. Also
2422 strip the saved T bit. A valid LR may have the low bit set, but
2423 a valid PC never does. */
2424 if (prev_regnum == ARM_PC_REGNUM)
2426 CORE_ADDR lr;
2428 lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2429 return frame_unwind_got_constant (this_frame, prev_regnum,
2430 arm_addr_bits_remove (gdbarch, lr));
2433 /* SP is generally not saved to the stack, but this frame is
2434 identified by the next frame's stack pointer at the time of the call.
2435 The value was already reconstructed into PREV_SP. */
2436 if (prev_regnum == ARM_SP_REGNUM)
2437 return frame_unwind_got_constant (this_frame, prev_regnum,
2438 arm_cache_get_prev_sp_value (cache, tdep));
2440 /* The value might be one of the alternative SP, if so, use the
2441 value already constructed. */
2442 if (arm_is_alternative_sp_register (tdep, prev_regnum))
2444 sp_value = arm_cache_get_sp_register (cache, tdep, prev_regnum);
2445 return frame_unwind_got_constant (this_frame, prev_regnum, sp_value);
2448 /* The CPSR may have been changed by the call instruction and by the
2449 called function. The only bit we can reconstruct is the T bit,
2450 by checking the low bit of LR as of the call. This is a reliable
2451 indicator of Thumb-ness except for some ARM v4T pre-interworking
2452 Thumb code, which could get away with a clear low bit as long as
2453 the called function did not use bx. Guess that all other
2454 bits are unchanged; the condition flags are presumably lost,
2455 but the processor status is likely valid. */
2456 if (prev_regnum == ARM_PS_REGNUM)
2458 ULONGEST cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
2459 CORE_ADDR lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2461 cpsr = reconstruct_t_bit (gdbarch, lr, cpsr);
2462 return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
2465 return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2466 prev_regnum);
2469 static const frame_unwind_legacy arm_prologue_unwind (
2470 "arm prologue",
2471 NORMAL_FRAME,
2472 FRAME_UNWIND_ARCH,
2473 arm_prologue_unwind_stop_reason,
2474 arm_prologue_this_id,
2475 arm_prologue_prev_register,
2476 NULL,
2477 default_frame_sniffer
2480 /* Maintain a list of ARM exception table entries per objfile, similar to the
2481 list of mapping symbols. We only cache entries for standard ARM-defined
2482 personality routines; the cache will contain only the frame unwinding
2483 instructions associated with the entry (not the descriptors). */
2485 struct arm_exidx_entry
2487 CORE_ADDR addr;
2488 gdb_byte *entry;
2490 bool operator< (const arm_exidx_entry &other) const
2492 return addr < other.addr;
2496 struct arm_exidx_data
2498 std::vector<std::vector<arm_exidx_entry>> section_maps;
2501 /* Per-BFD key to store exception handling information. */
2502 static const registry<bfd>::key<arm_exidx_data> arm_exidx_data_key;
2504 static struct obj_section *
2505 arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2507 for (obj_section *osect : objfile->sections ())
2508 if (bfd_section_flags (osect->the_bfd_section) & SEC_ALLOC)
2510 bfd_vma start, size;
2511 start = bfd_section_vma (osect->the_bfd_section);
2512 size = bfd_section_size (osect->the_bfd_section);
2514 if (start <= vma && vma < start + size)
2515 return osect;
2518 return NULL;
2521 /* Parse contents of exception table and exception index sections
2522 of OBJFILE, and fill in the exception table entry cache.
2524 For each entry that refers to a standard ARM-defined personality
2525 routine, extract the frame unwinding instructions (from either
2526 the index or the table section). The unwinding instructions
2527 are normalized by:
2528 - extracting them from the rest of the table data
2529 - converting to host endianness
2530 - appending the implicit 0xb0 ("Finish") code
2532 The extracted and normalized instructions are stored for later
2533 retrieval by the arm_find_exidx_entry routine. */
2535 static void
2536 arm_exidx_new_objfile (struct objfile *objfile)
2538 struct arm_exidx_data *data;
2539 asection *exidx, *extab;
2540 bfd_vma exidx_vma = 0, extab_vma = 0;
2541 LONGEST i;
2543 /* If we've already touched this file, do nothing. */
2544 if (arm_exidx_data_key.get (objfile->obfd.get ()) != nullptr)
2545 return;
2547 /* Read contents of exception table and index. */
2548 exidx = bfd_get_section_by_name (objfile->obfd.get (),
2549 ELF_STRING_ARM_unwind);
2550 gdb::byte_vector exidx_data;
2551 if (exidx)
2553 exidx_vma = bfd_section_vma (exidx);
2554 exidx_data.resize (bfd_section_size (exidx));
2556 if (!bfd_get_section_contents (objfile->obfd.get (), exidx,
2557 exidx_data.data (), 0,
2558 exidx_data.size ()))
2559 return;
2562 extab = bfd_get_section_by_name (objfile->obfd.get (), ".ARM.extab");
2563 gdb::byte_vector extab_data;
2564 if (extab)
2566 extab_vma = bfd_section_vma (extab);
2567 extab_data.resize (bfd_section_size (extab));
2569 if (!bfd_get_section_contents (objfile->obfd.get (), extab,
2570 extab_data.data (), 0,
2571 extab_data.size ()))
2572 return;
2575 /* Allocate exception table data structure. */
2576 data = arm_exidx_data_key.emplace (objfile->obfd.get ());
2577 data->section_maps.resize (objfile->obfd->section_count);
2579 /* Fill in exception table. */
2580 for (i = 0; i < exidx_data.size () / 8; i++)
2582 struct arm_exidx_entry new_exidx_entry;
2583 bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data.data () + i * 8);
2584 bfd_vma val = bfd_h_get_32 (objfile->obfd,
2585 exidx_data.data () + i * 8 + 4);
2586 bfd_vma addr = 0, word = 0;
2587 int n_bytes = 0, n_words = 0;
2588 struct obj_section *sec;
2589 gdb_byte *entry = NULL;
2591 /* Extract address of start of function. */
2592 idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2593 idx += exidx_vma + i * 8;
2595 /* Find section containing function and compute section offset. */
2596 sec = arm_obj_section_from_vma (objfile, idx);
2597 if (sec == NULL)
2598 continue;
2599 idx -= bfd_section_vma (sec->the_bfd_section);
2601 /* Determine address of exception table entry. */
2602 if (val == 1)
2604 /* EXIDX_CANTUNWIND -- no exception table entry present. */
2606 else if ((val & 0xff000000) == 0x80000000)
2608 /* Exception table entry embedded in .ARM.exidx
2609 -- must be short form. */
2610 word = val;
2611 n_bytes = 3;
2613 else if (!(val & 0x80000000))
2615 /* Exception table entry in .ARM.extab. */
2616 addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2617 addr += exidx_vma + i * 8 + 4;
2619 if (addr >= extab_vma && addr + 4 <= extab_vma + extab_data.size ())
2621 word = bfd_h_get_32 (objfile->obfd,
2622 extab_data.data () + addr - extab_vma);
2623 addr += 4;
2625 if ((word & 0xff000000) == 0x80000000)
2627 /* Short form. */
2628 n_bytes = 3;
2630 else if ((word & 0xff000000) == 0x81000000
2631 || (word & 0xff000000) == 0x82000000)
2633 /* Long form. */
2634 n_bytes = 2;
2635 n_words = ((word >> 16) & 0xff);
2637 else if (!(word & 0x80000000))
2639 bfd_vma pers;
2640 struct obj_section *pers_sec;
2641 int gnu_personality = 0;
2643 /* Custom personality routine. */
2644 pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2645 pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2647 /* Check whether we've got one of the variants of the
2648 GNU personality routines. */
2649 pers_sec = arm_obj_section_from_vma (objfile, pers);
2650 if (pers_sec)
2652 static const char *personality[] =
2654 "__gcc_personality_v0",
2655 "__gxx_personality_v0",
2656 "__gcj_personality_v0",
2657 "__gnu_objc_personality_v0",
2658 NULL
2661 CORE_ADDR pc = pers + pers_sec->offset ();
2662 int k;
2664 for (k = 0; personality[k]; k++)
2665 if (lookup_minimal_symbol_by_pc_name
2666 (pc, personality[k], objfile))
2668 gnu_personality = 1;
2669 break;
2673 /* If so, the next word contains a word count in the high
2674 byte, followed by the same unwind instructions as the
2675 pre-defined forms. */
2676 if (gnu_personality
2677 && addr + 4 <= extab_vma + extab_data.size ())
2679 word = bfd_h_get_32 (objfile->obfd,
2680 (extab_data.data ()
2681 + addr - extab_vma));
2682 addr += 4;
2683 n_bytes = 3;
2684 n_words = ((word >> 24) & 0xff);
2690 /* Sanity check address. */
2691 if (n_words)
2692 if (addr < extab_vma
2693 || addr + 4 * n_words > extab_vma + extab_data.size ())
2694 n_words = n_bytes = 0;
2696 /* The unwind instructions reside in WORD (only the N_BYTES least
2697 significant bytes are valid), followed by N_WORDS words in the
2698 extab section starting at ADDR. */
2699 if (n_bytes || n_words)
2701 gdb_byte *p = entry
2702 = (gdb_byte *) obstack_alloc (&objfile->per_bfd->storage_obstack,
2703 n_bytes + n_words * 4 + 1);
2705 while (n_bytes--)
2706 *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2708 while (n_words--)
2710 word = bfd_h_get_32 (objfile->obfd,
2711 extab_data.data () + addr - extab_vma);
2712 addr += 4;
2714 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2715 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2716 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2717 *p++ = (gdb_byte) (word & 0xff);
2720 /* Implied "Finish" to terminate the list. */
2721 *p++ = 0xb0;
2724 /* Push entry onto vector. They are guaranteed to always
2725 appear in order of increasing addresses. */
2726 new_exidx_entry.addr = idx;
2727 new_exidx_entry.entry = entry;
2728 data->section_maps[sec->the_bfd_section->index].push_back
2729 (new_exidx_entry);
2733 /* Search for the exception table entry covering MEMADDR. If one is found,
2734 return a pointer to its data. Otherwise, return 0. If START is non-NULL,
2735 set *START to the start of the region covered by this entry. */
2737 static gdb_byte *
2738 arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2740 struct obj_section *sec;
2742 sec = find_pc_section (memaddr);
2743 if (sec != NULL)
2745 struct arm_exidx_data *data;
2746 struct arm_exidx_entry map_key = { memaddr - sec->addr (), 0 };
2748 data = arm_exidx_data_key.get (sec->objfile->obfd.get ());
2749 if (data != NULL)
2751 std::vector<arm_exidx_entry> &map
2752 = data->section_maps[sec->the_bfd_section->index];
2753 if (!map.empty ())
2755 auto idx = std::lower_bound (map.begin (), map.end (), map_key);
2757 /* std::lower_bound finds the earliest ordered insertion
2758 point. If the following symbol starts at this exact
2759 address, we use that; otherwise, the preceding
2760 exception table entry covers this address. */
2761 if (idx < map.end ())
2763 if (idx->addr == map_key.addr)
2765 if (start)
2766 *start = idx->addr + sec->addr ();
2767 return idx->entry;
2771 if (idx > map.begin ())
2773 idx = idx - 1;
2774 if (start)
2775 *start = idx->addr + sec->addr ();
2776 return idx->entry;
2782 return NULL;
2785 /* Given the current frame THIS_FRAME, and its associated frame unwinding
2786 instruction list from the ARM exception table entry ENTRY, allocate and
2787 return a prologue cache structure describing how to unwind this frame.
2789 Return NULL if the unwinding instruction list contains a "spare",
2790 "reserved" or "refuse to unwind" instruction as defined in section
2791 "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2792 for the ARM Architecture" document. */
2794 static struct arm_prologue_cache *
2795 arm_exidx_fill_cache (const frame_info_ptr &this_frame, gdb_byte *entry)
2797 CORE_ADDR vsp = 0;
2798 int vsp_valid = 0;
2800 struct arm_prologue_cache *cache;
2801 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2802 arm_cache_init (cache, this_frame);
2804 for (;;)
2806 gdb_byte insn;
2808 /* Whenever we reload SP, we actually have to retrieve its
2809 actual value in the current frame. */
2810 if (!vsp_valid)
2812 if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
2814 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
2815 vsp = get_frame_register_unsigned (this_frame, reg);
2817 else
2819 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr ();
2820 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2823 vsp_valid = 1;
2826 /* Decode next unwind instruction. */
2827 insn = *entry++;
2829 if ((insn & 0xc0) == 0)
2831 int offset = insn & 0x3f;
2832 vsp += (offset << 2) + 4;
2834 else if ((insn & 0xc0) == 0x40)
2836 int offset = insn & 0x3f;
2837 vsp -= (offset << 2) + 4;
2839 else if ((insn & 0xf0) == 0x80)
2841 int mask = ((insn & 0xf) << 8) | *entry++;
2842 int i;
2844 /* The special case of an all-zero mask identifies
2845 "Refuse to unwind". We return NULL to fall back
2846 to the prologue analyzer. */
2847 if (mask == 0)
2848 return NULL;
2850 /* Pop registers r4..r15 under mask. */
2851 for (i = 0; i < 12; i++)
2852 if (mask & (1 << i))
2854 cache->saved_regs[4 + i].set_addr (vsp);
2855 vsp += 4;
2858 /* Special-case popping SP -- we need to reload vsp. */
2859 if (mask & (1 << (ARM_SP_REGNUM - 4)))
2860 vsp_valid = 0;
2862 else if ((insn & 0xf0) == 0x90)
2864 int reg = insn & 0xf;
2866 /* Reserved cases. */
2867 if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2868 return NULL;
2870 /* Set SP from another register and mark VSP for reload. */
2871 cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2872 vsp_valid = 0;
2874 else if ((insn & 0xf0) == 0xa0)
2876 int count = insn & 0x7;
2877 int pop_lr = (insn & 0x8) != 0;
2878 int i;
2880 /* Pop r4..r[4+count]. */
2881 for (i = 0; i <= count; i++)
2883 cache->saved_regs[4 + i].set_addr (vsp);
2884 vsp += 4;
2887 /* If indicated by flag, pop LR as well. */
2888 if (pop_lr)
2890 cache->saved_regs[ARM_LR_REGNUM].set_addr (vsp);
2891 vsp += 4;
2894 else if (insn == 0xb0)
2896 /* We could only have updated PC by popping into it; if so, it
2897 will show up as address. Otherwise, copy LR into PC. */
2898 if (!cache->saved_regs[ARM_PC_REGNUM].is_addr ())
2899 cache->saved_regs[ARM_PC_REGNUM]
2900 = cache->saved_regs[ARM_LR_REGNUM];
2902 /* We're done. */
2903 break;
2905 else if (insn == 0xb1)
2907 int mask = *entry++;
2908 int i;
2910 /* All-zero mask and mask >= 16 is "spare". */
2911 if (mask == 0 || mask >= 16)
2912 return NULL;
2914 /* Pop r0..r3 under mask. */
2915 for (i = 0; i < 4; i++)
2916 if (mask & (1 << i))
2918 cache->saved_regs[i].set_addr (vsp);
2919 vsp += 4;
2922 else if (insn == 0xb2)
2924 ULONGEST offset = 0;
2925 unsigned shift = 0;
2929 offset |= (*entry & 0x7f) << shift;
2930 shift += 7;
2932 while (*entry++ & 0x80);
2934 vsp += 0x204 + (offset << 2);
2936 else if (insn == 0xb3)
2938 int start = *entry >> 4;
2939 int count = (*entry++) & 0xf;
2940 int i;
2942 /* Only registers D0..D15 are valid here. */
2943 if (start + count >= 16)
2944 return NULL;
2946 /* Pop VFP double-precision registers D[start]..D[start+count]. */
2947 for (i = 0; i <= count; i++)
2949 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
2950 vsp += 8;
2953 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2954 vsp += 4;
2956 else if ((insn & 0xf8) == 0xb8)
2958 int count = insn & 0x7;
2959 int i;
2961 /* Pop VFP double-precision registers D[8]..D[8+count]. */
2962 for (i = 0; i <= count; i++)
2964 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
2965 vsp += 8;
2968 /* Add an extra 4 bytes for FSTMFDX-style stack. */
2969 vsp += 4;
2971 else if (insn == 0xc6)
2973 int start = *entry >> 4;
2974 int count = (*entry++) & 0xf;
2975 int i;
2977 /* Only registers WR0..WR15 are valid. */
2978 if (start + count >= 16)
2979 return NULL;
2981 /* Pop iwmmx registers WR[start]..WR[start+count]. */
2982 for (i = 0; i <= count; i++)
2984 cache->saved_regs[ARM_WR0_REGNUM + start + i].set_addr (vsp);
2985 vsp += 8;
2988 else if (insn == 0xc7)
2990 int mask = *entry++;
2991 int i;
2993 /* All-zero mask and mask >= 16 is "spare". */
2994 if (mask == 0 || mask >= 16)
2995 return NULL;
2997 /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask. */
2998 for (i = 0; i < 4; i++)
2999 if (mask & (1 << i))
3001 cache->saved_regs[ARM_WCGR0_REGNUM + i].set_addr (vsp);
3002 vsp += 4;
3005 else if ((insn & 0xf8) == 0xc0)
3007 int count = insn & 0x7;
3008 int i;
3010 /* Pop iwmmx registers WR[10]..WR[10+count]. */
3011 for (i = 0; i <= count; i++)
3013 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].set_addr (vsp);
3014 vsp += 8;
3017 else if (insn == 0xc8)
3019 int start = *entry >> 4;
3020 int count = (*entry++) & 0xf;
3021 int i;
3023 /* Only registers D0..D31 are valid. */
3024 if (start + count >= 16)
3025 return NULL;
3027 /* Pop VFP double-precision registers
3028 D[16+start]..D[16+start+count]. */
3029 for (i = 0; i <= count; i++)
3031 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].set_addr (vsp);
3032 vsp += 8;
3035 else if (insn == 0xc9)
3037 int start = *entry >> 4;
3038 int count = (*entry++) & 0xf;
3039 int i;
3041 /* Pop VFP double-precision registers D[start]..D[start+count]. */
3042 for (i = 0; i <= count; i++)
3044 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
3045 vsp += 8;
3048 else if ((insn & 0xf8) == 0xd0)
3050 int count = insn & 0x7;
3051 int i;
3053 /* Pop VFP double-precision registers D[8]..D[8+count]. */
3054 for (i = 0; i <= count; i++)
3056 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
3057 vsp += 8;
3060 else
3062 /* Everything else is "spare". */
3063 return NULL;
3067 /* If we restore SP from a register, assume this was the frame register.
3068 Otherwise just fall back to SP as frame register. */
3069 if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
3070 cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
3071 else
3072 cache->framereg = ARM_SP_REGNUM;
3074 /* Determine offset to previous frame. */
3075 cache->framesize
3076 = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
3078 /* We already got the previous SP. */
3079 arm_gdbarch_tdep *tdep
3080 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3081 arm_cache_set_active_sp_value (cache, tdep, vsp);
3083 return cache;
3086 /* Unwinding via ARM exception table entries. Note that the sniffer
3087 already computes a filled-in prologue cache, which is then used
3088 with the same arm_prologue_this_id and arm_prologue_prev_register
3089 routines also used for prologue-parsing based unwinding. */
3091 static int
3092 arm_exidx_unwind_sniffer (const struct frame_unwind *self,
3093 const frame_info_ptr &this_frame,
3094 void **this_prologue_cache)
3096 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3097 enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3098 CORE_ADDR addr_in_block, exidx_region, func_start;
3099 struct arm_prologue_cache *cache;
3100 gdb_byte *entry;
3102 /* See if we have an ARM exception table entry covering this address. */
3103 addr_in_block = get_frame_address_in_block (this_frame);
3104 entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
3105 if (!entry)
3106 return 0;
3108 /* The ARM exception table does not describe unwind information
3109 for arbitrary PC values, but is guaranteed to be correct only
3110 at call sites. We have to decide here whether we want to use
3111 ARM exception table information for this frame, or fall back
3112 to using prologue parsing. (Note that if we have DWARF CFI,
3113 this sniffer isn't even called -- CFI is always preferred.)
3115 Before we make this decision, however, we check whether we
3116 actually have *symbol* information for the current frame.
3117 If not, prologue parsing would not work anyway, so we might
3118 as well use the exception table and hope for the best. */
3119 if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
3121 int exc_valid = 0;
3123 /* If the next frame is "normal", we are at a call site in this
3124 frame, so exception information is guaranteed to be valid. */
3125 if (get_next_frame (this_frame)
3126 && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
3127 exc_valid = 1;
3129 /* Some syscalls keep PC pointing to the SVC instruction itself. */
3130 for (int shift = 0; shift <= 1 && !exc_valid; ++shift)
3132 /* We also assume exception information is valid if we're currently
3133 blocked in a system call. The system library is supposed to
3134 ensure this, so that e.g. pthread cancellation works. */
3135 if (arm_frame_is_thumb (this_frame))
3137 ULONGEST insn;
3139 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3140 - (shift ? 2 : 0)),
3141 2, byte_order_for_code,
3142 &insn)
3143 && (insn & 0xff00) == 0xdf00 /* svc */)
3144 exc_valid = 1;
3146 else
3148 ULONGEST insn;
3150 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3151 - (shift ? 4 : 0)),
3152 4, byte_order_for_code,
3153 &insn)
3154 && (insn & 0x0f000000) == 0x0f000000 /* svc */)
3155 exc_valid = 1;
3159 /* Bail out if we don't know that exception information is valid. */
3160 if (!exc_valid)
3161 return 0;
3163 /* The ARM exception index does not mark the *end* of the region
3164 covered by the entry, and some functions will not have any entry.
3165 To correctly recognize the end of the covered region, the linker
3166 should have inserted dummy records with a CANTUNWIND marker.
3168 Unfortunately, current versions of GNU ld do not reliably do
3169 this, and thus we may have found an incorrect entry above.
3170 As a (temporary) sanity check, we only use the entry if it
3171 lies *within* the bounds of the function. Note that this check
3172 might reject perfectly valid entries that just happen to cover
3173 multiple functions; therefore this check ought to be removed
3174 once the linker is fixed. */
3175 if (func_start > exidx_region)
3176 return 0;
3179 /* Decode the list of unwinding instructions into a prologue cache.
3180 Note that this may fail due to e.g. a "refuse to unwind" code. */
3181 cache = arm_exidx_fill_cache (this_frame, entry);
3182 if (!cache)
3183 return 0;
3185 *this_prologue_cache = cache;
3186 return 1;
3189 struct frame_unwind_legacy arm_exidx_unwind (
3190 "arm exidx",
3191 NORMAL_FRAME,
3192 FRAME_UNWIND_ARCH,
3193 default_frame_unwind_stop_reason,
3194 arm_prologue_this_id,
3195 arm_prologue_prev_register,
3196 NULL,
3197 arm_exidx_unwind_sniffer
3200 static struct arm_prologue_cache *
3201 arm_make_epilogue_frame_cache (const frame_info_ptr &this_frame)
3203 struct arm_prologue_cache *cache;
3204 int reg;
3206 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3207 arm_cache_init (cache, this_frame);
3209 /* Still rely on the offset calculated from prologue. */
3210 arm_scan_prologue (this_frame, cache);
3212 /* Since we are in epilogue, the SP has been restored. */
3213 arm_gdbarch_tdep *tdep
3214 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3215 arm_cache_set_active_sp_value (cache, tdep,
3216 get_frame_register_unsigned (this_frame,
3217 ARM_SP_REGNUM));
3219 /* Calculate actual addresses of saved registers using offsets
3220 determined by arm_scan_prologue. */
3221 for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
3222 if (cache->saved_regs[reg].is_addr ())
3223 cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr ()
3224 + arm_cache_get_prev_sp_value (cache, tdep));
3226 return cache;
3229 /* Implementation of function hook 'this_id' in
3230 'struct frame_uwnind' for epilogue unwinder. */
3232 static void
3233 arm_epilogue_frame_this_id (const frame_info_ptr &this_frame,
3234 void **this_cache,
3235 struct frame_id *this_id)
3237 struct arm_prologue_cache *cache;
3238 CORE_ADDR pc, func;
3240 if (*this_cache == NULL)
3241 *this_cache = arm_make_epilogue_frame_cache (this_frame);
3242 cache = (struct arm_prologue_cache *) *this_cache;
3244 /* Use function start address as part of the frame ID. If we cannot
3245 identify the start address (due to missing symbol information),
3246 fall back to just using the current PC. */
3247 pc = get_frame_pc (this_frame);
3248 func = get_frame_func (this_frame);
3249 if (func == 0)
3250 func = pc;
3252 arm_gdbarch_tdep *tdep
3253 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3254 *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func);
3257 /* Implementation of function hook 'prev_register' in
3258 'struct frame_uwnind' for epilogue unwinder. */
3260 static struct value *
3261 arm_epilogue_frame_prev_register (const frame_info_ptr &this_frame,
3262 void **this_cache, int regnum)
3264 if (*this_cache == NULL)
3265 *this_cache = arm_make_epilogue_frame_cache (this_frame);
3267 return arm_prologue_prev_register (this_frame, this_cache, regnum);
3270 static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
3271 CORE_ADDR pc);
3272 static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
3273 CORE_ADDR pc);
3275 /* Implementation of function hook 'sniffer' in
3276 'struct frame_uwnind' for epilogue unwinder. */
3278 static int
3279 arm_epilogue_frame_sniffer (const struct frame_unwind *self,
3280 const frame_info_ptr &this_frame,
3281 void **this_prologue_cache)
3283 if (frame_relative_level (this_frame) == 0)
3285 struct gdbarch *gdbarch = get_frame_arch (this_frame);
3286 CORE_ADDR pc = get_frame_pc (this_frame);
3288 if (arm_frame_is_thumb (this_frame))
3289 return thumb_stack_frame_destroyed_p (gdbarch, pc);
3290 else
3291 return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3293 else
3294 return 0;
3297 /* Frame unwinder from epilogue. */
3299 static const struct frame_unwind_legacy arm_epilogue_frame_unwind (
3300 "arm epilogue",
3301 NORMAL_FRAME,
3302 FRAME_UNWIND_ARCH,
3303 default_frame_unwind_stop_reason,
3304 arm_epilogue_frame_this_id,
3305 arm_epilogue_frame_prev_register,
3306 NULL,
3307 arm_epilogue_frame_sniffer
3310 /* Recognize GCC's trampoline for thumb call-indirect. If we are in a
3311 trampoline, return the target PC. Otherwise return 0.
3313 void call0a (char c, short s, int i, long l) {}
3315 int main (void)
3317 (*pointer_to_call0a) (c, s, i, l);
3320 Instead of calling a stub library function _call_via_xx (xx is
3321 the register name), GCC may inline the trampoline in the object
3322 file as below (register r2 has the address of call0a).
3324 .global main
3325 .type main, %function
3327 bl .L1
3329 .size main, .-main
3331 .L1:
3332 bx r2
3334 The trampoline 'bx r2' doesn't belong to main. */
3336 static CORE_ADDR
3337 arm_skip_bx_reg (const frame_info_ptr &frame, CORE_ADDR pc)
3339 /* The heuristics of recognizing such trampoline is that FRAME is
3340 executing in Thumb mode and the instruction on PC is 'bx Rm'. */
3341 if (arm_frame_is_thumb (frame))
3343 gdb_byte buf[2];
3345 if (target_read_memory (pc, buf, 2) == 0)
3347 struct gdbarch *gdbarch = get_frame_arch (frame);
3348 enum bfd_endian byte_order_for_code
3349 = gdbarch_byte_order_for_code (gdbarch);
3350 uint16_t insn
3351 = extract_unsigned_integer (buf, 2, byte_order_for_code);
3353 if ((insn & 0xff80) == 0x4700) /* bx <Rm> */
3355 CORE_ADDR dest
3356 = get_frame_register_unsigned (frame, bits (insn, 3, 6));
3358 /* Clear the LSB so that gdb core sets step-resume
3359 breakpoint at the right address. */
3360 return UNMAKE_THUMB_ADDR (dest);
3365 return 0;
3368 static struct arm_prologue_cache *
3369 arm_make_stub_cache (const frame_info_ptr &this_frame)
3371 struct arm_prologue_cache *cache;
3373 cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3374 arm_cache_init (cache, this_frame);
3376 arm_gdbarch_tdep *tdep
3377 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3378 arm_cache_set_active_sp_value (cache, tdep,
3379 get_frame_register_unsigned (this_frame,
3380 ARM_SP_REGNUM));
3382 return cache;
3385 /* Our frame ID for a stub frame is the current SP and LR. */
3387 static void
3388 arm_stub_this_id (const frame_info_ptr &this_frame,
3389 void **this_cache,
3390 struct frame_id *this_id)
3392 struct arm_prologue_cache *cache;
3394 if (*this_cache == NULL)
3395 *this_cache = arm_make_stub_cache (this_frame);
3396 cache = (struct arm_prologue_cache *) *this_cache;
3398 arm_gdbarch_tdep *tdep
3399 = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3400 *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep),
3401 get_frame_pc (this_frame));
3404 static int
3405 arm_stub_unwind_sniffer (const struct frame_unwind *self,
3406 const frame_info_ptr &this_frame,
3407 void **this_prologue_cache)
3409 CORE_ADDR addr_in_block;
3410 gdb_byte dummy[4];
3411 CORE_ADDR pc, start_addr;
3412 const char *name;
3414 addr_in_block = get_frame_address_in_block (this_frame);
3415 pc = get_frame_pc (this_frame);
3416 if (in_plt_section (addr_in_block)
3417 /* We also use the stub winder if the target memory is unreadable
3418 to avoid having the prologue unwinder trying to read it. */
3419 || target_read_memory (pc, dummy, 4) != 0)
3420 return 1;
3422 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
3423 && arm_skip_bx_reg (this_frame, pc) != 0)
3424 return 1;
3426 return 0;
3429 struct frame_unwind_legacy arm_stub_unwind (
3430 "arm stub",
3431 NORMAL_FRAME,
3432 FRAME_UNWIND_ARCH,
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 (const 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 (const 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 (const 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 (const 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 const 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_legacy arm_m_exception_unwind (
3956 "arm m exception lockup sec_fnc",
3957 SIGTRAMP_FRAME,
3958 FRAME_UNWIND_ARCH,
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 (const 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 (const 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 the 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 const 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 const 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 behavior. 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 https://developer.arm.com/documentation/dui0204/g/ */
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 behavior 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 behavior 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 behavior 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 behavior 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 (const 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 bound_minimal_symbol minsym
9395 = lookup_minimal_symbol (current_program_space, target_name, objfile);
9396 if (minsym.minsym != nullptr)
9397 return minsym.value_address ();
9399 return 0;
9402 /* Return true when SEC points to ".gnu.sgstubs" section. */
9404 static bool
9405 arm_is_sgstubs_section (struct obj_section *sec)
9407 return (sec != nullptr
9408 && sec->the_bfd_section != nullptr
9409 && sec->the_bfd_section->name != nullptr
9410 && streq (sec->the_bfd_section->name, ".gnu.sgstubs"));
9413 /* Recognize GCC and GNU ld's trampolines. If we are in a trampoline,
9414 return the target PC. Otherwise return 0. */
9416 CORE_ADDR
9417 arm_skip_stub (const frame_info_ptr &frame, CORE_ADDR pc)
9419 const char *name;
9420 int namelen;
9421 CORE_ADDR start_addr;
9423 /* Find the starting address and name of the function containing the PC. */
9424 if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
9426 /* Trampoline 'bx reg' doesn't belong to any functions. Do the
9427 check here. */
9428 start_addr = arm_skip_bx_reg (frame, pc);
9429 if (start_addr != 0)
9430 return start_addr;
9432 return 0;
9435 /* If PC is in a Thumb call or return stub, return the address of the
9436 target PC, which is in a register. The thunk functions are called
9437 _call_via_xx, where x is the register name. The possible names
9438 are r0-r9, sl, fp, ip, sp, and lr. ARM RealView has similar
9439 functions, named __ARM_call_via_r[0-7]. */
9440 if (startswith (name, "_call_via_")
9441 || startswith (name, "__ARM_call_via_"))
9443 /* Use the name suffix to determine which register contains the
9444 target PC. */
9445 static const char *table[15] =
9446 {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9447 "r8", "r9", "sl", "fp", "ip", "sp", "lr"
9449 int regno;
9450 int offset = strlen (name) - 2;
9452 for (regno = 0; regno <= 14; regno++)
9453 if (strcmp (&name[offset], table[regno]) == 0)
9454 return get_frame_register_unsigned (frame, regno);
9457 /* GNU ld generates __foo_from_arm or __foo_from_thumb for
9458 non-interworking calls to foo. We could decode the stubs
9459 to find the target but it's easier to use the symbol table. */
9460 namelen = strlen (name);
9461 if (name[0] == '_' && name[1] == '_'
9462 && ((namelen > 2 + strlen ("_from_thumb")
9463 && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
9464 || (namelen > 2 + strlen ("_from_arm")
9465 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
9467 char *target_name;
9468 int target_len = namelen - 2;
9469 struct objfile *objfile;
9470 struct obj_section *sec;
9472 if (name[namelen - 1] == 'b')
9473 target_len -= strlen ("_from_thumb");
9474 else
9475 target_len -= strlen ("_from_arm");
9477 target_name = (char *) alloca (target_len + 1);
9478 memcpy (target_name, name + 2, target_len);
9479 target_name[target_len] = '\0';
9481 sec = find_pc_section (pc);
9482 objfile = (sec == NULL) ? NULL : sec->objfile;
9483 bound_minimal_symbol minsym
9484 = lookup_minimal_symbol (current_program_space, target_name, objfile);
9485 if (minsym.minsym != NULL)
9486 return minsym.value_address ();
9487 else
9488 return 0;
9491 struct obj_section *section = find_pc_section (pc);
9493 /* Check whether SECTION points to the ".gnu.sgstubs" section. */
9494 if (arm_is_sgstubs_section (section))
9495 return arm_skip_cmse_entry (pc, name, section->objfile);
9497 return 0; /* not a stub */
9500 static void
9501 arm_update_current_architecture (void)
9503 /* If the current architecture is not ARM, we have nothing to do. */
9504 gdbarch *arch = current_inferior ()->arch ();
9505 if (gdbarch_bfd_arch_info (arch)->arch != bfd_arch_arm)
9506 return;
9508 /* Update the architecture. */
9509 gdbarch_info info;
9510 if (!gdbarch_update_p (current_inferior (), info))
9511 internal_error (_("could not update architecture"));
9514 static void
9515 set_fp_model_sfunc (const char *args, int from_tty,
9516 struct cmd_list_element *c)
9518 int fp_model;
9520 for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
9521 if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
9523 arm_fp_model = (enum arm_float_model) fp_model;
9524 break;
9527 if (fp_model == ARM_FLOAT_LAST)
9528 internal_error (_("Invalid fp model accepted: %s."),
9529 current_fp_model);
9531 arm_update_current_architecture ();
9534 static void
9535 show_fp_model (struct ui_file *file, int from_tty,
9536 struct cmd_list_element *c, const char *value)
9538 gdbarch *arch = current_inferior ()->arch ();
9539 if (arm_fp_model == ARM_FLOAT_AUTO
9540 && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9542 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9544 gdb_printf (file, _("\
9545 The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
9546 fp_model_strings[tdep->fp_model]);
9548 else
9549 gdb_printf (file, _("\
9550 The current ARM floating point model is \"%s\".\n"),
9551 fp_model_strings[arm_fp_model]);
9554 static void
9555 arm_set_abi (const char *args, int from_tty,
9556 struct cmd_list_element *c)
9558 int arm_abi;
9560 for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
9561 if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
9563 arm_abi_global = (enum arm_abi_kind) arm_abi;
9564 break;
9567 if (arm_abi == ARM_ABI_LAST)
9568 internal_error (_("Invalid ABI accepted: %s."),
9569 arm_abi_string);
9571 arm_update_current_architecture ();
9574 static void
9575 arm_show_abi (struct ui_file *file, int from_tty,
9576 struct cmd_list_element *c, const char *value)
9578 gdbarch *arch = current_inferior ()->arch ();
9579 if (arm_abi_global == ARM_ABI_AUTO
9580 && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9582 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9584 gdb_printf (file, _("\
9585 The current ARM ABI is \"auto\" (currently \"%s\").\n"),
9586 arm_abi_strings[tdep->arm_abi]);
9588 else
9589 gdb_printf (file, _("The current ARM ABI is \"%s\".\n"),
9590 arm_abi_string);
9593 static void
9594 arm_show_fallback_mode (struct ui_file *file, int from_tty,
9595 struct cmd_list_element *c, const char *value)
9597 gdb_printf (file,
9598 _("The current execution mode assumed "
9599 "(when symbols are unavailable) is \"%s\".\n"),
9600 arm_fallback_mode_string);
9603 static void
9604 arm_show_force_mode (struct ui_file *file, int from_tty,
9605 struct cmd_list_element *c, const char *value)
9607 gdb_printf (file,
9608 _("The current execution mode assumed "
9609 "(even when symbols are available) is \"%s\".\n"),
9610 arm_force_mode_string);
9613 static void
9614 arm_show_unwind_secure_frames (struct ui_file *file, int from_tty,
9615 struct cmd_list_element *c, const char *value)
9617 gdb_printf (file,
9618 _("Usage of non-secure to secure exception stack unwinding is %s.\n"),
9619 arm_unwind_secure_frames ? "on" : "off");
9622 /* If the user changes the register disassembly style used for info
9623 register and other commands, we have to also switch the style used
9624 in opcodes for disassembly output. This function is run in the "set
9625 arm disassembly" command, and does that. */
9627 static void
9628 set_disassembly_style_sfunc (const char *args, int from_tty,
9629 struct cmd_list_element *c)
9631 /* Convert the short style name into the long style name (eg, reg-names-*)
9632 before calling the generic set_disassembler_options() function. */
9633 std::string long_name = std::string ("reg-names-") + disassembly_style;
9634 set_disassembler_options (&long_name[0]);
9637 static void
9638 show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
9639 struct cmd_list_element *c, const char *value)
9641 struct gdbarch *gdbarch = get_current_arch ();
9642 const char *options = get_disassembler_options (gdbarch);
9643 const char *style = "";
9644 int len = 0;
9645 const char *opt;
9647 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
9648 if (startswith (opt, "reg-names-"))
9650 style = &opt[strlen ("reg-names-")];
9651 len = strcspn (style, ",");
9654 gdb_printf (file, "The disassembly style is \"%.*s\".\n", len, style);
9657 /* Return the ARM register name corresponding to register I. */
9658 static const char *
9659 arm_register_name (struct gdbarch *gdbarch, int i)
9661 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9663 if (is_s_pseudo (gdbarch, i))
9665 static const char *const s_pseudo_names[] = {
9666 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
9667 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
9668 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
9669 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
9672 return s_pseudo_names[i - tdep->s_pseudo_base];
9675 if (is_q_pseudo (gdbarch, i))
9677 static const char *const q_pseudo_names[] = {
9678 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
9679 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
9682 return q_pseudo_names[i - tdep->q_pseudo_base];
9685 if (is_mve_pseudo (gdbarch, i))
9686 return "p0";
9688 /* RA_AUTH_CODE is used for unwinding only. Do not assign it a name. */
9689 if (is_pacbti_pseudo (gdbarch, i))
9690 return "";
9692 if (i >= ARRAY_SIZE (arm_register_names))
9693 /* These registers are only supported on targets which supply
9694 an XML description. */
9695 return "";
9697 /* Non-pseudo registers. */
9698 return arm_register_names[i];
9701 /* Test whether the coff symbol specific value corresponds to a Thumb
9702 function. */
9704 static int
9705 coff_sym_is_thumb (int val)
9707 return (val == C_THUMBEXT
9708 || val == C_THUMBSTAT
9709 || val == C_THUMBEXTFUNC
9710 || val == C_THUMBSTATFUNC
9711 || val == C_THUMBLABEL);
9714 /* arm_coff_make_msymbol_special()
9715 arm_elf_make_msymbol_special()
9717 These functions test whether the COFF or ELF symbol corresponds to
9718 an address in thumb code, and set a "special" bit in a minimal
9719 symbol to indicate that it does. */
9721 static void
9722 arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
9724 elf_symbol_type *elfsym = (elf_symbol_type *) sym;
9726 if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
9727 == ST_BRANCH_TO_THUMB)
9728 MSYMBOL_SET_SPECIAL (msym);
9731 static void
9732 arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
9734 if (coff_sym_is_thumb (val))
9735 MSYMBOL_SET_SPECIAL (msym);
9738 static void
9739 arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
9740 asymbol *sym)
9742 const char *name = bfd_asymbol_name (sym);
9743 struct arm_per_bfd *data;
9744 struct arm_mapping_symbol new_map_sym;
9746 gdb_assert (name[0] == '$');
9747 if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
9748 return;
9750 data = arm_bfd_data_key.get (objfile->obfd.get ());
9751 if (data == NULL)
9752 data = arm_bfd_data_key.emplace (objfile->obfd.get (),
9753 objfile->obfd->section_count);
9754 arm_mapping_symbol_vec &map
9755 = data->section_maps[bfd_asymbol_section (sym)->index];
9757 new_map_sym.value = sym->value;
9758 new_map_sym.type = name[1];
9760 /* Insert at the end, the vector will be sorted on first use. */
9761 map.push_back (new_map_sym);
9764 static void
9765 arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
9767 struct gdbarch *gdbarch = regcache->arch ();
9768 regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
9770 /* If necessary, set the T bit. */
9771 if (arm_apcs_32)
9773 ULONGEST val, t_bit;
9774 regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9775 t_bit = arm_psr_thumb_bit (gdbarch);
9776 if (arm_pc_is_thumb (gdbarch, pc))
9777 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9778 val | t_bit);
9779 else
9780 regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9781 val & ~t_bit);
9785 /* Read the contents of a NEON quad register, by reading from two
9786 double registers. This is used to implement the quad pseudo
9787 registers, and for argument passing in case the quad registers are
9788 missing; vectors are passed in quad registers when using the VFP
9789 ABI, even if a NEON unit is not present. REGNUM is the index of
9790 the quad register, in [0, 15]. */
9792 static enum register_status
9793 arm_neon_quad_read (struct gdbarch *gdbarch, readable_regcache *regcache,
9794 int regnum, gdb_byte *buf)
9796 char name_buf[4];
9797 gdb_byte reg_buf[8];
9798 int double_regnum;
9799 enum register_status status;
9801 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9802 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9803 strlen (name_buf));
9805 status = regcache->raw_read (double_regnum, reg_buf);
9806 if (status != REG_VALID)
9807 return status;
9808 memcpy (buf, reg_buf, 8);
9810 status = regcache->raw_read (double_regnum + 1, reg_buf);
9811 if (status != REG_VALID)
9812 return status;
9813 memcpy (buf + 8, reg_buf, 8);
9815 return REG_VALID;
9818 /* Read the contents of a NEON quad register, by reading from two double
9819 registers, and return it as a value. QUAD_REG_INDEX is the index of the quad
9820 register, in [0, 15]. */
9822 static value *
9823 arm_neon_quad_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9824 int pseudo_reg_num, int quad_reg_index)
9826 std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9827 int double_regnum
9828 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9829 raw_reg_name.length ());
9831 return pseudo_from_concat_raw (next_frame, pseudo_reg_num, double_regnum,
9832 double_regnum + 1);
9835 /* Read the contents of the MVE pseudo register REGNUM and return it as a
9836 value. */
9837 static value *
9838 arm_mve_pseudo_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9839 int pseudo_reg_num)
9841 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9843 /* P0 is the first 16 bits of VPR. */
9844 return pseudo_from_raw_part (next_frame, pseudo_reg_num,
9845 tdep->mve_vpr_regnum, 0);
9848 static value *
9849 arm_pseudo_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9850 const int pseudo_reg_num)
9852 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9854 gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9856 if (is_q_pseudo (gdbarch, pseudo_reg_num))
9858 /* Quad-precision register. */
9859 return arm_neon_quad_read_value (gdbarch, next_frame, pseudo_reg_num,
9860 pseudo_reg_num - tdep->q_pseudo_base);
9862 else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9863 return arm_mve_pseudo_read_value (gdbarch, next_frame, pseudo_reg_num);
9864 else
9866 int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9868 /* Single-precision register. */
9869 gdb_assert (s_reg_index < 32);
9871 /* s0 is always the least significant half of d0. */
9872 int offset;
9873 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9874 offset = (s_reg_index & 1) ? 0 : 4;
9875 else
9876 offset = (s_reg_index & 1) ? 4 : 0;
9878 std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9879 int double_regnum
9880 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9881 raw_reg_name.length ());
9883 return pseudo_from_raw_part (next_frame, pseudo_reg_num, double_regnum,
9884 offset);
9888 /* Store the contents of BUF to a NEON quad register, by writing to
9889 two double registers. This is used to implement the quad pseudo
9890 registers, and for argument passing in case the quad registers are
9891 missing; vectors are passed in quad registers when using the VFP
9892 ABI, even if a NEON unit is not present. REGNUM is the index
9893 of the quad register, in [0, 15]. */
9895 static void
9896 arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
9897 int regnum, const gdb_byte *buf)
9899 char name_buf[4];
9900 int double_regnum;
9902 xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9903 double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9904 strlen (name_buf));
9906 regcache->raw_write (double_regnum, buf);
9907 regcache->raw_write (double_regnum + 1, buf + 8);
9910 static void
9911 arm_neon_quad_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9912 int quad_reg_index, gdb::array_view<const gdb_byte> buf)
9914 std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9915 int double_regnum
9916 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.data (),
9917 raw_reg_name.length ());
9919 pseudo_to_concat_raw (next_frame, buf, double_regnum, double_regnum + 1);
9922 /* Store the contents of BUF to the MVE pseudo register REGNUM. */
9924 static void
9925 arm_mve_pseudo_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9926 int pseudo_reg_num, gdb::array_view<const gdb_byte> buf)
9928 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9930 /* P0 is the first 16 bits of VPR. */
9931 pseudo_to_raw_part(next_frame, buf, tdep->mve_vpr_regnum, 0);
9934 static void
9935 arm_pseudo_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9936 const int pseudo_reg_num,
9937 gdb::array_view<const gdb_byte> buf)
9939 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9941 gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9943 if (is_q_pseudo (gdbarch, pseudo_reg_num))
9945 /* Quad-precision register. */
9946 arm_neon_quad_write (gdbarch, next_frame,
9947 pseudo_reg_num - tdep->q_pseudo_base, buf);
9949 else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9950 arm_mve_pseudo_write (gdbarch, next_frame, pseudo_reg_num, buf);
9951 else
9953 int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9955 /* Single-precision register. */
9956 gdb_assert (s_reg_index < 32);
9958 /* s0 is always the least significant half of d0. */
9959 int offset;
9960 if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9961 offset = (s_reg_index & 1) ? 0 : 4;
9962 else
9963 offset = (s_reg_index & 1) ? 4 : 0;
9965 std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9966 int double_regnum
9967 = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9968 raw_reg_name.length ());
9970 pseudo_to_raw_part (next_frame, buf, double_regnum, offset);
9974 static struct value *
9975 value_of_arm_user_reg (const frame_info_ptr &frame, const void *baton)
9977 const int *reg_p = (const int *) baton;
9978 return value_of_register (*reg_p, get_next_frame_sentinel_okay (frame));
9981 static enum gdb_osabi
9982 arm_elf_osabi_sniffer (bfd *abfd)
9984 unsigned int elfosabi;
9985 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
9987 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
9989 if (elfosabi == ELFOSABI_ARM)
9990 /* GNU tools use this value. Check note sections in this case,
9991 as well. */
9993 for (asection *sect : gdb_bfd_sections (abfd))
9994 generic_elf_osabi_sniff_abi_tag_sections (abfd, sect, &osabi);
9997 /* Anything else will be handled by the generic ELF sniffer. */
9998 return osabi;
10001 static int
10002 arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
10003 const struct reggroup *group)
10005 /* FPS register's type is INT, but belongs to float_reggroup. Beside
10006 this, FPS register belongs to save_regroup, restore_reggroup, and
10007 all_reggroup, of course. */
10008 if (regnum == ARM_FPS_REGNUM)
10009 return (group == float_reggroup
10010 || group == save_reggroup
10011 || group == restore_reggroup
10012 || group == all_reggroup);
10013 else
10014 return default_register_reggroup_p (gdbarch, regnum, group);
10017 /* For backward-compatibility we allow two 'g' packet lengths with
10018 the remote protocol depending on whether FPA registers are
10019 supplied. M-profile targets do not have FPA registers, but some
10020 stubs already exist in the wild which use a 'g' packet which
10021 supplies them albeit with dummy values. The packet format which
10022 includes FPA registers should be considered deprecated for
10023 M-profile targets. */
10025 static void
10026 arm_register_g_packet_guesses (struct gdbarch *gdbarch)
10028 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10030 if (tdep->is_m)
10032 const target_desc *tdesc;
10034 /* If we know from the executable this is an M-profile target,
10035 cater for remote targets whose register set layout is the
10036 same as the FPA layout. */
10037 tdesc = arm_read_mprofile_description (ARM_M_TYPE_WITH_FPA);
10038 register_remote_g_packet_guess (gdbarch,
10039 ARM_CORE_REGS_SIZE + ARM_FP_REGS_SIZE,
10040 tdesc);
10042 /* The regular M-profile layout. */
10043 tdesc = arm_read_mprofile_description (ARM_M_TYPE_M_PROFILE);
10044 register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE,
10045 tdesc);
10047 /* M-profile plus M4F VFP. */
10048 tdesc = arm_read_mprofile_description (ARM_M_TYPE_VFP_D16);
10049 register_remote_g_packet_guess (gdbarch,
10050 ARM_CORE_REGS_SIZE + ARM_VFP2_REGS_SIZE,
10051 tdesc);
10052 /* M-profile plus MVE. */
10053 tdesc = arm_read_mprofile_description (ARM_M_TYPE_MVE);
10054 register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE
10055 + ARM_VFP2_REGS_SIZE
10056 + ARM_INT_REGISTER_SIZE, tdesc);
10058 /* M-profile system (stack pointers). */
10059 tdesc = arm_read_mprofile_description (ARM_M_TYPE_SYSTEM);
10060 register_remote_g_packet_guess (gdbarch, 2 * ARM_INT_REGISTER_SIZE, tdesc);
10063 /* Otherwise we don't have a useful guess. */
10066 /* Implement the code_of_frame_writable gdbarch method. */
10068 static int
10069 arm_code_of_frame_writable (struct gdbarch *gdbarch, const frame_info_ptr &frame)
10071 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10073 if (tdep->is_m && get_frame_type (frame) == SIGTRAMP_FRAME)
10075 /* M-profile exception frames return to some magic PCs, where
10076 isn't writable at all. */
10077 return 0;
10079 else
10080 return 1;
10083 /* Implement gdbarch_gnu_triplet_regexp. If the arch name is arm then allow it
10084 to be postfixed by a version (eg armv7hl). */
10086 static const char *
10087 arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
10089 if (strcmp (gdbarch_bfd_arch_info (gdbarch)->arch_name, "arm") == 0)
10090 return "arm(v[^- ]*)?";
10091 return gdbarch_bfd_arch_info (gdbarch)->arch_name;
10094 /* Implement the "get_pc_address_flags" gdbarch method. */
10096 static std::string
10097 arm_get_pc_address_flags (const frame_info_ptr &frame, CORE_ADDR pc)
10099 if (get_frame_pc_masked (frame))
10100 return "PAC";
10102 return "";
10105 /* Initialize the current architecture based on INFO. If possible,
10106 re-use an architecture from ARCHES, which is a list of
10107 architectures already created during this debugging session.
10109 Called e.g. at program startup, when reading a core file, and when
10110 reading a binary file. */
10112 static struct gdbarch *
10113 arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
10115 struct gdbarch_list *best_arch;
10116 enum arm_abi_kind arm_abi = arm_abi_global;
10117 enum arm_float_model fp_model = arm_fp_model;
10118 tdesc_arch_data_up tdesc_data;
10119 int i;
10120 bool is_m = false;
10121 bool have_sec_ext = false;
10122 int vfp_register_count = 0;
10123 bool have_s_pseudos = false, have_q_pseudos = false;
10124 bool have_wmmx_registers = false;
10125 bool have_neon = false;
10126 bool have_fpa_registers = true;
10127 const struct target_desc *tdesc = info.target_desc;
10128 bool have_vfp = false;
10129 bool have_mve = false;
10130 bool have_pacbti = false;
10131 int mve_vpr_regnum = -1;
10132 int register_count = ARM_NUM_REGS;
10133 bool have_m_profile_msp = false;
10134 int m_profile_msp_regnum = -1;
10135 int m_profile_psp_regnum = -1;
10136 int m_profile_msp_ns_regnum = -1;
10137 int m_profile_psp_ns_regnum = -1;
10138 int m_profile_msp_s_regnum = -1;
10139 int m_profile_psp_s_regnum = -1;
10140 int tls_regnum = 0;
10142 /* If we have an object to base this architecture on, try to determine
10143 its ABI. */
10145 if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
10147 int ei_osabi, e_flags;
10149 switch (bfd_get_flavour (info.abfd))
10151 case bfd_target_coff_flavour:
10152 /* Assume it's an old APCS-style ABI. */
10153 /* XXX WinCE? */
10154 arm_abi = ARM_ABI_APCS;
10155 break;
10157 case bfd_target_elf_flavour:
10158 ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
10159 e_flags = elf_elfheader (info.abfd)->e_flags;
10161 if (ei_osabi == ELFOSABI_ARM)
10163 /* GNU tools used to use this value, but do not for EABI
10164 objects. There's nowhere to tag an EABI version
10165 anyway, so assume APCS. */
10166 arm_abi = ARM_ABI_APCS;
10168 else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
10170 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
10172 switch (eabi_ver)
10174 case EF_ARM_EABI_UNKNOWN:
10175 /* Assume GNU tools. */
10176 arm_abi = ARM_ABI_APCS;
10177 break;
10179 case EF_ARM_EABI_VER4:
10180 case EF_ARM_EABI_VER5:
10181 arm_abi = ARM_ABI_AAPCS;
10182 /* EABI binaries default to VFP float ordering.
10183 They may also contain build attributes that can
10184 be used to identify if the VFP argument-passing
10185 ABI is in use. */
10186 if (fp_model == ARM_FLOAT_AUTO)
10188 #ifdef HAVE_ELF
10189 switch (bfd_elf_get_obj_attr_int (info.abfd,
10190 OBJ_ATTR_PROC,
10191 Tag_ABI_VFP_args))
10193 case AEABI_VFP_args_base:
10194 /* "The user intended FP parameter/result
10195 passing to conform to AAPCS, base
10196 variant". */
10197 fp_model = ARM_FLOAT_SOFT_VFP;
10198 break;
10199 case AEABI_VFP_args_vfp:
10200 /* "The user intended FP parameter/result
10201 passing to conform to AAPCS, VFP
10202 variant". */
10203 fp_model = ARM_FLOAT_VFP;
10204 break;
10205 case AEABI_VFP_args_toolchain:
10206 /* "The user intended FP parameter/result
10207 passing to conform to tool chain-specific
10208 conventions" - we don't know any such
10209 conventions, so leave it as "auto". */
10210 break;
10211 case AEABI_VFP_args_compatible:
10212 /* "Code is compatible with both the base
10213 and VFP variants; the user did not permit
10214 non-variadic functions to pass FP
10215 parameters/results" - leave it as
10216 "auto". */
10217 break;
10218 default:
10219 /* Attribute value not mentioned in the
10220 November 2012 ABI, so leave it as
10221 "auto". */
10222 break;
10224 #else
10225 fp_model = ARM_FLOAT_SOFT_VFP;
10226 #endif
10228 break;
10230 default:
10231 /* Leave it as "auto". */
10232 warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
10233 break;
10236 #ifdef HAVE_ELF
10237 /* Detect M-profile programs. This only works if the
10238 executable file includes build attributes; GCC does
10239 copy them to the executable, but e.g. RealView does
10240 not. */
10241 int attr_arch
10242 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10243 Tag_CPU_arch);
10244 int attr_profile
10245 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10246 Tag_CPU_arch_profile);
10248 /* GCC specifies the profile for v6-M; RealView only
10249 specifies the profile for architectures starting with
10250 V7 (as opposed to architectures with a tag
10251 numerically greater than TAG_CPU_ARCH_V7). */
10252 if (!tdesc_has_registers (tdesc)
10253 && (attr_arch == TAG_CPU_ARCH_V6_M
10254 || attr_arch == TAG_CPU_ARCH_V6S_M
10255 || attr_arch == TAG_CPU_ARCH_V7E_M
10256 || attr_arch == TAG_CPU_ARCH_V8M_BASE
10257 || attr_arch == TAG_CPU_ARCH_V8M_MAIN
10258 || attr_arch == TAG_CPU_ARCH_V8_1M_MAIN
10259 || attr_profile == 'M'))
10260 is_m = true;
10262 /* Look for attributes that indicate support for ARMv8.1-m
10263 PACBTI. */
10264 if (!tdesc_has_registers (tdesc) && is_m)
10266 int attr_pac_extension
10267 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10268 Tag_PAC_extension);
10270 int attr_bti_extension
10271 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10272 Tag_BTI_extension);
10274 int attr_pacret_use
10275 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10276 Tag_PACRET_use);
10278 int attr_bti_use
10279 = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10280 Tag_BTI_use);
10282 if (attr_pac_extension != 0 || attr_bti_extension != 0
10283 || attr_pacret_use != 0 || attr_bti_use != 0)
10284 have_pacbti = true;
10286 #endif
10289 if (fp_model == ARM_FLOAT_AUTO)
10291 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
10293 case 0:
10294 /* Leave it as "auto". Strictly speaking this case
10295 means FPA, but almost nobody uses that now, and
10296 many toolchains fail to set the appropriate bits
10297 for the floating-point model they use. */
10298 break;
10299 case EF_ARM_SOFT_FLOAT:
10300 fp_model = ARM_FLOAT_SOFT_FPA;
10301 break;
10302 case EF_ARM_VFP_FLOAT:
10303 fp_model = ARM_FLOAT_VFP;
10304 break;
10305 case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
10306 fp_model = ARM_FLOAT_SOFT_VFP;
10307 break;
10311 if (e_flags & EF_ARM_BE8)
10312 info.byte_order_for_code = BFD_ENDIAN_LITTLE;
10314 break;
10316 default:
10317 /* Leave it as "auto". */
10318 break;
10322 /* Check any target description for validity. */
10323 if (tdesc_has_registers (tdesc))
10325 /* For most registers we require GDB's default names; but also allow
10326 the numeric names for sp / lr / pc, as a convenience. */
10327 static const char *const arm_sp_names[] = { "r13", "sp", NULL };
10328 static const char *const arm_lr_names[] = { "r14", "lr", NULL };
10329 static const char *const arm_pc_names[] = { "r15", "pc", NULL };
10331 const struct tdesc_feature *feature;
10332 int valid_p;
10334 feature = tdesc_find_feature (tdesc,
10335 "org.gnu.gdb.arm.core");
10336 if (feature == NULL)
10338 feature = tdesc_find_feature (tdesc,
10339 "org.gnu.gdb.arm.m-profile");
10340 if (feature == NULL)
10341 return NULL;
10342 else
10343 is_m = true;
10346 tdesc_data = tdesc_data_alloc ();
10348 valid_p = 1;
10349 for (i = 0; i < ARM_SP_REGNUM; i++)
10350 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10351 arm_register_names[i]);
10352 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10353 ARM_SP_REGNUM,
10354 arm_sp_names);
10355 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10356 ARM_LR_REGNUM,
10357 arm_lr_names);
10358 valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10359 ARM_PC_REGNUM,
10360 arm_pc_names);
10361 if (is_m)
10362 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10363 ARM_PS_REGNUM, "xpsr");
10364 else
10365 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10366 ARM_PS_REGNUM, "cpsr");
10368 if (!valid_p)
10369 return NULL;
10371 if (is_m)
10373 feature = tdesc_find_feature (tdesc,
10374 "org.gnu.gdb.arm.m-system");
10375 if (feature != nullptr)
10377 /* MSP */
10378 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10379 register_count, "msp");
10380 if (!valid_p)
10382 warning (_("M-profile m-system feature is missing required register msp."));
10383 return nullptr;
10385 have_m_profile_msp = true;
10386 m_profile_msp_regnum = register_count++;
10388 /* PSP */
10389 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10390 register_count, "psp");
10391 if (!valid_p)
10393 warning (_("M-profile m-system feature is missing required register psp."));
10394 return nullptr;
10396 m_profile_psp_regnum = register_count++;
10400 feature = tdesc_find_feature (tdesc,
10401 "org.gnu.gdb.arm.fpa");
10402 if (feature != NULL)
10404 valid_p = 1;
10405 for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
10406 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10407 arm_register_names[i]);
10408 if (!valid_p)
10409 return NULL;
10411 else
10412 have_fpa_registers = false;
10414 feature = tdesc_find_feature (tdesc,
10415 "org.gnu.gdb.xscale.iwmmxt");
10416 if (feature != NULL)
10418 static const char *const iwmmxt_names[] = {
10419 "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
10420 "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
10421 "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
10422 "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
10425 valid_p = 1;
10426 for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
10427 valid_p
10428 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10429 iwmmxt_names[i - ARM_WR0_REGNUM]);
10431 /* Check for the control registers, but do not fail if they
10432 are missing. */
10433 for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
10434 tdesc_numbered_register (feature, tdesc_data.get (), i,
10435 iwmmxt_names[i - ARM_WR0_REGNUM]);
10437 for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
10438 valid_p
10439 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10440 iwmmxt_names[i - ARM_WR0_REGNUM]);
10442 if (!valid_p)
10443 return NULL;
10445 have_wmmx_registers = true;
10448 /* If we have a VFP unit, check whether the single precision registers
10449 are present. If not, then we will synthesize them as pseudo
10450 registers. */
10451 feature = tdesc_find_feature (tdesc,
10452 "org.gnu.gdb.arm.vfp");
10453 if (feature != NULL)
10455 static const char *const vfp_double_names[] = {
10456 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
10457 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
10458 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
10459 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
10462 /* Require the double precision registers. There must be either
10463 16 or 32. */
10464 valid_p = 1;
10465 for (i = 0; i < 32; i++)
10467 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10468 ARM_D0_REGNUM + i,
10469 vfp_double_names[i]);
10470 if (!valid_p)
10471 break;
10473 if (!valid_p && i == 16)
10474 valid_p = 1;
10476 /* Also require FPSCR. */
10477 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10478 ARM_FPSCR_REGNUM, "fpscr");
10479 if (!valid_p)
10480 return NULL;
10482 have_vfp = true;
10484 if (tdesc_unnumbered_register (feature, "s0") == 0)
10485 have_s_pseudos = true;
10487 vfp_register_count = i;
10489 /* If we have VFP, also check for NEON. The architecture allows
10490 NEON without VFP (integer vector operations only), but GDB
10491 does not support that. */
10492 feature = tdesc_find_feature (tdesc,
10493 "org.gnu.gdb.arm.neon");
10494 if (feature != NULL)
10496 /* NEON requires 32 double-precision registers. */
10497 if (i != 32)
10498 return NULL;
10500 /* If there are quad registers defined by the stub, use
10501 their type; otherwise (normally) provide them with
10502 the default type. */
10503 if (tdesc_unnumbered_register (feature, "q0") == 0)
10504 have_q_pseudos = true;
10508 /* Check for the TLS register feature. */
10509 feature = tdesc_find_feature (tdesc, "org.gnu.gdb.arm.tls");
10510 if (feature != nullptr)
10512 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10513 register_count, "tpidruro");
10514 if (!valid_p)
10515 return nullptr;
10517 tls_regnum = register_count;
10518 register_count++;
10521 /* Check for MVE after all the checks for GPR's, VFP and Neon.
10522 MVE (Helium) is an M-profile extension. */
10523 if (is_m)
10525 /* Do we have the MVE feature? */
10526 feature = tdesc_find_feature (tdesc,"org.gnu.gdb.arm.m-profile-mve");
10528 if (feature != nullptr)
10530 /* If we have MVE, we must always have the VPR register. */
10531 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10532 register_count, "vpr");
10533 if (!valid_p)
10535 warning (_("MVE feature is missing required register vpr."));
10536 return nullptr;
10539 have_mve = true;
10540 mve_vpr_regnum = register_count;
10541 register_count++;
10543 /* We can't have Q pseudo registers available here, as that
10544 would mean we have NEON features, and that is only available
10545 on A and R profiles. */
10546 gdb_assert (!have_q_pseudos);
10548 /* Given we have a M-profile target description, if MVE is
10549 enabled and there are VFP registers, we should have Q
10550 pseudo registers (Q0 ~ Q7). */
10551 if (have_vfp)
10552 have_q_pseudos = true;
10555 /* Do we have the ARMv8.1-m PACBTI feature? */
10556 feature = tdesc_find_feature (tdesc,
10557 "org.gnu.gdb.arm.m-profile-pacbti");
10558 if (feature != nullptr)
10560 /* By advertising this feature, the target acknowledges the
10561 presence of the ARMv8.1-m PACBTI extensions.
10563 We don't care for any particular registers in this group, so
10564 the target is free to include whatever it deems appropriate.
10566 The expectation is for this feature to include the PAC
10567 keys. */
10568 have_pacbti = true;
10571 /* Do we have the Security extension? */
10572 feature = tdesc_find_feature (tdesc,
10573 "org.gnu.gdb.arm.secext");
10574 if (feature != nullptr)
10576 /* Secure/Non-secure stack pointers. */
10577 /* MSP_NS */
10578 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10579 register_count, "msp_ns");
10580 if (!valid_p)
10582 warning (_("M-profile secext feature is missing required register msp_ns."));
10583 return nullptr;
10585 m_profile_msp_ns_regnum = register_count++;
10587 /* PSP_NS */
10588 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10589 register_count, "psp_ns");
10590 if (!valid_p)
10592 warning (_("M-profile secext feature is missing required register psp_ns."));
10593 return nullptr;
10595 m_profile_psp_ns_regnum = register_count++;
10597 /* MSP_S */
10598 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10599 register_count, "msp_s");
10600 if (!valid_p)
10602 warning (_("M-profile secext feature is missing required register msp_s."));
10603 return nullptr;
10605 m_profile_msp_s_regnum = register_count++;
10607 /* PSP_S */
10608 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10609 register_count, "psp_s");
10610 if (!valid_p)
10612 warning (_("M-profile secext feature is missing required register psp_s."));
10613 return nullptr;
10615 m_profile_psp_s_regnum = register_count++;
10617 have_sec_ext = true;
10623 /* If there is already a candidate, use it. */
10624 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
10625 best_arch != NULL;
10626 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
10628 arm_gdbarch_tdep *tdep
10629 = gdbarch_tdep<arm_gdbarch_tdep> (best_arch->gdbarch);
10631 if (arm_abi != ARM_ABI_AUTO && arm_abi != tdep->arm_abi)
10632 continue;
10634 if (fp_model != ARM_FLOAT_AUTO && fp_model != tdep->fp_model)
10635 continue;
10637 /* There are various other properties in tdep that we do not
10638 need to check here: those derived from a target description,
10639 since gdbarches with a different target description are
10640 automatically disqualified. */
10642 /* Do check is_m, though, since it might come from the binary. */
10643 if (is_m != tdep->is_m)
10644 continue;
10646 /* Also check for ARMv8.1-m PACBTI support, since it might come from
10647 the binary. */
10648 if (have_pacbti != tdep->have_pacbti)
10649 continue;
10651 /* Found a match. */
10652 break;
10655 if (best_arch != NULL)
10656 return best_arch->gdbarch;
10658 gdbarch *gdbarch
10659 = gdbarch_alloc (&info, gdbarch_tdep_up (new arm_gdbarch_tdep));
10660 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10662 /* Record additional information about the architecture we are defining.
10663 These are gdbarch discriminators, like the OSABI. */
10664 tdep->arm_abi = arm_abi;
10665 tdep->fp_model = fp_model;
10666 tdep->is_m = is_m;
10667 tdep->have_sec_ext = have_sec_ext;
10668 tdep->have_fpa_registers = have_fpa_registers;
10669 tdep->have_wmmx_registers = have_wmmx_registers;
10670 gdb_assert (vfp_register_count == 0
10671 || vfp_register_count == 16
10672 || vfp_register_count == 32);
10673 tdep->vfp_register_count = vfp_register_count;
10674 tdep->have_s_pseudos = have_s_pseudos;
10675 tdep->have_q_pseudos = have_q_pseudos;
10676 tdep->have_neon = have_neon;
10677 tdep->tls_regnum = tls_regnum;
10679 /* Adjust the MVE feature settings. */
10680 if (have_mve)
10682 tdep->have_mve = true;
10683 tdep->mve_vpr_regnum = mve_vpr_regnum;
10686 /* Adjust the PACBTI feature settings. */
10687 tdep->have_pacbti = have_pacbti;
10689 /* Adjust the M-profile stack pointers settings. */
10690 if (have_m_profile_msp)
10692 tdep->m_profile_msp_regnum = m_profile_msp_regnum;
10693 tdep->m_profile_psp_regnum = m_profile_psp_regnum;
10694 tdep->m_profile_msp_ns_regnum = m_profile_msp_ns_regnum;
10695 tdep->m_profile_psp_ns_regnum = m_profile_psp_ns_regnum;
10696 tdep->m_profile_msp_s_regnum = m_profile_msp_s_regnum;
10697 tdep->m_profile_psp_s_regnum = m_profile_psp_s_regnum;
10700 arm_register_g_packet_guesses (gdbarch);
10702 /* Breakpoints. */
10703 switch (info.byte_order_for_code)
10705 case BFD_ENDIAN_BIG:
10706 tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
10707 tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
10708 tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
10709 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
10711 break;
10713 case BFD_ENDIAN_LITTLE:
10714 tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
10715 tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
10716 tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
10717 tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
10719 break;
10721 default:
10722 internal_error (_("arm_gdbarch_init: bad byte order for float format"));
10725 /* On ARM targets char defaults to unsigned. */
10726 set_gdbarch_char_signed (gdbarch, 0);
10728 /* wchar_t is unsigned under the AAPCS. */
10729 if (tdep->arm_abi == ARM_ABI_AAPCS)
10730 set_gdbarch_wchar_signed (gdbarch, 0);
10731 else
10732 set_gdbarch_wchar_signed (gdbarch, 1);
10734 /* Compute type alignment. */
10735 set_gdbarch_type_align (gdbarch, arm_type_align);
10737 /* Note: for displaced stepping, this includes the breakpoint, and one word
10738 of additional scratch space. This setting isn't used for anything beside
10739 displaced stepping at present. */
10740 set_gdbarch_displaced_step_buffer_length
10741 (gdbarch, 4 * ARM_DISPLACED_MODIFIED_INSNS);
10742 set_gdbarch_max_insn_length (gdbarch, 4);
10744 /* This should be low enough for everything. */
10745 tdep->lowest_pc = 0x20;
10746 tdep->jb_pc = -1; /* Longjump support not enabled by default. */
10748 /* The default, for both APCS and AAPCS, is to return small
10749 structures in registers. */
10750 tdep->struct_return = reg_struct_return;
10752 set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
10753 set_gdbarch_frame_align (gdbarch, arm_frame_align);
10755 if (is_m)
10756 set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
10758 set_gdbarch_write_pc (gdbarch, arm_write_pc);
10760 frame_base_set_default (gdbarch, &arm_normal_base);
10762 /* Address manipulation. */
10763 set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
10765 /* Advance PC across function entry code. */
10766 set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
10768 /* Detect whether PC is at a point where the stack has been destroyed. */
10769 set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
10771 /* Skip trampolines. */
10772 set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
10774 /* The stack grows downward. */
10775 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
10777 /* Breakpoint manipulation. */
10778 set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
10779 set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
10780 set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
10781 arm_breakpoint_kind_from_current_state);
10783 /* Information about registers, etc. */
10784 set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
10785 set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
10786 set_gdbarch_num_regs (gdbarch, register_count);
10787 set_gdbarch_register_type (gdbarch, arm_register_type);
10788 set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
10790 /* This "info float" is FPA-specific. Use the generic version if we
10791 do not have FPA. */
10792 if (tdep->have_fpa_registers)
10793 set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
10795 /* Internal <-> external register number maps. */
10796 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
10797 set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
10799 set_gdbarch_register_name (gdbarch, arm_register_name);
10801 /* Returning results. */
10802 set_gdbarch_return_value_as_value (gdbarch, arm_return_value);
10804 /* Disassembly. */
10805 set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
10807 /* Minsymbol frobbing. */
10808 set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
10809 set_gdbarch_coff_make_msymbol_special (gdbarch,
10810 arm_coff_make_msymbol_special);
10811 set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
10813 /* Thumb-2 IT block support. */
10814 set_gdbarch_adjust_breakpoint_address (gdbarch,
10815 arm_adjust_breakpoint_address);
10817 /* Virtual tables. */
10818 set_gdbarch_vbit_in_delta (gdbarch, 1);
10820 /* Hook in the ABI-specific overrides, if they have been registered. */
10821 gdbarch_init_osabi (info, gdbarch);
10823 dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
10825 /* Add some default predicates. */
10826 if (is_m)
10827 frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
10828 frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
10829 dwarf2_append_unwinders (gdbarch);
10830 frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
10831 frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
10832 frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
10834 /* Now we have tuned the configuration, set a few final things,
10835 based on what the OS ABI has told us. */
10837 /* If the ABI is not otherwise marked, assume the old GNU APCS. EABI
10838 binaries are always marked. */
10839 if (tdep->arm_abi == ARM_ABI_AUTO)
10840 tdep->arm_abi = ARM_ABI_APCS;
10842 /* Watchpoints are not steppable. */
10843 set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
10845 /* We used to default to FPA for generic ARM, but almost nobody
10846 uses that now, and we now provide a way for the user to force
10847 the model. So default to the most useful variant. */
10848 if (tdep->fp_model == ARM_FLOAT_AUTO)
10849 tdep->fp_model = ARM_FLOAT_SOFT_FPA;
10851 if (tdep->jb_pc >= 0)
10852 set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
10854 /* Floating point sizes and format. */
10855 set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
10856 if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
10858 set_gdbarch_double_format
10859 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10860 set_gdbarch_long_double_format
10861 (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10863 else
10865 set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
10866 set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
10869 /* Hook used to decorate frames with signed return addresses, only available
10870 for ARMv8.1-m PACBTI. */
10871 if (is_m && have_pacbti)
10872 set_gdbarch_get_pc_address_flags (gdbarch, arm_get_pc_address_flags);
10874 if (tdesc_data != nullptr)
10876 set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
10878 tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
10879 register_count = gdbarch_num_regs (gdbarch);
10881 /* Override tdesc_register_type to adjust the types of VFP
10882 registers for NEON. */
10883 set_gdbarch_register_type (gdbarch, arm_register_type);
10886 /* Initialize the pseudo register data. */
10887 int num_pseudos = 0;
10888 if (tdep->have_s_pseudos)
10890 /* VFP single precision pseudo registers (S0~S31). */
10891 tdep->s_pseudo_base = register_count;
10892 tdep->s_pseudo_count = 32;
10893 num_pseudos += tdep->s_pseudo_count;
10895 if (tdep->have_q_pseudos)
10897 /* NEON quad precision pseudo registers (Q0~Q15). */
10898 tdep->q_pseudo_base = register_count + num_pseudos;
10900 if (have_neon)
10901 tdep->q_pseudo_count = 16;
10902 else if (have_mve)
10903 tdep->q_pseudo_count = ARM_MVE_NUM_Q_REGS;
10905 num_pseudos += tdep->q_pseudo_count;
10909 /* Do we have any MVE pseudo registers? */
10910 if (have_mve)
10912 tdep->mve_pseudo_base = register_count + num_pseudos;
10913 tdep->mve_pseudo_count = 1;
10914 num_pseudos += tdep->mve_pseudo_count;
10917 /* Do we have any ARMv8.1-m PACBTI pseudo registers. */
10918 if (have_pacbti)
10920 tdep->pacbti_pseudo_base = register_count + num_pseudos;
10921 tdep->pacbti_pseudo_count = 1;
10922 num_pseudos += tdep->pacbti_pseudo_count;
10925 /* Set some pseudo register hooks, if we have pseudo registers. */
10926 if (tdep->have_s_pseudos || have_mve || have_pacbti)
10928 set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
10929 set_gdbarch_pseudo_register_read_value (gdbarch, arm_pseudo_read_value);
10930 set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
10933 /* Add standard register aliases. We add aliases even for those
10934 names which are used by the current architecture - it's simpler,
10935 and does no harm, since nothing ever lists user registers. */
10936 for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
10937 user_reg_add (gdbarch, arm_register_aliases[i].name,
10938 value_of_arm_user_reg, &arm_register_aliases[i].regnum);
10940 set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
10941 set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
10943 set_gdbarch_gnu_triplet_regexp (gdbarch, arm_gnu_triplet_regexp);
10945 return gdbarch;
10948 static void
10949 arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
10951 arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10953 if (tdep == NULL)
10954 return;
10956 gdb_printf (file, _("arm_dump_tdep: fp_model = %i\n"),
10957 (int) tdep->fp_model);
10958 gdb_printf (file, _("arm_dump_tdep: have_fpa_registers = %i\n"),
10959 (int) tdep->have_fpa_registers);
10960 gdb_printf (file, _("arm_dump_tdep: have_wmmx_registers = %i\n"),
10961 (int) tdep->have_wmmx_registers);
10962 gdb_printf (file, _("arm_dump_tdep: vfp_register_count = %i\n"),
10963 (int) tdep->vfp_register_count);
10964 gdb_printf (file, _("arm_dump_tdep: have_s_pseudos = %s\n"),
10965 tdep->have_s_pseudos ? "true" : "false");
10966 gdb_printf (file, _("arm_dump_tdep: s_pseudo_base = %i\n"),
10967 (int) tdep->s_pseudo_base);
10968 gdb_printf (file, _("arm_dump_tdep: s_pseudo_count = %i\n"),
10969 (int) tdep->s_pseudo_count);
10970 gdb_printf (file, _("arm_dump_tdep: have_q_pseudos = %s\n"),
10971 tdep->have_q_pseudos ? "true" : "false");
10972 gdb_printf (file, _("arm_dump_tdep: q_pseudo_base = %i\n"),
10973 (int) tdep->q_pseudo_base);
10974 gdb_printf (file, _("arm_dump_tdep: q_pseudo_count = %i\n"),
10975 (int) tdep->q_pseudo_count);
10976 gdb_printf (file, _("arm_dump_tdep: have_neon = %i\n"),
10977 (int) tdep->have_neon);
10978 gdb_printf (file, _("arm_dump_tdep: have_mve = %s\n"),
10979 tdep->have_mve ? "yes" : "no");
10980 gdb_printf (file, _("arm_dump_tdep: mve_vpr_regnum = %i\n"),
10981 tdep->mve_vpr_regnum);
10982 gdb_printf (file, _("arm_dump_tdep: mve_pseudo_base = %i\n"),
10983 tdep->mve_pseudo_base);
10984 gdb_printf (file, _("arm_dump_tdep: mve_pseudo_count = %i\n"),
10985 tdep->mve_pseudo_count);
10986 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_regnum = %i\n"),
10987 tdep->m_profile_msp_regnum);
10988 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_regnum = %i\n"),
10989 tdep->m_profile_psp_regnum);
10990 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_ns_regnum = %i\n"),
10991 tdep->m_profile_msp_ns_regnum);
10992 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_ns_regnum = %i\n"),
10993 tdep->m_profile_psp_ns_regnum);
10994 gdb_printf (file, _("arm_dump_tdep: m_profile_msp_s_regnum = %i\n"),
10995 tdep->m_profile_msp_s_regnum);
10996 gdb_printf (file, _("arm_dump_tdep: m_profile_psp_s_regnum = %i\n"),
10997 tdep->m_profile_psp_s_regnum);
10998 gdb_printf (file, _("arm_dump_tdep: Lowest pc = 0x%lx\n"),
10999 (unsigned long) tdep->lowest_pc);
11000 gdb_printf (file, _("arm_dump_tdep: have_pacbti = %s\n"),
11001 tdep->have_pacbti ? "yes" : "no");
11002 gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_base = %i\n"),
11003 tdep->pacbti_pseudo_base);
11004 gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_count = %i\n"),
11005 tdep->pacbti_pseudo_count);
11006 gdb_printf (file, _("arm_dump_tdep: is_m = %s\n"),
11007 tdep->is_m ? "yes" : "no");
11010 #if GDB_SELF_TEST
11011 namespace selftests
11013 static void arm_record_test (void);
11014 static void arm_analyze_prologue_test ();
11016 #endif
11018 void _initialize_arm_tdep ();
11019 void
11020 _initialize_arm_tdep ()
11022 long length;
11023 int i, j;
11024 char regdesc[1024], *rdptr = regdesc;
11025 size_t rest = sizeof (regdesc);
11027 gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
11029 /* Add ourselves to objfile event chain. */
11030 gdb::observers::new_objfile.attach (arm_exidx_new_objfile, "arm-tdep");
11032 /* Register an ELF OS ABI sniffer for ARM binaries. */
11033 gdbarch_register_osabi_sniffer (bfd_arch_arm,
11034 bfd_target_elf_flavour,
11035 arm_elf_osabi_sniffer);
11037 /* Add root prefix command for all "set arm"/"show arm" commands. */
11038 add_setshow_prefix_cmd ("arm", no_class,
11039 _("Various ARM-specific commands."),
11040 _("Various ARM-specific commands."),
11041 &setarmcmdlist, &showarmcmdlist,
11042 &setlist, &showlist);
11044 arm_disassembler_options = "reg-names-std";
11045 const disasm_options_t *disasm_options
11046 = &disassembler_options_arm ()->options;
11047 int num_disassembly_styles = 0;
11048 for (i = 0; disasm_options->name[i] != NULL; i++)
11049 if (startswith (disasm_options->name[i], "reg-names-"))
11050 num_disassembly_styles++;
11052 /* Initialize the array that will be passed to add_setshow_enum_cmd(). */
11053 valid_disassembly_styles = XNEWVEC (const char *,
11054 num_disassembly_styles + 1);
11055 for (i = j = 0; disasm_options->name[i] != NULL; i++)
11056 if (startswith (disasm_options->name[i], "reg-names-"))
11058 size_t offset = strlen ("reg-names-");
11059 const char *style = disasm_options->name[i];
11060 valid_disassembly_styles[j++] = &style[offset];
11061 if (strcmp (&style[offset], "std") == 0)
11062 disassembly_style = &style[offset];
11063 length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
11064 disasm_options->description[i]);
11065 rdptr += length;
11066 rest -= length;
11068 /* Mark the end of valid options. */
11069 valid_disassembly_styles[num_disassembly_styles] = NULL;
11071 /* Create the help text. */
11072 std::string helptext = string_printf ("%s%s%s",
11073 _("The valid values are:\n"),
11074 regdesc,
11075 _("The default is \"std\"."));
11077 add_setshow_enum_cmd("disassembler", no_class,
11078 valid_disassembly_styles, &disassembly_style,
11079 _("Set the disassembly style."),
11080 _("Show the disassembly style."),
11081 helptext.c_str (),
11082 set_disassembly_style_sfunc,
11083 show_disassembly_style_sfunc,
11084 &setarmcmdlist, &showarmcmdlist);
11086 add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
11087 _("Set usage of ARM 32-bit mode."),
11088 _("Show usage of ARM 32-bit mode."),
11089 _("When off, a 26-bit PC will be used."),
11090 NULL,
11091 NULL, /* FIXME: i18n: Usage of ARM 32-bit
11092 mode is %s. */
11093 &setarmcmdlist, &showarmcmdlist);
11095 /* Add a command to allow the user to force the FPU model. */
11096 add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
11097 _("Set the floating point type."),
11098 _("Show the floating point type."),
11099 _("auto - Determine the FP typefrom the OS-ABI.\n\
11100 softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
11101 fpa - FPA co-processor (GCC compiled).\n\
11102 softvfp - Software FP with pure-endian doubles.\n\
11103 vfp - VFP co-processor."),
11104 set_fp_model_sfunc, show_fp_model,
11105 &setarmcmdlist, &showarmcmdlist);
11107 /* Add a command to allow the user to force the ABI. */
11108 add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
11109 _("Set the ABI."),
11110 _("Show the ABI."),
11111 NULL, arm_set_abi, arm_show_abi,
11112 &setarmcmdlist, &showarmcmdlist);
11114 /* Add two commands to allow the user to force the assumed
11115 execution mode. */
11116 add_setshow_enum_cmd ("fallback-mode", class_support,
11117 arm_mode_strings, &arm_fallback_mode_string,
11118 _("Set the mode assumed when symbols are unavailable."),
11119 _("Show the mode assumed when symbols are unavailable."),
11120 NULL, NULL, arm_show_fallback_mode,
11121 &setarmcmdlist, &showarmcmdlist);
11122 add_setshow_enum_cmd ("force-mode", class_support,
11123 arm_mode_strings, &arm_force_mode_string,
11124 _("Set the mode assumed even when symbols are available."),
11125 _("Show the mode assumed even when symbols are available."),
11126 NULL, NULL, arm_show_force_mode,
11127 &setarmcmdlist, &showarmcmdlist);
11129 /* Add a command to stop triggering security exceptions when
11130 unwinding exception stacks. */
11131 add_setshow_boolean_cmd ("unwind-secure-frames", no_class, &arm_unwind_secure_frames,
11132 _("Set usage of non-secure to secure exception stack unwinding."),
11133 _("Show usage of non-secure to secure exception stack unwinding."),
11134 _("When on, the debugger can trigger memory access traps."),
11135 NULL, arm_show_unwind_secure_frames,
11136 &setarmcmdlist, &showarmcmdlist);
11138 /* Debugging flag. */
11139 add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
11140 _("Set ARM debugging."),
11141 _("Show ARM debugging."),
11142 _("When on, arm-specific debugging is enabled."),
11143 NULL,
11144 NULL, /* FIXME: i18n: "ARM debugging is %s. */
11145 &setdebuglist, &showdebuglist);
11147 #if GDB_SELF_TEST
11148 selftests::register_test ("arm-record", selftests::arm_record_test);
11149 selftests::register_test ("arm_analyze_prologue", selftests::arm_analyze_prologue_test);
11150 #endif
11154 /* ARM-reversible process record data structures. */
11156 #define ARM_INSN_SIZE_BYTES 4
11157 #define THUMB_INSN_SIZE_BYTES 2
11158 #define THUMB2_INSN_SIZE_BYTES 4
11161 /* Position of the bit within a 32-bit ARM instruction
11162 that defines whether the instruction is a load or store. */
11163 #define INSN_S_L_BIT_NUM 20
11165 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
11166 do \
11168 unsigned int reg_len = LENGTH; \
11169 if (reg_len) \
11171 REGS = XNEWVEC (uint32_t, reg_len); \
11172 memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
11175 while (0)
11177 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
11178 do \
11180 unsigned int mem_len = LENGTH; \
11181 if (mem_len) \
11183 MEMS = XNEWVEC (struct arm_mem_r, mem_len); \
11184 memcpy(&MEMS->len, &RECORD_BUF[0], \
11185 sizeof(struct arm_mem_r) * LENGTH); \
11188 while (0)
11190 /* Checks whether insn is already recorded or yet to be decoded. (boolean expression). */
11191 #define INSN_RECORDED(ARM_RECORD) \
11192 (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
11194 /* ARM memory record structure. */
11195 struct arm_mem_r
11197 uint32_t len; /* Record length. */
11198 uint32_t addr; /* Memory address. */
11201 /* ARM instruction record contains opcode of current insn
11202 and execution state (before entry to decode_insn()),
11203 contains list of to-be-modified registers and
11204 memory blocks (on return from decode_insn()). */
11206 struct arm_insn_decode_record
11208 struct gdbarch *gdbarch;
11209 struct regcache *regcache;
11210 CORE_ADDR this_addr; /* Address of the insn being decoded. */
11211 uint32_t arm_insn; /* Should accommodate thumb. */
11212 uint32_t cond; /* Condition code. */
11213 uint32_t opcode; /* Insn opcode. */
11214 uint32_t decode; /* Insn decode bits. */
11215 uint32_t mem_rec_count; /* No of mem records. */
11216 uint32_t reg_rec_count; /* No of reg records. */
11217 uint32_t *arm_regs; /* Registers to be saved for this record. */
11218 struct arm_mem_r *arm_mems; /* Memory to be saved for this record. */
11222 /* Checks ARM SBZ and SBO mandatory fields. */
11224 static int
11225 sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
11227 uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
11229 if (!len)
11230 return 1;
11232 if (!sbo)
11233 ones = ~ones;
11235 while (ones)
11237 if (!(ones & sbo))
11239 return 0;
11241 ones = ones >> 1;
11243 return 1;
11246 enum arm_record_result
11248 ARM_RECORD_SUCCESS = 0,
11249 ARM_RECORD_FAILURE = 1
11252 enum arm_record_strx_t
11254 ARM_RECORD_STRH=1,
11255 ARM_RECORD_STRD
11258 enum record_type_t
11260 ARM_RECORD=1,
11261 THUMB_RECORD,
11262 THUMB2_RECORD
11266 static int
11267 arm_record_strx (arm_insn_decode_record *arm_insn_r, uint32_t *record_buf,
11268 uint32_t *record_buf_mem, arm_record_strx_t str_type)
11271 struct regcache *reg_cache = arm_insn_r->regcache;
11272 ULONGEST u_regval[2]= {0};
11274 uint32_t reg_src1 = 0, reg_src2 = 0;
11275 uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
11277 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11278 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11280 if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11282 /* 1) Handle misc store, immediate offset. */
11283 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11284 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11285 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11286 regcache_raw_read_unsigned (reg_cache, reg_src1,
11287 &u_regval[0]);
11288 if (ARM_PC_REGNUM == reg_src1)
11290 /* If R15 was used as Rn, hence current PC+8. */
11291 u_regval[0] = u_regval[0] + 8;
11293 offset_8 = (immed_high << 4) | immed_low;
11294 /* Calculate target store address. */
11295 if (14 == arm_insn_r->opcode)
11297 tgt_mem_addr = u_regval[0] + offset_8;
11299 else
11301 tgt_mem_addr = u_regval[0] - offset_8;
11303 if (ARM_RECORD_STRH == str_type)
11305 record_buf_mem[0] = 2;
11306 record_buf_mem[1] = tgt_mem_addr;
11307 arm_insn_r->mem_rec_count = 1;
11309 else if (ARM_RECORD_STRD == str_type)
11311 record_buf_mem[0] = 4;
11312 record_buf_mem[1] = tgt_mem_addr;
11313 record_buf_mem[2] = 4;
11314 record_buf_mem[3] = tgt_mem_addr + 4;
11315 arm_insn_r->mem_rec_count = 2;
11318 else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
11320 /* 2) Store, register offset. */
11321 /* Get Rm. */
11322 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11323 /* Get Rn. */
11324 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11325 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11326 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11327 if (15 == reg_src2)
11329 /* If R15 was used as Rn, hence current PC+8. */
11330 u_regval[0] = u_regval[0] + 8;
11332 /* Calculate target store address, Rn +/- Rm, register offset. */
11333 if (12 == arm_insn_r->opcode)
11335 tgt_mem_addr = u_regval[0] + u_regval[1];
11337 else
11339 tgt_mem_addr = u_regval[1] - u_regval[0];
11341 if (ARM_RECORD_STRH == str_type)
11343 record_buf_mem[0] = 2;
11344 record_buf_mem[1] = tgt_mem_addr;
11345 arm_insn_r->mem_rec_count = 1;
11347 else if (ARM_RECORD_STRD == str_type)
11349 record_buf_mem[0] = 4;
11350 record_buf_mem[1] = tgt_mem_addr;
11351 record_buf_mem[2] = 4;
11352 record_buf_mem[3] = tgt_mem_addr + 4;
11353 arm_insn_r->mem_rec_count = 2;
11356 else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11357 || 2 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
11359 /* 3) Store, immediate pre-indexed. */
11360 /* 5) Store, immediate post-indexed. */
11361 immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11362 immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11363 offset_8 = (immed_high << 4) | immed_low;
11364 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11365 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11366 /* Calculate target store address, Rn +/- Rm, register offset. */
11367 if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
11369 tgt_mem_addr = u_regval[0] + offset_8;
11371 else
11373 tgt_mem_addr = u_regval[0] - offset_8;
11375 if (ARM_RECORD_STRH == str_type)
11377 record_buf_mem[0] = 2;
11378 record_buf_mem[1] = tgt_mem_addr;
11379 arm_insn_r->mem_rec_count = 1;
11381 else if (ARM_RECORD_STRD == str_type)
11383 record_buf_mem[0] = 4;
11384 record_buf_mem[1] = tgt_mem_addr;
11385 record_buf_mem[2] = 4;
11386 record_buf_mem[3] = tgt_mem_addr + 4;
11387 arm_insn_r->mem_rec_count = 2;
11389 /* Record Rn also as it changes. */
11390 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11391 arm_insn_r->reg_rec_count = 1;
11393 else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
11394 || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11396 /* 4) Store, register pre-indexed. */
11397 /* 6) Store, register post -indexed. */
11398 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11399 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11400 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11401 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11402 /* Calculate target store address, Rn +/- Rm, register offset. */
11403 if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11405 tgt_mem_addr = u_regval[0] + u_regval[1];
11407 else
11409 tgt_mem_addr = u_regval[1] - u_regval[0];
11411 if (ARM_RECORD_STRH == str_type)
11413 record_buf_mem[0] = 2;
11414 record_buf_mem[1] = tgt_mem_addr;
11415 arm_insn_r->mem_rec_count = 1;
11417 else if (ARM_RECORD_STRD == str_type)
11419 record_buf_mem[0] = 4;
11420 record_buf_mem[1] = tgt_mem_addr;
11421 record_buf_mem[2] = 4;
11422 record_buf_mem[3] = tgt_mem_addr + 4;
11423 arm_insn_r->mem_rec_count = 2;
11425 /* Record Rn also as it changes. */
11426 *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11427 arm_insn_r->reg_rec_count = 1;
11429 return 0;
11432 /* Handling ARM extension space insns. */
11434 static int
11435 arm_record_extension_space (arm_insn_decode_record *arm_insn_r)
11437 int ret = 0; /* Return value: -1:record failure ; 0:success */
11438 uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
11439 uint32_t record_buf[8], record_buf_mem[8];
11440 uint32_t reg_src1 = 0;
11441 struct regcache *reg_cache = arm_insn_r->regcache;
11442 ULONGEST u_regval = 0;
11444 gdb_assert (!INSN_RECORDED(arm_insn_r));
11445 /* Handle unconditional insn extension space. */
11447 opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
11448 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11449 if (arm_insn_r->cond)
11451 /* PLD has no affect on architectural state, it just affects
11452 the caches. */
11453 if (5 == ((opcode1 & 0xE0) >> 5))
11455 /* BLX(1) */
11456 record_buf[0] = ARM_PS_REGNUM;
11457 record_buf[1] = ARM_LR_REGNUM;
11458 arm_insn_r->reg_rec_count = 2;
11460 /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn. */
11464 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11465 if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
11467 ret = -1;
11468 /* Undefined instruction on ARM V5; need to handle if later
11469 versions define it. */
11472 opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
11473 opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11474 insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
11476 /* Handle arithmetic insn extension space. */
11477 if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
11478 && !INSN_RECORDED(arm_insn_r))
11480 /* Handle MLA(S) and MUL(S). */
11481 if (in_inclusive_range (insn_op1, 0U, 3U))
11483 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11484 record_buf[1] = ARM_PS_REGNUM;
11485 arm_insn_r->reg_rec_count = 2;
11487 else if (in_inclusive_range (insn_op1, 4U, 15U))
11489 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
11490 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11491 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11492 record_buf[2] = ARM_PS_REGNUM;
11493 arm_insn_r->reg_rec_count = 3;
11497 opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
11498 opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
11499 insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
11501 /* Handle control insn extension space. */
11503 if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
11504 && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
11506 if (!bit (arm_insn_r->arm_insn,25))
11508 if (!bits (arm_insn_r->arm_insn, 4, 7))
11510 if ((0 == insn_op1) || (2 == insn_op1))
11512 /* MRS. */
11513 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11514 arm_insn_r->reg_rec_count = 1;
11516 else if (1 == insn_op1)
11518 /* CSPR is going to be changed. */
11519 record_buf[0] = ARM_PS_REGNUM;
11520 arm_insn_r->reg_rec_count = 1;
11522 else if (3 == insn_op1)
11524 /* SPSR is going to be changed. */
11525 /* We need to get SPSR value, which is yet to be done. */
11526 return -1;
11529 else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
11531 if (1 == insn_op1)
11533 /* BX. */
11534 record_buf[0] = ARM_PS_REGNUM;
11535 arm_insn_r->reg_rec_count = 1;
11537 else if (3 == insn_op1)
11539 /* CLZ. */
11540 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11541 arm_insn_r->reg_rec_count = 1;
11544 else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
11546 /* BLX. */
11547 record_buf[0] = ARM_PS_REGNUM;
11548 record_buf[1] = ARM_LR_REGNUM;
11549 arm_insn_r->reg_rec_count = 2;
11551 else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
11553 /* QADD, QSUB, QDADD, QDSUB */
11554 record_buf[0] = ARM_PS_REGNUM;
11555 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11556 arm_insn_r->reg_rec_count = 2;
11558 else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
11560 /* BKPT. */
11561 record_buf[0] = ARM_PS_REGNUM;
11562 record_buf[1] = ARM_LR_REGNUM;
11563 arm_insn_r->reg_rec_count = 2;
11565 /* Save SPSR also;how? */
11566 return -1;
11568 else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
11569 || 10 == bits (arm_insn_r->arm_insn, 4, 7)
11570 || 12 == bits (arm_insn_r->arm_insn, 4, 7)
11571 || 14 == bits (arm_insn_r->arm_insn, 4, 7)
11574 if (0 == insn_op1 || 1 == insn_op1)
11576 /* SMLA<x><y>, SMLAW<y>, SMULW<y>. */
11577 /* We dont do optimization for SMULW<y> where we
11578 need only Rd. */
11579 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11580 record_buf[1] = ARM_PS_REGNUM;
11581 arm_insn_r->reg_rec_count = 2;
11583 else if (2 == insn_op1)
11585 /* SMLAL<x><y>. */
11586 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11587 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11588 arm_insn_r->reg_rec_count = 2;
11590 else if (3 == insn_op1)
11592 /* SMUL<x><y>. */
11593 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11594 arm_insn_r->reg_rec_count = 1;
11598 else
11600 /* MSR : immediate form. */
11601 if (1 == insn_op1)
11603 /* CSPR is going to be changed. */
11604 record_buf[0] = ARM_PS_REGNUM;
11605 arm_insn_r->reg_rec_count = 1;
11607 else if (3 == insn_op1)
11609 /* SPSR is going to be changed. */
11610 /* we need to get SPSR value, which is yet to be done */
11611 return -1;
11616 opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11617 opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
11618 insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
11620 /* Handle load/store insn extension space. */
11622 if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
11623 && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
11624 && !INSN_RECORDED(arm_insn_r))
11626 /* SWP/SWPB. */
11627 if (0 == insn_op1)
11629 /* These insn, changes register and memory as well. */
11630 /* SWP or SWPB insn. */
11631 /* Get memory address given by Rn. */
11632 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11633 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11634 /* SWP insn ?, swaps word. */
11635 if (8 == arm_insn_r->opcode)
11637 record_buf_mem[0] = 4;
11639 else
11641 /* SWPB insn, swaps only byte. */
11642 record_buf_mem[0] = 1;
11644 record_buf_mem[1] = u_regval;
11645 arm_insn_r->mem_rec_count = 1;
11646 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11647 arm_insn_r->reg_rec_count = 1;
11649 else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11651 /* STRH. */
11652 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11653 ARM_RECORD_STRH);
11655 else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11657 /* LDRD. */
11658 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11659 record_buf[1] = record_buf[0] + 1;
11660 arm_insn_r->reg_rec_count = 2;
11662 else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11664 /* STRD. */
11665 arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11666 ARM_RECORD_STRD);
11668 else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
11670 /* LDRH, LDRSB, LDRSH. */
11671 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11672 arm_insn_r->reg_rec_count = 1;
11677 opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
11678 if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
11679 && !INSN_RECORDED(arm_insn_r))
11681 ret = -1;
11682 /* Handle coprocessor insn extension space. */
11685 /* To be done for ARMv5 and later; as of now we return -1. */
11686 if (-1 == ret)
11687 return ret;
11689 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11690 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11692 return ret;
11695 /* Handling opcode 000 insns. */
11697 static int
11698 arm_record_data_proc_misc_ld_str (arm_insn_decode_record *arm_insn_r)
11700 struct regcache *reg_cache = arm_insn_r->regcache;
11701 uint32_t record_buf[8], record_buf_mem[8];
11702 ULONGEST u_regval[2] = {0};
11704 uint32_t reg_src1 = 0;
11705 uint32_t opcode1 = 0;
11707 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11708 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11709 opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
11711 if (!((opcode1 & 0x19) == 0x10))
11713 /* Data-processing (register) and Data-processing (register-shifted
11714 register */
11715 /* Out of 11 shifter operands mode, all the insn modifies destination
11716 register, which is specified by 13-16 decode. */
11717 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11718 record_buf[1] = ARM_PS_REGNUM;
11719 arm_insn_r->reg_rec_count = 2;
11721 else if ((arm_insn_r->decode < 8) && ((opcode1 & 0x19) == 0x10))
11723 /* Miscellaneous instructions */
11725 if (3 == arm_insn_r->decode && 0x12 == opcode1
11726 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11728 /* Handle BLX, branch and link/exchange. */
11729 if (9 == arm_insn_r->opcode)
11731 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
11732 and R14 stores the return address. */
11733 record_buf[0] = ARM_PS_REGNUM;
11734 record_buf[1] = ARM_LR_REGNUM;
11735 arm_insn_r->reg_rec_count = 2;
11738 else if (7 == arm_insn_r->decode && 0x12 == opcode1)
11740 /* Handle enhanced software breakpoint insn, BKPT. */
11741 /* CPSR is changed to be executed in ARM state, disabling normal
11742 interrupts, entering abort mode. */
11743 /* According to high vector configuration PC is set. */
11744 /* user hit breakpoint and type reverse, in
11745 that case, we need to go back with previous CPSR and
11746 Program Counter. */
11747 record_buf[0] = ARM_PS_REGNUM;
11748 record_buf[1] = ARM_LR_REGNUM;
11749 arm_insn_r->reg_rec_count = 2;
11751 /* Save SPSR also; how? */
11752 return -1;
11754 else if (1 == arm_insn_r->decode && 0x12 == opcode1
11755 && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11757 /* Handle BX, branch and link/exchange. */
11758 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm. */
11759 record_buf[0] = ARM_PS_REGNUM;
11760 arm_insn_r->reg_rec_count = 1;
11762 else if (1 == arm_insn_r->decode && 0x16 == opcode1
11763 && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
11764 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
11766 /* Count leading zeros: CLZ. */
11767 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11768 arm_insn_r->reg_rec_count = 1;
11770 else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11771 && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11772 && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
11773 && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0))
11775 /* Handle MRS insn. */
11776 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11777 arm_insn_r->reg_rec_count = 1;
11780 else if (9 == arm_insn_r->decode && opcode1 < 0x10)
11782 /* Multiply and multiply-accumulate */
11784 /* Handle multiply instructions. */
11785 /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL. */
11786 if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
11788 /* Handle MLA and MUL. */
11789 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11790 record_buf[1] = ARM_PS_REGNUM;
11791 arm_insn_r->reg_rec_count = 2;
11793 else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11795 /* Handle SMLAL, SMULL, UMLAL, UMULL. */
11796 record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11797 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11798 record_buf[2] = ARM_PS_REGNUM;
11799 arm_insn_r->reg_rec_count = 3;
11802 else if (9 == arm_insn_r->decode && opcode1 > 0x10)
11804 /* Synchronization primitives */
11806 /* Handling SWP, SWPB. */
11807 /* These insn, changes register and memory as well. */
11808 /* SWP or SWPB insn. */
11810 reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11811 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11812 /* SWP insn ?, swaps word. */
11813 if (8 == arm_insn_r->opcode)
11815 record_buf_mem[0] = 4;
11817 else
11819 /* SWPB insn, swaps only byte. */
11820 record_buf_mem[0] = 1;
11822 record_buf_mem[1] = u_regval[0];
11823 arm_insn_r->mem_rec_count = 1;
11824 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11825 arm_insn_r->reg_rec_count = 1;
11827 else if (11 == arm_insn_r->decode || 13 == arm_insn_r->decode
11828 || 15 == arm_insn_r->decode)
11830 if ((opcode1 & 0x12) == 2)
11832 /* Extra load/store (unprivileged) */
11833 return -1;
11835 else
11837 /* Extra load/store */
11838 switch (bits (arm_insn_r->arm_insn, 5, 6))
11840 case 1:
11841 if ((opcode1 & 0x05) == 0x0 || (opcode1 & 0x05) == 0x4)
11843 /* STRH (register), STRH (immediate) */
11844 arm_record_strx (arm_insn_r, &record_buf[0],
11845 &record_buf_mem[0], ARM_RECORD_STRH);
11847 else if ((opcode1 & 0x05) == 0x1)
11849 /* LDRH (register) */
11850 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11851 arm_insn_r->reg_rec_count = 1;
11853 if (bit (arm_insn_r->arm_insn, 21))
11855 /* Write back to Rn. */
11856 record_buf[arm_insn_r->reg_rec_count++]
11857 = bits (arm_insn_r->arm_insn, 16, 19);
11860 else if ((opcode1 & 0x05) == 0x5)
11862 /* LDRH (immediate), LDRH (literal) */
11863 int rn = bits (arm_insn_r->arm_insn, 16, 19);
11865 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11866 arm_insn_r->reg_rec_count = 1;
11868 if (rn != 15)
11870 /*LDRH (immediate) */
11871 if (bit (arm_insn_r->arm_insn, 21))
11873 /* Write back to Rn. */
11874 record_buf[arm_insn_r->reg_rec_count++] = rn;
11878 else
11879 return -1;
11880 break;
11881 case 2:
11882 if ((opcode1 & 0x05) == 0x0)
11884 /* LDRD (register) */
11885 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11886 record_buf[1] = record_buf[0] + 1;
11887 arm_insn_r->reg_rec_count = 2;
11889 if (bit (arm_insn_r->arm_insn, 21))
11891 /* Write back to Rn. */
11892 record_buf[arm_insn_r->reg_rec_count++]
11893 = bits (arm_insn_r->arm_insn, 16, 19);
11896 else if ((opcode1 & 0x05) == 0x1)
11898 /* LDRSB (register) */
11899 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11900 arm_insn_r->reg_rec_count = 1;
11902 if (bit (arm_insn_r->arm_insn, 21))
11904 /* Write back to Rn. */
11905 record_buf[arm_insn_r->reg_rec_count++]
11906 = bits (arm_insn_r->arm_insn, 16, 19);
11909 else if ((opcode1 & 0x05) == 0x4 || (opcode1 & 0x05) == 0x5)
11911 /* LDRD (immediate), LDRD (literal), LDRSB (immediate),
11912 LDRSB (literal) */
11913 int rn = bits (arm_insn_r->arm_insn, 16, 19);
11915 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11916 arm_insn_r->reg_rec_count = 1;
11918 if (rn != 15)
11920 /*LDRD (immediate), LDRSB (immediate) */
11921 if (bit (arm_insn_r->arm_insn, 21))
11923 /* Write back to Rn. */
11924 record_buf[arm_insn_r->reg_rec_count++] = rn;
11928 else
11929 return -1;
11930 break;
11931 case 3:
11932 if ((opcode1 & 0x05) == 0x0)
11934 /* STRD (register) */
11935 arm_record_strx (arm_insn_r, &record_buf[0],
11936 &record_buf_mem[0], ARM_RECORD_STRD);
11938 else if ((opcode1 & 0x05) == 0x1)
11940 /* LDRSH (register) */
11941 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11942 arm_insn_r->reg_rec_count = 1;
11944 if (bit (arm_insn_r->arm_insn, 21))
11946 /* Write back to Rn. */
11947 record_buf[arm_insn_r->reg_rec_count++]
11948 = bits (arm_insn_r->arm_insn, 16, 19);
11951 else if ((opcode1 & 0x05) == 0x4)
11953 /* STRD (immediate) */
11954 arm_record_strx (arm_insn_r, &record_buf[0],
11955 &record_buf_mem[0], ARM_RECORD_STRD);
11957 else if ((opcode1 & 0x05) == 0x5)
11959 /* LDRSH (immediate), LDRSH (literal) */
11960 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11961 arm_insn_r->reg_rec_count = 1;
11963 if (bit (arm_insn_r->arm_insn, 21))
11965 /* Write back to Rn. */
11966 record_buf[arm_insn_r->reg_rec_count++]
11967 = bits (arm_insn_r->arm_insn, 16, 19);
11970 else
11971 return -1;
11972 break;
11973 default:
11974 return -1;
11978 else
11980 return -1;
11983 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11984 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11985 return 0;
11988 /* Handling opcode 001 insns. */
11990 static int
11991 arm_record_data_proc_imm (arm_insn_decode_record *arm_insn_r)
11993 uint32_t record_buf[8], record_buf_mem[8];
11995 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11996 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11998 if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
11999 && 2 == bits (arm_insn_r->arm_insn, 20, 21)
12000 && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
12003 /* Handle MSR insn. */
12004 if (9 == arm_insn_r->opcode)
12006 /* CSPR is going to be changed. */
12007 record_buf[0] = ARM_PS_REGNUM;
12008 arm_insn_r->reg_rec_count = 1;
12010 else
12012 /* SPSR is going to be changed. */
12015 else if (arm_insn_r->opcode <= 15)
12017 /* Normal data processing insns. */
12018 /* Out of 11 shifter operands mode, all the insn modifies destination
12019 register, which is specified by 13-16 decode. */
12020 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12021 record_buf[1] = ARM_PS_REGNUM;
12022 arm_insn_r->reg_rec_count = 2;
12024 else
12026 return -1;
12029 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12030 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12031 return 0;
12034 static int
12035 arm_record_media (arm_insn_decode_record *arm_insn_r)
12037 uint32_t record_buf[8];
12039 switch (bits (arm_insn_r->arm_insn, 22, 24))
12041 case 0:
12042 /* Parallel addition and subtraction, signed */
12043 case 1:
12044 /* Parallel addition and subtraction, unsigned */
12045 case 2:
12046 case 3:
12047 /* Packing, unpacking, saturation and reversal */
12049 int rd = bits (arm_insn_r->arm_insn, 12, 15);
12051 record_buf[arm_insn_r->reg_rec_count++] = rd;
12053 break;
12055 case 4:
12056 case 5:
12057 /* Signed multiplies */
12059 int rd = bits (arm_insn_r->arm_insn, 16, 19);
12060 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
12062 record_buf[arm_insn_r->reg_rec_count++] = rd;
12063 if (op1 == 0x0)
12064 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12065 else if (op1 == 0x4)
12066 record_buf[arm_insn_r->reg_rec_count++]
12067 = bits (arm_insn_r->arm_insn, 12, 15);
12069 break;
12071 case 6:
12073 if (bit (arm_insn_r->arm_insn, 21)
12074 && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
12076 /* SBFX */
12077 record_buf[arm_insn_r->reg_rec_count++]
12078 = bits (arm_insn_r->arm_insn, 12, 15);
12080 else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
12081 && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
12083 /* USAD8 and USADA8 */
12084 record_buf[arm_insn_r->reg_rec_count++]
12085 = bits (arm_insn_r->arm_insn, 16, 19);
12088 break;
12090 case 7:
12092 if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
12093 && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
12095 /* Permanently UNDEFINED */
12096 return -1;
12098 else
12100 /* BFC, BFI and UBFX */
12101 record_buf[arm_insn_r->reg_rec_count++]
12102 = bits (arm_insn_r->arm_insn, 12, 15);
12105 break;
12107 default:
12108 return -1;
12111 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12113 return 0;
12116 /* Handle ARM mode instructions with opcode 010. */
12118 static int
12119 arm_record_ld_st_imm_offset (arm_insn_decode_record *arm_insn_r)
12121 struct regcache *reg_cache = arm_insn_r->regcache;
12123 uint32_t reg_base , reg_dest;
12124 uint32_t offset_12, tgt_mem_addr;
12125 uint32_t record_buf[8], record_buf_mem[8];
12126 unsigned char wback;
12127 ULONGEST u_regval;
12129 /* Calculate wback. */
12130 wback = (bit (arm_insn_r->arm_insn, 24) == 0)
12131 || (bit (arm_insn_r->arm_insn, 21) == 1);
12133 arm_insn_r->reg_rec_count = 0;
12134 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12136 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12138 /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
12139 and LDRT. */
12141 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12142 record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
12144 /* The LDR instruction is capable of doing branching. If MOV LR, PC
12145 precedes a LDR instruction having R15 as reg_base, it
12146 emulates a branch and link instruction, and hence we need to save
12147 CPSR and PC as well. */
12148 if (ARM_PC_REGNUM == reg_dest)
12149 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12151 /* If wback is true, also save the base register, which is going to be
12152 written to. */
12153 if (wback)
12154 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12156 else
12158 /* STR (immediate), STRB (immediate), STRBT and STRT. */
12160 offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
12161 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12163 /* Handle bit U. */
12164 if (bit (arm_insn_r->arm_insn, 23))
12166 /* U == 1: Add the offset. */
12167 tgt_mem_addr = (uint32_t) u_regval + offset_12;
12169 else
12171 /* U == 0: subtract the offset. */
12172 tgt_mem_addr = (uint32_t) u_regval - offset_12;
12175 /* Bit 22 tells us whether the store instruction writes 1 byte or 4
12176 bytes. */
12177 if (bit (arm_insn_r->arm_insn, 22))
12179 /* STRB and STRBT: 1 byte. */
12180 record_buf_mem[0] = 1;
12182 else
12184 /* STR and STRT: 4 bytes. */
12185 record_buf_mem[0] = 4;
12188 /* Handle bit P. */
12189 if (bit (arm_insn_r->arm_insn, 24))
12190 record_buf_mem[1] = tgt_mem_addr;
12191 else
12192 record_buf_mem[1] = (uint32_t) u_regval;
12194 arm_insn_r->mem_rec_count = 1;
12196 /* If wback is true, also save the base register, which is going to be
12197 written to. */
12198 if (wback)
12199 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12202 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12203 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12204 return 0;
12207 /* Handling opcode 011 insns. */
12209 static int
12210 arm_record_ld_st_reg_offset (arm_insn_decode_record *arm_insn_r)
12212 struct regcache *reg_cache = arm_insn_r->regcache;
12214 uint32_t shift_imm = 0;
12215 uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
12216 uint32_t offset_12 = 0, tgt_mem_addr = 0;
12217 uint32_t record_buf[8], record_buf_mem[8];
12219 LONGEST s_word;
12220 ULONGEST u_regval[2];
12222 if (bit (arm_insn_r->arm_insn, 4))
12223 return arm_record_media (arm_insn_r);
12225 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
12226 arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
12228 /* Handle enhanced store insns and LDRD DSP insn,
12229 order begins according to addressing modes for store insns
12230 STRH insn. */
12232 /* LDR or STR? */
12233 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12235 reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12236 /* LDR insn has a capability to do branching, if
12237 MOV LR, PC is preceded by LDR insn having Rn as R15
12238 in that case, it emulates branch and link insn, and hence we
12239 need to save CSPR and PC as well. */
12240 if (15 != reg_dest)
12242 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12243 arm_insn_r->reg_rec_count = 1;
12245 else
12247 record_buf[0] = reg_dest;
12248 record_buf[1] = ARM_PS_REGNUM;
12249 arm_insn_r->reg_rec_count = 2;
12252 else
12254 if (! bits (arm_insn_r->arm_insn, 4, 11))
12256 /* Store insn, register offset and register pre-indexed,
12257 register post-indexed. */
12258 /* Get Rm. */
12259 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12260 /* Get Rn. */
12261 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12262 regcache_raw_read_unsigned (reg_cache, reg_src1
12263 , &u_regval[0]);
12264 regcache_raw_read_unsigned (reg_cache, reg_src2
12265 , &u_regval[1]);
12266 if (15 == reg_src2)
12268 /* If R15 was used as Rn, hence current PC+8. */
12269 /* Pre-indexed mode doesn't reach here ; illegal insn. */
12270 u_regval[0] = u_regval[0] + 8;
12272 /* Calculate target store address, Rn +/- Rm, register offset. */
12273 /* U == 1. */
12274 if (bit (arm_insn_r->arm_insn, 23))
12276 tgt_mem_addr = u_regval[0] + u_regval[1];
12278 else
12280 tgt_mem_addr = u_regval[1] - u_regval[0];
12283 switch (arm_insn_r->opcode)
12285 /* STR. */
12286 case 8:
12287 case 12:
12288 /* STR. */
12289 case 9:
12290 case 13:
12291 /* STRT. */
12292 case 1:
12293 case 5:
12294 /* STR. */
12295 case 0:
12296 case 4:
12297 record_buf_mem[0] = 4;
12298 break;
12300 /* STRB. */
12301 case 10:
12302 case 14:
12303 /* STRB. */
12304 case 11:
12305 case 15:
12306 /* STRBT. */
12307 case 3:
12308 case 7:
12309 /* STRB. */
12310 case 2:
12311 case 6:
12312 record_buf_mem[0] = 1;
12313 break;
12315 default:
12316 gdb_assert_not_reached ("no decoding pattern found");
12317 break;
12319 record_buf_mem[1] = tgt_mem_addr;
12320 arm_insn_r->mem_rec_count = 1;
12322 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12323 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12324 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12325 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12326 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12327 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12330 /* Rn is going to be changed in pre-indexed mode and
12331 post-indexed mode as well. */
12332 record_buf[0] = reg_src2;
12333 arm_insn_r->reg_rec_count = 1;
12336 else
12338 /* Store insn, scaled register offset; scaled pre-indexed. */
12339 offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
12340 /* Get Rm. */
12341 reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12342 /* Get Rn. */
12343 reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12344 /* Get shift_imm. */
12345 shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
12346 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
12347 regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
12348 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12349 /* Offset_12 used as shift. */
12350 switch (offset_12)
12352 case 0:
12353 /* Offset_12 used as index. */
12354 offset_12 = u_regval[0] << shift_imm;
12355 break;
12357 case 1:
12358 offset_12 = (!shift_imm) ? 0 : u_regval[0] >> shift_imm;
12359 break;
12361 case 2:
12362 if (!shift_imm)
12364 if (bit (u_regval[0], 31))
12366 offset_12 = 0xFFFFFFFF;
12368 else
12370 offset_12 = 0;
12373 else
12375 /* This is arithmetic shift. */
12376 offset_12 = s_word >> shift_imm;
12378 break;
12380 case 3:
12381 if (!shift_imm)
12383 regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
12384 &u_regval[1]);
12385 /* Get C flag value and shift it by 31. */
12386 offset_12 = (((bit (u_regval[1], 29)) << 31) \
12387 | (u_regval[0]) >> 1);
12389 else
12391 offset_12 = (u_regval[0] >> shift_imm) \
12392 | (u_regval[0] <<
12393 (sizeof(uint32_t) - shift_imm));
12395 break;
12397 default:
12398 gdb_assert_not_reached ("no decoding pattern found");
12399 break;
12402 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12403 /* bit U set. */
12404 if (bit (arm_insn_r->arm_insn, 23))
12406 tgt_mem_addr = u_regval[1] + offset_12;
12408 else
12410 tgt_mem_addr = u_regval[1] - offset_12;
12413 switch (arm_insn_r->opcode)
12415 /* STR. */
12416 case 8:
12417 case 12:
12418 /* STR. */
12419 case 9:
12420 case 13:
12421 /* STRT. */
12422 case 1:
12423 case 5:
12424 /* STR. */
12425 case 0:
12426 case 4:
12427 record_buf_mem[0] = 4;
12428 break;
12430 /* STRB. */
12431 case 10:
12432 case 14:
12433 /* STRB. */
12434 case 11:
12435 case 15:
12436 /* STRBT. */
12437 case 3:
12438 case 7:
12439 /* STRB. */
12440 case 2:
12441 case 6:
12442 record_buf_mem[0] = 1;
12443 break;
12445 default:
12446 gdb_assert_not_reached ("no decoding pattern found");
12447 break;
12449 record_buf_mem[1] = tgt_mem_addr;
12450 arm_insn_r->mem_rec_count = 1;
12452 if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12453 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12454 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12455 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12456 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12457 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12460 /* Rn is going to be changed in register scaled pre-indexed
12461 mode,and scaled post indexed mode. */
12462 record_buf[0] = reg_src2;
12463 arm_insn_r->reg_rec_count = 1;
12468 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12469 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12470 return 0;
12473 /* Handle ARM mode instructions with opcode 100. */
12475 static int
12476 arm_record_ld_st_multiple (arm_insn_decode_record *arm_insn_r)
12478 struct regcache *reg_cache = arm_insn_r->regcache;
12479 uint32_t register_count = 0, register_bits;
12480 uint32_t reg_base, addr_mode;
12481 uint32_t record_buf[24], record_buf_mem[48];
12482 uint32_t wback;
12483 ULONGEST u_regval;
12485 /* Fetch the list of registers. */
12486 register_bits = bits (arm_insn_r->arm_insn, 0, 15);
12487 arm_insn_r->reg_rec_count = 0;
12489 /* Fetch the base register that contains the address we are loading data
12490 to. */
12491 reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12493 /* Calculate wback. */
12494 wback = (bit (arm_insn_r->arm_insn, 21) == 1);
12496 if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12498 /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB. */
12500 /* Find out which registers are going to be loaded from memory. */
12501 while (register_bits)
12503 if (register_bits & 0x00000001)
12504 record_buf[arm_insn_r->reg_rec_count++] = register_count;
12505 register_bits = register_bits >> 1;
12506 register_count++;
12510 /* If wback is true, also save the base register, which is going to be
12511 written to. */
12512 if (wback)
12513 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12515 /* Save the CPSR register. */
12516 record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12518 else
12520 /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA). */
12522 addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
12524 regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12526 /* Find out how many registers are going to be stored to memory. */
12527 while (register_bits)
12529 if (register_bits & 0x00000001)
12530 register_count++;
12531 register_bits = register_bits >> 1;
12534 switch (addr_mode)
12536 /* STMDA (STMED): Decrement after. */
12537 case 0:
12538 record_buf_mem[1] = (uint32_t) u_regval
12539 - register_count * ARM_INT_REGISTER_SIZE + 4;
12540 break;
12541 /* STM (STMIA, STMEA): Increment after. */
12542 case 1:
12543 record_buf_mem[1] = (uint32_t) u_regval;
12544 break;
12545 /* STMDB (STMFD): Decrement before. */
12546 case 2:
12547 record_buf_mem[1] = (uint32_t) u_regval
12548 - register_count * ARM_INT_REGISTER_SIZE;
12549 break;
12550 /* STMIB (STMFA): Increment before. */
12551 case 3:
12552 record_buf_mem[1] = (uint32_t) u_regval + ARM_INT_REGISTER_SIZE;
12553 break;
12554 default:
12555 gdb_assert_not_reached ("no decoding pattern found");
12556 break;
12559 record_buf_mem[0] = register_count * ARM_INT_REGISTER_SIZE;
12560 arm_insn_r->mem_rec_count = 1;
12562 /* If wback is true, also save the base register, which is going to be
12563 written to. */
12564 if (wback)
12565 record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12568 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12569 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12570 return 0;
12573 /* Handling opcode 101 insns. */
12575 static int
12576 arm_record_b_bl (arm_insn_decode_record *arm_insn_r)
12578 uint32_t record_buf[8];
12580 /* Handle B, BL, BLX(1) insns. */
12581 /* B simply branches so we do nothing here. */
12582 /* Note: BLX(1) doesn't fall here but instead it falls into
12583 extension space. */
12584 if (bit (arm_insn_r->arm_insn, 24))
12586 record_buf[0] = ARM_LR_REGNUM;
12587 arm_insn_r->reg_rec_count = 1;
12590 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12592 return 0;
12595 static int
12596 arm_record_unsupported_insn (arm_insn_decode_record *arm_insn_r)
12598 gdb_printf (gdb_stderr,
12599 _("Process record does not support instruction "
12600 "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
12601 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
12603 return -1;
12606 /* Record handler for vector data transfer instructions. */
12608 static int
12609 arm_record_vdata_transfer_insn (arm_insn_decode_record *arm_insn_r)
12611 uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
12612 uint32_t record_buf[4];
12614 reg_t = bits (arm_insn_r->arm_insn, 12, 15);
12615 reg_v = bits (arm_insn_r->arm_insn, 21, 23);
12616 bits_a = bits (arm_insn_r->arm_insn, 21, 23);
12617 bit_l = bit (arm_insn_r->arm_insn, 20);
12618 bit_c = bit (arm_insn_r->arm_insn, 8);
12620 /* Handle VMOV instruction. */
12621 if (bit_l && bit_c)
12623 record_buf[0] = reg_t;
12624 arm_insn_r->reg_rec_count = 1;
12626 else if (bit_l && !bit_c)
12628 /* Handle VMOV instruction. */
12629 if (bits_a == 0x00)
12631 record_buf[0] = reg_t;
12632 arm_insn_r->reg_rec_count = 1;
12634 /* Handle VMRS instruction. */
12635 else if (bits_a == 0x07)
12637 if (reg_t == 15)
12638 reg_t = ARM_PS_REGNUM;
12640 record_buf[0] = reg_t;
12641 arm_insn_r->reg_rec_count = 1;
12644 else if (!bit_l && !bit_c)
12646 /* Handle VMOV instruction. */
12647 if (bits_a == 0x00)
12649 record_buf[0] = ARM_D0_REGNUM + reg_v;
12651 arm_insn_r->reg_rec_count = 1;
12653 /* Handle VMSR instruction. */
12654 else if (bits_a == 0x07)
12656 record_buf[0] = ARM_FPSCR_REGNUM;
12657 arm_insn_r->reg_rec_count = 1;
12660 else if (!bit_l && bit_c)
12662 /* Handle VMOV instruction. */
12663 if (!(bits_a & 0x04))
12665 record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
12666 + ARM_D0_REGNUM;
12667 arm_insn_r->reg_rec_count = 1;
12669 /* Handle VDUP instruction. */
12670 else
12672 if (bit (arm_insn_r->arm_insn, 21))
12674 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12675 record_buf[0] = reg_v + ARM_D0_REGNUM;
12676 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
12677 arm_insn_r->reg_rec_count = 2;
12679 else
12681 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12682 record_buf[0] = reg_v + ARM_D0_REGNUM;
12683 arm_insn_r->reg_rec_count = 1;
12688 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12689 return 0;
12692 /* Record handler for extension register load/store instructions. */
12694 static int
12695 arm_record_exreg_ld_st_insn (arm_insn_decode_record *arm_insn_r)
12697 uint32_t opcode, single_reg;
12698 uint8_t op_vldm_vstm;
12699 uint32_t record_buf[8], record_buf_mem[128];
12700 ULONGEST u_regval = 0;
12702 struct regcache *reg_cache = arm_insn_r->regcache;
12704 opcode = bits (arm_insn_r->arm_insn, 20, 24);
12705 single_reg = !bit (arm_insn_r->arm_insn, 8);
12706 op_vldm_vstm = opcode & 0x1b;
12708 /* Handle VMOV instructions. */
12709 if ((opcode & 0x1e) == 0x04)
12711 if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
12713 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12714 record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
12715 arm_insn_r->reg_rec_count = 2;
12717 else
12719 uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
12720 uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
12722 if (single_reg)
12724 /* The first S register number m is REG_M:M (M is bit 5),
12725 the corresponding D register number is REG_M:M / 2, which
12726 is REG_M. */
12727 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
12728 /* The second S register number is REG_M:M + 1, the
12729 corresponding D register number is (REG_M:M + 1) / 2.
12730 IOW, if bit M is 1, the first and second S registers
12731 are mapped to different D registers, otherwise, they are
12732 in the same D register. */
12733 if (bit_m)
12735 record_buf[arm_insn_r->reg_rec_count++]
12736 = ARM_D0_REGNUM + reg_m + 1;
12739 else
12741 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
12742 arm_insn_r->reg_rec_count = 1;
12746 /* Handle VSTM and VPUSH instructions. */
12747 else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
12748 || op_vldm_vstm == 0x12)
12750 uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
12751 uint32_t memory_index = 0;
12753 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12754 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12755 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12756 imm_off32 = imm_off8 << 2;
12757 memory_count = imm_off8;
12759 if (bit (arm_insn_r->arm_insn, 23))
12760 start_address = u_regval;
12761 else
12762 start_address = u_regval - imm_off32;
12764 if (bit (arm_insn_r->arm_insn, 21))
12766 record_buf[0] = reg_rn;
12767 arm_insn_r->reg_rec_count = 1;
12770 while (memory_count > 0)
12772 if (single_reg)
12774 record_buf_mem[memory_index] = 4;
12775 record_buf_mem[memory_index + 1] = start_address;
12776 start_address = start_address + 4;
12777 memory_index = memory_index + 2;
12779 else
12781 record_buf_mem[memory_index] = 4;
12782 record_buf_mem[memory_index + 1] = start_address;
12783 record_buf_mem[memory_index + 2] = 4;
12784 record_buf_mem[memory_index + 3] = start_address + 4;
12785 start_address = start_address + 8;
12786 memory_index = memory_index + 4;
12788 memory_count--;
12790 arm_insn_r->mem_rec_count = (memory_index >> 1);
12792 /* Handle VLDM instructions. */
12793 else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
12794 || op_vldm_vstm == 0x13)
12796 uint32_t reg_count, reg_vd;
12797 uint32_t reg_index = 0;
12798 uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
12800 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12801 reg_count = bits (arm_insn_r->arm_insn, 0, 7);
12803 /* REG_VD is the first D register number. If the instruction
12804 loads memory to S registers (SINGLE_REG is TRUE), the register
12805 number is (REG_VD << 1 | bit D), so the corresponding D
12806 register number is (REG_VD << 1 | bit D) / 2 = REG_VD. */
12807 if (!single_reg)
12808 reg_vd = reg_vd | (bit_d << 4);
12810 if (bit (arm_insn_r->arm_insn, 21) /* write back */)
12811 record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
12813 /* If the instruction loads memory to D register, REG_COUNT should
12814 be divided by 2, according to the ARM Architecture Reference
12815 Manual. If the instruction loads memory to S register, divide by
12816 2 as well because two S registers are mapped to D register. */
12817 reg_count = reg_count / 2;
12818 if (single_reg && bit_d)
12820 /* Increase the register count if S register list starts from
12821 an odd number (bit d is one). */
12822 reg_count++;
12825 while (reg_count > 0)
12827 record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
12828 reg_count--;
12830 arm_insn_r->reg_rec_count = reg_index;
12832 /* VSTR Vector store register. */
12833 else if ((opcode & 0x13) == 0x10)
12835 uint32_t start_address, reg_rn, imm_off32, imm_off8;
12836 uint32_t memory_index = 0;
12838 reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12839 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12840 imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12841 imm_off32 = imm_off8 << 2;
12843 if (bit (arm_insn_r->arm_insn, 23))
12844 start_address = u_regval + imm_off32;
12845 else
12846 start_address = u_regval - imm_off32;
12848 if (single_reg)
12850 record_buf_mem[memory_index] = 4;
12851 record_buf_mem[memory_index + 1] = start_address;
12852 arm_insn_r->mem_rec_count = 1;
12854 else
12856 record_buf_mem[memory_index] = 4;
12857 record_buf_mem[memory_index + 1] = start_address;
12858 record_buf_mem[memory_index + 2] = 4;
12859 record_buf_mem[memory_index + 3] = start_address + 4;
12860 arm_insn_r->mem_rec_count = 2;
12863 /* VLDR Vector load register. */
12864 else if ((opcode & 0x13) == 0x11)
12866 uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12868 if (!single_reg)
12870 reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
12871 record_buf[0] = ARM_D0_REGNUM + reg_vd;
12873 else
12875 reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
12876 /* Record register D rather than pseudo register S. */
12877 record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
12879 arm_insn_r->reg_rec_count = 1;
12882 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12883 MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12884 return 0;
12887 /* Record handler for arm/thumb mode VFP data processing instructions. */
12889 static int
12890 arm_record_vfp_data_proc_insn (arm_insn_decode_record *arm_insn_r)
12892 uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
12893 uint32_t record_buf[4];
12894 enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
12895 enum insn_types curr_insn_type = INSN_INV;
12897 reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12898 opc1 = bits (arm_insn_r->arm_insn, 20, 23);
12899 opc2 = bits (arm_insn_r->arm_insn, 16, 19);
12900 opc3 = bits (arm_insn_r->arm_insn, 6, 7);
12901 dp_op_sz = bit (arm_insn_r->arm_insn, 8);
12902 bit_d = bit (arm_insn_r->arm_insn, 22);
12903 /* Mask off the "D" bit. */
12904 opc1 = opc1 & ~0x04;
12906 /* Handle VMLA, VMLS. */
12907 if (opc1 == 0x00)
12909 if (bit (arm_insn_r->arm_insn, 10))
12911 if (bit (arm_insn_r->arm_insn, 6))
12912 curr_insn_type = INSN_T0;
12913 else
12914 curr_insn_type = INSN_T1;
12916 else
12918 if (dp_op_sz)
12919 curr_insn_type = INSN_T1;
12920 else
12921 curr_insn_type = INSN_T2;
12924 /* Handle VNMLA, VNMLS, VNMUL. */
12925 else if (opc1 == 0x01)
12927 if (dp_op_sz)
12928 curr_insn_type = INSN_T1;
12929 else
12930 curr_insn_type = INSN_T2;
12932 /* Handle VMUL. */
12933 else if (opc1 == 0x02 && !(opc3 & 0x01))
12935 if (bit (arm_insn_r->arm_insn, 10))
12937 if (bit (arm_insn_r->arm_insn, 6))
12938 curr_insn_type = INSN_T0;
12939 else
12940 curr_insn_type = INSN_T1;
12942 else
12944 if (dp_op_sz)
12945 curr_insn_type = INSN_T1;
12946 else
12947 curr_insn_type = INSN_T2;
12950 /* Handle VADD, VSUB. */
12951 else if (opc1 == 0x03)
12953 if (!bit (arm_insn_r->arm_insn, 9))
12955 if (bit (arm_insn_r->arm_insn, 6))
12956 curr_insn_type = INSN_T0;
12957 else
12958 curr_insn_type = INSN_T1;
12960 else
12962 if (dp_op_sz)
12963 curr_insn_type = INSN_T1;
12964 else
12965 curr_insn_type = INSN_T2;
12968 /* Handle VDIV. */
12969 else if (opc1 == 0x08)
12971 if (dp_op_sz)
12972 curr_insn_type = INSN_T1;
12973 else
12974 curr_insn_type = INSN_T2;
12976 /* Handle all other vfp data processing instructions. */
12977 else if (opc1 == 0x0b)
12979 /* Handle VMOV. */
12980 if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
12982 if (bit (arm_insn_r->arm_insn, 4))
12984 if (bit (arm_insn_r->arm_insn, 6))
12985 curr_insn_type = INSN_T0;
12986 else
12987 curr_insn_type = INSN_T1;
12989 else
12991 if (dp_op_sz)
12992 curr_insn_type = INSN_T1;
12993 else
12994 curr_insn_type = INSN_T2;
12997 /* Handle VNEG and VABS. */
12998 else if ((opc2 == 0x01 && opc3 == 0x01)
12999 || (opc2 == 0x00 && opc3 == 0x03))
13001 if (!bit (arm_insn_r->arm_insn, 11))
13003 if (bit (arm_insn_r->arm_insn, 6))
13004 curr_insn_type = INSN_T0;
13005 else
13006 curr_insn_type = INSN_T1;
13008 else
13010 if (dp_op_sz)
13011 curr_insn_type = INSN_T1;
13012 else
13013 curr_insn_type = INSN_T2;
13016 /* Handle VSQRT. */
13017 else if (opc2 == 0x01 && opc3 == 0x03)
13019 if (dp_op_sz)
13020 curr_insn_type = INSN_T1;
13021 else
13022 curr_insn_type = INSN_T2;
13024 /* Handle VCVT. */
13025 else if (opc2 == 0x07 && opc3 == 0x03)
13027 if (!dp_op_sz)
13028 curr_insn_type = INSN_T1;
13029 else
13030 curr_insn_type = INSN_T2;
13032 else if (opc3 & 0x01)
13034 /* Handle VCVT. */
13035 if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
13037 if (!bit (arm_insn_r->arm_insn, 18))
13038 curr_insn_type = INSN_T2;
13039 else
13041 if (dp_op_sz)
13042 curr_insn_type = INSN_T1;
13043 else
13044 curr_insn_type = INSN_T2;
13047 /* Handle VCVT. */
13048 else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
13050 if (dp_op_sz)
13051 curr_insn_type = INSN_T1;
13052 else
13053 curr_insn_type = INSN_T2;
13055 /* Handle VCVTB, VCVTT. */
13056 else if ((opc2 & 0x0e) == 0x02)
13057 curr_insn_type = INSN_T2;
13058 /* Handle VCMP, VCMPE. */
13059 else if ((opc2 & 0x0e) == 0x04)
13060 curr_insn_type = INSN_T3;
13064 switch (curr_insn_type)
13066 case INSN_T0:
13067 reg_vd = reg_vd | (bit_d << 4);
13068 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13069 record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
13070 arm_insn_r->reg_rec_count = 2;
13071 break;
13073 case INSN_T1:
13074 reg_vd = reg_vd | (bit_d << 4);
13075 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13076 arm_insn_r->reg_rec_count = 1;
13077 break;
13079 case INSN_T2:
13080 reg_vd = (reg_vd << 1) | bit_d;
13081 record_buf[0] = reg_vd + ARM_D0_REGNUM;
13082 arm_insn_r->reg_rec_count = 1;
13083 break;
13085 case INSN_T3:
13086 record_buf[0] = ARM_FPSCR_REGNUM;
13087 arm_insn_r->reg_rec_count = 1;
13088 break;
13090 default:
13091 gdb_assert_not_reached ("no decoding pattern found");
13092 break;
13095 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
13096 return 0;
13099 /* Handling opcode 110 insns. */
13101 static int
13102 arm_record_asimd_vfp_coproc (arm_insn_decode_record *arm_insn_r)
13104 uint32_t op1, op1_ebit, coproc;
13106 coproc = bits (arm_insn_r->arm_insn, 8, 11);
13107 op1 = bits (arm_insn_r->arm_insn, 20, 25);
13108 op1_ebit = bit (arm_insn_r->arm_insn, 20);
13110 if ((coproc & 0x0e) == 0x0a)
13112 /* Handle extension register ld/st instructions. */
13113 if (!(op1 & 0x20))
13114 return arm_record_exreg_ld_st_insn (arm_insn_r);
13116 /* 64-bit transfers between arm core and extension registers. */
13117 if ((op1 & 0x3e) == 0x04)
13118 return arm_record_exreg_ld_st_insn (arm_insn_r);
13120 else
13122 /* Handle coprocessor ld/st instructions. */
13123 if (!(op1 & 0x3a))
13125 /* Store. */
13126 if (!op1_ebit)
13127 return arm_record_unsupported_insn (arm_insn_r);
13128 else
13129 /* Load. */
13130 return arm_record_unsupported_insn (arm_insn_r);
13133 /* Move to coprocessor from two arm core registers. */
13134 if (op1 == 0x4)
13135 return arm_record_unsupported_insn (arm_insn_r);
13137 /* Move to two arm core registers from coprocessor. */
13138 if (op1 == 0x5)
13140 uint32_t reg_t[2];
13142 reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
13143 reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
13144 arm_insn_r->reg_rec_count = 2;
13146 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
13147 return 0;
13150 return arm_record_unsupported_insn (arm_insn_r);
13153 /* Handling opcode 111 insns. */
13155 static int
13156 arm_record_coproc_data_proc (arm_insn_decode_record *arm_insn_r)
13158 uint32_t op, op1_ebit, coproc, bits_24_25;
13159 arm_gdbarch_tdep *tdep
13160 = gdbarch_tdep<arm_gdbarch_tdep> (arm_insn_r->gdbarch);
13161 struct regcache *reg_cache = arm_insn_r->regcache;
13163 arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
13164 coproc = bits (arm_insn_r->arm_insn, 8, 11);
13165 op1_ebit = bit (arm_insn_r->arm_insn, 20);
13166 op = bit (arm_insn_r->arm_insn, 4);
13167 bits_24_25 = bits (arm_insn_r->arm_insn, 24, 25);
13169 /* Handle arm SWI/SVC system call instructions. */
13170 if (bits_24_25 == 0x3)
13172 if (tdep->arm_syscall_record != NULL)
13174 ULONGEST svc_operand, svc_number;
13176 svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
13178 if (svc_operand) /* OABI. */
13179 svc_number = svc_operand - 0x900000;
13180 else /* EABI. */
13181 regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
13183 return tdep->arm_syscall_record (reg_cache, svc_number);
13185 else
13187 gdb_printf (gdb_stderr, _("no syscall record support\n"));
13188 return -1;
13191 else if (bits_24_25 == 0x02)
13193 if (op)
13195 if ((coproc & 0x0e) == 0x0a)
13197 /* 8, 16, and 32-bit transfer */
13198 return arm_record_vdata_transfer_insn (arm_insn_r);
13200 else
13202 if (op1_ebit)
13204 /* MRC, MRC2 */
13205 uint32_t record_buf[1];
13207 record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
13208 if (record_buf[0] == 15)
13209 record_buf[0] = ARM_PS_REGNUM;
13211 arm_insn_r->reg_rec_count = 1;
13212 REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
13213 record_buf);
13214 return 0;
13216 else
13218 /* MCR, MCR2 */
13219 return -1;
13223 else
13225 if ((coproc & 0x0e) == 0x0a)
13227 /* VFP data-processing instructions. */
13228 return arm_record_vfp_data_proc_insn (arm_insn_r);
13230 else
13232 /* CDP, CDP2 */
13233 return -1;
13237 else
13239 unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 25);
13241 if (op1 == 5)
13243 if ((coproc & 0x0e) != 0x0a)
13245 /* MRRC, MRRC2 */
13246 return -1;
13249 else if (op1 == 4 || op1 == 5)
13251 if ((coproc & 0x0e) == 0x0a)
13253 /* 64-bit transfers between ARM core and extension */
13254 return -1;
13256 else if (op1 == 4)
13258 /* MCRR, MCRR2 */
13259 return -1;
13262 else if (op1 == 0 || op1 == 1)
13264 /* UNDEFINED */
13265 return -1;
13267 else
13269 if ((coproc & 0x0e) == 0x0a)
13271 /* Extension register load/store */
13273 else
13275 /* STC, STC2, LDC, LDC2 */
13277 return -1;
13281 return -1;
13284 /* Handling opcode 000 insns. */
13286 static int
13287 thumb_record_shift_add_sub (arm_insn_decode_record *thumb_insn_r)
13289 uint32_t record_buf[8];
13290 uint32_t reg_src1 = 0;
13292 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13294 record_buf[0] = ARM_PS_REGNUM;
13295 record_buf[1] = reg_src1;
13296 thumb_insn_r->reg_rec_count = 2;
13298 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13300 return 0;
13304 /* Handling opcode 001 insns. */
13306 static int
13307 thumb_record_add_sub_cmp_mov (arm_insn_decode_record *thumb_insn_r)
13309 uint32_t record_buf[8];
13310 uint32_t reg_src1 = 0;
13312 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13314 record_buf[0] = ARM_PS_REGNUM;
13315 record_buf[1] = reg_src1;
13316 thumb_insn_r->reg_rec_count = 2;
13318 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13320 return 0;
13323 /* Handling opcode 010 insns. */
13325 static int
13326 thumb_record_ld_st_reg_offset (arm_insn_decode_record *thumb_insn_r)
13328 struct regcache *reg_cache = thumb_insn_r->regcache;
13329 uint32_t record_buf[8], record_buf_mem[8];
13331 uint32_t reg_src1 = 0, reg_src2 = 0;
13332 uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
13334 ULONGEST u_regval[2] = {0};
13336 opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
13338 if (bit (thumb_insn_r->arm_insn, 12))
13340 /* Handle load/store register offset. */
13341 uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
13343 if (in_inclusive_range (opB, 4U, 7U))
13345 /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH. */
13346 reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
13347 record_buf[0] = reg_src1;
13348 thumb_insn_r->reg_rec_count = 1;
13350 else if (in_inclusive_range (opB, 0U, 2U))
13352 /* STR(2), STRB(2), STRH(2) . */
13353 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13354 reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
13355 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
13356 regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
13357 if (0 == opB)
13358 record_buf_mem[0] = 4; /* STR (2). */
13359 else if (2 == opB)
13360 record_buf_mem[0] = 1; /* STRB (2). */
13361 else if (1 == opB)
13362 record_buf_mem[0] = 2; /* STRH (2). */
13363 record_buf_mem[1] = u_regval[0] + u_regval[1];
13364 thumb_insn_r->mem_rec_count = 1;
13367 else if (bit (thumb_insn_r->arm_insn, 11))
13369 /* Handle load from literal pool. */
13370 /* LDR(3). */
13371 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13372 record_buf[0] = reg_src1;
13373 thumb_insn_r->reg_rec_count = 1;
13375 else if (opcode1)
13377 /* Special data instructions and branch and exchange */
13378 opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
13379 opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
13380 if ((3 == opcode2) && (!opcode3))
13382 /* Branch with exchange. */
13383 record_buf[0] = ARM_PS_REGNUM;
13384 thumb_insn_r->reg_rec_count = 1;
13386 else
13388 /* Format 8; special data processing insns. */
13389 record_buf[0] = ARM_PS_REGNUM;
13390 record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
13391 | bits (thumb_insn_r->arm_insn, 0, 2));
13392 thumb_insn_r->reg_rec_count = 2;
13395 else
13397 /* Format 5; data processing insns. */
13398 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13399 if (bit (thumb_insn_r->arm_insn, 7))
13401 reg_src1 = reg_src1 + 8;
13403 record_buf[0] = ARM_PS_REGNUM;
13404 record_buf[1] = reg_src1;
13405 thumb_insn_r->reg_rec_count = 2;
13408 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13409 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13410 record_buf_mem);
13412 return 0;
13415 /* Handling opcode 001 insns. */
13417 static int
13418 thumb_record_ld_st_imm_offset (arm_insn_decode_record *thumb_insn_r)
13420 struct regcache *reg_cache = thumb_insn_r->regcache;
13421 uint32_t record_buf[8], record_buf_mem[8];
13423 uint32_t reg_src1 = 0;
13424 uint32_t opcode = 0, immed_5 = 0;
13426 ULONGEST u_regval = 0;
13428 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13430 if (opcode)
13432 /* LDR(1). */
13433 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13434 record_buf[0] = reg_src1;
13435 thumb_insn_r->reg_rec_count = 1;
13437 else
13439 /* STR(1). */
13440 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13441 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13442 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13443 record_buf_mem[0] = 4;
13444 record_buf_mem[1] = u_regval + (immed_5 * 4);
13445 thumb_insn_r->mem_rec_count = 1;
13448 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13449 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13450 record_buf_mem);
13452 return 0;
13455 /* Handling opcode 100 insns. */
13457 static int
13458 thumb_record_ld_st_stack (arm_insn_decode_record *thumb_insn_r)
13460 struct regcache *reg_cache = thumb_insn_r->regcache;
13461 uint32_t record_buf[8], record_buf_mem[8];
13463 uint32_t reg_src1 = 0;
13464 uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
13466 ULONGEST u_regval = 0;
13468 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13470 if (3 == opcode)
13472 /* LDR(4). */
13473 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13474 record_buf[0] = reg_src1;
13475 thumb_insn_r->reg_rec_count = 1;
13477 else if (1 == opcode)
13479 /* LDRH(1). */
13480 reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13481 record_buf[0] = reg_src1;
13482 thumb_insn_r->reg_rec_count = 1;
13484 else if (2 == opcode)
13486 /* STR(3). */
13487 immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
13488 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13489 record_buf_mem[0] = 4;
13490 record_buf_mem[1] = u_regval + (immed_8 * 4);
13491 thumb_insn_r->mem_rec_count = 1;
13493 else if (0 == opcode)
13495 /* STRH(1). */
13496 immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13497 reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13498 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13499 record_buf_mem[0] = 2;
13500 record_buf_mem[1] = u_regval + (immed_5 * 2);
13501 thumb_insn_r->mem_rec_count = 1;
13504 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13505 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13506 record_buf_mem);
13508 return 0;
13511 /* Handling opcode 101 insns. */
13513 static int
13514 thumb_record_misc (arm_insn_decode_record *thumb_insn_r)
13516 struct regcache *reg_cache = thumb_insn_r->regcache;
13518 uint32_t opcode = 0;
13519 uint32_t register_bits = 0, register_count = 0;
13520 uint32_t index = 0, start_address = 0;
13521 uint32_t record_buf[24], record_buf_mem[48];
13522 uint32_t reg_src1;
13524 ULONGEST u_regval = 0;
13526 opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13528 if (opcode == 0 || opcode == 1)
13530 /* ADR and ADD (SP plus immediate) */
13532 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13533 record_buf[0] = reg_src1;
13534 thumb_insn_r->reg_rec_count = 1;
13536 else
13538 /* Miscellaneous 16-bit instructions */
13539 uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
13541 switch (opcode2)
13543 case 6:
13544 /* SETEND and CPS */
13545 break;
13546 case 0:
13547 /* ADD/SUB (SP plus immediate) */
13548 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13549 record_buf[0] = ARM_SP_REGNUM;
13550 thumb_insn_r->reg_rec_count = 1;
13551 break;
13552 case 1: /* fall through */
13553 case 3: /* fall through */
13554 case 9: /* fall through */
13555 case 11:
13556 /* CBNZ, CBZ */
13557 break;
13558 case 2:
13559 /* SXTH, SXTB, UXTH, UXTB */
13560 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13561 thumb_insn_r->reg_rec_count = 1;
13562 break;
13563 case 5:
13564 /* PUSH with lr. */
13565 register_count++;
13566 [[fallthrough]];
13567 case 4:
13568 /* PUSH without lr. */
13569 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13570 regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13571 while (register_bits)
13573 if (register_bits & 0x00000001)
13574 register_count++;
13575 register_bits = register_bits >> 1;
13577 start_address = u_regval - (4 * register_count);
13578 thumb_insn_r->mem_rec_count = register_count;
13579 while (register_count)
13581 record_buf_mem[(register_count * 2) - 1] = start_address;
13582 record_buf_mem[(register_count * 2) - 2] = 4;
13583 start_address = start_address + 4;
13584 register_count--;
13586 record_buf[0] = ARM_SP_REGNUM;
13587 thumb_insn_r->reg_rec_count = 1;
13588 break;
13589 case 10:
13590 /* REV, REV16, REVSH */
13591 record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13592 thumb_insn_r->reg_rec_count = 1;
13593 break;
13594 case 12: /* fall through */
13595 case 13:
13596 /* POP. */
13597 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13598 while (register_bits)
13600 if (register_bits & 0x00000001)
13601 record_buf[index++] = register_count;
13602 register_bits = register_bits >> 1;
13603 register_count++;
13605 record_buf[index++] = ARM_PS_REGNUM;
13606 record_buf[index++] = ARM_SP_REGNUM;
13607 thumb_insn_r->reg_rec_count = index;
13608 break;
13609 case 0xe:
13610 /* BKPT insn. */
13611 /* Handle enhanced software breakpoint insn, BKPT. */
13612 /* CPSR is changed to be executed in ARM state, disabling normal
13613 interrupts, entering abort mode. */
13614 /* According to high vector configuration PC is set. */
13615 /* User hits breakpoint and type reverse, in that case, we need to go back with
13616 previous CPSR and Program Counter. */
13617 record_buf[0] = ARM_PS_REGNUM;
13618 record_buf[1] = ARM_LR_REGNUM;
13619 thumb_insn_r->reg_rec_count = 2;
13620 /* We need to save SPSR value, which is not yet done. */
13621 gdb_printf (gdb_stderr,
13622 _("Process record does not support instruction "
13623 "0x%0x at address %s.\n"),
13624 thumb_insn_r->arm_insn,
13625 paddress (thumb_insn_r->gdbarch,
13626 thumb_insn_r->this_addr));
13627 return -1;
13629 case 0xf:
13630 /* If-Then, and hints */
13631 break;
13632 default:
13633 return -1;
13637 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13638 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13639 record_buf_mem);
13641 return 0;
13644 /* Handling opcode 110 insns. */
13646 static int
13647 thumb_record_ldm_stm_swi (arm_insn_decode_record *thumb_insn_r)
13649 arm_gdbarch_tdep *tdep
13650 = gdbarch_tdep<arm_gdbarch_tdep> (thumb_insn_r->gdbarch);
13651 struct regcache *reg_cache = thumb_insn_r->regcache;
13653 uint32_t ret = 0; /* function return value: -1:record failure ; 0:success */
13654 uint32_t reg_src1 = 0;
13655 uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
13656 uint32_t index = 0, start_address = 0;
13657 uint32_t record_buf[24], record_buf_mem[48];
13659 ULONGEST u_regval = 0;
13661 opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
13662 opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
13664 if (1 == opcode2)
13667 /* LDMIA. */
13668 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13669 /* Get Rn. */
13670 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13671 while (register_bits)
13673 if (register_bits & 0x00000001)
13674 record_buf[index++] = register_count;
13675 register_bits = register_bits >> 1;
13676 register_count++;
13678 record_buf[index++] = reg_src1;
13679 thumb_insn_r->reg_rec_count = index;
13681 else if (0 == opcode2)
13683 /* It handles both STMIA. */
13684 register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13685 /* Get Rn. */
13686 reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13687 regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13688 while (register_bits)
13690 if (register_bits & 0x00000001)
13691 register_count++;
13692 register_bits = register_bits >> 1;
13694 start_address = u_regval;
13695 thumb_insn_r->mem_rec_count = register_count;
13696 while (register_count)
13698 record_buf_mem[(register_count * 2) - 1] = start_address;
13699 record_buf_mem[(register_count * 2) - 2] = 4;
13700 start_address = start_address + 4;
13701 register_count--;
13704 else if (0x1F == opcode1)
13706 /* Handle arm syscall insn. */
13707 if (tdep->arm_syscall_record != NULL)
13709 regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
13710 ret = tdep->arm_syscall_record (reg_cache, u_regval);
13712 else
13714 gdb_printf (gdb_stderr, _("no syscall record support\n"));
13715 return -1;
13719 /* B (1), conditional branch is automatically taken care in process_record,
13720 as PC is saved there. */
13722 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13723 MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13724 record_buf_mem);
13726 return ret;
13729 /* Handling opcode 111 insns. */
13731 static int
13732 thumb_record_branch (arm_insn_decode_record *thumb_insn_r)
13734 uint32_t record_buf[8];
13735 uint32_t bits_h = 0;
13737 bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
13739 if (2 == bits_h || 3 == bits_h)
13741 /* BL */
13742 record_buf[0] = ARM_LR_REGNUM;
13743 thumb_insn_r->reg_rec_count = 1;
13745 else if (1 == bits_h)
13747 /* BLX(1). */
13748 record_buf[0] = ARM_PS_REGNUM;
13749 record_buf[1] = ARM_LR_REGNUM;
13750 thumb_insn_r->reg_rec_count = 2;
13753 /* B(2) is automatically taken care in process_record, as PC is
13754 saved there. */
13756 REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13758 return 0;
13761 /* Handler for thumb2 load/store multiple instructions. */
13763 static int
13764 thumb2_record_ld_st_multiple (arm_insn_decode_record *thumb2_insn_r)
13766 struct regcache *reg_cache = thumb2_insn_r->regcache;
13768 uint32_t reg_rn, op;
13769 uint32_t register_bits = 0, register_count = 0;
13770 uint32_t index = 0, start_address = 0;
13771 uint32_t record_buf[24], record_buf_mem[48];
13773 ULONGEST u_regval = 0;
13775 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13776 op = bits (thumb2_insn_r->arm_insn, 23, 24);
13778 if (0 == op || 3 == op)
13780 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13782 /* Handle RFE instruction. */
13783 record_buf[0] = ARM_PS_REGNUM;
13784 thumb2_insn_r->reg_rec_count = 1;
13786 else
13788 /* Handle SRS instruction after reading banked SP. */
13789 return arm_record_unsupported_insn (thumb2_insn_r);
13792 else if (1 == op || 2 == op)
13794 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13796 /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions. */
13797 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13798 while (register_bits)
13800 if (register_bits & 0x00000001)
13801 record_buf[index++] = register_count;
13803 register_count++;
13804 register_bits = register_bits >> 1;
13806 record_buf[index++] = reg_rn;
13807 record_buf[index++] = ARM_PS_REGNUM;
13808 thumb2_insn_r->reg_rec_count = index;
13810 else
13812 /* Handle STM/STMIA/STMEA and STMDB/STMFD. */
13813 register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13814 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
13815 while (register_bits)
13817 if (register_bits & 0x00000001)
13818 register_count++;
13820 register_bits = register_bits >> 1;
13823 if (1 == op)
13825 /* Start address calculation for LDMDB/LDMEA. */
13826 start_address = u_regval;
13828 else if (2 == op)
13830 /* Start address calculation for LDMDB/LDMEA. */
13831 start_address = u_regval - register_count * 4;
13834 thumb2_insn_r->mem_rec_count = register_count;
13835 while (register_count)
13837 record_buf_mem[register_count * 2 - 1] = start_address;
13838 record_buf_mem[register_count * 2 - 2] = 4;
13839 start_address = start_address + 4;
13840 register_count--;
13842 record_buf[0] = reg_rn;
13843 record_buf[1] = ARM_PS_REGNUM;
13844 thumb2_insn_r->reg_rec_count = 2;
13848 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13849 record_buf_mem);
13850 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13851 record_buf);
13852 return ARM_RECORD_SUCCESS;
13855 /* Handler for thumb2 load/store (dual/exclusive) and table branch
13856 instructions. */
13858 static int
13859 thumb2_record_ld_st_dual_ex_tbb (arm_insn_decode_record *thumb2_insn_r)
13861 struct regcache *reg_cache = thumb2_insn_r->regcache;
13863 uint32_t reg_rd, reg_rn, offset_imm;
13864 uint32_t reg_dest1, reg_dest2;
13865 uint32_t address, offset_addr;
13866 uint32_t record_buf[8], record_buf_mem[8];
13867 uint32_t op1, op2, op3;
13869 ULONGEST u_regval[2];
13871 op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
13872 op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
13873 op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
13875 if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13877 if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
13879 reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
13880 record_buf[0] = reg_dest1;
13881 record_buf[1] = ARM_PS_REGNUM;
13882 thumb2_insn_r->reg_rec_count = 2;
13885 if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
13887 reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
13888 record_buf[2] = reg_dest2;
13889 thumb2_insn_r->reg_rec_count = 3;
13892 else
13894 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13895 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
13897 if (0 == op1 && 0 == op2)
13899 /* Handle STREX. */
13900 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13901 address = u_regval[0] + (offset_imm * 4);
13902 record_buf_mem[0] = 4;
13903 record_buf_mem[1] = address;
13904 thumb2_insn_r->mem_rec_count = 1;
13905 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13906 record_buf[0] = reg_rd;
13907 thumb2_insn_r->reg_rec_count = 1;
13909 else if (1 == op1 && 0 == op2)
13911 reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13912 record_buf[0] = reg_rd;
13913 thumb2_insn_r->reg_rec_count = 1;
13914 address = u_regval[0];
13915 record_buf_mem[1] = address;
13917 if (4 == op3)
13919 /* Handle STREXB. */
13920 record_buf_mem[0] = 1;
13921 thumb2_insn_r->mem_rec_count = 1;
13923 else if (5 == op3)
13925 /* Handle STREXH. */
13926 record_buf_mem[0] = 2 ;
13927 thumb2_insn_r->mem_rec_count = 1;
13929 else if (7 == op3)
13931 /* Handle STREXD. */
13932 address = u_regval[0];
13933 record_buf_mem[0] = 4;
13934 record_buf_mem[2] = 4;
13935 record_buf_mem[3] = address + 4;
13936 thumb2_insn_r->mem_rec_count = 2;
13939 else
13941 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13943 if (bit (thumb2_insn_r->arm_insn, 24))
13945 if (bit (thumb2_insn_r->arm_insn, 23))
13946 offset_addr = u_regval[0] + (offset_imm * 4);
13947 else
13948 offset_addr = u_regval[0] - (offset_imm * 4);
13950 address = offset_addr;
13952 else
13953 address = u_regval[0];
13955 record_buf_mem[0] = 4;
13956 record_buf_mem[1] = address;
13957 record_buf_mem[2] = 4;
13958 record_buf_mem[3] = address + 4;
13959 thumb2_insn_r->mem_rec_count = 2;
13960 record_buf[0] = reg_rn;
13961 thumb2_insn_r->reg_rec_count = 1;
13965 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13966 record_buf);
13967 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13968 record_buf_mem);
13969 return ARM_RECORD_SUCCESS;
13972 /* Handler for thumb2 data processing (shift register and modified immediate)
13973 instructions. */
13975 static int
13976 thumb2_record_data_proc_sreg_mimm (arm_insn_decode_record *thumb2_insn_r)
13978 uint32_t reg_rd, op;
13979 uint32_t record_buf[8];
13981 op = bits (thumb2_insn_r->arm_insn, 21, 24);
13982 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
13984 if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
13986 record_buf[0] = ARM_PS_REGNUM;
13987 thumb2_insn_r->reg_rec_count = 1;
13989 else
13991 record_buf[0] = reg_rd;
13992 record_buf[1] = ARM_PS_REGNUM;
13993 thumb2_insn_r->reg_rec_count = 2;
13996 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13997 record_buf);
13998 return ARM_RECORD_SUCCESS;
14001 /* Generic handler for thumb2 instructions which effect destination and PS
14002 registers. */
14004 static int
14005 thumb2_record_ps_dest_generic (arm_insn_decode_record *thumb2_insn_r)
14007 uint32_t reg_rd;
14008 uint32_t record_buf[8];
14010 reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
14012 record_buf[0] = reg_rd;
14013 record_buf[1] = ARM_PS_REGNUM;
14014 thumb2_insn_r->reg_rec_count = 2;
14016 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14017 record_buf);
14018 return ARM_RECORD_SUCCESS;
14021 /* Handler for thumb2 branch and miscellaneous control instructions. */
14023 static int
14024 thumb2_record_branch_misc_cntrl (arm_insn_decode_record *thumb2_insn_r)
14026 uint32_t op, op1, op2;
14027 uint32_t record_buf[8];
14029 op = bits (thumb2_insn_r->arm_insn, 20, 26);
14030 op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
14031 op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
14033 /* Handle MSR insn. */
14034 if (!(op1 & 0x2) && 0x38 == op)
14036 if (!(op2 & 0x3))
14038 /* CPSR is going to be changed. */
14039 record_buf[0] = ARM_PS_REGNUM;
14040 thumb2_insn_r->reg_rec_count = 1;
14042 else
14044 arm_record_unsupported_insn(thumb2_insn_r);
14045 return -1;
14048 else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
14050 /* BLX. */
14051 record_buf[0] = ARM_PS_REGNUM;
14052 record_buf[1] = ARM_LR_REGNUM;
14053 thumb2_insn_r->reg_rec_count = 2;
14056 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14057 record_buf);
14058 return ARM_RECORD_SUCCESS;
14061 /* Handler for thumb2 store single data item instructions. */
14063 static int
14064 thumb2_record_str_single_data (arm_insn_decode_record *thumb2_insn_r)
14066 struct regcache *reg_cache = thumb2_insn_r->regcache;
14068 uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
14069 uint32_t address, offset_addr;
14070 uint32_t record_buf[8], record_buf_mem[8];
14071 uint32_t op1, op2;
14073 ULONGEST u_regval[2];
14075 op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
14076 op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
14077 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14078 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
14080 if (bit (thumb2_insn_r->arm_insn, 23))
14082 /* T2 encoding. */
14083 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
14084 offset_addr = u_regval[0] + offset_imm;
14085 address = offset_addr;
14087 else
14089 /* T3 encoding. */
14090 if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
14092 /* Handle STRB (register). */
14093 reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
14094 regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
14095 shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
14096 offset_addr = u_regval[1] << shift_imm;
14097 address = u_regval[0] + offset_addr;
14099 else
14101 offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
14102 if (bit (thumb2_insn_r->arm_insn, 10))
14104 if (bit (thumb2_insn_r->arm_insn, 9))
14105 offset_addr = u_regval[0] + offset_imm;
14106 else
14107 offset_addr = u_regval[0] - offset_imm;
14109 address = offset_addr;
14111 else
14112 address = u_regval[0];
14116 switch (op1)
14118 /* Store byte instructions. */
14119 case 4:
14120 case 0:
14121 record_buf_mem[0] = 1;
14122 break;
14123 /* Store half word instructions. */
14124 case 1:
14125 case 5:
14126 record_buf_mem[0] = 2;
14127 break;
14128 /* Store word instructions. */
14129 case 2:
14130 case 6:
14131 record_buf_mem[0] = 4;
14132 break;
14134 default:
14135 gdb_assert_not_reached ("no decoding pattern found");
14136 break;
14139 record_buf_mem[1] = address;
14140 thumb2_insn_r->mem_rec_count = 1;
14141 record_buf[0] = reg_rn;
14142 thumb2_insn_r->reg_rec_count = 1;
14144 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14145 record_buf);
14146 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14147 record_buf_mem);
14148 return ARM_RECORD_SUCCESS;
14151 /* Handler for thumb2 load memory hints instructions. */
14153 static int
14154 thumb2_record_ld_mem_hints (arm_insn_decode_record *thumb2_insn_r)
14156 uint32_t record_buf[8];
14157 uint32_t reg_rt, reg_rn;
14159 reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
14160 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14162 if (ARM_PC_REGNUM != reg_rt)
14164 record_buf[0] = reg_rt;
14165 record_buf[1] = reg_rn;
14166 record_buf[2] = ARM_PS_REGNUM;
14167 thumb2_insn_r->reg_rec_count = 3;
14169 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14170 record_buf);
14171 return ARM_RECORD_SUCCESS;
14174 return ARM_RECORD_FAILURE;
14177 /* Handler for thumb2 load word instructions. */
14179 static int
14180 thumb2_record_ld_word (arm_insn_decode_record *thumb2_insn_r)
14182 uint32_t record_buf[8];
14184 record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
14185 record_buf[1] = ARM_PS_REGNUM;
14186 thumb2_insn_r->reg_rec_count = 2;
14188 if ((thumb2_insn_r->arm_insn & 0xfff00900) == 0xf8500900)
14190 /* Detected LDR(immediate), T4, with write-back bit set. Record Rn
14191 update. */
14192 record_buf[2] = bits (thumb2_insn_r->arm_insn, 16, 19);
14193 thumb2_insn_r->reg_rec_count++;
14196 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14197 record_buf);
14198 return ARM_RECORD_SUCCESS;
14201 /* Handler for thumb2 long multiply, long multiply accumulate, and
14202 divide instructions. */
14204 static int
14205 thumb2_record_lmul_lmla_div (arm_insn_decode_record *thumb2_insn_r)
14207 uint32_t opcode1 = 0, opcode2 = 0;
14208 uint32_t record_buf[8];
14210 opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
14211 opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
14213 if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
14215 /* Handle SMULL, UMULL, SMULAL. */
14216 /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S). */
14217 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14218 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14219 record_buf[2] = ARM_PS_REGNUM;
14220 thumb2_insn_r->reg_rec_count = 3;
14222 else if (1 == opcode1 || 3 == opcode2)
14224 /* Handle SDIV and UDIV. */
14225 record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14226 record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14227 record_buf[2] = ARM_PS_REGNUM;
14228 thumb2_insn_r->reg_rec_count = 3;
14230 else
14231 return ARM_RECORD_FAILURE;
14233 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14234 record_buf);
14235 return ARM_RECORD_SUCCESS;
14238 /* Record handler for thumb32 coprocessor instructions. */
14240 static int
14241 thumb2_record_coproc_insn (arm_insn_decode_record *thumb2_insn_r)
14243 if (bit (thumb2_insn_r->arm_insn, 25))
14244 return arm_record_coproc_data_proc (thumb2_insn_r);
14245 else
14246 return arm_record_asimd_vfp_coproc (thumb2_insn_r);
14249 /* Record handler for advance SIMD structure load/store instructions. */
14251 static int
14252 thumb2_record_asimd_struct_ld_st (arm_insn_decode_record *thumb2_insn_r)
14254 struct regcache *reg_cache = thumb2_insn_r->regcache;
14255 uint32_t l_bit, a_bit, b_bits;
14256 uint32_t record_buf[128], record_buf_mem[128];
14257 uint32_t reg_rn, reg_vd, address, f_elem;
14258 uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
14259 uint8_t f_ebytes;
14261 l_bit = bit (thumb2_insn_r->arm_insn, 21);
14262 a_bit = bit (thumb2_insn_r->arm_insn, 23);
14263 b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
14264 reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14265 reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
14266 reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
14267 f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
14268 f_elem = 8 / f_ebytes;
14270 if (!l_bit)
14272 ULONGEST u_regval = 0;
14273 regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
14274 address = u_regval;
14276 if (!a_bit)
14278 /* Handle VST1. */
14279 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14281 if (b_bits == 0x07)
14282 bf_regs = 1;
14283 else if (b_bits == 0x0a)
14284 bf_regs = 2;
14285 else if (b_bits == 0x06)
14286 bf_regs = 3;
14287 else if (b_bits == 0x02)
14288 bf_regs = 4;
14289 else
14290 bf_regs = 0;
14292 for (index_r = 0; index_r < bf_regs; index_r++)
14294 for (index_e = 0; index_e < f_elem; index_e++)
14296 record_buf_mem[index_m++] = f_ebytes;
14297 record_buf_mem[index_m++] = address;
14298 address = address + f_ebytes;
14299 thumb2_insn_r->mem_rec_count += 1;
14303 /* Handle VST2. */
14304 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14306 if (b_bits == 0x09 || b_bits == 0x08)
14307 bf_regs = 1;
14308 else if (b_bits == 0x03)
14309 bf_regs = 2;
14310 else
14311 bf_regs = 0;
14313 for (index_r = 0; index_r < bf_regs; index_r++)
14314 for (index_e = 0; index_e < f_elem; index_e++)
14316 for (loop_t = 0; loop_t < 2; loop_t++)
14318 record_buf_mem[index_m++] = f_ebytes;
14319 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14320 thumb2_insn_r->mem_rec_count += 1;
14322 address = address + (2 * f_ebytes);
14325 /* Handle VST3. */
14326 else if ((b_bits & 0x0e) == 0x04)
14328 for (index_e = 0; index_e < f_elem; index_e++)
14330 for (loop_t = 0; loop_t < 3; loop_t++)
14332 record_buf_mem[index_m++] = f_ebytes;
14333 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14334 thumb2_insn_r->mem_rec_count += 1;
14336 address = address + (3 * f_ebytes);
14339 /* Handle VST4. */
14340 else if (!(b_bits & 0x0e))
14342 for (index_e = 0; index_e < f_elem; index_e++)
14344 for (loop_t = 0; loop_t < 4; loop_t++)
14346 record_buf_mem[index_m++] = f_ebytes;
14347 record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14348 thumb2_insn_r->mem_rec_count += 1;
14350 address = address + (4 * f_ebytes);
14354 else
14356 uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
14358 if (bft_size == 0x00)
14359 f_ebytes = 1;
14360 else if (bft_size == 0x01)
14361 f_ebytes = 2;
14362 else if (bft_size == 0x02)
14363 f_ebytes = 4;
14364 else
14365 f_ebytes = 0;
14367 /* Handle VST1. */
14368 if (!(b_bits & 0x0b) || b_bits == 0x08)
14369 thumb2_insn_r->mem_rec_count = 1;
14370 /* Handle VST2. */
14371 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
14372 thumb2_insn_r->mem_rec_count = 2;
14373 /* Handle VST3. */
14374 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
14375 thumb2_insn_r->mem_rec_count = 3;
14376 /* Handle VST4. */
14377 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
14378 thumb2_insn_r->mem_rec_count = 4;
14380 for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
14382 record_buf_mem[index_m] = f_ebytes;
14383 record_buf_mem[index_m] = address + (index_m * f_ebytes);
14387 else
14389 if (!a_bit)
14391 /* Handle VLD1. */
14392 if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14393 thumb2_insn_r->reg_rec_count = 1;
14394 /* Handle VLD2. */
14395 else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14396 thumb2_insn_r->reg_rec_count = 2;
14397 /* Handle VLD3. */
14398 else if ((b_bits & 0x0e) == 0x04)
14399 thumb2_insn_r->reg_rec_count = 3;
14400 /* Handle VLD4. */
14401 else if (!(b_bits & 0x0e))
14402 thumb2_insn_r->reg_rec_count = 4;
14404 else
14406 /* Handle VLD1. */
14407 if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
14408 thumb2_insn_r->reg_rec_count = 1;
14409 /* Handle VLD2. */
14410 else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
14411 thumb2_insn_r->reg_rec_count = 2;
14412 /* Handle VLD3. */
14413 else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
14414 thumb2_insn_r->reg_rec_count = 3;
14415 /* Handle VLD4. */
14416 else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
14417 thumb2_insn_r->reg_rec_count = 4;
14419 for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
14420 record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
14424 if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
14426 record_buf[index_r] = reg_rn;
14427 thumb2_insn_r->reg_rec_count += 1;
14430 REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14431 record_buf);
14432 MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14433 record_buf_mem);
14434 return 0;
14437 /* Decodes thumb2 instruction type and invokes its record handler. */
14439 static unsigned int
14440 thumb2_record_decode_insn_handler (arm_insn_decode_record *thumb2_insn_r)
14442 uint32_t op, op1, op2;
14444 op = bit (thumb2_insn_r->arm_insn, 15);
14445 op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
14446 op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
14448 if (op1 == 0x01)
14450 if (!(op2 & 0x64 ))
14452 /* Load/store multiple instruction. */
14453 return thumb2_record_ld_st_multiple (thumb2_insn_r);
14455 else if ((op2 & 0x64) == 0x4)
14457 /* Load/store (dual/exclusive) and table branch instruction. */
14458 return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
14460 else if ((op2 & 0x60) == 0x20)
14462 /* Data-processing (shifted register). */
14463 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14465 else if (op2 & 0x40)
14467 /* Co-processor instructions. */
14468 return thumb2_record_coproc_insn (thumb2_insn_r);
14471 else if (op1 == 0x02)
14473 if (op)
14475 /* Branches and miscellaneous control instructions. */
14476 return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
14478 else if (op2 & 0x20)
14480 /* Data-processing (plain binary immediate) instruction. */
14481 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14483 else
14485 /* Data-processing (modified immediate). */
14486 return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14489 else if (op1 == 0x03)
14491 if (!(op2 & 0x71 ))
14493 /* Store single data item. */
14494 return thumb2_record_str_single_data (thumb2_insn_r);
14496 else if (!((op2 & 0x71) ^ 0x10))
14498 /* Advanced SIMD or structure load/store instructions. */
14499 return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
14501 else if (!((op2 & 0x67) ^ 0x01))
14503 /* Load byte, memory hints instruction. */
14504 return thumb2_record_ld_mem_hints (thumb2_insn_r);
14506 else if (!((op2 & 0x67) ^ 0x03))
14508 /* Load halfword, memory hints instruction. */
14509 return thumb2_record_ld_mem_hints (thumb2_insn_r);
14511 else if (!((op2 & 0x67) ^ 0x05))
14513 /* Load word instruction. */
14514 return thumb2_record_ld_word (thumb2_insn_r);
14516 else if (!((op2 & 0x70) ^ 0x20))
14518 /* Data-processing (register) instruction. */
14519 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14521 else if (!((op2 & 0x78) ^ 0x30))
14523 /* Multiply, multiply accumulate, abs diff instruction. */
14524 return thumb2_record_ps_dest_generic (thumb2_insn_r);
14526 else if (!((op2 & 0x78) ^ 0x38))
14528 /* Long multiply, long multiply accumulate, and divide. */
14529 return thumb2_record_lmul_lmla_div (thumb2_insn_r);
14531 else if (op2 & 0x40)
14533 /* Co-processor instructions. */
14534 return thumb2_record_coproc_insn (thumb2_insn_r);
14538 return -1;
14541 namespace {
14542 /* Abstract instruction reader. */
14544 class abstract_instruction_reader
14546 public:
14547 /* Read one instruction of size LEN from address MEMADDR and using
14548 BYTE_ORDER endianness. */
14550 virtual ULONGEST read (CORE_ADDR memaddr, const size_t len,
14551 enum bfd_endian byte_order) = 0;
14554 /* Instruction reader from real target. */
14556 class instruction_reader : public abstract_instruction_reader
14558 public:
14559 ULONGEST read (CORE_ADDR memaddr, const size_t len,
14560 enum bfd_endian byte_order) override
14562 return read_code_unsigned_integer (memaddr, len, byte_order);
14566 } // namespace
14568 typedef int (*sti_arm_hdl_fp_t) (arm_insn_decode_record*);
14570 /* Decode arm/thumb insn depending on condition cods and opcodes; and
14571 dispatch it. */
14573 static int
14574 decode_insn (abstract_instruction_reader &reader,
14575 arm_insn_decode_record *arm_record,
14576 record_type_t record_type, uint32_t insn_size)
14579 /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
14580 instruction. */
14581 static const sti_arm_hdl_fp_t arm_handle_insn[8] =
14583 arm_record_data_proc_misc_ld_str, /* 000. */
14584 arm_record_data_proc_imm, /* 001. */
14585 arm_record_ld_st_imm_offset, /* 010. */
14586 arm_record_ld_st_reg_offset, /* 011. */
14587 arm_record_ld_st_multiple, /* 100. */
14588 arm_record_b_bl, /* 101. */
14589 arm_record_asimd_vfp_coproc, /* 110. */
14590 arm_record_coproc_data_proc /* 111. */
14593 /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
14594 instruction. */
14595 static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
14597 thumb_record_shift_add_sub, /* 000. */
14598 thumb_record_add_sub_cmp_mov, /* 001. */
14599 thumb_record_ld_st_reg_offset, /* 010. */
14600 thumb_record_ld_st_imm_offset, /* 011. */
14601 thumb_record_ld_st_stack, /* 100. */
14602 thumb_record_misc, /* 101. */
14603 thumb_record_ldm_stm_swi, /* 110. */
14604 thumb_record_branch /* 111. */
14607 uint32_t ret = 0; /* return value: negative:failure 0:success. */
14608 uint32_t insn_id = 0;
14609 enum bfd_endian code_endian
14610 = gdbarch_byte_order_for_code (arm_record->gdbarch);
14611 arm_record->arm_insn
14612 = reader.read (arm_record->this_addr, insn_size, code_endian);
14614 if (ARM_RECORD == record_type)
14616 arm_record->cond = bits (arm_record->arm_insn, 28, 31);
14617 insn_id = bits (arm_record->arm_insn, 25, 27);
14619 if (arm_record->cond == 0xf)
14620 ret = arm_record_extension_space (arm_record);
14621 else
14623 /* If this insn has fallen into extension space
14624 then we need not decode it anymore. */
14625 ret = arm_handle_insn[insn_id] (arm_record);
14627 if (ret != ARM_RECORD_SUCCESS)
14629 arm_record_unsupported_insn (arm_record);
14630 ret = -1;
14633 else if (THUMB_RECORD == record_type)
14635 /* As thumb does not have condition codes, we set negative. */
14636 arm_record->cond = -1;
14637 insn_id = bits (arm_record->arm_insn, 13, 15);
14638 ret = thumb_handle_insn[insn_id] (arm_record);
14639 if (ret != ARM_RECORD_SUCCESS)
14641 arm_record_unsupported_insn (arm_record);
14642 ret = -1;
14645 else if (THUMB2_RECORD == record_type)
14647 /* As thumb does not have condition codes, we set negative. */
14648 arm_record->cond = -1;
14650 /* Swap first half of 32bit thumb instruction with second half. */
14651 arm_record->arm_insn
14652 = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
14654 ret = thumb2_record_decode_insn_handler (arm_record);
14656 if (ret != ARM_RECORD_SUCCESS)
14658 arm_record_unsupported_insn (arm_record);
14659 ret = -1;
14662 else
14664 /* Throw assertion. */
14665 gdb_assert_not_reached ("not a valid instruction, could not decode");
14668 return ret;
14671 #if GDB_SELF_TEST
14672 namespace selftests {
14674 /* Instruction reader class for selftests.
14676 For 16-bit Thumb instructions, an array of uint16_t should be used.
14678 For 32-bit Thumb instructions and regular 32-bit Arm instructions, an array
14679 of uint32_t should be used. */
14681 template<typename T>
14682 class instruction_reader_selftest : public abstract_instruction_reader
14684 public:
14685 template<size_t SIZE>
14686 instruction_reader_selftest (const T (&insns)[SIZE])
14687 : m_insns (insns), m_insns_size (SIZE)
14690 ULONGEST read (CORE_ADDR memaddr, const size_t length,
14691 enum bfd_endian byte_order) override
14693 SELF_CHECK (length == sizeof (T));
14694 SELF_CHECK (memaddr % sizeof (T) == 0);
14695 SELF_CHECK ((memaddr / sizeof (T)) < m_insns_size);
14697 return m_insns[memaddr / sizeof (T)];
14700 private:
14701 const T *m_insns;
14702 const size_t m_insns_size;
14705 static void
14706 arm_record_test (void)
14708 struct gdbarch_info info;
14709 info.bfd_arch_info = bfd_scan_arch ("arm");
14711 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14713 SELF_CHECK (gdbarch != NULL);
14715 /* 16-bit Thumb instructions. */
14717 arm_insn_decode_record arm_record;
14719 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14720 arm_record.gdbarch = gdbarch;
14722 /* Use the endian-free representation of the instructions here. The test
14723 will handle endianness conversions. */
14724 static const uint16_t insns[] = {
14725 /* db b2 uxtb r3, r3 */
14726 0xb2db,
14727 /* cd 58 ldr r5, [r1, r3] */
14728 0x58cd,
14731 instruction_reader_selftest<uint16_t> reader (insns);
14732 int 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] == 3);
14740 arm_record.this_addr += 2;
14741 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14742 THUMB_INSN_SIZE_BYTES);
14744 SELF_CHECK (ret == 0);
14745 SELF_CHECK (arm_record.mem_rec_count == 0);
14746 SELF_CHECK (arm_record.reg_rec_count == 1);
14747 SELF_CHECK (arm_record.arm_regs[0] == 5);
14750 /* 32-bit Thumb-2 instructions. */
14752 arm_insn_decode_record arm_record;
14754 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14755 arm_record.gdbarch = gdbarch;
14757 /* Use the endian-free representation of the instruction here. The test
14758 will handle endianness conversions. */
14759 static const uint32_t insns[] = {
14760 /* mrc 15, 0, r7, cr13, cr0, {3} */
14761 0x7f70ee1d,
14764 instruction_reader_selftest<uint32_t> reader (insns);
14765 int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14766 THUMB2_INSN_SIZE_BYTES);
14768 SELF_CHECK (ret == 0);
14769 SELF_CHECK (arm_record.mem_rec_count == 0);
14770 SELF_CHECK (arm_record.reg_rec_count == 1);
14771 SELF_CHECK (arm_record.arm_regs[0] == 7);
14774 /* 32-bit instructions. */
14776 arm_insn_decode_record arm_record;
14778 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14779 arm_record.gdbarch = gdbarch;
14781 /* Use the endian-free representation of the instruction here. The test
14782 will handle endianness conversions. */
14783 static const uint32_t insns[] = {
14784 /* mov r5, r0 */
14785 0xe1a05000,
14788 instruction_reader_selftest<uint32_t> reader (insns);
14789 int ret = decode_insn (reader, &arm_record, ARM_RECORD,
14790 ARM_INSN_SIZE_BYTES);
14792 SELF_CHECK (ret == 0);
14796 /* Instruction reader from manually cooked instruction sequences. */
14798 class test_arm_instruction_reader : public arm_instruction_reader
14800 public:
14801 explicit test_arm_instruction_reader (gdb::array_view<const uint32_t> insns)
14802 : m_insns (insns)
14805 uint32_t read (CORE_ADDR memaddr, enum bfd_endian byte_order) const override
14807 SELF_CHECK (memaddr % 4 == 0);
14808 SELF_CHECK (memaddr / 4 < m_insns.size ());
14810 return m_insns[memaddr / 4];
14813 private:
14814 const gdb::array_view<const uint32_t> m_insns;
14817 static void
14818 arm_analyze_prologue_test ()
14820 for (bfd_endian endianness : {BFD_ENDIAN_LITTLE, BFD_ENDIAN_BIG})
14822 struct gdbarch_info info;
14823 info.byte_order = endianness;
14824 info.byte_order_for_code = endianness;
14825 info.bfd_arch_info = bfd_scan_arch ("arm");
14827 struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14829 SELF_CHECK (gdbarch != NULL);
14831 /* The "sub" instruction contains an immediate value rotate count of 0,
14832 which resulted in a 32-bit shift of a 32-bit value, caught by
14833 UBSan. */
14834 const uint32_t insns[] = {
14835 0xe92d4ff0, /* push {r4, r5, r6, r7, r8, r9, sl, fp, lr} */
14836 0xe1a05000, /* mov r5, r0 */
14837 0xe5903020, /* ldr r3, [r0, #32] */
14838 0xe24dd044, /* sub sp, sp, #68 ; 0x44 */
14841 test_arm_instruction_reader mem_reader (insns);
14842 arm_prologue_cache cache;
14843 arm_cache_init (&cache, gdbarch);
14845 arm_analyze_prologue (gdbarch, 0, sizeof (insns) - 1, &cache, mem_reader);
14849 } // namespace selftests
14850 #endif /* GDB_SELF_TEST */
14852 /* Cleans up local record registers and memory allocations. */
14854 static void
14855 deallocate_reg_mem (arm_insn_decode_record *record)
14857 xfree (record->arm_regs);
14858 xfree (record->arm_mems);
14862 /* Parse the current instruction and record the values of the registers and
14863 memory that will be changed in current instruction to record_arch_list".
14864 Return -1 if something is wrong. */
14867 arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
14868 CORE_ADDR insn_addr)
14871 uint32_t no_of_rec = 0;
14872 uint32_t ret = 0; /* return value: -1:record failure ; 0:success */
14873 ULONGEST t_bit = 0, insn_id = 0;
14875 ULONGEST u_regval = 0;
14877 arm_insn_decode_record arm_record;
14879 memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14880 arm_record.regcache = regcache;
14881 arm_record.this_addr = insn_addr;
14882 arm_record.gdbarch = gdbarch;
14885 if (record_debug > 1)
14887 gdb_printf (gdb_stdlog, "Process record: arm_process_record "
14888 "addr = %s\n",
14889 paddress (gdbarch, arm_record.this_addr));
14892 instruction_reader reader;
14893 enum bfd_endian code_endian
14894 = gdbarch_byte_order_for_code (arm_record.gdbarch);
14895 arm_record.arm_insn
14896 = reader.read (arm_record.this_addr, 2, code_endian);
14898 /* Check the insn, whether it is thumb or arm one. */
14900 t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
14901 regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
14904 if (!(u_regval & t_bit))
14906 /* We are decoding arm insn. */
14907 ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
14909 else
14911 insn_id = bits (arm_record.arm_insn, 11, 15);
14912 /* is it thumb2 insn? */
14913 if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
14915 ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14916 THUMB2_INSN_SIZE_BYTES);
14918 else
14920 /* We are decoding thumb insn. */
14921 ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14922 THUMB_INSN_SIZE_BYTES);
14926 if (0 == ret)
14928 /* Record registers. */
14929 record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
14930 if (arm_record.arm_regs)
14932 for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
14934 if (record_full_arch_list_add_reg
14935 (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
14936 ret = -1;
14939 /* Record memories. */
14940 if (arm_record.arm_mems)
14942 for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
14944 if (record_full_arch_list_add_mem
14945 ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
14946 arm_record.arm_mems[no_of_rec].len))
14947 ret = -1;
14951 if (record_full_arch_list_add_end ())
14952 ret = -1;
14956 deallocate_reg_mem (&arm_record);
14958 return ret;
14961 /* See arm-tdep.h. */
14963 const target_desc *
14964 arm_read_description (arm_fp_type fp_type, bool tls)
14966 struct target_desc *tdesc = tdesc_arm_list[fp_type][tls];
14968 if (tdesc == nullptr)
14970 tdesc = arm_create_target_description (fp_type, tls);
14971 tdesc_arm_list[fp_type][tls] = tdesc;
14974 return tdesc;
14977 /* See arm-tdep.h. */
14979 const target_desc *
14980 arm_read_mprofile_description (arm_m_profile_type m_type)
14982 struct target_desc *tdesc = tdesc_arm_mprofile_list[m_type];
14984 if (tdesc == nullptr)
14986 tdesc = arm_create_mprofile_target_description (m_type);
14987 tdesc_arm_mprofile_list[m_type] = tdesc;
14990 return tdesc;