1 /* Common target dependent code for GDB on ARM systems.
2 
3    Copyright (C) 1988-2024 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
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.
11 
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.
16 
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/>.  */
19 
20 
21 #include <ctype.h>
22 
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"
51 
52 #include "arch/arm.h"
53 #include "arch/arm-get-next-pcs.h"
54 #include "arm-tdep.h"
55 #include "sim/sim-arm.h"
56 
57 #include "elf-bfd.h"
58 #include "coff/internal.h"
59 #include "elf/arm.h"
60 
61 #include "record.h"
62 #include "record-full.h"
63 #include <algorithm>
64 
65 #include "producer.h"
66 
67 #if GDB_SELF_TEST
68 #include "gdbsupport/selftest.h"
69 #endif
70 
71 static bool arm_debug;
72 
73 /* Print an "arm" debug statement.  */
74 
75 #define arm_debug_printf(fmt, ...) \
76   debug_prefixed_printf_cond (arm_debug, "arm", fmt, ##__VA_ARGS__)
77 
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.
81 
82    MSYMBOL_SET_SPECIAL        Actually sets the "special" bit.
83    MSYMBOL_IS_SPECIAL   Tests the "special" bit in a minimal symbol.  */
84 
85 #define MSYMBOL_SET_SPECIAL(msym)                                     \
86           (msym)->set_target_flag_1 (true)
87 
88 #define MSYMBOL_IS_SPECIAL(msym)                                      \
89           (msym)->target_flag_1 ()
90 
91 struct arm_mapping_symbol
92 {
93   CORE_ADDR value;
94   char type;
95 
96   bool operator< (const arm_mapping_symbol &other) const
97   { return this->value < other.value; }
98 };
99 
100 typedef std::vector<arm_mapping_symbol> arm_mapping_symbol_vec;
101 
102 struct arm_per_bfd
103 {
arm_per_bfdarm_per_bfd104   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] ())
107   {}
108 
109   DISABLE_COPY_AND_ASSIGN (arm_per_bfd);
110 
111   /* Information about mapping symbols ($a, $d, $t) in the objfile.
112 
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).
116 
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;
120 
121   /* For each corresponding element of section_maps above, is this vector
122      sorted.  */
123   std::unique_ptr<bool[]> section_maps_sorted;
124 };
125 
126 /* Per-bfd data used for mapping symbols.  */
127 static const registry<bfd>::key<arm_per_bfd> arm_bfd_data_key;
128 
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;
132 
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[] =
136 {
137   "auto",
138   "softfpa",
139   "fpa",
140   "softvfp",
141   "vfp",
142   NULL
143 };
144 
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";
148 
149 /* The ABI to use.  Keep this in sync with arm_abi_kind.  */
150 static const char *const arm_abi_strings[] =
151 {
152   "auto",
153   "APCS",
154   "AAPCS",
155   NULL
156 };
157 
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";
161 
162 /* The execution mode to assume.  */
163 static const char *const arm_mode_strings[] =
164   {
165     "auto",
166     "arm",
167     "thumb",
168     NULL
169   };
170 
171 static const char *arm_fallback_mode_string = "auto";
172 static const char *arm_force_mode_string = "auto";
173 
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
179 {
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 },
223 };
224 
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       */
233 
234 /* Holds the current set of options to be passed to the disassembler.  */
235 static std::string arm_disassembler_options;
236 
237 /* Valid register name styles.  */
238 static const char **valid_disassembly_styles;
239 
240 /* Disassembly style to use. Default to "std" register names.  */
241 static const char *disassembly_style;
242 
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];
246 
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 *);
254 
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);
261 
262 static CORE_ADDR
263   arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
264 
265 
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,
273 };
274 
275 struct arm_prologue_cache
276 {
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;
281 
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;
289 
290   /* Active stack pointer.  */
291   int active_sp_regnum;
292   int active_msp_regnum;
293   int active_psp_regnum;
294 
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.  */
298 
299   int framesize;
300 
301   /* The register used to hold the frame pointer for this frame.  */
302   int framereg;
303 
304   /* True if the return address is signed, false otherwise.  */
305   std::optional<bool> ra_signed_state;
306 
307   /* Saved register offsets.  */
308   trad_frame_saved_reg *saved_regs;
309 
310   arm_prologue_cache() = default;
311 };
312 
313 
314 /* Reconstruct T bit in program status register from LR value.  */
315 
316 static inline ULONGEST
reconstruct_t_bit(struct gdbarch * gdbarch,CORE_ADDR lr,ULONGEST psr)317 reconstruct_t_bit(struct gdbarch *gdbarch, CORE_ADDR lr, ULONGEST psr)
318 {
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;
324 
325   return psr;
326 }
327 
328 /* Initialize CACHE fields for which zero is not adequate (CACHE is
329    expected to have been ZALLOC'ed before calling this function).  */
330 
331 static void
arm_cache_init(struct arm_prologue_cache * cache,struct gdbarch * gdbarch)332 arm_cache_init (struct arm_prologue_cache *cache, struct gdbarch *gdbarch)
333 {
334   cache->active_sp_regnum = ARM_SP_REGNUM;
335 
336   cache->saved_regs = trad_frame_alloc_saved_regs (gdbarch);
337 }
338 
339 /* Similar to the previous function, but extracts GDBARCH from FRAME.  */
340 
341 static void
arm_cache_init(struct arm_prologue_cache * cache,const frame_info_ptr & frame)342 arm_cache_init (struct arm_prologue_cache *cache, const frame_info_ptr &frame)
343 {
344   struct gdbarch *gdbarch = get_frame_arch (frame);
345   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
346 
347   arm_cache_init (cache, gdbarch);
348   cache->sp = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
349 
350   if (tdep->have_sec_ext)
351     {
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);
356 
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);
365 
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
372           {
373             warning (_("Invalid state, unable to determine msp alias, assuming "
374                          "msp_s."));
375             cache->active_msp_regnum = tdep->m_profile_msp_s_regnum;
376           }
377 
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
384           {
385             warning (_("Invalid state, unable to determine psp alias, assuming "
386                          "psp_s."));
387             cache->active_psp_regnum = tdep->m_profile_psp_s_regnum;
388           }
389 
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
396           {
397             warning (_("Invalid state, unable to determine sp alias, assuming "
398                          "msp."));
399             cache->active_sp_regnum = cache->active_msp_regnum;
400           }
401     }
402   else if (tdep->is_m)
403     {
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);
408 
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
415           {
416             warning (_("Invalid state, unable to determine sp alias, assuming "
417                          "msp."));
418             cache->active_sp_regnum = tdep->m_profile_msp_regnum;
419           }
420     }
421   else
422     {
423       cache->msp_s
424           = get_frame_register_unsigned (frame, ARM_SP_REGNUM);
425 
426       cache->active_sp_regnum = ARM_SP_REGNUM;
427     }
428 }
429 
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.  */
433 
434 static CORE_ADDR
arm_cache_get_sp_register(struct arm_prologue_cache * cache,arm_gdbarch_tdep * tdep,int regnum)435 arm_cache_get_sp_register (struct arm_prologue_cache *cache,
436                                  arm_gdbarch_tdep *tdep, int regnum)
437 {
438   if (tdep->have_sec_ext)
439     {
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);
454     }
455   else if (tdep->is_m)
456     {
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);
463     }
464   else if (regnum == ARM_SP_REGNUM)
465     return cache->sp;
466 
467   gdb_assert_not_reached ("Invalid SP selection");
468 }
469 
470 /* Return the previous stack address, depending on which SP register
471    is active.  */
472 
473 static CORE_ADDR
arm_cache_get_prev_sp_value(struct arm_prologue_cache * cache,arm_gdbarch_tdep * tdep)474 arm_cache_get_prev_sp_value (struct arm_prologue_cache *cache, arm_gdbarch_tdep *tdep)
475 {
476   CORE_ADDR val = arm_cache_get_sp_register (cache, tdep, cache->active_sp_regnum);
477   return val;
478 }
479 
480 /* Set the active stack pointer to VAL.  */
481 
482 static void
arm_cache_set_active_sp_value(struct arm_prologue_cache * cache,arm_gdbarch_tdep * tdep,CORE_ADDR val)483 arm_cache_set_active_sp_value (struct arm_prologue_cache *cache,
484                                      arm_gdbarch_tdep *tdep, CORE_ADDR val)
485 {
486   if (tdep->have_sec_ext)
487     {
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;
496 
497       return;
498     }
499   else if (tdep->is_m)
500     {
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;
505 
506       return;
507     }
508   else if (cache->active_sp_regnum == ARM_SP_REGNUM)
509     {
510       cache->sp = val;
511       return;
512     }
513 
514   gdb_assert_not_reached ("Invalid SP selection");
515 }
516 
517 /* Return true if REGNUM is one of the alternative stack pointers.  */
518 
519 static bool
arm_is_alternative_sp_register(arm_gdbarch_tdep * tdep,int regnum)520 arm_is_alternative_sp_register (arm_gdbarch_tdep *tdep, int regnum)
521 {
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;
531 }
532 
533 /* Set the active stack pointer to SP_REGNUM.  */
534 
535 static void
arm_cache_switch_prev_sp(struct arm_prologue_cache * cache,arm_gdbarch_tdep * tdep,int sp_regnum)536 arm_cache_switch_prev_sp (struct arm_prologue_cache *cache,
537                                 arm_gdbarch_tdep *tdep, int sp_regnum)
538 {
539   gdb_assert (arm_is_alternative_sp_register (tdep, sp_regnum));
540 
541   if (tdep->have_sec_ext)
542     {
543       gdb_assert (sp_regnum != tdep->m_profile_msp_regnum
544                       && sp_regnum != tdep->m_profile_psp_regnum);
545 
546       if (sp_regnum == tdep->m_profile_msp_s_regnum
547             || sp_regnum == tdep->m_profile_psp_s_regnum)
548           {
549             cache->active_msp_regnum = tdep->m_profile_msp_s_regnum;
550             cache->active_psp_regnum = tdep->m_profile_psp_s_regnum;
551           }
552       else if (sp_regnum == tdep->m_profile_msp_ns_regnum
553                  || sp_regnum == tdep->m_profile_psp_ns_regnum)
554           {
555             cache->active_msp_regnum = tdep->m_profile_msp_ns_regnum;
556             cache->active_psp_regnum = tdep->m_profile_psp_ns_regnum;
557           }
558     }
559 
560   cache->active_sp_regnum = sp_regnum;
561 }
562 
563 namespace {
564 
565 /* Abstract class to read ARM instructions from memory.  */
566 
567 class arm_instruction_reader
568 {
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;
572 };
573 
574 /* Read instructions from target memory.  */
575 
576 class target_arm_instruction_reader : public arm_instruction_reader
577 {
578 public:
read(CORE_ADDR memaddr,bfd_endian byte_order)579   uint32_t read (CORE_ADDR memaddr, bfd_endian byte_order) const override
580   {
581     return read_code_unsigned_integer (memaddr, 4, byte_order);
582   }
583 };
584 
585 } /* namespace */
586 
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);
590 
591 /* Architecture version for displaced stepping.  This effects the behaviour of
592    certain instructions, and really should not be hard-wired.  */
593 
594 #define DISPLACED_STEPPING_ARCH_VERSION           5
595 
596 /* See arm-tdep.h.  */
597 
598 bool arm_apcs_32 = true;
599 bool arm_unwind_secure_frames = true;
600 
601 /* Return the bit mask in ARM_PS_REGNUM that indicates Thumb mode.  */
602 
603 int
arm_psr_thumb_bit(struct gdbarch * gdbarch)604 arm_psr_thumb_bit (struct gdbarch *gdbarch)
605 {
606   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
607 
608   if (tdep->is_m)
609     return XPSR_T;
610   else
611     return CPSR_T;
612 }
613 
614 /* Determine if the processor is currently executing in Thumb mode.  */
615 
616 int
arm_is_thumb(struct regcache * regcache)617 arm_is_thumb (struct regcache *regcache)
618 {
619   ULONGEST cpsr;
620   ULONGEST t_bit = arm_psr_thumb_bit (regcache->arch ());
621 
622   cpsr = regcache_raw_get_unsigned (regcache, ARM_PS_REGNUM);
623 
624   return (cpsr & t_bit) != 0;
625 }
626 
627 /* Determine if FRAME is executing in Thumb mode.  FRAME must be an ARM
628    frame.  */
629 
630 int
arm_frame_is_thumb(const frame_info_ptr & frame)631 arm_frame_is_thumb (const frame_info_ptr &frame)
632 {
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);
636 
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);
642 
643   /* Find and extract the thumb bit.  */
644   ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
645   return (cpsr & t_bit) != 0;
646 }
647 
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.  */
651 
652 static char
arm_find_mapping_symbol(CORE_ADDR memaddr,CORE_ADDR * start)653 arm_find_mapping_symbol (CORE_ADDR memaddr, CORE_ADDR *start)
654 {
655   struct obj_section *sec;
656 
657   /* If there are mapping symbols, consult them.  */
658   sec = find_pc_section (memaddr);
659   if (sec != NULL)
660     {
661       arm_per_bfd *data = arm_bfd_data_key.get (sec->objfile->obfd.get ());
662       if (data != NULL)
663           {
664             unsigned int section_idx = sec->the_bfd_section->index;
665             arm_mapping_symbol_vec &map
666               = data->section_maps[section_idx];
667 
668             /* Sort the vector on first use.  */
669             if (!data->section_maps_sorted[section_idx])
670               {
671                 std::sort (map.begin (), map.end ());
672                 data->section_maps_sorted[section_idx] = true;
673               }
674 
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);
678 
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 ())
684               {
685                 if (it->value == map_key.value)
686                     {
687                       if (start)
688                         *start = it->value + sec->addr ();
689                       return it->type;
690                     }
691               }
692 
693             if (it > map.begin ())
694               {
695                 arm_mapping_symbol_vec::const_iterator prev_it
696                     = it - 1;
697 
698                 if (start)
699                     *start = prev_it->value + sec->addr ();
700                 return prev_it->type;
701               }
702           }
703     }
704 
705   return 0;
706 }
707 
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.  */
711 
712 int
arm_pc_is_thumb(struct gdbarch * gdbarch,CORE_ADDR memaddr)713 arm_pc_is_thumb (struct gdbarch *gdbarch, CORE_ADDR memaddr)
714 {
715   struct bound_minimal_symbol sym;
716   char type;
717   arm_displaced_step_copy_insn_closure *dsc = nullptr;
718   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
719 
720   if (gdbarch_displaced_step_copy_insn_closure_by_addr_p (gdbarch))
721     dsc = ((arm_displaced_step_copy_insn_closure * )
722              gdbarch_displaced_step_copy_insn_closure_by_addr
723                (gdbarch, current_inferior (), memaddr));
724 
725   /* If checking the mode of displaced instruction in copy area, the mode
726      should be determined by instruction on the original address.  */
727   if (dsc)
728     {
729       displaced_debug_printf ("check mode of %.8lx instead of %.8lx",
730                                     (unsigned long) dsc->insn_addr,
731                                     (unsigned long) memaddr);
732       memaddr = dsc->insn_addr;
733     }
734 
735   /* If bit 0 of the address is set, assume this is a Thumb address.  */
736   if (IS_THUMB_ADDR (memaddr))
737     return 1;
738 
739   /* If the user wants to override the symbol table, let him.  */
740   if (strcmp (arm_force_mode_string, "arm") == 0)
741     return 0;
742   if (strcmp (arm_force_mode_string, "thumb") == 0)
743     return 1;
744 
745   /* ARM v6-M and v7-M are always in Thumb mode.  */
746   if (tdep->is_m)
747     return 1;
748 
749   /* If there are mapping symbols, consult them.  */
750   type = arm_find_mapping_symbol (memaddr, NULL);
751   if (type)
752     return type == 't';
753 
754   /* Thumb functions have a "special" bit set in minimal symbols.  */
755   sym = lookup_minimal_symbol_by_pc (memaddr);
756   if (sym.minsym)
757     return (MSYMBOL_IS_SPECIAL (sym.minsym));
758 
759   /* If the user wants to override the fallback mode, let them.  */
760   if (strcmp (arm_fallback_mode_string, "arm") == 0)
761     return 0;
762   if (strcmp (arm_fallback_mode_string, "thumb") == 0)
763     return 1;
764 
765   /* If we couldn't find any symbol, but we're talking to a running
766      target, then trust the current value of $cpsr.  This lets
767      "display/i $pc" always show the correct mode (though if there is
768      a symbol table we will not reach here, so it still may not be
769      displayed in the mode it will be executed).  */
770   if (target_has_registers ())
771     return arm_frame_is_thumb (get_current_frame ());
772 
773   /* Otherwise we're out of luck; we assume ARM.  */
774   return 0;
775 }
776 
777 static inline bool
arm_m_addr_is_lockup(CORE_ADDR addr)778 arm_m_addr_is_lockup (CORE_ADDR addr)
779 {
780   switch (addr)
781     {
782       /* Values for lockup state.
783            For more details see "B1.5.15 Unrecoverable exception cases" in
784            both ARMv6-M and ARMv7-M Architecture Reference Manuals, or
785            see "B4.32 Lockup" in ARMv8-M Architecture Reference Manual.  */
786       case 0xeffffffe:
787       case 0xfffffffe:
788       case 0xffffffff:
789           return true;
790 
791       default:
792           /* Address is not lockup.  */
793           return false;
794     }
795 }
796 
797 /* Determine if the address specified equals any of these magic return
798    values, called EXC_RETURN, defined by the ARM v6-M, v7-M and v8-M
799    architectures.  Also include lockup magic PC value.
800    Check also for FNC_RETURN if we have the v8-M security extension.
801 
802    From ARMv6-M Reference Manual B1.5.8
803    Table B1-5 Exception return behavior
804 
805    EXC_RETURN    Return To        Return Stack
806    0xFFFFFFF1    Handler mode     Main
807    0xFFFFFFF9    Thread mode      Main
808    0xFFFFFFFD    Thread mode      Process
809 
810    From ARMv7-M Reference Manual B1.5.8
811    Table B1-8 EXC_RETURN definition of exception return behavior, no FP
812 
813    EXC_RETURN    Return To        Return Stack
814    0xFFFFFFF1    Handler mode     Main
815    0xFFFFFFF9    Thread mode      Main
816    0xFFFFFFFD    Thread mode      Process
817 
818    Table B1-9 EXC_RETURN definition of exception return behavior, with
819    FP
820 
821    EXC_RETURN    Return To        Return Stack    Frame Type
822    0xFFFFFFE1    Handler mode     Main            Extended
823    0xFFFFFFE9    Thread mode      Main            Extended
824    0xFFFFFFED    Thread mode      Process         Extended
825    0xFFFFFFF1    Handler mode     Main            Basic
826    0xFFFFFFF9    Thread mode      Main            Basic
827    0xFFFFFFFD    Thread mode      Process         Basic
828 
829    For more details see "B1.5.8 Exception return behavior"
830    in both ARMv6-M and ARMv7-M Architecture Reference Manuals.
831 
832    From ARMv8-M Architecture Technical Reference, D1.2.95
833    FType, Mode and SPSEL bits are to be considered when the Security
834    Extension is not implemented.
835 
836    EXC_RETURN    Return To        Return Stack    Frame Type
837    0xFFFFFFA0    Handler mode     Main            Extended
838    0xFFFFFFA8    Thread mode      Main            Extended
839    0xFFFFFFAC    Thread mode      Process         Extended
840    0xFFFFFFB0    Handler mode     Main            Standard
841    0xFFFFFFB8    Thread mode      Main            Standard
842    0xFFFFFFBC    Thread mode      Process         Standard  */
843 
844 static int
arm_m_addr_is_magic(struct gdbarch * gdbarch,CORE_ADDR addr)845 arm_m_addr_is_magic (struct gdbarch *gdbarch, CORE_ADDR addr)
846 {
847   if (arm_m_addr_is_lockup (addr))
848     return 1;
849 
850   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
851   if (tdep->have_sec_ext)
852     {
853       switch ((addr & 0xff000000))
854           {
855           case 0xff000000: /* EXC_RETURN pattern.  */
856           case 0xfe000000: /* FNC_RETURN pattern.  */
857             return 1;
858           default:
859             return 0;
860           }
861     }
862   else
863     {
864       switch (addr)
865           {
866             /* Values from ARMv8-M Architecture Technical Reference.  */
867           case 0xffffffa0:
868           case 0xffffffa8:
869           case 0xffffffac:
870           case 0xffffffb0:
871           case 0xffffffb8:
872           case 0xffffffbc:
873             /* Values from Tables in B1.5.8 the EXC_RETURN definitions of
874                the exception return behavior.  */
875           case 0xffffffe1:
876           case 0xffffffe9:
877           case 0xffffffed:
878           case 0xfffffff1:
879           case 0xfffffff9:
880           case 0xfffffffd:
881             /* Address is magic.  */
882             return 1;
883 
884           default:
885             /* Address is not magic.  */
886             return 0;
887           }
888     }
889 }
890 
891 /* Remove useless bits from addresses in a running program.  */
892 static CORE_ADDR
arm_addr_bits_remove(struct gdbarch * gdbarch,CORE_ADDR val)893 arm_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR val)
894 {
895   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
896 
897   /* On M-profile devices, do not strip the low bit from EXC_RETURN
898      (the magic exception return address).  */
899   if (tdep->is_m && arm_m_addr_is_magic (gdbarch, val))
900     return val;
901 
902   if (arm_apcs_32)
903     return UNMAKE_THUMB_ADDR (val);
904   else
905     return (val & 0x03fffffc);
906 }
907 
908 /* Return 1 if PC is the start of a compiler helper function which
909    can be safely ignored during prologue skipping.  IS_THUMB is true
910    if the function is known to be a Thumb function due to the way it
911    is being called.  */
912 static int
skip_prologue_function(struct gdbarch * gdbarch,CORE_ADDR pc,int is_thumb)913 skip_prologue_function (struct gdbarch *gdbarch, CORE_ADDR pc, int is_thumb)
914 {
915   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
916   struct bound_minimal_symbol msym;
917 
918   msym = lookup_minimal_symbol_by_pc (pc);
919   if (msym.minsym != NULL
920       && msym.value_address () == pc
921       && msym.minsym->linkage_name () != NULL)
922     {
923       const char *name = msym.minsym->linkage_name ();
924 
925       /* The GNU linker's Thumb call stub to foo is named
926            __foo_from_thumb.  */
927       if (strstr (name, "_from_thumb") != NULL)
928           name += 2;
929 
930       /* On soft-float targets, __truncdfsf2 is called to convert promoted
931            arguments to their argument types in non-prototyped
932            functions.  */
933       if (startswith (name, "__truncdfsf2"))
934           return 1;
935       if (startswith (name, "__aeabi_d2f"))
936           return 1;
937 
938       /* Internal functions related to thread-local storage.  */
939       if (startswith (name, "__tls_get_addr"))
940           return 1;
941       if (startswith (name, "__aeabi_read_tp"))
942           return 1;
943     }
944   else
945     {
946       /* If we run against a stripped glibc, we may be unable to identify
947            special functions by name.  Check for one important case,
948            __aeabi_read_tp, by comparing the *code* against the default
949            implementation (this is hand-written ARM assembler in glibc).  */
950 
951       if (!is_thumb
952             && read_code_unsigned_integer (pc, 4, byte_order_for_code)
953                == 0xe3e00a0f /* mov r0, #0xffff0fff */
954             && read_code_unsigned_integer (pc + 4, 4, byte_order_for_code)
955                == 0xe240f01f) /* sub pc, r0, #31 */
956           return 1;
957     }
958 
959   return 0;
960 }
961 
962 /* Extract the immediate from instruction movw/movt of encoding T.  INSN1 is
963    the first 16-bit of instruction, and INSN2 is the second 16-bit of
964    instruction.  */
965 #define EXTRACT_MOVW_MOVT_IMM_T(insn1, insn2) \
966   ((bits ((insn1), 0, 3) << 12)               \
967    | (bits ((insn1), 10, 10) << 11)           \
968    | (bits ((insn2), 12, 14) << 8)            \
969    | bits ((insn2), 0, 7))
970 
971 /* Extract the immediate from instruction movw/movt of encoding A.  INSN is
972    the 32-bit instruction.  */
973 #define EXTRACT_MOVW_MOVT_IMM_A(insn) \
974   ((bits ((insn), 16, 19) << 12) \
975    | bits ((insn), 0, 11))
976 
977 /* Decode immediate value; implements ThumbExpandImmediate pseudo-op.  */
978 
979 static unsigned int
thumb_expand_immediate(unsigned int imm)980 thumb_expand_immediate (unsigned int imm)
981 {
982   unsigned int count = imm >> 7;
983 
984   if (count < 8)
985     switch (count / 2)
986       {
987       case 0:
988           return imm & 0xff;
989       case 1:
990           return (imm & 0xff) | ((imm & 0xff) << 16);
991       case 2:
992           return ((imm & 0xff) << 8) | ((imm & 0xff) << 24);
993       case 3:
994           return (imm & 0xff) | ((imm & 0xff) << 8)
995                     | ((imm & 0xff) << 16) | ((imm & 0xff) << 24);
996       }
997 
998   return (0x80 | (imm & 0x7f)) << (32 - count);
999 }
1000 
1001 /* Return 1 if the 16-bit Thumb instruction INSN restores SP in
1002    epilogue, 0 otherwise.  */
1003 
1004 static int
thumb_instruction_restores_sp(unsigned short insn)1005 thumb_instruction_restores_sp (unsigned short insn)
1006 {
1007   return (insn == 0x46bd  /* mov sp, r7 */
1008             || (insn & 0xff80) == 0xb000  /* add sp, imm */
1009             || (insn & 0xfe00) == 0xbc00);  /* pop <registers> */
1010 }
1011 
1012 /* Analyze a Thumb prologue, looking for a recognizable stack frame
1013    and frame pointer.  Scan until we encounter a store that could
1014    clobber the stack frame unexpectedly, or an unknown instruction.
1015    Return the last address which is definitely safe to skip for an
1016    initial breakpoint.  */
1017 
1018 static CORE_ADDR
thumb_analyze_prologue(struct gdbarch * gdbarch,CORE_ADDR start,CORE_ADDR limit,struct arm_prologue_cache * cache)1019 thumb_analyze_prologue (struct gdbarch *gdbarch,
1020                               CORE_ADDR start, CORE_ADDR limit,
1021                               struct arm_prologue_cache *cache)
1022 {
1023   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1024   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1025   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1026   int i;
1027   pv_t regs[16];
1028   CORE_ADDR offset;
1029   CORE_ADDR unrecognized_pc = 0;
1030 
1031   for (i = 0; i < 16; i++)
1032     regs[i] = pv_register (i, 0);
1033   pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1034 
1035   while (start < limit)
1036     {
1037       unsigned short insn;
1038       std::optional<bool> ra_signed_state;
1039 
1040       insn = read_code_unsigned_integer (start, 2, byte_order_for_code);
1041 
1042       if ((insn & 0xfe00) == 0xb400)              /* push { rlist } */
1043           {
1044             int regno;
1045             int mask;
1046 
1047             if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
1048               break;
1049 
1050             /* Bits 0-7 contain a mask for registers R0-R7.  Bit 8 says
1051                whether to save LR (R14).  */
1052             mask = (insn & 0xff) | ((insn & 0x100) << 6);
1053 
1054             /* Calculate offsets of saved R0-R7 and LR.  */
1055             for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1056               if (mask & (1 << regno))
1057                 {
1058                     regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1059                                                                    -4);
1060                     stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
1061                 }
1062           }
1063       else if ((insn & 0xff80) == 0xb080)         /* sub sp, #imm */
1064           {
1065             offset = (insn & 0x7f) << 2;                    /* get scaled offset */
1066             regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM],
1067                                                              -offset);
1068           }
1069       else if (thumb_instruction_restores_sp (insn))
1070           {
1071             /* Don't scan past the epilogue.  */
1072             break;
1073           }
1074       else if ((insn & 0xf800) == 0xa800)         /* add Rd, sp, #imm */
1075           regs[bits (insn, 8, 10)] = pv_add_constant (regs[ARM_SP_REGNUM],
1076                                                                 (insn & 0xff) << 2);
1077       else if ((insn & 0xfe00) == 0x1c00          /* add Rd, Rn, #imm */
1078                  && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1079           regs[bits (insn, 0, 2)] = pv_add_constant (regs[bits (insn, 3, 5)],
1080                                                                bits (insn, 6, 8));
1081       else if ((insn & 0xf800) == 0x3000          /* add Rd, #imm */
1082                  && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1083           regs[bits (insn, 8, 10)] = pv_add_constant (regs[bits (insn, 8, 10)],
1084                                                                 bits (insn, 0, 7));
1085       else if ((insn & 0xfe00) == 0x1800          /* add Rd, Rn, Rm */
1086                  && pv_is_register (regs[bits (insn, 6, 8)], ARM_SP_REGNUM)
1087                  && pv_is_constant (regs[bits (insn, 3, 5)]))
1088           regs[bits (insn, 0, 2)] = pv_add (regs[bits (insn, 3, 5)],
1089                                                     regs[bits (insn, 6, 8)]);
1090       else if ((insn & 0xff00) == 0x4400          /* add Rd, Rm */
1091                  && pv_is_constant (regs[bits (insn, 3, 6)]))
1092           {
1093             int rd = (bit (insn, 7) << 3) + bits (insn, 0, 2);
1094             int rm = bits (insn, 3, 6);
1095             regs[rd] = pv_add (regs[rd], regs[rm]);
1096           }
1097       else if ((insn & 0xff00) == 0x4600)         /* mov hi, lo or mov lo, hi */
1098           {
1099             int dst_reg = (insn & 0x7) + ((insn & 0x80) >> 4);
1100             int src_reg = (insn & 0x78) >> 3;
1101             regs[dst_reg] = regs[src_reg];
1102           }
1103       else if ((insn & 0xf800) == 0x9000)         /* str rd, [sp, #off] */
1104           {
1105             /* Handle stores to the stack.  Normally pushes are used,
1106                but with GCC -mtpcs-frame, there may be other stores
1107                in the prologue to create the frame.  */
1108             int regno = (insn >> 8) & 0x7;
1109             pv_t addr;
1110 
1111             offset = (insn & 0xff) << 2;
1112             addr = pv_add_constant (regs[ARM_SP_REGNUM], offset);
1113 
1114             if (stack.store_would_trash (addr))
1115               break;
1116 
1117             stack.store (addr, 4, regs[regno]);
1118           }
1119       else if ((insn & 0xf800) == 0x6000)         /* str rd, [rn, #off] */
1120           {
1121             int rd = bits (insn, 0, 2);
1122             int rn = bits (insn, 3, 5);
1123             pv_t addr;
1124 
1125             offset = bits (insn, 6, 10) << 2;
1126             addr = pv_add_constant (regs[rn], offset);
1127 
1128             if (stack.store_would_trash (addr))
1129               break;
1130 
1131             stack.store (addr, 4, regs[rd]);
1132           }
1133       else if (((insn & 0xf800) == 0x7000         /* strb Rd, [Rn, #off] */
1134                     || (insn & 0xf800) == 0x8000) /* strh Rd, [Rn, #off] */
1135                  && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM))
1136           /* Ignore stores of argument registers to the stack.  */
1137           ;
1138       else if ((insn & 0xf800) == 0xc800          /* ldmia Rn!, { registers } */
1139                  && pv_is_register (regs[bits (insn, 8, 10)], ARM_SP_REGNUM))
1140           /* Ignore block loads from the stack, potentially copying
1141              parameters from memory.  */
1142           ;
1143       else if ((insn & 0xf800) == 0x9800          /* ldr Rd, [Rn, #immed] */
1144                  || ((insn & 0xf800) == 0x6800    /* ldr Rd, [sp, #immed] */
1145                        && pv_is_register (regs[bits (insn, 3, 5)], ARM_SP_REGNUM)))
1146           /* Similarly ignore single loads from the stack.  */
1147           ;
1148       else if ((insn & 0xffc0) == 0x0000          /* lsls Rd, Rm, #0 */
1149                  || (insn & 0xffc0) == 0x1c00)    /* add Rd, Rn, #0 */
1150           /* Skip register copies, i.e. saves to another register
1151              instead of the stack.  */
1152           ;
1153       else if ((insn & 0xf800) == 0x2000)         /* movs Rd, #imm */
1154           /* Recognize constant loads; even with small stacks these are necessary
1155              on Thumb.  */
1156           regs[bits (insn, 8, 10)] = pv_constant (bits (insn, 0, 7));
1157       else if ((insn & 0xf800) == 0x4800)         /* ldr Rd, [pc, #imm] */
1158           {
1159             /* Constant pool loads, for the same reason.  */
1160             unsigned int constant;
1161             CORE_ADDR loc;
1162 
1163             loc = start + 4 + bits (insn, 0, 7) * 4;
1164             constant = read_memory_unsigned_integer (loc, 4, byte_order);
1165             regs[bits (insn, 8, 10)] = pv_constant (constant);
1166           }
1167       else if (thumb_insn_size (insn) == 4) /* 32-bit Thumb-2 instructions.  */
1168           {
1169             unsigned short inst2;
1170 
1171             inst2 = read_code_unsigned_integer (start + 2, 2,
1172                                                         byte_order_for_code);
1173             uint32_t whole_insn = (insn << 16) | inst2;
1174 
1175             if ((insn & 0xf800) == 0xf000 && (inst2 & 0xe800) == 0xe800)
1176               {
1177                 /* BL, BLX.  Allow some special function calls when
1178                      skipping the prologue; GCC generates these before
1179                      storing arguments to the stack.  */
1180                 CORE_ADDR nextpc;
1181                 int j1, j2, imm1, imm2;
1182 
1183                 imm1 = sbits (insn, 0, 10);
1184                 imm2 = bits (inst2, 0, 10);
1185                 j1 = bit (inst2, 13);
1186                 j2 = bit (inst2, 11);
1187 
1188                 offset = ((imm1 << 12) + (imm2 << 1));
1189                 offset ^= ((!j2) << 22) | ((!j1) << 23);
1190 
1191                 nextpc = start + 4 + offset;
1192                 /* For BLX make sure to clear the low bits.  */
1193                 if (bit (inst2, 12) == 0)
1194                     nextpc = nextpc & 0xfffffffc;
1195 
1196                 if (!skip_prologue_function (gdbarch, nextpc,
1197                                                      bit (inst2, 12) != 0))
1198                     break;
1199               }
1200 
1201             else if ((insn & 0xffd0) == 0xe900    /* stmdb Rn{!},
1202                                                                { registers } */
1203                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1204               {
1205                 pv_t addr = regs[bits (insn, 0, 3)];
1206                 int regno;
1207 
1208                 if (stack.store_would_trash (addr))
1209                     break;
1210 
1211                 /* Calculate offsets of saved registers.  */
1212                 for (regno = ARM_LR_REGNUM; regno >= 0; regno--)
1213                     if (inst2 & (1 << regno))
1214                       {
1215                         addr = pv_add_constant (addr, -4);
1216                         stack.store (addr, 4, regs[regno]);
1217                       }
1218 
1219                 if (insn & 0x0020)
1220                     regs[bits (insn, 0, 3)] = addr;
1221               }
1222 
1223             /* vstmdb Rn{!}, { D-registers } (aka vpush).  */
1224             else if ((insn & 0xff20) == 0xed20
1225                        && (inst2 & 0x0f00) == 0x0b00
1226                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1227               {
1228                 /* Address SP points to.  */
1229                 pv_t addr = regs[bits (insn, 0, 3)];
1230 
1231                 /* Number of registers saved.  */
1232                 unsigned int number = bits (inst2, 0, 7) >> 1;
1233 
1234                 /* First register to save.  */
1235                 int vd = bits (inst2, 12, 15) | (bits (insn, 6, 6) << 4);
1236 
1237                 if (stack.store_would_trash (addr))
1238                     break;
1239 
1240                 /* Calculate offsets of saved registers.  */
1241                 for (; number > 0; number--)
1242                     {
1243                       addr = pv_add_constant (addr, -8);
1244                       stack.store (addr, 8, pv_register (ARM_D0_REGNUM
1245                                                                  + vd + number, 0));
1246                     }
1247 
1248                 /* Writeback SP to account for the saved registers.  */
1249                 regs[bits (insn, 0, 3)] = addr;
1250               }
1251 
1252             else if ((insn & 0xff50) == 0xe940    /* strd Rt, Rt2,
1253                                                                [Rn, #+/-imm]{!} */
1254                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1255               {
1256                 int regno1 = bits (inst2, 12, 15);
1257                 int regno2 = bits (inst2, 8, 11);
1258                 pv_t addr = regs[bits (insn, 0, 3)];
1259 
1260                 offset = inst2 & 0xff;
1261                 if (insn & 0x0080)
1262                     addr = pv_add_constant (addr, offset);
1263                 else
1264                     addr = pv_add_constant (addr, -offset);
1265 
1266                 if (stack.store_would_trash (addr))
1267                     break;
1268 
1269                 stack.store (addr, 4, regs[regno1]);
1270                 stack.store (pv_add_constant (addr, 4),
1271                                  4, regs[regno2]);
1272 
1273                 if (insn & 0x0020)
1274                     regs[bits (insn, 0, 3)] = addr;
1275               }
1276 
1277             else if ((insn & 0xfff0) == 0xf8c0    /* str Rt,[Rn,+/-#imm]{!} */
1278                        && (inst2 & 0x0c00) == 0x0c00
1279                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1280               {
1281                 int regno = bits (inst2, 12, 15);
1282                 pv_t addr = regs[bits (insn, 0, 3)];
1283 
1284                 offset = inst2 & 0xff;
1285                 if (inst2 & 0x0200)
1286                     addr = pv_add_constant (addr, offset);
1287                 else
1288                     addr = pv_add_constant (addr, -offset);
1289 
1290                 if (stack.store_would_trash (addr))
1291                     break;
1292 
1293                 stack.store (addr, 4, regs[regno]);
1294 
1295                 if (inst2 & 0x0100)
1296                     regs[bits (insn, 0, 3)] = addr;
1297               }
1298 
1299             else if ((insn & 0xfff0) == 0xf8c0    /* str.w Rt,[Rn,#imm] */
1300                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1301               {
1302                 int regno = bits (inst2, 12, 15);
1303                 pv_t addr;
1304 
1305                 offset = inst2 & 0xfff;
1306                 addr = pv_add_constant (regs[bits (insn, 0, 3)], offset);
1307 
1308                 if (stack.store_would_trash (addr))
1309                     break;
1310 
1311                 stack.store (addr, 4, regs[regno]);
1312               }
1313 
1314             else if ((insn & 0xffd0) == 0xf880    /* str{bh}.w Rt,[Rn,#imm] */
1315                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1316               /* Ignore stores of argument registers to the stack.  */
1317               ;
1318 
1319             else if ((insn & 0xffd0) == 0xf800    /* str{bh} Rt,[Rn,#+/-imm] */
1320                        && (inst2 & 0x0d00) == 0x0c00
1321                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1322               /* Ignore stores of argument registers to the stack.  */
1323               ;
1324 
1325             else if ((insn & 0xffd0) == 0xe890    /* ldmia Rn[!],
1326                                                                { registers } */
1327                        && (inst2 & 0x8000) == 0x0000
1328                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1329               /* Ignore block loads from the stack, potentially copying
1330                  parameters from memory.  */
1331               ;
1332 
1333             else if ((insn & 0xff70) == 0xe950    /* ldrd Rt, Rt2,
1334                                                                [Rn, #+/-imm] */
1335                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1336               /* Similarly ignore dual loads from the stack.  */
1337               ;
1338 
1339             else if ((insn & 0xfff0) == 0xf850    /* ldr Rt,[Rn,#+/-imm] */
1340                        && (inst2 & 0x0d00) == 0x0c00
1341                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1342               /* Similarly ignore single loads from the stack.  */
1343               ;
1344 
1345             else if ((insn & 0xfff0) == 0xf8d0    /* ldr.w Rt,[Rn,#imm] */
1346                        && pv_is_register (regs[bits (insn, 0, 3)], ARM_SP_REGNUM))
1347               /* Similarly ignore single loads from the stack.  */
1348               ;
1349 
1350             else if ((insn & 0xfbf0) == 0xf100    /* add.w Rd, Rn, #imm */
1351                        && (inst2 & 0x8000) == 0x0000)
1352               {
1353                 unsigned int imm = ((bits (insn, 10, 10) << 11)
1354                                           | (bits (inst2, 12, 14) << 8)
1355                                           | bits (inst2, 0, 7));
1356 
1357                 regs[bits (inst2, 8, 11)]
1358                     = pv_add_constant (regs[bits (insn, 0, 3)],
1359                                            thumb_expand_immediate (imm));
1360               }
1361 
1362             else if ((insn & 0xfbf0) == 0xf200    /* addw Rd, Rn, #imm */
1363                        && (inst2 & 0x8000) == 0x0000)
1364               {
1365                 unsigned int imm = ((bits (insn, 10, 10) << 11)
1366                                           | (bits (inst2, 12, 14) << 8)
1367                                           | bits (inst2, 0, 7));
1368 
1369                 regs[bits (inst2, 8, 11)]
1370                     = pv_add_constant (regs[bits (insn, 0, 3)], imm);
1371               }
1372 
1373             else if ((insn & 0xfbf0) == 0xf1a0    /* sub.w Rd, Rn, #imm */
1374                        && (inst2 & 0x8000) == 0x0000)
1375               {
1376                 unsigned int imm = ((bits (insn, 10, 10) << 11)
1377                                           | (bits (inst2, 12, 14) << 8)
1378                                           | bits (inst2, 0, 7));
1379 
1380                 regs[bits (inst2, 8, 11)]
1381                     = pv_add_constant (regs[bits (insn, 0, 3)],
1382                                            - (CORE_ADDR) thumb_expand_immediate (imm));
1383               }
1384 
1385             else if ((insn & 0xfbf0) == 0xf2a0    /* subw Rd, Rn, #imm */
1386                        && (inst2 & 0x8000) == 0x0000)
1387               {
1388                 unsigned int imm = ((bits (insn, 10, 10) << 11)
1389                                           | (bits (inst2, 12, 14) << 8)
1390                                           | bits (inst2, 0, 7));
1391 
1392                 regs[bits (inst2, 8, 11)]
1393                     = pv_add_constant (regs[bits (insn, 0, 3)], - (CORE_ADDR) imm);
1394               }
1395 
1396             else if ((insn & 0xfbff) == 0xf04f)   /* mov.w Rd, #const */
1397               {
1398                 unsigned int imm = ((bits (insn, 10, 10) << 11)
1399                                           | (bits (inst2, 12, 14) << 8)
1400                                           | bits (inst2, 0, 7));
1401 
1402                 regs[bits (inst2, 8, 11)]
1403                     = pv_constant (thumb_expand_immediate (imm));
1404               }
1405 
1406             else if ((insn & 0xfbf0) == 0xf240)   /* movw Rd, #const */
1407               {
1408                 unsigned int imm
1409                     = EXTRACT_MOVW_MOVT_IMM_T (insn, inst2);
1410 
1411                 regs[bits (inst2, 8, 11)] = pv_constant (imm);
1412               }
1413 
1414             else if (insn == 0xea5f               /* mov.w Rd,Rm */
1415                        && (inst2 & 0xf0f0) == 0)
1416               {
1417                 int dst_reg = (inst2 & 0x0f00) >> 8;
1418                 int src_reg = inst2 & 0xf;
1419                 regs[dst_reg] = regs[src_reg];
1420               }
1421 
1422             else if ((insn & 0xff7f) == 0xf85f)   /* ldr.w Rt,<label> */
1423               {
1424                 /* Constant pool loads.  */
1425                 unsigned int constant;
1426                 CORE_ADDR loc;
1427 
1428                 offset = bits (inst2, 0, 11);
1429                 if (insn & 0x0080)
1430                     loc = start + 4 + offset;
1431                 else
1432                     loc = start + 4 - offset;
1433 
1434                 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1435                 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1436               }
1437 
1438             else if ((insn & 0xff7f) == 0xe95f)   /* ldrd Rt,Rt2,<label> */
1439               {
1440                 /* Constant pool loads.  */
1441                 unsigned int constant;
1442                 CORE_ADDR loc;
1443 
1444                 offset = bits (inst2, 0, 7) << 2;
1445                 if (insn & 0x0080)
1446                     loc = start + 4 + offset;
1447                 else
1448                     loc = start + 4 - offset;
1449 
1450                 constant = read_memory_unsigned_integer (loc, 4, byte_order);
1451                 regs[bits (inst2, 12, 15)] = pv_constant (constant);
1452 
1453                 constant = read_memory_unsigned_integer (loc + 4, 4, byte_order);
1454                 regs[bits (inst2, 8, 11)] = pv_constant (constant);
1455               }
1456             /* Start of ARMv8.1-m PACBTI extension instructions.  */
1457             else if (IS_PAC (whole_insn))
1458               {
1459                 /* LR and SP are input registers.  PAC is in R12.  LR is
1460                      signed from this point onwards.  NOP space.  */
1461                 ra_signed_state = true;
1462               }
1463             else if (IS_PACBTI (whole_insn))
1464               {
1465                 /* LR and SP are input registers.  PAC is in R12 and PC is a
1466                      valid BTI landing pad.  LR is signed from this point onwards.
1467                      NOP space.  */
1468                 ra_signed_state = true;
1469               }
1470             else if (IS_BTI (whole_insn))
1471               {
1472                 /* Valid BTI landing pad.  NOP space.  */
1473               }
1474             else if (IS_PACG (whole_insn))
1475               {
1476                 /* Sign Rn using Rm and store the PAC in Rd.  Rd is signed from
1477                      this point onwards.  */
1478                 ra_signed_state = true;
1479               }
1480             else if (IS_AUT (whole_insn) || IS_AUTG (whole_insn))
1481               {
1482                 /* These instructions appear close to the epilogue, when signed
1483                      pointers are getting authenticated.  */
1484                 ra_signed_state = false;
1485               }
1486             /* End of ARMv8.1-m PACBTI extension instructions */
1487             else if (thumb2_instruction_changes_pc (insn, inst2))
1488               {
1489                 /* Don't scan past anything that might change control flow.  */
1490                 break;
1491               }
1492             else
1493               {
1494                 /* The optimizer might shove anything into the prologue,
1495                      so we just skip what we don't recognize.  */
1496                 unrecognized_pc = start;
1497               }
1498 
1499             /* Make sure we are dealing with a target that supports ARMv8.1-m
1500                PACBTI.  */
1501             if (cache != nullptr && tdep->have_pacbti
1502                 && ra_signed_state.has_value ())
1503               {
1504                 arm_debug_printf ("Found pacbti instruction at %s",
1505                                         paddress (gdbarch, start));
1506                 arm_debug_printf ("RA is %s",
1507                                         *ra_signed_state ? "signed" : "not signed");
1508                 cache->ra_signed_state = ra_signed_state;
1509               }
1510 
1511             start += 2;
1512           }
1513       else if (thumb_instruction_changes_pc (insn))
1514           {
1515             /* Don't scan past anything that might change control flow.  */
1516             break;
1517           }
1518       else
1519           {
1520             /* The optimizer might shove anything into the prologue,
1521                so we just skip what we don't recognize.  */
1522             unrecognized_pc = start;
1523           }
1524 
1525       start += 2;
1526     }
1527 
1528   arm_debug_printf ("Prologue scan stopped at %s",
1529                         paddress (gdbarch, start));
1530 
1531   if (unrecognized_pc == 0)
1532     unrecognized_pc = start;
1533 
1534   if (cache == NULL)
1535     return unrecognized_pc;
1536 
1537   if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
1538     {
1539       /* Frame pointer is fp.  Frame size is constant.  */
1540       cache->framereg = ARM_FP_REGNUM;
1541       cache->framesize = -regs[ARM_FP_REGNUM].k;
1542     }
1543   else if (pv_is_register (regs[THUMB_FP_REGNUM], ARM_SP_REGNUM))
1544     {
1545       /* Frame pointer is r7.  Frame size is constant.  */
1546       cache->framereg = THUMB_FP_REGNUM;
1547       cache->framesize = -regs[THUMB_FP_REGNUM].k;
1548     }
1549   else
1550     {
1551       /* Try the stack pointer... this is a bit desperate.  */
1552       cache->framereg = ARM_SP_REGNUM;
1553       cache->framesize = -regs[ARM_SP_REGNUM].k;
1554     }
1555 
1556   for (i = 0; i < gdbarch_num_regs (gdbarch); i++)
1557     if (stack.find_reg (gdbarch, i, &offset))
1558       {
1559           cache->saved_regs[i].set_addr (offset);
1560           if (i == ARM_SP_REGNUM)
1561             arm_cache_set_active_sp_value(cache, tdep, offset);
1562       }
1563 
1564   return unrecognized_pc;
1565 }
1566 
1567 
1568 /* Try to analyze the instructions starting from PC, which load symbol
1569    __stack_chk_guard.  Return the address of instruction after loading this
1570    symbol, set the dest register number to *BASEREG, and set the size of
1571    instructions for loading symbol in OFFSET.  Return 0 if instructions are
1572    not recognized.  */
1573 
1574 static CORE_ADDR
arm_analyze_load_stack_chk_guard(CORE_ADDR pc,struct gdbarch * gdbarch,unsigned int * destreg,int * offset)1575 arm_analyze_load_stack_chk_guard(CORE_ADDR pc, struct gdbarch *gdbarch,
1576                                          unsigned int *destreg, int *offset)
1577 {
1578   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1579   int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1580   unsigned int low, high, address;
1581 
1582   address = 0;
1583   if (is_thumb)
1584     {
1585       unsigned short insn1
1586           = read_code_unsigned_integer (pc, 2, byte_order_for_code);
1587 
1588       if ((insn1 & 0xf800) == 0x4800) /* ldr Rd, #immed */
1589           {
1590             *destreg = bits (insn1, 8, 10);
1591             *offset = 2;
1592             address = (pc & 0xfffffffc) + 4 + (bits (insn1, 0, 7) << 2);
1593             address = read_memory_unsigned_integer (address, 4,
1594                                                               byte_order_for_code);
1595           }
1596       else if ((insn1 & 0xfbf0) == 0xf240) /* movw Rd, #const */
1597           {
1598             unsigned short insn2
1599               = read_code_unsigned_integer (pc + 2, 2, byte_order_for_code);
1600 
1601             low = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1602 
1603             insn1
1604               = read_code_unsigned_integer (pc + 4, 2, byte_order_for_code);
1605             insn2
1606               = read_code_unsigned_integer (pc + 6, 2, byte_order_for_code);
1607 
1608             /* movt Rd, #const */
1609             if ((insn1 & 0xfbc0) == 0xf2c0)
1610               {
1611                 high = EXTRACT_MOVW_MOVT_IMM_T (insn1, insn2);
1612                 *destreg = bits (insn2, 8, 11);
1613                 *offset = 8;
1614                 address = (high << 16 | low);
1615               }
1616           }
1617     }
1618   else
1619     {
1620       unsigned int insn
1621           = read_code_unsigned_integer (pc, 4, byte_order_for_code);
1622 
1623       if ((insn & 0x0e5f0000) == 0x041f0000) /* ldr Rd, [PC, #immed] */
1624           {
1625             address = bits (insn, 0, 11) + pc + 8;
1626             address = read_memory_unsigned_integer (address, 4,
1627                                                               byte_order_for_code);
1628 
1629             *destreg = bits (insn, 12, 15);
1630             *offset = 4;
1631           }
1632       else if ((insn & 0x0ff00000) == 0x03000000) /* movw Rd, #const */
1633           {
1634             low = EXTRACT_MOVW_MOVT_IMM_A (insn);
1635 
1636             insn
1637               = read_code_unsigned_integer (pc + 4, 4, byte_order_for_code);
1638 
1639             if ((insn & 0x0ff00000) == 0x03400000) /* movt Rd, #const */
1640               {
1641                 high = EXTRACT_MOVW_MOVT_IMM_A (insn);
1642                 *destreg = bits (insn, 12, 15);
1643                 *offset = 8;
1644                 address = (high << 16 | low);
1645               }
1646           }
1647     }
1648 
1649   return address;
1650 }
1651 
1652 /* Try to skip a sequence of instructions used for stack protector.  If PC
1653    points to the first instruction of this sequence, return the address of
1654    first instruction after this sequence, otherwise, return original PC.
1655 
1656    On arm, this sequence of instructions is composed of mainly three steps,
1657      Step 1: load symbol __stack_chk_guard,
1658      Step 2: load from address of __stack_chk_guard,
1659      Step 3: store it to somewhere else.
1660 
1661    Usually, instructions on step 2 and step 3 are the same on various ARM
1662    architectures.  On step 2, it is one instruction 'ldr Rx, [Rn, #0]', and
1663    on step 3, it is also one instruction 'str Rx, [r7, #immd]'.  However,
1664    instructions in step 1 vary from different ARM architectures.  On ARMv7,
1665    they are,
1666 
1667           movw      Rn, #:lower16:__stack_chk_guard
1668           movt      Rn, #:upper16:__stack_chk_guard
1669 
1670    On ARMv5t, it is,
1671 
1672           ldr       Rn, .Label
1673           ....
1674           .Lable:
1675           .word     __stack_chk_guard
1676 
1677    Since ldr/str is a very popular instruction, we can't use them as
1678    'fingerprint' or 'signature' of stack protector sequence.  Here we choose
1679    sequence {movw/movt, ldr}/ldr/str plus symbol __stack_chk_guard, if not
1680    stripped, as the 'fingerprint' of a stack protector cdoe sequence.  */
1681 
1682 static CORE_ADDR
arm_skip_stack_protector(CORE_ADDR pc,struct gdbarch * gdbarch)1683 arm_skip_stack_protector(CORE_ADDR pc, struct gdbarch *gdbarch)
1684 {
1685   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1686   unsigned int basereg;
1687   struct bound_minimal_symbol stack_chk_guard;
1688   int offset;
1689   int is_thumb = arm_pc_is_thumb (gdbarch, pc);
1690   CORE_ADDR addr;
1691 
1692   /* Try to parse the instructions in Step 1.  */
1693   addr = arm_analyze_load_stack_chk_guard (pc, gdbarch,
1694                                                      &basereg, &offset);
1695   if (!addr)
1696     return pc;
1697 
1698   stack_chk_guard = lookup_minimal_symbol_by_pc (addr);
1699   /* ADDR must correspond to a symbol whose name is __stack_chk_guard.
1700      Otherwise, this sequence cannot be for stack protector.  */
1701   if (stack_chk_guard.minsym == NULL
1702       || !startswith (stack_chk_guard.minsym->linkage_name (), "__stack_chk_guard"))
1703    return pc;
1704 
1705   if (is_thumb)
1706     {
1707       unsigned int destreg;
1708       unsigned short insn
1709           = read_code_unsigned_integer (pc + offset, 2, byte_order_for_code);
1710 
1711       /* Step 2: ldr Rd, [Rn, #immed], encoding T1.  */
1712       if ((insn & 0xf800) != 0x6800)
1713           return pc;
1714       if (bits (insn, 3, 5) != basereg)
1715           return pc;
1716       destreg = bits (insn, 0, 2);
1717 
1718       insn = read_code_unsigned_integer (pc + offset + 2, 2,
1719                                                    byte_order_for_code);
1720       /* Step 3: str Rd, [Rn, #immed], encoding T1.  */
1721       if ((insn & 0xf800) != 0x6000)
1722           return pc;
1723       if (destreg != bits (insn, 0, 2))
1724           return pc;
1725     }
1726   else
1727     {
1728       unsigned int destreg;
1729       unsigned int insn
1730           = read_code_unsigned_integer (pc + offset, 4, byte_order_for_code);
1731 
1732       /* Step 2: ldr Rd, [Rn, #immed], encoding A1.  */
1733       if ((insn & 0x0e500000) != 0x04100000)
1734           return pc;
1735       if (bits (insn, 16, 19) != basereg)
1736           return pc;
1737       destreg = bits (insn, 12, 15);
1738       /* Step 3: str Rd, [Rn, #immed], encoding A1.  */
1739       insn = read_code_unsigned_integer (pc + offset + 4,
1740                                                      4, byte_order_for_code);
1741       if ((insn & 0x0e500000) != 0x04000000)
1742           return pc;
1743       if (bits (insn, 12, 15) != destreg)
1744           return pc;
1745     }
1746   /* The size of total two instructions ldr/str is 4 on Thumb-2, while 8
1747      on arm.  */
1748   if (is_thumb)
1749     return pc + offset + 4;
1750   else
1751     return pc + offset + 8;
1752 }
1753 
1754 /* Advance the PC across any function entry prologue instructions to
1755    reach some "real" code.
1756 
1757    The APCS (ARM Procedure Call Standard) defines the following
1758    prologue:
1759 
1760    mov          ip, sp
1761    [stmfd       sp!, {a1,a2,a3,a4}]
1762    stmfd        sp!, {...,fp,ip,lr,pc}
1763    [stfe        f7, [sp, #-12]!]
1764    [stfe        f6, [sp, #-12]!]
1765    [stfe        f5, [sp, #-12]!]
1766    [stfe        f4, [sp, #-12]!]
1767    sub fp, ip, #nn @@ nn == 20 or 4 depending on second insn.  */
1768 
1769 static CORE_ADDR
arm_skip_prologue(struct gdbarch * gdbarch,CORE_ADDR pc)1770 arm_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
1771 {
1772   CORE_ADDR func_addr, func_end_addr, limit_pc;
1773 
1774   /* See if we can determine the end of the prologue via the symbol table.
1775      If so, then return either PC, or the PC after the prologue, whichever
1776      is greater.  */
1777   bool func_addr_found
1778     = find_pc_partial_function (pc, NULL, &func_addr, &func_end_addr);
1779 
1780   /* Whether the function is thumb mode or not.  */
1781   bool func_is_thumb = false;
1782 
1783   if (func_addr_found)
1784     {
1785       CORE_ADDR post_prologue_pc
1786           = skip_prologue_using_sal (gdbarch, func_addr);
1787       struct compunit_symtab *cust = find_pc_compunit_symtab (func_addr);
1788 
1789       if (post_prologue_pc)
1790           post_prologue_pc
1791             = arm_skip_stack_protector (post_prologue_pc, gdbarch);
1792 
1793 
1794       /* GCC always emits a line note before the prologue and another
1795            one after, even if the two are at the same address or on the
1796            same line.  Take advantage of this so that we do not need to
1797            know every instruction that might appear in the prologue.  We
1798            will have producer information for most binaries; if it is
1799            missing (e.g. for -gstabs), assuming the GNU tools.  */
1800       if (post_prologue_pc
1801             && (cust == NULL
1802                 || cust->producer () == NULL
1803                 || startswith (cust->producer (), "GNU ")
1804                 || producer_is_llvm (cust->producer ())))
1805           return post_prologue_pc;
1806 
1807       if (post_prologue_pc != 0)
1808           {
1809             CORE_ADDR analyzed_limit;
1810 
1811             /* For non-GCC compilers, make sure the entire line is an
1812                acceptable prologue; GDB will round this function's
1813                return value up to the end of the following line so we
1814                can not skip just part of a line (and we do not want to).
1815 
1816                RealView does not treat the prologue specially, but does
1817                associate prologue code with the opening brace; so this
1818                lets us skip the first line if we think it is the opening
1819                brace.  */
1820             func_is_thumb = arm_pc_is_thumb (gdbarch, func_addr);
1821             if (func_is_thumb)
1822               analyzed_limit = thumb_analyze_prologue (gdbarch, func_addr,
1823                                                                  post_prologue_pc, NULL);
1824             else
1825               analyzed_limit
1826                 = arm_analyze_prologue (gdbarch, func_addr, post_prologue_pc,
1827                                               NULL, target_arm_instruction_reader ());
1828 
1829             if (analyzed_limit != post_prologue_pc)
1830               return func_addr;
1831 
1832             return post_prologue_pc;
1833           }
1834     }
1835 
1836   /* Can't determine prologue from the symbol table, need to examine
1837      instructions.  */
1838 
1839   /* Find an upper limit on the function prologue using the debug
1840      information.  If the debug information could not be used to provide
1841      that bound, then use an arbitrary large number as the upper bound.  */
1842   /* Like arm_scan_prologue, stop no later than pc + 64.  */
1843   limit_pc = skip_prologue_using_sal (gdbarch, pc);
1844   if (limit_pc == 0)
1845     limit_pc = pc + 64;          /* Magic.  */
1846 
1847   /* Set the correct adjustment based on whether the function is thumb mode or
1848      not.  We use it to get the address of the last instruction in the
1849      function (as opposed to the first address of the next function).  */
1850   CORE_ADDR adjustment = func_is_thumb ? 2 : 4;
1851 
1852   limit_pc
1853     = func_end_addr == 0 ? limit_pc : std::min (limit_pc,
1854                                                             func_end_addr - adjustment);
1855 
1856   /* Check if this is Thumb code.  */
1857   if (arm_pc_is_thumb (gdbarch, pc))
1858     return thumb_analyze_prologue (gdbarch, pc, limit_pc, NULL);
1859   else
1860     return arm_analyze_prologue (gdbarch, pc, limit_pc, NULL,
1861                                          target_arm_instruction_reader ());
1862 }
1863 
1864 /* Function: thumb_scan_prologue (helper function for arm_scan_prologue)
1865    This function decodes a Thumb function prologue to determine:
1866      1) the size of the stack frame
1867      2) which registers are saved on it
1868      3) the offsets of saved regs
1869      4) the offset from the stack pointer to the frame pointer
1870 
1871    A typical Thumb function prologue would create this stack frame
1872    (offsets relative to FP)
1873      old SP ->      24  stack parameters
1874                     20  LR
1875                     16  R7
1876      R7 ->       0  local variables (16 bytes)
1877      SP ->     -12  additional stack space (12 bytes)
1878    The frame size would thus be 36 bytes, and the frame offset would be
1879    12 bytes.  The frame register is R7.
1880 
1881    The comments for thumb_skip_prolog() describe the algorithm we use
1882    to detect the end of the prolog.  */
1883 
1884 static void
thumb_scan_prologue(struct gdbarch * gdbarch,CORE_ADDR prev_pc,CORE_ADDR block_addr,struct arm_prologue_cache * cache)1885 thumb_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR prev_pc,
1886                          CORE_ADDR block_addr, struct arm_prologue_cache *cache)
1887 {
1888   CORE_ADDR prologue_start;
1889   CORE_ADDR prologue_end;
1890 
1891   if (find_pc_partial_function (block_addr, NULL, &prologue_start,
1892                                         &prologue_end))
1893     {
1894       /* See comment in arm_scan_prologue for an explanation of
1895            this heuristics.  */
1896       if (prologue_end > prologue_start + 64)
1897           {
1898             prologue_end = prologue_start + 64;
1899           }
1900     }
1901   else
1902     /* We're in the boondocks: we have no idea where the start of the
1903        function is.  */
1904     return;
1905 
1906   prologue_end = std::min (prologue_end, prev_pc);
1907 
1908   thumb_analyze_prologue (gdbarch, prologue_start, prologue_end, cache);
1909 }
1910 
1911 /* Return 1 if the ARM instruction INSN restores SP in epilogue, 0
1912    otherwise.  */
1913 
1914 static int
arm_instruction_restores_sp(unsigned int insn)1915 arm_instruction_restores_sp (unsigned int insn)
1916 {
1917   if (bits (insn, 28, 31) != INST_NV)
1918     {
1919       if ((insn & 0x0df0f000) == 0x0080d000
1920             /* ADD SP (register or immediate).  */
1921             || (insn & 0x0df0f000) == 0x0040d000
1922             /* SUB SP (register or immediate).  */
1923             || (insn & 0x0ffffff0) == 0x01a0d000
1924             /* MOV SP.  */
1925             || (insn & 0x0fff0000) == 0x08bd0000
1926             /* POP (LDMIA).  */
1927             || (insn & 0x0fff0000) == 0x049d0000)
1928             /* POP of a single register.  */
1929           return 1;
1930     }
1931 
1932   return 0;
1933 }
1934 
1935 /* Implement immediate value decoding, as described in section A5.2.4
1936    (Modified immediate constants in ARM instructions) of the ARM Architecture
1937    Reference Manual (ARMv7-A and ARMv7-R edition).  */
1938 
1939 static uint32_t
arm_expand_immediate(uint32_t imm)1940 arm_expand_immediate (uint32_t imm)
1941 {
1942   /* Immediate values are 12 bits long.  */
1943   gdb_assert ((imm & 0xfffff000) == 0);
1944 
1945   uint32_t unrotated_value = imm & 0xff;
1946   uint32_t rotate_amount = (imm & 0xf00) >> 7;
1947 
1948   if (rotate_amount == 0)
1949     return unrotated_value;
1950 
1951   return ((unrotated_value >> rotate_amount)
1952             | (unrotated_value << (32 - rotate_amount)));
1953 }
1954 
1955 /* Analyze an ARM mode prologue starting at PROLOGUE_START and
1956    continuing no further than PROLOGUE_END.  If CACHE is non-NULL,
1957    fill it in.  Return the first address not recognized as a prologue
1958    instruction.
1959 
1960    We recognize all the instructions typically found in ARM prologues,
1961    plus harmless instructions which can be skipped (either for analysis
1962    purposes, or a more restrictive set that can be skipped when finding
1963    the end of the prologue).  */
1964 
1965 static CORE_ADDR
arm_analyze_prologue(struct gdbarch * gdbarch,CORE_ADDR prologue_start,CORE_ADDR prologue_end,struct arm_prologue_cache * cache,const arm_instruction_reader & insn_reader)1966 arm_analyze_prologue (struct gdbarch *gdbarch,
1967                           CORE_ADDR prologue_start, CORE_ADDR prologue_end,
1968                           struct arm_prologue_cache *cache,
1969                           const arm_instruction_reader &insn_reader)
1970 {
1971   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
1972   int regno;
1973   CORE_ADDR offset, current_pc;
1974   pv_t regs[ARM_FPS_REGNUM];
1975   CORE_ADDR unrecognized_pc = 0;
1976   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
1977 
1978   /* Search the prologue looking for instructions that set up the
1979      frame pointer, adjust the stack pointer, and save registers.
1980 
1981      Be careful, however, and if it doesn't look like a prologue,
1982      don't try to scan it.  If, for instance, a frameless function
1983      begins with stmfd sp!, then we will tell ourselves there is
1984      a frame, which will confuse stack traceback, as well as "finish"
1985      and other operations that rely on a knowledge of the stack
1986      traceback.  */
1987 
1988   for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
1989     regs[regno] = pv_register (regno, 0);
1990   pv_area stack (ARM_SP_REGNUM, gdbarch_addr_bit (gdbarch));
1991 
1992   for (current_pc = prologue_start;
1993        current_pc < prologue_end;
1994        current_pc += 4)
1995     {
1996       uint32_t insn = insn_reader.read (current_pc, byte_order_for_code);
1997 
1998       if (insn == 0xe1a0c00d)           /* mov ip, sp */
1999           {
2000             regs[ARM_IP_REGNUM] = regs[ARM_SP_REGNUM];
2001             continue;
2002           }
2003       else if ((insn & 0xfff00000) == 0xe2800000  /* add Rd, Rn, #n */
2004                  && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2005           {
2006             uint32_t imm = arm_expand_immediate (insn & 0xfff);
2007             int rd = bits (insn, 12, 15);
2008             regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], imm);
2009             continue;
2010           }
2011       else if ((insn & 0xfff00000) == 0xe2400000  /* sub Rd, Rn, #n */
2012                  && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2013           {
2014             uint32_t imm = arm_expand_immediate (insn & 0xfff);
2015             int rd = bits (insn, 12, 15);
2016             regs[rd] = pv_add_constant (regs[bits (insn, 16, 19)], -imm);
2017             continue;
2018           }
2019       else if ((insn & 0xffff0fff) == 0xe52d0004) /* str Rd,
2020                                                                          [sp, #-4]! */
2021           {
2022             if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2023               break;
2024             regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2025             stack.store (regs[ARM_SP_REGNUM], 4,
2026                            regs[bits (insn, 12, 15)]);
2027             continue;
2028           }
2029       else if ((insn & 0xffff0000) == 0xe92d0000)
2030           /* stmfd sp!, {..., fp, ip, lr, pc}
2031              or
2032              stmfd sp!, {a1, a2, a3, a4}  */
2033           {
2034             int mask = insn & 0xffff;
2035 
2036             if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2037               break;
2038 
2039             /* Calculate offsets of saved registers.  */
2040             for (regno = ARM_PC_REGNUM; regno >= 0; regno--)
2041               if (mask & (1 << regno))
2042                 {
2043                     regs[ARM_SP_REGNUM]
2044                       = pv_add_constant (regs[ARM_SP_REGNUM], -4);
2045                     stack.store (regs[ARM_SP_REGNUM], 4, regs[regno]);
2046                 }
2047           }
2048       else if ((insn & 0xffff0000) == 0xe54b0000  /* strb rx,[r11,#-n] */
2049                  || (insn & 0xffff00f0) == 0xe14b00b0       /* strh rx,[r11,#-n] */
2050                  || (insn & 0xffffc000) == 0xe50b0000)      /* str  rx,[r11,#-n] */
2051           {
2052             /* No need to add this to saved_regs -- it's just an arg reg.  */
2053             continue;
2054           }
2055       else if ((insn & 0xffff0000) == 0xe5cd0000  /* strb rx,[sp,#n] */
2056                  || (insn & 0xffff00f0) == 0xe1cd00b0       /* strh rx,[sp,#n] */
2057                  || (insn & 0xffffc000) == 0xe58d0000)      /* str  rx,[sp,#n] */
2058           {
2059             /* No need to add this to saved_regs -- it's just an arg reg.  */
2060             continue;
2061           }
2062       else if ((insn & 0xfff00000) == 0xe8800000  /* stm Rn,
2063                                                                          { registers } */
2064                  && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2065           {
2066             /* No need to add this to saved_regs -- it's just arg regs.  */
2067             continue;
2068           }
2069       else if ((insn & 0xfffff000) == 0xe24cb000) /* sub fp, ip #n */
2070           {
2071             uint32_t imm = arm_expand_immediate (insn & 0xfff);
2072             regs[ARM_FP_REGNUM] = pv_add_constant (regs[ARM_IP_REGNUM], -imm);
2073           }
2074       else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
2075           {
2076             uint32_t imm = arm_expand_immediate(insn & 0xfff);
2077             regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -imm);
2078           }
2079       else if ((insn & 0xffff7fff) == 0xed6d0103  /* stfe f?,
2080                                                                          [sp, -#c]! */
2081                  && tdep->have_fpa_registers)
2082           {
2083             if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2084               break;
2085 
2086             regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2087             regno = ARM_F0_REGNUM + ((insn >> 12) & 0x07);
2088             stack.store (regs[ARM_SP_REGNUM], 12, regs[regno]);
2089           }
2090       else if ((insn & 0xffbf0fff) == 0xec2d0200  /* sfmfd f0, 4,
2091                                                                          [sp!] */
2092                  && tdep->have_fpa_registers)
2093           {
2094             int n_saved_fp_regs;
2095             unsigned int fp_start_reg, fp_bound_reg;
2096 
2097             if (stack.store_would_trash (regs[ARM_SP_REGNUM]))
2098               break;
2099 
2100             if ((insn & 0x800) == 0x800)                    /* N0 is set */
2101               {
2102                 if ((insn & 0x40000) == 0x40000)  /* N1 is set */
2103                     n_saved_fp_regs = 3;
2104                 else
2105                     n_saved_fp_regs = 1;
2106               }
2107             else
2108               {
2109                 if ((insn & 0x40000) == 0x40000)  /* N1 is set */
2110                     n_saved_fp_regs = 2;
2111                 else
2112                     n_saved_fp_regs = 4;
2113               }
2114 
2115             fp_start_reg = ARM_F0_REGNUM + ((insn >> 12) & 0x7);
2116             fp_bound_reg = fp_start_reg + n_saved_fp_regs;
2117             for (; fp_start_reg < fp_bound_reg; fp_start_reg++)
2118               {
2119                 regs[ARM_SP_REGNUM] = pv_add_constant (regs[ARM_SP_REGNUM], -12);
2120                 stack.store (regs[ARM_SP_REGNUM], 12,
2121                                  regs[fp_start_reg++]);
2122               }
2123           }
2124       else if ((insn & 0xff000000) == 0xeb000000 && cache == NULL) /* bl */
2125           {
2126             /* Allow some special function calls when skipping the
2127                prologue; GCC generates these before storing arguments to
2128                the stack.  */
2129             CORE_ADDR dest = BranchDest (current_pc, insn);
2130 
2131             if (skip_prologue_function (gdbarch, dest, 0))
2132               continue;
2133             else
2134               break;
2135           }
2136       else if ((insn & 0xf0000000) != 0xe0000000)
2137           break;                        /* Condition not true, exit early.  */
2138       else if (arm_instruction_changes_pc (insn))
2139           /* Don't scan past anything that might change control flow.  */
2140           break;
2141       else if (arm_instruction_restores_sp (insn))
2142           {
2143             /* Don't scan past the epilogue.  */
2144             break;
2145           }
2146       else if ((insn & 0xfe500000) == 0xe8100000  /* ldm */
2147                  && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2148           /* Ignore block loads from the stack, potentially copying
2149              parameters from memory.  */
2150           continue;
2151       else if ((insn & 0xfc500000) == 0xe4100000
2152                  && pv_is_register (regs[bits (insn, 16, 19)], ARM_SP_REGNUM))
2153           /* Similarly ignore single loads from the stack.  */
2154           continue;
2155       else if ((insn & 0xffff0ff0) == 0xe1a00000)
2156           /* MOV Rd, Rm.  Skip register copies, i.e. saves to another
2157              register instead of the stack.  */
2158           continue;
2159       else
2160           {
2161             /* The optimizer might shove anything into the prologue, if
2162                we build up cache (cache != NULL) from scanning prologue,
2163                we just skip what we don't recognize and scan further to
2164                make cache as complete as possible.  However, if we skip
2165                prologue, we'll stop immediately on unrecognized
2166                instruction.  */
2167             unrecognized_pc = current_pc;
2168             if (cache != NULL)
2169               continue;
2170             else
2171               break;
2172           }
2173     }
2174 
2175   if (unrecognized_pc == 0)
2176     unrecognized_pc = current_pc;
2177 
2178   if (cache)
2179     {
2180       int framereg, framesize;
2181 
2182       /* The frame size is just the distance from the frame register
2183            to the original stack pointer.  */
2184       if (pv_is_register (regs[ARM_FP_REGNUM], ARM_SP_REGNUM))
2185           {
2186             /* Frame pointer is fp.  */
2187             framereg = ARM_FP_REGNUM;
2188             framesize = -regs[ARM_FP_REGNUM].k;
2189           }
2190       else
2191           {
2192             /* Try the stack pointer... this is a bit desperate.  */
2193             framereg = ARM_SP_REGNUM;
2194             framesize = -regs[ARM_SP_REGNUM].k;
2195           }
2196 
2197       cache->framereg = framereg;
2198       cache->framesize = framesize;
2199 
2200       for (regno = 0; regno < ARM_FPS_REGNUM; regno++)
2201           if (stack.find_reg (gdbarch, regno, &offset))
2202             {
2203               cache->saved_regs[regno].set_addr (offset);
2204               if (regno == ARM_SP_REGNUM)
2205                 arm_cache_set_active_sp_value(cache, tdep, offset);
2206             }
2207     }
2208 
2209   arm_debug_printf ("Prologue scan stopped at %s",
2210                         paddress (gdbarch, unrecognized_pc));
2211 
2212   return unrecognized_pc;
2213 }
2214 
2215 static void
arm_scan_prologue(const frame_info_ptr & this_frame,struct arm_prologue_cache * cache)2216 arm_scan_prologue (const frame_info_ptr &this_frame,
2217                        struct arm_prologue_cache *cache)
2218 {
2219   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2220   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
2221   CORE_ADDR prologue_start, prologue_end;
2222   CORE_ADDR prev_pc = get_frame_pc (this_frame);
2223   CORE_ADDR block_addr = get_frame_address_in_block (this_frame);
2224   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2225 
2226   /* Assume there is no frame until proven otherwise.  */
2227   cache->framereg = ARM_SP_REGNUM;
2228   cache->framesize = 0;
2229 
2230   /* Check for Thumb prologue.  */
2231   if (arm_frame_is_thumb (this_frame))
2232     {
2233       thumb_scan_prologue (gdbarch, prev_pc, block_addr, cache);
2234       return;
2235     }
2236 
2237   /* Find the function prologue.  If we can't find the function in
2238      the symbol table, peek in the stack frame to find the PC.  */
2239   if (find_pc_partial_function (block_addr, NULL, &prologue_start,
2240                                         &prologue_end))
2241     {
2242       /* One way to find the end of the prologue (which works well
2243            for unoptimized code) is to do the following:
2244 
2245               struct symtab_and_line sal = find_pc_line (prologue_start, 0);
2246 
2247               if (sal.line == 0)
2248                 prologue_end = prev_pc;
2249               else if (sal.end < prologue_end)
2250                 prologue_end = sal.end;
2251 
2252            This mechanism is very accurate so long as the optimizer
2253            doesn't move any instructions from the function body into the
2254            prologue.  If this happens, sal.end will be the last
2255            instruction in the first hunk of prologue code just before
2256            the first instruction that the scheduler has moved from
2257            the body to the prologue.
2258 
2259            In order to make sure that we scan all of the prologue
2260            instructions, we use a slightly less accurate mechanism which
2261            may scan more than necessary.  To help compensate for this
2262            lack of accuracy, the prologue scanning loop below contains
2263            several clauses which'll cause the loop to terminate early if
2264            an implausible prologue instruction is encountered.
2265 
2266            The expression
2267 
2268                 prologue_start + 64
2269 
2270            is a suitable endpoint since it accounts for the largest
2271            possible prologue plus up to five instructions inserted by
2272            the scheduler.  */
2273 
2274       if (prologue_end > prologue_start + 64)
2275           {
2276             prologue_end = prologue_start + 64;   /* See above.  */
2277           }
2278     }
2279   else
2280     {
2281       /* We have no symbol information.  Our only option is to assume this
2282            function has a standard stack frame and the normal frame register.
2283            Then, we can find the value of our frame pointer on entrance to
2284            the callee (or at the present moment if this is the innermost frame).
2285            The value stored there should be the address of the stmfd + 8.  */
2286       CORE_ADDR frame_loc;
2287       ULONGEST return_value;
2288 
2289       /* AAPCS does not use a frame register, so we can abort here.  */
2290       if (tdep->arm_abi == ARM_ABI_AAPCS)
2291           return;
2292 
2293       frame_loc = get_frame_register_unsigned (this_frame, ARM_FP_REGNUM);
2294       if (!safe_read_memory_unsigned_integer (frame_loc, 4, byte_order,
2295                                                         &return_value))
2296           return;
2297       else
2298           {
2299             prologue_start = gdbarch_addr_bits_remove
2300                                    (gdbarch, return_value) - 8;
2301             prologue_end = prologue_start + 64;   /* See above.  */
2302           }
2303     }
2304 
2305   if (prev_pc < prologue_end)
2306     prologue_end = prev_pc;
2307 
2308   arm_analyze_prologue (gdbarch, prologue_start, prologue_end, cache,
2309                               target_arm_instruction_reader ());
2310 }
2311 
2312 static struct arm_prologue_cache *
arm_make_prologue_cache(const frame_info_ptr & this_frame)2313 arm_make_prologue_cache (const frame_info_ptr &this_frame)
2314 {
2315   int reg;
2316   struct arm_prologue_cache *cache;
2317   CORE_ADDR unwound_fp, prev_sp;
2318 
2319   cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2320   arm_cache_init (cache, this_frame);
2321 
2322   arm_scan_prologue (this_frame, cache);
2323 
2324   unwound_fp = get_frame_register_unsigned (this_frame, cache->framereg);
2325   if (unwound_fp == 0)
2326     return cache;
2327 
2328   arm_gdbarch_tdep *tdep =
2329     gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2330 
2331   prev_sp = unwound_fp + cache->framesize;
2332   arm_cache_set_active_sp_value (cache, tdep, prev_sp);
2333 
2334   /* Calculate actual addresses of saved registers using offsets
2335      determined by arm_scan_prologue.  */
2336   for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
2337     if (cache->saved_regs[reg].is_addr ())
2338       cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr () +
2339                                                prev_sp);
2340 
2341   return cache;
2342 }
2343 
2344 /* Implementation of the stop_reason hook for arm_prologue frames.  */
2345 
2346 static enum unwind_stop_reason
arm_prologue_unwind_stop_reason(const frame_info_ptr & this_frame,void ** this_cache)2347 arm_prologue_unwind_stop_reason (const frame_info_ptr &this_frame,
2348                                          void **this_cache)
2349 {
2350   struct arm_prologue_cache *cache;
2351   CORE_ADDR pc;
2352 
2353   if (*this_cache == NULL)
2354     *this_cache = arm_make_prologue_cache (this_frame);
2355   cache = (struct arm_prologue_cache *) *this_cache;
2356 
2357   /* This is meant to halt the backtrace at "_start".  */
2358   pc = get_frame_pc (this_frame);
2359   gdbarch *arch = get_frame_arch (this_frame);
2360   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
2361   if (pc <= tdep->lowest_pc)
2362     return UNWIND_OUTERMOST;
2363 
2364   /* If we've hit a wall, stop.  */
2365   if (arm_cache_get_prev_sp_value (cache, tdep) == 0)
2366     return UNWIND_OUTERMOST;
2367 
2368   return UNWIND_NO_REASON;
2369 }
2370 
2371 /* Our frame ID for a normal frame is the current function's starting PC
2372    and the caller's SP when we were called.  */
2373 
2374 static void
arm_prologue_this_id(const frame_info_ptr & this_frame,void ** this_cache,struct frame_id * this_id)2375 arm_prologue_this_id (const frame_info_ptr &this_frame,
2376                           void **this_cache,
2377                           struct frame_id *this_id)
2378 {
2379   struct arm_prologue_cache *cache;
2380   struct frame_id id;
2381   CORE_ADDR pc, func;
2382 
2383   if (*this_cache == NULL)
2384     *this_cache = arm_make_prologue_cache (this_frame);
2385   cache = (struct arm_prologue_cache *) *this_cache;
2386 
2387   arm_gdbarch_tdep *tdep
2388     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
2389 
2390   /* Use function start address as part of the frame ID.  If we cannot
2391      identify the start address (due to missing symbol information),
2392      fall back to just using the current PC.  */
2393   pc = get_frame_pc (this_frame);
2394   func = get_frame_func (this_frame);
2395   if (!func)
2396     func = pc;
2397 
2398   id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func);
2399   *this_id = id;
2400 }
2401 
2402 static struct value *
arm_prologue_prev_register(const frame_info_ptr & this_frame,void ** this_cache,int prev_regnum)2403 arm_prologue_prev_register (const frame_info_ptr &this_frame,
2404                                   void **this_cache,
2405                                   int prev_regnum)
2406 {
2407   struct gdbarch *gdbarch = get_frame_arch (this_frame);
2408   struct arm_prologue_cache *cache;
2409   CORE_ADDR sp_value;
2410 
2411   if (*this_cache == NULL)
2412     *this_cache = arm_make_prologue_cache (this_frame);
2413   cache = (struct arm_prologue_cache *) *this_cache;
2414 
2415   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
2416 
2417   /* If this frame has signed the return address, mark it as so.  */
2418   if (tdep->have_pacbti && cache->ra_signed_state.has_value ()
2419       && *cache->ra_signed_state)
2420     set_frame_previous_pc_masked (this_frame);
2421 
2422   /* If we are asked to unwind the PC, then we need to return the LR
2423      instead.  The prologue may save PC, but it will point into this
2424      frame's prologue, not the next frame's resume location.  Also
2425      strip the saved T bit.  A valid LR may have the low bit set, but
2426      a valid PC never does.  */
2427   if (prev_regnum == ARM_PC_REGNUM)
2428     {
2429       CORE_ADDR lr;
2430 
2431       lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2432       return frame_unwind_got_constant (this_frame, prev_regnum,
2433                                                   arm_addr_bits_remove (gdbarch, lr));
2434     }
2435 
2436   /* SP is generally not saved to the stack, but this frame is
2437      identified by the next frame's stack pointer at the time of the call.
2438      The value was already reconstructed into PREV_SP.  */
2439   if (prev_regnum == ARM_SP_REGNUM)
2440     return frame_unwind_got_constant (this_frame, prev_regnum,
2441                                               arm_cache_get_prev_sp_value (cache, tdep));
2442 
2443   /* The value might be one of the alternative SP, if so, use the
2444      value already constructed.  */
2445   if (arm_is_alternative_sp_register (tdep, prev_regnum))
2446     {
2447       sp_value = arm_cache_get_sp_register (cache, tdep, prev_regnum);
2448       return frame_unwind_got_constant (this_frame, prev_regnum, sp_value);
2449     }
2450 
2451   /* The CPSR may have been changed by the call instruction and by the
2452      called function.  The only bit we can reconstruct is the T bit,
2453      by checking the low bit of LR as of the call.  This is a reliable
2454      indicator of Thumb-ness except for some ARM v4T pre-interworking
2455      Thumb code, which could get away with a clear low bit as long as
2456      the called function did not use bx.  Guess that all other
2457      bits are unchanged; the condition flags are presumably lost,
2458      but the processor status is likely valid.  */
2459   if (prev_regnum == ARM_PS_REGNUM)
2460     {
2461       ULONGEST cpsr = get_frame_register_unsigned (this_frame, prev_regnum);
2462       CORE_ADDR lr = frame_unwind_register_unsigned (this_frame, ARM_LR_REGNUM);
2463 
2464       cpsr = reconstruct_t_bit (gdbarch, lr, cpsr);
2465       return frame_unwind_got_constant (this_frame, prev_regnum, cpsr);
2466     }
2467 
2468   return trad_frame_get_prev_register (this_frame, cache->saved_regs,
2469                                                prev_regnum);
2470 }
2471 
2472 static frame_unwind arm_prologue_unwind = {
2473   "arm prologue",
2474   NORMAL_FRAME,
2475   arm_prologue_unwind_stop_reason,
2476   arm_prologue_this_id,
2477   arm_prologue_prev_register,
2478   NULL,
2479   default_frame_sniffer
2480 };
2481 
2482 /* Maintain a list of ARM exception table entries per objfile, similar to the
2483    list of mapping symbols.  We only cache entries for standard ARM-defined
2484    personality routines; the cache will contain only the frame unwinding
2485    instructions associated with the entry (not the descriptors).  */
2486 
2487 struct arm_exidx_entry
2488 {
2489   CORE_ADDR addr;
2490   gdb_byte *entry;
2491 
2492   bool operator< (const arm_exidx_entry &other) const
2493   {
2494     return addr < other.addr;
2495   }
2496 };
2497 
2498 struct arm_exidx_data
2499 {
2500   std::vector<std::vector<arm_exidx_entry>> section_maps;
2501 };
2502 
2503 /* Per-BFD key to store exception handling information.  */
2504 static const registry<bfd>::key<arm_exidx_data> arm_exidx_data_key;
2505 
2506 static struct obj_section *
arm_obj_section_from_vma(struct objfile * objfile,bfd_vma vma)2507 arm_obj_section_from_vma (struct objfile *objfile, bfd_vma vma)
2508 {
2509   for (obj_section *osect : objfile->sections ())
2510     if (bfd_section_flags (osect->the_bfd_section) & SEC_ALLOC)
2511       {
2512           bfd_vma start, size;
2513           start = bfd_section_vma (osect->the_bfd_section);
2514           size = bfd_section_size (osect->the_bfd_section);
2515 
2516           if (start <= vma && vma < start + size)
2517             return osect;
2518       }
2519 
2520   return NULL;
2521 }
2522 
2523 /* Parse contents of exception table and exception index sections
2524    of OBJFILE, and fill in the exception table entry cache.
2525 
2526    For each entry that refers to a standard ARM-defined personality
2527    routine, extract the frame unwinding instructions (from either
2528    the index or the table section).  The unwinding instructions
2529    are normalized by:
2530     - extracting them from the rest of the table data
2531     - converting to host endianness
2532     - appending the implicit 0xb0 ("Finish") code
2533 
2534    The extracted and normalized instructions are stored for later
2535    retrieval by the arm_find_exidx_entry routine.  */
2536 
2537 static void
arm_exidx_new_objfile(struct objfile * objfile)2538 arm_exidx_new_objfile (struct objfile *objfile)
2539 {
2540   struct arm_exidx_data *data;
2541   asection *exidx, *extab;
2542   bfd_vma exidx_vma = 0, extab_vma = 0;
2543   LONGEST i;
2544 
2545   /* If we've already touched this file, do nothing.  */
2546   if (arm_exidx_data_key.get (objfile->obfd.get ()) != nullptr)
2547     return;
2548 
2549   /* Read contents of exception table and index.  */
2550   exidx = bfd_get_section_by_name (objfile->obfd.get (),
2551                                            ELF_STRING_ARM_unwind);
2552   gdb::byte_vector exidx_data;
2553   if (exidx)
2554     {
2555       exidx_vma = bfd_section_vma (exidx);
2556       exidx_data.resize (bfd_section_size (exidx));
2557 
2558       if (!bfd_get_section_contents (objfile->obfd.get (), exidx,
2559                                              exidx_data.data (), 0,
2560                                              exidx_data.size ()))
2561           return;
2562     }
2563 
2564   extab = bfd_get_section_by_name (objfile->obfd.get (), ".ARM.extab");
2565   gdb::byte_vector extab_data;
2566   if (extab)
2567     {
2568       extab_vma = bfd_section_vma (extab);
2569       extab_data.resize (bfd_section_size (extab));
2570 
2571       if (!bfd_get_section_contents (objfile->obfd.get (), extab,
2572                                              extab_data.data (), 0,
2573                                              extab_data.size ()))
2574           return;
2575     }
2576 
2577   /* Allocate exception table data structure.  */
2578   data = arm_exidx_data_key.emplace (objfile->obfd.get ());
2579   data->section_maps.resize (objfile->obfd->section_count);
2580 
2581   /* Fill in exception table.  */
2582   for (i = 0; i < exidx_data.size () / 8; i++)
2583     {
2584       struct arm_exidx_entry new_exidx_entry;
2585       bfd_vma idx = bfd_h_get_32 (objfile->obfd, exidx_data.data () + i * 8);
2586       bfd_vma val = bfd_h_get_32 (objfile->obfd,
2587                                           exidx_data.data () + i * 8 + 4);
2588       bfd_vma addr = 0, word = 0;
2589       int n_bytes = 0, n_words = 0;
2590       struct obj_section *sec;
2591       gdb_byte *entry = NULL;
2592 
2593       /* Extract address of start of function.  */
2594       idx = ((idx & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2595       idx += exidx_vma + i * 8;
2596 
2597       /* Find section containing function and compute section offset.  */
2598       sec = arm_obj_section_from_vma (objfile, idx);
2599       if (sec == NULL)
2600           continue;
2601       idx -= bfd_section_vma (sec->the_bfd_section);
2602 
2603       /* Determine address of exception table entry.  */
2604       if (val == 1)
2605           {
2606             /* EXIDX_CANTUNWIND -- no exception table entry present.  */
2607           }
2608       else if ((val & 0xff000000) == 0x80000000)
2609           {
2610             /* Exception table entry embedded in .ARM.exidx
2611                -- must be short form.  */
2612             word = val;
2613             n_bytes = 3;
2614           }
2615       else if (!(val & 0x80000000))
2616           {
2617             /* Exception table entry in .ARM.extab.  */
2618             addr = ((val & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2619             addr += exidx_vma + i * 8 + 4;
2620 
2621             if (addr >= extab_vma && addr + 4 <= extab_vma + extab_data.size ())
2622               {
2623                 word = bfd_h_get_32 (objfile->obfd,
2624                                            extab_data.data () + addr - extab_vma);
2625                 addr += 4;
2626 
2627                 if ((word & 0xff000000) == 0x80000000)
2628                     {
2629                       /* Short form.  */
2630                       n_bytes = 3;
2631                     }
2632                 else if ((word & 0xff000000) == 0x81000000
2633                            || (word & 0xff000000) == 0x82000000)
2634                     {
2635                       /* Long form.  */
2636                       n_bytes = 2;
2637                       n_words = ((word >> 16) & 0xff);
2638                     }
2639                 else if (!(word & 0x80000000))
2640                     {
2641                       bfd_vma pers;
2642                       struct obj_section *pers_sec;
2643                       int gnu_personality = 0;
2644 
2645                       /* Custom personality routine.  */
2646                       pers = ((word & 0x7fffffff) ^ 0x40000000) - 0x40000000;
2647                       pers = UNMAKE_THUMB_ADDR (pers + addr - 4);
2648 
2649                       /* Check whether we've got one of the variants of the
2650                          GNU personality routines.  */
2651                       pers_sec = arm_obj_section_from_vma (objfile, pers);
2652                       if (pers_sec)
2653                         {
2654                           static const char *personality[] =
2655                               {
2656                                 "__gcc_personality_v0",
2657                                 "__gxx_personality_v0",
2658                                 "__gcj_personality_v0",
2659                                 "__gnu_objc_personality_v0",
2660                                 NULL
2661                               };
2662 
2663                           CORE_ADDR pc = pers + pers_sec->offset ();
2664                           int k;
2665 
2666                           for (k = 0; personality[k]; k++)
2667                               if (lookup_minimal_symbol_by_pc_name
2668                                     (pc, personality[k], objfile))
2669                                 {
2670                                   gnu_personality = 1;
2671                                   break;
2672                                 }
2673                         }
2674 
2675                       /* If so, the next word contains a word count in the high
2676                          byte, followed by the same unwind instructions as the
2677                          pre-defined forms.  */
2678                       if (gnu_personality
2679                           && addr + 4 <= extab_vma + extab_data.size ())
2680                         {
2681                           word = bfd_h_get_32 (objfile->obfd,
2682                                                      (extab_data.data ()
2683                                                       + addr - extab_vma));
2684                           addr += 4;
2685                           n_bytes = 3;
2686                           n_words = ((word >> 24) & 0xff);
2687                         }
2688                     }
2689               }
2690           }
2691 
2692       /* Sanity check address.  */
2693       if (n_words)
2694           if (addr < extab_vma
2695               || addr + 4 * n_words > extab_vma + extab_data.size ())
2696             n_words = n_bytes = 0;
2697 
2698       /* The unwind instructions reside in WORD (only the N_BYTES least
2699            significant bytes are valid), followed by N_WORDS words in the
2700            extab section starting at ADDR.  */
2701       if (n_bytes || n_words)
2702           {
2703             gdb_byte *p = entry
2704               = (gdb_byte *) obstack_alloc (&objfile->per_bfd->storage_obstack,
2705                                                     n_bytes + n_words * 4 + 1);
2706 
2707             while (n_bytes--)
2708               *p++ = (gdb_byte) ((word >> (8 * n_bytes)) & 0xff);
2709 
2710             while (n_words--)
2711               {
2712                 word = bfd_h_get_32 (objfile->obfd,
2713                                            extab_data.data () + addr - extab_vma);
2714                 addr += 4;
2715 
2716                 *p++ = (gdb_byte) ((word >> 24) & 0xff);
2717                 *p++ = (gdb_byte) ((word >> 16) & 0xff);
2718                 *p++ = (gdb_byte) ((word >> 8) & 0xff);
2719                 *p++ = (gdb_byte) (word & 0xff);
2720               }
2721 
2722             /* Implied "Finish" to terminate the list.  */
2723             *p++ = 0xb0;
2724           }
2725 
2726       /* Push entry onto vector.  They are guaranteed to always
2727            appear in order of increasing addresses.  */
2728       new_exidx_entry.addr = idx;
2729       new_exidx_entry.entry = entry;
2730       data->section_maps[sec->the_bfd_section->index].push_back
2731           (new_exidx_entry);
2732     }
2733 }
2734 
2735 /* Search for the exception table entry covering MEMADDR.  If one is found,
2736    return a pointer to its data.  Otherwise, return 0.  If START is non-NULL,
2737    set *START to the start of the region covered by this entry.  */
2738 
2739 static gdb_byte *
arm_find_exidx_entry(CORE_ADDR memaddr,CORE_ADDR * start)2740 arm_find_exidx_entry (CORE_ADDR memaddr, CORE_ADDR *start)
2741 {
2742   struct obj_section *sec;
2743 
2744   sec = find_pc_section (memaddr);
2745   if (sec != NULL)
2746     {
2747       struct arm_exidx_data *data;
2748       struct arm_exidx_entry map_key = { memaddr - sec->addr (), 0 };
2749 
2750       data = arm_exidx_data_key.get (sec->objfile->obfd.get ());
2751       if (data != NULL)
2752           {
2753             std::vector<arm_exidx_entry> &map
2754               = data->section_maps[sec->the_bfd_section->index];
2755             if (!map.empty ())
2756               {
2757                 auto idx = std::lower_bound (map.begin (), map.end (), map_key);
2758 
2759                 /* std::lower_bound finds the earliest ordered insertion
2760                      point.  If the following symbol starts at this exact
2761                      address, we use that; otherwise, the preceding
2762                      exception table entry covers this address.  */
2763                 if (idx < map.end ())
2764                     {
2765                       if (idx->addr == map_key.addr)
2766                         {
2767                           if (start)
2768                               *start = idx->addr + sec->addr ();
2769                           return idx->entry;
2770                         }
2771                     }
2772 
2773                 if (idx > map.begin ())
2774                     {
2775                       idx = idx - 1;
2776                       if (start)
2777                         *start = idx->addr + sec->addr ();
2778                       return idx->entry;
2779                     }
2780               }
2781           }
2782     }
2783 
2784   return NULL;
2785 }
2786 
2787 /* Given the current frame THIS_FRAME, and its associated frame unwinding
2788    instruction list from the ARM exception table entry ENTRY, allocate and
2789    return a prologue cache structure describing how to unwind this frame.
2790 
2791    Return NULL if the unwinding instruction list contains a "spare",
2792    "reserved" or "refuse to unwind" instruction as defined in section
2793    "9.3 Frame unwinding instructions" of the "Exception Handling ABI
2794    for the ARM Architecture" document.  */
2795 
2796 static struct arm_prologue_cache *
arm_exidx_fill_cache(const frame_info_ptr & this_frame,gdb_byte * entry)2797 arm_exidx_fill_cache (const frame_info_ptr &this_frame, gdb_byte *entry)
2798 {
2799   CORE_ADDR vsp = 0;
2800   int vsp_valid = 0;
2801 
2802   struct arm_prologue_cache *cache;
2803   cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
2804   arm_cache_init (cache, this_frame);
2805 
2806   for (;;)
2807     {
2808       gdb_byte insn;
2809 
2810       /* Whenever we reload SP, we actually have to retrieve its
2811            actual value in the current frame.  */
2812       if (!vsp_valid)
2813           {
2814             if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
2815               {
2816                 int reg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
2817                 vsp = get_frame_register_unsigned (this_frame, reg);
2818               }
2819             else
2820               {
2821                 CORE_ADDR addr = cache->saved_regs[ARM_SP_REGNUM].addr ();
2822                 vsp = get_frame_memory_unsigned (this_frame, addr, 4);
2823               }
2824 
2825             vsp_valid = 1;
2826           }
2827 
2828       /* Decode next unwind instruction.  */
2829       insn = *entry++;
2830 
2831       if ((insn & 0xc0) == 0)
2832           {
2833             int offset = insn & 0x3f;
2834             vsp += (offset << 2) + 4;
2835           }
2836       else if ((insn & 0xc0) == 0x40)
2837           {
2838             int offset = insn & 0x3f;
2839             vsp -= (offset << 2) + 4;
2840           }
2841       else if ((insn & 0xf0) == 0x80)
2842           {
2843             int mask = ((insn & 0xf) << 8) | *entry++;
2844             int i;
2845 
2846             /* The special case of an all-zero mask identifies
2847                "Refuse to unwind".  We return NULL to fall back
2848                to the prologue analyzer.  */
2849             if (mask == 0)
2850               return NULL;
2851 
2852             /* Pop registers r4..r15 under mask.  */
2853             for (i = 0; i < 12; i++)
2854               if (mask & (1 << i))
2855                 {
2856                     cache->saved_regs[4 + i].set_addr (vsp);
2857                     vsp += 4;
2858                 }
2859 
2860             /* Special-case popping SP -- we need to reload vsp.  */
2861             if (mask & (1 << (ARM_SP_REGNUM - 4)))
2862               vsp_valid = 0;
2863           }
2864       else if ((insn & 0xf0) == 0x90)
2865           {
2866             int reg = insn & 0xf;
2867 
2868             /* Reserved cases.  */
2869             if (reg == ARM_SP_REGNUM || reg == ARM_PC_REGNUM)
2870               return NULL;
2871 
2872             /* Set SP from another register and mark VSP for reload.  */
2873             cache->saved_regs[ARM_SP_REGNUM] = cache->saved_regs[reg];
2874             vsp_valid = 0;
2875           }
2876       else if ((insn & 0xf0) == 0xa0)
2877           {
2878             int count = insn & 0x7;
2879             int pop_lr = (insn & 0x8) != 0;
2880             int i;
2881 
2882             /* Pop r4..r[4+count].  */
2883             for (i = 0; i <= count; i++)
2884               {
2885                 cache->saved_regs[4 + i].set_addr (vsp);
2886                 vsp += 4;
2887               }
2888 
2889             /* If indicated by flag, pop LR as well.  */
2890             if (pop_lr)
2891               {
2892                 cache->saved_regs[ARM_LR_REGNUM].set_addr (vsp);
2893                 vsp += 4;
2894               }
2895           }
2896       else if (insn == 0xb0)
2897           {
2898             /* We could only have updated PC by popping into it; if so, it
2899                will show up as address.  Otherwise, copy LR into PC.  */
2900             if (!cache->saved_regs[ARM_PC_REGNUM].is_addr ())
2901               cache->saved_regs[ARM_PC_REGNUM]
2902                 = cache->saved_regs[ARM_LR_REGNUM];
2903 
2904             /* We're done.  */
2905             break;
2906           }
2907       else if (insn == 0xb1)
2908           {
2909             int mask = *entry++;
2910             int i;
2911 
2912             /* All-zero mask and mask >= 16 is "spare".  */
2913             if (mask == 0 || mask >= 16)
2914               return NULL;
2915 
2916             /* Pop r0..r3 under mask.  */
2917             for (i = 0; i < 4; i++)
2918               if (mask & (1 << i))
2919                 {
2920                     cache->saved_regs[i].set_addr (vsp);
2921                     vsp += 4;
2922                 }
2923           }
2924       else if (insn == 0xb2)
2925           {
2926             ULONGEST offset = 0;
2927             unsigned shift = 0;
2928 
2929             do
2930               {
2931                 offset |= (*entry & 0x7f) << shift;
2932                 shift += 7;
2933               }
2934             while (*entry++ & 0x80);
2935 
2936             vsp += 0x204 + (offset << 2);
2937           }
2938       else if (insn == 0xb3)
2939           {
2940             int start = *entry >> 4;
2941             int count = (*entry++) & 0xf;
2942             int i;
2943 
2944             /* Only registers D0..D15 are valid here.  */
2945             if (start + count >= 16)
2946               return NULL;
2947 
2948             /* Pop VFP double-precision registers D[start]..D[start+count].  */
2949             for (i = 0; i <= count; i++)
2950               {
2951                 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
2952                 vsp += 8;
2953               }
2954 
2955             /* Add an extra 4 bytes for FSTMFDX-style stack.  */
2956             vsp += 4;
2957           }
2958       else if ((insn & 0xf8) == 0xb8)
2959           {
2960             int count = insn & 0x7;
2961             int i;
2962 
2963             /* Pop VFP double-precision registers D[8]..D[8+count].  */
2964             for (i = 0; i <= count; i++)
2965               {
2966                 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
2967                 vsp += 8;
2968               }
2969 
2970             /* Add an extra 4 bytes for FSTMFDX-style stack.  */
2971             vsp += 4;
2972           }
2973       else if (insn == 0xc6)
2974           {
2975             int start = *entry >> 4;
2976             int count = (*entry++) & 0xf;
2977             int i;
2978 
2979             /* Only registers WR0..WR15 are valid.  */
2980             if (start + count >= 16)
2981               return NULL;
2982 
2983             /* Pop iwmmx registers WR[start]..WR[start+count].  */
2984             for (i = 0; i <= count; i++)
2985               {
2986                 cache->saved_regs[ARM_WR0_REGNUM + start + i].set_addr (vsp);
2987                 vsp += 8;
2988               }
2989           }
2990       else if (insn == 0xc7)
2991           {
2992             int mask = *entry++;
2993             int i;
2994 
2995             /* All-zero mask and mask >= 16 is "spare".  */
2996             if (mask == 0 || mask >= 16)
2997               return NULL;
2998 
2999             /* Pop iwmmx general-purpose registers WCGR0..WCGR3 under mask.  */
3000             for (i = 0; i < 4; i++)
3001               if (mask & (1 << i))
3002                 {
3003                     cache->saved_regs[ARM_WCGR0_REGNUM + i].set_addr (vsp);
3004                     vsp += 4;
3005                 }
3006           }
3007       else if ((insn & 0xf8) == 0xc0)
3008           {
3009             int count = insn & 0x7;
3010             int i;
3011 
3012             /* Pop iwmmx registers WR[10]..WR[10+count].  */
3013             for (i = 0; i <= count; i++)
3014               {
3015                 cache->saved_regs[ARM_WR0_REGNUM + 10 + i].set_addr (vsp);
3016                 vsp += 8;
3017               }
3018           }
3019       else if (insn == 0xc8)
3020           {
3021             int start = *entry >> 4;
3022             int count = (*entry++) & 0xf;
3023             int i;
3024 
3025             /* Only registers D0..D31 are valid.  */
3026             if (start + count >= 16)
3027               return NULL;
3028 
3029             /* Pop VFP double-precision registers
3030                D[16+start]..D[16+start+count].  */
3031             for (i = 0; i <= count; i++)
3032               {
3033                 cache->saved_regs[ARM_D0_REGNUM + 16 + start + i].set_addr (vsp);
3034                 vsp += 8;
3035               }
3036           }
3037       else if (insn == 0xc9)
3038           {
3039             int start = *entry >> 4;
3040             int count = (*entry++) & 0xf;
3041             int i;
3042 
3043             /* Pop VFP double-precision registers D[start]..D[start+count].  */
3044             for (i = 0; i <= count; i++)
3045               {
3046                 cache->saved_regs[ARM_D0_REGNUM + start + i].set_addr (vsp);
3047                 vsp += 8;
3048               }
3049           }
3050       else if ((insn & 0xf8) == 0xd0)
3051           {
3052             int count = insn & 0x7;
3053             int i;
3054 
3055             /* Pop VFP double-precision registers D[8]..D[8+count].  */
3056             for (i = 0; i <= count; i++)
3057               {
3058                 cache->saved_regs[ARM_D0_REGNUM + 8 + i].set_addr (vsp);
3059                 vsp += 8;
3060               }
3061           }
3062       else
3063           {
3064             /* Everything else is "spare".  */
3065             return NULL;
3066           }
3067     }
3068 
3069   /* If we restore SP from a register, assume this was the frame register.
3070      Otherwise just fall back to SP as frame register.  */
3071   if (cache->saved_regs[ARM_SP_REGNUM].is_realreg ())
3072     cache->framereg = cache->saved_regs[ARM_SP_REGNUM].realreg ();
3073   else
3074     cache->framereg = ARM_SP_REGNUM;
3075 
3076   /* Determine offset to previous frame.  */
3077   cache->framesize
3078     = vsp - get_frame_register_unsigned (this_frame, cache->framereg);
3079 
3080   /* We already got the previous SP.  */
3081   arm_gdbarch_tdep *tdep
3082     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3083   arm_cache_set_active_sp_value (cache, tdep, vsp);
3084 
3085   return cache;
3086 }
3087 
3088 /* Unwinding via ARM exception table entries.  Note that the sniffer
3089    already computes a filled-in prologue cache, which is then used
3090    with the same arm_prologue_this_id and arm_prologue_prev_register
3091    routines also used for prologue-parsing based unwinding.  */
3092 
3093 static int
arm_exidx_unwind_sniffer(const struct frame_unwind * self,const frame_info_ptr & this_frame,void ** this_prologue_cache)3094 arm_exidx_unwind_sniffer (const struct frame_unwind *self,
3095                                 const frame_info_ptr &this_frame,
3096                                 void **this_prologue_cache)
3097 {
3098   struct gdbarch *gdbarch = get_frame_arch (this_frame);
3099   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
3100   CORE_ADDR addr_in_block, exidx_region, func_start;
3101   struct arm_prologue_cache *cache;
3102   gdb_byte *entry;
3103 
3104   /* See if we have an ARM exception table entry covering this address.  */
3105   addr_in_block = get_frame_address_in_block (this_frame);
3106   entry = arm_find_exidx_entry (addr_in_block, &exidx_region);
3107   if (!entry)
3108     return 0;
3109 
3110   /* The ARM exception table does not describe unwind information
3111      for arbitrary PC values, but is guaranteed to be correct only
3112      at call sites.  We have to decide here whether we want to use
3113      ARM exception table information for this frame, or fall back
3114      to using prologue parsing.  (Note that if we have DWARF CFI,
3115      this sniffer isn't even called -- CFI is always preferred.)
3116 
3117      Before we make this decision, however, we check whether we
3118      actually have *symbol* information for the current frame.
3119      If not, prologue parsing would not work anyway, so we might
3120      as well use the exception table and hope for the best.  */
3121   if (find_pc_partial_function (addr_in_block, NULL, &func_start, NULL))
3122     {
3123       int exc_valid = 0;
3124 
3125       /* If the next frame is "normal", we are at a call site in this
3126            frame, so exception information is guaranteed to be valid.  */
3127       if (get_next_frame (this_frame)
3128             && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME)
3129           exc_valid = 1;
3130 
3131       /* Some syscalls keep PC pointing to the SVC instruction itself.  */
3132       for (int shift = 0; shift <= 1 && !exc_valid; ++shift)
3133           {
3134             /* We also assume exception information is valid if we're currently
3135                blocked in a system call.  The system library is supposed to
3136                ensure this, so that e.g. pthread cancellation works.  */
3137             if (arm_frame_is_thumb (this_frame))
3138               {
3139                 ULONGEST insn;
3140 
3141                 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3142                                                                   - (shift ? 2 : 0)),
3143                                                                  2, byte_order_for_code,
3144                                                                  &insn)
3145                       && (insn & 0xff00) == 0xdf00 /* svc */)
3146                     exc_valid = 1;
3147               }
3148             else
3149               {
3150                 ULONGEST insn;
3151 
3152                 if (safe_read_memory_unsigned_integer ((get_frame_pc (this_frame)
3153                                                                   - (shift ? 4 : 0)),
3154                                                                  4, byte_order_for_code,
3155                                                                  &insn)
3156                       && (insn & 0x0f000000) == 0x0f000000 /* svc */)
3157                     exc_valid = 1;
3158               }
3159           }
3160 
3161       /* Bail out if we don't know that exception information is valid.  */
3162       if (!exc_valid)
3163           return 0;
3164 
3165      /* The ARM exception index does not mark the *end* of the region
3166           covered by the entry, and some functions will not have any entry.
3167           To correctly recognize the end of the covered region, the linker
3168           should have inserted dummy records with a CANTUNWIND marker.
3169 
3170           Unfortunately, current versions of GNU ld do not reliably do
3171           this, and thus we may have found an incorrect entry above.
3172           As a (temporary) sanity check, we only use the entry if it
3173           lies *within* the bounds of the function.  Note that this check
3174           might reject perfectly valid entries that just happen to cover
3175           multiple functions; therefore this check ought to be removed
3176           once the linker is fixed.  */
3177       if (func_start > exidx_region)
3178           return 0;
3179     }
3180 
3181   /* Decode the list of unwinding instructions into a prologue cache.
3182      Note that this may fail due to e.g. a "refuse to unwind" code.  */
3183   cache = arm_exidx_fill_cache (this_frame, entry);
3184   if (!cache)
3185     return 0;
3186 
3187   *this_prologue_cache = cache;
3188   return 1;
3189 }
3190 
3191 struct frame_unwind arm_exidx_unwind = {
3192   "arm exidx",
3193   NORMAL_FRAME,
3194   default_frame_unwind_stop_reason,
3195   arm_prologue_this_id,
3196   arm_prologue_prev_register,
3197   NULL,
3198   arm_exidx_unwind_sniffer
3199 };
3200 
3201 static struct arm_prologue_cache *
arm_make_epilogue_frame_cache(const frame_info_ptr & this_frame)3202 arm_make_epilogue_frame_cache (const frame_info_ptr &this_frame)
3203 {
3204   struct arm_prologue_cache *cache;
3205   int reg;
3206 
3207   cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3208   arm_cache_init (cache, this_frame);
3209 
3210   /* Still rely on the offset calculated from prologue.  */
3211   arm_scan_prologue (this_frame, cache);
3212 
3213   /* Since we are in epilogue, the SP has been restored.  */
3214   arm_gdbarch_tdep *tdep
3215     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3216   arm_cache_set_active_sp_value (cache, tdep,
3217                                          get_frame_register_unsigned (this_frame,
3218                                                                             ARM_SP_REGNUM));
3219 
3220   /* Calculate actual addresses of saved registers using offsets
3221      determined by arm_scan_prologue.  */
3222   for (reg = 0; reg < gdbarch_num_regs (get_frame_arch (this_frame)); reg++)
3223     if (cache->saved_regs[reg].is_addr ())
3224       cache->saved_regs[reg].set_addr (cache->saved_regs[reg].addr ()
3225                                                + arm_cache_get_prev_sp_value (cache, tdep));
3226 
3227   return cache;
3228 }
3229 
3230 /* Implementation of function hook 'this_id' in
3231    'struct frame_uwnind' for epilogue unwinder.  */
3232 
3233 static void
arm_epilogue_frame_this_id(const frame_info_ptr & this_frame,void ** this_cache,struct frame_id * this_id)3234 arm_epilogue_frame_this_id (const frame_info_ptr &this_frame,
3235                                   void **this_cache,
3236                                   struct frame_id *this_id)
3237 {
3238   struct arm_prologue_cache *cache;
3239   CORE_ADDR pc, func;
3240 
3241   if (*this_cache == NULL)
3242     *this_cache = arm_make_epilogue_frame_cache (this_frame);
3243   cache = (struct arm_prologue_cache *) *this_cache;
3244 
3245   /* Use function start address as part of the frame ID.  If we cannot
3246      identify the start address (due to missing symbol information),
3247      fall back to just using the current PC.  */
3248   pc = get_frame_pc (this_frame);
3249   func = get_frame_func (this_frame);
3250   if (func == 0)
3251     func = pc;
3252 
3253   arm_gdbarch_tdep *tdep
3254     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3255   *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func);
3256 }
3257 
3258 /* Implementation of function hook 'prev_register' in
3259    'struct frame_uwnind' for epilogue unwinder.  */
3260 
3261 static struct value *
arm_epilogue_frame_prev_register(const frame_info_ptr & this_frame,void ** this_cache,int regnum)3262 arm_epilogue_frame_prev_register (const frame_info_ptr &this_frame,
3263                                           void **this_cache, int regnum)
3264 {
3265   if (*this_cache == NULL)
3266     *this_cache = arm_make_epilogue_frame_cache (this_frame);
3267 
3268   return arm_prologue_prev_register (this_frame, this_cache, regnum);
3269 }
3270 
3271 static int arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch,
3272                                                     CORE_ADDR pc);
3273 static int thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch,
3274                                                     CORE_ADDR pc);
3275 
3276 /* Implementation of function hook 'sniffer' in
3277    'struct frame_uwnind' for epilogue unwinder.  */
3278 
3279 static int
arm_epilogue_frame_sniffer(const struct frame_unwind * self,const frame_info_ptr & this_frame,void ** this_prologue_cache)3280 arm_epilogue_frame_sniffer (const struct frame_unwind *self,
3281                                   const frame_info_ptr &this_frame,
3282                                   void **this_prologue_cache)
3283 {
3284   if (frame_relative_level (this_frame) == 0)
3285     {
3286       struct gdbarch *gdbarch = get_frame_arch (this_frame);
3287       CORE_ADDR pc = get_frame_pc (this_frame);
3288 
3289       if (arm_frame_is_thumb (this_frame))
3290           return thumb_stack_frame_destroyed_p (gdbarch, pc);
3291       else
3292           return arm_stack_frame_destroyed_p_1 (gdbarch, pc);
3293     }
3294   else
3295     return 0;
3296 }
3297 
3298 /* Frame unwinder from epilogue.  */
3299 
3300 static const struct frame_unwind arm_epilogue_frame_unwind =
3301 {
3302   "arm epilogue",
3303   NORMAL_FRAME,
3304   default_frame_unwind_stop_reason,
3305   arm_epilogue_frame_this_id,
3306   arm_epilogue_frame_prev_register,
3307   NULL,
3308   arm_epilogue_frame_sniffer,
3309 };
3310 
3311 /* Recognize GCC's trampoline for thumb call-indirect.  If we are in a
3312    trampoline, return the target PC.  Otherwise return 0.
3313 
3314    void call0a (char c, short s, int i, long l) {}
3315 
3316    int main (void)
3317    {
3318      (*pointer_to_call0a) (c, s, i, l);
3319    }
3320 
3321    Instead of calling a stub library function  _call_via_xx (xx is
3322    the register name), GCC may inline the trampoline in the object
3323    file as below (register r2 has the address of call0a).
3324 
3325    .global main
3326    .type main, %function
3327    ...
3328    bl .L1
3329    ...
3330    .size main, .-main
3331 
3332    .L1:
3333    bx r2
3334 
3335    The trampoline 'bx r2' doesn't belong to main.  */
3336 
3337 static CORE_ADDR
arm_skip_bx_reg(const frame_info_ptr & frame,CORE_ADDR pc)3338 arm_skip_bx_reg (const frame_info_ptr &frame, CORE_ADDR pc)
3339 {
3340   /* The heuristics of recognizing such trampoline is that FRAME is
3341      executing in Thumb mode and the instruction on PC is 'bx Rm'.  */
3342   if (arm_frame_is_thumb (frame))
3343     {
3344       gdb_byte buf[2];
3345 
3346       if (target_read_memory (pc, buf, 2) == 0)
3347           {
3348             struct gdbarch *gdbarch = get_frame_arch (frame);
3349             enum bfd_endian byte_order_for_code
3350               = gdbarch_byte_order_for_code (gdbarch);
3351             uint16_t insn
3352               = extract_unsigned_integer (buf, 2, byte_order_for_code);
3353 
3354             if ((insn & 0xff80) == 0x4700)  /* bx <Rm> */
3355               {
3356                 CORE_ADDR dest
3357                     = get_frame_register_unsigned (frame, bits (insn, 3, 6));
3358 
3359                 /* Clear the LSB so that gdb core sets step-resume
3360                      breakpoint at the right address.  */
3361                 return UNMAKE_THUMB_ADDR (dest);
3362               }
3363           }
3364     }
3365 
3366   return 0;
3367 }
3368 
3369 static struct arm_prologue_cache *
arm_make_stub_cache(const frame_info_ptr & this_frame)3370 arm_make_stub_cache (const frame_info_ptr &this_frame)
3371 {
3372   struct arm_prologue_cache *cache;
3373 
3374   cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3375   arm_cache_init (cache, this_frame);
3376 
3377   arm_gdbarch_tdep *tdep
3378     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3379   arm_cache_set_active_sp_value (cache, tdep,
3380                                          get_frame_register_unsigned (this_frame,
3381                                                                             ARM_SP_REGNUM));
3382 
3383   return cache;
3384 }
3385 
3386 /* Our frame ID for a stub frame is the current SP and LR.  */
3387 
3388 static void
arm_stub_this_id(const frame_info_ptr & this_frame,void ** this_cache,struct frame_id * this_id)3389 arm_stub_this_id (const frame_info_ptr &this_frame,
3390                       void **this_cache,
3391                       struct frame_id *this_id)
3392 {
3393   struct arm_prologue_cache *cache;
3394 
3395   if (*this_cache == NULL)
3396     *this_cache = arm_make_stub_cache (this_frame);
3397   cache = (struct arm_prologue_cache *) *this_cache;
3398 
3399   arm_gdbarch_tdep *tdep
3400     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3401   *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep),
3402                                    get_frame_pc (this_frame));
3403 }
3404 
3405 static int
arm_stub_unwind_sniffer(const struct frame_unwind * self,const frame_info_ptr & this_frame,void ** this_prologue_cache)3406 arm_stub_unwind_sniffer (const struct frame_unwind *self,
3407                                const frame_info_ptr &this_frame,
3408                                void **this_prologue_cache)
3409 {
3410   CORE_ADDR addr_in_block;
3411   gdb_byte dummy[4];
3412   CORE_ADDR pc, start_addr;
3413   const char *name;
3414 
3415   addr_in_block = get_frame_address_in_block (this_frame);
3416   pc = get_frame_pc (this_frame);
3417   if (in_plt_section (addr_in_block)
3418       /* We also use the stub winder if the target memory is unreadable
3419            to avoid having the prologue unwinder trying to read it.  */
3420       || target_read_memory (pc, dummy, 4) != 0)
3421     return 1;
3422 
3423   if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0
3424       && arm_skip_bx_reg (this_frame, pc) != 0)
3425     return 1;
3426 
3427   return 0;
3428 }
3429 
3430 struct frame_unwind arm_stub_unwind = {
3431   "arm stub",
3432   NORMAL_FRAME,
3433   default_frame_unwind_stop_reason,
3434   arm_stub_this_id,
3435   arm_prologue_prev_register,
3436   NULL,
3437   arm_stub_unwind_sniffer
3438 };
3439 
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.  */
3443 
3444 static struct arm_prologue_cache *
arm_m_exception_cache(const frame_info_ptr & this_frame)3445 arm_m_exception_cache (const frame_info_ptr &this_frame)
3446 {
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;
3450 
3451   cache = FRAME_OBSTACK_ZALLOC (struct arm_prologue_cache);
3452   arm_cache_init (cache, this_frame);
3453 
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).  */
3457 
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))
3470     {
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."));
3477 
3478       /* Terminate any further stack unwinding.  */
3479       arm_cache_set_active_sp_value (cache, tdep, 0);
3480       return cache;
3481     }
3482 
3483   CORE_ADDR lr = get_frame_register_unsigned (this_frame, ARM_LR_REGNUM);
3484 
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)
3490     {
3491       /* Terminate any further stack unwinding.  */
3492       arm_cache_set_active_sp_value (cache, tdep, 0);
3493       return cache;
3494     }
3495 
3496   /* Check FNC_RETURN indicator bits (24-31).  */
3497   bool fnc_return = (((lr >> 24) & 0xff) == 0xfe);
3498   if (fnc_return)
3499     {
3500       /* FNC_RETURN is only valid for targets with Security Extension.  */
3501       if (!tdep->have_sec_ext)
3502           {
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));
3508           }
3509 
3510       if (!arm_unwind_secure_frames)
3511           {
3512             warning (_("Non-secure to secure stack unwinding disabled."));
3513 
3514             /* Terminate any further stack unwinding.  */
3515             arm_cache_set_active_sp_value (cache, tdep, 0);
3516             return cache;
3517           }
3518 
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);
3526 
3527       CORE_ADDR unwound_sp = arm_cache_get_prev_sp_value (cache, tdep);
3528 
3529       /* Stack layout for a function call from Secure to Non-Secure state
3530            (ARMv8-M section B3.16):
3531 
3532               SP Offset
3533 
3534                         +-------------------+
3535                0x08   |                   |
3536                         +-------------------+   <-- Original SP
3537                0x04   |    Partial xPSR   |
3538                         +-------------------+
3539                0x00   |   Return Address  |
3540                         +===================+   <-- New SP  */
3541 
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);
3545 
3546       arm_cache_set_active_sp_value (cache, tdep, unwound_sp + 0x08);
3547 
3548       return cache;
3549     }
3550 
3551   /* Check EXC_RETURN indicator bits (24-31).  */
3552   bool exc_return = (((lr >> 24) & 0xff) == 0xff);
3553   if (exc_return)
3554     {
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);
3560 
3561       /* Check EXC_RETURN bit SPSEL if Main or Thread (process) stack used.  */
3562       bool process_stack_used = (bit (lr, 2) != 0);
3563 
3564       if (tdep->have_sec_ext)
3565           {
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);
3569 
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)
3576               {
3577                 warning (_("Non-secure to secure stack unwinding disabled."));
3578 
3579                 /* Terminate any further stack unwinding.  */
3580                 arm_cache_set_active_sp_value (cache, tdep, 0);
3581                 return cache;
3582               }
3583 
3584             if (process_stack_used)
3585               {
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;
3592               }
3593             else
3594               {
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;
3601               }
3602           }
3603       else
3604           {
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;
3611           }
3612 
3613       /* Set the active SP regnum.  */
3614       arm_cache_switch_prev_sp (cache, tdep, sp_regnum);
3615 
3616       /* Fetch the SP to use for this frame.  */
3617       CORE_ADDR unwound_sp = arm_cache_get_prev_sp_value (cache, tdep);
3618 
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.
3622 
3623            The following figure shows the structure of the stack frame when
3624            Security and Floating-point extensions are present.
3625 
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  */
3673 
3674       uint32_t sp_r0_offset = 0;
3675 
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))
3679           {
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;
3690           }
3691 
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);
3708 
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)
3713           {
3714             ULONGEST fpccr;
3715             ULONGEST fpcar;
3716 
3717             /* Read FPCCR register.  */
3718             if (!safe_read_memory_unsigned_integer (FPCCR, ARM_INT_REGISTER_SIZE,
3719                                                              byte_order, &fpccr))
3720               {
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;
3725               }
3726 
3727             /* Read FPCAR register.  */
3728             if (!safe_read_memory_unsigned_integer (FPCAR, ARM_INT_REGISTER_SIZE,
3729                                                               byte_order, &fpcar))
3730               {
3731                 warning (_("Could not fetch FPCAR content. Further unwinding of "
3732                                "FP register values will be unreliable."));
3733                 fpcar = 0;
3734               }
3735 
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);
3740 
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));
3752 
3753             /* Extended stack frame type used.  */
3754             if (read_fp_regs_from_stack)
3755               {
3756                 CORE_ADDR addr = unwound_sp + sp_r0_offset + 0x20;
3757                 for (int i = 0; i < 8; i++)
3758                     {
3759                       cache->saved_regs[ARM_D0_REGNUM + i].set_addr (addr);
3760                       addr += 8;
3761                     }
3762               }
3763             cache->saved_regs[ARM_FPSCR_REGNUM].set_addr (unwound_sp
3764                                                                       + sp_r0_offset + 0x60);
3765 
3766             if (tdep->have_sec_ext && !default_callee_register_stacking
3767                 && fpccr_ts)
3768               {
3769                 /* Handle floating-point callee saved registers.  */
3770                 if (read_fp_regs_from_stack)
3771                     {
3772                       CORE_ADDR addr = unwound_sp + sp_r0_offset + 0x68;
3773                       for (int i = 8; i < 16; i++)
3774                         {
3775                           cache->saved_regs[ARM_D0_REGNUM + i].set_addr (addr);
3776                           addr += 8;
3777                         }
3778                     }
3779 
3780                 arm_cache_set_active_sp_value (cache, tdep,
3781                                                        unwound_sp + sp_r0_offset + 0xA8);
3782               }
3783             else
3784               {
3785                 /* Offset 0x64 is reserved.  */
3786                 arm_cache_set_active_sp_value (cache, tdep,
3787                                                        unwound_sp + sp_r0_offset + 0x68);
3788               }
3789           }
3790       else
3791           {
3792             /* Standard stack frame type used.  */
3793             arm_cache_set_active_sp_value (cache, tdep,
3794                                                    unwound_sp + sp_r0_offset + 0x20);
3795           }
3796 
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))
3804           {
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;
3809           }
3810 
3811       if (bit (xpsr, 9) != 0)
3812           {
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);
3815           }
3816 
3817       return cache;
3818     }
3819 
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));
3826 }
3827 
3828 /* Implementation of the stop_reason hook for arm_m_exception frames.  */
3829 
3830 static enum unwind_stop_reason
arm_m_exception_frame_unwind_stop_reason(const frame_info_ptr & this_frame,void ** this_cache)3831 arm_m_exception_frame_unwind_stop_reason (const frame_info_ptr &this_frame,
3832                                                     void **this_cache)
3833 {
3834   struct arm_prologue_cache *cache;
3835   arm_gdbarch_tdep *tdep
3836     = gdbarch_tdep<arm_gdbarch_tdep> (get_frame_arch (this_frame));
3837 
3838   if (*this_cache == NULL)
3839     *this_cache = arm_m_exception_cache (this_frame);
3840   cache = (struct arm_prologue_cache *) *this_cache;
3841 
3842   /* If we've hit a wall, stop.  */
3843   if (arm_cache_get_prev_sp_value (cache, tdep) == 0)
3844     return UNWIND_OUTERMOST;
3845 
3846   return UNWIND_NO_REASON;
3847 }
3848 
3849 /* Implementation of function hook 'this_id' in
3850    'struct frame_uwnind'.  */
3851 
3852 static void
arm_m_exception_this_id(const frame_info_ptr & this_frame,void ** this_cache,struct frame_id * this_id)3853 arm_m_exception_this_id (const frame_info_ptr &this_frame,
3854                                void **this_cache,
3855                                struct frame_id *this_id)
3856 {
3857   struct arm_prologue_cache *cache;
3858 
3859   if (*this_cache == NULL)
3860     *this_cache = arm_m_exception_cache (this_frame);
3861   cache = (struct arm_prologue_cache *) *this_cache;
3862 
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));
3868 }
3869 
3870 /* Implementation of function hook 'prev_register' in
3871    'struct frame_uwnind'.  */
3872 
3873 static struct value *
arm_m_exception_prev_register(const frame_info_ptr & this_frame,void ** this_cache,int prev_regnum)3874 arm_m_exception_prev_register (const frame_info_ptr &this_frame,
3875                                      void **this_cache,
3876                                      int prev_regnum)
3877 {
3878   struct arm_prologue_cache *cache;
3879   CORE_ADDR sp_value;
3880 
3881   if (*this_cache == NULL)
3882     *this_cache = arm_m_exception_cache (this_frame);
3883   cache = (struct arm_prologue_cache *) *this_cache;
3884 
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));
3891 
3892   /* If we are asked to unwind the PC, strip the saved T bit.  */
3893   if (prev_regnum == ARM_PC_REGNUM)
3894     {
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));
3901     }
3902 
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))
3906     {
3907       sp_value = arm_cache_get_sp_register (cache, tdep, prev_regnum);
3908       return frame_unwind_got_constant (this_frame, prev_regnum, sp_value);
3909     }
3910 
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)
3915     {
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);
3924 
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);
3928     }
3929 
3930   return trad_frame_get_prev_register (this_frame, cache->saved_regs,
3931                                                prev_regnum);
3932 }
3933 
3934 /* Implementation of function hook 'sniffer' in
3935    'struct frame_uwnind'.  */
3936 
3937 static int
arm_m_exception_unwind_sniffer(const struct frame_unwind * self,const frame_info_ptr & this_frame,void ** this_prologue_cache)3938 arm_m_exception_unwind_sniffer (const struct frame_unwind *self,
3939                                         const frame_info_ptr &this_frame,
3940                                         void **this_prologue_cache)
3941 {
3942   struct gdbarch *gdbarch = get_frame_arch (this_frame);
3943   CORE_ADDR this_pc = get_frame_pc (this_frame);
3944 
3945   /* No need to check is_m; this sniffer is only registered for
3946      M-profile architectures.  */
3947 
3948   /* Check if exception frame returns to a magic PC value.  */
3949   return arm_m_addr_is_magic (gdbarch, this_pc);
3950 }
3951 
3952 /* Frame unwinder for M-profile exceptions (EXC_RETURN on stack),
3953    lockup and secure/nonsecure interstate function calls (FNC_RETURN).  */
3954 
3955 struct frame_unwind arm_m_exception_unwind =
3956 {
3957   "arm m exception lockup sec_fnc",
3958   SIGTRAMP_FRAME,
3959   arm_m_exception_frame_unwind_stop_reason,
3960   arm_m_exception_this_id,
3961   arm_m_exception_prev_register,
3962   NULL,
3963   arm_m_exception_unwind_sniffer
3964 };
3965 
3966 static CORE_ADDR
arm_normal_frame_base(const frame_info_ptr & this_frame,void ** this_cache)3967 arm_normal_frame_base (const frame_info_ptr &this_frame, void **this_cache)
3968 {
3969   struct arm_prologue_cache *cache;
3970 
3971   if (*this_cache == NULL)
3972     *this_cache = arm_make_prologue_cache (this_frame);
3973   cache = (struct arm_prologue_cache *) *this_cache;
3974 
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;
3978 }
3979 
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
3985 };
3986 
3987 struct arm_dwarf2_prev_register_cache
3988 {
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;
3997 };
3998 
3999 static struct value *
arm_dwarf2_prev_register(const frame_info_ptr & this_frame,void ** this_cache,int regnum)4000 arm_dwarf2_prev_register (const frame_info_ptr &this_frame, void **this_cache,
4001                                 int regnum)
4002 {
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));
4011 
4012   if (!cache)
4013     {
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));
4018 
4019       if (tdep->have_sec_ext)
4020           {
4021             cache->sp
4022               = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
4023 
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);
4036           }
4037       else if (tdep->is_m)
4038           {
4039             cache->sp
4040               = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
4041 
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);
4048           }
4049     }
4050 
4051   if (regnum == ARM_PC_REGNUM)
4052     {
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.  */
4057 
4058       /* Record in the frame whether the return address was signed.  */
4059       if (tdep->have_pacbti)
4060           {
4061             CORE_ADDR ra_auth_code
4062               = frame_unwind_register_unsigned (this_frame,
4063                                                         tdep->pacbti_pseudo_base);
4064 
4065             if (ra_auth_code != 0)
4066               set_frame_previous_pc_masked (this_frame);
4067           }
4068 
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));
4072     }
4073   else if (regnum == ARM_PS_REGNUM)
4074     {
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);
4080     }
4081   else if (arm_is_alternative_sp_register (tdep, regnum))
4082     {
4083       /* Handle the alternative SP registers on Cortex-M.  */
4084       bool override_with_sp_value = false;
4085       CORE_ADDR val;
4086 
4087       if (tdep->have_sec_ext)
4088           {
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);
4101 
4102             override_with_sp_value = is_msp || is_msp_s || is_msp_ns
4103               || is_psp || is_psp_s || is_psp_ns;
4104 
4105           }
4106       else if (tdep->is_m)
4107           {
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);
4112 
4113             override_with_sp_value = is_msp || is_psp;
4114           }
4115 
4116       if (override_with_sp_value)
4117           {
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);
4124           }
4125       else
4126           /* Use value for the register from previous frame.  */
4127           val = get_frame_register_unsigned (this_frame, regnum);
4128 
4129       return frame_unwind_got_constant (this_frame, regnum, val);
4130     }
4131 
4132   internal_error (_("Unexpected register %d"), regnum);
4133 }
4134 
4135 /* Implement the stack_frame_destroyed_p gdbarch method.  */
4136 
4137 static int
thumb_stack_frame_destroyed_p(struct gdbarch * gdbarch,CORE_ADDR pc)4138 thumb_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4139 {
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];
4146 
4147   if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
4148     return 0;
4149 
4150   /* The epilogue is a sequence of instructions along the following lines:
4151 
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]
4156 
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.
4160 
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.  */
4166 
4167   scan_pc = pc;
4168   while (scan_pc < func_end && !found_return)
4169     {
4170       if (target_read_memory (scan_pc, buf, 2))
4171           break;
4172 
4173       scan_pc += 2;
4174       insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
4175 
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))
4181           {
4182             if ((insn & 0xff00) == 0xbd00)  /* pop <registers, PC> */
4183               found_return = 1;
4184           }
4185       else if (thumb_insn_size (insn) == 4)  /* 32-bit Thumb-2 instruction */
4186           {
4187             if (target_read_memory (scan_pc, buf, 2))
4188               break;
4189 
4190             scan_pc += 2;
4191             insn2 = extract_unsigned_integer (buf, 2, byte_order_for_code);
4192 
4193             if (insn == 0xe8bd)  /* ldm.w sp!, <registers> */
4194               {
4195                 if (insn2 & 0x8000)  /* <registers> include PC.  */
4196                     found_return = 1;
4197               }
4198             else if (insn == 0xf85d  /* ldr.w <Rt>, [sp], #4 */
4199                        && (insn2 & 0x0fff) == 0x0b04)
4200               {
4201                 if ((insn2 & 0xf000) == 0xf000) /* <Rt> is PC.  */
4202                     found_return = 1;
4203               }
4204             else if ((insn & 0xffbf) == 0xecbd  /* vldm sp!, <list> */
4205                        && (insn2 & 0x0e00) == 0x0a00)
4206               ;
4207             else
4208               break;
4209           }
4210       else
4211           break;
4212     }
4213 
4214   if (!found_return)
4215     return 0;
4216 
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.  */
4222 
4223   if (pc - 4 < func_start)
4224     return 0;
4225   if (target_read_memory (pc - 4, buf, 4))
4226     return 0;
4227 
4228   insn = extract_unsigned_integer (buf, 2, byte_order_for_code);
4229   insn2 = extract_unsigned_integer (buf + 2, 2, byte_order_for_code);
4230 
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;
4241 
4242   return found_stack_adjust;
4243 }
4244 
4245 static int
arm_stack_frame_destroyed_p_1(struct gdbarch * gdbarch,CORE_ADDR pc)4246 arm_stack_frame_destroyed_p_1 (struct gdbarch *gdbarch, CORE_ADDR pc)
4247 {
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;
4252 
4253   if (!find_pc_partial_function (pc, NULL, &func_start, &func_end))
4254     return 0;
4255 
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.  */
4261 
4262   found_return = 0;
4263   insn = read_memory_unsigned_integer (pc, 4, byte_order_for_code);
4264   if (bits (insn, 28, 31) != INST_NV)
4265     {
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;
4276     }
4277 
4278   if (!found_return)
4279     return 0;
4280 
4281   /* Scan backwards.  This is just a heuristic, so do not worry about
4282      false positives from mode changes.  */
4283 
4284   if (pc < func_start + 4)
4285     return 0;
4286 
4287   insn = read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code);
4288   if (arm_instruction_restores_sp (insn))
4289     return 1;
4290 
4291   return 0;
4292 }
4293 
4294 /* Implement the stack_frame_destroyed_p gdbarch method.  */
4295 
4296 static int
arm_stack_frame_destroyed_p(struct gdbarch * gdbarch,CORE_ADDR pc)4297 arm_stack_frame_destroyed_p (struct gdbarch *gdbarch, CORE_ADDR pc)
4298 {
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);
4303 }
4304 
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.  */
4307 
4308 struct arm_stack_item
4309 {
4310   int len;
4311   struct arm_stack_item *prev;
4312   gdb_byte *data;
4313 };
4314 
4315 static struct arm_stack_item *
push_stack_item(struct arm_stack_item * prev,const gdb_byte * contents,int len)4316 push_stack_item (struct arm_stack_item *prev, const gdb_byte *contents,
4317                      int len)
4318 {
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;
4326 }
4327 
4328 static struct arm_stack_item *
pop_stack_item(struct arm_stack_item * si)4329 pop_stack_item (struct arm_stack_item *si)
4330 {
4331   struct arm_stack_item *dead = si;
4332   si = si->prev;
4333   xfree (dead->data);
4334   xfree (dead);
4335   return si;
4336 }
4337 
4338 /* Implement the gdbarch type alignment method, overrides the generic
4339    alignment algorithm for anything that is arm specific.  */
4340 
4341 static ULONGEST
arm_type_align(gdbarch * gdbarch,struct type * t)4342 arm_type_align (gdbarch *gdbarch, struct type *t)
4343 {
4344   t = check_typedef (t);
4345   if (t->code () == TYPE_CODE_ARRAY && t->is_vector ())
4346     {
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 ();
4353     }
4354 
4355   /* Allow the common code to calculate the alignment.  */
4356   return 0;
4357 }
4358 
4359 /* Possible base types for a candidate for passing and returning in
4360    VFP registers.  */
4361 
4362 enum arm_vfp_cprc_base_type
4363 {
4364   VFP_CPRC_UNKNOWN,
4365   VFP_CPRC_SINGLE,
4366   VFP_CPRC_DOUBLE,
4367   VFP_CPRC_VEC64,
4368   VFP_CPRC_VEC128
4369 };
4370 
4371 /* The length of one element of base type B.  */
4372 
4373 static unsigned
arm_vfp_cprc_unit_length(enum arm_vfp_cprc_base_type b)4374 arm_vfp_cprc_unit_length (enum arm_vfp_cprc_base_type b)
4375 {
4376   switch (b)
4377     {
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);
4389     }
4390 }
4391 
4392 /* The character ('s', 'd' or 'q') for the type of VFP register used
4393    for passing base type B.  */
4394 
4395 static int
arm_vfp_cprc_reg_char(enum arm_vfp_cprc_base_type b)4396 arm_vfp_cprc_reg_char (enum arm_vfp_cprc_base_type b)
4397 {
4398   switch (b)
4399     {
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);
4411     }
4412 }
4413 
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.  */
4426 
4427 static int
arm_vfp_cprc_sub_candidate(struct type * t,enum arm_vfp_cprc_base_type * base_type)4428 arm_vfp_cprc_sub_candidate (struct type *t,
4429                                   enum arm_vfp_cprc_base_type *base_type)
4430 {
4431   t = check_typedef (t);
4432   switch (t->code ())
4433     {
4434     case TYPE_CODE_FLT:
4435       switch (t->length ())
4436           {
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;
4443 
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;
4450 
4451           default:
4452             return -1;
4453           }
4454       break;
4455 
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:
4459 
4460            struct complexT
4461            {
4462              T real;
4463              T imag;
4464            };
4465 
4466       */
4467       switch (t->length ())
4468           {
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;
4475 
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;
4482 
4483           default:
4484             return -1;
4485           }
4486       break;
4487 
4488     case TYPE_CODE_ARRAY:
4489       {
4490           if (t->is_vector ())
4491             {
4492               /* A 64-bit or 128-bit containerized vector type are VFP
4493                  CPRCs.  */
4494               switch (t->length ())
4495                 {
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;
4506                 }
4507             }
4508           else
4509             {
4510               int count;
4511               unsigned unitlen;
4512 
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)
4518                 {
4519                     gdb_assert (count == 0);
4520                     return 0;
4521                 }
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;
4527             }
4528       }
4529       break;
4530 
4531     case TYPE_CODE_STRUCT:
4532       {
4533           int count = 0;
4534           unsigned unitlen;
4535           int i;
4536           for (i = 0; i < t->num_fields (); i++)
4537             {
4538               int sub_count = 0;
4539 
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;
4546             }
4547           if (t->length () == 0)
4548             {
4549               gdb_assert (count == 0);
4550               return 0;
4551             }
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;
4558       }
4559 
4560     case TYPE_CODE_UNION:
4561       {
4562           int count = 0;
4563           unsigned unitlen;
4564           int i;
4565           for (i = 0; i < t->num_fields (); i++)
4566             {
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);
4572             }
4573           if (t->length () == 0)
4574             {
4575               gdb_assert (count == 0);
4576               return 0;
4577             }
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;
4584       }
4585 
4586     default:
4587       break;
4588     }
4589 
4590   return -1;
4591 }
4592 
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.  */
4598 
4599 static int
arm_vfp_call_candidate(struct type * t,enum arm_vfp_cprc_base_type * base_type,int * count)4600 arm_vfp_call_candidate (struct type *t, enum arm_vfp_cprc_base_type *base_type,
4601                               int *count)
4602 {
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;
4610 }
4611 
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.  */
4615 
4616 static int
arm_vfp_abi_for_function(struct gdbarch * gdbarch,struct type * func_type)4617 arm_vfp_abi_for_function (struct gdbarch *gdbarch, struct type *func_type)
4618 {
4619   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4620 
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;
4625 
4626   /* The VFP ABI is only supported as a variant of AAPCS.  */
4627   if (tdep->arm_abi != ARM_ABI_AAPCS)
4628     return 0;
4629 
4630   return tdep->fp_model == ARM_FLOAT_VFP;
4631 }
4632 
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.  */
4637 
4638 static CORE_ADDR
arm_push_dummy_call(struct gdbarch * gdbarch,struct value * function,struct regcache * regcache,CORE_ADDR bp_addr,int nargs,struct value ** args,CORE_ADDR sp,function_call_return_method return_method,CORE_ADDR struct_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)
4644 {
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);
4654 
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);
4661 
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);
4667 
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;
4672 
4673   argreg = ARM_A1_REGNUM;
4674   nstack = 0;
4675 
4676   /* The struct_return pointer occupies the first parameter
4677      passing register.  */
4678   if (return_method == return_method_struct)
4679     {
4680       arm_debug_printf ("struct return in %s = %s",
4681                               gdbarch_register_name (gdbarch, argreg),
4682                               paddress (gdbarch, struct_addr));
4683 
4684       regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
4685       argreg++;
4686     }
4687 
4688   for (argnum = 0; argnum < nargs; argnum++)
4689     {
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;
4699 
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 ();
4705 
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)
4712           {
4713             /* The APCS ABI only requires word alignment.  */
4714             align = ARM_INT_REGISTER_SIZE;
4715           }
4716       else
4717           {
4718             /* The AAPCS requires at most doubleword alignment.  */
4719             if (align > ARM_INT_REGISTER_SIZE * 2)
4720               align = ARM_INT_REGISTER_SIZE * 2;
4721           }
4722 
4723       if (use_vfp_abi
4724             && arm_vfp_call_candidate (arg_type, &vfp_base_type,
4725                                              &vfp_base_count))
4726           {
4727             int regno;
4728             int unit_length;
4729             int shift;
4730             unsigned mask;
4731 
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;
4739 
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;
4746 
4747             if (regno < 16)
4748               {
4749                 int reg_char;
4750                 int reg_scaled;
4751                 int i;
4752 
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++)
4757                     {
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
4764                         {
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);
4770                         }
4771                     }
4772                 continue;
4773               }
4774             else
4775               {
4776                 /* This CPRC could not go in VFP registers, so all VFP
4777                      registers are now marked as used.  */
4778                 vfp_regs_free = 0;
4779               }
4780           }
4781 
4782       /* Push stack padding for doubleword alignment.  */
4783       if (nstack & (align - 1))
4784           {
4785             si = push_stack_item (si, val, ARM_INT_REGISTER_SIZE);
4786             nstack += ARM_INT_REGISTER_SIZE;
4787           }
4788 
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++;
4795 
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 ())
4802           {
4803             CORE_ADDR regval = extract_unsigned_integer (val, len, byte_order);
4804             if (arm_pc_is_thumb (gdbarch, regval))
4805               {
4806                 bfd_byte *copy = (bfd_byte *) alloca (len);
4807                 store_unsigned_integer (copy, len, byte_order,
4808                                               MAKE_THUMB_ADDR (regval));
4809                 val = copy;
4810               }
4811           }
4812 
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)
4817           {
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);
4822 
4823             if (may_use_core_reg && argreg <= ARM_LAST_ARG_REGNUM)
4824               {
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));
4830 
4831                 regcache_cooked_write_unsigned (regcache, argreg, regval);
4832                 argreg++;
4833               }
4834             else
4835               {
4836                 gdb_byte buf[ARM_INT_REGISTER_SIZE];
4837 
4838                 memset (buf, 0, sizeof (buf));
4839                 store_unsigned_integer (buf, partial_len, byte_order, regval);
4840 
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;
4845               }
4846 
4847             len -= partial_len;
4848             val += partial_len;
4849           }
4850     }
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;
4855 
4856   while (si)
4857     {
4858       sp -= si->len;
4859       write_memory (sp, si->data, si->len);
4860       si = pop_stack_item (si);
4861     }
4862 
4863   /* Finally, update teh SP register.  */
4864   regcache_cooked_write_unsigned (regcache, ARM_SP_REGNUM, sp);
4865 
4866   return sp;
4867 }
4868 
4869 
4870 /* Always align the frame to an 8-byte boundary.  This is required on
4871    some platforms and harmless on the rest.  */
4872 
4873 static CORE_ADDR
arm_frame_align(struct gdbarch * gdbarch,CORE_ADDR sp)4874 arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
4875 {
4876   /* Align the stack to eight bytes.  */
4877   return sp & ~ (CORE_ADDR) 7;
4878 }
4879 
4880 static void
print_fpu_flags(struct ui_file * file,int flags)4881 print_fpu_flags (struct ui_file *file, int flags)
4882 {
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);
4894 }
4895 
4896 /* Print interesting information about the floating point processor
4897    (if present) or emulator.  */
4898 static void
arm_print_float_info(struct gdbarch * gdbarch,struct ui_file * file,const frame_info_ptr & frame,const char * args)4899 arm_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
4900                           const frame_info_ptr &frame, const char *args)
4901 {
4902   unsigned long status = get_frame_register_unsigned (frame, ARM_FPS_REGNUM);
4903   int type;
4904 
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);
4916 }
4917 
4918 /* Construct the ARM extended floating point type.  */
4919 static struct type *
arm_ext_type(struct gdbarch * gdbarch)4920 arm_ext_type (struct gdbarch *gdbarch)
4921 {
4922   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4923 
4924   if (!tdep->arm_ext_type)
4925     {
4926       type_allocator alloc (gdbarch);
4927       tdep->arm_ext_type
4928           = init_float_type (alloc, -1, "builtin_type_arm_ext",
4929                                  floatformats_arm_ext);
4930     }
4931 
4932   return tdep->arm_ext_type;
4933 }
4934 
4935 static struct type *
arm_neon_double_type(struct gdbarch * gdbarch)4936 arm_neon_double_type (struct gdbarch *gdbarch)
4937 {
4938   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4939 
4940   if (tdep->neon_double_type == NULL)
4941     {
4942       struct type *t, *elem;
4943 
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);
4958 
4959       t->set_is_vector (true);
4960       t->set_name ("neon_d");
4961       tdep->neon_double_type = t;
4962     }
4963 
4964   return tdep->neon_double_type;
4965 }
4966 
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.  */
4973 
4974 static struct type *
arm_neon_quad_type(struct gdbarch * gdbarch)4975 arm_neon_quad_type (struct gdbarch *gdbarch)
4976 {
4977   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
4978 
4979   if (tdep->neon_quad_type == NULL)
4980     {
4981       struct type *t, *elem;
4982 
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));
4997 
4998       t->set_is_vector (true);
4999       t->set_name ("neon_q");
5000       tdep->neon_quad_type = t;
5001     }
5002 
5003   return tdep->neon_quad_type;
5004 }
5005 
5006 /* Return true if REGNUM is a Q pseudo register.  Return false
5007    otherwise.
5008 
5009    REGNUM is the raw register number and not a pseudo-relative register
5010    number.  */
5011 
5012 static bool
is_q_pseudo(struct gdbarch * gdbarch,int regnum)5013 is_q_pseudo (struct gdbarch *gdbarch, int regnum)
5014 {
5015   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5016 
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;
5023 
5024   return false;
5025 }
5026 
5027 /* Return true if REGNUM is a VFP S pseudo register.  Return false
5028    otherwise.
5029 
5030    REGNUM is the raw register number and not a pseudo-relative register
5031    number.  */
5032 
5033 static bool
is_s_pseudo(struct gdbarch * gdbarch,int regnum)5034 is_s_pseudo (struct gdbarch *gdbarch, int regnum)
5035 {
5036   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5037 
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;
5042 
5043   return false;
5044 }
5045 
5046 /* Return true if REGNUM is a MVE pseudo register (P0).  Return false
5047    otherwise.
5048 
5049    REGNUM is the raw register number and not a pseudo-relative register
5050    number.  */
5051 
5052 static bool
is_mve_pseudo(struct gdbarch * gdbarch,int regnum)5053 is_mve_pseudo (struct gdbarch *gdbarch, int regnum)
5054 {
5055   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5056 
5057   if (tdep->have_mve
5058       && regnum >= tdep->mve_pseudo_base
5059       && regnum < tdep->mve_pseudo_base + tdep->mve_pseudo_count)
5060     return true;
5061 
5062   return false;
5063 }
5064 
5065 /* Return true if REGNUM is a PACBTI pseudo register (ra_auth_code).  Return
5066    false otherwise.
5067 
5068    REGNUM is the raw register number and not a pseudo-relative register
5069    number.  */
5070 
5071 static bool
is_pacbti_pseudo(struct gdbarch * gdbarch,int regnum)5072 is_pacbti_pseudo (struct gdbarch *gdbarch, int regnum)
5073 {
5074   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5075 
5076   if (tdep->have_pacbti
5077       && regnum >= tdep->pacbti_pseudo_base
5078       && regnum < tdep->pacbti_pseudo_base + tdep->pacbti_pseudo_count)
5079     return true;
5080 
5081   return false;
5082 }
5083 
5084 /* Return the GDB type object for the "standard" data type of data in
5085    register N.  */
5086 
5087 static struct type *
arm_register_type(struct gdbarch * gdbarch,int regnum)5088 arm_register_type (struct gdbarch *gdbarch, int regnum)
5089 {
5090   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5091 
5092   if (is_s_pseudo (gdbarch, regnum))
5093     return builtin_type (gdbarch)->builtin_float;
5094 
5095   if (is_q_pseudo (gdbarch, regnum))
5096     return arm_neon_quad_type (gdbarch);
5097 
5098   if (is_mve_pseudo (gdbarch, regnum))
5099     return builtin_type (gdbarch)->builtin_int16;
5100 
5101   if (is_pacbti_pseudo (gdbarch, regnum))
5102     return builtin_type (gdbarch)->builtin_uint32;
5103 
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)))
5108     {
5109       struct type *t = tdesc_register_type (gdbarch, regnum);
5110 
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;
5117     }
5118 
5119   if (regnum >= ARM_F0_REGNUM && regnum < ARM_F0_REGNUM + NUM_FREGS)
5120     {
5121       if (!tdep->have_fpa_registers)
5122           return builtin_type (gdbarch)->builtin_void;
5123 
5124       return arm_ext_type (gdbarch);
5125     }
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;
5136 }
5137 
5138 /* Map a DWARF register REGNUM onto the appropriate GDB register
5139    number.  */
5140 
5141 static int
arm_dwarf_reg_to_regnum(struct gdbarch * gdbarch,int reg)5142 arm_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
5143 {
5144   /* Core integer regs.  */
5145   if (reg >= 0 && reg <= 15)
5146     return reg;
5147 
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;
5154 
5155   /* New assignments for the FPA registers.  */
5156   if (reg >= 96 && reg <= 103)
5157     return ARM_F0_REGNUM + reg - 96;
5158 
5159   /* WMMX register assignments.  */
5160   if (reg >= 104 && reg <= 111)
5161     return ARM_WCGR0_REGNUM + reg - 104;
5162 
5163   if (reg >= 112 && reg <= 127)
5164     return ARM_WR0_REGNUM + reg - 112;
5165 
5166   /* PACBTI register containing the Pointer Authentication Code.  */
5167   if (reg == ARM_DWARF_RA_AUTH_CODE)
5168     {
5169       arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5170 
5171       if (tdep->have_pacbti)
5172           return tdep->pacbti_pseudo_base;
5173 
5174       return -1;
5175     }
5176 
5177   if (reg >= 192 && reg <= 199)
5178     return ARM_WC0_REGNUM + reg - 192;
5179 
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)
5189     {
5190       char name_buf[4];
5191 
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));
5195     }
5196 
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)
5200     {
5201       char name_buf[4];
5202 
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));
5206     }
5207 
5208   return -1;
5209 }
5210 
5211 /* Map GDB internal REGNUM onto the Arm simulator register numbers.  */
5212 static int
arm_register_sim_regno(struct gdbarch * gdbarch,int regnum)5213 arm_register_sim_regno (struct gdbarch *gdbarch, int regnum)
5214 {
5215   int reg = regnum;
5216   gdb_assert (reg >= 0 && reg < gdbarch_num_regs (gdbarch));
5217 
5218   if (regnum >= ARM_WR0_REGNUM && regnum <= ARM_WR15_REGNUM)
5219     return regnum - ARM_WR0_REGNUM + SIM_ARM_IWMMXT_COP0R0_REGNUM;
5220 
5221   if (regnum >= ARM_WC0_REGNUM && regnum <= ARM_WC7_REGNUM)
5222     return regnum - ARM_WC0_REGNUM + SIM_ARM_IWMMXT_COP1R0_REGNUM;
5223 
5224   if (regnum >= ARM_WCGR0_REGNUM && regnum <= ARM_WCGR7_REGNUM)
5225     return regnum - ARM_WCGR0_REGNUM + SIM_ARM_IWMMXT_COP1R8_REGNUM;
5226 
5227   if (reg < NUM_GREGS)
5228     return SIM_ARM_R0_REGNUM + reg;
5229   reg -= NUM_GREGS;
5230 
5231   if (reg < NUM_FREGS)
5232     return SIM_ARM_FP0_REGNUM + reg;
5233   reg -= NUM_FREGS;
5234 
5235   if (reg < NUM_SREGS)
5236     return SIM_ARM_FPS_REGNUM + reg;
5237   reg -= NUM_SREGS;
5238 
5239   internal_error (_("Bad REGNUM %d"), regnum);
5240 }
5241 
5242 static const unsigned char op_lit0 = DW_OP_lit0;
5243 
5244 static void
arm_dwarf2_frame_init_reg(struct gdbarch * gdbarch,int regnum,struct dwarf2_frame_state_reg * reg,const frame_info_ptr & this_frame)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)
5248 {
5249   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
5250 
5251   if (is_pacbti_pseudo (gdbarch, regnum))
5252     {
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;
5258     }
5259 
5260   if (regnum == ARM_PC_REGNUM || regnum == ARM_PS_REGNUM)
5261     {
5262       reg->how = DWARF2_FRAME_REG_FN;
5263       reg->loc.fn = arm_dwarf2_prev_register;
5264     }
5265   else if (regnum == ARM_SP_REGNUM)
5266     reg->how = DWARF2_FRAME_REG_CFA;
5267   else if (arm_is_alternative_sp_register (tdep, regnum))
5268     {
5269       /* Handle the alternative SP registers on Cortex-M.  */
5270       reg->how = DWARF2_FRAME_REG_FN;
5271       reg->loc.fn = arm_dwarf2_prev_register;
5272     }
5273 }
5274 
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.  */
5278 
5279 static gdb_byte *
extend_buffer_earlier(gdb_byte * buf,CORE_ADDR endaddr,int old_len,int new_len)5280 extend_buffer_earlier (gdb_byte *buf, CORE_ADDR endaddr,
5281                            int old_len, int new_len)
5282 {
5283   gdb_byte *new_buf;
5284   int bytes_to_read = new_len - old_len;
5285 
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)
5290     {
5291       xfree (new_buf);
5292       return NULL;
5293     }
5294   return new_buf;
5295 }
5296 
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
5302 
5303 /* Use a quick scan if there are more than this many bytes of
5304    code.  */
5305 #define IT_SCAN_THRESHOLD 32
5306 
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
arm_adjust_breakpoint_address(struct gdbarch * gdbarch,CORE_ADDR bpaddr)5311 arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr)
5312 {
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);
5320 
5321   /* If we are using BKPT breakpoints, none of this is necessary.  */
5322   if (tdep->thumb2_breakpoint == NULL)
5323     return bpaddr;
5324 
5325   /* ARM mode does not have this problem.  */
5326   if (!arm_pc_is_thumb (gdbarch, bpaddr))
5327     return bpaddr;
5328 
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;
5337 
5338   bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr);
5339 
5340   if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL))
5341     {
5342       func_start = gdbarch_addr_bits_remove (gdbarch, func_start);
5343       if (func_start > boundary)
5344           boundary = func_start;
5345     }
5346 
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;
5355 
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)
5361     {
5362       unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5363       if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5364           {
5365             any = 1;
5366             break;
5367           }
5368     }
5369 
5370   if (any == 0)
5371     {
5372       xfree (buf);
5373       return bpaddr;
5374     }
5375 
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)
5383     {
5384       int definite;
5385 
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;
5394 
5395       definite = 0;
5396       for (i = 0; i < buf_len - sizeof (buf) && ! definite; i += 2)
5397           {
5398             unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5399             if (thumb_insn_size (inst1) == 2)
5400               {
5401                 definite = 1;
5402                 break;
5403               }
5404           }
5405 
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)
5412           {
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;
5419           }
5420     }
5421   else
5422     {
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;
5428     }
5429 
5430   /* Scan forwards.  Find the last IT instruction before BPADDR.  */
5431   last_it = -1;
5432   last_it_count = 0;
5433   while (i < buf_len)
5434     {
5435       unsigned short inst1 = extract_unsigned_integer (&buf[i], 2, order);
5436       last_it_count--;
5437       if ((inst1 & 0xff00) == 0xbf00 && (inst1 & 0x000f) != 0)
5438           {
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;
5448           }
5449       i += thumb_insn_size (inst1);
5450     }
5451 
5452   xfree (buf);
5453 
5454   if (last_it == -1)
5455     /* There wasn't really an IT instruction after all.  */
5456     return bpaddr;
5457 
5458   if (last_it_count < 1)
5459     /* It was too far away.  */
5460     return bpaddr;
5461 
5462   /* This really is a trouble spot.  Move the breakpoint to the IT
5463      instruction.  */
5464   return bpaddr - buf_len + last_it;
5465 }
5466 
5467 /* ARM displaced stepping support.
5468 
5469    Generally ARM displaced stepping works as follows:
5470 
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.
5478 
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.
5482 
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.  */
5487 
5488 /* NOP instruction (mov r0, r0).  */
5489 #define ARM_NOP                                   0xe1a00000
5490 #define THUMB_NOP 0x4600
5491 
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.  */
5495 
5496 ULONGEST
displaced_read_reg(regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int regno)5497 displaced_read_reg (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5498                         int regno)
5499 {
5500   ULONGEST ret;
5501   CORE_ADDR from = dsc->insn_addr;
5502 
5503   if (regno == ARM_PC_REGNUM)
5504     {
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.  */
5510 
5511       if (!dsc->is_thumb)
5512           from += 8;
5513       else
5514           from += 4;
5515 
5516       displaced_debug_printf ("read pc value %.8lx",
5517                                     (unsigned long) from);
5518       return (ULONGEST) from;
5519     }
5520   else
5521     {
5522       regcache_cooked_read_unsigned (regs, regno, &ret);
5523 
5524       displaced_debug_printf ("read r%d value %.8lx",
5525                                     regno, (unsigned long) ret);
5526 
5527       return ret;
5528     }
5529 }
5530 
5531 static int
displaced_in_arm_mode(struct regcache * regs)5532 displaced_in_arm_mode (struct regcache *regs)
5533 {
5534   ULONGEST ps;
5535   ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
5536 
5537   regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5538 
5539   return (ps & t_bit) == 0;
5540 }
5541 
5542 /* Write to the PC as from a branch instruction.  */
5543 
5544 static void
branch_write_pc(regcache * regs,arm_displaced_step_copy_insn_closure * dsc,ULONGEST val)5545 branch_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5546                      ULONGEST val)
5547 {
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);
5556 }
5557 
5558 /* Write to the PC as from a branch-exchange instruction.  */
5559 
5560 static void
bx_write_pc(struct regcache * regs,ULONGEST val)5561 bx_write_pc (struct regcache *regs, ULONGEST val)
5562 {
5563   ULONGEST ps;
5564   ULONGEST t_bit = arm_psr_thumb_bit (regs->arch ());
5565 
5566   regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &ps);
5567 
5568   if ((val & 1) == 1)
5569     {
5570       regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps | t_bit);
5571       regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffe);
5572     }
5573   else if ((val & 2) == 0)
5574     {
5575       regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
5576       regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val);
5577     }
5578   else
5579     {
5580       /* Unpredictable behaviour.  Try to do something sensible (switch to ARM
5581             mode, align dest to 4 bytes).  */
5582       warning (_("Single-stepping BX to non-word-aligned ARM instruction."));
5583       regcache_cooked_write_unsigned (regs, ARM_PS_REGNUM, ps & ~t_bit);
5584       regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM, val & 0xfffffffc);
5585     }
5586 }
5587 
5588 /* Write to the PC as if from a load instruction.  */
5589 
5590 static void
load_write_pc(regcache * regs,arm_displaced_step_copy_insn_closure * dsc,ULONGEST val)5591 load_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5592                  ULONGEST val)
5593 {
5594   if (DISPLACED_STEPPING_ARCH_VERSION >= 5)
5595     bx_write_pc (regs, val);
5596   else
5597     branch_write_pc (regs, dsc, val);
5598 }
5599 
5600 /* Write to the PC as if from an ALU instruction.  */
5601 
5602 static void
alu_write_pc(regcache * regs,arm_displaced_step_copy_insn_closure * dsc,ULONGEST val)5603 alu_write_pc (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5604                 ULONGEST val)
5605 {
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);
5610 }
5611 
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.  */
5615 
5616 void
displaced_write_reg(regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int regno,ULONGEST val,enum pc_write_style write_pc)5617 displaced_write_reg (regcache *regs, arm_displaced_step_copy_insn_closure *dsc,
5618                          int regno, ULONGEST val, enum pc_write_style write_pc)
5619 {
5620   if (regno == ARM_PC_REGNUM)
5621     {
5622       displaced_debug_printf ("writing pc %.8lx", (unsigned long) val);
5623 
5624       switch (write_pc)
5625           {
5626           case BRANCH_WRITE_PC:
5627             branch_write_pc (regs, dsc, val);
5628             break;
5629 
5630           case BX_WRITE_PC:
5631             bx_write_pc (regs, val);
5632             break;
5633 
5634           case LOAD_WRITE_PC:
5635             load_write_pc (regs, dsc, val);
5636             break;
5637 
5638           case ALU_WRITE_PC:
5639             alu_write_pc (regs, dsc, val);
5640             break;
5641 
5642           case CANNOT_WRITE_PC:
5643             warning (_("Instruction wrote to PC in an unexpected way when "
5644                          "single-stepping"));
5645             break;
5646 
5647           default:
5648             internal_error (_("Invalid argument to displaced_write_reg"));
5649           }
5650 
5651       dsc->wrote_to_pc = 1;
5652     }
5653   else
5654     {
5655       displaced_debug_printf ("writing r%d value %.8lx",
5656                                     regno, (unsigned long) val);
5657       regcache_cooked_write_unsigned (regs, regno, val);
5658     }
5659 }
5660 
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.  */
5666 
5667 static int
insn_references_pc(uint32_t insn,uint32_t bitmask)5668 insn_references_pc (uint32_t insn, uint32_t bitmask)
5669 {
5670   uint32_t lowbit = 1;
5671 
5672   while (bitmask != 0)
5673     {
5674       uint32_t mask;
5675 
5676       for (; lowbit && (bitmask & lowbit) == 0; lowbit <<= 1)
5677           ;
5678 
5679       if (!lowbit)
5680           break;
5681 
5682       mask = lowbit * 0xf;
5683 
5684       if ((insn & mask) == mask)
5685           return 1;
5686 
5687       bitmask &= ~mask;
5688     }
5689 
5690   return 0;
5691 }
5692 
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.  */
5695 
5696 static int
arm_copy_unmodified(struct gdbarch * gdbarch,uint32_t insn,const char * iname,arm_displaced_step_copy_insn_closure * dsc)5697 arm_copy_unmodified (struct gdbarch *gdbarch, uint32_t insn, const char *iname,
5698                          arm_displaced_step_copy_insn_closure *dsc)
5699 {
5700   displaced_debug_printf ("copying insn %.8lx, opcode/class '%s' unmodified",
5701                                 (unsigned long) insn, iname);
5702 
5703   dsc->modinsn[0] = insn;
5704 
5705   return 0;
5706 }
5707 
5708 static int
thumb_copy_unmodified_32bit(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,const char * iname,arm_displaced_step_copy_insn_closure * dsc)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)
5712 {
5713   displaced_debug_printf ("copying insn %.4x %.4x, opcode/class '%s' "
5714                                 "unmodified", insn1, insn2, iname);
5715 
5716   dsc->modinsn[0] = insn1;
5717   dsc->modinsn[1] = insn2;
5718   dsc->numinsns = 2;
5719 
5720   return 0;
5721 }
5722 
5723 /* Copy 16-bit Thumb(Thumb and 16-bit Thumb-2) instruction without any
5724    modification.  */
5725 static int
thumb_copy_unmodified_16bit(struct gdbarch * gdbarch,uint16_t insn,const char * iname,arm_displaced_step_copy_insn_closure * dsc)5726 thumb_copy_unmodified_16bit (struct gdbarch *gdbarch, uint16_t insn,
5727                                    const char *iname,
5728                                    arm_displaced_step_copy_insn_closure *dsc)
5729 {
5730   displaced_debug_printf ("copying insn %.4x, opcode/class '%s' unmodified",
5731                                 insn, iname);
5732 
5733   dsc->modinsn[0] = insn;
5734 
5735   return 0;
5736 }
5737 
5738 /* Preload instructions with immediate offset.  */
5739 
5740 static void
cleanup_preload(struct gdbarch * gdbarch,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5741 cleanup_preload (struct gdbarch *gdbarch, regcache *regs,
5742                      arm_displaced_step_copy_insn_closure *dsc)
5743 {
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);
5747 }
5748 
5749 static void
install_preload(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,unsigned int rn)5750 install_preload (struct gdbarch *gdbarch, struct regcache *regs,
5751                      arm_displaced_step_copy_insn_closure *dsc, unsigned int rn)
5752 {
5753   ULONGEST rn_val;
5754   /* Preload instructions:
5755 
5756      {pli/pld} [rn, #+/-imm]
5757      ->
5758      {pli/pld} [r0, #+/-imm].  */
5759 
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;
5764 
5765   dsc->cleanup = &cleanup_preload;
5766 }
5767 
5768 static int
arm_copy_preload(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5769 arm_copy_preload (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
5770                       arm_displaced_step_copy_insn_closure *dsc)
5771 {
5772   unsigned int rn = bits (insn, 16, 19);
5773 
5774   if (!insn_references_pc (insn, 0x000f0000ul))
5775     return arm_copy_unmodified (gdbarch, insn, "preload", dsc);
5776 
5777   displaced_debug_printf ("copying preload insn %.8lx", (unsigned long) insn);
5778 
5779   dsc->modinsn[0] = insn & 0xfff0ffff;
5780 
5781   install_preload (gdbarch, regs, dsc, rn);
5782 
5783   return 0;
5784 }
5785 
5786 static int
thumb2_copy_preload(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5787 thumb2_copy_preload (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
5788                          regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
5789 {
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;
5794 
5795   if (rn != ARM_PC_REGNUM)
5796     return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "preload", dsc);
5797 
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);
5803 
5804   if (!u_bit)
5805     imm12 = -1 * imm12;
5806 
5807   /* Rewrite instruction {pli/pld} PC imm12 into:
5808      Prepare: tmp[0] <- r0, tmp[1] <- r1, r0 <- pc, r1 <- imm12
5809 
5810      {pli/pld} [r0, r1]
5811 
5812      Cleanup: r0 <- tmp[0], r1 <- tmp[1].  */
5813 
5814   dsc->tmp[0] = displaced_read_reg (regs, dsc, 0);
5815   dsc->tmp[1] = displaced_read_reg (regs, dsc, 1);
5816 
5817   pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
5818 
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;
5822 
5823   /* {pli/pld} [r0, r1] */
5824   dsc->modinsn[0] = insn1 & 0xfff0;
5825   dsc->modinsn[1] = 0xf001;
5826   dsc->numinsns = 2;
5827 
5828   dsc->cleanup = &cleanup_preload;
5829   return 0;
5830 }
5831 
5832 /* Preload instructions with register offset.  */
5833 
5834 static void
install_preload_reg(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,unsigned int rn,unsigned int rm)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)
5838 {
5839   ULONGEST rn_val, rm_val;
5840 
5841   /* Preload register-offset instructions:
5842 
5843      {pli/pld} [rn, rm {, shift}]
5844      ->
5845      {pli/pld} [r0, r1 {, shift}].  */
5846 
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;
5854 
5855   dsc->cleanup = &cleanup_preload;
5856 }
5857 
5858 static int
arm_copy_preload_reg(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5859 arm_copy_preload_reg (struct gdbarch *gdbarch, uint32_t insn,
5860                           struct regcache *regs,
5861                           arm_displaced_step_copy_insn_closure *dsc)
5862 {
5863   unsigned int rn = bits (insn, 16, 19);
5864   unsigned int rm = bits (insn, 0, 3);
5865 
5866 
5867   if (!insn_references_pc (insn, 0x000f000ful))
5868     return arm_copy_unmodified (gdbarch, insn, "preload reg", dsc);
5869 
5870   displaced_debug_printf ("copying preload insn %.8lx",
5871                                 (unsigned long) insn);
5872 
5873   dsc->modinsn[0] = (insn & 0xfff0fff0) | 0x1;
5874 
5875   install_preload_reg (gdbarch, regs, dsc, rn, rm);
5876   return 0;
5877 }
5878 
5879 /* Copy/cleanup coprocessor load and store instructions.  */
5880 
5881 static void
cleanup_copro_load_store(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5882 cleanup_copro_load_store (struct gdbarch *gdbarch,
5883                                 struct regcache *regs,
5884                                 arm_displaced_step_copy_insn_closure *dsc)
5885 {
5886   ULONGEST rn_val = displaced_read_reg (regs, dsc, 0);
5887 
5888   displaced_write_reg (regs, dsc, 0, dsc->tmp[0], CANNOT_WRITE_PC);
5889 
5890   if (dsc->u.ldst.writeback)
5891     displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, LOAD_WRITE_PC);
5892 }
5893 
5894 static void
install_copro_load_store(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int writeback,unsigned int rn)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)
5898 {
5899   ULONGEST rn_val;
5900 
5901   /* Coprocessor load/store instructions:
5902 
5903      {stc/stc2} [<Rn>, #+/-imm]  (and other immediate addressing modes)
5904      ->
5905      {stc/stc2} [r0, #+/-imm].
5906 
5907      ldc/ldc2 are handled identically.  */
5908 
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);
5914 
5915   dsc->u.ldst.writeback = writeback;
5916   dsc->u.ldst.rn = rn;
5917 
5918   dsc->cleanup = &cleanup_copro_load_store;
5919 }
5920 
5921 static int
arm_copy_copro_load_store(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5922 arm_copy_copro_load_store (struct gdbarch *gdbarch, uint32_t insn,
5923                                  struct regcache *regs,
5924                                  arm_displaced_step_copy_insn_closure *dsc)
5925 {
5926   unsigned int rn = bits (insn, 16, 19);
5927 
5928   if (!insn_references_pc (insn, 0x000f0000ul))
5929     return arm_copy_unmodified (gdbarch, insn, "copro load/store", dsc);
5930 
5931   displaced_debug_printf ("copying coprocessor load/store insn %.8lx",
5932                                 (unsigned long) insn);
5933 
5934   dsc->modinsn[0] = insn & 0xfff0ffff;
5935 
5936   install_copro_load_store (gdbarch, regs, dsc, bit (insn, 25), rn);
5937 
5938   return 0;
5939 }
5940 
5941 static int
thumb2_copy_copro_load_store(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
5945 {
5946   unsigned int rn = bits (insn1, 0, 3);
5947 
5948   if (rn != ARM_PC_REGNUM)
5949     return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
5950                                                   "copro load/store", dsc);
5951 
5952   displaced_debug_printf ("copying coprocessor load/store insn %.4x%.4x",
5953                                 insn1, insn2);
5954 
5955   dsc->modinsn[0] = insn1 & 0xfff0;
5956   dsc->modinsn[1] = insn2;
5957   dsc->numinsns = 2;
5958 
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);
5962 
5963   return 0;
5964 }
5965 
5966 /* Clean up branch instructions (actually perform the branch, by setting
5967    PC).  */
5968 
5969 static void
cleanup_branch(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)5970 cleanup_branch (struct gdbarch *gdbarch, struct regcache *regs,
5971                     arm_displaced_step_copy_insn_closure *dsc)
5972 {
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;
5977 
5978   if (!branch_taken)
5979     return;
5980 
5981   if (dsc->u.branch.link)
5982     {
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;
5987 
5988       if (dsc->is_thumb)
5989           next_insn_addr |= 0x1;
5990 
5991       displaced_write_reg (regs, dsc, ARM_LR_REGNUM, next_insn_addr,
5992                                  CANNOT_WRITE_PC);
5993     }
5994 
5995   displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->u.branch.dest, write_pc);
5996 }
5997 
5998 /* Copy B/BL/BLX instructions with immediate destinations.  */
5999 
6000 static void
install_b_bl_blx(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,unsigned int cond,int exchange,int link,long offset)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)
6004 {
6005   /* Implement "BL<cond> <label>" as:
6006 
6007      Preparation: cond <- instruction condition
6008      Insn: mov r0, r0  (nop)
6009      Cleanup: if (condition true) { r14 <- pc; pc <- label }.
6010 
6011      B<cond> similar, but don't set r14 in cleanup.  */
6012 
6013   dsc->u.branch.cond = cond;
6014   dsc->u.branch.link = link;
6015   dsc->u.branch.exchange = exchange;
6016 
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;
6021 
6022   if (dsc->is_thumb)
6023     dsc->u.branch.dest += 4 + offset;
6024   else
6025     dsc->u.branch.dest += 8 + offset;
6026 
6027   dsc->cleanup = &cleanup_branch;
6028 }
6029 static int
arm_copy_b_bl_blx(struct gdbarch * gdbarch,uint32_t insn,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6030 arm_copy_b_bl_blx (struct gdbarch *gdbarch, uint32_t insn,
6031                        regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6032 {
6033   unsigned int cond = bits (insn, 28, 31);
6034   int exchange = (cond == 0xf);
6035   int link = exchange || bit (insn, 24);
6036   long offset;
6037 
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;
6047 
6048   if (bit (offset, 25))
6049     offset = offset | ~0x3ffffff;
6050 
6051   dsc->modinsn[0] = ARM_NOP;
6052 
6053   install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
6054   return 0;
6055 }
6056 
6057 static int
thumb2_copy_b_bl_blx(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
6061 {
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));
6071 
6072   if (!link && !exchange) /* B */
6073     {
6074       offset = (bits (insn2, 0, 10) << 1);
6075       if (bit (insn2, 12)) /* Encoding T4 */
6076           {
6077             offset |= (bits (insn1, 0, 9) << 12)
6078               | (i2 << 22)
6079               | (i1 << 23)
6080               | (s << 24);
6081             cond = INST_AL;
6082           }
6083       else /* Encoding T3 */
6084           {
6085             offset |= (bits (insn1, 0, 5) << 12)
6086               | (j1 << 18)
6087               | (j2 << 19)
6088               | (s << 20);
6089             cond = bits (insn1, 6, 9);
6090           }
6091     }
6092   else
6093     {
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);
6098     }
6099 
6100   displaced_debug_printf ("copying %s insn %.4x %.4x with offset %.8lx",
6101                                 link ? (exchange) ? "blx" : "bl" : "b",
6102                                 insn1, insn2, offset);
6103 
6104   dsc->modinsn[0] = THUMB_NOP;
6105 
6106   install_b_bl_blx (gdbarch, regs, dsc, cond, exchange, link, offset);
6107   return 0;
6108 }
6109 
6110 /* Copy B Thumb instructions.  */
6111 static int
thumb_copy_b(struct gdbarch * gdbarch,uint16_t insn,arm_displaced_step_copy_insn_closure * dsc)6112 thumb_copy_b (struct gdbarch *gdbarch, uint16_t insn,
6113                 arm_displaced_step_copy_insn_closure *dsc)
6114 {
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;
6119 
6120   if (bit_12_15 == 0xd)
6121     {
6122       /* offset = SignExtend (imm8:0, 32) */
6123       offset = sbits ((insn << 1), 0, 8);
6124       cond = bits (insn, 8, 11);
6125     }
6126   else if (bit_12_15 == 0xe) /* Encoding T2 */
6127     {
6128       offset = sbits ((insn << 1), 0, 11);
6129       cond = INST_AL;
6130     }
6131 
6132   displaced_debug_printf ("copying b immediate insn %.4x with offset %d",
6133                                 insn, offset);
6134 
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;
6139 
6140   dsc->modinsn[0] = THUMB_NOP;
6141 
6142   dsc->cleanup = &cleanup_branch;
6143 
6144   return 0;
6145 }
6146 
6147 /* Copy BX/BLX with register-specified destinations.  */
6148 
6149 static void
install_bx_blx_reg(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int link,unsigned int cond,unsigned int rm)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)
6153 {
6154   /* Implement {BX,BLX}<cond> <reg>" as:
6155 
6156      Preparation: cond <- instruction condition
6157      Insn: mov r0, r0 (nop)
6158      Cleanup: if (condition true) { r14 <- pc; pc <- dest; }.
6159 
6160      Don't set r14 in cleanup for BX.  */
6161 
6162   dsc->u.branch.dest = displaced_read_reg (regs, dsc, rm);
6163 
6164   dsc->u.branch.cond = cond;
6165   dsc->u.branch.link = link;
6166 
6167   dsc->u.branch.exchange = 1;
6168 
6169   dsc->cleanup = &cleanup_branch;
6170 }
6171 
6172 static int
arm_copy_bx_blx_reg(struct gdbarch * gdbarch,uint32_t insn,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6173 arm_copy_bx_blx_reg (struct gdbarch *gdbarch, uint32_t insn,
6174                          regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6175 {
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);
6181 
6182   displaced_debug_printf ("copying insn %.8lx", (unsigned long) insn);
6183 
6184   dsc->modinsn[0] = ARM_NOP;
6185 
6186   install_bx_blx_reg (gdbarch, regs, dsc, link, cond, rm);
6187   return 0;
6188 }
6189 
6190 static int
thumb_copy_bx_blx_reg(struct gdbarch * gdbarch,uint16_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6191 thumb_copy_bx_blx_reg (struct gdbarch *gdbarch, uint16_t insn,
6192                            struct regcache *regs,
6193                            arm_displaced_step_copy_insn_closure *dsc)
6194 {
6195   int link = bit (insn, 7);
6196   unsigned int rm = bits (insn, 3, 6);
6197 
6198   displaced_debug_printf ("copying insn %.4x", (unsigned short) insn);
6199 
6200   dsc->modinsn[0] = THUMB_NOP;
6201 
6202   install_bx_blx_reg (gdbarch, regs, dsc, link, INST_AL, rm);
6203 
6204   return 0;
6205 }
6206 
6207 
6208 /* Copy/cleanup arithmetic/logic instruction with immediate RHS.  */
6209 
6210 static void
cleanup_alu_imm(struct gdbarch * gdbarch,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6211 cleanup_alu_imm (struct gdbarch *gdbarch,
6212                      regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6213 {
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);
6218 }
6219 
6220 static int
arm_copy_alu_imm(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6221 arm_copy_alu_imm (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6222                       arm_displaced_step_copy_insn_closure *dsc)
6223 {
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;
6229 
6230   if (!insn_references_pc (insn, 0x000ff000ul))
6231     return arm_copy_unmodified (gdbarch, insn, "ALU immediate", dsc);
6232 
6233   displaced_debug_printf ("copying immediate %s insn %.8lx",
6234                                 is_mov ? "move" : "ALU",
6235                                 (unsigned long) insn);
6236 
6237   /* Instruction is of form:
6238 
6239      <op><cond> rd, [rn,] #imm
6240 
6241      Rewrite as:
6242 
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
6247   */
6248 
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;
6256 
6257   if (is_mov)
6258     dsc->modinsn[0] = insn & 0xfff00fff;
6259   else
6260     dsc->modinsn[0] = (insn & 0xfff00fff) | 0x10000;
6261 
6262   dsc->cleanup = &cleanup_alu_imm;
6263 
6264   return 0;
6265 }
6266 
6267 static int
thumb2_copy_alu_imm(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
6271 {
6272   unsigned int op = bits (insn1, 5, 8);
6273   unsigned int rn, rm, rd;
6274   ULONGEST rd_val, rn_val;
6275 
6276   rn = bits (insn1, 0, 3); /* Rn */
6277   rm = bits (insn2, 0, 3); /* Rm */
6278   rd = bits (insn2, 8, 11); /* Rd */
6279 
6280   /* This routine is only called for instruction MOV.  */
6281   gdb_assert (op == 0x2 && rn == 0xf);
6282 
6283   if (rm != ARM_PC_REGNUM && rd != ARM_PC_REGNUM)
6284     return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "ALU imm", dsc);
6285 
6286   displaced_debug_printf ("copying reg %s insn %.4x%.4x", "ALU", insn1, insn2);
6287 
6288   /* Instruction is of form:
6289 
6290      <op><cond> rd, [rn,] #imm
6291 
6292      Rewrite as:
6293 
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
6298   */
6299 
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;
6307 
6308   dsc->modinsn[0] = insn1;
6309   dsc->modinsn[1] = ((insn2 & 0xf0f0) | 0x1);
6310   dsc->numinsns = 2;
6311 
6312   dsc->cleanup = &cleanup_alu_imm;
6313 
6314   return 0;
6315 }
6316 
6317 /* Copy/cleanup arithmetic/logic insns with register RHS.  */
6318 
6319 static void
cleanup_alu_reg(struct gdbarch * gdbarch,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6320 cleanup_alu_reg (struct gdbarch *gdbarch,
6321                      regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6322 {
6323   ULONGEST rd_val;
6324   int i;
6325 
6326   rd_val = displaced_read_reg (regs, dsc, 0);
6327 
6328   for (i = 0; i < 3; i++)
6329     displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6330 
6331   displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6332 }
6333 
6334 static void
install_alu_reg(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,unsigned int rd,unsigned int rn,unsigned int rm)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)
6338 {
6339   ULONGEST rd_val, rn_val, rm_val;
6340 
6341   /* Instruction is of form:
6342 
6343      <op><cond> rd, [rn,] rm [, <shift>]
6344 
6345      Rewrite as:
6346 
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
6351   */
6352 
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;
6363 
6364   dsc->cleanup = &cleanup_alu_reg;
6365 }
6366 
6367 static int
arm_copy_alu_reg(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6368 arm_copy_alu_reg (struct gdbarch *gdbarch, uint32_t insn, struct regcache *regs,
6369                       arm_displaced_step_copy_insn_closure *dsc)
6370 {
6371   unsigned int op = bits (insn, 21, 24);
6372   int is_mov = (op == 0xd);
6373 
6374   if (!insn_references_pc (insn, 0x000ff00ful))
6375     return arm_copy_unmodified (gdbarch, insn, "ALU reg", dsc);
6376 
6377   displaced_debug_printf ("copying reg %s insn %.8lx",
6378                                 is_mov ? "move" : "ALU", (unsigned long) insn);
6379 
6380   if (is_mov)
6381     dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x2;
6382   else
6383     dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x10002;
6384 
6385   install_alu_reg (gdbarch, regs, dsc, bits (insn, 12, 15), bits (insn, 16, 19),
6386                        bits (insn, 0, 3));
6387   return 0;
6388 }
6389 
6390 static int
thumb_copy_alu_reg(struct gdbarch * gdbarch,uint16_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6391 thumb_copy_alu_reg (struct gdbarch *gdbarch, uint16_t insn,
6392                         struct regcache *regs,
6393                         arm_displaced_step_copy_insn_closure *dsc)
6394 {
6395   unsigned rm, rd;
6396 
6397   rm = bits (insn, 3, 6);
6398   rd = (bit (insn, 7) << 3) | bits (insn, 0, 2);
6399 
6400   if (rd != ARM_PC_REGNUM && rm != ARM_PC_REGNUM)
6401     return thumb_copy_unmodified_16bit (gdbarch, insn, "ALU reg", dsc);
6402 
6403   displaced_debug_printf ("copying ALU reg insn %.4x", (unsigned short) insn);
6404 
6405   dsc->modinsn[0] = ((insn & 0xff00) | 0x10);
6406 
6407   install_alu_reg (gdbarch, regs, dsc, rd, rd, rm);
6408 
6409   return 0;
6410 }
6411 
6412 /* Cleanup/copy arithmetic/logic insns with shifted register RHS.  */
6413 
6414 static void
cleanup_alu_shifted_reg(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6415 cleanup_alu_shifted_reg (struct gdbarch *gdbarch,
6416                                struct regcache *regs,
6417                                arm_displaced_step_copy_insn_closure *dsc)
6418 {
6419   ULONGEST rd_val = displaced_read_reg (regs, dsc, 0);
6420   int i;
6421 
6422   for (i = 0; i < 4; i++)
6423     displaced_write_reg (regs, dsc, i, dsc->tmp[i], CANNOT_WRITE_PC);
6424 
6425   displaced_write_reg (regs, dsc, dsc->rd, rd_val, ALU_WRITE_PC);
6426 }
6427 
6428 static void
install_alu_shifted_reg(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,unsigned int rd,unsigned int rn,unsigned int rm,unsigned rs)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)
6433 {
6434   int i;
6435   ULONGEST rd_val, rn_val, rm_val, rs_val;
6436 
6437   /* Instruction is of form:
6438 
6439      <op><cond> rd, [rn,] rm, <shift> rs
6440 
6441      Rewrite as:
6442 
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
6449   */
6450 
6451   for (i = 0; i < 4; i++)
6452     dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
6453 
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;
6464 }
6465 
6466 static int
arm_copy_alu_shifted_reg(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6467 arm_copy_alu_shifted_reg (struct gdbarch *gdbarch, uint32_t insn,
6468                                 struct regcache *regs,
6469                                 arm_displaced_step_copy_insn_closure *dsc)
6470 {
6471   unsigned int op = bits (insn, 21, 24);
6472   int is_mov = (op == 0xd);
6473   unsigned int rd, rn, rm, rs;
6474 
6475   if (!insn_references_pc (insn, 0x000fff0ful))
6476     return arm_copy_unmodified (gdbarch, insn, "ALU shifted reg", dsc);
6477 
6478   displaced_debug_printf ("copying shifted reg %s insn %.8lx",
6479                                 is_mov ? "move" : "ALU",
6480                                 (unsigned long) insn);
6481 
6482   rn = bits (insn, 16, 19);
6483   rm = bits (insn, 0, 3);
6484   rs = bits (insn, 8, 11);
6485   rd = bits (insn, 12, 15);
6486 
6487   if (is_mov)
6488     dsc->modinsn[0] = (insn & 0xfff000f0) | 0x302;
6489   else
6490     dsc->modinsn[0] = (insn & 0xfff000f0) | 0x10302;
6491 
6492   install_alu_shifted_reg (gdbarch, regs, dsc, rd, rn, rm, rs);
6493 
6494   return 0;
6495 }
6496 
6497 /* Clean up load instructions.  */
6498 
6499 static void
cleanup_load(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6500 cleanup_load (struct gdbarch *gdbarch, struct regcache *regs,
6501                 arm_displaced_step_copy_insn_closure *dsc)
6502 {
6503   ULONGEST rt_val, rt_val2 = 0, rn_val;
6504 
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);
6509 
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);
6516 
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);
6524 }
6525 
6526 /* Clean up store instructions.  */
6527 
6528 static void
cleanup_store(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6529 cleanup_store (struct gdbarch *gdbarch, struct regcache *regs,
6530                  arm_displaced_step_copy_insn_closure *dsc)
6531 {
6532   ULONGEST rn_val = displaced_read_reg (regs, dsc, 2);
6533 
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);
6542 
6543   /* Writeback.  */
6544   if (dsc->u.ldst.writeback)
6545     displaced_write_reg (regs, dsc, dsc->u.ldst.rn, rn_val, CANNOT_WRITE_PC);
6546 }
6547 
6548 /* Copy "extra" load/store instructions.  These are halfword/doubleword
6549    transfers, which have a different encoding to byte/word transfers.  */
6550 
6551 static int
arm_copy_extra_ld_st(struct gdbarch * gdbarch,uint32_t insn,int unprivileged,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6552 arm_copy_extra_ld_st (struct gdbarch *gdbarch, uint32_t insn, int unprivileged,
6553                           regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
6554 {
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;
6565 
6566   if (!insn_references_pc (insn, 0x000ff00ful))
6567     return arm_copy_unmodified (gdbarch, insn, "extra load/store", dsc);
6568 
6569   displaced_debug_printf ("copying %sextra load/store insn %.8lx",
6570                                 unprivileged ? "unprivileged " : "",
6571                                 (unsigned long) insn);
6572 
6573   opcode = ((op2 << 2) | (op1 & 0x1) | ((op1 & 0x4) >> 1)) - 4;
6574 
6575   if (opcode < 0)
6576     internal_error (_("copy_extra_ld_st: instruction decode error"));
6577 
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);
6583 
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);
6590 
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);
6597 
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;
6604 
6605   if (immed)
6606     /* {ldr,str}<width><cond> rt, [rt2,] [rn, #imm]
6607           ->
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]
6612           ->
6613        {ldr,str}<width><cond> r0, [r1,] [r2, +/-r3].  */
6614     dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6615 
6616   dsc->cleanup = load[opcode] ? &cleanup_load : &cleanup_store;
6617 
6618   return 0;
6619 }
6620 
6621 /* Copy byte/half word/word loads and stores.  */
6622 
6623 static void
install_load_store(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int load,int immed,int writeback,int size,int usermode,int rt,int rm,int rn)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)
6628 {
6629   ULONGEST rt_val, rn_val, rm_val = 0;
6630 
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);
6637 
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);
6642 
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;
6652 
6653   /* To write PC we can do:
6654 
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.
6658 
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])
6668 
6669      Otherwise we don't know what value to write for PC, since the offset is
6670      architecture-dependent (sometimes PC+8, sometimes PC+12).  More details
6671      of this can be found in Section "Saving from r15" in
6672      http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204g/Cihbjifh.html */
6673 
6674   dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6675 }
6676 
6677 
6678 static int
thumb2_copy_load_literal(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int size)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)
6682 {
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;
6687 
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);
6691 
6692   if (!u_bit)
6693     imm12 = -1 * imm12;
6694 
6695   /* Rewrite instruction LDR Rt imm12 into:
6696 
6697      Prepare: tmp[0] <- r0, tmp[1] <- r2, tmp[2] <- r3, r2 <- pc, r3 <- imm12
6698 
6699      LDR R0, R2, R3,
6700 
6701      Cleanup: rt <- r0, r0 <- tmp[0], r2 <- tmp[1], r3 <- tmp[2].  */
6702 
6703 
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);
6707 
6708   pc_val = displaced_read_reg (regs, dsc, ARM_PC_REGNUM);
6709 
6710   pc_val = pc_val & 0xfffffffc;
6711 
6712   displaced_write_reg (regs, dsc, 2, pc_val, CANNOT_WRITE_PC);
6713   displaced_write_reg (regs, dsc, 3, imm12, CANNOT_WRITE_PC);
6714 
6715   dsc->rd = rt;
6716 
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;
6721 
6722   /* LDR R0, R2, R3 */
6723   dsc->modinsn[0] = 0xf852;
6724   dsc->modinsn[1] = 0x3;
6725   dsc->numinsns = 2;
6726 
6727   dsc->cleanup = &cleanup_load;
6728 
6729   return 0;
6730 }
6731 
6732 static int
thumb2_copy_load_reg_imm(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int writeback,int immed)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)
6737 {
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.  */
6743 
6744   if (rt != ARM_PC_REGNUM && rn != ARM_PC_REGNUM)
6745     return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "load",
6746                                                   dsc);
6747 
6748   displaced_debug_printf ("copying ldr r%d [r%d] insn %.4x%.4x",
6749                                 rt, rn, insn1, insn2);
6750 
6751   install_load_store (gdbarch, regs, dsc, 1, immed, writeback, 4,
6752                           0, rt, rm, rn);
6753 
6754   dsc->u.ldst.restore_r4 = 0;
6755 
6756   if (immed)
6757     /* ldr[b]<cond> rt, [rn, #imm], etc.
6758        ->
6759        ldr[b]<cond> r0, [r2, #imm].  */
6760     {
6761       dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6762       dsc->modinsn[1] = insn2 & 0x0fff;
6763     }
6764   else
6765     /* ldr[b]<cond> rt, [rn, rm], etc.
6766        ->
6767        ldr[b]<cond> r0, [r2, r3].  */
6768     {
6769       dsc->modinsn[0] = (insn1 & 0xfff0) | 0x2;
6770       dsc->modinsn[1] = (insn2 & 0x0ff0) | 0x3;
6771     }
6772 
6773   dsc->numinsns = 2;
6774 
6775   return 0;
6776 }
6777 
6778 
6779 static int
arm_copy_ldr_str_ldrb_strb(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int load,int size,int usermode)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)
6784 {
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.  */
6790 
6791   if (!insn_references_pc (insn, 0x000ff00ful))
6792     return arm_copy_unmodified (gdbarch, insn, "load/store", dsc);
6793 
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);
6800 
6801   install_load_store (gdbarch, regs, dsc, load, immed, writeback, size,
6802                           usermode, rt, rm, rn);
6803 
6804   if (load || rt != ARM_PC_REGNUM)
6805     {
6806       dsc->u.ldst.restore_r4 = 0;
6807 
6808       if (immed)
6809           /* {ldr,str}[b]<cond> rt, [rn, #imm], etc.
6810              ->
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.
6815              ->
6816              {ldr,str}[b]<cond> r0, [r2, r3].  */
6817           dsc->modinsn[0] = (insn & 0xfff00ff0) | 0x20003;
6818     }
6819   else
6820     {
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.  */
6828 
6829       /* As above.  */
6830       if (immed)
6831           dsc->modinsn[5] = (insn & 0xfff00fff) | 0x20000;
6832       else
6833           dsc->modinsn[5] = (insn & 0xfff00ff0) | 0x20003;
6834 
6835       dsc->numinsns = 6;
6836     }
6837 
6838   dsc->cleanup = load ? &cleanup_load : &cleanup_store;
6839 
6840   return 0;
6841 }
6842 
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,
6846 
6847    ldm rN, {r0-r15}
6848 
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):
6852 
6853    mov r8, rN
6854    ldm[id][ab] r8!, {r0-r7}
6855    str r7, <temp>
6856    ldm[id][ab] r8, {r7-r14}
6857    <bkpt>
6858 
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.  */
6862 
6863 static void
cleanup_block_load_all(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6864 cleanup_block_load_all (struct gdbarch *gdbarch, struct regcache *regs,
6865                               arm_displaced_step_copy_insn_closure *dsc)
6866 {
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);
6878 
6879   if (!do_transfer)
6880     return;
6881 
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"));
6886 
6887   /* We don't handle any stores here for now.  */
6888   gdb_assert (dsc->u.block.load != 0);
6889 
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");
6894 
6895   while (regmask)
6896     {
6897       uint32_t memword;
6898 
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--;
6905 
6906       xfer_addr += bump_before;
6907 
6908       memword = read_memory_unsigned_integer (xfer_addr, 4, byte_order);
6909       displaced_write_reg (regs, dsc, regno, memword, LOAD_WRITE_PC);
6910 
6911       xfer_addr += bump_after;
6912 
6913       regmask &= ~(1 << regno);
6914     }
6915 
6916   if (dsc->u.block.writeback)
6917     displaced_write_reg (regs, dsc, dsc->u.block.rn, xfer_addr,
6918                                CANNOT_WRITE_PC);
6919 }
6920 
6921 /* Clean up an STM which included the PC in the register list.  */
6922 
6923 static void
cleanup_block_store_pc(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6924 cleanup_block_store_pc (struct gdbarch *gdbarch, struct regcache *regs,
6925                               arm_displaced_step_copy_insn_closure *dsc)
6926 {
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);
6935 
6936   /* If condition code fails, there's nothing else to do.  */
6937   if (!store_executed)
6938     return;
6939 
6940   if (dsc->u.block.increment)
6941     {
6942       pc_stored_at = dsc->u.block.xfer_addr + 4 * transferred_regs;
6943 
6944       if (dsc->u.block.before)
6945            pc_stored_at += 4;
6946     }
6947   else
6948     {
6949       pc_stored_at = dsc->u.block.xfer_addr;
6950 
6951       if (dsc->u.block.before)
6952            pc_stored_at -= 4;
6953     }
6954 
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;
6958 
6959   displaced_debug_printf ("detected PC offset %.8lx for STM instruction",
6960                                 offset);
6961 
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);
6966 }
6967 
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.  */
6972 
6973 static void
cleanup_block_load_pc(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)6974 cleanup_block_load_pc (struct gdbarch *gdbarch,
6975                            struct regcache *regs,
6976                            arm_displaced_step_copy_insn_closure *dsc)
6977 {
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;
6983 
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);
6987 
6988   if (!load_executed)
6989     return;
6990 
6991   clobbered = (1 << num_to_shuffle) - 1;
6992 
6993   while (num_to_shuffle > 0)
6994     {
6995       if ((mask & (1 << write_reg)) != 0)
6996           {
6997             unsigned int read_reg = num_to_shuffle - 1;
6998 
6999             if (read_reg != write_reg)
7000               {
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);
7005               }
7006             else
7007               displaced_debug_printf ("LDM: register r%d already in the right "
7008                                             "place", write_reg);
7009 
7010             clobbered &= ~(1 << write_reg);
7011 
7012             num_to_shuffle--;
7013           }
7014 
7015       write_reg--;
7016     }
7017 
7018   /* Restore any registers we scribbled over.  */
7019   for (write_reg = 0; clobbered != 0; write_reg++)
7020     {
7021       if ((clobbered & (1 << write_reg)) != 0)
7022           {
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);
7028           }
7029     }
7030 
7031   /* Perform register writeback manually.  */
7032   if (dsc->u.block.writeback)
7033     {
7034       ULONGEST new_rn_val = dsc->u.block.xfer_addr;
7035 
7036       if (dsc->u.block.increment)
7037           new_rn_val += regs_loaded * 4;
7038       else
7039           new_rn_val -= regs_loaded * 4;
7040 
7041       displaced_write_reg (regs, dsc, dsc->u.block.rn, new_rn_val,
7042                                  CANNOT_WRITE_PC);
7043     }
7044 }
7045 
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}^).  */
7048 
7049 static int
arm_copy_block_xfer(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7050 arm_copy_block_xfer (struct gdbarch *gdbarch, uint32_t insn,
7051                          struct regcache *regs,
7052                          arm_displaced_step_copy_insn_closure *dsc)
7053 {
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);
7060 
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);
7065 
7066   if (rn == ARM_PC_REGNUM)
7067     {
7068       warning (_("displaced: Unpredictable LDM or STM with "
7069                      "base register r15"));
7070       return arm_copy_unmodified (gdbarch, insn, "unpredictable ldm/stm", dsc);
7071     }
7072 
7073   displaced_debug_printf ("copying block transfer insn %.8lx",
7074                                 (unsigned long) insn);
7075 
7076   dsc->u.block.xfer_addr = displaced_read_reg (regs, dsc, rn);
7077   dsc->u.block.rn = rn;
7078 
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);
7085 
7086   dsc->u.block.regmask = insn & 0xffff;
7087 
7088   if (load)
7089     {
7090       if ((insn & 0xffff) == 0xffff)
7091           {
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;
7098 
7099             dsc->cleanup = &cleanup_block_load_all;
7100           }
7101       else
7102           {
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;
7110 
7111             for (i = 0; i < num_in_list; i++)
7112               dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7113 
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.:
7118 
7119                  ldm r14!, {r0-r13,pc}
7120 
7121                which would need to be rewritten as:
7122 
7123                  ldm rN!, {r0-r14}
7124 
7125                but that can't work, because there's no free register for N.
7126 
7127                Solve this by turning off the writeback bit, and emulating
7128                writeback manually in the cleanup routine.  */
7129 
7130             if (writeback)
7131               insn &= ~(1 << 21);
7132 
7133             new_regmask = (1 << num_in_list) - 1;
7134 
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);
7139 
7140             dsc->modinsn[0] = (insn & ~0xffff) | (new_regmask & 0xffff);
7141 
7142             dsc->cleanup = &cleanup_block_load_pc;
7143           }
7144     }
7145   else
7146     {
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;
7154 
7155       dsc->cleanup = &cleanup_block_store_pc;
7156     }
7157 
7158   return 0;
7159 }
7160 
7161 static int
thumb2_copy_block_xfer(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7165 {
7166   int rn = bits (insn1, 0, 3);
7167   int load = bit (insn1, 4);
7168   int writeback = bit (insn1, 5);
7169 
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);
7174 
7175   if (rn == ARM_PC_REGNUM)
7176     {
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);
7181     }
7182 
7183   displaced_debug_printf ("copying block transfer insn %.4x%.4x",
7184                                 insn1, insn2);
7185 
7186   /* Clear bit 13, since it should be always zero.  */
7187   dsc->u.block.regmask = (insn2 & 0xdfff);
7188   dsc->u.block.rn = rn;
7189 
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);
7197 
7198   if (load)
7199     {
7200       if (dsc->u.block.regmask == 0xffff)
7201           {
7202             /* This branch is impossible to happen.  */
7203             gdb_assert (0);
7204           }
7205       else
7206           {
7207             unsigned int regmask = dsc->u.block.regmask;
7208             unsigned int num_in_list = count_one_bits (regmask), new_regmask;
7209             unsigned int i;
7210 
7211             for (i = 0; i < num_in_list; i++)
7212               dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
7213 
7214             if (writeback)
7215               insn1 &= ~(1 << 5);
7216 
7217             new_regmask = (1 << num_in_list) - 1;
7218 
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);
7223 
7224             dsc->modinsn[0] = insn1;
7225             dsc->modinsn[1] = (new_regmask & 0xffff);
7226             dsc->numinsns = 2;
7227 
7228             dsc->cleanup = &cleanup_block_load_pc;
7229           }
7230     }
7231   else
7232     {
7233       dsc->modinsn[0] = insn1;
7234       dsc->modinsn[1] = insn2;
7235       dsc->numinsns = 2;
7236       dsc->cleanup = &cleanup_block_store_pc;
7237     }
7238   return 0;
7239 }
7240 
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.  */
7243 
7244 ULONGEST
arm_get_next_pcs_read_memory_unsigned_integer(CORE_ADDR memaddr,int len,int byte_order)7245 arm_get_next_pcs_read_memory_unsigned_integer (CORE_ADDR memaddr, int len,
7246                                                          int byte_order)
7247 {
7248   return read_memory_unsigned_integer (memaddr, len,
7249                                                (enum bfd_endian) byte_order);
7250 }
7251 
7252 /* Wrapper over gdbarch_addr_bits_remove for use in arm_get_next_pcs.  */
7253 
7254 CORE_ADDR
arm_get_next_pcs_addr_bits_remove(struct arm_get_next_pcs * self,CORE_ADDR val)7255 arm_get_next_pcs_addr_bits_remove (struct arm_get_next_pcs *self,
7256                                            CORE_ADDR val)
7257 {
7258   return gdbarch_addr_bits_remove
7259     (gdb::checked_static_cast<regcache *> (self->regcache)->arch (), val);
7260 }
7261 
7262 /* Wrapper over syscall_next_pc for use in get_next_pcs.  */
7263 
7264 static CORE_ADDR
arm_get_next_pcs_syscall_next_pc(struct arm_get_next_pcs * self)7265 arm_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
7266 {
7267   return 0;
7268 }
7269 
7270 /* Wrapper over arm_is_thumb for use in arm_get_next_pcs.  */
7271 
7272 int
arm_get_next_pcs_is_thumb(struct arm_get_next_pcs * self)7273 arm_get_next_pcs_is_thumb (struct arm_get_next_pcs *self)
7274 {
7275   return arm_is_thumb (gdb::checked_static_cast<regcache *> (self->regcache));
7276 }
7277 
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.  */
7282 
7283 std::vector<CORE_ADDR>
arm_software_single_step(struct regcache * regcache)7284 arm_software_single_step (struct regcache *regcache)
7285 {
7286   struct gdbarch *gdbarch = regcache->arch ();
7287   struct arm_get_next_pcs next_pcs_ctx;
7288 
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),
7293                                0,
7294                                regcache);
7295 
7296   std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
7297 
7298   for (CORE_ADDR &pc_ref : next_pcs)
7299     pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
7300 
7301   return next_pcs;
7302 }
7303 
7304 /* Cleanup/copy SVC (SWI) instructions.  These two functions are overridden
7305    for Linux, where some SVC instructions must be treated specially.  */
7306 
7307 static void
cleanup_svc(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7308 cleanup_svc (struct gdbarch *gdbarch, struct regcache *regs,
7309                arm_displaced_step_copy_insn_closure *dsc)
7310 {
7311   CORE_ADDR resume_addr = dsc->insn_addr + dsc->insn_size;
7312 
7313   displaced_debug_printf ("cleanup for svc, resume at %.8lx",
7314                                 (unsigned long) resume_addr);
7315 
7316   displaced_write_reg (regs, dsc, ARM_PC_REGNUM, resume_addr, BRANCH_WRITE_PC);
7317 }
7318 
7319 
7320 /* Common copy routine for svc instruction.  */
7321 
7322 static int
install_svc(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7323 install_svc (struct gdbarch *gdbarch, struct regcache *regs,
7324                arm_displaced_step_copy_insn_closure *dsc)
7325 {
7326   /* Preparation: none.
7327      Insn: unmodified svc.
7328      Cleanup: pc <- insn_addr + insn_size.  */
7329 
7330   /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
7331      instruction.  */
7332   dsc->wrote_to_pc = 1;
7333 
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
7338     {
7339       dsc->cleanup = &cleanup_svc;
7340       return 0;
7341     }
7342 }
7343 
7344 static int
arm_copy_svc(struct gdbarch * gdbarch,uint32_t insn,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7345 arm_copy_svc (struct gdbarch *gdbarch, uint32_t insn,
7346                 regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7347 {
7348 
7349   displaced_debug_printf ("copying svc insn %.8lx",
7350                                 (unsigned long) insn);
7351 
7352   dsc->modinsn[0] = insn;
7353 
7354   return install_svc (gdbarch, regs, dsc);
7355 }
7356 
7357 static int
thumb_copy_svc(struct gdbarch * gdbarch,uint16_t insn,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7358 thumb_copy_svc (struct gdbarch *gdbarch, uint16_t insn,
7359                     regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7360 {
7361 
7362   displaced_debug_printf ("copying svc insn %.4x", insn);
7363 
7364   dsc->modinsn[0] = insn;
7365 
7366   return install_svc (gdbarch, regs, dsc);
7367 }
7368 
7369 /* Copy undefined instructions.  */
7370 
7371 static int
arm_copy_undef(struct gdbarch * gdbarch,uint32_t insn,arm_displaced_step_copy_insn_closure * dsc)7372 arm_copy_undef (struct gdbarch *gdbarch, uint32_t insn,
7373                     arm_displaced_step_copy_insn_closure *dsc)
7374 {
7375   displaced_debug_printf ("copying undefined insn %.8lx",
7376                                 (unsigned long) insn);
7377 
7378   dsc->modinsn[0] = insn;
7379 
7380   return 0;
7381 }
7382 
7383 static int
thumb_32bit_copy_undef(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,arm_displaced_step_copy_insn_closure * dsc)7384 thumb_32bit_copy_undef (struct gdbarch *gdbarch, uint16_t insn1, uint16_t insn2,
7385                               arm_displaced_step_copy_insn_closure *dsc)
7386 {
7387 
7388   displaced_debug_printf ("copying undefined insn %.4x %.4x",
7389                                 (unsigned short) insn1, (unsigned short) insn2);
7390 
7391   dsc->modinsn[0] = insn1;
7392   dsc->modinsn[1] = insn2;
7393   dsc->numinsns = 2;
7394 
7395   return 0;
7396 }
7397 
7398 /* Copy unpredictable instructions.  */
7399 
7400 static int
arm_copy_unpred(struct gdbarch * gdbarch,uint32_t insn,arm_displaced_step_copy_insn_closure * dsc)7401 arm_copy_unpred (struct gdbarch *gdbarch, uint32_t insn,
7402                      arm_displaced_step_copy_insn_closure *dsc)
7403 {
7404   displaced_debug_printf ("copying unpredictable insn %.8lx",
7405                                 (unsigned long) insn);
7406 
7407   dsc->modinsn[0] = insn;
7408 
7409   return 0;
7410 }
7411 
7412 /* The decode_* functions are instruction decoding helpers.  They mostly follow
7413    the presentation in the ARM ARM.  */
7414 
7415 static int
arm_decode_misc_memhint_neon(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7416 arm_decode_misc_memhint_neon (struct gdbarch *gdbarch, uint32_t insn,
7417                                     struct regcache *regs,
7418                                     arm_displaced_step_copy_insn_closure *dsc)
7419 {
7420   unsigned int op1 = bits (insn, 20, 26), op2 = bits (insn, 4, 7);
7421   unsigned int rn = bits (insn, 16, 19);
7422 
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)
7437     {
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);
7442     }
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)
7447       {
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);
7453       }
7454   else if ((op1 & 0x63) == 0x43)
7455     return arm_copy_unpred (gdbarch, insn, dsc);
7456   else if ((op2 & 0x1) == 0x0)
7457     switch (op1 & ~0x80)
7458       {
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);
7470       }
7471   else
7472     return arm_copy_undef (gdbarch, insn, dsc);  /* Probably unreachable.  */
7473 }
7474 
7475 static int
arm_decode_unconditional(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7476 arm_decode_unconditional (struct gdbarch *gdbarch, uint32_t insn,
7477                                 struct regcache *regs,
7478                                 arm_displaced_step_copy_insn_closure *dsc)
7479 {
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))
7484     {
7485     case 0x0: case 0x2:
7486       return arm_copy_unmodified (gdbarch, insn, "srs", dsc);
7487 
7488     case 0x1: case 0x3:
7489       return arm_copy_unmodified (gdbarch, insn, "rfe", dsc);
7490 
7491     case 0x4: case 0x5: case 0x6: case 0x7:
7492       return arm_copy_b_bl_blx (gdbarch, insn, regs, dsc);
7493 
7494     case 0x8:
7495       switch ((insn & 0xe00000) >> 21)
7496           {
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);
7500 
7501           case 0x2:
7502             return arm_copy_unmodified (gdbarch, insn, "mcrr/mcrr2", dsc);
7503 
7504           default:
7505             return arm_copy_undef (gdbarch, insn, dsc);
7506           }
7507 
7508     case 0x9:
7509       {
7510            int rn_f = (bits (insn, 16, 19) == 0xf);
7511           switch ((insn & 0xe00000) >> 21)
7512             {
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);
7517 
7518             case 0x2:
7519               return arm_copy_unmodified (gdbarch, insn, "mrrc/mrrc2", dsc);
7520 
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);
7525 
7526             default:
7527               return arm_copy_undef (gdbarch, insn, dsc);
7528             }
7529       }
7530 
7531     case 0xa:
7532       return arm_copy_unmodified (gdbarch, insn, "stc/stc2", dsc);
7533 
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);
7540 
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);
7546 
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);
7552 
7553     default:
7554       return arm_copy_undef (gdbarch, insn, dsc);
7555     }
7556 }
7557 
7558 /* Decode miscellaneous instructions in dp/misc encoding space.  */
7559 
7560 static int
arm_decode_miscellaneous(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7561 arm_decode_miscellaneous (struct gdbarch *gdbarch, uint32_t insn,
7562                                 struct regcache *regs,
7563                                 arm_displaced_step_copy_insn_closure *dsc)
7564 {
7565   unsigned int op2 = bits (insn, 4, 6);
7566   unsigned int op = bits (insn, 21, 22);
7567 
7568   switch (op2)
7569     {
7570     case 0x0:
7571       return arm_copy_unmodified (gdbarch, insn, "mrs/msr", dsc);
7572 
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);
7580 
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);
7587 
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);
7594 
7595     case 0x5:
7596       return arm_copy_unmodified (gdbarch, insn, "saturating add/sub", dsc);
7597 
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]];
7605 
7606     default:
7607       return arm_copy_undef (gdbarch, insn, dsc);
7608     }
7609 }
7610 
7611 static int
arm_decode_dp_misc(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7612 arm_decode_dp_misc (struct gdbarch *gdbarch, uint32_t insn,
7613                         struct regcache *regs,
7614                         arm_displaced_step_copy_insn_closure *dsc)
7615 {
7616   if (bit (insn, 25))
7617     switch (bits (insn, 20, 24))
7618       {
7619       case 0x10:
7620           return arm_copy_unmodified (gdbarch, insn, "movw", dsc);
7621 
7622       case 0x14:
7623           return arm_copy_unmodified (gdbarch, insn, "movt", dsc);
7624 
7625       case 0x12: case 0x16:
7626           return arm_copy_unmodified (gdbarch, insn, "msr imm", dsc);
7627 
7628       default:
7629           return arm_copy_alu_imm (gdbarch, insn, regs, dsc);
7630       }
7631   else
7632     {
7633       uint32_t op1 = bits (insn, 20, 24), op2 = bits (insn, 4, 7);
7634 
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);
7651     }
7652 
7653   /* Should be unreachable.  */
7654   return 1;
7655 }
7656 
7657 static int
arm_decode_ld_st_word_ubyte(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7661 {
7662   int a = bit (insn, 25), b = bit (insn, 4);
7663   uint32_t op1 = bits (insn, 20, 24);
7664 
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);
7689 
7690   /* Should be unreachable.  */
7691   return 1;
7692 }
7693 
7694 static int
arm_decode_media(struct gdbarch * gdbarch,uint32_t insn,arm_displaced_step_copy_insn_closure * dsc)7695 arm_decode_media (struct gdbarch *gdbarch, uint32_t insn,
7696                       arm_displaced_step_copy_insn_closure *dsc)
7697 {
7698   switch (bits (insn, 20, 24))
7699     {
7700     case 0x00: case 0x01: case 0x02: case 0x03:
7701       return arm_copy_unmodified (gdbarch, insn, "parallel add/sub signed", dsc);
7702 
7703     case 0x04: case 0x05: case 0x06: case 0x07:
7704       return arm_copy_unmodified (gdbarch, insn, "parallel add/sub unsigned", dsc);
7705 
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);
7710 
7711     case 0x18:
7712       if (bits (insn, 5, 7) == 0)  /* op2.  */
7713            {
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);
7718           }
7719       else
7720            return arm_copy_undef (gdbarch, insn, dsc);
7721 
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);
7727 
7728     case 0x1c: case 0x1d:
7729       if (bits (insn, 5, 6) == 0x0)  /* op2[1:0].  */
7730            {
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);
7735           }
7736       else
7737           return arm_copy_undef (gdbarch, insn, dsc);
7738 
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);
7744     }
7745 
7746   /* Should be unreachable.  */
7747   return 1;
7748 }
7749 
7750 static int
arm_decode_b_bl_ldmstm(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7751 arm_decode_b_bl_ldmstm (struct gdbarch *gdbarch, uint32_t insn,
7752                               struct regcache *regs,
7753                               arm_displaced_step_copy_insn_closure *dsc)
7754 {
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);
7759 }
7760 
7761 static int
arm_decode_ext_reg_ld_st(struct gdbarch * gdbarch,uint32_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7765 {
7766   unsigned int opcode = bits (insn, 20, 24);
7767 
7768   switch (opcode)
7769     {
7770     case 0x04: case 0x05:  /* VFP/Neon mrrc/mcrr.  */
7771       return arm_copy_unmodified (gdbarch, insn, "vfp/neon mrrc/mcrr", dsc);
7772 
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);
7776 
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);
7780 
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);
7786     }
7787 
7788   /* Should be unreachable.  */
7789   return 1;
7790 }
7791 
7792 /* Decode shifted register instructions.  */
7793 
7794 static int
thumb2_decode_dp_shift_reg(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7798 {
7799   /* PC is only allowed to be used in instruction MOV.  */
7800 
7801   unsigned int op = bits (insn1, 5, 8);
7802   unsigned int rn = bits (insn1, 0, 3);
7803 
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);
7809 }
7810 
7811 
7812 /* Decode extension register load/store.  Exactly the same as
7813    arm_decode_ext_reg_ld_st.  */
7814 
7815 static int
thumb2_decode_ext_reg_ld_st(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7819 {
7820   unsigned int opcode = bits (insn1, 4, 8);
7821 
7822   switch (opcode)
7823     {
7824     case 0x04: case 0x05:
7825       return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
7826                                                     "vfp/neon vmov", dsc);
7827 
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);
7833 
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);
7839 
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);
7845     }
7846 
7847   /* Should be unreachable.  */
7848   return 1;
7849 }
7850 
7851 static int
arm_decode_svc_copro(struct gdbarch * gdbarch,uint32_t insn,regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7852 arm_decode_svc_copro (struct gdbarch *gdbarch, uint32_t insn,
7853                           regcache *regs, arm_displaced_step_copy_insn_closure *dsc)
7854 {
7855   unsigned int op1 = bits (insn, 20, 25);
7856   int op = bit (insn, 4);
7857   unsigned int coproc = bits (insn, 8, 11);
7858 
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)
7878     {
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);
7883     }
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.  */
7894 }
7895 
7896 static int
thumb2_decode_svc_copro(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7900 {
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);
7905 
7906   if (bit_9 == 0)
7907     {
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
7915           {
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.  */
7921               {
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);
7928               }
7929           }
7930     }
7931   else
7932     return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2, "coproc", dsc);
7933 
7934   return 0;
7935 }
7936 
7937 static void
install_pc_relative(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int rd)7938 install_pc_relative (struct gdbarch *gdbarch, struct regcache *regs,
7939                          arm_displaced_step_copy_insn_closure *dsc, int rd)
7940 {
7941   /* ADR Rd, #imm
7942 
7943      Rewrite as:
7944 
7945      Preparation: Rd <- PC
7946      Insn: ADD Rd, #imm
7947      Cleanup: Null.
7948   */
7949 
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);
7953 }
7954 
7955 static int
thumb_copy_pc_relative_16bit(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc,int rd,unsigned int imm)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)
7959 {
7960 
7961   /* Encoding T2: ADDS Rd, #imm */
7962   dsc->modinsn[0] = (0x3000 | (rd << 8) | imm);
7963 
7964   install_pc_relative (gdbarch, regs, dsc, rd);
7965 
7966   return 0;
7967 }
7968 
7969 static int
thumb_decode_pc_relative_16bit(struct gdbarch * gdbarch,uint16_t insn,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)7970 thumb_decode_pc_relative_16bit (struct gdbarch *gdbarch, uint16_t insn,
7971                                         struct regcache *regs,
7972                                         arm_displaced_step_copy_insn_closure *dsc)
7973 {
7974   unsigned int rd = bits (insn, 8, 10);
7975   unsigned int imm8 = bits (insn, 0, 7);
7976 
7977   displaced_debug_printf ("copying thumb adr r%d, #%d insn %.4x",
7978                                 rd, imm8, insn);
7979 
7980   return thumb_copy_pc_relative_16bit (gdbarch, regs, dsc, rd, imm8);
7981 }
7982 
7983 static int
thumb_copy_pc_relative_32bit(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
7987 {
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.  */
7995 
7996   displaced_debug_printf ("copying thumb adr r%d, #%d:%d insn %.4x%.4x",
7997                                 rd, imm_i, imm_3_8, insn1, insn2);
7998 
7999   if (bit (insn1, 7)) /* Encoding T2 */
8000     {
8001       /* Encoding T3: SUB Rd, Rd, #imm */
8002       dsc->modinsn[0] = (0xf1a0 | rd | imm_i);
8003       dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8004     }
8005   else /* Encoding T3 */
8006     {
8007       /* Encoding T3: ADD Rd, Rd, #imm */
8008       dsc->modinsn[0] = (0xf100 | rd | imm_i);
8009       dsc->modinsn[1] = ((rd << 8) | imm_3_8);
8010     }
8011   dsc->numinsns = 2;
8012 
8013   install_pc_relative (gdbarch, regs, dsc, rd);
8014 
8015   return 0;
8016 }
8017 
8018 static int
thumb_copy_16bit_ldr_literal(struct gdbarch * gdbarch,uint16_t insn1,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8019 thumb_copy_16bit_ldr_literal (struct gdbarch *gdbarch, uint16_t insn1,
8020                                     struct regcache *regs,
8021                                     arm_displaced_step_copy_insn_closure *dsc)
8022 {
8023   unsigned int rt = bits (insn1, 8, 10);
8024   unsigned int pc;
8025   int imm8 = (bits (insn1, 0, 7) << 2);
8026 
8027   /* LDR Rd, #imm8
8028 
8029      Rwrite as:
8030 
8031      Preparation: tmp0 <- R0, tmp2 <- R2, tmp3 <- R3, R2 <- PC, R3 <- #imm8;
8032 
8033      Insn: LDR R0, [R2, R3];
8034      Cleanup: R2 <- tmp2, R3 <- tmp3, Rd <- R0, R0 <- tmp0 */
8035 
8036   displaced_debug_printf ("copying thumb ldr r%d [pc #%d]", rt, imm8);
8037 
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;
8045 
8046   displaced_write_reg (regs, dsc, 2, pc, CANNOT_WRITE_PC);
8047   displaced_write_reg (regs, dsc, 3, imm8, CANNOT_WRITE_PC);
8048 
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;
8055 
8056   dsc->modinsn[0] = 0x58d0; /* ldr r0, [r2, r3]*/
8057 
8058   dsc->cleanup = &cleanup_load;
8059 
8060   return 0;
8061 }
8062 
8063 /* Copy Thumb cbnz/cbz instruction.  */
8064 
8065 static int
thumb_copy_cbnz_cbz(struct gdbarch * gdbarch,uint16_t insn1,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8066 thumb_copy_cbnz_cbz (struct gdbarch *gdbarch, uint16_t insn1,
8067                          struct regcache *regs,
8068                          arm_displaced_step_copy_insn_closure *dsc)
8069 {
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);
8075 
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)
8081     {
8082       dsc->u.branch.cond = INST_AL;
8083       dsc->u.branch.dest = from + 4 + imm5;
8084     }
8085   else
8086       dsc->u.branch.dest = from + 2;
8087 
8088   dsc->u.branch.link = 0;
8089   dsc->u.branch.exchange = 0;
8090 
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);
8094 
8095   dsc->modinsn[0] = THUMB_NOP;
8096 
8097   dsc->cleanup = &cleanup_branch;
8098   return 0;
8099 }
8100 
8101 /* Copy Table Branch Byte/Halfword */
8102 static int
thumb2_copy_table_branch(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
8106 {
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);
8111 
8112   rn_val = displaced_read_reg (regs, dsc, bits (insn1, 0, 3));
8113   rm_val = displaced_read_reg (regs, dsc, bits (insn2, 0, 3));
8114 
8115   if (is_tbh)
8116     {
8117       gdb_byte buf[2];
8118 
8119       target_read_memory (rn_val + 2 * rm_val, buf, 2);
8120       halfwords = extract_unsigned_integer (buf, 2, byte_order);
8121     }
8122   else
8123     {
8124       gdb_byte buf[1];
8125 
8126       target_read_memory (rn_val + rm_val, buf, 1);
8127       halfwords = extract_unsigned_integer (buf, 1, byte_order);
8128     }
8129 
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);
8134 
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;
8139 
8140   dsc->cleanup = &cleanup_branch;
8141 
8142   return 0;
8143 }
8144 
8145 static void
cleanup_pop_pc_16bit_all(struct gdbarch * gdbarch,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8146 cleanup_pop_pc_16bit_all (struct gdbarch *gdbarch, struct regcache *regs,
8147                                 arm_displaced_step_copy_insn_closure *dsc)
8148 {
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);
8152 
8153   /* r7 <- r8 */
8154   val = displaced_read_reg (regs, dsc, 8);
8155   displaced_write_reg (regs, dsc, 7, val, CANNOT_WRITE_PC);
8156 
8157   /* r8 <- tmp[0] */
8158   displaced_write_reg (regs, dsc, 8, dsc->tmp[0], CANNOT_WRITE_PC);
8159 
8160 }
8161 
8162 static int
thumb_copy_pop_pc_16bit(struct gdbarch * gdbarch,uint16_t insn1,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8163 thumb_copy_pop_pc_16bit (struct gdbarch *gdbarch, uint16_t insn1,
8164                                struct regcache *regs,
8165                                arm_displaced_step_copy_insn_closure *dsc)
8166 {
8167   dsc->u.block.regmask = insn1 & 0x00ff;
8168 
8169   /* Rewrite instruction: POP {rX, rY, ...,rZ, PC}
8170      to :
8171 
8172      (1) register list is full, that is, r0-r7 are used.
8173      Prepare: tmp[0] <- r8
8174 
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.
8178 
8179      Cleanup: PC <- r7, r7 <- r8, r8 <-tmp[0]
8180 
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.
8184 
8185      POP {r0, r1, ...., rN};
8186 
8187      Cleanup: Set registers in original reglist from r0 - rN.  Restore r0 - rN
8188      from tmp[] properly.
8189   */
8190   displaced_debug_printf ("copying thumb pop {%.8x, pc} insn %.4x",
8191                                 dsc->u.block.regmask, insn1);
8192 
8193   if (dsc->u.block.regmask == 0xff)
8194     {
8195       dsc->tmp[0] = displaced_read_reg (regs, dsc, 8);
8196 
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} */
8200 
8201       dsc->numinsns = 3;
8202       dsc->cleanup = &cleanup_pop_pc_16bit_all;
8203     }
8204   else
8205     {
8206       unsigned int num_in_list = count_one_bits (dsc->u.block.regmask);
8207       unsigned int i;
8208       unsigned int new_regmask;
8209 
8210       for (i = 0; i < num_in_list + 1; i++)
8211           dsc->tmp[i] = displaced_read_reg (regs, dsc, i);
8212 
8213       new_regmask = (1 << (num_in_list + 1)) - 1;
8214 
8215       displaced_debug_printf ("POP {..., pc}: original reg list %.4x, "
8216                                     "modified list %.4x",
8217                                     (int) dsc->u.block.regmask, new_regmask);
8218 
8219       dsc->u.block.regmask |= 0x8000;
8220       dsc->u.block.writeback = 0;
8221       dsc->u.block.cond = INST_AL;
8222 
8223       dsc->modinsn[0] = (insn1 & ~0x1ff) | (new_regmask & 0xff);
8224 
8225       dsc->cleanup = &cleanup_block_load_pc;
8226     }
8227 
8228   return 0;
8229 }
8230 
8231 static void
thumb_process_displaced_16bit_insn(struct gdbarch * gdbarch,uint16_t insn1,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8232 thumb_process_displaced_16bit_insn (struct gdbarch *gdbarch, uint16_t insn1,
8233                                             struct regcache *regs,
8234                                             arm_displaced_step_copy_insn_closure *dsc)
8235 {
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;
8239 
8240   /* 16-bit thumb instructions.  */
8241   switch (op_bit_12_15)
8242     {
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)
8251           {
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.  */
8258             {
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);
8267             }
8268             break;
8269           default: /* LDR (literal) */
8270             err = thumb_copy_16bit_ldr_literal (gdbarch, insn1, regs, dsc);
8271           }
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 */
8283       {
8284           switch (bits (insn1, 8, 11))
8285             {
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);
8307             }
8308       }
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;
8327     }
8328 
8329   if (err)
8330     internal_error (_("thumb_process_displaced_16bit_insn: Instruction decode error"));
8331 }
8332 
8333 static int
decode_thumb_32bit_ld_mem_hints(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
8338 {
8339   int rt = bits (insn2, 12, 15);
8340   int rn = bits (insn1, 0, 3);
8341   int op1 = bits (insn1, 7, 8);
8342 
8343   switch (bits (insn1, 5, 6))
8344     {
8345     case 0: /* Load byte and memory hints */
8346       if (rt == 0xf) /* PLD/PLI */
8347           {
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);
8354           }
8355       else
8356           {
8357             if (rn == 0xf) /* LDRB/LDRSB (literal) */
8358               return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8359                                                        1);
8360             else
8361               return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8362                                                             "ldrb{reg, immediate}/ldrbt",
8363                                                             dsc);
8364           }
8365 
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
8372           {
8373             if (rn == 0xf)
8374               return thumb2_copy_load_literal (gdbarch, insn1, insn2, regs, dsc,
8375                                                        2);
8376             else
8377               return thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8378                                                             "ldrh/ldrht", dsc);
8379           }
8380       break;
8381     case 2: /* Load word */
8382       {
8383           int insn2_bit_8_11 = bits (insn2, 8, 11);
8384 
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 */
8391             {
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);
8403             }
8404           break;
8405       }
8406     default:
8407       return thumb_32bit_copy_undef (gdbarch, insn1, insn2, dsc);
8408       break;
8409     }
8410   return 0;
8411 }
8412 
8413 static void
thumb_process_displaced_32bit_insn(struct gdbarch * gdbarch,uint16_t insn1,uint16_t insn2,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
8417 {
8418   int err = 0;
8419   unsigned short op = bit (insn2, 15);
8420   unsigned int op1 = bits (insn1, 11, 12);
8421 
8422   switch (op1)
8423     {
8424     case 1:
8425       {
8426           switch (bits (insn1, 9, 10))
8427             {
8428             case 0:
8429               if (bit (insn1, 6))
8430                 {
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);
8441                 }
8442               else /* load/store multiple */
8443                 {
8444                     switch (bits (insn1, 7, 8))
8445                       {
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;
8453                       }
8454                 }
8455               break;
8456 
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;
8465             }
8466       break;
8467       }
8468     case 2: /* op1 = 2 */
8469       if (op) /* Branch and misc control.  */
8470           {
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);
8478           }
8479       else
8480           {
8481             if (bit (insn1, 9)) /* Data processing (plain binary imm).  */
8482               {
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);
8491               }
8492             else /* Data processing (modified immediate) */
8493               err = thumb_copy_unmodified_32bit (gdbarch, insn1, insn2,
8494                                                          "dp/mi", dsc);
8495           }
8496       break;
8497     case 3: /* op1 = 3 */
8498       switch (bits (insn1, 9, 10))
8499           {
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))
8511               {
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;
8524               }
8525             break;
8526           default: /* Coprocessor instructions */
8527             err = thumb2_decode_svc_copro (gdbarch, insn1, insn2, regs, dsc);
8528             break;
8529           }
8530       break;
8531     default:
8532       err = 1;
8533     }
8534 
8535   if (err)
8536     internal_error (_("thumb_process_displaced_32bit_insn: Instruction decode error"));
8537 
8538 }
8539 
8540 static void
thumb_process_displaced_insn(struct gdbarch * gdbarch,CORE_ADDR from,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)8541 thumb_process_displaced_insn (struct gdbarch *gdbarch, CORE_ADDR from,
8542                                     struct regcache *regs,
8543                                     arm_displaced_step_copy_insn_closure *dsc)
8544 {
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);
8548 
8549   displaced_debug_printf ("process thumb insn %.4x at %.8lx",
8550                                 insn1, (unsigned long) from);
8551 
8552   dsc->is_thumb = 1;
8553   dsc->insn_size = thumb_insn_size (insn1);
8554   if (thumb_insn_size (insn1) == 4)
8555     {
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);
8559     }
8560   else
8561     thumb_process_displaced_16bit_insn (gdbarch, insn1, regs, dsc);
8562 }
8563 
8564 void
arm_process_displaced_insn(struct gdbarch * gdbarch,CORE_ADDR from,CORE_ADDR to,struct regcache * regs,arm_displaced_step_copy_insn_closure * dsc)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)
8568 {
8569   int err = 0;
8570   enum bfd_endian byte_order_for_code = gdbarch_byte_order_for_code (gdbarch);
8571   uint32_t insn;
8572 
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;
8580 
8581   if (!displaced_in_arm_mode (regs))
8582     return thumb_process_displaced_insn (gdbarch, from, regs, dsc);
8583 
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);
8589 
8590   if ((insn & 0xf0000000) == 0xf0000000)
8591     err = arm_decode_unconditional (gdbarch, insn, regs, dsc);
8592   else switch (((insn & 0x10) >> 4) | ((insn & 0xe000000) >> 24))
8593     {
8594     case 0x0: case 0x1: case 0x2: case 0x3:
8595       err = arm_decode_dp_misc (gdbarch, insn, regs, dsc);
8596       break;
8597 
8598     case 0x4: case 0x5: case 0x6:
8599       err = arm_decode_ld_st_word_ubyte (gdbarch, insn, regs, dsc);
8600       break;
8601 
8602     case 0x7:
8603       err = arm_decode_media (gdbarch, insn, dsc);
8604       break;
8605 
8606     case 0x8: case 0x9: case 0xa: case 0xb:
8607       err = arm_decode_b_bl_ldmstm (gdbarch, insn, regs, dsc);
8608       break;
8609 
8610     case 0xc: case 0xd: case 0xe: case 0xf:
8611       err = arm_decode_svc_copro (gdbarch, insn, regs, dsc);
8612       break;
8613     }
8614 
8615   if (err)
8616     internal_error (_("arm_process_displaced_insn: Instruction decode error"));
8617 }
8618 
8619 /* Actually set up the scratch space for a displaced instruction.  */
8620 
8621 void
arm_displaced_init_closure(struct gdbarch * gdbarch,CORE_ADDR from,CORE_ADDR to,arm_displaced_step_copy_insn_closure * dsc)8622 arm_displaced_init_closure (struct gdbarch *gdbarch, CORE_ADDR from,
8623                                   CORE_ADDR to,
8624                                   arm_displaced_step_copy_insn_closure *dsc)
8625 {
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;
8631 
8632   offset = 0;
8633   /* Poke modified instruction(s).  */
8634   for (i = 0; i < dsc->numinsns; i++)
8635     {
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);
8643 
8644       write_memory_unsigned_integer (to + offset, size,
8645                                              byte_order_for_code,
8646                                              dsc->modinsn[i]);
8647       offset += size;
8648     }
8649 
8650   /* Choose the correct breakpoint instruction.  */
8651   if (dsc->is_thumb)
8652     {
8653       bkp_insn = tdep->thumb_breakpoint;
8654       len = tdep->thumb_breakpoint_size;
8655     }
8656   else
8657     {
8658       bkp_insn = tdep->arm_breakpoint;
8659       len = tdep->arm_breakpoint_size;
8660     }
8661 
8662   /* Put breakpoint afterwards.  */
8663   write_memory (to + offset, bkp_insn, len);
8664 
8665   displaced_debug_printf ("copy %s->%s", paddress (gdbarch, from),
8666                                 paddress (gdbarch, to));
8667 }
8668 
8669 /* Entry point for cleaning things up after a displaced instruction has been
8670    single-stepped.  */
8671 
8672 void
arm_displaced_step_fixup(struct gdbarch * gdbarch,struct displaced_step_copy_insn_closure * dsc_,CORE_ADDR from,CORE_ADDR to,struct regcache * regs,bool completed_p)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)
8677 {
8678   /* The following block exists as a temporary measure while displaced
8679      stepping is fixed architecture at a time within GDB.
8680 
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.
8685 
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.
8690 
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)
8695     {
8696       CORE_ADDR pc = regcache_read_pc (regs);
8697       pc = from + (pc - to);
8698       regcache_write_pc (regs, pc);
8699       return;
8700     }
8701 
8702   arm_displaced_step_copy_insn_closure *dsc
8703     = (arm_displaced_step_copy_insn_closure *) dsc_;
8704 
8705   if (dsc->cleanup)
8706     dsc->cleanup (gdbarch, regs, dsc);
8707 
8708   if (!dsc->wrote_to_pc)
8709     regcache_cooked_write_unsigned (regs, ARM_PC_REGNUM,
8710                                             dsc->insn_addr + dsc->insn_size);
8711 
8712 }
8713 
8714 #include "bfd-in2.h"
8715 #include "libcoff.h"
8716 
8717 static int
gdb_print_insn_arm(bfd_vma memaddr,disassemble_info * info)8718 gdb_print_insn_arm (bfd_vma memaddr, disassemble_info *info)
8719 {
8720   gdb_disassemble_info *di
8721     = static_cast<gdb_disassemble_info *> (info->application_data);
8722   struct gdbarch *gdbarch = di->arch ();
8723 
8724   if (arm_pc_is_thumb (gdbarch, memaddr))
8725     {
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;
8731 
8732       if (csym.native == NULL)
8733           {
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.  */
8739 
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;
8747           }
8748 
8749       memaddr = UNMAKE_THUMB_ADDR (memaddr);
8750       info->symbols = &asym;
8751     }
8752   else
8753     info->symbols = NULL;
8754 
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;
8765 
8766   return default_print_insn (memaddr, info);
8767 }
8768 
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.
8772 
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.
8777 
8778    Note: ARMv4 defines several new instructions that will take the
8779    undefined instruction trap.  ARM7TDMI is nominally ARMv4T, but does
8780    not in fact add the new instructions.  The new undefined
8781    instructions in ARMv4 are all instructions that had no defined
8782    behaviour in earlier chips.  There is no guarantee that they will
8783    raise an exception, but may be treated as NOP's.  In practice, it
8784    may only safe to rely on instructions matching:
8785 
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
8789 
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.
8792 
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.  */
8797 
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}
8802 
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;
8807 
8808 /* Implement the breakpoint_kind_from_pc gdbarch method.  */
8809 
8810 static int
arm_breakpoint_kind_from_pc(struct gdbarch * gdbarch,CORE_ADDR * pcptr)8811 arm_breakpoint_kind_from_pc (struct gdbarch *gdbarch, CORE_ADDR *pcptr)
8812 {
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);
8815 
8816   if (arm_pc_is_thumb (gdbarch, *pcptr))
8817     {
8818       *pcptr = UNMAKE_THUMB_ADDR (*pcptr);
8819 
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)
8823           {
8824             gdb_byte buf[2];
8825 
8826             if (target_read_memory (*pcptr, buf, 2) == 0)
8827               {
8828                 unsigned short inst1;
8829 
8830                 inst1 = extract_unsigned_integer (buf, 2, byte_order_for_code);
8831                 if (thumb_insn_size (inst1) == 4)
8832                     return ARM_BP_KIND_THUMB2;
8833               }
8834           }
8835 
8836       return ARM_BP_KIND_THUMB;
8837     }
8838   else
8839     return ARM_BP_KIND_ARM;
8840 
8841 }
8842 
8843 /* Implement the sw_breakpoint_from_kind gdbarch method.  */
8844 
8845 static const gdb_byte *
arm_sw_breakpoint_from_kind(struct gdbarch * gdbarch,int kind,int * size)8846 arm_sw_breakpoint_from_kind (struct gdbarch *gdbarch, int kind, int *size)
8847 {
8848   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
8849 
8850   switch (kind)
8851     {
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");
8863     }
8864 }
8865 
8866 /* Implement the breakpoint_kind_from_current_state gdbarch method.  */
8867 
8868 static int
arm_breakpoint_kind_from_current_state(struct gdbarch * gdbarch,struct regcache * regcache,CORE_ADDR * pcptr)8869 arm_breakpoint_kind_from_current_state (struct gdbarch *gdbarch,
8870                                                   struct regcache *regcache,
8871                                                   CORE_ADDR *pcptr)
8872 {
8873   gdb_byte buf[4];
8874 
8875   /* Check the memory pointed by PC is readable.  */
8876   if (target_read_memory (regcache_read_pc (regcache), buf, 4) == 0)
8877     {
8878       struct arm_get_next_pcs next_pcs_ctx;
8879 
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),
8884                                    0,
8885                                    regcache);
8886 
8887       std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
8888 
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)
8893           {
8894             if (UNMAKE_THUMB_ADDR (pc) == *pcptr)
8895               {
8896                 if (IS_THUMB_ADDR (pc))
8897                     {
8898                       *pcptr = MAKE_THUMB_ADDR (*pcptr);
8899                       return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
8900                     }
8901                 else
8902                     return ARM_BP_KIND_ARM;
8903               }
8904           }
8905     }
8906 
8907   return arm_breakpoint_kind_from_pc (gdbarch, pcptr);
8908 }
8909 
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.  */
8913 
8914 static void
arm_extract_return_value(struct type * type,struct regcache * regs,gdb_byte * valbuf)8915 arm_extract_return_value (struct type *type, struct regcache *regs,
8916                                 gdb_byte *valbuf)
8917 {
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);
8921 
8922   while (type->code () == TYPE_CODE_RANGE)
8923     type = check_typedef (type->target_type ());
8924 
8925   if (TYPE_CODE_FLT == type->code ())
8926     {
8927       switch (tdep->fp_model)
8928           {
8929           case ARM_FLOAT_FPA:
8930             {
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];
8935 
8936               regs->cooked_read (ARM_F0_REGNUM, tmpbuf);
8937               target_float_convert (tmpbuf, arm_ext_type (gdbarch),
8938                                           valbuf, type);
8939             }
8940             break;
8941 
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;
8952 
8953           default:
8954             internal_error (_("arm_extract_return_value: "
8955                                   "Floating point model not supported"));
8956             break;
8957           }
8958     }
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))
8966     {
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;
8973 
8974       while (len > 0)
8975           {
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;
8985           }
8986     }
8987   else
8988     {
8989       /* For a structure or union the behaviour is as if the value had
8990            been stored to word-aligned memory and then loaded into
8991            registers with 32-bit load instruction(s).  */
8992       int len = type->length ();
8993       int regno = ARM_A1_REGNUM;
8994       bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
8995 
8996       while (len > 0)
8997           {
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;
9003           }
9004     }
9005 }
9006 
9007 
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.  */
9011 
9012 static int
arm_return_in_memory(struct gdbarch * gdbarch,struct type * type)9013 arm_return_in_memory (struct gdbarch *gdbarch, struct type *type)
9014 {
9015   enum type_code code;
9016 
9017   type = check_typedef (type);
9018 
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;
9025 
9026   if (TYPE_HAS_DYNAMIC_LENGTH (type))
9027     return 1;
9028 
9029   if (TYPE_CODE_ARRAY == code && type->is_vector ())
9030     {
9031       /* Vector values should be returned using ARM registers if they
9032            are not over 16 bytes.  */
9033       return (type->length () > 16);
9034     }
9035 
9036   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9037   if (tdep->arm_abi != ARM_ABI_APCS)
9038     {
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;
9044 
9045       return 1;
9046     }
9047   else
9048     {
9049       int nRc;
9050 
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;
9056 
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.
9063 
9064            This function is based on the behaviour of GCC 2.95.1.
9065            See: gcc/arm.c: arm_return_in_memory() for details.
9066 
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.  */
9073 
9074       /* Assume all other aggregate types can be returned in a register.
9075            Run a check for structures, unions and arrays.  */
9076       nRc = 0;
9077 
9078       if ((TYPE_CODE_STRUCT == code) || (TYPE_CODE_UNION == code))
9079           {
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.  */
9088 
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
9094             */
9095 
9096             for (i = 0; i < type->num_fields (); i++)
9097               {
9098                 enum type_code field_type_code;
9099 
9100                 field_type_code
9101                     = check_typedef (type->field (i).type ())->code ();
9102 
9103                 /* Is it a floating point type field?  */
9104                 if (field_type_code == TYPE_CODE_FLT)
9105                     {
9106                       nRc = 1;
9107                       break;
9108                     }
9109 
9110                 /* If bitpos != 0, then we have to care about it.  */
9111                 if (type->field (i).loc_bitpos () != 0)
9112                     {
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)
9117                         {
9118                           nRc = 1;
9119                           break;
9120                         }
9121                     }
9122               }
9123           }
9124 
9125       return nRc;
9126     }
9127 }
9128 
9129 /* Write into appropriate registers a function return value of type
9130    TYPE, given in virtual format.  */
9131 
9132 static void
arm_store_return_value(struct type * type,struct regcache * regs,const gdb_byte * valbuf)9133 arm_store_return_value (struct type *type, struct regcache *regs,
9134                               const gdb_byte *valbuf)
9135 {
9136   struct gdbarch *gdbarch = regs->arch ();
9137   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
9138 
9139   while (type->code () == TYPE_CODE_RANGE)
9140     type = check_typedef (type->target_type ());
9141 
9142   if (type->code () == TYPE_CODE_FLT)
9143     {
9144       gdb_byte buf[ARM_FP_REGISTER_SIZE];
9145       arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9146 
9147       switch (tdep->fp_model)
9148           {
9149           case ARM_FLOAT_FPA:
9150 
9151             target_float_convert (valbuf, type, buf, arm_ext_type (gdbarch));
9152             regs->cooked_write (ARM_F0_REGNUM, buf);
9153             break;
9154 
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;
9165 
9166           default:
9167             internal_error (_("arm_store_return_value: Floating "
9168                                   "point model not supported"));
9169             break;
9170           }
9171     }
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))
9179     {
9180       if (type->length () <= 4)
9181           {
9182             /* Values of one word or less are zero/sign-extended and
9183                returned in r0.  */
9184             bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
9185 
9186             if (is_fixed_point_type (type))
9187               {
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 ());
9193               }
9194             else
9195               {
9196                 LONGEST val = unpack_long (type, valbuf);
9197                 store_signed_integer (tmpbuf, ARM_INT_REGISTER_SIZE, byte_order, val);
9198               }
9199             regs->cooked_write (ARM_A1_REGNUM, tmpbuf);
9200           }
9201       else
9202           {
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;
9208 
9209             while (len > 0)
9210               {
9211                 regs->cooked_write (regno++, valbuf);
9212                 len -= ARM_INT_REGISTER_SIZE;
9213                 valbuf += ARM_INT_REGISTER_SIZE;
9214               }
9215           }
9216     }
9217   else
9218     {
9219       /* For a structure or union the behaviour is as if the value had
9220            been stored to word-aligned memory and then loaded into
9221            registers with 32-bit load instruction(s).  */
9222       int len = type->length ();
9223       int regno = ARM_A1_REGNUM;
9224       bfd_byte tmpbuf[ARM_INT_REGISTER_SIZE];
9225 
9226       while (len > 0)
9227           {
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;
9233           }
9234     }
9235 }
9236 
9237 
9238 /* Handle function return values.  */
9239 
9240 static enum return_value_convention
arm_return_value(struct gdbarch * gdbarch,struct value * function,struct type * valtype,struct regcache * regcache,struct value ** read_value,const gdb_byte * writebuf)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)
9244 {
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;
9249 
9250   if (arm_vfp_abi_for_function (gdbarch, func_type)
9251       && arm_vfp_call_candidate (valtype, &vfp_base_type, &vfp_base_count))
9252     {
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;
9256 
9257       gdb_byte *readbuf = nullptr;
9258       if (read_value != nullptr)
9259           {
9260             *read_value = value::allocate (valtype);
9261             readbuf = (*read_value)->contents_raw ().data ();
9262           }
9263 
9264       for (i = 0; i < vfp_base_count; i++)
9265           {
9266             if (reg_char == 'q')
9267               {
9268                 if (writebuf)
9269                     arm_neon_quad_write (gdbarch, regcache, i,
9270                                              writebuf + i * unit_length);
9271 
9272                 if (readbuf)
9273                     arm_neon_quad_read (gdbarch, regcache, i,
9274                                             readbuf + i * unit_length);
9275               }
9276             else
9277               {
9278                 char name_buf[4];
9279                 int regnum;
9280 
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);
9288               }
9289           }
9290       return RETURN_VALUE_REGISTER_CONVENTION;
9291     }
9292 
9293   if (valtype->code () == TYPE_CODE_STRUCT
9294       || valtype->code () == TYPE_CODE_UNION
9295       || valtype->code () == TYPE_CODE_ARRAY)
9296     {
9297       /* From the AAPCS document:
9298 
9299            Result return:
9300 
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.
9306 
9307            Parameter Passing:
9308 
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))
9314           {
9315             if (read_value != nullptr)
9316               {
9317                 CORE_ADDR addr;
9318 
9319                 regcache->cooked_read (ARM_A1_REGNUM, &addr);
9320                 *read_value = value_at_non_lval (valtype, addr);
9321               }
9322             return RETURN_VALUE_ABI_RETURNS_ADDRESS;
9323           }
9324     }
9325   else if (valtype->code () == TYPE_CODE_COMPLEX)
9326     {
9327       if (arm_return_in_memory (gdbarch, valtype))
9328           return RETURN_VALUE_STRUCT_CONVENTION;
9329     }
9330 
9331   if (writebuf)
9332     arm_store_return_value (valtype, regcache, writebuf);
9333 
9334   if (read_value != nullptr)
9335     {
9336       *read_value = value::allocate (valtype);
9337       gdb_byte *readbuf = (*read_value)->contents_raw ().data ();
9338       arm_extract_return_value (valtype, regcache, readbuf);
9339     }
9340 
9341   return RETURN_VALUE_REGISTER_CONVENTION;
9342 }
9343 
9344 
9345 static int
arm_get_longjmp_target(const frame_info_ptr & frame,CORE_ADDR * pc)9346 arm_get_longjmp_target (const frame_info_ptr &frame, CORE_ADDR *pc)
9347 {
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];
9353 
9354   jb_addr = get_frame_register_unsigned (frame, ARM_A1_REGNUM);
9355 
9356   if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
9357                                 ARM_INT_REGISTER_SIZE))
9358     return 0;
9359 
9360   *pc = extract_unsigned_integer (buf, ARM_INT_REGISTER_SIZE, byte_order);
9361   return 1;
9362 }
9363 /* A call to cmse secure entry function "foo" at "a" is modified by
9364      GNU ld as "b".
9365      a) bl xxxx <foo>
9366 
9367      <foo>
9368      xxxx:
9369 
9370      b) bl yyyy <__acle_se_foo>
9371 
9372      section .gnu.sgstubs:
9373      <foo>
9374      yyyy: sg   // secure gateway
9375              b.w xxxx <__acle_se_foo>  // original_branch_dest
9376 
9377      <__acle_se_foo>
9378      xxxx:
9379 
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.  */
9386 
9387 static CORE_ADDR
arm_skip_cmse_entry(CORE_ADDR pc,const char * name,struct objfile * objfile)9388 arm_skip_cmse_entry (CORE_ADDR pc, const char *name, struct objfile *objfile)
9389 {
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);
9393 
9394   struct bound_minimal_symbol minsym
9395    = lookup_minimal_symbol (target_name, NULL, objfile);
9396 
9397   if (minsym.minsym != nullptr)
9398     return minsym.value_address ();
9399 
9400   return 0;
9401 }
9402 
9403 /* Return true when SEC points to ".gnu.sgstubs" section.  */
9404 
9405 static bool
arm_is_sgstubs_section(struct obj_section * sec)9406 arm_is_sgstubs_section (struct obj_section *sec)
9407 {
9408   return (sec != nullptr
9409             && sec->the_bfd_section != nullptr
9410             && sec->the_bfd_section->name != nullptr
9411             && streq (sec->the_bfd_section->name, ".gnu.sgstubs"));
9412 }
9413 
9414 /* Recognize GCC and GNU ld's trampolines.  If we are in a trampoline,
9415    return the target PC.  Otherwise return 0.  */
9416 
9417 CORE_ADDR
arm_skip_stub(const frame_info_ptr & frame,CORE_ADDR pc)9418 arm_skip_stub (const frame_info_ptr &frame, CORE_ADDR pc)
9419 {
9420   const char *name;
9421   int namelen;
9422   CORE_ADDR start_addr;
9423 
9424   /* Find the starting address and name of the function containing the PC.  */
9425   if (find_pc_partial_function (pc, &name, &start_addr, NULL) == 0)
9426     {
9427       /* Trampoline 'bx reg' doesn't belong to any functions.  Do the
9428            check here.  */
9429       start_addr = arm_skip_bx_reg (frame, pc);
9430       if (start_addr != 0)
9431           return start_addr;
9432 
9433       return 0;
9434     }
9435 
9436   /* If PC is in a Thumb call or return stub, return the address of the
9437      target PC, which is in a register.  The thunk functions are called
9438      _call_via_xx, where x is the register name.  The possible names
9439      are r0-r9, sl, fp, ip, sp, and lr.  ARM RealView has similar
9440      functions, named __ARM_call_via_r[0-7].  */
9441   if (startswith (name, "_call_via_")
9442       || startswith (name, "__ARM_call_via_"))
9443     {
9444       /* Use the name suffix to determine which register contains the
9445            target PC.  */
9446       static const char *table[15] =
9447       {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
9448        "r8", "r9", "sl", "fp", "ip", "sp", "lr"
9449       };
9450       int regno;
9451       int offset = strlen (name) - 2;
9452 
9453       for (regno = 0; regno <= 14; regno++)
9454           if (strcmp (&name[offset], table[regno]) == 0)
9455             return get_frame_register_unsigned (frame, regno);
9456     }
9457 
9458   /* GNU ld generates __foo_from_arm or __foo_from_thumb for
9459      non-interworking calls to foo.  We could decode the stubs
9460      to find the target but it's easier to use the symbol table.  */
9461   namelen = strlen (name);
9462   if (name[0] == '_' && name[1] == '_'
9463       && ((namelen > 2 + strlen ("_from_thumb")
9464              && startswith (name + namelen - strlen ("_from_thumb"), "_from_thumb"))
9465             || (namelen > 2 + strlen ("_from_arm")
9466                 && startswith (name + namelen - strlen ("_from_arm"), "_from_arm"))))
9467     {
9468       char *target_name;
9469       int target_len = namelen - 2;
9470       struct bound_minimal_symbol minsym;
9471       struct objfile *objfile;
9472       struct obj_section *sec;
9473 
9474       if (name[namelen - 1] == 'b')
9475           target_len -= strlen ("_from_thumb");
9476       else
9477           target_len -= strlen ("_from_arm");
9478 
9479       target_name = (char *) alloca (target_len + 1);
9480       memcpy (target_name, name + 2, target_len);
9481       target_name[target_len] = '\0';
9482 
9483       sec = find_pc_section (pc);
9484       objfile = (sec == NULL) ? NULL : sec->objfile;
9485       minsym = lookup_minimal_symbol (target_name, NULL, objfile);
9486       if (minsym.minsym != NULL)
9487           return minsym.value_address ();
9488       else
9489           return 0;
9490     }
9491 
9492   struct obj_section *section = find_pc_section (pc);
9493 
9494   /* Check whether SECTION points to the ".gnu.sgstubs" section.  */
9495   if (arm_is_sgstubs_section (section))
9496     return arm_skip_cmse_entry (pc, name, section->objfile);
9497 
9498   return 0;                             /* not a stub */
9499 }
9500 
9501 static void
arm_update_current_architecture(void)9502 arm_update_current_architecture (void)
9503 {
9504   /* If the current architecture is not ARM, we have nothing to do.  */
9505   gdbarch *arch = current_inferior ()->arch ();
9506   if (gdbarch_bfd_arch_info (arch)->arch != bfd_arch_arm)
9507     return;
9508 
9509   /* Update the architecture.  */
9510   gdbarch_info info;
9511   if (!gdbarch_update_p (info))
9512     internal_error (_("could not update architecture"));
9513 }
9514 
9515 static void
set_fp_model_sfunc(const char * args,int from_tty,struct cmd_list_element * c)9516 set_fp_model_sfunc (const char *args, int from_tty,
9517                         struct cmd_list_element *c)
9518 {
9519   int fp_model;
9520 
9521   for (fp_model = ARM_FLOAT_AUTO; fp_model != ARM_FLOAT_LAST; fp_model++)
9522     if (strcmp (current_fp_model, fp_model_strings[fp_model]) == 0)
9523       {
9524           arm_fp_model = (enum arm_float_model) fp_model;
9525           break;
9526       }
9527 
9528   if (fp_model == ARM_FLOAT_LAST)
9529     internal_error (_("Invalid fp model accepted: %s."),
9530                         current_fp_model);
9531 
9532   arm_update_current_architecture ();
9533 }
9534 
9535 static void
show_fp_model(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9536 show_fp_model (struct ui_file *file, int from_tty,
9537                  struct cmd_list_element *c, const char *value)
9538 {
9539   gdbarch *arch = current_inferior ()->arch ();
9540   if (arm_fp_model == ARM_FLOAT_AUTO
9541       && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9542     {
9543       arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9544 
9545       gdb_printf (file, _("\
9546 The current ARM floating point model is \"auto\" (currently \"%s\").\n"),
9547                       fp_model_strings[tdep->fp_model]);
9548     }
9549   else
9550     gdb_printf (file, _("\
9551 The current ARM floating point model is \"%s\".\n"),
9552                     fp_model_strings[arm_fp_model]);
9553 }
9554 
9555 static void
arm_set_abi(const char * args,int from_tty,struct cmd_list_element * c)9556 arm_set_abi (const char *args, int from_tty,
9557                struct cmd_list_element *c)
9558 {
9559   int arm_abi;
9560 
9561   for (arm_abi = ARM_ABI_AUTO; arm_abi != ARM_ABI_LAST; arm_abi++)
9562     if (strcmp (arm_abi_string, arm_abi_strings[arm_abi]) == 0)
9563       {
9564           arm_abi_global = (enum arm_abi_kind) arm_abi;
9565           break;
9566       }
9567 
9568   if (arm_abi == ARM_ABI_LAST)
9569     internal_error (_("Invalid ABI accepted: %s."),
9570                         arm_abi_string);
9571 
9572   arm_update_current_architecture ();
9573 }
9574 
9575 static void
arm_show_abi(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9576 arm_show_abi (struct ui_file *file, int from_tty,
9577                struct cmd_list_element *c, const char *value)
9578 {
9579   gdbarch *arch = current_inferior ()->arch ();
9580   if (arm_abi_global == ARM_ABI_AUTO
9581       && gdbarch_bfd_arch_info (arch)->arch == bfd_arch_arm)
9582     {
9583       arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (arch);
9584 
9585       gdb_printf (file, _("\
9586 The current ARM ABI is \"auto\" (currently \"%s\").\n"),
9587                       arm_abi_strings[tdep->arm_abi]);
9588     }
9589   else
9590     gdb_printf (file, _("The current ARM ABI is \"%s\".\n"),
9591                     arm_abi_string);
9592 }
9593 
9594 static void
arm_show_fallback_mode(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9595 arm_show_fallback_mode (struct ui_file *file, int from_tty,
9596                               struct cmd_list_element *c, const char *value)
9597 {
9598   gdb_printf (file,
9599                 _("The current execution mode assumed "
9600                     "(when symbols are unavailable) is \"%s\".\n"),
9601                 arm_fallback_mode_string);
9602 }
9603 
9604 static void
arm_show_force_mode(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9605 arm_show_force_mode (struct ui_file *file, int from_tty,
9606                          struct cmd_list_element *c, const char *value)
9607 {
9608   gdb_printf (file,
9609                 _("The current execution mode assumed "
9610                     "(even when symbols are available) is \"%s\".\n"),
9611                 arm_force_mode_string);
9612 }
9613 
9614 static void
arm_show_unwind_secure_frames(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9615 arm_show_unwind_secure_frames (struct ui_file *file, int from_tty,
9616                                struct cmd_list_element *c, const char *value)
9617 {
9618   gdb_printf (file,
9619                 _("Usage of non-secure to secure exception stack unwinding is %s.\n"),
9620                 arm_unwind_secure_frames ? "on" : "off");
9621 }
9622 
9623 /* If the user changes the register disassembly style used for info
9624    register and other commands, we have to also switch the style used
9625    in opcodes for disassembly output.  This function is run in the "set
9626    arm disassembly" command, and does that.  */
9627 
9628 static void
set_disassembly_style_sfunc(const char * args,int from_tty,struct cmd_list_element * c)9629 set_disassembly_style_sfunc (const char *args, int from_tty,
9630                                    struct cmd_list_element *c)
9631 {
9632   /* Convert the short style name into the long style name (eg, reg-names-*)
9633      before calling the generic set_disassembler_options() function.  */
9634   std::string long_name = std::string ("reg-names-") + disassembly_style;
9635   set_disassembler_options (&long_name[0]);
9636 }
9637 
9638 static void
show_disassembly_style_sfunc(struct ui_file * file,int from_tty,struct cmd_list_element * c,const char * value)9639 show_disassembly_style_sfunc (struct ui_file *file, int from_tty,
9640                                     struct cmd_list_element *c, const char *value)
9641 {
9642   struct gdbarch *gdbarch = get_current_arch ();
9643   const char *options = get_disassembler_options (gdbarch);
9644   const char *style = "";
9645   int len = 0;
9646   const char *opt;
9647 
9648   FOR_EACH_DISASSEMBLER_OPTION (opt, options)
9649     if (startswith (opt, "reg-names-"))
9650       {
9651           style = &opt[strlen ("reg-names-")];
9652           len = strcspn (style, ",");
9653       }
9654 
9655   gdb_printf (file, "The disassembly style is \"%.*s\".\n", len, style);
9656 }
9657 
9658 /* Return the ARM register name corresponding to register I.  */
9659 static const char *
arm_register_name(struct gdbarch * gdbarch,int i)9660 arm_register_name (struct gdbarch *gdbarch, int i)
9661 {
9662   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9663 
9664   if (is_s_pseudo (gdbarch, i))
9665     {
9666       static const char *const s_pseudo_names[] = {
9667           "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
9668           "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
9669           "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
9670           "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
9671       };
9672 
9673       return s_pseudo_names[i - tdep->s_pseudo_base];
9674     }
9675 
9676   if (is_q_pseudo (gdbarch, i))
9677     {
9678       static const char *const q_pseudo_names[] = {
9679           "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
9680           "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15",
9681       };
9682 
9683       return q_pseudo_names[i - tdep->q_pseudo_base];
9684     }
9685 
9686   if (is_mve_pseudo (gdbarch, i))
9687     return "p0";
9688 
9689   /* RA_AUTH_CODE is used for unwinding only.  Do not assign it a name.  */
9690   if (is_pacbti_pseudo (gdbarch, i))
9691     return "";
9692 
9693   if (i >= ARRAY_SIZE (arm_register_names))
9694     /* These registers are only supported on targets which supply
9695        an XML description.  */
9696     return "";
9697 
9698   /* Non-pseudo registers.  */
9699   return arm_register_names[i];
9700 }
9701 
9702 /* Test whether the coff symbol specific value corresponds to a Thumb
9703    function.  */
9704 
9705 static int
coff_sym_is_thumb(int val)9706 coff_sym_is_thumb (int val)
9707 {
9708   return (val == C_THUMBEXT
9709             || val == C_THUMBSTAT
9710             || val == C_THUMBEXTFUNC
9711             || val == C_THUMBSTATFUNC
9712             || val == C_THUMBLABEL);
9713 }
9714 
9715 /* arm_coff_make_msymbol_special()
9716    arm_elf_make_msymbol_special()
9717 
9718    These functions test whether the COFF or ELF symbol corresponds to
9719    an address in thumb code, and set a "special" bit in a minimal
9720    symbol to indicate that it does.  */
9721 
9722 static void
arm_elf_make_msymbol_special(asymbol * sym,struct minimal_symbol * msym)9723 arm_elf_make_msymbol_special(asymbol *sym, struct minimal_symbol *msym)
9724 {
9725   elf_symbol_type *elfsym = (elf_symbol_type *) sym;
9726 
9727   if (ARM_GET_SYM_BRANCH_TYPE (elfsym->internal_elf_sym.st_target_internal)
9728       == ST_BRANCH_TO_THUMB)
9729     MSYMBOL_SET_SPECIAL (msym);
9730 }
9731 
9732 static void
arm_coff_make_msymbol_special(int val,struct minimal_symbol * msym)9733 arm_coff_make_msymbol_special(int val, struct minimal_symbol *msym)
9734 {
9735   if (coff_sym_is_thumb (val))
9736     MSYMBOL_SET_SPECIAL (msym);
9737 }
9738 
9739 static void
arm_record_special_symbol(struct gdbarch * gdbarch,struct objfile * objfile,asymbol * sym)9740 arm_record_special_symbol (struct gdbarch *gdbarch, struct objfile *objfile,
9741                                  asymbol *sym)
9742 {
9743   const char *name = bfd_asymbol_name (sym);
9744   struct arm_per_bfd *data;
9745   struct arm_mapping_symbol new_map_sym;
9746 
9747   gdb_assert (name[0] == '$');
9748   if (name[1] != 'a' && name[1] != 't' && name[1] != 'd')
9749     return;
9750 
9751   data = arm_bfd_data_key.get (objfile->obfd.get ());
9752   if (data == NULL)
9753     data = arm_bfd_data_key.emplace (objfile->obfd.get (),
9754                                              objfile->obfd->section_count);
9755   arm_mapping_symbol_vec &map
9756     = data->section_maps[bfd_asymbol_section (sym)->index];
9757 
9758   new_map_sym.value = sym->value;
9759   new_map_sym.type = name[1];
9760 
9761   /* Insert at the end, the vector will be sorted on first use.  */
9762   map.push_back (new_map_sym);
9763 }
9764 
9765 static void
arm_write_pc(struct regcache * regcache,CORE_ADDR pc)9766 arm_write_pc (struct regcache *regcache, CORE_ADDR pc)
9767 {
9768   struct gdbarch *gdbarch = regcache->arch ();
9769   regcache_cooked_write_unsigned (regcache, ARM_PC_REGNUM, pc);
9770 
9771   /* If necessary, set the T bit.  */
9772   if (arm_apcs_32)
9773     {
9774       ULONGEST val, t_bit;
9775       regcache_cooked_read_unsigned (regcache, ARM_PS_REGNUM, &val);
9776       t_bit = arm_psr_thumb_bit (gdbarch);
9777       if (arm_pc_is_thumb (gdbarch, pc))
9778           regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9779                                                   val | t_bit);
9780       else
9781           regcache_cooked_write_unsigned (regcache, ARM_PS_REGNUM,
9782                                                   val & ~t_bit);
9783     }
9784 }
9785 
9786 /* Read the contents of a NEON quad register, by reading from two
9787    double registers.  This is used to implement the quad pseudo
9788    registers, and for argument passing in case the quad registers are
9789    missing; vectors are passed in quad registers when using the VFP
9790    ABI, even if a NEON unit is not present.  REGNUM is the index of
9791    the quad register, in [0, 15].  */
9792 
9793 static enum register_status
arm_neon_quad_read(struct gdbarch * gdbarch,readable_regcache * regcache,int regnum,gdb_byte * buf)9794 arm_neon_quad_read (struct gdbarch *gdbarch, readable_regcache *regcache,
9795                         int regnum, gdb_byte *buf)
9796 {
9797   char name_buf[4];
9798   gdb_byte reg_buf[8];
9799   int double_regnum;
9800   enum register_status status;
9801 
9802   xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9803   double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9804                                                          strlen (name_buf));
9805 
9806   status = regcache->raw_read (double_regnum, reg_buf);
9807   if (status != REG_VALID)
9808     return status;
9809   memcpy (buf, reg_buf, 8);
9810 
9811   status = regcache->raw_read (double_regnum + 1, reg_buf);
9812   if (status != REG_VALID)
9813     return status;
9814   memcpy (buf + 8, reg_buf, 8);
9815 
9816   return REG_VALID;
9817 }
9818 
9819 /* Read the contents of a NEON quad register, by reading from two double
9820    registers, and return it as a value.  QUAD_REG_INDEX is the index of the quad
9821    register, in [0, 15].  */
9822 
9823 static value *
arm_neon_quad_read_value(gdbarch * gdbarch,const frame_info_ptr & next_frame,int pseudo_reg_num,int quad_reg_index)9824 arm_neon_quad_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9825                                 int pseudo_reg_num, int quad_reg_index)
9826 {
9827   std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9828   int double_regnum
9829     = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9830                                            raw_reg_name.length ());
9831 
9832   return pseudo_from_concat_raw (next_frame, pseudo_reg_num, double_regnum,
9833                                          double_regnum + 1);
9834 }
9835 
9836 /* Read the contents of the MVE pseudo register REGNUM and return it as a
9837    value.  */
9838 static value *
arm_mve_pseudo_read_value(gdbarch * gdbarch,const frame_info_ptr & next_frame,int pseudo_reg_num)9839 arm_mve_pseudo_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9840                                  int pseudo_reg_num)
9841 {
9842   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9843 
9844   /* P0 is the first 16 bits of VPR.  */
9845   return pseudo_from_raw_part (next_frame, pseudo_reg_num,
9846                                      tdep->mve_vpr_regnum, 0);
9847 }
9848 
9849 static value *
arm_pseudo_read_value(gdbarch * gdbarch,const frame_info_ptr & next_frame,const int pseudo_reg_num)9850 arm_pseudo_read_value (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9851                            const int pseudo_reg_num)
9852 {
9853   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9854 
9855   gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9856 
9857   if (is_q_pseudo (gdbarch, pseudo_reg_num))
9858     {
9859       /* Quad-precision register.  */
9860       return arm_neon_quad_read_value (gdbarch, next_frame, pseudo_reg_num,
9861                                                pseudo_reg_num - tdep->q_pseudo_base);
9862     }
9863   else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9864     return arm_mve_pseudo_read_value (gdbarch, next_frame, pseudo_reg_num);
9865   else
9866     {
9867       int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9868 
9869       /* Single-precision register.  */
9870       gdb_assert (s_reg_index < 32);
9871 
9872       /* s0 is always the least significant half of d0.  */
9873       int offset;
9874       if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9875           offset = (s_reg_index & 1) ? 0 : 4;
9876       else
9877           offset = (s_reg_index & 1) ? 4 : 0;
9878 
9879       std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9880       int double_regnum
9881           = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9882                                                raw_reg_name.length ());
9883 
9884       return pseudo_from_raw_part (next_frame, pseudo_reg_num, double_regnum,
9885                                            offset);
9886     }
9887 }
9888 
9889 /* Store the contents of BUF to a NEON quad register, by writing to
9890    two double registers.  This is used to implement the quad pseudo
9891    registers, and for argument passing in case the quad registers are
9892    missing; vectors are passed in quad registers when using the VFP
9893    ABI, even if a NEON unit is not present.  REGNUM is the index
9894    of the quad register, in [0, 15].  */
9895 
9896 static void
arm_neon_quad_write(struct gdbarch * gdbarch,struct regcache * regcache,int regnum,const gdb_byte * buf)9897 arm_neon_quad_write (struct gdbarch *gdbarch, struct regcache *regcache,
9898                          int regnum, const gdb_byte *buf)
9899 {
9900   char name_buf[4];
9901   int double_regnum;
9902 
9903   xsnprintf (name_buf, sizeof (name_buf), "d%d", regnum << 1);
9904   double_regnum = user_reg_map_name_to_regnum (gdbarch, name_buf,
9905                                                          strlen (name_buf));
9906 
9907   regcache->raw_write (double_regnum, buf);
9908   regcache->raw_write (double_regnum + 1, buf + 8);
9909 }
9910 
9911 static void
arm_neon_quad_write(gdbarch * gdbarch,const frame_info_ptr & next_frame,int quad_reg_index,gdb::array_view<const gdb_byte> buf)9912 arm_neon_quad_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9913                          int quad_reg_index, gdb::array_view<const gdb_byte> buf)
9914 {
9915   std::string raw_reg_name = string_printf ("d%d", quad_reg_index << 1);
9916   int double_regnum
9917     = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.data (),
9918                                            raw_reg_name.length ());
9919 
9920   pseudo_to_concat_raw (next_frame, buf, double_regnum, double_regnum + 1);
9921 }
9922 
9923 /* Store the contents of BUF to the MVE pseudo register REGNUM.  */
9924 
9925 static void
arm_mve_pseudo_write(gdbarch * gdbarch,const frame_info_ptr & next_frame,int pseudo_reg_num,gdb::array_view<const gdb_byte> buf)9926 arm_mve_pseudo_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9927                           int pseudo_reg_num, gdb::array_view<const gdb_byte> buf)
9928 {
9929   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9930 
9931   /* P0 is the first 16 bits of VPR.  */
9932   pseudo_to_raw_part(next_frame, buf, tdep->mve_vpr_regnum, 0);
9933 }
9934 
9935 static void
arm_pseudo_write(gdbarch * gdbarch,const frame_info_ptr & next_frame,const int pseudo_reg_num,gdb::array_view<const gdb_byte> buf)9936 arm_pseudo_write (gdbarch *gdbarch, const frame_info_ptr &next_frame,
9937                       const int pseudo_reg_num,
9938                       gdb::array_view<const gdb_byte> buf)
9939 {
9940   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
9941 
9942   gdb_assert (pseudo_reg_num >= gdbarch_num_regs (gdbarch));
9943 
9944   if (is_q_pseudo (gdbarch, pseudo_reg_num))
9945     {
9946       /* Quad-precision register.  */
9947       arm_neon_quad_write (gdbarch, next_frame,
9948                                  pseudo_reg_num - tdep->q_pseudo_base, buf);
9949     }
9950   else if (is_mve_pseudo (gdbarch, pseudo_reg_num))
9951     arm_mve_pseudo_write (gdbarch, next_frame, pseudo_reg_num, buf);
9952   else
9953     {
9954       int s_reg_index = pseudo_reg_num - tdep->s_pseudo_base;
9955 
9956       /* Single-precision register.  */
9957       gdb_assert (s_reg_index < 32);
9958 
9959       /* s0 is always the least significant half of d0.  */
9960       int offset;
9961       if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
9962           offset = (s_reg_index & 1) ? 0 : 4;
9963       else
9964           offset = (s_reg_index & 1) ? 4 : 0;
9965 
9966       std::string raw_reg_name = string_printf ("d%d", s_reg_index >> 1);
9967       int double_regnum
9968           = user_reg_map_name_to_regnum (gdbarch, raw_reg_name.c_str (),
9969                                                raw_reg_name.length ());
9970 
9971       pseudo_to_raw_part (next_frame, buf, double_regnum, offset);
9972     }
9973 }
9974 
9975 static struct value *
value_of_arm_user_reg(const frame_info_ptr & frame,const void * baton)9976 value_of_arm_user_reg (const frame_info_ptr &frame, const void *baton)
9977 {
9978   const int *reg_p = (const int *) baton;
9979   return value_of_register (*reg_p, get_next_frame_sentinel_okay (frame));
9980 }
9981 
9982 static enum gdb_osabi
arm_elf_osabi_sniffer(bfd * abfd)9983 arm_elf_osabi_sniffer (bfd *abfd)
9984 {
9985   unsigned int elfosabi;
9986   enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
9987 
9988   elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
9989 
9990   if (elfosabi == ELFOSABI_ARM)
9991     /* GNU tools use this value.  Check note sections in this case,
9992        as well.  */
9993     {
9994       for (asection *sect : gdb_bfd_sections (abfd))
9995           generic_elf_osabi_sniff_abi_tag_sections (abfd, sect, &osabi);
9996     }
9997 
9998   /* Anything else will be handled by the generic ELF sniffer.  */
9999   return osabi;
10000 }
10001 
10002 static int
arm_register_reggroup_p(struct gdbarch * gdbarch,int regnum,const struct reggroup * group)10003 arm_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
10004                                const struct reggroup *group)
10005 {
10006   /* FPS register's type is INT, but belongs to float_reggroup.  Beside
10007      this, FPS register belongs to save_regroup, restore_reggroup, and
10008      all_reggroup, of course.  */
10009   if (regnum == ARM_FPS_REGNUM)
10010     return (group == float_reggroup
10011               || group == save_reggroup
10012               || group == restore_reggroup
10013               || group == all_reggroup);
10014   else
10015     return default_register_reggroup_p (gdbarch, regnum, group);
10016 }
10017 
10018 /* For backward-compatibility we allow two 'g' packet lengths with
10019    the remote protocol depending on whether FPA registers are
10020    supplied.  M-profile targets do not have FPA registers, but some
10021    stubs already exist in the wild which use a 'g' packet which
10022    supplies them albeit with dummy values.  The packet format which
10023    includes FPA registers should be considered deprecated for
10024    M-profile targets.  */
10025 
10026 static void
arm_register_g_packet_guesses(struct gdbarch * gdbarch)10027 arm_register_g_packet_guesses (struct gdbarch *gdbarch)
10028 {
10029   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10030 
10031   if (tdep->is_m)
10032     {
10033       const target_desc *tdesc;
10034 
10035       /* If we know from the executable this is an M-profile target,
10036            cater for remote targets whose register set layout is the
10037            same as the FPA layout.  */
10038       tdesc = arm_read_mprofile_description (ARM_M_TYPE_WITH_FPA);
10039       register_remote_g_packet_guess (gdbarch,
10040                                               ARM_CORE_REGS_SIZE + ARM_FP_REGS_SIZE,
10041                                               tdesc);
10042 
10043       /* The regular M-profile layout.  */
10044       tdesc = arm_read_mprofile_description (ARM_M_TYPE_M_PROFILE);
10045       register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE,
10046                                               tdesc);
10047 
10048       /* M-profile plus M4F VFP.  */
10049       tdesc = arm_read_mprofile_description (ARM_M_TYPE_VFP_D16);
10050       register_remote_g_packet_guess (gdbarch,
10051                                               ARM_CORE_REGS_SIZE + ARM_VFP2_REGS_SIZE,
10052                                               tdesc);
10053       /* M-profile plus MVE.  */
10054       tdesc = arm_read_mprofile_description (ARM_M_TYPE_MVE);
10055       register_remote_g_packet_guess (gdbarch, ARM_CORE_REGS_SIZE
10056                                               + ARM_VFP2_REGS_SIZE
10057                                               + ARM_INT_REGISTER_SIZE, tdesc);
10058 
10059       /* M-profile system (stack pointers).  */
10060       tdesc = arm_read_mprofile_description (ARM_M_TYPE_SYSTEM);
10061       register_remote_g_packet_guess (gdbarch, 2 * ARM_INT_REGISTER_SIZE, tdesc);
10062     }
10063 
10064   /* Otherwise we don't have a useful guess.  */
10065 }
10066 
10067 /* Implement the code_of_frame_writable gdbarch method.  */
10068 
10069 static int
arm_code_of_frame_writable(struct gdbarch * gdbarch,const frame_info_ptr & frame)10070 arm_code_of_frame_writable (struct gdbarch *gdbarch, const frame_info_ptr &frame)
10071 {
10072   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10073 
10074   if (tdep->is_m && get_frame_type (frame) == SIGTRAMP_FRAME)
10075     {
10076       /* M-profile exception frames return to some magic PCs, where
10077            isn't writable at all.  */
10078       return 0;
10079     }
10080   else
10081     return 1;
10082 }
10083 
10084 /* Implement gdbarch_gnu_triplet_regexp.  If the arch name is arm then allow it
10085    to be postfixed by a version (eg armv7hl).  */
10086 
10087 static const char *
arm_gnu_triplet_regexp(struct gdbarch * gdbarch)10088 arm_gnu_triplet_regexp (struct gdbarch *gdbarch)
10089 {
10090   if (strcmp (gdbarch_bfd_arch_info (gdbarch)->arch_name, "arm") == 0)
10091     return "arm(v[^- ]*)?";
10092   return gdbarch_bfd_arch_info (gdbarch)->arch_name;
10093 }
10094 
10095 /* Implement the "get_pc_address_flags" gdbarch method.  */
10096 
10097 static std::string
arm_get_pc_address_flags(const frame_info_ptr & frame,CORE_ADDR pc)10098 arm_get_pc_address_flags (const frame_info_ptr &frame, CORE_ADDR pc)
10099 {
10100   if (get_frame_pc_masked (frame))
10101     return "PAC";
10102 
10103   return "";
10104 }
10105 
10106 /* Initialize the current architecture based on INFO.  If possible,
10107    re-use an architecture from ARCHES, which is a list of
10108    architectures already created during this debugging session.
10109 
10110    Called e.g. at program startup, when reading a core file, and when
10111    reading a binary file.  */
10112 
10113 static struct gdbarch *
arm_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)10114 arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
10115 {
10116   struct gdbarch_list *best_arch;
10117   enum arm_abi_kind arm_abi = arm_abi_global;
10118   enum arm_float_model fp_model = arm_fp_model;
10119   tdesc_arch_data_up tdesc_data;
10120   int i;
10121   bool is_m = false;
10122   bool have_sec_ext = false;
10123   int vfp_register_count = 0;
10124   bool have_s_pseudos = false, have_q_pseudos = false;
10125   bool have_wmmx_registers = false;
10126   bool have_neon = false;
10127   bool have_fpa_registers = true;
10128   const struct target_desc *tdesc = info.target_desc;
10129   bool have_vfp = false;
10130   bool have_mve = false;
10131   bool have_pacbti = false;
10132   int mve_vpr_regnum = -1;
10133   int register_count = ARM_NUM_REGS;
10134   bool have_m_profile_msp = false;
10135   int m_profile_msp_regnum = -1;
10136   int m_profile_psp_regnum = -1;
10137   int m_profile_msp_ns_regnum = -1;
10138   int m_profile_psp_ns_regnum = -1;
10139   int m_profile_msp_s_regnum = -1;
10140   int m_profile_psp_s_regnum = -1;
10141   int tls_regnum = 0;
10142 
10143   /* If we have an object to base this architecture on, try to determine
10144      its ABI.  */
10145 
10146   if (arm_abi == ARM_ABI_AUTO && info.abfd != NULL)
10147     {
10148       int ei_osabi, e_flags;
10149 
10150       switch (bfd_get_flavour (info.abfd))
10151           {
10152           case bfd_target_coff_flavour:
10153             /* Assume it's an old APCS-style ABI.  */
10154             /* XXX WinCE?  */
10155             arm_abi = ARM_ABI_APCS;
10156             break;
10157 
10158           case bfd_target_elf_flavour:
10159             ei_osabi = elf_elfheader (info.abfd)->e_ident[EI_OSABI];
10160             e_flags = elf_elfheader (info.abfd)->e_flags;
10161 
10162             if (ei_osabi == ELFOSABI_ARM)
10163               {
10164                 /* GNU tools used to use this value, but do not for EABI
10165                      objects.  There's nowhere to tag an EABI version
10166                      anyway, so assume APCS.  */
10167                 arm_abi = ARM_ABI_APCS;
10168               }
10169             else if (ei_osabi == ELFOSABI_NONE || ei_osabi == ELFOSABI_GNU)
10170               {
10171                 int eabi_ver = EF_ARM_EABI_VERSION (e_flags);
10172 
10173                 switch (eabi_ver)
10174                     {
10175                     case EF_ARM_EABI_UNKNOWN:
10176                       /* Assume GNU tools.  */
10177                       arm_abi = ARM_ABI_APCS;
10178                       break;
10179 
10180                     case EF_ARM_EABI_VER4:
10181                     case EF_ARM_EABI_VER5:
10182                       arm_abi = ARM_ABI_AAPCS;
10183                       /* EABI binaries default to VFP float ordering.
10184                          They may also contain build attributes that can
10185                          be used to identify if the VFP argument-passing
10186                          ABI is in use.  */
10187                       if (fp_model == ARM_FLOAT_AUTO)
10188                         {
10189 #ifdef HAVE_ELF
10190                           switch (bfd_elf_get_obj_attr_int (info.abfd,
10191                                                                       OBJ_ATTR_PROC,
10192                                                                       Tag_ABI_VFP_args))
10193                               {
10194                               case AEABI_VFP_args_base:
10195                                 /* "The user intended FP parameter/result
10196                                    passing to conform to AAPCS, base
10197                                    variant".  */
10198                                 fp_model = ARM_FLOAT_SOFT_VFP;
10199                                 break;
10200                               case AEABI_VFP_args_vfp:
10201                                 /* "The user intended FP parameter/result
10202                                    passing to conform to AAPCS, VFP
10203                                    variant".  */
10204                                 fp_model = ARM_FLOAT_VFP;
10205                                 break;
10206                               case AEABI_VFP_args_toolchain:
10207                                 /* "The user intended FP parameter/result
10208                                    passing to conform to tool chain-specific
10209                                    conventions" - we don't know any such
10210                                    conventions, so leave it as "auto".  */
10211                                 break;
10212                               case AEABI_VFP_args_compatible:
10213                                 /* "Code is compatible with both the base
10214                                    and VFP variants; the user did not permit
10215                                    non-variadic functions to pass FP
10216                                    parameters/results" - leave it as
10217                                    "auto".  */
10218                                 break;
10219                               default:
10220                                 /* Attribute value not mentioned in the
10221                                    November 2012 ABI, so leave it as
10222                                    "auto".  */
10223                                 break;
10224                               }
10225 #else
10226                           fp_model = ARM_FLOAT_SOFT_VFP;
10227 #endif
10228                         }
10229                       break;
10230 
10231                     default:
10232                       /* Leave it as "auto".  */
10233                       warning (_("unknown ARM EABI version 0x%x"), eabi_ver);
10234                       break;
10235                     }
10236 
10237 #ifdef HAVE_ELF
10238                 /* Detect M-profile programs.  This only works if the
10239                      executable file includes build attributes; GCC does
10240                      copy them to the executable, but e.g. RealView does
10241                      not.  */
10242                 int attr_arch
10243                     = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10244                                                       Tag_CPU_arch);
10245                 int attr_profile
10246                     = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10247                                                       Tag_CPU_arch_profile);
10248 
10249                 /* GCC specifies the profile for v6-M; RealView only
10250                      specifies the profile for architectures starting with
10251                      V7 (as opposed to architectures with a tag
10252                      numerically greater than TAG_CPU_ARCH_V7).  */
10253                 if (!tdesc_has_registers (tdesc)
10254                       && (attr_arch == TAG_CPU_ARCH_V6_M
10255                           || attr_arch == TAG_CPU_ARCH_V6S_M
10256                           || attr_arch == TAG_CPU_ARCH_V7E_M
10257                           || attr_arch == TAG_CPU_ARCH_V8M_BASE
10258                           || attr_arch == TAG_CPU_ARCH_V8M_MAIN
10259                           || attr_arch == TAG_CPU_ARCH_V8_1M_MAIN
10260                           || attr_profile == 'M'))
10261                     is_m = true;
10262 
10263                 /* Look for attributes that indicate support for ARMv8.1-m
10264                      PACBTI.  */
10265                 if (!tdesc_has_registers (tdesc) && is_m)
10266                     {
10267                       int attr_pac_extension
10268                         = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10269                                                             Tag_PAC_extension);
10270 
10271                       int attr_bti_extension
10272                         = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10273                                                             Tag_BTI_extension);
10274 
10275                       int attr_pacret_use
10276                         = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10277                                                             Tag_PACRET_use);
10278 
10279                       int attr_bti_use
10280                         = bfd_elf_get_obj_attr_int (info.abfd, OBJ_ATTR_PROC,
10281                                                             Tag_BTI_use);
10282 
10283                       if (attr_pac_extension != 0 || attr_bti_extension != 0
10284                           || attr_pacret_use != 0 || attr_bti_use != 0)
10285                         have_pacbti = true;
10286                     }
10287 #endif
10288               }
10289 
10290             if (fp_model == ARM_FLOAT_AUTO)
10291               {
10292                 switch (e_flags & (EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT))
10293                     {
10294                     case 0:
10295                       /* Leave it as "auto".  Strictly speaking this case
10296                          means FPA, but almost nobody uses that now, and
10297                          many toolchains fail to set the appropriate bits
10298                          for the floating-point model they use.  */
10299                       break;
10300                     case EF_ARM_SOFT_FLOAT:
10301                       fp_model = ARM_FLOAT_SOFT_FPA;
10302                       break;
10303                     case EF_ARM_VFP_FLOAT:
10304                       fp_model = ARM_FLOAT_VFP;
10305                       break;
10306                     case EF_ARM_SOFT_FLOAT | EF_ARM_VFP_FLOAT:
10307                       fp_model = ARM_FLOAT_SOFT_VFP;
10308                       break;
10309                     }
10310               }
10311 
10312             if (e_flags & EF_ARM_BE8)
10313               info.byte_order_for_code = BFD_ENDIAN_LITTLE;
10314 
10315             break;
10316 
10317           default:
10318             /* Leave it as "auto".  */
10319             break;
10320           }
10321     }
10322 
10323   /* Check any target description for validity.  */
10324   if (tdesc_has_registers (tdesc))
10325     {
10326       /* For most registers we require GDB's default names; but also allow
10327            the numeric names for sp / lr / pc, as a convenience.  */
10328       static const char *const arm_sp_names[] = { "r13", "sp", NULL };
10329       static const char *const arm_lr_names[] = { "r14", "lr", NULL };
10330       static const char *const arm_pc_names[] = { "r15", "pc", NULL };
10331 
10332       const struct tdesc_feature *feature;
10333       int valid_p;
10334 
10335       feature = tdesc_find_feature (tdesc,
10336                                             "org.gnu.gdb.arm.core");
10337       if (feature == NULL)
10338           {
10339             feature = tdesc_find_feature (tdesc,
10340                                                   "org.gnu.gdb.arm.m-profile");
10341             if (feature == NULL)
10342               return NULL;
10343             else
10344               is_m = true;
10345           }
10346 
10347       tdesc_data = tdesc_data_alloc ();
10348 
10349       valid_p = 1;
10350       for (i = 0; i < ARM_SP_REGNUM; i++)
10351           valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10352                                                       arm_register_names[i]);
10353       valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10354                                                               ARM_SP_REGNUM,
10355                                                               arm_sp_names);
10356       valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10357                                                               ARM_LR_REGNUM,
10358                                                               arm_lr_names);
10359       valid_p &= tdesc_numbered_register_choices (feature, tdesc_data.get (),
10360                                                               ARM_PC_REGNUM,
10361                                                               arm_pc_names);
10362       if (is_m)
10363           valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10364                                                       ARM_PS_REGNUM, "xpsr");
10365       else
10366           valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10367                                                       ARM_PS_REGNUM, "cpsr");
10368 
10369       if (!valid_p)
10370           return NULL;
10371 
10372       if (is_m)
10373           {
10374             feature = tdesc_find_feature (tdesc,
10375                                                   "org.gnu.gdb.arm.m-system");
10376             if (feature != nullptr)
10377               {
10378                 /* MSP */
10379                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10380                                                               register_count, "msp");
10381                 if (!valid_p)
10382                     {
10383                       warning (_("M-profile m-system feature is missing required register msp."));
10384                       return nullptr;
10385                     }
10386                 have_m_profile_msp = true;
10387                 m_profile_msp_regnum = register_count++;
10388 
10389                 /* PSP */
10390                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10391                                                               register_count, "psp");
10392                 if (!valid_p)
10393                     {
10394                       warning (_("M-profile m-system feature is missing required register psp."));
10395                       return nullptr;
10396                     }
10397                 m_profile_psp_regnum = register_count++;
10398               }
10399           }
10400 
10401       feature = tdesc_find_feature (tdesc,
10402                                             "org.gnu.gdb.arm.fpa");
10403       if (feature != NULL)
10404           {
10405             valid_p = 1;
10406             for (i = ARM_F0_REGNUM; i <= ARM_FPS_REGNUM; i++)
10407               valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10408                                                             arm_register_names[i]);
10409             if (!valid_p)
10410               return NULL;
10411           }
10412       else
10413           have_fpa_registers = false;
10414 
10415       feature = tdesc_find_feature (tdesc,
10416                                             "org.gnu.gdb.xscale.iwmmxt");
10417       if (feature != NULL)
10418           {
10419             static const char *const iwmmxt_names[] = {
10420               "wR0", "wR1", "wR2", "wR3", "wR4", "wR5", "wR6", "wR7",
10421               "wR8", "wR9", "wR10", "wR11", "wR12", "wR13", "wR14", "wR15",
10422               "wCID", "wCon", "wCSSF", "wCASF", "", "", "", "",
10423               "wCGR0", "wCGR1", "wCGR2", "wCGR3", "", "", "", "",
10424             };
10425 
10426             valid_p = 1;
10427             for (i = ARM_WR0_REGNUM; i <= ARM_WR15_REGNUM; i++)
10428               valid_p
10429                 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10430                                                     iwmmxt_names[i - ARM_WR0_REGNUM]);
10431 
10432             /* Check for the control registers, but do not fail if they
10433                are missing.  */
10434             for (i = ARM_WC0_REGNUM; i <= ARM_WCASF_REGNUM; i++)
10435               tdesc_numbered_register (feature, tdesc_data.get (), i,
10436                                              iwmmxt_names[i - ARM_WR0_REGNUM]);
10437 
10438             for (i = ARM_WCGR0_REGNUM; i <= ARM_WCGR3_REGNUM; i++)
10439               valid_p
10440                 &= tdesc_numbered_register (feature, tdesc_data.get (), i,
10441                                                     iwmmxt_names[i - ARM_WR0_REGNUM]);
10442 
10443             if (!valid_p)
10444               return NULL;
10445 
10446             have_wmmx_registers = true;
10447           }
10448 
10449       /* If we have a VFP unit, check whether the single precision registers
10450            are present.  If not, then we will synthesize them as pseudo
10451            registers.  */
10452       feature = tdesc_find_feature (tdesc,
10453                                             "org.gnu.gdb.arm.vfp");
10454       if (feature != NULL)
10455           {
10456             static const char *const vfp_double_names[] = {
10457               "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
10458               "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
10459               "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
10460               "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
10461             };
10462 
10463             /* Require the double precision registers.  There must be either
10464                16 or 32.  */
10465             valid_p = 1;
10466             for (i = 0; i < 32; i++)
10467               {
10468                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10469                                                               ARM_D0_REGNUM + i,
10470                                                               vfp_double_names[i]);
10471                 if (!valid_p)
10472                     break;
10473               }
10474             if (!valid_p && i == 16)
10475               valid_p = 1;
10476 
10477             /* Also require FPSCR.  */
10478             valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10479                                                         ARM_FPSCR_REGNUM, "fpscr");
10480             if (!valid_p)
10481               return NULL;
10482 
10483             have_vfp = true;
10484 
10485             if (tdesc_unnumbered_register (feature, "s0") == 0)
10486               have_s_pseudos = true;
10487 
10488             vfp_register_count = i;
10489 
10490             /* If we have VFP, also check for NEON.  The architecture allows
10491                NEON without VFP (integer vector operations only), but GDB
10492                does not support that.  */
10493             feature = tdesc_find_feature (tdesc,
10494                                                   "org.gnu.gdb.arm.neon");
10495             if (feature != NULL)
10496               {
10497                 /* NEON requires 32 double-precision registers.  */
10498                 if (i != 32)
10499                     return NULL;
10500 
10501                 /* If there are quad registers defined by the stub, use
10502                      their type; otherwise (normally) provide them with
10503                      the default type.  */
10504                 if (tdesc_unnumbered_register (feature, "q0") == 0)
10505                     have_q_pseudos = true;
10506               }
10507           }
10508 
10509       /* Check for the TLS register feature.  */
10510       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.arm.tls");
10511       if (feature != nullptr)
10512           {
10513             valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10514                                                         register_count, "tpidruro");
10515             if (!valid_p)
10516               return nullptr;
10517 
10518             tls_regnum = register_count;
10519             register_count++;
10520           }
10521 
10522       /* Check for MVE after all the checks for GPR's, VFP and Neon.
10523            MVE (Helium) is an M-profile extension.  */
10524       if (is_m)
10525           {
10526             /* Do we have the MVE feature?  */
10527             feature = tdesc_find_feature (tdesc,"org.gnu.gdb.arm.m-profile-mve");
10528 
10529             if (feature != nullptr)
10530               {
10531                 /* If we have MVE, we must always have the VPR register.  */
10532                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10533                                                               register_count, "vpr");
10534                 if (!valid_p)
10535                     {
10536                       warning (_("MVE feature is missing required register vpr."));
10537                       return nullptr;
10538                     }
10539 
10540                 have_mve = true;
10541                 mve_vpr_regnum = register_count;
10542                 register_count++;
10543 
10544                 /* We can't have Q pseudo registers available here, as that
10545                      would mean we have NEON features, and that is only available
10546                      on A and R profiles.  */
10547                 gdb_assert (!have_q_pseudos);
10548 
10549                 /* Given we have a M-profile target description, if MVE is
10550                      enabled and there are VFP registers, we should have Q
10551                      pseudo registers (Q0 ~ Q7).  */
10552                 if (have_vfp)
10553                     have_q_pseudos = true;
10554               }
10555 
10556             /* Do we have the ARMv8.1-m PACBTI feature?  */
10557             feature = tdesc_find_feature (tdesc,
10558                                                   "org.gnu.gdb.arm.m-profile-pacbti");
10559             if (feature != nullptr)
10560               {
10561                 /* By advertising this feature, the target acknowledges the
10562                      presence of the ARMv8.1-m PACBTI extensions.
10563 
10564                      We don't care for any particular registers in this group, so
10565                      the target is free to include whatever it deems appropriate.
10566 
10567                      The expectation is for this feature to include the PAC
10568                      keys.  */
10569                 have_pacbti = true;
10570               }
10571 
10572             /* Do we have the Security extension?  */
10573             feature = tdesc_find_feature (tdesc,
10574                                                   "org.gnu.gdb.arm.secext");
10575             if (feature != nullptr)
10576               {
10577                 /* Secure/Non-secure stack pointers.  */
10578                 /* MSP_NS */
10579                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10580                                                              register_count, "msp_ns");
10581                 if (!valid_p)
10582                     {
10583                       warning (_("M-profile secext feature is missing required register msp_ns."));
10584                       return nullptr;
10585                     }
10586                 m_profile_msp_ns_regnum = register_count++;
10587 
10588                 /* PSP_NS */
10589                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10590                                                              register_count, "psp_ns");
10591                 if (!valid_p)
10592                     {
10593                       warning (_("M-profile secext feature is missing required register psp_ns."));
10594                       return nullptr;
10595                     }
10596                 m_profile_psp_ns_regnum = register_count++;
10597 
10598                 /* MSP_S */
10599                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10600                                                              register_count, "msp_s");
10601                 if (!valid_p)
10602                     {
10603                       warning (_("M-profile secext feature is missing required register msp_s."));
10604                       return nullptr;
10605                     }
10606                 m_profile_msp_s_regnum = register_count++;
10607 
10608                 /* PSP_S */
10609                 valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
10610                                                              register_count, "psp_s");
10611                 if (!valid_p)
10612                     {
10613                       warning (_("M-profile secext feature is missing required register psp_s."));
10614                       return nullptr;
10615                     }
10616                 m_profile_psp_s_regnum = register_count++;
10617 
10618                 have_sec_ext = true;
10619               }
10620 
10621           }
10622     }
10623 
10624   /* If there is already a candidate, use it.  */
10625   for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
10626        best_arch != NULL;
10627        best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
10628     {
10629       arm_gdbarch_tdep *tdep
10630           = gdbarch_tdep<arm_gdbarch_tdep> (best_arch->gdbarch);
10631 
10632       if (arm_abi != ARM_ABI_AUTO && arm_abi != tdep->arm_abi)
10633           continue;
10634 
10635       if (fp_model != ARM_FLOAT_AUTO && fp_model != tdep->fp_model)
10636           continue;
10637 
10638       /* There are various other properties in tdep that we do not
10639            need to check here: those derived from a target description,
10640            since gdbarches with a different target description are
10641            automatically disqualified.  */
10642 
10643       /* Do check is_m, though, since it might come from the binary.  */
10644       if (is_m != tdep->is_m)
10645           continue;
10646 
10647       /* Also check for ARMv8.1-m PACBTI support, since it might come from
10648            the binary.  */
10649       if (have_pacbti != tdep->have_pacbti)
10650           continue;
10651 
10652       /* Found a match.  */
10653       break;
10654     }
10655 
10656   if (best_arch != NULL)
10657     return best_arch->gdbarch;
10658 
10659   gdbarch *gdbarch
10660     = gdbarch_alloc (&info, gdbarch_tdep_up (new arm_gdbarch_tdep));
10661   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10662 
10663   /* Record additional information about the architecture we are defining.
10664      These are gdbarch discriminators, like the OSABI.  */
10665   tdep->arm_abi = arm_abi;
10666   tdep->fp_model = fp_model;
10667   tdep->is_m = is_m;
10668   tdep->have_sec_ext = have_sec_ext;
10669   tdep->have_fpa_registers = have_fpa_registers;
10670   tdep->have_wmmx_registers = have_wmmx_registers;
10671   gdb_assert (vfp_register_count == 0
10672                 || vfp_register_count == 16
10673                 || vfp_register_count == 32);
10674   tdep->vfp_register_count = vfp_register_count;
10675   tdep->have_s_pseudos = have_s_pseudos;
10676   tdep->have_q_pseudos = have_q_pseudos;
10677   tdep->have_neon = have_neon;
10678   tdep->tls_regnum = tls_regnum;
10679 
10680   /* Adjust the MVE feature settings.  */
10681   if (have_mve)
10682     {
10683       tdep->have_mve = true;
10684       tdep->mve_vpr_regnum = mve_vpr_regnum;
10685     }
10686 
10687   /* Adjust the PACBTI feature settings.  */
10688   tdep->have_pacbti = have_pacbti;
10689 
10690   /* Adjust the M-profile stack pointers settings.  */
10691   if (have_m_profile_msp)
10692     {
10693       tdep->m_profile_msp_regnum = m_profile_msp_regnum;
10694       tdep->m_profile_psp_regnum = m_profile_psp_regnum;
10695       tdep->m_profile_msp_ns_regnum = m_profile_msp_ns_regnum;
10696       tdep->m_profile_psp_ns_regnum = m_profile_psp_ns_regnum;
10697       tdep->m_profile_msp_s_regnum = m_profile_msp_s_regnum;
10698       tdep->m_profile_psp_s_regnum = m_profile_psp_s_regnum;
10699     }
10700 
10701   arm_register_g_packet_guesses (gdbarch);
10702 
10703   /* Breakpoints.  */
10704   switch (info.byte_order_for_code)
10705     {
10706     case BFD_ENDIAN_BIG:
10707       tdep->arm_breakpoint = arm_default_arm_be_breakpoint;
10708       tdep->arm_breakpoint_size = sizeof (arm_default_arm_be_breakpoint);
10709       tdep->thumb_breakpoint = arm_default_thumb_be_breakpoint;
10710       tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_be_breakpoint);
10711 
10712       break;
10713 
10714     case BFD_ENDIAN_LITTLE:
10715       tdep->arm_breakpoint = arm_default_arm_le_breakpoint;
10716       tdep->arm_breakpoint_size = sizeof (arm_default_arm_le_breakpoint);
10717       tdep->thumb_breakpoint = arm_default_thumb_le_breakpoint;
10718       tdep->thumb_breakpoint_size = sizeof (arm_default_thumb_le_breakpoint);
10719 
10720       break;
10721 
10722     default:
10723       internal_error (_("arm_gdbarch_init: bad byte order for float format"));
10724     }
10725 
10726   /* On ARM targets char defaults to unsigned.  */
10727   set_gdbarch_char_signed (gdbarch, 0);
10728 
10729   /* wchar_t is unsigned under the AAPCS.  */
10730   if (tdep->arm_abi == ARM_ABI_AAPCS)
10731     set_gdbarch_wchar_signed (gdbarch, 0);
10732   else
10733     set_gdbarch_wchar_signed (gdbarch, 1);
10734 
10735   /* Compute type alignment.  */
10736   set_gdbarch_type_align (gdbarch, arm_type_align);
10737 
10738   /* Note: for displaced stepping, this includes the breakpoint, and one word
10739      of additional scratch space.  This setting isn't used for anything beside
10740      displaced stepping at present.  */
10741   set_gdbarch_displaced_step_buffer_length
10742     (gdbarch, 4 * ARM_DISPLACED_MODIFIED_INSNS);
10743   set_gdbarch_max_insn_length (gdbarch, 4);
10744 
10745   /* This should be low enough for everything.  */
10746   tdep->lowest_pc = 0x20;
10747   tdep->jb_pc = -1; /* Longjump support not enabled by default.  */
10748 
10749   /* The default, for both APCS and AAPCS, is to return small
10750      structures in registers.  */
10751   tdep->struct_return = reg_struct_return;
10752 
10753   set_gdbarch_push_dummy_call (gdbarch, arm_push_dummy_call);
10754   set_gdbarch_frame_align (gdbarch, arm_frame_align);
10755 
10756   if (is_m)
10757     set_gdbarch_code_of_frame_writable (gdbarch, arm_code_of_frame_writable);
10758 
10759   set_gdbarch_write_pc (gdbarch, arm_write_pc);
10760 
10761   frame_base_set_default (gdbarch, &arm_normal_base);
10762 
10763   /* Address manipulation.  */
10764   set_gdbarch_addr_bits_remove (gdbarch, arm_addr_bits_remove);
10765 
10766   /* Advance PC across function entry code.  */
10767   set_gdbarch_skip_prologue (gdbarch, arm_skip_prologue);
10768 
10769   /* Detect whether PC is at a point where the stack has been destroyed.  */
10770   set_gdbarch_stack_frame_destroyed_p (gdbarch, arm_stack_frame_destroyed_p);
10771 
10772   /* Skip trampolines.  */
10773   set_gdbarch_skip_trampoline_code (gdbarch, arm_skip_stub);
10774 
10775   /* The stack grows downward.  */
10776   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
10777 
10778   /* Breakpoint manipulation.  */
10779   set_gdbarch_breakpoint_kind_from_pc (gdbarch, arm_breakpoint_kind_from_pc);
10780   set_gdbarch_sw_breakpoint_from_kind (gdbarch, arm_sw_breakpoint_from_kind);
10781   set_gdbarch_breakpoint_kind_from_current_state (gdbarch,
10782                                                               arm_breakpoint_kind_from_current_state);
10783 
10784   /* Information about registers, etc.  */
10785   set_gdbarch_sp_regnum (gdbarch, ARM_SP_REGNUM);
10786   set_gdbarch_pc_regnum (gdbarch, ARM_PC_REGNUM);
10787   set_gdbarch_num_regs (gdbarch, register_count);
10788   set_gdbarch_register_type (gdbarch, arm_register_type);
10789   set_gdbarch_register_reggroup_p (gdbarch, arm_register_reggroup_p);
10790 
10791   /* This "info float" is FPA-specific.  Use the generic version if we
10792      do not have FPA.  */
10793   if (tdep->have_fpa_registers)
10794     set_gdbarch_print_float_info (gdbarch, arm_print_float_info);
10795 
10796   /* Internal <-> external register number maps.  */
10797   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arm_dwarf_reg_to_regnum);
10798   set_gdbarch_register_sim_regno (gdbarch, arm_register_sim_regno);
10799 
10800   set_gdbarch_register_name (gdbarch, arm_register_name);
10801 
10802   /* Returning results.  */
10803   set_gdbarch_return_value_as_value (gdbarch, arm_return_value);
10804 
10805   /* Disassembly.  */
10806   set_gdbarch_print_insn (gdbarch, gdb_print_insn_arm);
10807 
10808   /* Minsymbol frobbing.  */
10809   set_gdbarch_elf_make_msymbol_special (gdbarch, arm_elf_make_msymbol_special);
10810   set_gdbarch_coff_make_msymbol_special (gdbarch,
10811                                                    arm_coff_make_msymbol_special);
10812   set_gdbarch_record_special_symbol (gdbarch, arm_record_special_symbol);
10813 
10814   /* Thumb-2 IT block support.  */
10815   set_gdbarch_adjust_breakpoint_address (gdbarch,
10816                                                    arm_adjust_breakpoint_address);
10817 
10818   /* Virtual tables.  */
10819   set_gdbarch_vbit_in_delta (gdbarch, 1);
10820 
10821   /* Hook in the ABI-specific overrides, if they have been registered.  */
10822   gdbarch_init_osabi (info, gdbarch);
10823 
10824   dwarf2_frame_set_init_reg (gdbarch, arm_dwarf2_frame_init_reg);
10825 
10826   /* Add some default predicates.  */
10827   if (is_m)
10828     frame_unwind_append_unwinder (gdbarch, &arm_m_exception_unwind);
10829   frame_unwind_append_unwinder (gdbarch, &arm_stub_unwind);
10830   dwarf2_append_unwinders (gdbarch);
10831   frame_unwind_append_unwinder (gdbarch, &arm_exidx_unwind);
10832   frame_unwind_append_unwinder (gdbarch, &arm_epilogue_frame_unwind);
10833   frame_unwind_append_unwinder (gdbarch, &arm_prologue_unwind);
10834 
10835   /* Now we have tuned the configuration, set a few final things,
10836      based on what the OS ABI has told us.  */
10837 
10838   /* If the ABI is not otherwise marked, assume the old GNU APCS.  EABI
10839      binaries are always marked.  */
10840   if (tdep->arm_abi == ARM_ABI_AUTO)
10841     tdep->arm_abi = ARM_ABI_APCS;
10842 
10843   /* Watchpoints are not steppable.  */
10844   set_gdbarch_have_nonsteppable_watchpoint (gdbarch, 1);
10845 
10846   /* We used to default to FPA for generic ARM, but almost nobody
10847      uses that now, and we now provide a way for the user to force
10848      the model.  So default to the most useful variant.  */
10849   if (tdep->fp_model == ARM_FLOAT_AUTO)
10850     tdep->fp_model = ARM_FLOAT_SOFT_FPA;
10851 
10852   if (tdep->jb_pc >= 0)
10853     set_gdbarch_get_longjmp_target (gdbarch, arm_get_longjmp_target);
10854 
10855   /* Floating point sizes and format.  */
10856   set_gdbarch_float_format (gdbarch, floatformats_ieee_single);
10857   if (tdep->fp_model == ARM_FLOAT_SOFT_FPA || tdep->fp_model == ARM_FLOAT_FPA)
10858     {
10859       set_gdbarch_double_format
10860           (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10861       set_gdbarch_long_double_format
10862           (gdbarch, floatformats_ieee_double_littlebyte_bigword);
10863     }
10864   else
10865     {
10866       set_gdbarch_double_format (gdbarch, floatformats_ieee_double);
10867       set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double);
10868     }
10869 
10870   /* Hook used to decorate frames with signed return addresses, only available
10871      for ARMv8.1-m PACBTI.  */
10872   if (is_m && have_pacbti)
10873     set_gdbarch_get_pc_address_flags (gdbarch, arm_get_pc_address_flags);
10874 
10875   if (tdesc_data != nullptr)
10876     {
10877       set_tdesc_pseudo_register_name (gdbarch, arm_register_name);
10878 
10879       tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
10880       register_count = gdbarch_num_regs (gdbarch);
10881 
10882       /* Override tdesc_register_type to adjust the types of VFP
10883            registers for NEON.  */
10884       set_gdbarch_register_type (gdbarch, arm_register_type);
10885     }
10886 
10887   /* Initialize the pseudo register data.  */
10888   int num_pseudos = 0;
10889   if (tdep->have_s_pseudos)
10890     {
10891       /* VFP single precision pseudo registers (S0~S31).  */
10892       tdep->s_pseudo_base = register_count;
10893       tdep->s_pseudo_count = 32;
10894       num_pseudos += tdep->s_pseudo_count;
10895 
10896       if (tdep->have_q_pseudos)
10897           {
10898             /* NEON quad precision pseudo registers (Q0~Q15).  */
10899             tdep->q_pseudo_base = register_count + num_pseudos;
10900 
10901             if (have_neon)
10902               tdep->q_pseudo_count = 16;
10903             else if (have_mve)
10904               tdep->q_pseudo_count = ARM_MVE_NUM_Q_REGS;
10905 
10906             num_pseudos += tdep->q_pseudo_count;
10907           }
10908     }
10909 
10910   /* Do we have any MVE pseudo registers?  */
10911   if (have_mve)
10912     {
10913       tdep->mve_pseudo_base = register_count + num_pseudos;
10914       tdep->mve_pseudo_count = 1;
10915       num_pseudos += tdep->mve_pseudo_count;
10916     }
10917 
10918   /* Do we have any ARMv8.1-m PACBTI pseudo registers.  */
10919   if (have_pacbti)
10920     {
10921       tdep->pacbti_pseudo_base = register_count + num_pseudos;
10922       tdep->pacbti_pseudo_count = 1;
10923       num_pseudos += tdep->pacbti_pseudo_count;
10924     }
10925 
10926   /* Set some pseudo register hooks, if we have pseudo registers.  */
10927   if (tdep->have_s_pseudos || have_mve || have_pacbti)
10928     {
10929       set_gdbarch_num_pseudo_regs (gdbarch, num_pseudos);
10930       set_gdbarch_pseudo_register_read_value (gdbarch, arm_pseudo_read_value);
10931       set_gdbarch_pseudo_register_write (gdbarch, arm_pseudo_write);
10932     }
10933 
10934   /* Add standard register aliases.  We add aliases even for those
10935      names which are used by the current architecture - it's simpler,
10936      and does no harm, since nothing ever lists user registers.  */
10937   for (i = 0; i < ARRAY_SIZE (arm_register_aliases); i++)
10938     user_reg_add (gdbarch, arm_register_aliases[i].name,
10939                       value_of_arm_user_reg, &arm_register_aliases[i].regnum);
10940 
10941   set_gdbarch_disassembler_options (gdbarch, &arm_disassembler_options);
10942   set_gdbarch_valid_disassembler_options (gdbarch, disassembler_options_arm ());
10943 
10944   set_gdbarch_gnu_triplet_regexp (gdbarch, arm_gnu_triplet_regexp);
10945 
10946   return gdbarch;
10947 }
10948 
10949 static void
arm_dump_tdep(struct gdbarch * gdbarch,struct ui_file * file)10950 arm_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
10951 {
10952   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
10953 
10954   if (tdep == NULL)
10955     return;
10956 
10957   gdb_printf (file, _("arm_dump_tdep: fp_model = %i\n"),
10958                 (int) tdep->fp_model);
10959   gdb_printf (file, _("arm_dump_tdep: have_fpa_registers = %i\n"),
10960                 (int) tdep->have_fpa_registers);
10961   gdb_printf (file, _("arm_dump_tdep: have_wmmx_registers = %i\n"),
10962                 (int) tdep->have_wmmx_registers);
10963   gdb_printf (file, _("arm_dump_tdep: vfp_register_count = %i\n"),
10964                 (int) tdep->vfp_register_count);
10965   gdb_printf (file, _("arm_dump_tdep: have_s_pseudos = %s\n"),
10966                 tdep->have_s_pseudos ? "true" : "false");
10967   gdb_printf (file, _("arm_dump_tdep: s_pseudo_base = %i\n"),
10968                 (int) tdep->s_pseudo_base);
10969   gdb_printf (file, _("arm_dump_tdep: s_pseudo_count = %i\n"),
10970                 (int) tdep->s_pseudo_count);
10971   gdb_printf (file, _("arm_dump_tdep: have_q_pseudos = %s\n"),
10972                 tdep->have_q_pseudos ? "true" : "false");
10973   gdb_printf (file, _("arm_dump_tdep: q_pseudo_base = %i\n"),
10974                 (int) tdep->q_pseudo_base);
10975   gdb_printf (file, _("arm_dump_tdep: q_pseudo_count = %i\n"),
10976                 (int) tdep->q_pseudo_count);
10977   gdb_printf (file, _("arm_dump_tdep: have_neon = %i\n"),
10978                 (int) tdep->have_neon);
10979   gdb_printf (file, _("arm_dump_tdep: have_mve = %s\n"),
10980                 tdep->have_mve ? "yes" : "no");
10981   gdb_printf (file, _("arm_dump_tdep: mve_vpr_regnum = %i\n"),
10982                 tdep->mve_vpr_regnum);
10983   gdb_printf (file, _("arm_dump_tdep: mve_pseudo_base = %i\n"),
10984                 tdep->mve_pseudo_base);
10985   gdb_printf (file, _("arm_dump_tdep: mve_pseudo_count = %i\n"),
10986                 tdep->mve_pseudo_count);
10987   gdb_printf (file, _("arm_dump_tdep: m_profile_msp_regnum = %i\n"),
10988                 tdep->m_profile_msp_regnum);
10989   gdb_printf (file, _("arm_dump_tdep: m_profile_psp_regnum = %i\n"),
10990                 tdep->m_profile_psp_regnum);
10991   gdb_printf (file, _("arm_dump_tdep: m_profile_msp_ns_regnum = %i\n"),
10992                 tdep->m_profile_msp_ns_regnum);
10993   gdb_printf (file, _("arm_dump_tdep: m_profile_psp_ns_regnum = %i\n"),
10994                 tdep->m_profile_psp_ns_regnum);
10995   gdb_printf (file, _("arm_dump_tdep: m_profile_msp_s_regnum = %i\n"),
10996                 tdep->m_profile_msp_s_regnum);
10997   gdb_printf (file, _("arm_dump_tdep: m_profile_psp_s_regnum = %i\n"),
10998                 tdep->m_profile_psp_s_regnum);
10999   gdb_printf (file, _("arm_dump_tdep: Lowest pc = 0x%lx\n"),
11000                 (unsigned long) tdep->lowest_pc);
11001   gdb_printf (file, _("arm_dump_tdep: have_pacbti = %s\n"),
11002                 tdep->have_pacbti ? "yes" : "no");
11003   gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_base = %i\n"),
11004                 tdep->pacbti_pseudo_base);
11005   gdb_printf (file, _("arm_dump_tdep: pacbti_pseudo_count = %i\n"),
11006                 tdep->pacbti_pseudo_count);
11007   gdb_printf (file, _("arm_dump_tdep: is_m = %s\n"),
11008                 tdep->is_m ? "yes" : "no");
11009 }
11010 
11011 #if GDB_SELF_TEST
11012 namespace selftests
11013 {
11014 static void arm_record_test (void);
11015 static void arm_analyze_prologue_test ();
11016 }
11017 #endif
11018 
11019 void _initialize_arm_tdep ();
11020 void
_initialize_arm_tdep()11021 _initialize_arm_tdep ()
11022 {
11023   long length;
11024   int i, j;
11025   char regdesc[1024], *rdptr = regdesc;
11026   size_t rest = sizeof (regdesc);
11027 
11028   gdbarch_register (bfd_arch_arm, arm_gdbarch_init, arm_dump_tdep);
11029 
11030   /* Add ourselves to objfile event chain.  */
11031   gdb::observers::new_objfile.attach (arm_exidx_new_objfile, "arm-tdep");
11032 
11033   /* Register an ELF OS ABI sniffer for ARM binaries.  */
11034   gdbarch_register_osabi_sniffer (bfd_arch_arm,
11035                                           bfd_target_elf_flavour,
11036                                           arm_elf_osabi_sniffer);
11037 
11038   /* Add root prefix command for all "set arm"/"show arm" commands.  */
11039   add_setshow_prefix_cmd ("arm", no_class,
11040                                 _("Various ARM-specific commands."),
11041                                 _("Various ARM-specific commands."),
11042                                 &setarmcmdlist, &showarmcmdlist,
11043                                 &setlist, &showlist);
11044 
11045   arm_disassembler_options = "reg-names-std";
11046   const disasm_options_t *disasm_options
11047     = &disassembler_options_arm ()->options;
11048   int num_disassembly_styles = 0;
11049   for (i = 0; disasm_options->name[i] != NULL; i++)
11050     if (startswith (disasm_options->name[i], "reg-names-"))
11051       num_disassembly_styles++;
11052 
11053   /* Initialize the array that will be passed to add_setshow_enum_cmd().  */
11054   valid_disassembly_styles = XNEWVEC (const char *,
11055                                               num_disassembly_styles + 1);
11056   for (i = j = 0; disasm_options->name[i] != NULL; i++)
11057     if (startswith (disasm_options->name[i], "reg-names-"))
11058       {
11059           size_t offset = strlen ("reg-names-");
11060           const char *style = disasm_options->name[i];
11061           valid_disassembly_styles[j++] = &style[offset];
11062           if (strcmp (&style[offset], "std") == 0)
11063             disassembly_style = &style[offset];
11064           length = snprintf (rdptr, rest, "%s - %s\n", &style[offset],
11065                                  disasm_options->description[i]);
11066           rdptr += length;
11067           rest -= length;
11068       }
11069   /* Mark the end of valid options.  */
11070   valid_disassembly_styles[num_disassembly_styles] = NULL;
11071 
11072   /* Create the help text.  */
11073   std::string helptext = string_printf ("%s%s%s",
11074                                                   _("The valid values are:\n"),
11075                                                   regdesc,
11076                                                   _("The default is \"std\"."));
11077 
11078   add_setshow_enum_cmd("disassembler", no_class,
11079                            valid_disassembly_styles, &disassembly_style,
11080                            _("Set the disassembly style."),
11081                            _("Show the disassembly style."),
11082                            helptext.c_str (),
11083                            set_disassembly_style_sfunc,
11084                            show_disassembly_style_sfunc,
11085                            &setarmcmdlist, &showarmcmdlist);
11086 
11087   add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32,
11088                                  _("Set usage of ARM 32-bit mode."),
11089                                  _("Show usage of ARM 32-bit mode."),
11090                                  _("When off, a 26-bit PC will be used."),
11091                                  NULL,
11092                                  NULL, /* FIXME: i18n: Usage of ARM 32-bit
11093                                             mode is %s.  */
11094                                  &setarmcmdlist, &showarmcmdlist);
11095 
11096   /* Add a command to allow the user to force the FPU model.  */
11097   add_setshow_enum_cmd ("fpu", no_class, fp_model_strings, &current_fp_model,
11098                               _("Set the floating point type."),
11099                               _("Show the floating point type."),
11100                               _("auto - Determine the FP typefrom the OS-ABI.\n\
11101 softfpa - Software FP, mixed-endian doubles on little-endian ARMs.\n\
11102 fpa - FPA co-processor (GCC compiled).\n\
11103 softvfp - Software FP with pure-endian doubles.\n\
11104 vfp - VFP co-processor."),
11105                               set_fp_model_sfunc, show_fp_model,
11106                               &setarmcmdlist, &showarmcmdlist);
11107 
11108   /* Add a command to allow the user to force the ABI.  */
11109   add_setshow_enum_cmd ("abi", class_support, arm_abi_strings, &arm_abi_string,
11110                               _("Set the ABI."),
11111                               _("Show the ABI."),
11112                               NULL, arm_set_abi, arm_show_abi,
11113                               &setarmcmdlist, &showarmcmdlist);
11114 
11115   /* Add two commands to allow the user to force the assumed
11116      execution mode.  */
11117   add_setshow_enum_cmd ("fallback-mode", class_support,
11118                               arm_mode_strings, &arm_fallback_mode_string,
11119                               _("Set the mode assumed when symbols are unavailable."),
11120                               _("Show the mode assumed when symbols are unavailable."),
11121                               NULL, NULL, arm_show_fallback_mode,
11122                               &setarmcmdlist, &showarmcmdlist);
11123   add_setshow_enum_cmd ("force-mode", class_support,
11124                               arm_mode_strings, &arm_force_mode_string,
11125                               _("Set the mode assumed even when symbols are available."),
11126                               _("Show the mode assumed even when symbols are available."),
11127                               NULL, NULL, arm_show_force_mode,
11128                               &setarmcmdlist, &showarmcmdlist);
11129 
11130   /* Add a command to stop triggering security exceptions when
11131      unwinding exception stacks.  */
11132   add_setshow_boolean_cmd ("unwind-secure-frames", no_class, &arm_unwind_secure_frames,
11133                                  _("Set usage of non-secure to secure exception stack unwinding."),
11134                                  _("Show usage of non-secure to secure exception stack unwinding."),
11135                                  _("When on, the debugger can trigger memory access traps."),
11136                                  NULL, arm_show_unwind_secure_frames,
11137                                  &setarmcmdlist, &showarmcmdlist);
11138 
11139   /* Debugging flag.  */
11140   add_setshow_boolean_cmd ("arm", class_maintenance, &arm_debug,
11141                                  _("Set ARM debugging."),
11142                                  _("Show ARM debugging."),
11143                                  _("When on, arm-specific debugging is enabled."),
11144                                  NULL,
11145                                  NULL, /* FIXME: i18n: "ARM debugging is %s.  */
11146                                  &setdebuglist, &showdebuglist);
11147 
11148 #if GDB_SELF_TEST
11149   selftests::register_test ("arm-record", selftests::arm_record_test);
11150   selftests::register_test ("arm_analyze_prologue", selftests::arm_analyze_prologue_test);
11151 #endif
11152 
11153 }
11154 
11155 /* ARM-reversible process record data structures.  */
11156 
11157 #define ARM_INSN_SIZE_BYTES 4
11158 #define THUMB_INSN_SIZE_BYTES 2
11159 #define THUMB2_INSN_SIZE_BYTES 4
11160 
11161 
11162 /* Position of the bit within a 32-bit ARM instruction
11163    that defines whether the instruction is a load or store.  */
11164 #define INSN_S_L_BIT_NUM 20
11165 
11166 #define REG_ALLOC(REGS, LENGTH, RECORD_BUF) \
11167           do  \
11168             { \
11169               unsigned int reg_len = LENGTH; \
11170               if (reg_len) \
11171                 { \
11172                     REGS = XNEWVEC (uint32_t, reg_len); \
11173                     memcpy(&REGS[0], &RECORD_BUF[0], sizeof(uint32_t)*LENGTH); \
11174                 } \
11175             } \
11176           while (0)
11177 
11178 #define MEM_ALLOC(MEMS, LENGTH, RECORD_BUF) \
11179           do  \
11180             { \
11181               unsigned int mem_len = LENGTH; \
11182               if (mem_len) \
11183                 { \
11184                     MEMS =  XNEWVEC (struct arm_mem_r, mem_len);  \
11185                     memcpy(&MEMS->len, &RECORD_BUF[0], \
11186                            sizeof(struct arm_mem_r) * LENGTH); \
11187                 } \
11188             } \
11189             while (0)
11190 
11191 /* Checks whether insn is already recorded or yet to be decoded. (boolean expression).  */
11192 #define INSN_RECORDED(ARM_RECORD) \
11193           (0 != (ARM_RECORD)->reg_rec_count || 0 != (ARM_RECORD)->mem_rec_count)
11194 
11195 /* ARM memory record structure.  */
11196 struct arm_mem_r
11197 {
11198   uint32_t len;    /* Record length.  */
11199   uint32_t addr;   /* Memory address.  */
11200 };
11201 
11202 /* ARM instruction record contains opcode of current insn
11203    and execution state (before entry to decode_insn()),
11204    contains list of to-be-modified registers and
11205    memory blocks (on return from decode_insn()).  */
11206 
11207 struct arm_insn_decode_record
11208 {
11209   struct gdbarch *gdbarch;
11210   struct regcache *regcache;
11211   CORE_ADDR this_addr;          /* Address of the insn being decoded.  */
11212   uint32_t arm_insn;            /* Should accommodate thumb.  */
11213   uint32_t cond;                /* Condition code.  */
11214   uint32_t opcode;              /* Insn opcode.  */
11215   uint32_t decode;              /* Insn decode bits.  */
11216   uint32_t mem_rec_count;       /* No of mem records.  */
11217   uint32_t reg_rec_count;       /* No of reg records.  */
11218   uint32_t *arm_regs;           /* Registers to be saved for this record.  */
11219   struct arm_mem_r *arm_mems;   /* Memory to be saved for this record.  */
11220 };
11221 
11222 
11223 /* Checks ARM SBZ and SBO mandatory fields.  */
11224 
11225 static int
sbo_sbz(uint32_t insn,uint32_t bit_num,uint32_t len,uint32_t sbo)11226 sbo_sbz (uint32_t insn, uint32_t bit_num, uint32_t len, uint32_t sbo)
11227 {
11228   uint32_t ones = bits (insn, bit_num - 1, (bit_num -1) + (len - 1));
11229 
11230   if (!len)
11231     return 1;
11232 
11233   if (!sbo)
11234     ones = ~ones;
11235 
11236   while (ones)
11237     {
11238       if (!(ones & sbo))
11239           {
11240             return 0;
11241           }
11242       ones = ones >> 1;
11243     }
11244   return 1;
11245 }
11246 
11247 enum arm_record_result
11248 {
11249   ARM_RECORD_SUCCESS = 0,
11250   ARM_RECORD_FAILURE = 1
11251 };
11252 
11253 enum arm_record_strx_t
11254 {
11255   ARM_RECORD_STRH=1,
11256   ARM_RECORD_STRD
11257 };
11258 
11259 enum record_type_t
11260 {
11261   ARM_RECORD=1,
11262   THUMB_RECORD,
11263   THUMB2_RECORD
11264 };
11265 
11266 
11267 static int
arm_record_strx(arm_insn_decode_record * arm_insn_r,uint32_t * record_buf,uint32_t * record_buf_mem,arm_record_strx_t str_type)11268 arm_record_strx (arm_insn_decode_record *arm_insn_r, uint32_t *record_buf,
11269                      uint32_t *record_buf_mem, arm_record_strx_t str_type)
11270 {
11271 
11272   struct regcache *reg_cache = arm_insn_r->regcache;
11273   ULONGEST u_regval[2]= {0};
11274 
11275   uint32_t reg_src1 = 0, reg_src2 = 0;
11276   uint32_t immed_high = 0, immed_low = 0,offset_8 = 0, tgt_mem_addr = 0;
11277 
11278   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11279   arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11280 
11281   if (14 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11282     {
11283       /* 1) Handle misc store, immediate offset.  */
11284       immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11285       immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11286       reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11287       regcache_raw_read_unsigned (reg_cache, reg_src1,
11288                                           &u_regval[0]);
11289       if (ARM_PC_REGNUM == reg_src1)
11290           {
11291             /* If R15 was used as Rn, hence current PC+8.  */
11292             u_regval[0] = u_regval[0] + 8;
11293           }
11294       offset_8 = (immed_high << 4) | immed_low;
11295       /* Calculate target store address.  */
11296       if (14 == arm_insn_r->opcode)
11297           {
11298             tgt_mem_addr = u_regval[0] + offset_8;
11299           }
11300       else
11301           {
11302             tgt_mem_addr = u_regval[0] - offset_8;
11303           }
11304       if (ARM_RECORD_STRH == str_type)
11305           {
11306             record_buf_mem[0] = 2;
11307             record_buf_mem[1] = tgt_mem_addr;
11308             arm_insn_r->mem_rec_count = 1;
11309           }
11310       else if (ARM_RECORD_STRD == str_type)
11311           {
11312             record_buf_mem[0] = 4;
11313             record_buf_mem[1] = tgt_mem_addr;
11314             record_buf_mem[2] = 4;
11315             record_buf_mem[3] = tgt_mem_addr + 4;
11316             arm_insn_r->mem_rec_count = 2;
11317           }
11318     }
11319   else if (12 == arm_insn_r->opcode || 8 == arm_insn_r->opcode)
11320     {
11321       /* 2) Store, register offset.  */
11322       /* Get Rm.  */
11323       reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11324       /* Get Rn.  */
11325       reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11326       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11327       regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11328       if (15 == reg_src2)
11329           {
11330             /* If R15 was used as Rn, hence current PC+8.  */
11331             u_regval[0] = u_regval[0] + 8;
11332           }
11333       /* Calculate target store address, Rn +/- Rm, register offset.  */
11334       if (12 == arm_insn_r->opcode)
11335           {
11336             tgt_mem_addr = u_regval[0] + u_regval[1];
11337           }
11338       else
11339           {
11340             tgt_mem_addr = u_regval[1] - u_regval[0];
11341           }
11342       if (ARM_RECORD_STRH == str_type)
11343           {
11344             record_buf_mem[0] = 2;
11345             record_buf_mem[1] = tgt_mem_addr;
11346             arm_insn_r->mem_rec_count = 1;
11347           }
11348       else if (ARM_RECORD_STRD == str_type)
11349           {
11350             record_buf_mem[0] = 4;
11351             record_buf_mem[1] = tgt_mem_addr;
11352             record_buf_mem[2] = 4;
11353             record_buf_mem[3] = tgt_mem_addr + 4;
11354             arm_insn_r->mem_rec_count = 2;
11355           }
11356     }
11357   else if (11 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
11358              || 2 == arm_insn_r->opcode  || 6 == arm_insn_r->opcode)
11359     {
11360       /* 3) Store, immediate pre-indexed.  */
11361       /* 5) Store, immediate post-indexed.  */
11362       immed_low = bits (arm_insn_r->arm_insn, 0, 3);
11363       immed_high = bits (arm_insn_r->arm_insn, 8, 11);
11364       offset_8 = (immed_high << 4) | immed_low;
11365       reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11366       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11367       /* Calculate target store address, Rn +/- Rm, register offset.  */
11368       if (15 == arm_insn_r->opcode || 6 == arm_insn_r->opcode)
11369           {
11370             tgt_mem_addr = u_regval[0] + offset_8;
11371           }
11372       else
11373           {
11374             tgt_mem_addr = u_regval[0] - offset_8;
11375           }
11376       if (ARM_RECORD_STRH == str_type)
11377           {
11378             record_buf_mem[0] = 2;
11379             record_buf_mem[1] = tgt_mem_addr;
11380             arm_insn_r->mem_rec_count = 1;
11381           }
11382       else if (ARM_RECORD_STRD == str_type)
11383           {
11384             record_buf_mem[0] = 4;
11385             record_buf_mem[1] = tgt_mem_addr;
11386             record_buf_mem[2] = 4;
11387             record_buf_mem[3] = tgt_mem_addr + 4;
11388             arm_insn_r->mem_rec_count = 2;
11389           }
11390       /* Record Rn also as it changes.  */
11391       *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11392       arm_insn_r->reg_rec_count = 1;
11393     }
11394   else if (9 == arm_insn_r->opcode || 13 == arm_insn_r->opcode
11395              || 0 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11396     {
11397       /* 4) Store, register pre-indexed.  */
11398       /* 6) Store, register post -indexed.  */
11399       reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
11400       reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
11401       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11402       regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
11403       /* Calculate target store address, Rn +/- Rm, register offset.  */
11404       if (13 == arm_insn_r->opcode || 4 == arm_insn_r->opcode)
11405           {
11406             tgt_mem_addr = u_regval[0] + u_regval[1];
11407           }
11408       else
11409           {
11410             tgt_mem_addr = u_regval[1] - u_regval[0];
11411           }
11412       if (ARM_RECORD_STRH == str_type)
11413           {
11414             record_buf_mem[0] = 2;
11415             record_buf_mem[1] = tgt_mem_addr;
11416             arm_insn_r->mem_rec_count = 1;
11417           }
11418       else if (ARM_RECORD_STRD == str_type)
11419           {
11420             record_buf_mem[0] = 4;
11421             record_buf_mem[1] = tgt_mem_addr;
11422             record_buf_mem[2] = 4;
11423             record_buf_mem[3] = tgt_mem_addr + 4;
11424             arm_insn_r->mem_rec_count = 2;
11425           }
11426       /* Record Rn also as it changes.  */
11427       *(record_buf) = bits (arm_insn_r->arm_insn, 16, 19);
11428       arm_insn_r->reg_rec_count = 1;
11429     }
11430   return 0;
11431 }
11432 
11433 /* Handling ARM extension space insns.  */
11434 
11435 static int
arm_record_extension_space(arm_insn_decode_record * arm_insn_r)11436 arm_record_extension_space (arm_insn_decode_record *arm_insn_r)
11437 {
11438   int ret = 0;  /* Return value: -1:record failure ;  0:success  */
11439   uint32_t opcode1 = 0, opcode2 = 0, insn_op1 = 0;
11440   uint32_t record_buf[8], record_buf_mem[8];
11441   uint32_t reg_src1 = 0;
11442   struct regcache *reg_cache = arm_insn_r->regcache;
11443   ULONGEST u_regval = 0;
11444 
11445   gdb_assert (!INSN_RECORDED(arm_insn_r));
11446   /* Handle unconditional insn extension space.  */
11447 
11448   opcode1 = bits (arm_insn_r->arm_insn, 20, 27);
11449   opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11450   if (arm_insn_r->cond)
11451     {
11452       /* PLD has no affect on architectural state, it just affects
11453            the caches.  */
11454       if (5 == ((opcode1 & 0xE0) >> 5))
11455           {
11456             /* BLX(1) */
11457             record_buf[0] = ARM_PS_REGNUM;
11458             record_buf[1] = ARM_LR_REGNUM;
11459             arm_insn_r->reg_rec_count = 2;
11460           }
11461       /* STC2, LDC2, MCR2, MRC2, CDP2: <TBD>, co-processor insn.  */
11462     }
11463 
11464 
11465   opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11466   if (3 == opcode1 && bit (arm_insn_r->arm_insn, 4))
11467     {
11468       ret = -1;
11469       /* Undefined instruction on ARM V5; need to handle if later
11470            versions define it.  */
11471     }
11472 
11473   opcode1 = bits (arm_insn_r->arm_insn, 24, 27);
11474   opcode2 = bits (arm_insn_r->arm_insn, 4, 7);
11475   insn_op1 = bits (arm_insn_r->arm_insn, 20, 23);
11476 
11477   /* Handle arithmetic insn extension space.  */
11478   if (!opcode1 && 9 == opcode2 && 1 != arm_insn_r->cond
11479       && !INSN_RECORDED(arm_insn_r))
11480     {
11481       /* Handle MLA(S) and MUL(S).  */
11482       if (in_inclusive_range (insn_op1, 0U, 3U))
11483           {
11484             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11485             record_buf[1] = ARM_PS_REGNUM;
11486             arm_insn_r->reg_rec_count = 2;
11487           }
11488       else if (in_inclusive_range (insn_op1, 4U, 15U))
11489           {
11490             /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S).  */
11491             record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11492             record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11493             record_buf[2] = ARM_PS_REGNUM;
11494             arm_insn_r->reg_rec_count = 3;
11495           }
11496     }
11497 
11498   opcode1 = bits (arm_insn_r->arm_insn, 26, 27);
11499   opcode2 = bits (arm_insn_r->arm_insn, 23, 24);
11500   insn_op1 = bits (arm_insn_r->arm_insn, 21, 22);
11501 
11502   /* Handle control insn extension space.  */
11503 
11504   if (!opcode1 && 2 == opcode2 && !bit (arm_insn_r->arm_insn, 20)
11505       && 1 != arm_insn_r->cond && !INSN_RECORDED(arm_insn_r))
11506     {
11507       if (!bit (arm_insn_r->arm_insn,25))
11508           {
11509             if (!bits (arm_insn_r->arm_insn, 4, 7))
11510               {
11511                 if ((0 == insn_op1) || (2 == insn_op1))
11512                     {
11513                       /* MRS.  */
11514                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11515                       arm_insn_r->reg_rec_count = 1;
11516                     }
11517                 else if (1 == insn_op1)
11518                     {
11519                       /* CSPR is going to be changed.  */
11520                       record_buf[0] = ARM_PS_REGNUM;
11521                       arm_insn_r->reg_rec_count = 1;
11522                     }
11523                 else if (3 == insn_op1)
11524                     {
11525                       /* SPSR is going to be changed.  */
11526                       /* We need to get SPSR value, which is yet to be done.  */
11527                       return -1;
11528                     }
11529               }
11530             else if (1 == bits (arm_insn_r->arm_insn, 4, 7))
11531               {
11532                 if (1 == insn_op1)
11533                     {
11534                       /* BX.  */
11535                       record_buf[0] = ARM_PS_REGNUM;
11536                       arm_insn_r->reg_rec_count = 1;
11537                     }
11538                 else if (3 == insn_op1)
11539                     {
11540                       /* CLZ.  */
11541                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11542                       arm_insn_r->reg_rec_count = 1;
11543                     }
11544               }
11545             else if (3 == bits (arm_insn_r->arm_insn, 4, 7))
11546               {
11547                 /* BLX.  */
11548                 record_buf[0] = ARM_PS_REGNUM;
11549                 record_buf[1] = ARM_LR_REGNUM;
11550                 arm_insn_r->reg_rec_count = 2;
11551               }
11552             else if (5 == bits (arm_insn_r->arm_insn, 4, 7))
11553               {
11554                 /* QADD, QSUB, QDADD, QDSUB */
11555                 record_buf[0] = ARM_PS_REGNUM;
11556                 record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11557                 arm_insn_r->reg_rec_count = 2;
11558               }
11559             else if (7 == bits (arm_insn_r->arm_insn, 4, 7))
11560               {
11561                 /* BKPT.  */
11562                 record_buf[0] = ARM_PS_REGNUM;
11563                 record_buf[1] = ARM_LR_REGNUM;
11564                 arm_insn_r->reg_rec_count = 2;
11565 
11566                 /* Save SPSR also;how?  */
11567                 return -1;
11568               }
11569             else if(8 == bits (arm_insn_r->arm_insn, 4, 7)
11570                       || 10 == bits (arm_insn_r->arm_insn, 4, 7)
11571                       || 12 == bits (arm_insn_r->arm_insn, 4, 7)
11572                       || 14 == bits (arm_insn_r->arm_insn, 4, 7)
11573                      )
11574               {
11575                 if (0 == insn_op1 || 1 == insn_op1)
11576                     {
11577                       /* SMLA<x><y>, SMLAW<y>, SMULW<y>.  */
11578                       /* We dont do optimization for SMULW<y> where we
11579                          need only Rd.  */
11580                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11581                       record_buf[1] = ARM_PS_REGNUM;
11582                       arm_insn_r->reg_rec_count = 2;
11583                     }
11584                 else if (2 == insn_op1)
11585                     {
11586                       /* SMLAL<x><y>.  */
11587                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11588                       record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
11589                       arm_insn_r->reg_rec_count = 2;
11590                     }
11591                 else if (3 == insn_op1)
11592                     {
11593                       /* SMUL<x><y>.  */
11594                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11595                       arm_insn_r->reg_rec_count = 1;
11596                     }
11597               }
11598           }
11599       else
11600           {
11601             /* MSR : immediate form.  */
11602             if (1 == insn_op1)
11603               {
11604                 /* CSPR is going to be changed.  */
11605                 record_buf[0] = ARM_PS_REGNUM;
11606                 arm_insn_r->reg_rec_count = 1;
11607               }
11608             else if (3 == insn_op1)
11609               {
11610                 /* SPSR is going to be changed.  */
11611                 /* we need to get SPSR value, which is yet to be done  */
11612                 return -1;
11613               }
11614           }
11615     }
11616 
11617   opcode1 = bits (arm_insn_r->arm_insn, 25, 27);
11618   opcode2 = bits (arm_insn_r->arm_insn, 20, 24);
11619   insn_op1 = bits (arm_insn_r->arm_insn, 5, 6);
11620 
11621   /* Handle load/store insn extension space.  */
11622 
11623   if (!opcode1 && bit (arm_insn_r->arm_insn, 7)
11624       && bit (arm_insn_r->arm_insn, 4) && 1 != arm_insn_r->cond
11625       && !INSN_RECORDED(arm_insn_r))
11626     {
11627       /* SWP/SWPB.  */
11628       if (0 == insn_op1)
11629           {
11630             /* These insn, changes register and memory as well.  */
11631             /* SWP or SWPB insn.  */
11632             /* Get memory address given by Rn.  */
11633             reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11634             regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
11635             /* SWP insn ?, swaps word.  */
11636             if (8 == arm_insn_r->opcode)
11637               {
11638                 record_buf_mem[0] = 4;
11639               }
11640             else
11641               {
11642                 /* SWPB insn, swaps only byte.  */
11643                 record_buf_mem[0] = 1;
11644               }
11645             record_buf_mem[1] = u_regval;
11646             arm_insn_r->mem_rec_count = 1;
11647             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11648             arm_insn_r->reg_rec_count = 1;
11649           }
11650       else if (1 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11651           {
11652             /* STRH.  */
11653             arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11654                                 ARM_RECORD_STRH);
11655           }
11656       else if (2 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11657           {
11658             /* LDRD.  */
11659             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11660             record_buf[1] = record_buf[0] + 1;
11661             arm_insn_r->reg_rec_count = 2;
11662           }
11663       else if (3 == insn_op1 && !bit (arm_insn_r->arm_insn, 20))
11664           {
11665             /* STRD.  */
11666             arm_record_strx(arm_insn_r, &record_buf[0], &record_buf_mem[0],
11667                               ARM_RECORD_STRD);
11668           }
11669       else if (bit (arm_insn_r->arm_insn, 20) && insn_op1 <= 3)
11670           {
11671             /* LDRH, LDRSB, LDRSH.  */
11672             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11673             arm_insn_r->reg_rec_count = 1;
11674           }
11675 
11676     }
11677 
11678   opcode1 = bits (arm_insn_r->arm_insn, 23, 27);
11679   if (24 == opcode1 && bit (arm_insn_r->arm_insn, 21)
11680       && !INSN_RECORDED(arm_insn_r))
11681     {
11682       ret = -1;
11683       /* Handle coprocessor insn extension space.  */
11684     }
11685 
11686   /* To be done for ARMv5 and later; as of now we return -1.  */
11687   if (-1 == ret)
11688     return ret;
11689 
11690   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11691   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11692 
11693   return ret;
11694 }
11695 
11696 /* Handling opcode 000 insns.  */
11697 
11698 static int
arm_record_data_proc_misc_ld_str(arm_insn_decode_record * arm_insn_r)11699 arm_record_data_proc_misc_ld_str (arm_insn_decode_record *arm_insn_r)
11700 {
11701   struct regcache *reg_cache = arm_insn_r->regcache;
11702   uint32_t record_buf[8], record_buf_mem[8];
11703   ULONGEST u_regval[2] = {0};
11704 
11705   uint32_t reg_src1 = 0;
11706   uint32_t opcode1 = 0;
11707 
11708   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11709   arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11710   opcode1 = bits (arm_insn_r->arm_insn, 20, 24);
11711 
11712   if (!((opcode1 & 0x19) == 0x10))
11713     {
11714       /* Data-processing (register) and Data-processing (register-shifted
11715            register */
11716       /* Out of 11 shifter operands mode, all the insn modifies destination
11717            register, which is specified by 13-16 decode.  */
11718       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11719       record_buf[1] = ARM_PS_REGNUM;
11720       arm_insn_r->reg_rec_count = 2;
11721     }
11722   else if ((arm_insn_r->decode < 8) && ((opcode1 & 0x19) == 0x10))
11723     {
11724       /* Miscellaneous instructions */
11725 
11726       if (3 == arm_insn_r->decode && 0x12 == opcode1
11727             && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11728           {
11729             /* Handle BLX, branch and link/exchange.  */
11730             if (9 == arm_insn_r->opcode)
11731               {
11732                 /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm,
11733                      and R14 stores the return address.  */
11734                 record_buf[0] = ARM_PS_REGNUM;
11735                 record_buf[1] = ARM_LR_REGNUM;
11736                 arm_insn_r->reg_rec_count = 2;
11737               }
11738           }
11739       else if (7 == arm_insn_r->decode && 0x12 == opcode1)
11740           {
11741             /* Handle enhanced software breakpoint insn, BKPT.  */
11742             /* CPSR is changed to be executed in ARM state,  disabling normal
11743                interrupts, entering abort mode.  */
11744             /* According to high vector configuration PC is set.  */
11745             /* user hit breakpoint and type reverse, in
11746                that case, we need to go back with previous CPSR and
11747                Program Counter.  */
11748             record_buf[0] = ARM_PS_REGNUM;
11749             record_buf[1] = ARM_LR_REGNUM;
11750             arm_insn_r->reg_rec_count = 2;
11751 
11752             /* Save SPSR also; how?  */
11753             return -1;
11754           }
11755       else if (1 == arm_insn_r->decode && 0x12 == opcode1
11756                  && sbo_sbz (arm_insn_r->arm_insn, 9, 12, 1))
11757           {
11758             /* Handle BX, branch and link/exchange.  */
11759             /* Branch is chosen by setting T bit of CSPR, bitp[0] of Rm.  */
11760             record_buf[0] = ARM_PS_REGNUM;
11761             arm_insn_r->reg_rec_count = 1;
11762           }
11763       else if (1 == arm_insn_r->decode && 0x16 == opcode1
11764                  && sbo_sbz (arm_insn_r->arm_insn, 9, 4, 1)
11765                  && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1))
11766           {
11767             /* Count leading zeros: CLZ.  */
11768             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11769             arm_insn_r->reg_rec_count = 1;
11770           }
11771       else if (!bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM)
11772                  && (8 == arm_insn_r->opcode || 10 == arm_insn_r->opcode)
11773                  && sbo_sbz (arm_insn_r->arm_insn, 17, 4, 1)
11774                  && sbo_sbz (arm_insn_r->arm_insn, 1, 12, 0))
11775           {
11776             /* Handle MRS insn.  */
11777             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11778             arm_insn_r->reg_rec_count = 1;
11779           }
11780     }
11781   else if (9 == arm_insn_r->decode && opcode1 < 0x10)
11782     {
11783       /* Multiply and multiply-accumulate */
11784 
11785       /* Handle multiply instructions.  */
11786       /* MLA, MUL, SMLAL, SMULL, UMLAL, UMULL.  */
11787       if (0 == arm_insn_r->opcode || 1 == arm_insn_r->opcode)
11788           {
11789             /* Handle MLA and MUL.  */
11790             record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11791             record_buf[1] = ARM_PS_REGNUM;
11792             arm_insn_r->reg_rec_count = 2;
11793           }
11794       else if (4 <= arm_insn_r->opcode && 7 >= arm_insn_r->opcode)
11795           {
11796             /* Handle SMLAL, SMULL, UMLAL, UMULL.  */
11797             record_buf[0] = bits (arm_insn_r->arm_insn, 16, 19);
11798             record_buf[1] = bits (arm_insn_r->arm_insn, 12, 15);
11799             record_buf[2] = ARM_PS_REGNUM;
11800             arm_insn_r->reg_rec_count = 3;
11801           }
11802     }
11803   else if (9 == arm_insn_r->decode  && opcode1 > 0x10)
11804     {
11805       /* Synchronization primitives */
11806 
11807       /* Handling SWP, SWPB.  */
11808       /* These insn, changes register and memory as well.  */
11809       /* SWP or SWPB insn.  */
11810 
11811       reg_src1 = bits (arm_insn_r->arm_insn, 16, 19);
11812       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
11813       /* SWP insn ?, swaps word.  */
11814       if (8 == arm_insn_r->opcode)
11815           {
11816             record_buf_mem[0] = 4;
11817           }
11818       else
11819           {
11820             /* SWPB insn, swaps only byte.  */
11821             record_buf_mem[0] = 1;
11822           }
11823       record_buf_mem[1] = u_regval[0];
11824       arm_insn_r->mem_rec_count = 1;
11825       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11826       arm_insn_r->reg_rec_count = 1;
11827     }
11828   else if (11 == arm_insn_r->decode || 13 == arm_insn_r->decode
11829              || 15 == arm_insn_r->decode)
11830     {
11831       if ((opcode1 & 0x12) == 2)
11832           {
11833             /* Extra load/store (unprivileged) */
11834             return -1;
11835           }
11836       else
11837           {
11838             /* Extra load/store */
11839             switch (bits (arm_insn_r->arm_insn, 5, 6))
11840               {
11841               case 1:
11842                 if ((opcode1 & 0x05) == 0x0 || (opcode1 & 0x05) == 0x4)
11843                     {
11844                       /* STRH (register), STRH (immediate) */
11845                       arm_record_strx (arm_insn_r, &record_buf[0],
11846                                            &record_buf_mem[0], ARM_RECORD_STRH);
11847                     }
11848                 else if ((opcode1 & 0x05) == 0x1)
11849                     {
11850                       /* LDRH (register) */
11851                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11852                       arm_insn_r->reg_rec_count = 1;
11853 
11854                       if (bit (arm_insn_r->arm_insn, 21))
11855                         {
11856                           /* Write back to Rn.  */
11857                           record_buf[arm_insn_r->reg_rec_count++]
11858                               = bits (arm_insn_r->arm_insn, 16, 19);
11859                         }
11860                     }
11861                 else if ((opcode1 & 0x05) == 0x5)
11862                     {
11863                       /* LDRH (immediate), LDRH (literal) */
11864                       int rn = bits (arm_insn_r->arm_insn, 16, 19);
11865 
11866                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11867                       arm_insn_r->reg_rec_count = 1;
11868 
11869                       if (rn != 15)
11870                         {
11871                           /*LDRH (immediate) */
11872                           if (bit (arm_insn_r->arm_insn, 21))
11873                               {
11874                                 /* Write back to Rn.  */
11875                                 record_buf[arm_insn_r->reg_rec_count++] = rn;
11876                               }
11877                         }
11878                     }
11879                 else
11880                     return -1;
11881                 break;
11882               case 2:
11883                 if ((opcode1 & 0x05) == 0x0)
11884                     {
11885                       /* LDRD (register) */
11886                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11887                       record_buf[1] = record_buf[0] + 1;
11888                       arm_insn_r->reg_rec_count = 2;
11889 
11890                       if (bit (arm_insn_r->arm_insn, 21))
11891                         {
11892                           /* Write back to Rn.  */
11893                           record_buf[arm_insn_r->reg_rec_count++]
11894                               = bits (arm_insn_r->arm_insn, 16, 19);
11895                         }
11896                     }
11897                 else if ((opcode1 & 0x05) == 0x1)
11898                     {
11899                       /* LDRSB (register) */
11900                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11901                       arm_insn_r->reg_rec_count = 1;
11902 
11903                       if (bit (arm_insn_r->arm_insn, 21))
11904                         {
11905                           /* Write back to Rn.  */
11906                           record_buf[arm_insn_r->reg_rec_count++]
11907                               = bits (arm_insn_r->arm_insn, 16, 19);
11908                         }
11909                     }
11910                 else if ((opcode1 & 0x05) == 0x4 || (opcode1 & 0x05) == 0x5)
11911                     {
11912                       /* LDRD (immediate), LDRD (literal), LDRSB (immediate),
11913                          LDRSB (literal) */
11914                       int rn = bits (arm_insn_r->arm_insn, 16, 19);
11915 
11916                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11917                       arm_insn_r->reg_rec_count = 1;
11918 
11919                       if (rn != 15)
11920                         {
11921                           /*LDRD (immediate), LDRSB (immediate) */
11922                           if (bit (arm_insn_r->arm_insn, 21))
11923                               {
11924                                 /* Write back to Rn.  */
11925                                 record_buf[arm_insn_r->reg_rec_count++] = rn;
11926                               }
11927                         }
11928                     }
11929                 else
11930                     return -1;
11931                 break;
11932               case 3:
11933                 if ((opcode1 & 0x05) == 0x0)
11934                     {
11935                       /* STRD (register) */
11936                       arm_record_strx (arm_insn_r, &record_buf[0],
11937                                            &record_buf_mem[0], ARM_RECORD_STRD);
11938                     }
11939                 else if ((opcode1 & 0x05) == 0x1)
11940                     {
11941                       /* LDRSH (register) */
11942                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11943                       arm_insn_r->reg_rec_count = 1;
11944 
11945                       if (bit (arm_insn_r->arm_insn, 21))
11946                         {
11947                           /* Write back to Rn.  */
11948                           record_buf[arm_insn_r->reg_rec_count++]
11949                               = bits (arm_insn_r->arm_insn, 16, 19);
11950                         }
11951                     }
11952                 else if ((opcode1 & 0x05) == 0x4)
11953                     {
11954                       /* STRD (immediate) */
11955                       arm_record_strx (arm_insn_r, &record_buf[0],
11956                                            &record_buf_mem[0], ARM_RECORD_STRD);
11957                     }
11958                 else if ((opcode1 & 0x05) == 0x5)
11959                     {
11960                       /* LDRSH (immediate), LDRSH (literal) */
11961                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
11962                       arm_insn_r->reg_rec_count = 1;
11963 
11964                       if (bit (arm_insn_r->arm_insn, 21))
11965                         {
11966                           /* Write back to Rn.  */
11967                           record_buf[arm_insn_r->reg_rec_count++]
11968                               = bits (arm_insn_r->arm_insn, 16, 19);
11969                         }
11970                     }
11971                 else
11972                     return -1;
11973                 break;
11974               default:
11975                 return -1;
11976               }
11977           }
11978     }
11979   else
11980     {
11981       return -1;
11982     }
11983 
11984   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
11985   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
11986   return 0;
11987 }
11988 
11989 /* Handling opcode 001 insns.  */
11990 
11991 static int
arm_record_data_proc_imm(arm_insn_decode_record * arm_insn_r)11992 arm_record_data_proc_imm (arm_insn_decode_record *arm_insn_r)
11993 {
11994   uint32_t record_buf[8], record_buf_mem[8];
11995 
11996   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
11997   arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
11998 
11999   if ((9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode)
12000       && 2 == bits (arm_insn_r->arm_insn, 20, 21)
12001       && sbo_sbz (arm_insn_r->arm_insn, 13, 4, 1)
12002      )
12003     {
12004       /* Handle MSR insn.  */
12005       if (9 == arm_insn_r->opcode)
12006           {
12007             /* CSPR is going to be changed.  */
12008             record_buf[0] = ARM_PS_REGNUM;
12009             arm_insn_r->reg_rec_count = 1;
12010           }
12011       else
12012           {
12013             /* SPSR is going to be changed.  */
12014           }
12015     }
12016   else if (arm_insn_r->opcode <= 15)
12017     {
12018       /* Normal data processing insns.  */
12019       /* Out of 11 shifter operands mode, all the insn modifies destination
12020            register, which is specified by 13-16 decode.  */
12021       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12022       record_buf[1] = ARM_PS_REGNUM;
12023       arm_insn_r->reg_rec_count = 2;
12024     }
12025   else
12026     {
12027       return -1;
12028     }
12029 
12030   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12031   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12032   return 0;
12033 }
12034 
12035 static int
arm_record_media(arm_insn_decode_record * arm_insn_r)12036 arm_record_media (arm_insn_decode_record *arm_insn_r)
12037 {
12038   uint32_t record_buf[8];
12039 
12040   switch (bits (arm_insn_r->arm_insn, 22, 24))
12041     {
12042     case 0:
12043       /* Parallel addition and subtraction, signed */
12044     case 1:
12045       /* Parallel addition and subtraction, unsigned */
12046     case 2:
12047     case 3:
12048       /* Packing, unpacking, saturation and reversal */
12049       {
12050           int rd = bits (arm_insn_r->arm_insn, 12, 15);
12051 
12052           record_buf[arm_insn_r->reg_rec_count++] = rd;
12053       }
12054       break;
12055 
12056     case 4:
12057     case 5:
12058       /* Signed multiplies */
12059       {
12060           int rd = bits (arm_insn_r->arm_insn, 16, 19);
12061           unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 22);
12062 
12063           record_buf[arm_insn_r->reg_rec_count++] = rd;
12064           if (op1 == 0x0)
12065             record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12066           else if (op1 == 0x4)
12067             record_buf[arm_insn_r->reg_rec_count++]
12068               = bits (arm_insn_r->arm_insn, 12, 15);
12069       }
12070       break;
12071 
12072     case 6:
12073       {
12074           if (bit (arm_insn_r->arm_insn, 21)
12075               && bits (arm_insn_r->arm_insn, 5, 6) == 0x2)
12076             {
12077               /* SBFX */
12078               record_buf[arm_insn_r->reg_rec_count++]
12079                 = bits (arm_insn_r->arm_insn, 12, 15);
12080             }
12081           else if (bits (arm_insn_r->arm_insn, 20, 21) == 0x0
12082                      && bits (arm_insn_r->arm_insn, 5, 7) == 0x0)
12083             {
12084               /* USAD8 and USADA8 */
12085               record_buf[arm_insn_r->reg_rec_count++]
12086                 = bits (arm_insn_r->arm_insn, 16, 19);
12087             }
12088       }
12089       break;
12090 
12091     case 7:
12092       {
12093           if (bits (arm_insn_r->arm_insn, 20, 21) == 0x3
12094               && bits (arm_insn_r->arm_insn, 5, 7) == 0x7)
12095             {
12096               /* Permanently UNDEFINED */
12097               return -1;
12098             }
12099           else
12100             {
12101               /* BFC, BFI and UBFX */
12102               record_buf[arm_insn_r->reg_rec_count++]
12103                 = bits (arm_insn_r->arm_insn, 12, 15);
12104             }
12105       }
12106       break;
12107 
12108     default:
12109       return -1;
12110     }
12111 
12112   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12113 
12114   return 0;
12115 }
12116 
12117 /* Handle ARM mode instructions with opcode 010.  */
12118 
12119 static int
arm_record_ld_st_imm_offset(arm_insn_decode_record * arm_insn_r)12120 arm_record_ld_st_imm_offset (arm_insn_decode_record *arm_insn_r)
12121 {
12122   struct regcache *reg_cache = arm_insn_r->regcache;
12123 
12124   uint32_t reg_base , reg_dest;
12125   uint32_t offset_12, tgt_mem_addr;
12126   uint32_t record_buf[8], record_buf_mem[8];
12127   unsigned char wback;
12128   ULONGEST u_regval;
12129 
12130   /* Calculate wback.  */
12131   wback = (bit (arm_insn_r->arm_insn, 24) == 0)
12132             || (bit (arm_insn_r->arm_insn, 21) == 1);
12133 
12134   arm_insn_r->reg_rec_count = 0;
12135   reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12136 
12137   if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12138     {
12139       /* LDR (immediate), LDR (literal), LDRB (immediate), LDRB (literal), LDRBT
12140            and LDRT.  */
12141 
12142       reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12143       record_buf[arm_insn_r->reg_rec_count++] = reg_dest;
12144 
12145       /* The LDR instruction is capable of doing branching.  If MOV LR, PC
12146            preceeds a LDR instruction having R15 as reg_base, it
12147            emulates a branch and link instruction, and hence we need to save
12148            CPSR and PC as well.  */
12149       if (ARM_PC_REGNUM == reg_dest)
12150           record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12151 
12152       /* If wback is true, also save the base register, which is going to be
12153            written to.  */
12154       if (wback)
12155           record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12156     }
12157   else
12158     {
12159       /* STR (immediate), STRB (immediate), STRBT and STRT.  */
12160 
12161       offset_12 = bits (arm_insn_r->arm_insn, 0, 11);
12162       regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12163 
12164       /* Handle bit U.  */
12165       if (bit (arm_insn_r->arm_insn, 23))
12166           {
12167             /* U == 1: Add the offset. */
12168             tgt_mem_addr = (uint32_t) u_regval + offset_12;
12169           }
12170       else
12171           {
12172             /* U == 0: subtract the offset. */
12173             tgt_mem_addr = (uint32_t) u_regval - offset_12;
12174           }
12175 
12176       /* Bit 22 tells us whether the store instruction writes 1 byte or 4
12177            bytes.  */
12178       if (bit (arm_insn_r->arm_insn, 22))
12179           {
12180             /* STRB and STRBT: 1 byte.  */
12181             record_buf_mem[0] = 1;
12182           }
12183       else
12184           {
12185             /* STR and STRT: 4 bytes.  */
12186             record_buf_mem[0] = 4;
12187           }
12188 
12189       /* Handle bit P.  */
12190       if (bit (arm_insn_r->arm_insn, 24))
12191           record_buf_mem[1] = tgt_mem_addr;
12192       else
12193           record_buf_mem[1] = (uint32_t) u_regval;
12194 
12195       arm_insn_r->mem_rec_count = 1;
12196 
12197       /* If wback is true, also save the base register, which is going to be
12198            written to.  */
12199       if (wback)
12200           record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12201     }
12202 
12203   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12204   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12205   return 0;
12206 }
12207 
12208 /* Handling opcode 011 insns.  */
12209 
12210 static int
arm_record_ld_st_reg_offset(arm_insn_decode_record * arm_insn_r)12211 arm_record_ld_st_reg_offset (arm_insn_decode_record *arm_insn_r)
12212 {
12213   struct regcache *reg_cache = arm_insn_r->regcache;
12214 
12215   uint32_t shift_imm = 0;
12216   uint32_t reg_src1 = 0, reg_src2 = 0, reg_dest = 0;
12217   uint32_t offset_12 = 0, tgt_mem_addr = 0;
12218   uint32_t record_buf[8], record_buf_mem[8];
12219 
12220   LONGEST s_word;
12221   ULONGEST u_regval[2];
12222 
12223   if (bit (arm_insn_r->arm_insn, 4))
12224     return arm_record_media (arm_insn_r);
12225 
12226   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 21, 24);
12227   arm_insn_r->decode = bits (arm_insn_r->arm_insn, 4, 7);
12228 
12229   /* Handle enhanced store insns and LDRD DSP insn,
12230      order begins according to addressing modes for store insns
12231      STRH insn.  */
12232 
12233   /* LDR or STR?  */
12234   if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12235     {
12236       reg_dest = bits (arm_insn_r->arm_insn, 12, 15);
12237       /* LDR insn has a capability to do branching, if
12238            MOV LR, PC is preceded by LDR insn having Rn as R15
12239            in that case, it emulates branch and link insn, and hence we
12240            need to save CSPR and PC as well.  */
12241       if (15 != reg_dest)
12242           {
12243             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12244             arm_insn_r->reg_rec_count = 1;
12245           }
12246       else
12247           {
12248             record_buf[0] = reg_dest;
12249             record_buf[1] = ARM_PS_REGNUM;
12250             arm_insn_r->reg_rec_count = 2;
12251           }
12252     }
12253   else
12254     {
12255       if (! bits (arm_insn_r->arm_insn, 4, 11))
12256           {
12257             /* Store insn, register offset and register pre-indexed,
12258                register post-indexed.  */
12259             /* Get Rm.  */
12260             reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12261             /* Get Rn.  */
12262             reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12263             regcache_raw_read_unsigned (reg_cache, reg_src1
12264                                               , &u_regval[0]);
12265             regcache_raw_read_unsigned (reg_cache, reg_src2
12266                                               , &u_regval[1]);
12267             if (15 == reg_src2)
12268               {
12269                 /* If R15 was used as Rn, hence current PC+8.  */
12270                 /* Pre-indexed mode doesnt reach here ; illegal insn.  */
12271                     u_regval[0] = u_regval[0] + 8;
12272               }
12273             /* Calculate target store address, Rn +/- Rm, register offset.  */
12274             /* U == 1.  */
12275             if (bit (arm_insn_r->arm_insn, 23))
12276               {
12277                 tgt_mem_addr = u_regval[0] + u_regval[1];
12278               }
12279             else
12280               {
12281                 tgt_mem_addr = u_regval[1] - u_regval[0];
12282               }
12283 
12284             switch (arm_insn_r->opcode)
12285               {
12286                 /* STR.  */
12287                 case 8:
12288                 case 12:
12289                 /* STR.  */
12290                 case 9:
12291                 case 13:
12292                 /* STRT.  */
12293                 case 1:
12294                 case 5:
12295                 /* STR.  */
12296                 case 0:
12297                 case 4:
12298                     record_buf_mem[0] = 4;
12299                 break;
12300 
12301                 /* STRB.  */
12302                 case 10:
12303                 case 14:
12304                 /* STRB.  */
12305                 case 11:
12306                 case 15:
12307                 /* STRBT.  */
12308                 case 3:
12309                 case 7:
12310                 /* STRB.  */
12311                 case 2:
12312                 case 6:
12313                     record_buf_mem[0] = 1;
12314                 break;
12315 
12316                 default:
12317                     gdb_assert_not_reached ("no decoding pattern found");
12318                 break;
12319               }
12320             record_buf_mem[1] = tgt_mem_addr;
12321             arm_insn_r->mem_rec_count = 1;
12322 
12323             if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12324                 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12325                 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12326                 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12327                 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12328                 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12329                )
12330               {
12331                 /* Rn is going to be changed in pre-indexed mode and
12332                      post-indexed mode as well.  */
12333                 record_buf[0] = reg_src2;
12334                 arm_insn_r->reg_rec_count = 1;
12335               }
12336           }
12337       else
12338           {
12339             /* Store insn, scaled register offset; scaled pre-indexed.  */
12340             offset_12 = bits (arm_insn_r->arm_insn, 5, 6);
12341             /* Get Rm.  */
12342             reg_src1 = bits (arm_insn_r->arm_insn, 0, 3);
12343             /* Get Rn.  */
12344             reg_src2 = bits (arm_insn_r->arm_insn, 16, 19);
12345             /* Get shift_imm.  */
12346             shift_imm = bits (arm_insn_r->arm_insn, 7, 11);
12347             regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
12348             regcache_raw_read_signed (reg_cache, reg_src1, &s_word);
12349             regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12350             /* Offset_12 used as shift.  */
12351             switch (offset_12)
12352               {
12353                 case 0:
12354                     /* Offset_12 used as index.  */
12355                     offset_12 = u_regval[0] << shift_imm;
12356                 break;
12357 
12358                 case 1:
12359                     offset_12 = (!shift_imm) ? 0 : u_regval[0] >> shift_imm;
12360                 break;
12361 
12362                 case 2:
12363                     if (!shift_imm)
12364                       {
12365                         if (bit (u_regval[0], 31))
12366                           {
12367                               offset_12 = 0xFFFFFFFF;
12368                           }
12369                         else
12370                           {
12371                               offset_12 = 0;
12372                           }
12373                       }
12374                     else
12375                       {
12376                         /* This is arithmetic shift.  */
12377                         offset_12 = s_word >> shift_imm;
12378                       }
12379                     break;
12380 
12381                 case 3:
12382                     if (!shift_imm)
12383                       {
12384                         regcache_raw_read_unsigned (reg_cache, ARM_PS_REGNUM,
12385                                                             &u_regval[1]);
12386                         /* Get C flag value and shift it by 31.  */
12387                         offset_12 = (((bit (u_regval[1], 29)) << 31) \
12388                                           | (u_regval[0]) >> 1);
12389                       }
12390                     else
12391                       {
12392                         offset_12 = (u_regval[0] >> shift_imm) \
12393                                         | (u_regval[0] <<
12394                                         (sizeof(uint32_t) - shift_imm));
12395                       }
12396                 break;
12397 
12398                 default:
12399                     gdb_assert_not_reached ("no decoding pattern found");
12400                 break;
12401               }
12402 
12403             regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
12404             /* bit U set.  */
12405             if (bit (arm_insn_r->arm_insn, 23))
12406               {
12407                 tgt_mem_addr = u_regval[1] + offset_12;
12408               }
12409             else
12410               {
12411                 tgt_mem_addr = u_regval[1] - offset_12;
12412               }
12413 
12414             switch (arm_insn_r->opcode)
12415               {
12416                 /* STR.  */
12417                 case 8:
12418                 case 12:
12419                 /* STR.  */
12420                 case 9:
12421                 case 13:
12422                 /* STRT.  */
12423                 case 1:
12424                 case 5:
12425                 /* STR.  */
12426                 case 0:
12427                 case 4:
12428                     record_buf_mem[0] = 4;
12429                 break;
12430 
12431                 /* STRB.  */
12432                 case 10:
12433                 case 14:
12434                 /* STRB.  */
12435                 case 11:
12436                 case 15:
12437                 /* STRBT.  */
12438                 case 3:
12439                 case 7:
12440                 /* STRB.  */
12441                 case 2:
12442                 case 6:
12443                     record_buf_mem[0] = 1;
12444                 break;
12445 
12446                 default:
12447                     gdb_assert_not_reached ("no decoding pattern found");
12448                 break;
12449               }
12450             record_buf_mem[1] = tgt_mem_addr;
12451             arm_insn_r->mem_rec_count = 1;
12452 
12453             if (9 == arm_insn_r->opcode || 11 == arm_insn_r->opcode
12454                 || 13 == arm_insn_r->opcode || 15 == arm_insn_r->opcode
12455                 || 0 == arm_insn_r->opcode || 2 == arm_insn_r->opcode
12456                 || 4 == arm_insn_r->opcode || 6 == arm_insn_r->opcode
12457                 || 1 == arm_insn_r->opcode || 3 == arm_insn_r->opcode
12458                 || 5 == arm_insn_r->opcode || 7 == arm_insn_r->opcode
12459                )
12460               {
12461                 /* Rn is going to be changed in register scaled pre-indexed
12462                      mode,and scaled post indexed mode.  */
12463                 record_buf[0] = reg_src2;
12464                 arm_insn_r->reg_rec_count = 1;
12465               }
12466           }
12467     }
12468 
12469   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12470   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12471   return 0;
12472 }
12473 
12474 /* Handle ARM mode instructions with opcode 100.  */
12475 
12476 static int
arm_record_ld_st_multiple(arm_insn_decode_record * arm_insn_r)12477 arm_record_ld_st_multiple (arm_insn_decode_record *arm_insn_r)
12478 {
12479   struct regcache *reg_cache = arm_insn_r->regcache;
12480   uint32_t register_count = 0, register_bits;
12481   uint32_t reg_base, addr_mode;
12482   uint32_t record_buf[24], record_buf_mem[48];
12483   uint32_t wback;
12484   ULONGEST u_regval;
12485 
12486   /* Fetch the list of registers.  */
12487   register_bits = bits (arm_insn_r->arm_insn, 0, 15);
12488   arm_insn_r->reg_rec_count = 0;
12489 
12490   /* Fetch the base register that contains the address we are loading data
12491      to.  */
12492   reg_base = bits (arm_insn_r->arm_insn, 16, 19);
12493 
12494   /* Calculate wback.  */
12495   wback = (bit (arm_insn_r->arm_insn, 21) == 1);
12496 
12497   if (bit (arm_insn_r->arm_insn, INSN_S_L_BIT_NUM))
12498     {
12499       /* LDM/LDMIA/LDMFD, LDMDA/LDMFA, LDMDB and LDMIB.  */
12500 
12501       /* Find out which registers are going to be loaded from memory.  */
12502       while (register_bits)
12503           {
12504             if (register_bits & 0x00000001)
12505               record_buf[arm_insn_r->reg_rec_count++] = register_count;
12506             register_bits = register_bits >> 1;
12507             register_count++;
12508           }
12509 
12510 
12511       /* If wback is true, also save the base register, which is going to be
12512            written to.  */
12513       if (wback)
12514           record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12515 
12516       /* Save the CPSR register.  */
12517       record_buf[arm_insn_r->reg_rec_count++] = ARM_PS_REGNUM;
12518     }
12519   else
12520     {
12521       /* STM (STMIA, STMEA), STMDA (STMED), STMDB (STMFD) and STMIB (STMFA).  */
12522 
12523       addr_mode = bits (arm_insn_r->arm_insn, 23, 24);
12524 
12525       regcache_raw_read_unsigned (reg_cache, reg_base, &u_regval);
12526 
12527       /* Find out how many registers are going to be stored to memory.  */
12528       while (register_bits)
12529           {
12530             if (register_bits & 0x00000001)
12531               register_count++;
12532             register_bits = register_bits >> 1;
12533           }
12534 
12535       switch (addr_mode)
12536           {
12537             /* STMDA (STMED): Decrement after.  */
12538             case 0:
12539             record_buf_mem[1] = (uint32_t) u_regval
12540                                     - register_count * ARM_INT_REGISTER_SIZE + 4;
12541             break;
12542             /* STM (STMIA, STMEA): Increment after.  */
12543             case 1:
12544             record_buf_mem[1] = (uint32_t) u_regval;
12545             break;
12546             /* STMDB (STMFD): Decrement before.  */
12547             case 2:
12548             record_buf_mem[1] = (uint32_t) u_regval
12549                                     - register_count * ARM_INT_REGISTER_SIZE;
12550             break;
12551             /* STMIB (STMFA): Increment before.  */
12552             case 3:
12553             record_buf_mem[1] = (uint32_t) u_regval + ARM_INT_REGISTER_SIZE;
12554             break;
12555             default:
12556               gdb_assert_not_reached ("no decoding pattern found");
12557             break;
12558           }
12559 
12560       record_buf_mem[0] = register_count * ARM_INT_REGISTER_SIZE;
12561       arm_insn_r->mem_rec_count = 1;
12562 
12563       /* If wback is true, also save the base register, which is going to be
12564            written to.  */
12565       if (wback)
12566           record_buf[arm_insn_r->reg_rec_count++] = reg_base;
12567     }
12568 
12569   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12570   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12571   return 0;
12572 }
12573 
12574 /* Handling opcode 101 insns.  */
12575 
12576 static int
arm_record_b_bl(arm_insn_decode_record * arm_insn_r)12577 arm_record_b_bl (arm_insn_decode_record *arm_insn_r)
12578 {
12579   uint32_t record_buf[8];
12580 
12581   /* Handle B, BL, BLX(1) insns.  */
12582   /* B simply branches so we do nothing here.  */
12583   /* Note: BLX(1) doesnt fall here but instead it falls into
12584      extension space.  */
12585   if (bit (arm_insn_r->arm_insn, 24))
12586     {
12587       record_buf[0] = ARM_LR_REGNUM;
12588       arm_insn_r->reg_rec_count = 1;
12589     }
12590 
12591   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12592 
12593   return 0;
12594 }
12595 
12596 static int
arm_record_unsupported_insn(arm_insn_decode_record * arm_insn_r)12597 arm_record_unsupported_insn (arm_insn_decode_record *arm_insn_r)
12598 {
12599   gdb_printf (gdb_stderr,
12600                 _("Process record does not support instruction "
12601                     "0x%0x at address %s.\n"),arm_insn_r->arm_insn,
12602                 paddress (arm_insn_r->gdbarch, arm_insn_r->this_addr));
12603 
12604   return -1;
12605 }
12606 
12607 /* Record handler for vector data transfer instructions.  */
12608 
12609 static int
arm_record_vdata_transfer_insn(arm_insn_decode_record * arm_insn_r)12610 arm_record_vdata_transfer_insn (arm_insn_decode_record *arm_insn_r)
12611 {
12612   uint32_t bits_a, bit_c, bit_l, reg_t, reg_v;
12613   uint32_t record_buf[4];
12614 
12615   reg_t = bits (arm_insn_r->arm_insn, 12, 15);
12616   reg_v = bits (arm_insn_r->arm_insn, 21, 23);
12617   bits_a = bits (arm_insn_r->arm_insn, 21, 23);
12618   bit_l = bit (arm_insn_r->arm_insn, 20);
12619   bit_c = bit (arm_insn_r->arm_insn, 8);
12620 
12621   /* Handle VMOV instruction.  */
12622   if (bit_l && bit_c)
12623     {
12624       record_buf[0] = reg_t;
12625       arm_insn_r->reg_rec_count = 1;
12626     }
12627   else if (bit_l && !bit_c)
12628     {
12629       /* Handle VMOV instruction.  */
12630       if (bits_a == 0x00)
12631           {
12632             record_buf[0] = reg_t;
12633             arm_insn_r->reg_rec_count = 1;
12634           }
12635       /* Handle VMRS instruction.  */
12636       else if (bits_a == 0x07)
12637           {
12638             if (reg_t == 15)
12639               reg_t = ARM_PS_REGNUM;
12640 
12641             record_buf[0] = reg_t;
12642             arm_insn_r->reg_rec_count = 1;
12643           }
12644     }
12645   else if (!bit_l && !bit_c)
12646     {
12647       /* Handle VMOV instruction.  */
12648       if (bits_a == 0x00)
12649           {
12650             record_buf[0] = ARM_D0_REGNUM + reg_v;
12651 
12652             arm_insn_r->reg_rec_count = 1;
12653           }
12654       /* Handle VMSR instruction.  */
12655       else if (bits_a == 0x07)
12656           {
12657             record_buf[0] = ARM_FPSCR_REGNUM;
12658             arm_insn_r->reg_rec_count = 1;
12659           }
12660     }
12661   else if (!bit_l && bit_c)
12662     {
12663       /* Handle VMOV instruction.  */
12664       if (!(bits_a & 0x04))
12665           {
12666             record_buf[0] = (reg_v | (bit (arm_insn_r->arm_insn, 7) << 4))
12667                                 + ARM_D0_REGNUM;
12668             arm_insn_r->reg_rec_count = 1;
12669           }
12670       /* Handle VDUP instruction.  */
12671       else
12672           {
12673             if (bit (arm_insn_r->arm_insn, 21))
12674               {
12675                 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12676                 record_buf[0] = reg_v + ARM_D0_REGNUM;
12677                 record_buf[1] = reg_v + ARM_D0_REGNUM + 1;
12678                 arm_insn_r->reg_rec_count = 2;
12679               }
12680             else
12681               {
12682                 reg_v = reg_v | (bit (arm_insn_r->arm_insn, 7) << 4);
12683                 record_buf[0] = reg_v + ARM_D0_REGNUM;
12684                 arm_insn_r->reg_rec_count = 1;
12685               }
12686           }
12687     }
12688 
12689   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12690   return 0;
12691 }
12692 
12693 /* Record handler for extension register load/store instructions.  */
12694 
12695 static int
arm_record_exreg_ld_st_insn(arm_insn_decode_record * arm_insn_r)12696 arm_record_exreg_ld_st_insn (arm_insn_decode_record *arm_insn_r)
12697 {
12698   uint32_t opcode, single_reg;
12699   uint8_t op_vldm_vstm;
12700   uint32_t record_buf[8], record_buf_mem[128];
12701   ULONGEST u_regval = 0;
12702 
12703   struct regcache *reg_cache = arm_insn_r->regcache;
12704 
12705   opcode = bits (arm_insn_r->arm_insn, 20, 24);
12706   single_reg = !bit (arm_insn_r->arm_insn, 8);
12707   op_vldm_vstm = opcode & 0x1b;
12708 
12709   /* Handle VMOV instructions.  */
12710   if ((opcode & 0x1e) == 0x04)
12711     {
12712       if (bit (arm_insn_r->arm_insn, 20)) /* to_arm_registers bit 20? */
12713           {
12714             record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
12715             record_buf[1] = bits (arm_insn_r->arm_insn, 16, 19);
12716             arm_insn_r->reg_rec_count = 2;
12717           }
12718       else
12719           {
12720             uint8_t reg_m = bits (arm_insn_r->arm_insn, 0, 3);
12721             uint8_t bit_m = bit (arm_insn_r->arm_insn, 5);
12722 
12723             if (single_reg)
12724               {
12725                 /* The first S register number m is REG_M:M (M is bit 5),
12726                      the corresponding D register number is REG_M:M / 2, which
12727                      is REG_M.  */
12728                 record_buf[arm_insn_r->reg_rec_count++] = ARM_D0_REGNUM + reg_m;
12729                 /* The second S register number is REG_M:M + 1, the
12730                      corresponding D register number is (REG_M:M + 1) / 2.
12731                      IOW, if bit M is 1, the first and second S registers
12732                      are mapped to different D registers, otherwise, they are
12733                      in the same D register.  */
12734                 if (bit_m)
12735                     {
12736                       record_buf[arm_insn_r->reg_rec_count++]
12737                         = ARM_D0_REGNUM + reg_m + 1;
12738                     }
12739               }
12740             else
12741               {
12742                 record_buf[0] = ((bit_m << 4) + reg_m + ARM_D0_REGNUM);
12743                 arm_insn_r->reg_rec_count = 1;
12744               }
12745           }
12746     }
12747   /* Handle VSTM and VPUSH instructions.  */
12748   else if (op_vldm_vstm == 0x08 || op_vldm_vstm == 0x0a
12749              || op_vldm_vstm == 0x12)
12750     {
12751       uint32_t start_address, reg_rn, imm_off32, imm_off8, memory_count;
12752       uint32_t memory_index = 0;
12753 
12754       reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12755       regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12756       imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12757       imm_off32 = imm_off8 << 2;
12758       memory_count = imm_off8;
12759 
12760       if (bit (arm_insn_r->arm_insn, 23))
12761           start_address = u_regval;
12762       else
12763           start_address = u_regval - imm_off32;
12764 
12765       if (bit (arm_insn_r->arm_insn, 21))
12766           {
12767             record_buf[0] = reg_rn;
12768             arm_insn_r->reg_rec_count = 1;
12769           }
12770 
12771       while (memory_count > 0)
12772           {
12773             if (single_reg)
12774               {
12775                 record_buf_mem[memory_index] = 4;
12776                 record_buf_mem[memory_index + 1] = start_address;
12777                 start_address = start_address + 4;
12778                 memory_index = memory_index + 2;
12779               }
12780             else
12781               {
12782                 record_buf_mem[memory_index] = 4;
12783                 record_buf_mem[memory_index + 1] = start_address;
12784                 record_buf_mem[memory_index + 2] = 4;
12785                 record_buf_mem[memory_index + 3] = start_address + 4;
12786                 start_address = start_address + 8;
12787                 memory_index = memory_index + 4;
12788               }
12789             memory_count--;
12790           }
12791       arm_insn_r->mem_rec_count = (memory_index >> 1);
12792     }
12793   /* Handle VLDM instructions.  */
12794   else if (op_vldm_vstm == 0x09 || op_vldm_vstm == 0x0b
12795              || op_vldm_vstm == 0x13)
12796     {
12797       uint32_t reg_count, reg_vd;
12798       uint32_t reg_index = 0;
12799       uint32_t bit_d = bit (arm_insn_r->arm_insn, 22);
12800 
12801       reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12802       reg_count = bits (arm_insn_r->arm_insn, 0, 7);
12803 
12804       /* REG_VD is the first D register number.  If the instruction
12805            loads memory to S registers (SINGLE_REG is TRUE), the register
12806            number is (REG_VD << 1 | bit D), so the corresponding D
12807            register number is (REG_VD << 1 | bit D) / 2 = REG_VD.  */
12808       if (!single_reg)
12809           reg_vd = reg_vd | (bit_d << 4);
12810 
12811       if (bit (arm_insn_r->arm_insn, 21) /* write back */)
12812           record_buf[reg_index++] = bits (arm_insn_r->arm_insn, 16, 19);
12813 
12814       /* If the instruction loads memory to D register, REG_COUNT should
12815            be divided by 2, according to the ARM Architecture Reference
12816            Manual.  If the instruction loads memory to S register, divide by
12817            2 as well because two S registers are mapped to D register.  */
12818       reg_count  = reg_count / 2;
12819       if (single_reg && bit_d)
12820           {
12821             /* Increase the register count if S register list starts from
12822                an odd number (bit d is one).  */
12823             reg_count++;
12824           }
12825 
12826       while (reg_count > 0)
12827           {
12828             record_buf[reg_index++] = ARM_D0_REGNUM + reg_vd + reg_count - 1;
12829             reg_count--;
12830           }
12831       arm_insn_r->reg_rec_count = reg_index;
12832     }
12833   /* VSTR Vector store register.  */
12834   else if ((opcode & 0x13) == 0x10)
12835     {
12836       uint32_t start_address, reg_rn, imm_off32, imm_off8;
12837       uint32_t memory_index = 0;
12838 
12839       reg_rn = bits (arm_insn_r->arm_insn, 16, 19);
12840       regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
12841       imm_off8 = bits (arm_insn_r->arm_insn, 0, 7);
12842       imm_off32 = imm_off8 << 2;
12843 
12844       if (bit (arm_insn_r->arm_insn, 23))
12845           start_address = u_regval + imm_off32;
12846       else
12847           start_address = u_regval - imm_off32;
12848 
12849       if (single_reg)
12850           {
12851             record_buf_mem[memory_index] = 4;
12852             record_buf_mem[memory_index + 1] = start_address;
12853             arm_insn_r->mem_rec_count = 1;
12854           }
12855       else
12856           {
12857             record_buf_mem[memory_index] = 4;
12858             record_buf_mem[memory_index + 1] = start_address;
12859             record_buf_mem[memory_index + 2] = 4;
12860             record_buf_mem[memory_index + 3] = start_address + 4;
12861             arm_insn_r->mem_rec_count = 2;
12862           }
12863     }
12864   /* VLDR Vector load register.  */
12865   else if ((opcode & 0x13) == 0x11)
12866     {
12867       uint32_t reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12868 
12869       if (!single_reg)
12870           {
12871             reg_vd = reg_vd | (bit (arm_insn_r->arm_insn, 22) << 4);
12872             record_buf[0] = ARM_D0_REGNUM + reg_vd;
12873           }
12874       else
12875           {
12876             reg_vd = (reg_vd << 1) | bit (arm_insn_r->arm_insn, 22);
12877             /* Record register D rather than pseudo register S.  */
12878             record_buf[0] = ARM_D0_REGNUM + reg_vd / 2;
12879           }
12880       arm_insn_r->reg_rec_count = 1;
12881     }
12882 
12883   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
12884   MEM_ALLOC (arm_insn_r->arm_mems, arm_insn_r->mem_rec_count, record_buf_mem);
12885   return 0;
12886 }
12887 
12888 /* Record handler for arm/thumb mode VFP data processing instructions.  */
12889 
12890 static int
arm_record_vfp_data_proc_insn(arm_insn_decode_record * arm_insn_r)12891 arm_record_vfp_data_proc_insn (arm_insn_decode_record *arm_insn_r)
12892 {
12893   uint32_t opc1, opc2, opc3, dp_op_sz, bit_d, reg_vd;
12894   uint32_t record_buf[4];
12895   enum insn_types {INSN_T0, INSN_T1, INSN_T2, INSN_T3, INSN_INV};
12896   enum insn_types curr_insn_type = INSN_INV;
12897 
12898   reg_vd = bits (arm_insn_r->arm_insn, 12, 15);
12899   opc1 = bits (arm_insn_r->arm_insn, 20, 23);
12900   opc2 = bits (arm_insn_r->arm_insn, 16, 19);
12901   opc3 = bits (arm_insn_r->arm_insn, 6, 7);
12902   dp_op_sz = bit (arm_insn_r->arm_insn, 8);
12903   bit_d = bit (arm_insn_r->arm_insn, 22);
12904   /* Mask off the "D" bit.  */
12905   opc1 = opc1 & ~0x04;
12906 
12907   /* Handle VMLA, VMLS.  */
12908   if (opc1 == 0x00)
12909     {
12910       if (bit (arm_insn_r->arm_insn, 10))
12911           {
12912             if (bit (arm_insn_r->arm_insn, 6))
12913               curr_insn_type = INSN_T0;
12914             else
12915               curr_insn_type = INSN_T1;
12916           }
12917       else
12918           {
12919             if (dp_op_sz)
12920               curr_insn_type = INSN_T1;
12921             else
12922               curr_insn_type = INSN_T2;
12923           }
12924     }
12925   /* Handle VNMLA, VNMLS, VNMUL.  */
12926   else if (opc1 == 0x01)
12927     {
12928       if (dp_op_sz)
12929           curr_insn_type = INSN_T1;
12930       else
12931           curr_insn_type = INSN_T2;
12932     }
12933   /* Handle VMUL.  */
12934   else if (opc1 == 0x02 && !(opc3 & 0x01))
12935     {
12936       if (bit (arm_insn_r->arm_insn, 10))
12937           {
12938             if (bit (arm_insn_r->arm_insn, 6))
12939               curr_insn_type = INSN_T0;
12940             else
12941               curr_insn_type = INSN_T1;
12942           }
12943       else
12944           {
12945             if (dp_op_sz)
12946               curr_insn_type = INSN_T1;
12947             else
12948               curr_insn_type = INSN_T2;
12949           }
12950     }
12951   /* Handle VADD, VSUB.  */
12952   else if (opc1 == 0x03)
12953     {
12954       if (!bit (arm_insn_r->arm_insn, 9))
12955           {
12956             if (bit (arm_insn_r->arm_insn, 6))
12957               curr_insn_type = INSN_T0;
12958             else
12959               curr_insn_type = INSN_T1;
12960           }
12961       else
12962           {
12963             if (dp_op_sz)
12964               curr_insn_type = INSN_T1;
12965             else
12966               curr_insn_type = INSN_T2;
12967           }
12968     }
12969   /* Handle VDIV.  */
12970   else if (opc1 == 0x08)
12971     {
12972       if (dp_op_sz)
12973           curr_insn_type = INSN_T1;
12974       else
12975           curr_insn_type = INSN_T2;
12976     }
12977   /* Handle all other vfp data processing instructions.  */
12978   else if (opc1 == 0x0b)
12979     {
12980       /* Handle VMOV.  */
12981       if (!(opc3 & 0x01) || (opc2 == 0x00 && opc3 == 0x01))
12982           {
12983             if (bit (arm_insn_r->arm_insn, 4))
12984               {
12985                 if (bit (arm_insn_r->arm_insn, 6))
12986                     curr_insn_type = INSN_T0;
12987                 else
12988                     curr_insn_type = INSN_T1;
12989               }
12990             else
12991               {
12992                 if (dp_op_sz)
12993                     curr_insn_type = INSN_T1;
12994                 else
12995                     curr_insn_type = INSN_T2;
12996               }
12997           }
12998       /* Handle VNEG and VABS.  */
12999       else if ((opc2 == 0x01 && opc3 == 0x01)
13000                 || (opc2 == 0x00 && opc3 == 0x03))
13001           {
13002             if (!bit (arm_insn_r->arm_insn, 11))
13003               {
13004                 if (bit (arm_insn_r->arm_insn, 6))
13005                     curr_insn_type = INSN_T0;
13006                 else
13007                     curr_insn_type = INSN_T1;
13008               }
13009             else
13010               {
13011                 if (dp_op_sz)
13012                     curr_insn_type = INSN_T1;
13013                 else
13014                     curr_insn_type = INSN_T2;
13015               }
13016           }
13017       /* Handle VSQRT.  */
13018       else if (opc2 == 0x01 && opc3 == 0x03)
13019           {
13020             if (dp_op_sz)
13021               curr_insn_type = INSN_T1;
13022             else
13023               curr_insn_type = INSN_T2;
13024           }
13025       /* Handle VCVT.  */
13026       else if (opc2 == 0x07 && opc3 == 0x03)
13027           {
13028             if (!dp_op_sz)
13029               curr_insn_type = INSN_T1;
13030             else
13031               curr_insn_type = INSN_T2;
13032           }
13033       else if (opc3 & 0x01)
13034           {
13035             /* Handle VCVT.  */
13036             if ((opc2 == 0x08) || (opc2 & 0x0e) == 0x0c)
13037               {
13038                 if (!bit (arm_insn_r->arm_insn, 18))
13039                     curr_insn_type = INSN_T2;
13040                 else
13041                     {
13042                       if (dp_op_sz)
13043                         curr_insn_type = INSN_T1;
13044                       else
13045                         curr_insn_type = INSN_T2;
13046                     }
13047               }
13048             /* Handle VCVT.  */
13049             else if ((opc2 & 0x0e) == 0x0a || (opc2 & 0x0e) == 0x0e)
13050               {
13051                 if (dp_op_sz)
13052                     curr_insn_type = INSN_T1;
13053                 else
13054                     curr_insn_type = INSN_T2;
13055               }
13056             /* Handle VCVTB, VCVTT.  */
13057             else if ((opc2 & 0x0e) == 0x02)
13058               curr_insn_type = INSN_T2;
13059             /* Handle VCMP, VCMPE.  */
13060             else if ((opc2 & 0x0e) == 0x04)
13061               curr_insn_type = INSN_T3;
13062           }
13063     }
13064 
13065   switch (curr_insn_type)
13066     {
13067       case INSN_T0:
13068           reg_vd = reg_vd | (bit_d << 4);
13069           record_buf[0] = reg_vd + ARM_D0_REGNUM;
13070           record_buf[1] = reg_vd + ARM_D0_REGNUM + 1;
13071           arm_insn_r->reg_rec_count = 2;
13072           break;
13073 
13074       case INSN_T1:
13075           reg_vd = reg_vd | (bit_d << 4);
13076           record_buf[0] = reg_vd + ARM_D0_REGNUM;
13077           arm_insn_r->reg_rec_count = 1;
13078           break;
13079 
13080       case INSN_T2:
13081           reg_vd = (reg_vd << 1) | bit_d;
13082           record_buf[0] = reg_vd + ARM_D0_REGNUM;
13083           arm_insn_r->reg_rec_count = 1;
13084           break;
13085 
13086       case INSN_T3:
13087           record_buf[0] = ARM_FPSCR_REGNUM;
13088           arm_insn_r->reg_rec_count = 1;
13089           break;
13090 
13091       default:
13092           gdb_assert_not_reached ("no decoding pattern found");
13093           break;
13094     }
13095 
13096   REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, record_buf);
13097   return 0;
13098 }
13099 
13100 /* Handling opcode 110 insns.  */
13101 
13102 static int
arm_record_asimd_vfp_coproc(arm_insn_decode_record * arm_insn_r)13103 arm_record_asimd_vfp_coproc (arm_insn_decode_record *arm_insn_r)
13104 {
13105   uint32_t op1, op1_ebit, coproc;
13106 
13107   coproc = bits (arm_insn_r->arm_insn, 8, 11);
13108   op1 = bits (arm_insn_r->arm_insn, 20, 25);
13109   op1_ebit = bit (arm_insn_r->arm_insn, 20);
13110 
13111   if ((coproc & 0x0e) == 0x0a)
13112     {
13113       /* Handle extension register ld/st instructions.  */
13114       if (!(op1 & 0x20))
13115           return arm_record_exreg_ld_st_insn (arm_insn_r);
13116 
13117       /* 64-bit transfers between arm core and extension registers.  */
13118       if ((op1 & 0x3e) == 0x04)
13119           return arm_record_exreg_ld_st_insn (arm_insn_r);
13120     }
13121   else
13122     {
13123       /* Handle coprocessor ld/st instructions.  */
13124       if (!(op1 & 0x3a))
13125           {
13126             /* Store.  */
13127             if (!op1_ebit)
13128               return arm_record_unsupported_insn (arm_insn_r);
13129             else
13130               /* Load.  */
13131               return arm_record_unsupported_insn (arm_insn_r);
13132           }
13133 
13134       /* Move to coprocessor from two arm core registers.  */
13135       if (op1 == 0x4)
13136           return arm_record_unsupported_insn (arm_insn_r);
13137 
13138       /* Move to two arm core registers from coprocessor.  */
13139       if (op1 == 0x5)
13140           {
13141             uint32_t reg_t[2];
13142 
13143             reg_t[0] = bits (arm_insn_r->arm_insn, 12, 15);
13144             reg_t[1] = bits (arm_insn_r->arm_insn, 16, 19);
13145             arm_insn_r->reg_rec_count = 2;
13146 
13147             REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count, reg_t);
13148             return 0;
13149        }
13150     }
13151   return arm_record_unsupported_insn (arm_insn_r);
13152 }
13153 
13154 /* Handling opcode 111 insns.  */
13155 
13156 static int
arm_record_coproc_data_proc(arm_insn_decode_record * arm_insn_r)13157 arm_record_coproc_data_proc (arm_insn_decode_record *arm_insn_r)
13158 {
13159   uint32_t op, op1_ebit, coproc, bits_24_25;
13160   arm_gdbarch_tdep *tdep
13161     = gdbarch_tdep<arm_gdbarch_tdep> (arm_insn_r->gdbarch);
13162   struct regcache *reg_cache = arm_insn_r->regcache;
13163 
13164   arm_insn_r->opcode = bits (arm_insn_r->arm_insn, 24, 27);
13165   coproc = bits (arm_insn_r->arm_insn, 8, 11);
13166   op1_ebit = bit (arm_insn_r->arm_insn, 20);
13167   op = bit (arm_insn_r->arm_insn, 4);
13168   bits_24_25 = bits (arm_insn_r->arm_insn, 24, 25);
13169 
13170   /* Handle arm SWI/SVC system call instructions.  */
13171   if (bits_24_25 == 0x3)
13172     {
13173       if (tdep->arm_syscall_record != NULL)
13174           {
13175             ULONGEST svc_operand, svc_number;
13176 
13177             svc_operand = (0x00ffffff & arm_insn_r->arm_insn);
13178 
13179             if (svc_operand)  /* OABI.  */
13180               svc_number = svc_operand - 0x900000;
13181             else /* EABI.  */
13182               regcache_raw_read_unsigned (reg_cache, 7, &svc_number);
13183 
13184             return tdep->arm_syscall_record (reg_cache, svc_number);
13185           }
13186       else
13187           {
13188             gdb_printf (gdb_stderr, _("no syscall record support\n"));
13189             return -1;
13190           }
13191     }
13192   else if (bits_24_25 == 0x02)
13193     {
13194       if (op)
13195           {
13196             if ((coproc & 0x0e) == 0x0a)
13197               {
13198                 /* 8, 16, and 32-bit transfer */
13199                 return arm_record_vdata_transfer_insn (arm_insn_r);
13200               }
13201             else
13202               {
13203                 if (op1_ebit)
13204                     {
13205                       /* MRC, MRC2 */
13206                       uint32_t record_buf[1];
13207 
13208                       record_buf[0] = bits (arm_insn_r->arm_insn, 12, 15);
13209                       if (record_buf[0] == 15)
13210                         record_buf[0] = ARM_PS_REGNUM;
13211 
13212                       arm_insn_r->reg_rec_count = 1;
13213                       REG_ALLOC (arm_insn_r->arm_regs, arm_insn_r->reg_rec_count,
13214                                    record_buf);
13215                       return 0;
13216                     }
13217                 else
13218                     {
13219                       /* MCR, MCR2 */
13220                       return -1;
13221                     }
13222               }
13223           }
13224       else
13225           {
13226             if ((coproc & 0x0e) == 0x0a)
13227               {
13228                 /* VFP data-processing instructions.  */
13229                 return arm_record_vfp_data_proc_insn (arm_insn_r);
13230               }
13231             else
13232               {
13233                 /* CDP, CDP2 */
13234                 return -1;
13235               }
13236           }
13237     }
13238   else
13239     {
13240       unsigned int op1 = bits (arm_insn_r->arm_insn, 20, 25);
13241 
13242       if (op1 == 5)
13243           {
13244             if ((coproc & 0x0e) != 0x0a)
13245               {
13246                 /* MRRC, MRRC2 */
13247                 return -1;
13248               }
13249           }
13250       else if (op1 == 4 || op1 == 5)
13251           {
13252             if ((coproc & 0x0e) == 0x0a)
13253               {
13254                 /* 64-bit transfers between ARM core and extension */
13255                 return -1;
13256               }
13257             else if (op1 == 4)
13258               {
13259                 /* MCRR, MCRR2 */
13260                 return -1;
13261               }
13262           }
13263       else if (op1 == 0 || op1 == 1)
13264           {
13265             /* UNDEFINED */
13266             return -1;
13267           }
13268       else
13269           {
13270             if ((coproc & 0x0e) == 0x0a)
13271               {
13272                 /* Extension register load/store */
13273               }
13274             else
13275               {
13276                 /* STC, STC2, LDC, LDC2 */
13277               }
13278             return -1;
13279           }
13280     }
13281 
13282   return -1;
13283 }
13284 
13285 /* Handling opcode 000 insns.  */
13286 
13287 static int
thumb_record_shift_add_sub(arm_insn_decode_record * thumb_insn_r)13288 thumb_record_shift_add_sub (arm_insn_decode_record *thumb_insn_r)
13289 {
13290   uint32_t record_buf[8];
13291   uint32_t reg_src1 = 0;
13292 
13293   reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13294 
13295   record_buf[0] = ARM_PS_REGNUM;
13296   record_buf[1] = reg_src1;
13297   thumb_insn_r->reg_rec_count = 2;
13298 
13299   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13300 
13301   return 0;
13302 }
13303 
13304 
13305 /* Handling opcode 001 insns.  */
13306 
13307 static int
thumb_record_add_sub_cmp_mov(arm_insn_decode_record * thumb_insn_r)13308 thumb_record_add_sub_cmp_mov (arm_insn_decode_record *thumb_insn_r)
13309 {
13310   uint32_t record_buf[8];
13311   uint32_t reg_src1 = 0;
13312 
13313   reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13314 
13315   record_buf[0] = ARM_PS_REGNUM;
13316   record_buf[1] = reg_src1;
13317   thumb_insn_r->reg_rec_count = 2;
13318 
13319   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13320 
13321   return 0;
13322 }
13323 
13324 /* Handling opcode 010 insns.  */
13325 
13326 static int
thumb_record_ld_st_reg_offset(arm_insn_decode_record * thumb_insn_r)13327 thumb_record_ld_st_reg_offset (arm_insn_decode_record *thumb_insn_r)
13328 {
13329   struct regcache *reg_cache =  thumb_insn_r->regcache;
13330   uint32_t record_buf[8], record_buf_mem[8];
13331 
13332   uint32_t reg_src1 = 0, reg_src2 = 0;
13333   uint32_t opcode1 = 0, opcode2 = 0, opcode3 = 0;
13334 
13335   ULONGEST u_regval[2] = {0};
13336 
13337   opcode1 = bits (thumb_insn_r->arm_insn, 10, 12);
13338 
13339   if (bit (thumb_insn_r->arm_insn, 12))
13340     {
13341       /* Handle load/store register offset.  */
13342       uint32_t opB = bits (thumb_insn_r->arm_insn, 9, 11);
13343 
13344       if (in_inclusive_range (opB, 4U, 7U))
13345           {
13346             /* LDR(2), LDRB(2) , LDRH(2), LDRSB, LDRSH.  */
13347             reg_src1 = bits (thumb_insn_r->arm_insn,0, 2);
13348             record_buf[0] = reg_src1;
13349             thumb_insn_r->reg_rec_count = 1;
13350           }
13351       else if (in_inclusive_range (opB, 0U, 2U))
13352           {
13353             /* STR(2), STRB(2), STRH(2) .  */
13354             reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13355             reg_src2 = bits (thumb_insn_r->arm_insn, 6, 8);
13356             regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval[0]);
13357             regcache_raw_read_unsigned (reg_cache, reg_src2, &u_regval[1]);
13358             if (0 == opB)
13359               record_buf_mem[0] = 4;    /* STR (2).  */
13360             else if (2 == opB)
13361               record_buf_mem[0] = 1;    /*  STRB (2).  */
13362             else if (1 == opB)
13363               record_buf_mem[0] = 2;    /* STRH (2).  */
13364             record_buf_mem[1] = u_regval[0] + u_regval[1];
13365             thumb_insn_r->mem_rec_count = 1;
13366           }
13367     }
13368   else if (bit (thumb_insn_r->arm_insn, 11))
13369     {
13370       /* Handle load from literal pool.  */
13371       /* LDR(3).  */
13372       reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13373       record_buf[0] = reg_src1;
13374       thumb_insn_r->reg_rec_count = 1;
13375     }
13376   else if (opcode1)
13377     {
13378       /* Special data instructions and branch and exchange */
13379       opcode2 = bits (thumb_insn_r->arm_insn, 8, 9);
13380       opcode3 = bits (thumb_insn_r->arm_insn, 0, 2);
13381       if ((3 == opcode2) && (!opcode3))
13382           {
13383             /* Branch with exchange.  */
13384             record_buf[0] = ARM_PS_REGNUM;
13385             thumb_insn_r->reg_rec_count = 1;
13386           }
13387       else
13388           {
13389             /* Format 8; special data processing insns.  */
13390             record_buf[0] = ARM_PS_REGNUM;
13391             record_buf[1] = (bit (thumb_insn_r->arm_insn, 7) << 3
13392                                  | bits (thumb_insn_r->arm_insn, 0, 2));
13393             thumb_insn_r->reg_rec_count = 2;
13394           }
13395     }
13396   else
13397     {
13398       /* Format 5; data processing insns.  */
13399       reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13400       if (bit (thumb_insn_r->arm_insn, 7))
13401           {
13402             reg_src1 = reg_src1 + 8;
13403           }
13404       record_buf[0] = ARM_PS_REGNUM;
13405       record_buf[1] = reg_src1;
13406       thumb_insn_r->reg_rec_count = 2;
13407     }
13408 
13409   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13410   MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13411                record_buf_mem);
13412 
13413   return 0;
13414 }
13415 
13416 /* Handling opcode 001 insns.  */
13417 
13418 static int
thumb_record_ld_st_imm_offset(arm_insn_decode_record * thumb_insn_r)13419 thumb_record_ld_st_imm_offset (arm_insn_decode_record *thumb_insn_r)
13420 {
13421   struct regcache *reg_cache = thumb_insn_r->regcache;
13422   uint32_t record_buf[8], record_buf_mem[8];
13423 
13424   uint32_t reg_src1 = 0;
13425   uint32_t opcode = 0, immed_5 = 0;
13426 
13427   ULONGEST u_regval = 0;
13428 
13429   opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13430 
13431   if (opcode)
13432     {
13433       /* LDR(1).  */
13434       reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13435       record_buf[0] = reg_src1;
13436       thumb_insn_r->reg_rec_count = 1;
13437     }
13438   else
13439     {
13440       /* STR(1).  */
13441       reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13442       immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13443       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13444       record_buf_mem[0] = 4;
13445       record_buf_mem[1] = u_regval + (immed_5 * 4);
13446       thumb_insn_r->mem_rec_count = 1;
13447     }
13448 
13449   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13450   MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13451                record_buf_mem);
13452 
13453   return 0;
13454 }
13455 
13456 /* Handling opcode 100 insns.  */
13457 
13458 static int
thumb_record_ld_st_stack(arm_insn_decode_record * thumb_insn_r)13459 thumb_record_ld_st_stack (arm_insn_decode_record *thumb_insn_r)
13460 {
13461   struct regcache *reg_cache = thumb_insn_r->regcache;
13462   uint32_t record_buf[8], record_buf_mem[8];
13463 
13464   uint32_t reg_src1 = 0;
13465   uint32_t opcode = 0, immed_8 = 0, immed_5 = 0;
13466 
13467   ULONGEST u_regval = 0;
13468 
13469   opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13470 
13471   if (3 == opcode)
13472     {
13473       /* LDR(4).  */
13474       reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13475       record_buf[0] = reg_src1;
13476       thumb_insn_r->reg_rec_count = 1;
13477     }
13478   else if (1 == opcode)
13479     {
13480       /* LDRH(1).  */
13481       reg_src1 = bits (thumb_insn_r->arm_insn, 0, 2);
13482       record_buf[0] = reg_src1;
13483       thumb_insn_r->reg_rec_count = 1;
13484     }
13485   else if (2 == opcode)
13486     {
13487       /* STR(3).  */
13488       immed_8 = bits (thumb_insn_r->arm_insn, 0, 7);
13489       regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13490       record_buf_mem[0] = 4;
13491       record_buf_mem[1] = u_regval + (immed_8 * 4);
13492       thumb_insn_r->mem_rec_count = 1;
13493     }
13494   else if (0 == opcode)
13495     {
13496       /* STRH(1).  */
13497       immed_5 = bits (thumb_insn_r->arm_insn, 6, 10);
13498       reg_src1 = bits (thumb_insn_r->arm_insn, 3, 5);
13499       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13500       record_buf_mem[0] = 2;
13501       record_buf_mem[1] = u_regval + (immed_5 * 2);
13502       thumb_insn_r->mem_rec_count = 1;
13503     }
13504 
13505   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13506   MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13507                record_buf_mem);
13508 
13509   return 0;
13510 }
13511 
13512 /* Handling opcode 101 insns.  */
13513 
13514 static int
thumb_record_misc(arm_insn_decode_record * thumb_insn_r)13515 thumb_record_misc (arm_insn_decode_record *thumb_insn_r)
13516 {
13517   struct regcache *reg_cache = thumb_insn_r->regcache;
13518 
13519   uint32_t opcode = 0;
13520   uint32_t register_bits = 0, register_count = 0;
13521   uint32_t index = 0, start_address = 0;
13522   uint32_t record_buf[24], record_buf_mem[48];
13523   uint32_t reg_src1;
13524 
13525   ULONGEST u_regval = 0;
13526 
13527   opcode = bits (thumb_insn_r->arm_insn, 11, 12);
13528 
13529   if (opcode == 0 || opcode == 1)
13530     {
13531       /* ADR and ADD (SP plus immediate) */
13532 
13533       reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13534       record_buf[0] = reg_src1;
13535       thumb_insn_r->reg_rec_count = 1;
13536     }
13537   else
13538     {
13539       /* Miscellaneous 16-bit instructions */
13540       uint32_t opcode2 = bits (thumb_insn_r->arm_insn, 8, 11);
13541 
13542       switch (opcode2)
13543           {
13544           case 6:
13545             /* SETEND and CPS */
13546             break;
13547           case 0:
13548             /* ADD/SUB (SP plus immediate)  */
13549             reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13550             record_buf[0] = ARM_SP_REGNUM;
13551             thumb_insn_r->reg_rec_count = 1;
13552             break;
13553           case 1: /* fall through  */
13554           case 3: /* fall through  */
13555           case 9: /* fall through  */
13556           case 11:
13557             /* CBNZ, CBZ */
13558             break;
13559           case 2:
13560             /* SXTH, SXTB, UXTH, UXTB */
13561             record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13562             thumb_insn_r->reg_rec_count = 1;
13563             break;
13564           case 4: /* fall through  */
13565           case 5:
13566             /* PUSH.  */
13567             register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13568             regcache_raw_read_unsigned (reg_cache, ARM_SP_REGNUM, &u_regval);
13569             while (register_bits)
13570               {
13571                 if (register_bits & 0x00000001)
13572                     register_count++;
13573                 register_bits = register_bits >> 1;
13574               }
13575             start_address = u_regval -  \
13576               (4 * (bit (thumb_insn_r->arm_insn, 8) + register_count));
13577             thumb_insn_r->mem_rec_count = register_count;
13578             while (register_count)
13579               {
13580                 record_buf_mem[(register_count * 2) - 1] = start_address;
13581                 record_buf_mem[(register_count * 2) - 2] = 4;
13582                 start_address = start_address + 4;
13583                 register_count--;
13584               }
13585             record_buf[0] = ARM_SP_REGNUM;
13586             thumb_insn_r->reg_rec_count = 1;
13587             break;
13588           case 10:
13589             /* REV, REV16, REVSH */
13590             record_buf[0] = bits (thumb_insn_r->arm_insn, 0, 2);
13591             thumb_insn_r->reg_rec_count = 1;
13592             break;
13593           case 12: /* fall through  */
13594           case 13:
13595             /* POP.  */
13596             register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13597             while (register_bits)
13598               {
13599                 if (register_bits & 0x00000001)
13600                     record_buf[index++] = register_count;
13601                 register_bits = register_bits >> 1;
13602                 register_count++;
13603               }
13604             record_buf[index++] = ARM_PS_REGNUM;
13605             record_buf[index++] = ARM_SP_REGNUM;
13606             thumb_insn_r->reg_rec_count = index;
13607             break;
13608           case 0xe:
13609             /* BKPT insn.  */
13610             /* Handle enhanced software breakpoint insn, BKPT.  */
13611             /* CPSR is changed to be executed in ARM state,  disabling normal
13612                interrupts, entering abort mode.  */
13613             /* According to high vector configuration PC is set.  */
13614             /* User hits breakpoint and type reverse, in that case, we need to go back with
13615                previous CPSR and Program Counter.  */
13616             record_buf[0] = ARM_PS_REGNUM;
13617             record_buf[1] = ARM_LR_REGNUM;
13618             thumb_insn_r->reg_rec_count = 2;
13619             /* We need to save SPSR value, which is not yet done.  */
13620             gdb_printf (gdb_stderr,
13621                           _("Process record does not support instruction "
13622                               "0x%0x at address %s.\n"),
13623                           thumb_insn_r->arm_insn,
13624                           paddress (thumb_insn_r->gdbarch,
13625                                         thumb_insn_r->this_addr));
13626             return -1;
13627 
13628           case 0xf:
13629             /* If-Then, and hints */
13630             break;
13631           default:
13632             return -1;
13633           };
13634     }
13635 
13636   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13637   MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13638                record_buf_mem);
13639 
13640   return 0;
13641 }
13642 
13643 /* Handling opcode 110 insns.  */
13644 
13645 static int
thumb_record_ldm_stm_swi(arm_insn_decode_record * thumb_insn_r)13646 thumb_record_ldm_stm_swi (arm_insn_decode_record *thumb_insn_r)
13647 {
13648   arm_gdbarch_tdep *tdep
13649     = gdbarch_tdep<arm_gdbarch_tdep>  (thumb_insn_r->gdbarch);
13650   struct regcache *reg_cache = thumb_insn_r->regcache;
13651 
13652   uint32_t ret = 0; /* function return value: -1:record failure ;  0:success  */
13653   uint32_t reg_src1 = 0;
13654   uint32_t opcode1 = 0, opcode2 = 0, register_bits = 0, register_count = 0;
13655   uint32_t index = 0, start_address = 0;
13656   uint32_t record_buf[24], record_buf_mem[48];
13657 
13658   ULONGEST u_regval = 0;
13659 
13660   opcode1 = bits (thumb_insn_r->arm_insn, 8, 12);
13661   opcode2 = bits (thumb_insn_r->arm_insn, 11, 12);
13662 
13663   if (1 == opcode2)
13664     {
13665 
13666       /* LDMIA.  */
13667       register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13668       /* Get Rn.  */
13669       reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13670       while (register_bits)
13671           {
13672             if (register_bits & 0x00000001)
13673               record_buf[index++] = register_count;
13674             register_bits = register_bits >> 1;
13675             register_count++;
13676           }
13677       record_buf[index++] = reg_src1;
13678       thumb_insn_r->reg_rec_count = index;
13679     }
13680   else if (0 == opcode2)
13681     {
13682       /* It handles both STMIA.  */
13683       register_bits = bits (thumb_insn_r->arm_insn, 0, 7);
13684       /* Get Rn.  */
13685       reg_src1 = bits (thumb_insn_r->arm_insn, 8, 10);
13686       regcache_raw_read_unsigned (reg_cache, reg_src1, &u_regval);
13687       while (register_bits)
13688           {
13689             if (register_bits & 0x00000001)
13690               register_count++;
13691             register_bits = register_bits >> 1;
13692           }
13693       start_address = u_regval;
13694       thumb_insn_r->mem_rec_count = register_count;
13695       while (register_count)
13696           {
13697             record_buf_mem[(register_count * 2) - 1] = start_address;
13698             record_buf_mem[(register_count * 2) - 2] = 4;
13699             start_address = start_address + 4;
13700             register_count--;
13701           }
13702     }
13703   else if (0x1F == opcode1)
13704     {
13705           /* Handle arm syscall insn.  */
13706           if (tdep->arm_syscall_record != NULL)
13707             {
13708               regcache_raw_read_unsigned (reg_cache, 7, &u_regval);
13709               ret = tdep->arm_syscall_record (reg_cache, u_regval);
13710             }
13711           else
13712             {
13713               gdb_printf (gdb_stderr, _("no syscall record support\n"));
13714               return -1;
13715             }
13716     }
13717 
13718   /* B (1), conditional branch is automatically taken care in process_record,
13719     as PC is saved there.  */
13720 
13721   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13722   MEM_ALLOC (thumb_insn_r->arm_mems, thumb_insn_r->mem_rec_count,
13723                record_buf_mem);
13724 
13725   return ret;
13726 }
13727 
13728 /* Handling opcode 111 insns.  */
13729 
13730 static int
thumb_record_branch(arm_insn_decode_record * thumb_insn_r)13731 thumb_record_branch (arm_insn_decode_record *thumb_insn_r)
13732 {
13733   uint32_t record_buf[8];
13734   uint32_t bits_h = 0;
13735 
13736   bits_h = bits (thumb_insn_r->arm_insn, 11, 12);
13737 
13738   if (2 == bits_h || 3 == bits_h)
13739     {
13740       /* BL */
13741       record_buf[0] = ARM_LR_REGNUM;
13742       thumb_insn_r->reg_rec_count = 1;
13743     }
13744   else if (1 == bits_h)
13745     {
13746       /* BLX(1). */
13747       record_buf[0] = ARM_PS_REGNUM;
13748       record_buf[1] = ARM_LR_REGNUM;
13749       thumb_insn_r->reg_rec_count = 2;
13750     }
13751 
13752   /* B(2) is automatically taken care in process_record, as PC is
13753      saved there.  */
13754 
13755   REG_ALLOC (thumb_insn_r->arm_regs, thumb_insn_r->reg_rec_count, record_buf);
13756 
13757   return 0;
13758 }
13759 
13760 /* Handler for thumb2 load/store multiple instructions.  */
13761 
13762 static int
thumb2_record_ld_st_multiple(arm_insn_decode_record * thumb2_insn_r)13763 thumb2_record_ld_st_multiple (arm_insn_decode_record *thumb2_insn_r)
13764 {
13765   struct regcache *reg_cache = thumb2_insn_r->regcache;
13766 
13767   uint32_t reg_rn, op;
13768   uint32_t register_bits = 0, register_count = 0;
13769   uint32_t index = 0, start_address = 0;
13770   uint32_t record_buf[24], record_buf_mem[48];
13771 
13772   ULONGEST u_regval = 0;
13773 
13774   reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13775   op = bits (thumb2_insn_r->arm_insn, 23, 24);
13776 
13777   if (0 == op || 3 == op)
13778     {
13779       if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13780           {
13781             /* Handle RFE instruction.  */
13782             record_buf[0] = ARM_PS_REGNUM;
13783             thumb2_insn_r->reg_rec_count = 1;
13784           }
13785       else
13786           {
13787             /* Handle SRS instruction after reading banked SP.  */
13788             return arm_record_unsupported_insn (thumb2_insn_r);
13789           }
13790     }
13791   else if (1 == op || 2 == op)
13792     {
13793       if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13794           {
13795             /* Handle LDM/LDMIA/LDMFD and LDMDB/LDMEA instructions.  */
13796             register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13797             while (register_bits)
13798               {
13799                 if (register_bits & 0x00000001)
13800                     record_buf[index++] = register_count;
13801 
13802                 register_count++;
13803                 register_bits = register_bits >> 1;
13804               }
13805             record_buf[index++] = reg_rn;
13806             record_buf[index++] = ARM_PS_REGNUM;
13807             thumb2_insn_r->reg_rec_count = index;
13808           }
13809       else
13810           {
13811             /* Handle STM/STMIA/STMEA and STMDB/STMFD.  */
13812             register_bits = bits (thumb2_insn_r->arm_insn, 0, 15);
13813             regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
13814             while (register_bits)
13815               {
13816                 if (register_bits & 0x00000001)
13817                     register_count++;
13818 
13819                 register_bits = register_bits >> 1;
13820               }
13821 
13822             if (1 == op)
13823               {
13824                 /* Start address calculation for LDMDB/LDMEA.  */
13825                 start_address = u_regval;
13826               }
13827             else if (2 == op)
13828               {
13829                 /* Start address calculation for LDMDB/LDMEA.  */
13830                 start_address = u_regval - register_count * 4;
13831               }
13832 
13833             thumb2_insn_r->mem_rec_count = register_count;
13834             while (register_count)
13835               {
13836                 record_buf_mem[register_count * 2 - 1] = start_address;
13837                 record_buf_mem[register_count * 2 - 2] = 4;
13838                 start_address = start_address + 4;
13839                 register_count--;
13840               }
13841             record_buf[0] = reg_rn;
13842             record_buf[1] = ARM_PS_REGNUM;
13843             thumb2_insn_r->reg_rec_count = 2;
13844           }
13845     }
13846 
13847   MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13848               record_buf_mem);
13849   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13850               record_buf);
13851   return ARM_RECORD_SUCCESS;
13852 }
13853 
13854 /* Handler for thumb2 load/store (dual/exclusive) and table branch
13855    instructions.  */
13856 
13857 static int
thumb2_record_ld_st_dual_ex_tbb(arm_insn_decode_record * thumb2_insn_r)13858 thumb2_record_ld_st_dual_ex_tbb (arm_insn_decode_record *thumb2_insn_r)
13859 {
13860   struct regcache *reg_cache = thumb2_insn_r->regcache;
13861 
13862   uint32_t reg_rd, reg_rn, offset_imm;
13863   uint32_t reg_dest1, reg_dest2;
13864   uint32_t address, offset_addr;
13865   uint32_t record_buf[8], record_buf_mem[8];
13866   uint32_t op1, op2, op3;
13867 
13868   ULONGEST u_regval[2];
13869 
13870   op1 = bits (thumb2_insn_r->arm_insn, 23, 24);
13871   op2 = bits (thumb2_insn_r->arm_insn, 20, 21);
13872   op3 = bits (thumb2_insn_r->arm_insn, 4, 7);
13873 
13874   if (bit (thumb2_insn_r->arm_insn, INSN_S_L_BIT_NUM))
13875     {
13876       if(!(1 == op1 && 1 == op2 && (0 == op3 || 1 == op3)))
13877           {
13878             reg_dest1 = bits (thumb2_insn_r->arm_insn, 12, 15);
13879             record_buf[0] = reg_dest1;
13880             record_buf[1] = ARM_PS_REGNUM;
13881             thumb2_insn_r->reg_rec_count = 2;
13882           }
13883 
13884       if (3 == op2 || (op1 & 2) || (1 == op1 && 1 == op2 && 7 == op3))
13885           {
13886             reg_dest2 = bits (thumb2_insn_r->arm_insn, 8, 11);
13887             record_buf[2] = reg_dest2;
13888             thumb2_insn_r->reg_rec_count = 3;
13889           }
13890     }
13891   else
13892     {
13893       reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
13894       regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
13895 
13896       if (0 == op1 && 0 == op2)
13897           {
13898             /* Handle STREX.  */
13899             offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13900             address = u_regval[0] + (offset_imm * 4);
13901             record_buf_mem[0] = 4;
13902             record_buf_mem[1] = address;
13903             thumb2_insn_r->mem_rec_count = 1;
13904             reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13905             record_buf[0] = reg_rd;
13906             thumb2_insn_r->reg_rec_count = 1;
13907           }
13908       else if (1 == op1 && 0 == op2)
13909           {
13910             reg_rd = bits (thumb2_insn_r->arm_insn, 0, 3);
13911             record_buf[0] = reg_rd;
13912             thumb2_insn_r->reg_rec_count = 1;
13913             address = u_regval[0];
13914             record_buf_mem[1] = address;
13915 
13916             if (4 == op3)
13917               {
13918                 /* Handle STREXB.  */
13919                 record_buf_mem[0] = 1;
13920                 thumb2_insn_r->mem_rec_count = 1;
13921               }
13922             else if (5 == op3)
13923               {
13924                 /* Handle STREXH.  */
13925                 record_buf_mem[0] = 2 ;
13926                 thumb2_insn_r->mem_rec_count = 1;
13927               }
13928             else if (7 == op3)
13929               {
13930                 /* Handle STREXD.  */
13931                 address = u_regval[0];
13932                 record_buf_mem[0] = 4;
13933                 record_buf_mem[2] = 4;
13934                 record_buf_mem[3] = address + 4;
13935                 thumb2_insn_r->mem_rec_count = 2;
13936               }
13937           }
13938       else
13939           {
13940             offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
13941 
13942             if (bit (thumb2_insn_r->arm_insn, 24))
13943               {
13944                 if (bit (thumb2_insn_r->arm_insn, 23))
13945                     offset_addr = u_regval[0] + (offset_imm * 4);
13946                 else
13947                     offset_addr = u_regval[0] - (offset_imm * 4);
13948 
13949                 address = offset_addr;
13950               }
13951             else
13952               address = u_regval[0];
13953 
13954             record_buf_mem[0] = 4;
13955             record_buf_mem[1] = address;
13956             record_buf_mem[2] = 4;
13957             record_buf_mem[3] = address + 4;
13958             thumb2_insn_r->mem_rec_count = 2;
13959             record_buf[0] = reg_rn;
13960             thumb2_insn_r->reg_rec_count = 1;
13961           }
13962     }
13963 
13964   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13965               record_buf);
13966   MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
13967               record_buf_mem);
13968   return ARM_RECORD_SUCCESS;
13969 }
13970 
13971 /* Handler for thumb2 data processing (shift register and modified immediate)
13972    instructions.  */
13973 
13974 static int
thumb2_record_data_proc_sreg_mimm(arm_insn_decode_record * thumb2_insn_r)13975 thumb2_record_data_proc_sreg_mimm (arm_insn_decode_record *thumb2_insn_r)
13976 {
13977   uint32_t reg_rd, op;
13978   uint32_t record_buf[8];
13979 
13980   op = bits (thumb2_insn_r->arm_insn, 21, 24);
13981   reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
13982 
13983   if ((0 == op || 4 == op || 8 == op || 13 == op) && 15 == reg_rd)
13984     {
13985       record_buf[0] = ARM_PS_REGNUM;
13986       thumb2_insn_r->reg_rec_count = 1;
13987     }
13988   else
13989     {
13990       record_buf[0] = reg_rd;
13991       record_buf[1] = ARM_PS_REGNUM;
13992       thumb2_insn_r->reg_rec_count = 2;
13993     }
13994 
13995   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
13996               record_buf);
13997   return ARM_RECORD_SUCCESS;
13998 }
13999 
14000 /* Generic handler for thumb2 instructions which effect destination and PS
14001    registers.  */
14002 
14003 static int
thumb2_record_ps_dest_generic(arm_insn_decode_record * thumb2_insn_r)14004 thumb2_record_ps_dest_generic (arm_insn_decode_record *thumb2_insn_r)
14005 {
14006   uint32_t reg_rd;
14007   uint32_t record_buf[8];
14008 
14009   reg_rd = bits (thumb2_insn_r->arm_insn, 8, 11);
14010 
14011   record_buf[0] = reg_rd;
14012   record_buf[1] = ARM_PS_REGNUM;
14013   thumb2_insn_r->reg_rec_count = 2;
14014 
14015   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14016               record_buf);
14017   return ARM_RECORD_SUCCESS;
14018 }
14019 
14020 /* Handler for thumb2 branch and miscellaneous control instructions.  */
14021 
14022 static int
thumb2_record_branch_misc_cntrl(arm_insn_decode_record * thumb2_insn_r)14023 thumb2_record_branch_misc_cntrl (arm_insn_decode_record *thumb2_insn_r)
14024 {
14025   uint32_t op, op1, op2;
14026   uint32_t record_buf[8];
14027 
14028   op = bits (thumb2_insn_r->arm_insn, 20, 26);
14029   op1 = bits (thumb2_insn_r->arm_insn, 12, 14);
14030   op2 = bits (thumb2_insn_r->arm_insn, 8, 11);
14031 
14032   /* Handle MSR insn.  */
14033   if (!(op1 & 0x2) && 0x38 == op)
14034     {
14035       if (!(op2 & 0x3))
14036           {
14037             /* CPSR is going to be changed.  */
14038             record_buf[0] = ARM_PS_REGNUM;
14039             thumb2_insn_r->reg_rec_count = 1;
14040           }
14041       else
14042           {
14043             arm_record_unsupported_insn(thumb2_insn_r);
14044             return -1;
14045           }
14046     }
14047   else if (4 == (op1 & 0x5) || 5 == (op1 & 0x5))
14048     {
14049       /* BLX.  */
14050       record_buf[0] = ARM_PS_REGNUM;
14051       record_buf[1] = ARM_LR_REGNUM;
14052       thumb2_insn_r->reg_rec_count = 2;
14053     }
14054 
14055   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14056               record_buf);
14057   return ARM_RECORD_SUCCESS;
14058 }
14059 
14060 /* Handler for thumb2 store single data item instructions.  */
14061 
14062 static int
thumb2_record_str_single_data(arm_insn_decode_record * thumb2_insn_r)14063 thumb2_record_str_single_data (arm_insn_decode_record *thumb2_insn_r)
14064 {
14065   struct regcache *reg_cache = thumb2_insn_r->regcache;
14066 
14067   uint32_t reg_rn, reg_rm, offset_imm, shift_imm;
14068   uint32_t address, offset_addr;
14069   uint32_t record_buf[8], record_buf_mem[8];
14070   uint32_t op1, op2;
14071 
14072   ULONGEST u_regval[2];
14073 
14074   op1 = bits (thumb2_insn_r->arm_insn, 21, 23);
14075   op2 = bits (thumb2_insn_r->arm_insn, 6, 11);
14076   reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14077   regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval[0]);
14078 
14079   if (bit (thumb2_insn_r->arm_insn, 23))
14080     {
14081       /* T2 encoding.  */
14082       offset_imm = bits (thumb2_insn_r->arm_insn, 0, 11);
14083       offset_addr = u_regval[0] + offset_imm;
14084       address = offset_addr;
14085     }
14086   else
14087     {
14088       /* T3 encoding.  */
14089       if ((0 == op1 || 1 == op1 || 2 == op1) && !(op2 & 0x20))
14090           {
14091             /* Handle STRB (register).  */
14092             reg_rm = bits (thumb2_insn_r->arm_insn, 0, 3);
14093             regcache_raw_read_unsigned (reg_cache, reg_rm, &u_regval[1]);
14094             shift_imm = bits (thumb2_insn_r->arm_insn, 4, 5);
14095             offset_addr = u_regval[1] << shift_imm;
14096             address = u_regval[0] + offset_addr;
14097           }
14098       else
14099           {
14100             offset_imm = bits (thumb2_insn_r->arm_insn, 0, 7);
14101             if (bit (thumb2_insn_r->arm_insn, 10))
14102               {
14103                 if (bit (thumb2_insn_r->arm_insn, 9))
14104                     offset_addr = u_regval[0] + offset_imm;
14105                 else
14106                     offset_addr = u_regval[0] - offset_imm;
14107 
14108                 address = offset_addr;
14109               }
14110             else
14111               address = u_regval[0];
14112           }
14113     }
14114 
14115   switch (op1)
14116     {
14117       /* Store byte instructions.  */
14118       case 4:
14119       case 0:
14120           record_buf_mem[0] = 1;
14121           break;
14122       /* Store half word instructions.  */
14123       case 1:
14124       case 5:
14125           record_buf_mem[0] = 2;
14126           break;
14127       /* Store word instructions.  */
14128       case 2:
14129       case 6:
14130           record_buf_mem[0] = 4;
14131           break;
14132 
14133       default:
14134           gdb_assert_not_reached ("no decoding pattern found");
14135           break;
14136     }
14137 
14138   record_buf_mem[1] = address;
14139   thumb2_insn_r->mem_rec_count = 1;
14140   record_buf[0] = reg_rn;
14141   thumb2_insn_r->reg_rec_count = 1;
14142 
14143   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14144               record_buf);
14145   MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14146               record_buf_mem);
14147   return ARM_RECORD_SUCCESS;
14148 }
14149 
14150 /* Handler for thumb2 load memory hints instructions.  */
14151 
14152 static int
thumb2_record_ld_mem_hints(arm_insn_decode_record * thumb2_insn_r)14153 thumb2_record_ld_mem_hints (arm_insn_decode_record *thumb2_insn_r)
14154 {
14155   uint32_t record_buf[8];
14156   uint32_t reg_rt, reg_rn;
14157 
14158   reg_rt = bits (thumb2_insn_r->arm_insn, 12, 15);
14159   reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14160 
14161   if (ARM_PC_REGNUM != reg_rt)
14162     {
14163       record_buf[0] = reg_rt;
14164       record_buf[1] = reg_rn;
14165       record_buf[2] = ARM_PS_REGNUM;
14166       thumb2_insn_r->reg_rec_count = 3;
14167 
14168       REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14169                     record_buf);
14170       return ARM_RECORD_SUCCESS;
14171     }
14172 
14173   return ARM_RECORD_FAILURE;
14174 }
14175 
14176 /* Handler for thumb2 load word instructions.  */
14177 
14178 static int
thumb2_record_ld_word(arm_insn_decode_record * thumb2_insn_r)14179 thumb2_record_ld_word (arm_insn_decode_record *thumb2_insn_r)
14180 {
14181   uint32_t record_buf[8];
14182 
14183   record_buf[0] = bits (thumb2_insn_r->arm_insn, 12, 15);
14184   record_buf[1] = ARM_PS_REGNUM;
14185   thumb2_insn_r->reg_rec_count = 2;
14186 
14187   if ((thumb2_insn_r->arm_insn & 0xfff00900) == 0xf8500900)
14188     {
14189       /* Detected LDR(immediate), T4, with write-back bit set.  Record Rn
14190            update.  */
14191       record_buf[2] = bits (thumb2_insn_r->arm_insn, 16, 19);
14192       thumb2_insn_r->reg_rec_count++;
14193     }
14194 
14195   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14196               record_buf);
14197   return ARM_RECORD_SUCCESS;
14198 }
14199 
14200 /* Handler for thumb2 long multiply, long multiply accumulate, and
14201    divide instructions.  */
14202 
14203 static int
thumb2_record_lmul_lmla_div(arm_insn_decode_record * thumb2_insn_r)14204 thumb2_record_lmul_lmla_div (arm_insn_decode_record *thumb2_insn_r)
14205 {
14206   uint32_t opcode1 = 0, opcode2 = 0;
14207   uint32_t record_buf[8];
14208 
14209   opcode1 = bits (thumb2_insn_r->arm_insn, 20, 22);
14210   opcode2 = bits (thumb2_insn_r->arm_insn, 4, 7);
14211 
14212   if (0 == opcode1 || 2 == opcode1 || (opcode1 >= 4 && opcode1 <= 6))
14213     {
14214       /* Handle SMULL, UMULL, SMULAL.  */
14215       /* Handle SMLAL(S), SMULL(S), UMLAL(S), UMULL(S).  */
14216       record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14217       record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14218       record_buf[2] = ARM_PS_REGNUM;
14219       thumb2_insn_r->reg_rec_count = 3;
14220     }
14221   else if (1 == opcode1 || 3 == opcode2)
14222     {
14223       /* Handle SDIV and UDIV.  */
14224       record_buf[0] = bits (thumb2_insn_r->arm_insn, 16, 19);
14225       record_buf[1] = bits (thumb2_insn_r->arm_insn, 12, 15);
14226       record_buf[2] = ARM_PS_REGNUM;
14227       thumb2_insn_r->reg_rec_count = 3;
14228     }
14229   else
14230     return ARM_RECORD_FAILURE;
14231 
14232   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14233               record_buf);
14234   return ARM_RECORD_SUCCESS;
14235 }
14236 
14237 /* Record handler for thumb32 coprocessor instructions.  */
14238 
14239 static int
thumb2_record_coproc_insn(arm_insn_decode_record * thumb2_insn_r)14240 thumb2_record_coproc_insn (arm_insn_decode_record *thumb2_insn_r)
14241 {
14242   if (bit (thumb2_insn_r->arm_insn, 25))
14243     return arm_record_coproc_data_proc (thumb2_insn_r);
14244   else
14245     return arm_record_asimd_vfp_coproc (thumb2_insn_r);
14246 }
14247 
14248 /* Record handler for advance SIMD structure load/store instructions.  */
14249 
14250 static int
thumb2_record_asimd_struct_ld_st(arm_insn_decode_record * thumb2_insn_r)14251 thumb2_record_asimd_struct_ld_st (arm_insn_decode_record *thumb2_insn_r)
14252 {
14253   struct regcache *reg_cache = thumb2_insn_r->regcache;
14254   uint32_t l_bit, a_bit, b_bits;
14255   uint32_t record_buf[128], record_buf_mem[128];
14256   uint32_t reg_rn, reg_vd, address, f_elem;
14257   uint32_t index_r = 0, index_e = 0, bf_regs = 0, index_m = 0, loop_t = 0;
14258   uint8_t f_ebytes;
14259 
14260   l_bit = bit (thumb2_insn_r->arm_insn, 21);
14261   a_bit = bit (thumb2_insn_r->arm_insn, 23);
14262   b_bits = bits (thumb2_insn_r->arm_insn, 8, 11);
14263   reg_rn = bits (thumb2_insn_r->arm_insn, 16, 19);
14264   reg_vd = bits (thumb2_insn_r->arm_insn, 12, 15);
14265   reg_vd = (bit (thumb2_insn_r->arm_insn, 22) << 4) | reg_vd;
14266   f_ebytes = (1 << bits (thumb2_insn_r->arm_insn, 6, 7));
14267   f_elem = 8 / f_ebytes;
14268 
14269   if (!l_bit)
14270     {
14271       ULONGEST u_regval = 0;
14272       regcache_raw_read_unsigned (reg_cache, reg_rn, &u_regval);
14273       address = u_regval;
14274 
14275       if (!a_bit)
14276           {
14277             /* Handle VST1.  */
14278             if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14279               {
14280                 if (b_bits == 0x07)
14281                     bf_regs = 1;
14282                 else if (b_bits == 0x0a)
14283                     bf_regs = 2;
14284                 else if (b_bits == 0x06)
14285                     bf_regs = 3;
14286                 else if (b_bits == 0x02)
14287                     bf_regs = 4;
14288                 else
14289                     bf_regs = 0;
14290 
14291                 for (index_r = 0; index_r < bf_regs; index_r++)
14292                     {
14293                       for (index_e = 0; index_e < f_elem; index_e++)
14294                         {
14295                           record_buf_mem[index_m++] = f_ebytes;
14296                           record_buf_mem[index_m++] = address;
14297                           address = address + f_ebytes;
14298                           thumb2_insn_r->mem_rec_count += 1;
14299                         }
14300                     }
14301               }
14302             /* Handle VST2.  */
14303             else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14304               {
14305                 if (b_bits == 0x09 || b_bits == 0x08)
14306                     bf_regs = 1;
14307                 else if (b_bits == 0x03)
14308                     bf_regs = 2;
14309                 else
14310                     bf_regs = 0;
14311 
14312                 for (index_r = 0; index_r < bf_regs; index_r++)
14313                     for (index_e = 0; index_e < f_elem; index_e++)
14314                       {
14315                         for (loop_t = 0; loop_t < 2; loop_t++)
14316                           {
14317                               record_buf_mem[index_m++] = f_ebytes;
14318                               record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14319                               thumb2_insn_r->mem_rec_count += 1;
14320                           }
14321                         address = address + (2 * f_ebytes);
14322                       }
14323               }
14324             /* Handle VST3.  */
14325             else if ((b_bits & 0x0e) == 0x04)
14326               {
14327                 for (index_e = 0; index_e < f_elem; index_e++)
14328                     {
14329                       for (loop_t = 0; loop_t < 3; loop_t++)
14330                         {
14331                           record_buf_mem[index_m++] = f_ebytes;
14332                           record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14333                           thumb2_insn_r->mem_rec_count += 1;
14334                         }
14335                       address = address + (3 * f_ebytes);
14336                     }
14337               }
14338             /* Handle VST4.  */
14339             else if (!(b_bits & 0x0e))
14340               {
14341                 for (index_e = 0; index_e < f_elem; index_e++)
14342                     {
14343                       for (loop_t = 0; loop_t < 4; loop_t++)
14344                         {
14345                           record_buf_mem[index_m++] = f_ebytes;
14346                           record_buf_mem[index_m++] = address + (loop_t * f_ebytes);
14347                           thumb2_insn_r->mem_rec_count += 1;
14348                         }
14349                       address = address + (4 * f_ebytes);
14350                     }
14351               }
14352           }
14353       else
14354           {
14355             uint8_t bft_size = bits (thumb2_insn_r->arm_insn, 10, 11);
14356 
14357             if (bft_size == 0x00)
14358               f_ebytes = 1;
14359             else if (bft_size == 0x01)
14360               f_ebytes = 2;
14361             else if (bft_size == 0x02)
14362               f_ebytes = 4;
14363             else
14364               f_ebytes = 0;
14365 
14366             /* Handle VST1.  */
14367             if (!(b_bits & 0x0b) || b_bits == 0x08)
14368               thumb2_insn_r->mem_rec_count = 1;
14369             /* Handle VST2.  */
14370             else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09)
14371               thumb2_insn_r->mem_rec_count = 2;
14372             /* Handle VST3.  */
14373             else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a)
14374               thumb2_insn_r->mem_rec_count = 3;
14375             /* Handle VST4.  */
14376             else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b)
14377               thumb2_insn_r->mem_rec_count = 4;
14378 
14379             for (index_m = 0; index_m < thumb2_insn_r->mem_rec_count; index_m++)
14380               {
14381                 record_buf_mem[index_m] = f_ebytes;
14382                 record_buf_mem[index_m] = address + (index_m * f_ebytes);
14383               }
14384           }
14385     }
14386   else
14387     {
14388       if (!a_bit)
14389           {
14390             /* Handle VLD1.  */
14391             if (b_bits == 0x02 || b_bits == 0x0a || (b_bits & 0x0e) == 0x06)
14392               thumb2_insn_r->reg_rec_count = 1;
14393             /* Handle VLD2.  */
14394             else if (b_bits == 0x03 || (b_bits & 0x0e) == 0x08)
14395               thumb2_insn_r->reg_rec_count = 2;
14396             /* Handle VLD3.  */
14397             else if ((b_bits & 0x0e) == 0x04)
14398               thumb2_insn_r->reg_rec_count = 3;
14399             /* Handle VLD4.  */
14400             else if (!(b_bits & 0x0e))
14401               thumb2_insn_r->reg_rec_count = 4;
14402           }
14403       else
14404           {
14405             /* Handle VLD1.  */
14406             if (!(b_bits & 0x0b) || b_bits == 0x08 || b_bits == 0x0c)
14407               thumb2_insn_r->reg_rec_count = 1;
14408             /* Handle VLD2.  */
14409             else if ((b_bits & 0x0b) == 0x01 || b_bits == 0x09 || b_bits == 0x0d)
14410               thumb2_insn_r->reg_rec_count = 2;
14411             /* Handle VLD3.  */
14412             else if ((b_bits & 0x0b) == 0x02 || b_bits == 0x0a || b_bits == 0x0e)
14413               thumb2_insn_r->reg_rec_count = 3;
14414             /* Handle VLD4.  */
14415             else if ((b_bits & 0x0b) == 0x03 || b_bits == 0x0b || b_bits == 0x0f)
14416               thumb2_insn_r->reg_rec_count = 4;
14417 
14418             for (index_r = 0; index_r < thumb2_insn_r->reg_rec_count; index_r++)
14419               record_buf[index_r] = reg_vd + ARM_D0_REGNUM + index_r;
14420           }
14421     }
14422 
14423   if (bits (thumb2_insn_r->arm_insn, 0, 3) != 15)
14424     {
14425       record_buf[index_r] = reg_rn;
14426       thumb2_insn_r->reg_rec_count += 1;
14427     }
14428 
14429   REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count,
14430               record_buf);
14431   MEM_ALLOC (thumb2_insn_r->arm_mems, thumb2_insn_r->mem_rec_count,
14432               record_buf_mem);
14433   return 0;
14434 }
14435 
14436 /* Decodes thumb2 instruction type and invokes its record handler.  */
14437 
14438 static unsigned int
thumb2_record_decode_insn_handler(arm_insn_decode_record * thumb2_insn_r)14439 thumb2_record_decode_insn_handler (arm_insn_decode_record *thumb2_insn_r)
14440 {
14441   uint32_t op, op1, op2;
14442 
14443   op = bit (thumb2_insn_r->arm_insn, 15);
14444   op1 = bits (thumb2_insn_r->arm_insn, 27, 28);
14445   op2 = bits (thumb2_insn_r->arm_insn, 20, 26);
14446 
14447   if (op1 == 0x01)
14448     {
14449       if (!(op2 & 0x64 ))
14450           {
14451             /* Load/store multiple instruction.  */
14452             return thumb2_record_ld_st_multiple (thumb2_insn_r);
14453           }
14454       else if ((op2 & 0x64) == 0x4)
14455           {
14456             /* Load/store (dual/exclusive) and table branch instruction.  */
14457             return thumb2_record_ld_st_dual_ex_tbb (thumb2_insn_r);
14458           }
14459       else if ((op2 & 0x60) == 0x20)
14460           {
14461             /* Data-processing (shifted register).  */
14462             return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14463           }
14464       else if (op2 & 0x40)
14465           {
14466             /* Co-processor instructions.  */
14467             return thumb2_record_coproc_insn (thumb2_insn_r);
14468           }
14469     }
14470   else if (op1 == 0x02)
14471     {
14472       if (op)
14473           {
14474             /* Branches and miscellaneous control instructions.  */
14475             return thumb2_record_branch_misc_cntrl (thumb2_insn_r);
14476           }
14477       else if (op2 & 0x20)
14478           {
14479             /* Data-processing (plain binary immediate) instruction.  */
14480             return thumb2_record_ps_dest_generic (thumb2_insn_r);
14481           }
14482       else
14483           {
14484             /* Data-processing (modified immediate).  */
14485             return thumb2_record_data_proc_sreg_mimm (thumb2_insn_r);
14486           }
14487     }
14488   else if (op1 == 0x03)
14489     {
14490       if (!(op2 & 0x71 ))
14491           {
14492             /* Store single data item.  */
14493             return thumb2_record_str_single_data (thumb2_insn_r);
14494           }
14495       else if (!((op2 & 0x71) ^ 0x10))
14496           {
14497             /* Advanced SIMD or structure load/store instructions.  */
14498             return thumb2_record_asimd_struct_ld_st (thumb2_insn_r);
14499           }
14500       else if (!((op2 & 0x67) ^ 0x01))
14501           {
14502             /* Load byte, memory hints instruction.  */
14503             return thumb2_record_ld_mem_hints (thumb2_insn_r);
14504           }
14505       else if (!((op2 & 0x67) ^ 0x03))
14506           {
14507             /* Load halfword, memory hints instruction.  */
14508             return thumb2_record_ld_mem_hints (thumb2_insn_r);
14509           }
14510       else if (!((op2 & 0x67) ^ 0x05))
14511           {
14512             /* Load word instruction.  */
14513             return thumb2_record_ld_word (thumb2_insn_r);
14514           }
14515       else if (!((op2 & 0x70) ^ 0x20))
14516           {
14517             /* Data-processing (register) instruction.  */
14518             return thumb2_record_ps_dest_generic (thumb2_insn_r);
14519           }
14520       else if (!((op2 & 0x78) ^ 0x30))
14521           {
14522             /* Multiply, multiply accumulate, abs diff instruction.  */
14523             return thumb2_record_ps_dest_generic (thumb2_insn_r);
14524           }
14525       else if (!((op2 & 0x78) ^ 0x38))
14526           {
14527             /* Long multiply, long multiply accumulate, and divide.  */
14528             return thumb2_record_lmul_lmla_div (thumb2_insn_r);
14529           }
14530       else if (op2 & 0x40)
14531           {
14532             /* Co-processor instructions.  */
14533             return thumb2_record_coproc_insn (thumb2_insn_r);
14534           }
14535    }
14536 
14537   return -1;
14538 }
14539 
14540 namespace {
14541 /* Abstract instruction reader.  */
14542 
14543 class abstract_instruction_reader
14544 {
14545 public:
14546   /* Read one instruction of size LEN from address MEMADDR and using
14547      BYTE_ORDER endianness.  */
14548 
14549   virtual ULONGEST read (CORE_ADDR memaddr, const size_t len,
14550                                enum bfd_endian byte_order) = 0;
14551 };
14552 
14553 /* Instruction reader from real target.  */
14554 
14555 class instruction_reader : public abstract_instruction_reader
14556 {
14557  public:
read(CORE_ADDR memaddr,const size_t len,enum bfd_endian byte_order)14558   ULONGEST read (CORE_ADDR memaddr, const size_t len,
14559                      enum bfd_endian byte_order) override
14560   {
14561     return read_code_unsigned_integer (memaddr, len, byte_order);
14562   }
14563 };
14564 
14565 } // namespace
14566 
14567 typedef int (*sti_arm_hdl_fp_t) (arm_insn_decode_record*);
14568 
14569 /* Decode arm/thumb insn depending on condition cods and opcodes; and
14570    dispatch it.  */
14571 
14572 static int
decode_insn(abstract_instruction_reader & reader,arm_insn_decode_record * arm_record,record_type_t record_type,uint32_t insn_size)14573 decode_insn (abstract_instruction_reader &reader,
14574                arm_insn_decode_record *arm_record,
14575                record_type_t record_type, uint32_t insn_size)
14576 {
14577 
14578   /* (Starting from numerical 0); bits 25, 26, 27 decodes type of arm
14579      instruction.  */
14580   static const sti_arm_hdl_fp_t arm_handle_insn[8] =
14581   {
14582     arm_record_data_proc_misc_ld_str,   /* 000.  */
14583     arm_record_data_proc_imm,           /* 001.  */
14584     arm_record_ld_st_imm_offset,        /* 010.  */
14585     arm_record_ld_st_reg_offset,        /* 011.  */
14586     arm_record_ld_st_multiple,          /* 100.  */
14587     arm_record_b_bl,                    /* 101.  */
14588     arm_record_asimd_vfp_coproc,        /* 110.  */
14589     arm_record_coproc_data_proc         /* 111.  */
14590   };
14591 
14592   /* (Starting from numerical 0); bits 13,14,15 decodes type of thumb
14593      instruction.  */
14594   static const sti_arm_hdl_fp_t thumb_handle_insn[8] =
14595   { \
14596     thumb_record_shift_add_sub,        /* 000.  */
14597     thumb_record_add_sub_cmp_mov,      /* 001.  */
14598     thumb_record_ld_st_reg_offset,     /* 010.  */
14599     thumb_record_ld_st_imm_offset,     /* 011.  */
14600     thumb_record_ld_st_stack,          /* 100.  */
14601     thumb_record_misc,                 /* 101.  */
14602     thumb_record_ldm_stm_swi,          /* 110.  */
14603     thumb_record_branch                /* 111.  */
14604   };
14605 
14606   uint32_t ret = 0;    /* return value: negative:failure   0:success.  */
14607   uint32_t insn_id = 0;
14608   enum bfd_endian code_endian
14609     = gdbarch_byte_order_for_code (arm_record->gdbarch);
14610   arm_record->arm_insn
14611     = reader.read (arm_record->this_addr, insn_size, code_endian);
14612 
14613   if (ARM_RECORD == record_type)
14614     {
14615       arm_record->cond = bits (arm_record->arm_insn, 28, 31);
14616       insn_id = bits (arm_record->arm_insn, 25, 27);
14617 
14618       if (arm_record->cond == 0xf)
14619           ret = arm_record_extension_space (arm_record);
14620       else
14621           {
14622             /* If this insn has fallen into extension space
14623                then we need not decode it anymore.  */
14624             ret = arm_handle_insn[insn_id] (arm_record);
14625           }
14626       if (ret != ARM_RECORD_SUCCESS)
14627           {
14628             arm_record_unsupported_insn (arm_record);
14629             ret = -1;
14630           }
14631     }
14632   else if (THUMB_RECORD == record_type)
14633     {
14634       /* As thumb does not have condition codes, we set negative.  */
14635       arm_record->cond = -1;
14636       insn_id = bits (arm_record->arm_insn, 13, 15);
14637       ret = thumb_handle_insn[insn_id] (arm_record);
14638       if (ret != ARM_RECORD_SUCCESS)
14639           {
14640             arm_record_unsupported_insn (arm_record);
14641             ret = -1;
14642           }
14643     }
14644   else if (THUMB2_RECORD == record_type)
14645     {
14646       /* As thumb does not have condition codes, we set negative.  */
14647       arm_record->cond = -1;
14648 
14649       /* Swap first half of 32bit thumb instruction with second half.  */
14650       arm_record->arm_insn
14651           = (arm_record->arm_insn >> 16) | (arm_record->arm_insn << 16);
14652 
14653       ret = thumb2_record_decode_insn_handler (arm_record);
14654 
14655       if (ret != ARM_RECORD_SUCCESS)
14656           {
14657             arm_record_unsupported_insn (arm_record);
14658             ret = -1;
14659           }
14660     }
14661   else
14662     {
14663       /* Throw assertion.  */
14664       gdb_assert_not_reached ("not a valid instruction, could not decode");
14665     }
14666 
14667   return ret;
14668 }
14669 
14670 #if GDB_SELF_TEST
14671 namespace selftests {
14672 
14673 /* Instruction reader class for selftests.
14674 
14675    For 16-bit Thumb instructions, an array of uint16_t should be used.
14676 
14677    For 32-bit Thumb instructions and regular 32-bit Arm instructions, an array
14678    of uint32_t should be used.  */
14679 
14680 template<typename T>
14681 class instruction_reader_selftest : public abstract_instruction_reader
14682 {
14683 public:
14684   template<size_t SIZE>
instruction_reader_selftest(const T (& insns)[SIZE])14685   instruction_reader_selftest (const T (&insns)[SIZE])
14686     : m_insns (insns), m_insns_size (SIZE)
14687   {}
14688 
read(CORE_ADDR memaddr,const size_t length,enum bfd_endian byte_order)14689   ULONGEST read (CORE_ADDR memaddr, const size_t length,
14690                      enum bfd_endian byte_order) override
14691   {
14692     SELF_CHECK (length == sizeof (T));
14693     SELF_CHECK (memaddr % sizeof (T) == 0);
14694     SELF_CHECK ((memaddr / sizeof (T)) < m_insns_size);
14695 
14696     return m_insns[memaddr / sizeof (T)];
14697   }
14698 
14699 private:
14700   const T *m_insns;
14701   const size_t m_insns_size;
14702 };
14703 
14704 static void
arm_record_test(void)14705 arm_record_test (void)
14706 {
14707   struct gdbarch_info info;
14708   info.bfd_arch_info = bfd_scan_arch ("arm");
14709 
14710   struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14711 
14712   SELF_CHECK (gdbarch != NULL);
14713 
14714   /* 16-bit Thumb instructions.  */
14715   {
14716     arm_insn_decode_record arm_record;
14717 
14718     memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14719     arm_record.gdbarch = gdbarch;
14720 
14721     /* Use the endian-free representation of the instructions here.  The test
14722        will handle endianness conversions.  */
14723     static const uint16_t insns[] = {
14724       /* db b2      uxtb      r3, r3 */
14725       0xb2db,
14726       /* cd 58      ldr       r5, [r1, r3] */
14727       0x58cd,
14728     };
14729 
14730     instruction_reader_selftest<uint16_t> reader (insns);
14731     int ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14732                                  THUMB_INSN_SIZE_BYTES);
14733 
14734     SELF_CHECK (ret == 0);
14735     SELF_CHECK (arm_record.mem_rec_count == 0);
14736     SELF_CHECK (arm_record.reg_rec_count == 1);
14737     SELF_CHECK (arm_record.arm_regs[0] == 3);
14738 
14739     arm_record.this_addr += 2;
14740     ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14741                            THUMB_INSN_SIZE_BYTES);
14742 
14743     SELF_CHECK (ret == 0);
14744     SELF_CHECK (arm_record.mem_rec_count == 0);
14745     SELF_CHECK (arm_record.reg_rec_count == 1);
14746     SELF_CHECK (arm_record.arm_regs[0] == 5);
14747   }
14748 
14749   /* 32-bit Thumb-2 instructions.  */
14750   {
14751     arm_insn_decode_record arm_record;
14752 
14753     memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14754     arm_record.gdbarch = gdbarch;
14755 
14756     /* Use the endian-free representation of the instruction here.  The test
14757        will handle endianness conversions.  */
14758     static const uint32_t insns[] = {
14759       /* mrc        15, 0, r7, cr13, cr0, {3} */
14760       0x7f70ee1d,
14761     };
14762 
14763     instruction_reader_selftest<uint32_t> reader (insns);
14764     int ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14765                                  THUMB2_INSN_SIZE_BYTES);
14766 
14767     SELF_CHECK (ret == 0);
14768     SELF_CHECK (arm_record.mem_rec_count == 0);
14769     SELF_CHECK (arm_record.reg_rec_count == 1);
14770     SELF_CHECK (arm_record.arm_regs[0] == 7);
14771   }
14772 
14773   /* 32-bit instructions.  */
14774   {
14775     arm_insn_decode_record arm_record;
14776 
14777     memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14778     arm_record.gdbarch = gdbarch;
14779 
14780     /* Use the endian-free representation of the instruction here.  The test
14781        will handle endianness conversions.  */
14782     static const uint32_t insns[] = {
14783       /* mov     r5, r0 */
14784       0xe1a05000,
14785     };
14786 
14787     instruction_reader_selftest<uint32_t> reader (insns);
14788     int ret = decode_insn (reader, &arm_record, ARM_RECORD,
14789                                  ARM_INSN_SIZE_BYTES);
14790 
14791     SELF_CHECK (ret == 0);
14792   }
14793 }
14794 
14795 /* Instruction reader from manually cooked instruction sequences.  */
14796 
14797 class test_arm_instruction_reader : public arm_instruction_reader
14798 {
14799 public:
test_arm_instruction_reader(gdb::array_view<const uint32_t> insns)14800   explicit test_arm_instruction_reader (gdb::array_view<const uint32_t> insns)
14801     : m_insns (insns)
14802   {}
14803 
read(CORE_ADDR memaddr,enum bfd_endian byte_order)14804   uint32_t read (CORE_ADDR memaddr, enum bfd_endian byte_order) const override
14805   {
14806     SELF_CHECK (memaddr % 4 == 0);
14807     SELF_CHECK (memaddr / 4 < m_insns.size ());
14808 
14809     return m_insns[memaddr / 4];
14810   }
14811 
14812 private:
14813   const gdb::array_view<const uint32_t> m_insns;
14814 };
14815 
14816 static void
arm_analyze_prologue_test()14817 arm_analyze_prologue_test ()
14818 {
14819   for (bfd_endian endianness : {BFD_ENDIAN_LITTLE, BFD_ENDIAN_BIG})
14820     {
14821       struct gdbarch_info info;
14822       info.byte_order = endianness;
14823       info.byte_order_for_code = endianness;
14824       info.bfd_arch_info = bfd_scan_arch ("arm");
14825 
14826       struct gdbarch *gdbarch = gdbarch_find_by_info (info);
14827 
14828       SELF_CHECK (gdbarch != NULL);
14829 
14830       /* The "sub" instruction contains an immediate value rotate count of 0,
14831            which resulted in a 32-bit shift of a 32-bit value, caught by
14832            UBSan.  */
14833       const uint32_t insns[] = {
14834             0xe92d4ff0, /* push    {r4, r5, r6, r7, r8, r9, sl, fp, lr} */
14835             0xe1a05000, /* mov     r5, r0 */
14836             0xe5903020, /* ldr     r3, [r0, #32] */
14837             0xe24dd044, /* sub     sp, sp, #68     ; 0x44 */
14838       };
14839 
14840       test_arm_instruction_reader mem_reader (insns);
14841       arm_prologue_cache cache;
14842       arm_cache_init (&cache, gdbarch);
14843 
14844       arm_analyze_prologue (gdbarch, 0, sizeof (insns) - 1, &cache, mem_reader);
14845     }
14846 }
14847 
14848 } // namespace selftests
14849 #endif /* GDB_SELF_TEST */
14850 
14851 /* Cleans up local record registers and memory allocations.  */
14852 
14853 static void
deallocate_reg_mem(arm_insn_decode_record * record)14854 deallocate_reg_mem (arm_insn_decode_record *record)
14855 {
14856   xfree (record->arm_regs);
14857   xfree (record->arm_mems);
14858 }
14859 
14860 
14861 /* Parse the current instruction and record the values of the registers and
14862    memory that will be changed in current instruction to record_arch_list".
14863    Return -1 if something is wrong.  */
14864 
14865 int
arm_process_record(struct gdbarch * gdbarch,struct regcache * regcache,CORE_ADDR insn_addr)14866 arm_process_record (struct gdbarch *gdbarch, struct regcache *regcache,
14867                         CORE_ADDR insn_addr)
14868 {
14869 
14870   uint32_t no_of_rec = 0;
14871   uint32_t ret = 0;  /* return value: -1:record failure ;  0:success  */
14872   ULONGEST t_bit = 0, insn_id = 0;
14873 
14874   ULONGEST u_regval = 0;
14875 
14876   arm_insn_decode_record arm_record;
14877 
14878   memset (&arm_record, 0, sizeof (arm_insn_decode_record));
14879   arm_record.regcache = regcache;
14880   arm_record.this_addr = insn_addr;
14881   arm_record.gdbarch = gdbarch;
14882 
14883 
14884   if (record_debug > 1)
14885     {
14886       gdb_printf (gdb_stdlog, "Process record: arm_process_record "
14887                       "addr = %s\n",
14888                       paddress (gdbarch, arm_record.this_addr));
14889     }
14890 
14891   instruction_reader reader;
14892   enum bfd_endian code_endian
14893     = gdbarch_byte_order_for_code (arm_record.gdbarch);
14894   arm_record.arm_insn
14895     = reader.read (arm_record.this_addr, 2, code_endian);
14896 
14897   /* Check the insn, whether it is thumb or arm one.  */
14898 
14899   t_bit = arm_psr_thumb_bit (arm_record.gdbarch);
14900   regcache_raw_read_unsigned (arm_record.regcache, ARM_PS_REGNUM, &u_regval);
14901 
14902 
14903   if (!(u_regval & t_bit))
14904     {
14905       /* We are decoding arm insn.  */
14906       ret = decode_insn (reader, &arm_record, ARM_RECORD, ARM_INSN_SIZE_BYTES);
14907     }
14908   else
14909     {
14910       insn_id = bits (arm_record.arm_insn, 11, 15);
14911       /* is it thumb2 insn?  */
14912       if ((0x1D == insn_id) || (0x1E == insn_id) || (0x1F == insn_id))
14913           {
14914             ret = decode_insn (reader, &arm_record, THUMB2_RECORD,
14915                                    THUMB2_INSN_SIZE_BYTES);
14916           }
14917       else
14918           {
14919             /* We are decoding thumb insn.  */
14920             ret = decode_insn (reader, &arm_record, THUMB_RECORD,
14921                                    THUMB_INSN_SIZE_BYTES);
14922           }
14923     }
14924 
14925   if (0 == ret)
14926     {
14927       /* Record registers.  */
14928       record_full_arch_list_add_reg (arm_record.regcache, ARM_PC_REGNUM);
14929       if (arm_record.arm_regs)
14930           {
14931             for (no_of_rec = 0; no_of_rec < arm_record.reg_rec_count; no_of_rec++)
14932               {
14933                 if (record_full_arch_list_add_reg
14934                       (arm_record.regcache , arm_record.arm_regs[no_of_rec]))
14935                     ret = -1;
14936               }
14937           }
14938       /* Record memories.  */
14939       if (arm_record.arm_mems)
14940           {
14941             for (no_of_rec = 0; no_of_rec < arm_record.mem_rec_count; no_of_rec++)
14942               {
14943                 if (record_full_arch_list_add_mem
14944                       ((CORE_ADDR)arm_record.arm_mems[no_of_rec].addr,
14945                        arm_record.arm_mems[no_of_rec].len))
14946                     ret = -1;
14947               }
14948           }
14949 
14950       if (record_full_arch_list_add_end ())
14951           ret = -1;
14952     }
14953 
14954 
14955   deallocate_reg_mem (&arm_record);
14956 
14957   return ret;
14958 }
14959 
14960 /* See arm-tdep.h.  */
14961 
14962 const target_desc *
arm_read_description(arm_fp_type fp_type,bool tls)14963 arm_read_description (arm_fp_type fp_type, bool tls)
14964 {
14965   struct target_desc *tdesc = tdesc_arm_list[fp_type][tls];
14966 
14967   if (tdesc == nullptr)
14968     {
14969       tdesc = arm_create_target_description (fp_type, tls);
14970       tdesc_arm_list[fp_type][tls] = tdesc;
14971     }
14972 
14973   return tdesc;
14974 }
14975 
14976 /* See arm-tdep.h.  */
14977 
14978 const target_desc *
arm_read_mprofile_description(arm_m_profile_type m_type)14979 arm_read_mprofile_description (arm_m_profile_type m_type)
14980 {
14981   struct target_desc *tdesc = tdesc_arm_mprofile_list[m_type];
14982 
14983   if (tdesc == nullptr)
14984     {
14985       tdesc = arm_create_mprofile_target_description (m_type);
14986       tdesc_arm_mprofile_list[m_type] = tdesc;
14987     }
14988 
14989   return tdesc;
14990 }
14991