15ffd83dbSDimitry Andric //===-- RegisterContextDarwin_arm.cpp -------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "RegisterContextDarwin_arm.h"
100b57cec5SDimitry Andric #include "RegisterContextDarwinConstants.h"
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/Utility/DataBufferHeap.h"
130b57cec5SDimitry Andric #include "lldb/Utility/DataExtractor.h"
140b57cec5SDimitry Andric #include "lldb/Utility/Endian.h"
150b57cec5SDimitry Andric #include "lldb/Utility/Log.h"
160b57cec5SDimitry Andric #include "lldb/Utility/RegisterValue.h"
170b57cec5SDimitry Andric #include "lldb/Utility/Scalar.h"
180b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric #include "Plugins/Process/Utility/InstructionUtils.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric #include <memory>
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric #include "Utility/ARM_DWARF_Registers.h"
250b57cec5SDimitry Andric #include "Utility/ARM_ehframe_Registers.h"
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric using namespace lldb;
300b57cec5SDimitry Andric using namespace lldb_private;
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric enum {
330b57cec5SDimitry Andric   gpr_r0 = 0,
340b57cec5SDimitry Andric   gpr_r1,
350b57cec5SDimitry Andric   gpr_r2,
360b57cec5SDimitry Andric   gpr_r3,
370b57cec5SDimitry Andric   gpr_r4,
380b57cec5SDimitry Andric   gpr_r5,
390b57cec5SDimitry Andric   gpr_r6,
400b57cec5SDimitry Andric   gpr_r7,
410b57cec5SDimitry Andric   gpr_r8,
420b57cec5SDimitry Andric   gpr_r9,
430b57cec5SDimitry Andric   gpr_r10,
440b57cec5SDimitry Andric   gpr_r11,
450b57cec5SDimitry Andric   gpr_r12,
460b57cec5SDimitry Andric   gpr_r13,
470b57cec5SDimitry Andric   gpr_sp = gpr_r13,
480b57cec5SDimitry Andric   gpr_r14,
490b57cec5SDimitry Andric   gpr_lr = gpr_r14,
500b57cec5SDimitry Andric   gpr_r15,
510b57cec5SDimitry Andric   gpr_pc = gpr_r15,
520b57cec5SDimitry Andric   gpr_cpsr,
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   fpu_s0,
550b57cec5SDimitry Andric   fpu_s1,
560b57cec5SDimitry Andric   fpu_s2,
570b57cec5SDimitry Andric   fpu_s3,
580b57cec5SDimitry Andric   fpu_s4,
590b57cec5SDimitry Andric   fpu_s5,
600b57cec5SDimitry Andric   fpu_s6,
610b57cec5SDimitry Andric   fpu_s7,
620b57cec5SDimitry Andric   fpu_s8,
630b57cec5SDimitry Andric   fpu_s9,
640b57cec5SDimitry Andric   fpu_s10,
650b57cec5SDimitry Andric   fpu_s11,
660b57cec5SDimitry Andric   fpu_s12,
670b57cec5SDimitry Andric   fpu_s13,
680b57cec5SDimitry Andric   fpu_s14,
690b57cec5SDimitry Andric   fpu_s15,
700b57cec5SDimitry Andric   fpu_s16,
710b57cec5SDimitry Andric   fpu_s17,
720b57cec5SDimitry Andric   fpu_s18,
730b57cec5SDimitry Andric   fpu_s19,
740b57cec5SDimitry Andric   fpu_s20,
750b57cec5SDimitry Andric   fpu_s21,
760b57cec5SDimitry Andric   fpu_s22,
770b57cec5SDimitry Andric   fpu_s23,
780b57cec5SDimitry Andric   fpu_s24,
790b57cec5SDimitry Andric   fpu_s25,
800b57cec5SDimitry Andric   fpu_s26,
810b57cec5SDimitry Andric   fpu_s27,
820b57cec5SDimitry Andric   fpu_s28,
830b57cec5SDimitry Andric   fpu_s29,
840b57cec5SDimitry Andric   fpu_s30,
850b57cec5SDimitry Andric   fpu_s31,
860b57cec5SDimitry Andric   fpu_fpscr,
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   exc_exception,
890b57cec5SDimitry Andric   exc_fsr,
900b57cec5SDimitry Andric   exc_far,
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric   dbg_bvr0,
930b57cec5SDimitry Andric   dbg_bvr1,
940b57cec5SDimitry Andric   dbg_bvr2,
950b57cec5SDimitry Andric   dbg_bvr3,
960b57cec5SDimitry Andric   dbg_bvr4,
970b57cec5SDimitry Andric   dbg_bvr5,
980b57cec5SDimitry Andric   dbg_bvr6,
990b57cec5SDimitry Andric   dbg_bvr7,
1000b57cec5SDimitry Andric   dbg_bvr8,
1010b57cec5SDimitry Andric   dbg_bvr9,
1020b57cec5SDimitry Andric   dbg_bvr10,
1030b57cec5SDimitry Andric   dbg_bvr11,
1040b57cec5SDimitry Andric   dbg_bvr12,
1050b57cec5SDimitry Andric   dbg_bvr13,
1060b57cec5SDimitry Andric   dbg_bvr14,
1070b57cec5SDimitry Andric   dbg_bvr15,
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric   dbg_bcr0,
1100b57cec5SDimitry Andric   dbg_bcr1,
1110b57cec5SDimitry Andric   dbg_bcr2,
1120b57cec5SDimitry Andric   dbg_bcr3,
1130b57cec5SDimitry Andric   dbg_bcr4,
1140b57cec5SDimitry Andric   dbg_bcr5,
1150b57cec5SDimitry Andric   dbg_bcr6,
1160b57cec5SDimitry Andric   dbg_bcr7,
1170b57cec5SDimitry Andric   dbg_bcr8,
1180b57cec5SDimitry Andric   dbg_bcr9,
1190b57cec5SDimitry Andric   dbg_bcr10,
1200b57cec5SDimitry Andric   dbg_bcr11,
1210b57cec5SDimitry Andric   dbg_bcr12,
1220b57cec5SDimitry Andric   dbg_bcr13,
1230b57cec5SDimitry Andric   dbg_bcr14,
1240b57cec5SDimitry Andric   dbg_bcr15,
1250b57cec5SDimitry Andric 
1260b57cec5SDimitry Andric   dbg_wvr0,
1270b57cec5SDimitry Andric   dbg_wvr1,
1280b57cec5SDimitry Andric   dbg_wvr2,
1290b57cec5SDimitry Andric   dbg_wvr3,
1300b57cec5SDimitry Andric   dbg_wvr4,
1310b57cec5SDimitry Andric   dbg_wvr5,
1320b57cec5SDimitry Andric   dbg_wvr6,
1330b57cec5SDimitry Andric   dbg_wvr7,
1340b57cec5SDimitry Andric   dbg_wvr8,
1350b57cec5SDimitry Andric   dbg_wvr9,
1360b57cec5SDimitry Andric   dbg_wvr10,
1370b57cec5SDimitry Andric   dbg_wvr11,
1380b57cec5SDimitry Andric   dbg_wvr12,
1390b57cec5SDimitry Andric   dbg_wvr13,
1400b57cec5SDimitry Andric   dbg_wvr14,
1410b57cec5SDimitry Andric   dbg_wvr15,
1420b57cec5SDimitry Andric 
1430b57cec5SDimitry Andric   dbg_wcr0,
1440b57cec5SDimitry Andric   dbg_wcr1,
1450b57cec5SDimitry Andric   dbg_wcr2,
1460b57cec5SDimitry Andric   dbg_wcr3,
1470b57cec5SDimitry Andric   dbg_wcr4,
1480b57cec5SDimitry Andric   dbg_wcr5,
1490b57cec5SDimitry Andric   dbg_wcr6,
1500b57cec5SDimitry Andric   dbg_wcr7,
1510b57cec5SDimitry Andric   dbg_wcr8,
1520b57cec5SDimitry Andric   dbg_wcr9,
1530b57cec5SDimitry Andric   dbg_wcr10,
1540b57cec5SDimitry Andric   dbg_wcr11,
1550b57cec5SDimitry Andric   dbg_wcr12,
1560b57cec5SDimitry Andric   dbg_wcr13,
1570b57cec5SDimitry Andric   dbg_wcr14,
1580b57cec5SDimitry Andric   dbg_wcr15,
1590b57cec5SDimitry Andric 
1600b57cec5SDimitry Andric   k_num_registers
1610b57cec5SDimitry Andric };
1620b57cec5SDimitry Andric 
1630b57cec5SDimitry Andric #define GPR_OFFSET(idx) ((idx)*4)
1640b57cec5SDimitry Andric #define FPU_OFFSET(idx) ((idx)*4 + sizeof(RegisterContextDarwin_arm::GPR))
1650b57cec5SDimitry Andric #define EXC_OFFSET(idx)                                                        \
1660b57cec5SDimitry Andric   ((idx)*4 + sizeof(RegisterContextDarwin_arm::GPR) +                          \
1670b57cec5SDimitry Andric    sizeof(RegisterContextDarwin_arm::FPU))
1680b57cec5SDimitry Andric #define DBG_OFFSET(reg)                                                        \
1690b57cec5SDimitry Andric   ((LLVM_EXTENSION offsetof(RegisterContextDarwin_arm::DBG, reg) +             \
1700b57cec5SDimitry Andric     sizeof(RegisterContextDarwin_arm::GPR) +                                   \
1710b57cec5SDimitry Andric     sizeof(RegisterContextDarwin_arm::FPU) +                                   \
1720b57cec5SDimitry Andric     sizeof(RegisterContextDarwin_arm::EXC)))
1730b57cec5SDimitry Andric 
1740b57cec5SDimitry Andric #define DEFINE_DBG(reg, i)                                                     \
1750b57cec5SDimitry Andric   #reg, NULL, sizeof(((RegisterContextDarwin_arm::DBG *) NULL)->reg[i]),       \
1760b57cec5SDimitry Andric                       DBG_OFFSET(reg[i]), eEncodingUint, eFormatHex,           \
1770b57cec5SDimitry Andric                                  {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    \
1780b57cec5SDimitry Andric                                   LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    \
1790b57cec5SDimitry Andric                                   LLDB_INVALID_REGNUM },                       \
18006c3fb27SDimitry Andric                                   nullptr, nullptr, nullptr,
1810b57cec5SDimitry Andric #define REG_CONTEXT_SIZE                                                       \
1820b57cec5SDimitry Andric   (sizeof(RegisterContextDarwin_arm::GPR) +                                    \
1830b57cec5SDimitry Andric    sizeof(RegisterContextDarwin_arm::FPU) +                                    \
1840b57cec5SDimitry Andric    sizeof(RegisterContextDarwin_arm::EXC))
1850b57cec5SDimitry Andric 
1860b57cec5SDimitry Andric static RegisterInfo g_register_infos[] = {
1870b57cec5SDimitry Andric     // General purpose registers
1880b57cec5SDimitry Andric     //  NAME        ALT     SZ  OFFSET              ENCODING        FORMAT
1890b57cec5SDimitry Andric     //  EH_FRAME                DWARF               GENERIC
1900b57cec5SDimitry Andric     //  PROCESS PLUGIN          LLDB NATIVE
1910b57cec5SDimitry Andric     //  ======      ======= ==  =============       =============   ============
1920b57cec5SDimitry Andric     //  ===============         ===============     =========================
1930b57cec5SDimitry Andric     //  =====================   =============
1940b57cec5SDimitry Andric     {"r0",
1950b57cec5SDimitry Andric      nullptr,
1960b57cec5SDimitry Andric      4,
1970b57cec5SDimitry Andric      GPR_OFFSET(0),
1980b57cec5SDimitry Andric      eEncodingUint,
1990b57cec5SDimitry Andric      eFormatHex,
2000b57cec5SDimitry Andric      {ehframe_r0, dwarf_r0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r0},
2010b57cec5SDimitry Andric      nullptr,
2020b57cec5SDimitry Andric      nullptr,
20306c3fb27SDimitry Andric      nullptr,
204349cc55cSDimitry Andric     },
2050b57cec5SDimitry Andric     {"r1",
2060b57cec5SDimitry Andric      nullptr,
2070b57cec5SDimitry Andric      4,
2080b57cec5SDimitry Andric      GPR_OFFSET(1),
2090b57cec5SDimitry Andric      eEncodingUint,
2100b57cec5SDimitry Andric      eFormatHex,
2110b57cec5SDimitry Andric      {ehframe_r1, dwarf_r1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r1},
2120b57cec5SDimitry Andric      nullptr,
2130b57cec5SDimitry Andric      nullptr,
21406c3fb27SDimitry Andric      nullptr,
215349cc55cSDimitry Andric     },
2160b57cec5SDimitry Andric     {"r2",
2170b57cec5SDimitry Andric      nullptr,
2180b57cec5SDimitry Andric      4,
2190b57cec5SDimitry Andric      GPR_OFFSET(2),
2200b57cec5SDimitry Andric      eEncodingUint,
2210b57cec5SDimitry Andric      eFormatHex,
2220b57cec5SDimitry Andric      {ehframe_r2, dwarf_r2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r2},
2230b57cec5SDimitry Andric      nullptr,
2240b57cec5SDimitry Andric      nullptr,
22506c3fb27SDimitry Andric      nullptr,
226349cc55cSDimitry Andric     },
2270b57cec5SDimitry Andric     {"r3",
2280b57cec5SDimitry Andric      nullptr,
2290b57cec5SDimitry Andric      4,
2300b57cec5SDimitry Andric      GPR_OFFSET(3),
2310b57cec5SDimitry Andric      eEncodingUint,
2320b57cec5SDimitry Andric      eFormatHex,
2330b57cec5SDimitry Andric      {ehframe_r3, dwarf_r3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r3},
2340b57cec5SDimitry Andric      nullptr,
2350b57cec5SDimitry Andric      nullptr,
23606c3fb27SDimitry Andric      nullptr,
237349cc55cSDimitry Andric     },
2380b57cec5SDimitry Andric     {"r4",
2390b57cec5SDimitry Andric      nullptr,
2400b57cec5SDimitry Andric      4,
2410b57cec5SDimitry Andric      GPR_OFFSET(4),
2420b57cec5SDimitry Andric      eEncodingUint,
2430b57cec5SDimitry Andric      eFormatHex,
2440b57cec5SDimitry Andric      {ehframe_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r4},
2450b57cec5SDimitry Andric      nullptr,
2460b57cec5SDimitry Andric      nullptr,
24706c3fb27SDimitry Andric      nullptr,
248349cc55cSDimitry Andric     },
2490b57cec5SDimitry Andric     {"r5",
2500b57cec5SDimitry Andric      nullptr,
2510b57cec5SDimitry Andric      4,
2520b57cec5SDimitry Andric      GPR_OFFSET(5),
2530b57cec5SDimitry Andric      eEncodingUint,
2540b57cec5SDimitry Andric      eFormatHex,
2550b57cec5SDimitry Andric      {ehframe_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r5},
2560b57cec5SDimitry Andric      nullptr,
2570b57cec5SDimitry Andric      nullptr,
25806c3fb27SDimitry Andric      nullptr,
259349cc55cSDimitry Andric     },
2600b57cec5SDimitry Andric     {"r6",
2610b57cec5SDimitry Andric      nullptr,
2620b57cec5SDimitry Andric      4,
2630b57cec5SDimitry Andric      GPR_OFFSET(6),
2640b57cec5SDimitry Andric      eEncodingUint,
2650b57cec5SDimitry Andric      eFormatHex,
2660b57cec5SDimitry Andric      {ehframe_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r6},
2670b57cec5SDimitry Andric      nullptr,
2680b57cec5SDimitry Andric      nullptr,
26906c3fb27SDimitry Andric      nullptr,
270349cc55cSDimitry Andric     },
2710b57cec5SDimitry Andric     {"r7",
2720b57cec5SDimitry Andric      nullptr,
2730b57cec5SDimitry Andric      4,
2740b57cec5SDimitry Andric      GPR_OFFSET(7),
2750b57cec5SDimitry Andric      eEncodingUint,
2760b57cec5SDimitry Andric      eFormatHex,
2770b57cec5SDimitry Andric      {ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,
2780b57cec5SDimitry Andric       gpr_r7},
2790b57cec5SDimitry Andric      nullptr,
2800b57cec5SDimitry Andric      nullptr,
28106c3fb27SDimitry Andric      nullptr,
282349cc55cSDimitry Andric     },
2830b57cec5SDimitry Andric     {"r8",
2840b57cec5SDimitry Andric      nullptr,
2850b57cec5SDimitry Andric      4,
2860b57cec5SDimitry Andric      GPR_OFFSET(8),
2870b57cec5SDimitry Andric      eEncodingUint,
2880b57cec5SDimitry Andric      eFormatHex,
2890b57cec5SDimitry Andric      {ehframe_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r8},
2900b57cec5SDimitry Andric      nullptr,
2910b57cec5SDimitry Andric      nullptr,
29206c3fb27SDimitry Andric      nullptr,
293349cc55cSDimitry Andric     },
2940b57cec5SDimitry Andric     {"r9",
2950b57cec5SDimitry Andric      nullptr,
2960b57cec5SDimitry Andric      4,
2970b57cec5SDimitry Andric      GPR_OFFSET(9),
2980b57cec5SDimitry Andric      eEncodingUint,
2990b57cec5SDimitry Andric      eFormatHex,
3000b57cec5SDimitry Andric      {ehframe_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r9},
3010b57cec5SDimitry Andric      nullptr,
3020b57cec5SDimitry Andric      nullptr,
30306c3fb27SDimitry Andric      nullptr,
304349cc55cSDimitry Andric     },
3050b57cec5SDimitry Andric     {"r10",
3060b57cec5SDimitry Andric      nullptr,
3070b57cec5SDimitry Andric      4,
3080b57cec5SDimitry Andric      GPR_OFFSET(10),
3090b57cec5SDimitry Andric      eEncodingUint,
3100b57cec5SDimitry Andric      eFormatHex,
3110b57cec5SDimitry Andric      {ehframe_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3120b57cec5SDimitry Andric       gpr_r10},
3130b57cec5SDimitry Andric      nullptr,
3140b57cec5SDimitry Andric      nullptr,
31506c3fb27SDimitry Andric      nullptr,
316349cc55cSDimitry Andric     },
3170b57cec5SDimitry Andric     {"r11",
3180b57cec5SDimitry Andric      nullptr,
3190b57cec5SDimitry Andric      4,
3200b57cec5SDimitry Andric      GPR_OFFSET(11),
3210b57cec5SDimitry Andric      eEncodingUint,
3220b57cec5SDimitry Andric      eFormatHex,
3230b57cec5SDimitry Andric      {ehframe_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3240b57cec5SDimitry Andric       gpr_r11},
3250b57cec5SDimitry Andric      nullptr,
3260b57cec5SDimitry Andric      nullptr,
32706c3fb27SDimitry Andric      nullptr,
328349cc55cSDimitry Andric     },
3290b57cec5SDimitry Andric     {"r12",
3300b57cec5SDimitry Andric      nullptr,
3310b57cec5SDimitry Andric      4,
3320b57cec5SDimitry Andric      GPR_OFFSET(12),
3330b57cec5SDimitry Andric      eEncodingUint,
3340b57cec5SDimitry Andric      eFormatHex,
3350b57cec5SDimitry Andric      {ehframe_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3360b57cec5SDimitry Andric       gpr_r12},
3370b57cec5SDimitry Andric      nullptr,
3380b57cec5SDimitry Andric      nullptr,
33906c3fb27SDimitry Andric      nullptr,
340349cc55cSDimitry Andric     },
3410b57cec5SDimitry Andric     {"sp",
3420b57cec5SDimitry Andric      "r13",
3430b57cec5SDimitry Andric      4,
3440b57cec5SDimitry Andric      GPR_OFFSET(13),
3450b57cec5SDimitry Andric      eEncodingUint,
3460b57cec5SDimitry Andric      eFormatHex,
3470b57cec5SDimitry Andric      {ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,
3480b57cec5SDimitry Andric       gpr_sp},
3490b57cec5SDimitry Andric      nullptr,
3500b57cec5SDimitry Andric      nullptr,
35106c3fb27SDimitry Andric      nullptr,
352349cc55cSDimitry Andric     },
3530b57cec5SDimitry Andric     {"lr",
3540b57cec5SDimitry Andric      "r14",
3550b57cec5SDimitry Andric      4,
3560b57cec5SDimitry Andric      GPR_OFFSET(14),
3570b57cec5SDimitry Andric      eEncodingUint,
3580b57cec5SDimitry Andric      eFormatHex,
3590b57cec5SDimitry Andric      {ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM,
3600b57cec5SDimitry Andric       gpr_lr},
3610b57cec5SDimitry Andric      nullptr,
3620b57cec5SDimitry Andric      nullptr,
36306c3fb27SDimitry Andric      nullptr,
364349cc55cSDimitry Andric     },
3650b57cec5SDimitry Andric     {"pc",
3660b57cec5SDimitry Andric      "r15",
3670b57cec5SDimitry Andric      4,
3680b57cec5SDimitry Andric      GPR_OFFSET(15),
3690b57cec5SDimitry Andric      eEncodingUint,
3700b57cec5SDimitry Andric      eFormatHex,
3710b57cec5SDimitry Andric      {ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,
3720b57cec5SDimitry Andric       gpr_pc},
3730b57cec5SDimitry Andric      nullptr,
3740b57cec5SDimitry Andric      nullptr,
37506c3fb27SDimitry Andric      nullptr,
376349cc55cSDimitry Andric     },
3770b57cec5SDimitry Andric     {"cpsr",
3780b57cec5SDimitry Andric      "psr",
3790b57cec5SDimitry Andric      4,
3800b57cec5SDimitry Andric      GPR_OFFSET(16),
3810b57cec5SDimitry Andric      eEncodingUint,
3820b57cec5SDimitry Andric      eFormatHex,
3830b57cec5SDimitry Andric      {ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM,
3840b57cec5SDimitry Andric       gpr_cpsr},
3850b57cec5SDimitry Andric      nullptr,
3860b57cec5SDimitry Andric      nullptr,
38706c3fb27SDimitry Andric      nullptr,
388349cc55cSDimitry Andric     },
3890b57cec5SDimitry Andric 
3900b57cec5SDimitry Andric     {"s0",
3910b57cec5SDimitry Andric      nullptr,
3920b57cec5SDimitry Andric      4,
3930b57cec5SDimitry Andric      FPU_OFFSET(0),
3940b57cec5SDimitry Andric      eEncodingIEEE754,
3950b57cec5SDimitry Andric      eFormatFloat,
3960b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
3970b57cec5SDimitry Andric       fpu_s0},
3980b57cec5SDimitry Andric      nullptr,
3990b57cec5SDimitry Andric      nullptr,
40006c3fb27SDimitry Andric      nullptr,
401349cc55cSDimitry Andric     },
4020b57cec5SDimitry Andric     {"s1",
4030b57cec5SDimitry Andric      nullptr,
4040b57cec5SDimitry Andric      4,
4050b57cec5SDimitry Andric      FPU_OFFSET(1),
4060b57cec5SDimitry Andric      eEncodingIEEE754,
4070b57cec5SDimitry Andric      eFormatFloat,
4080b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4090b57cec5SDimitry Andric       fpu_s1},
4100b57cec5SDimitry Andric      nullptr,
4110b57cec5SDimitry Andric      nullptr,
41206c3fb27SDimitry Andric      nullptr,
413349cc55cSDimitry Andric     },
4140b57cec5SDimitry Andric     {"s2",
4150b57cec5SDimitry Andric      nullptr,
4160b57cec5SDimitry Andric      4,
4170b57cec5SDimitry Andric      FPU_OFFSET(2),
4180b57cec5SDimitry Andric      eEncodingIEEE754,
4190b57cec5SDimitry Andric      eFormatFloat,
4200b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4210b57cec5SDimitry Andric       fpu_s2},
4220b57cec5SDimitry Andric      nullptr,
4230b57cec5SDimitry Andric      nullptr,
42406c3fb27SDimitry Andric      nullptr,
425349cc55cSDimitry Andric     },
4260b57cec5SDimitry Andric     {"s3",
4270b57cec5SDimitry Andric      nullptr,
4280b57cec5SDimitry Andric      4,
4290b57cec5SDimitry Andric      FPU_OFFSET(3),
4300b57cec5SDimitry Andric      eEncodingIEEE754,
4310b57cec5SDimitry Andric      eFormatFloat,
4320b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4330b57cec5SDimitry Andric       fpu_s3},
4340b57cec5SDimitry Andric      nullptr,
4350b57cec5SDimitry Andric      nullptr,
43606c3fb27SDimitry Andric      nullptr,
437349cc55cSDimitry Andric     },
4380b57cec5SDimitry Andric     {"s4",
4390b57cec5SDimitry Andric      nullptr,
4400b57cec5SDimitry Andric      4,
4410b57cec5SDimitry Andric      FPU_OFFSET(4),
4420b57cec5SDimitry Andric      eEncodingIEEE754,
4430b57cec5SDimitry Andric      eFormatFloat,
4440b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4450b57cec5SDimitry Andric       fpu_s4},
4460b57cec5SDimitry Andric      nullptr,
4470b57cec5SDimitry Andric      nullptr,
44806c3fb27SDimitry Andric      nullptr,
449349cc55cSDimitry Andric     },
4500b57cec5SDimitry Andric     {"s5",
4510b57cec5SDimitry Andric      nullptr,
4520b57cec5SDimitry Andric      4,
4530b57cec5SDimitry Andric      FPU_OFFSET(5),
4540b57cec5SDimitry Andric      eEncodingIEEE754,
4550b57cec5SDimitry Andric      eFormatFloat,
4560b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4570b57cec5SDimitry Andric       fpu_s5},
4580b57cec5SDimitry Andric      nullptr,
4590b57cec5SDimitry Andric      nullptr,
46006c3fb27SDimitry Andric      nullptr,
461349cc55cSDimitry Andric     },
4620b57cec5SDimitry Andric     {"s6",
4630b57cec5SDimitry Andric      nullptr,
4640b57cec5SDimitry Andric      4,
4650b57cec5SDimitry Andric      FPU_OFFSET(6),
4660b57cec5SDimitry Andric      eEncodingIEEE754,
4670b57cec5SDimitry Andric      eFormatFloat,
4680b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4690b57cec5SDimitry Andric       fpu_s6},
4700b57cec5SDimitry Andric      nullptr,
4710b57cec5SDimitry Andric      nullptr,
47206c3fb27SDimitry Andric      nullptr,
473349cc55cSDimitry Andric     },
4740b57cec5SDimitry Andric     {"s7",
4750b57cec5SDimitry Andric      nullptr,
4760b57cec5SDimitry Andric      4,
4770b57cec5SDimitry Andric      FPU_OFFSET(7),
4780b57cec5SDimitry Andric      eEncodingIEEE754,
4790b57cec5SDimitry Andric      eFormatFloat,
4800b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4810b57cec5SDimitry Andric       fpu_s7},
4820b57cec5SDimitry Andric      nullptr,
4830b57cec5SDimitry Andric      nullptr,
48406c3fb27SDimitry Andric      nullptr,
485349cc55cSDimitry Andric     },
4860b57cec5SDimitry Andric     {"s8",
4870b57cec5SDimitry Andric      nullptr,
4880b57cec5SDimitry Andric      4,
4890b57cec5SDimitry Andric      FPU_OFFSET(8),
4900b57cec5SDimitry Andric      eEncodingIEEE754,
4910b57cec5SDimitry Andric      eFormatFloat,
4920b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
4930b57cec5SDimitry Andric       fpu_s8},
4940b57cec5SDimitry Andric      nullptr,
4950b57cec5SDimitry Andric      nullptr,
49606c3fb27SDimitry Andric      nullptr,
497349cc55cSDimitry Andric     },
4980b57cec5SDimitry Andric     {"s9",
4990b57cec5SDimitry Andric      nullptr,
5000b57cec5SDimitry Andric      4,
5010b57cec5SDimitry Andric      FPU_OFFSET(9),
5020b57cec5SDimitry Andric      eEncodingIEEE754,
5030b57cec5SDimitry Andric      eFormatFloat,
5040b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5050b57cec5SDimitry Andric       fpu_s9},
5060b57cec5SDimitry Andric      nullptr,
5070b57cec5SDimitry Andric      nullptr,
50806c3fb27SDimitry Andric      nullptr,
509349cc55cSDimitry Andric     },
5100b57cec5SDimitry Andric     {"s10",
5110b57cec5SDimitry Andric      nullptr,
5120b57cec5SDimitry Andric      4,
5130b57cec5SDimitry Andric      FPU_OFFSET(10),
5140b57cec5SDimitry Andric      eEncodingIEEE754,
5150b57cec5SDimitry Andric      eFormatFloat,
5160b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5170b57cec5SDimitry Andric       fpu_s10},
5180b57cec5SDimitry Andric      nullptr,
5190b57cec5SDimitry Andric      nullptr,
52006c3fb27SDimitry Andric      nullptr,
521349cc55cSDimitry Andric     },
5220b57cec5SDimitry Andric     {"s11",
5230b57cec5SDimitry Andric      nullptr,
5240b57cec5SDimitry Andric      4,
5250b57cec5SDimitry Andric      FPU_OFFSET(11),
5260b57cec5SDimitry Andric      eEncodingIEEE754,
5270b57cec5SDimitry Andric      eFormatFloat,
5280b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5290b57cec5SDimitry Andric       fpu_s11},
5300b57cec5SDimitry Andric      nullptr,
5310b57cec5SDimitry Andric      nullptr,
53206c3fb27SDimitry Andric      nullptr,
533349cc55cSDimitry Andric     },
5340b57cec5SDimitry Andric     {"s12",
5350b57cec5SDimitry Andric      nullptr,
5360b57cec5SDimitry Andric      4,
5370b57cec5SDimitry Andric      FPU_OFFSET(12),
5380b57cec5SDimitry Andric      eEncodingIEEE754,
5390b57cec5SDimitry Andric      eFormatFloat,
5400b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5410b57cec5SDimitry Andric       fpu_s12},
5420b57cec5SDimitry Andric      nullptr,
5430b57cec5SDimitry Andric      nullptr,
54406c3fb27SDimitry Andric      nullptr,
545349cc55cSDimitry Andric     },
5460b57cec5SDimitry Andric     {"s13",
5470b57cec5SDimitry Andric      nullptr,
5480b57cec5SDimitry Andric      4,
5490b57cec5SDimitry Andric      FPU_OFFSET(13),
5500b57cec5SDimitry Andric      eEncodingIEEE754,
5510b57cec5SDimitry Andric      eFormatFloat,
5520b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5530b57cec5SDimitry Andric       fpu_s13},
5540b57cec5SDimitry Andric      nullptr,
5550b57cec5SDimitry Andric      nullptr,
55606c3fb27SDimitry Andric      nullptr,
557349cc55cSDimitry Andric     },
5580b57cec5SDimitry Andric     {"s14",
5590b57cec5SDimitry Andric      nullptr,
5600b57cec5SDimitry Andric      4,
5610b57cec5SDimitry Andric      FPU_OFFSET(14),
5620b57cec5SDimitry Andric      eEncodingIEEE754,
5630b57cec5SDimitry Andric      eFormatFloat,
5640b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5650b57cec5SDimitry Andric       fpu_s14},
5660b57cec5SDimitry Andric      nullptr,
5670b57cec5SDimitry Andric      nullptr,
56806c3fb27SDimitry Andric      nullptr,
569349cc55cSDimitry Andric     },
5700b57cec5SDimitry Andric     {"s15",
5710b57cec5SDimitry Andric      nullptr,
5720b57cec5SDimitry Andric      4,
5730b57cec5SDimitry Andric      FPU_OFFSET(15),
5740b57cec5SDimitry Andric      eEncodingIEEE754,
5750b57cec5SDimitry Andric      eFormatFloat,
5760b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5770b57cec5SDimitry Andric       fpu_s15},
5780b57cec5SDimitry Andric      nullptr,
5790b57cec5SDimitry Andric      nullptr,
58006c3fb27SDimitry Andric      nullptr,
581349cc55cSDimitry Andric     },
5820b57cec5SDimitry Andric     {"s16",
5830b57cec5SDimitry Andric      nullptr,
5840b57cec5SDimitry Andric      4,
5850b57cec5SDimitry Andric      FPU_OFFSET(16),
5860b57cec5SDimitry Andric      eEncodingIEEE754,
5870b57cec5SDimitry Andric      eFormatFloat,
5880b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
5890b57cec5SDimitry Andric       fpu_s16},
5900b57cec5SDimitry Andric      nullptr,
5910b57cec5SDimitry Andric      nullptr,
59206c3fb27SDimitry Andric      nullptr,
593349cc55cSDimitry Andric     },
5940b57cec5SDimitry Andric     {"s17",
5950b57cec5SDimitry Andric      nullptr,
5960b57cec5SDimitry Andric      4,
5970b57cec5SDimitry Andric      FPU_OFFSET(17),
5980b57cec5SDimitry Andric      eEncodingIEEE754,
5990b57cec5SDimitry Andric      eFormatFloat,
6000b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6010b57cec5SDimitry Andric       fpu_s17},
6020b57cec5SDimitry Andric      nullptr,
6030b57cec5SDimitry Andric      nullptr,
60406c3fb27SDimitry Andric      nullptr,
605349cc55cSDimitry Andric     },
6060b57cec5SDimitry Andric     {"s18",
6070b57cec5SDimitry Andric      nullptr,
6080b57cec5SDimitry Andric      4,
6090b57cec5SDimitry Andric      FPU_OFFSET(18),
6100b57cec5SDimitry Andric      eEncodingIEEE754,
6110b57cec5SDimitry Andric      eFormatFloat,
6120b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6130b57cec5SDimitry Andric       fpu_s18},
6140b57cec5SDimitry Andric      nullptr,
6150b57cec5SDimitry Andric      nullptr,
61606c3fb27SDimitry Andric      nullptr,
617349cc55cSDimitry Andric     },
6180b57cec5SDimitry Andric     {"s19",
6190b57cec5SDimitry Andric      nullptr,
6200b57cec5SDimitry Andric      4,
6210b57cec5SDimitry Andric      FPU_OFFSET(19),
6220b57cec5SDimitry Andric      eEncodingIEEE754,
6230b57cec5SDimitry Andric      eFormatFloat,
6240b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6250b57cec5SDimitry Andric       fpu_s19},
6260b57cec5SDimitry Andric      nullptr,
6270b57cec5SDimitry Andric      nullptr,
62806c3fb27SDimitry Andric      nullptr,
629349cc55cSDimitry Andric     },
6300b57cec5SDimitry Andric     {"s20",
6310b57cec5SDimitry Andric      nullptr,
6320b57cec5SDimitry Andric      4,
6330b57cec5SDimitry Andric      FPU_OFFSET(20),
6340b57cec5SDimitry Andric      eEncodingIEEE754,
6350b57cec5SDimitry Andric      eFormatFloat,
6360b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6370b57cec5SDimitry Andric       fpu_s20},
6380b57cec5SDimitry Andric      nullptr,
6390b57cec5SDimitry Andric      nullptr,
64006c3fb27SDimitry Andric      nullptr,
641349cc55cSDimitry Andric     },
6420b57cec5SDimitry Andric     {"s21",
6430b57cec5SDimitry Andric      nullptr,
6440b57cec5SDimitry Andric      4,
6450b57cec5SDimitry Andric      FPU_OFFSET(21),
6460b57cec5SDimitry Andric      eEncodingIEEE754,
6470b57cec5SDimitry Andric      eFormatFloat,
6480b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6490b57cec5SDimitry Andric       fpu_s21},
6500b57cec5SDimitry Andric      nullptr,
6510b57cec5SDimitry Andric      nullptr,
65206c3fb27SDimitry Andric      nullptr,
653349cc55cSDimitry Andric     },
6540b57cec5SDimitry Andric     {"s22",
6550b57cec5SDimitry Andric      nullptr,
6560b57cec5SDimitry Andric      4,
6570b57cec5SDimitry Andric      FPU_OFFSET(22),
6580b57cec5SDimitry Andric      eEncodingIEEE754,
6590b57cec5SDimitry Andric      eFormatFloat,
6600b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6610b57cec5SDimitry Andric       fpu_s22},
6620b57cec5SDimitry Andric      nullptr,
6630b57cec5SDimitry Andric      nullptr,
66406c3fb27SDimitry Andric      nullptr,
665349cc55cSDimitry Andric     },
6660b57cec5SDimitry Andric     {"s23",
6670b57cec5SDimitry Andric      nullptr,
6680b57cec5SDimitry Andric      4,
6690b57cec5SDimitry Andric      FPU_OFFSET(23),
6700b57cec5SDimitry Andric      eEncodingIEEE754,
6710b57cec5SDimitry Andric      eFormatFloat,
6720b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6730b57cec5SDimitry Andric       fpu_s23},
6740b57cec5SDimitry Andric      nullptr,
6750b57cec5SDimitry Andric      nullptr,
67606c3fb27SDimitry Andric      nullptr,
677349cc55cSDimitry Andric     },
6780b57cec5SDimitry Andric     {"s24",
6790b57cec5SDimitry Andric      nullptr,
6800b57cec5SDimitry Andric      4,
6810b57cec5SDimitry Andric      FPU_OFFSET(24),
6820b57cec5SDimitry Andric      eEncodingIEEE754,
6830b57cec5SDimitry Andric      eFormatFloat,
6840b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6850b57cec5SDimitry Andric       fpu_s24},
6860b57cec5SDimitry Andric      nullptr,
6870b57cec5SDimitry Andric      nullptr,
68806c3fb27SDimitry Andric      nullptr,
689349cc55cSDimitry Andric     },
6900b57cec5SDimitry Andric     {"s25",
6910b57cec5SDimitry Andric      nullptr,
6920b57cec5SDimitry Andric      4,
6930b57cec5SDimitry Andric      FPU_OFFSET(25),
6940b57cec5SDimitry Andric      eEncodingIEEE754,
6950b57cec5SDimitry Andric      eFormatFloat,
6960b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
6970b57cec5SDimitry Andric       fpu_s25},
6980b57cec5SDimitry Andric      nullptr,
6990b57cec5SDimitry Andric      nullptr,
70006c3fb27SDimitry Andric      nullptr,
701349cc55cSDimitry Andric     },
7020b57cec5SDimitry Andric     {"s26",
7030b57cec5SDimitry Andric      nullptr,
7040b57cec5SDimitry Andric      4,
7050b57cec5SDimitry Andric      FPU_OFFSET(26),
7060b57cec5SDimitry Andric      eEncodingIEEE754,
7070b57cec5SDimitry Andric      eFormatFloat,
7080b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7090b57cec5SDimitry Andric       fpu_s26},
7100b57cec5SDimitry Andric      nullptr,
7110b57cec5SDimitry Andric      nullptr,
71206c3fb27SDimitry Andric      nullptr,
713349cc55cSDimitry Andric     },
7140b57cec5SDimitry Andric     {"s27",
7150b57cec5SDimitry Andric      nullptr,
7160b57cec5SDimitry Andric      4,
7170b57cec5SDimitry Andric      FPU_OFFSET(27),
7180b57cec5SDimitry Andric      eEncodingIEEE754,
7190b57cec5SDimitry Andric      eFormatFloat,
7200b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7210b57cec5SDimitry Andric       fpu_s27},
7220b57cec5SDimitry Andric      nullptr,
7230b57cec5SDimitry Andric      nullptr,
72406c3fb27SDimitry Andric      nullptr,
725349cc55cSDimitry Andric     },
7260b57cec5SDimitry Andric     {"s28",
7270b57cec5SDimitry Andric      nullptr,
7280b57cec5SDimitry Andric      4,
7290b57cec5SDimitry Andric      FPU_OFFSET(28),
7300b57cec5SDimitry Andric      eEncodingIEEE754,
7310b57cec5SDimitry Andric      eFormatFloat,
7320b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7330b57cec5SDimitry Andric       fpu_s28},
7340b57cec5SDimitry Andric      nullptr,
7350b57cec5SDimitry Andric      nullptr,
73606c3fb27SDimitry Andric      nullptr,
737349cc55cSDimitry Andric     },
7380b57cec5SDimitry Andric     {"s29",
7390b57cec5SDimitry Andric      nullptr,
7400b57cec5SDimitry Andric      4,
7410b57cec5SDimitry Andric      FPU_OFFSET(29),
7420b57cec5SDimitry Andric      eEncodingIEEE754,
7430b57cec5SDimitry Andric      eFormatFloat,
7440b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7450b57cec5SDimitry Andric       fpu_s29},
7460b57cec5SDimitry Andric      nullptr,
7470b57cec5SDimitry Andric      nullptr,
74806c3fb27SDimitry Andric      nullptr,
749349cc55cSDimitry Andric     },
7500b57cec5SDimitry Andric     {"s30",
7510b57cec5SDimitry Andric      nullptr,
7520b57cec5SDimitry Andric      4,
7530b57cec5SDimitry Andric      FPU_OFFSET(30),
7540b57cec5SDimitry Andric      eEncodingIEEE754,
7550b57cec5SDimitry Andric      eFormatFloat,
7560b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7570b57cec5SDimitry Andric       fpu_s30},
7580b57cec5SDimitry Andric      nullptr,
7590b57cec5SDimitry Andric      nullptr,
76006c3fb27SDimitry Andric      nullptr,
761349cc55cSDimitry Andric     },
7620b57cec5SDimitry Andric     {"s31",
7630b57cec5SDimitry Andric      nullptr,
7640b57cec5SDimitry Andric      4,
7650b57cec5SDimitry Andric      FPU_OFFSET(31),
7660b57cec5SDimitry Andric      eEncodingIEEE754,
7670b57cec5SDimitry Andric      eFormatFloat,
7680b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7690b57cec5SDimitry Andric       fpu_s31},
7700b57cec5SDimitry Andric      nullptr,
7710b57cec5SDimitry Andric      nullptr,
77206c3fb27SDimitry Andric      nullptr,
773349cc55cSDimitry Andric     },
7740b57cec5SDimitry Andric     {"fpscr",
7750b57cec5SDimitry Andric      nullptr,
7760b57cec5SDimitry Andric      4,
7770b57cec5SDimitry Andric      FPU_OFFSET(32),
7780b57cec5SDimitry Andric      eEncodingUint,
7790b57cec5SDimitry Andric      eFormatHex,
7800b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7810b57cec5SDimitry Andric       LLDB_INVALID_REGNUM, fpu_fpscr},
7820b57cec5SDimitry Andric      nullptr,
7830b57cec5SDimitry Andric      nullptr,
78406c3fb27SDimitry Andric      nullptr,
785349cc55cSDimitry Andric     },
7860b57cec5SDimitry Andric 
7870b57cec5SDimitry Andric     {"exception",
7880b57cec5SDimitry Andric      nullptr,
7890b57cec5SDimitry Andric      4,
7900b57cec5SDimitry Andric      EXC_OFFSET(0),
7910b57cec5SDimitry Andric      eEncodingUint,
7920b57cec5SDimitry Andric      eFormatHex,
7930b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
7940b57cec5SDimitry Andric       LLDB_INVALID_REGNUM, exc_exception},
7950b57cec5SDimitry Andric      nullptr,
7960b57cec5SDimitry Andric      nullptr,
79706c3fb27SDimitry Andric      nullptr,
798349cc55cSDimitry Andric     },
7990b57cec5SDimitry Andric     {"fsr",
8000b57cec5SDimitry Andric      nullptr,
8010b57cec5SDimitry Andric      4,
8020b57cec5SDimitry Andric      EXC_OFFSET(1),
8030b57cec5SDimitry Andric      eEncodingUint,
8040b57cec5SDimitry Andric      eFormatHex,
8050b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
8060b57cec5SDimitry Andric       LLDB_INVALID_REGNUM, exc_fsr},
8070b57cec5SDimitry Andric      nullptr,
8080b57cec5SDimitry Andric      nullptr,
80906c3fb27SDimitry Andric      nullptr,
810349cc55cSDimitry Andric     },
8110b57cec5SDimitry Andric     {"far",
8120b57cec5SDimitry Andric      nullptr,
8130b57cec5SDimitry Andric      4,
8140b57cec5SDimitry Andric      EXC_OFFSET(2),
8150b57cec5SDimitry Andric      eEncodingUint,
8160b57cec5SDimitry Andric      eFormatHex,
8170b57cec5SDimitry Andric      {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
8180b57cec5SDimitry Andric       LLDB_INVALID_REGNUM, exc_far},
8190b57cec5SDimitry Andric      nullptr,
8200b57cec5SDimitry Andric      nullptr,
82106c3fb27SDimitry Andric      nullptr,
822349cc55cSDimitry Andric     },
8230b57cec5SDimitry Andric 
8240b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 0)},
8250b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 1)},
8260b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 2)},
8270b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 3)},
8280b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 4)},
8290b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 5)},
8300b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 6)},
8310b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 7)},
8320b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 8)},
8330b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 9)},
8340b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 10)},
8350b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 11)},
8360b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 12)},
8370b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 13)},
8380b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 14)},
8390b57cec5SDimitry Andric     {DEFINE_DBG(bvr, 15)},
8400b57cec5SDimitry Andric 
8410b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 0)},
8420b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 1)},
8430b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 2)},
8440b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 3)},
8450b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 4)},
8460b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 5)},
8470b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 6)},
8480b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 7)},
8490b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 8)},
8500b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 9)},
8510b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 10)},
8520b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 11)},
8530b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 12)},
8540b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 13)},
8550b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 14)},
8560b57cec5SDimitry Andric     {DEFINE_DBG(bcr, 15)},
8570b57cec5SDimitry Andric 
8580b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 0)},
8590b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 1)},
8600b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 2)},
8610b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 3)},
8620b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 4)},
8630b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 5)},
8640b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 6)},
8650b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 7)},
8660b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 8)},
8670b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 9)},
8680b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 10)},
8690b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 11)},
8700b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 12)},
8710b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 13)},
8720b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 14)},
8730b57cec5SDimitry Andric     {DEFINE_DBG(wvr, 15)},
8740b57cec5SDimitry Andric 
8750b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 0)},
8760b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 1)},
8770b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 2)},
8780b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 3)},
8790b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 4)},
8800b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 5)},
8810b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 6)},
8820b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 7)},
8830b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 8)},
8840b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 9)},
8850b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 10)},
8860b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 11)},
8870b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 12)},
8880b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 13)},
8890b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 14)},
8900b57cec5SDimitry Andric     {DEFINE_DBG(wcr, 15)}};
8910b57cec5SDimitry Andric 
8920b57cec5SDimitry Andric // General purpose registers
8930b57cec5SDimitry Andric static uint32_t g_gpr_regnums[] = {
8940b57cec5SDimitry Andric     gpr_r0, gpr_r1,  gpr_r2,  gpr_r3,  gpr_r4, gpr_r5, gpr_r6, gpr_r7,  gpr_r8,
8950b57cec5SDimitry Andric     gpr_r9, gpr_r10, gpr_r11, gpr_r12, gpr_sp, gpr_lr, gpr_pc, gpr_cpsr};
8960b57cec5SDimitry Andric 
8970b57cec5SDimitry Andric // Floating point registers
8980b57cec5SDimitry Andric static uint32_t g_fpu_regnums[] = {
8990b57cec5SDimitry Andric     fpu_s0,  fpu_s1,  fpu_s2,  fpu_s3,  fpu_s4,    fpu_s5,  fpu_s6,
9000b57cec5SDimitry Andric     fpu_s7,  fpu_s8,  fpu_s9,  fpu_s10, fpu_s11,   fpu_s12, fpu_s13,
9010b57cec5SDimitry Andric     fpu_s14, fpu_s15, fpu_s16, fpu_s17, fpu_s18,   fpu_s19, fpu_s20,
9020b57cec5SDimitry Andric     fpu_s21, fpu_s22, fpu_s23, fpu_s24, fpu_s25,   fpu_s26, fpu_s27,
9030b57cec5SDimitry Andric     fpu_s28, fpu_s29, fpu_s30, fpu_s31, fpu_fpscr,
9040b57cec5SDimitry Andric };
9050b57cec5SDimitry Andric 
9060b57cec5SDimitry Andric // Exception registers
9070b57cec5SDimitry Andric 
9080b57cec5SDimitry Andric static uint32_t g_exc_regnums[] = {
9090b57cec5SDimitry Andric     exc_exception, exc_fsr, exc_far,
9100b57cec5SDimitry Andric };
9110b57cec5SDimitry Andric 
912bdd1243dSDimitry Andric static size_t k_num_register_infos = std::size(g_register_infos);
9130b57cec5SDimitry Andric 
RegisterContextDarwin_arm(Thread & thread,uint32_t concrete_frame_idx)9140b57cec5SDimitry Andric RegisterContextDarwin_arm::RegisterContextDarwin_arm(
9150b57cec5SDimitry Andric     Thread &thread, uint32_t concrete_frame_idx)
9160b57cec5SDimitry Andric     : RegisterContext(thread, concrete_frame_idx), gpr(), fpu(), exc() {
9170b57cec5SDimitry Andric   uint32_t i;
9180b57cec5SDimitry Andric   for (i = 0; i < kNumErrors; i++) {
9190b57cec5SDimitry Andric     gpr_errs[i] = -1;
9200b57cec5SDimitry Andric     fpu_errs[i] = -1;
9210b57cec5SDimitry Andric     exc_errs[i] = -1;
9220b57cec5SDimitry Andric   }
9230b57cec5SDimitry Andric }
9240b57cec5SDimitry Andric 
925fe6060f1SDimitry Andric RegisterContextDarwin_arm::~RegisterContextDarwin_arm() = default;
9260b57cec5SDimitry Andric 
InvalidateAllRegisters()9270b57cec5SDimitry Andric void RegisterContextDarwin_arm::InvalidateAllRegisters() {
9280b57cec5SDimitry Andric   InvalidateAllRegisterStates();
9290b57cec5SDimitry Andric }
9300b57cec5SDimitry Andric 
GetRegisterCount()9310b57cec5SDimitry Andric size_t RegisterContextDarwin_arm::GetRegisterCount() {
9320b57cec5SDimitry Andric   assert(k_num_register_infos == k_num_registers);
9330b57cec5SDimitry Andric   return k_num_registers;
9340b57cec5SDimitry Andric }
9350b57cec5SDimitry Andric 
9360b57cec5SDimitry Andric const RegisterInfo *
GetRegisterInfoAtIndex(size_t reg)9370b57cec5SDimitry Andric RegisterContextDarwin_arm::GetRegisterInfoAtIndex(size_t reg) {
9380b57cec5SDimitry Andric   assert(k_num_register_infos == k_num_registers);
9390b57cec5SDimitry Andric   if (reg < k_num_registers)
9400b57cec5SDimitry Andric     return &g_register_infos[reg];
9410b57cec5SDimitry Andric   return nullptr;
9420b57cec5SDimitry Andric }
9430b57cec5SDimitry Andric 
GetRegisterInfosCount()9440b57cec5SDimitry Andric size_t RegisterContextDarwin_arm::GetRegisterInfosCount() {
9450b57cec5SDimitry Andric   return k_num_register_infos;
9460b57cec5SDimitry Andric }
9470b57cec5SDimitry Andric 
GetRegisterInfos()9480b57cec5SDimitry Andric const RegisterInfo *RegisterContextDarwin_arm::GetRegisterInfos() {
9490b57cec5SDimitry Andric   return g_register_infos;
9500b57cec5SDimitry Andric }
9510b57cec5SDimitry Andric 
9520b57cec5SDimitry Andric // Number of registers in each register set
953bdd1243dSDimitry Andric const size_t k_num_gpr_registers = std::size(g_gpr_regnums);
954bdd1243dSDimitry Andric const size_t k_num_fpu_registers = std::size(g_fpu_regnums);
955bdd1243dSDimitry Andric const size_t k_num_exc_registers = std::size(g_exc_regnums);
9560b57cec5SDimitry Andric 
9570b57cec5SDimitry Andric // Register set definitions. The first definitions at register set index of
9580b57cec5SDimitry Andric // zero is for all registers, followed by other registers sets. The register
9590b57cec5SDimitry Andric // information for the all register set need not be filled in.
9600b57cec5SDimitry Andric static const RegisterSet g_reg_sets[] = {
9610b57cec5SDimitry Andric     {
9620b57cec5SDimitry Andric         "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums,
9630b57cec5SDimitry Andric     },
9640b57cec5SDimitry Andric     {"Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums},
9650b57cec5SDimitry Andric     {"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums}};
9660b57cec5SDimitry Andric 
967bdd1243dSDimitry Andric const size_t k_num_regsets = std::size(g_reg_sets);
9680b57cec5SDimitry Andric 
GetRegisterSetCount()9690b57cec5SDimitry Andric size_t RegisterContextDarwin_arm::GetRegisterSetCount() {
9700b57cec5SDimitry Andric   return k_num_regsets;
9710b57cec5SDimitry Andric }
9720b57cec5SDimitry Andric 
GetRegisterSet(size_t reg_set)9730b57cec5SDimitry Andric const RegisterSet *RegisterContextDarwin_arm::GetRegisterSet(size_t reg_set) {
9740b57cec5SDimitry Andric   if (reg_set < k_num_regsets)
9750b57cec5SDimitry Andric     return &g_reg_sets[reg_set];
9760b57cec5SDimitry Andric   return nullptr;
9770b57cec5SDimitry Andric }
9780b57cec5SDimitry Andric 
9790b57cec5SDimitry Andric // Register information definitions for 32 bit i386.
GetSetForNativeRegNum(int reg)9800b57cec5SDimitry Andric int RegisterContextDarwin_arm::GetSetForNativeRegNum(int reg) {
9810b57cec5SDimitry Andric   if (reg < fpu_s0)
9820b57cec5SDimitry Andric     return GPRRegSet;
9830b57cec5SDimitry Andric   else if (reg < exc_exception)
9840b57cec5SDimitry Andric     return FPURegSet;
9850b57cec5SDimitry Andric   else if (reg < k_num_registers)
9860b57cec5SDimitry Andric     return EXCRegSet;
9870b57cec5SDimitry Andric   return -1;
9880b57cec5SDimitry Andric }
9890b57cec5SDimitry Andric 
ReadGPR(bool force)9900b57cec5SDimitry Andric int RegisterContextDarwin_arm::ReadGPR(bool force) {
9910b57cec5SDimitry Andric   int set = GPRRegSet;
9920b57cec5SDimitry Andric   if (force || !RegisterSetIsCached(set)) {
9930b57cec5SDimitry Andric     SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr));
9940b57cec5SDimitry Andric   }
9950b57cec5SDimitry Andric   return GetError(GPRRegSet, Read);
9960b57cec5SDimitry Andric }
9970b57cec5SDimitry Andric 
ReadFPU(bool force)9980b57cec5SDimitry Andric int RegisterContextDarwin_arm::ReadFPU(bool force) {
9990b57cec5SDimitry Andric   int set = FPURegSet;
10000b57cec5SDimitry Andric   if (force || !RegisterSetIsCached(set)) {
10010b57cec5SDimitry Andric     SetError(set, Read, DoReadFPU(GetThreadID(), set, fpu));
10020b57cec5SDimitry Andric   }
10030b57cec5SDimitry Andric   return GetError(FPURegSet, Read);
10040b57cec5SDimitry Andric }
10050b57cec5SDimitry Andric 
ReadEXC(bool force)10060b57cec5SDimitry Andric int RegisterContextDarwin_arm::ReadEXC(bool force) {
10070b57cec5SDimitry Andric   int set = EXCRegSet;
10080b57cec5SDimitry Andric   if (force || !RegisterSetIsCached(set)) {
10090b57cec5SDimitry Andric     SetError(set, Read, DoReadEXC(GetThreadID(), set, exc));
10100b57cec5SDimitry Andric   }
10110b57cec5SDimitry Andric   return GetError(EXCRegSet, Read);
10120b57cec5SDimitry Andric }
10130b57cec5SDimitry Andric 
ReadDBG(bool force)10140b57cec5SDimitry Andric int RegisterContextDarwin_arm::ReadDBG(bool force) {
10150b57cec5SDimitry Andric   int set = DBGRegSet;
10160b57cec5SDimitry Andric   if (force || !RegisterSetIsCached(set)) {
10170b57cec5SDimitry Andric     SetError(set, Read, DoReadDBG(GetThreadID(), set, dbg));
10180b57cec5SDimitry Andric   }
10190b57cec5SDimitry Andric   return GetError(DBGRegSet, Read);
10200b57cec5SDimitry Andric }
10210b57cec5SDimitry Andric 
WriteGPR()10220b57cec5SDimitry Andric int RegisterContextDarwin_arm::WriteGPR() {
10230b57cec5SDimitry Andric   int set = GPRRegSet;
10240b57cec5SDimitry Andric   if (!RegisterSetIsCached(set)) {
10250b57cec5SDimitry Andric     SetError(set, Write, -1);
10260b57cec5SDimitry Andric     return KERN_INVALID_ARGUMENT;
10270b57cec5SDimitry Andric   }
10280b57cec5SDimitry Andric   SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr));
10290b57cec5SDimitry Andric   SetError(set, Read, -1);
10300b57cec5SDimitry Andric   return GetError(GPRRegSet, Write);
10310b57cec5SDimitry Andric }
10320b57cec5SDimitry Andric 
WriteFPU()10330b57cec5SDimitry Andric int RegisterContextDarwin_arm::WriteFPU() {
10340b57cec5SDimitry Andric   int set = FPURegSet;
10350b57cec5SDimitry Andric   if (!RegisterSetIsCached(set)) {
10360b57cec5SDimitry Andric     SetError(set, Write, -1);
10370b57cec5SDimitry Andric     return KERN_INVALID_ARGUMENT;
10380b57cec5SDimitry Andric   }
10390b57cec5SDimitry Andric   SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpu));
10400b57cec5SDimitry Andric   SetError(set, Read, -1);
10410b57cec5SDimitry Andric   return GetError(FPURegSet, Write);
10420b57cec5SDimitry Andric }
10430b57cec5SDimitry Andric 
WriteEXC()10440b57cec5SDimitry Andric int RegisterContextDarwin_arm::WriteEXC() {
10450b57cec5SDimitry Andric   int set = EXCRegSet;
10460b57cec5SDimitry Andric   if (!RegisterSetIsCached(set)) {
10470b57cec5SDimitry Andric     SetError(set, Write, -1);
10480b57cec5SDimitry Andric     return KERN_INVALID_ARGUMENT;
10490b57cec5SDimitry Andric   }
10500b57cec5SDimitry Andric   SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc));
10510b57cec5SDimitry Andric   SetError(set, Read, -1);
10520b57cec5SDimitry Andric   return GetError(EXCRegSet, Write);
10530b57cec5SDimitry Andric }
10540b57cec5SDimitry Andric 
WriteDBG()10550b57cec5SDimitry Andric int RegisterContextDarwin_arm::WriteDBG() {
10560b57cec5SDimitry Andric   int set = DBGRegSet;
10570b57cec5SDimitry Andric   if (!RegisterSetIsCached(set)) {
10580b57cec5SDimitry Andric     SetError(set, Write, -1);
10590b57cec5SDimitry Andric     return KERN_INVALID_ARGUMENT;
10600b57cec5SDimitry Andric   }
10610b57cec5SDimitry Andric   SetError(set, Write, DoWriteDBG(GetThreadID(), set, dbg));
10620b57cec5SDimitry Andric   SetError(set, Read, -1);
10630b57cec5SDimitry Andric   return GetError(DBGRegSet, Write);
10640b57cec5SDimitry Andric }
10650b57cec5SDimitry Andric 
ReadRegisterSet(uint32_t set,bool force)10660b57cec5SDimitry Andric int RegisterContextDarwin_arm::ReadRegisterSet(uint32_t set, bool force) {
10670b57cec5SDimitry Andric   switch (set) {
10680b57cec5SDimitry Andric   case GPRRegSet:
10690b57cec5SDimitry Andric     return ReadGPR(force);
10700b57cec5SDimitry Andric   case GPRAltRegSet:
10710b57cec5SDimitry Andric     return ReadGPR(force);
10720b57cec5SDimitry Andric   case FPURegSet:
10730b57cec5SDimitry Andric     return ReadFPU(force);
10740b57cec5SDimitry Andric   case EXCRegSet:
10750b57cec5SDimitry Andric     return ReadEXC(force);
10760b57cec5SDimitry Andric   case DBGRegSet:
10770b57cec5SDimitry Andric     return ReadDBG(force);
10780b57cec5SDimitry Andric   default:
10790b57cec5SDimitry Andric     break;
10800b57cec5SDimitry Andric   }
10810b57cec5SDimitry Andric   return KERN_INVALID_ARGUMENT;
10820b57cec5SDimitry Andric }
10830b57cec5SDimitry Andric 
WriteRegisterSet(uint32_t set)10840b57cec5SDimitry Andric int RegisterContextDarwin_arm::WriteRegisterSet(uint32_t set) {
10850b57cec5SDimitry Andric   // Make sure we have a valid context to set.
10860b57cec5SDimitry Andric   if (RegisterSetIsCached(set)) {
10870b57cec5SDimitry Andric     switch (set) {
10880b57cec5SDimitry Andric     case GPRRegSet:
10890b57cec5SDimitry Andric       return WriteGPR();
10900b57cec5SDimitry Andric     case GPRAltRegSet:
10910b57cec5SDimitry Andric       return WriteGPR();
10920b57cec5SDimitry Andric     case FPURegSet:
10930b57cec5SDimitry Andric       return WriteFPU();
10940b57cec5SDimitry Andric     case EXCRegSet:
10950b57cec5SDimitry Andric       return WriteEXC();
10960b57cec5SDimitry Andric     case DBGRegSet:
10970b57cec5SDimitry Andric       return WriteDBG();
10980b57cec5SDimitry Andric     default:
10990b57cec5SDimitry Andric       break;
11000b57cec5SDimitry Andric     }
11010b57cec5SDimitry Andric   }
11020b57cec5SDimitry Andric   return KERN_INVALID_ARGUMENT;
11030b57cec5SDimitry Andric }
11040b57cec5SDimitry Andric 
LogDBGRegisters(Log * log,const DBG & dbg)11050b57cec5SDimitry Andric void RegisterContextDarwin_arm::LogDBGRegisters(Log *log, const DBG &dbg) {
11060b57cec5SDimitry Andric   if (log) {
11070b57cec5SDimitry Andric     for (uint32_t i = 0; i < 16; i++)
11089dba64beSDimitry Andric       LLDB_LOGF(log,
11099dba64beSDimitry Andric                 "BVR%-2u/BCR%-2u = { 0x%8.8x, 0x%8.8x } WVR%-2u/WCR%-2u = { "
11100b57cec5SDimitry Andric                 "0x%8.8x, 0x%8.8x }",
11110b57cec5SDimitry Andric                 i, i, dbg.bvr[i], dbg.bcr[i], i, i, dbg.wvr[i], dbg.wcr[i]);
11120b57cec5SDimitry Andric   }
11130b57cec5SDimitry Andric }
11140b57cec5SDimitry Andric 
ReadRegister(const RegisterInfo * reg_info,RegisterValue & value)11150b57cec5SDimitry Andric bool RegisterContextDarwin_arm::ReadRegister(const RegisterInfo *reg_info,
11160b57cec5SDimitry Andric                                              RegisterValue &value) {
11170b57cec5SDimitry Andric   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
11180b57cec5SDimitry Andric   int set = RegisterContextDarwin_arm::GetSetForNativeRegNum(reg);
11190b57cec5SDimitry Andric 
11200b57cec5SDimitry Andric   if (set == -1)
11210b57cec5SDimitry Andric     return false;
11220b57cec5SDimitry Andric 
11230b57cec5SDimitry Andric   if (ReadRegisterSet(set, false) != KERN_SUCCESS)
11240b57cec5SDimitry Andric     return false;
11250b57cec5SDimitry Andric 
11260b57cec5SDimitry Andric   switch (reg) {
11270b57cec5SDimitry Andric   case gpr_r0:
11280b57cec5SDimitry Andric   case gpr_r1:
11290b57cec5SDimitry Andric   case gpr_r2:
11300b57cec5SDimitry Andric   case gpr_r3:
11310b57cec5SDimitry Andric   case gpr_r4:
11320b57cec5SDimitry Andric   case gpr_r5:
11330b57cec5SDimitry Andric   case gpr_r6:
11340b57cec5SDimitry Andric   case gpr_r7:
11350b57cec5SDimitry Andric   case gpr_r8:
11360b57cec5SDimitry Andric   case gpr_r9:
11370b57cec5SDimitry Andric   case gpr_r10:
11380b57cec5SDimitry Andric   case gpr_r11:
11390b57cec5SDimitry Andric   case gpr_r12:
11400b57cec5SDimitry Andric   case gpr_sp:
11410b57cec5SDimitry Andric   case gpr_lr:
11420b57cec5SDimitry Andric   case gpr_pc:
11430b57cec5SDimitry Andric     value.SetUInt32(gpr.r[reg - gpr_r0]);
11440b57cec5SDimitry Andric     break;
1145480093f4SDimitry Andric   case gpr_cpsr:
1146480093f4SDimitry Andric     value.SetUInt32(gpr.cpsr);
1147480093f4SDimitry Andric     break;
11480b57cec5SDimitry Andric   case fpu_s0:
11490b57cec5SDimitry Andric   case fpu_s1:
11500b57cec5SDimitry Andric   case fpu_s2:
11510b57cec5SDimitry Andric   case fpu_s3:
11520b57cec5SDimitry Andric   case fpu_s4:
11530b57cec5SDimitry Andric   case fpu_s5:
11540b57cec5SDimitry Andric   case fpu_s6:
11550b57cec5SDimitry Andric   case fpu_s7:
11560b57cec5SDimitry Andric   case fpu_s8:
11570b57cec5SDimitry Andric   case fpu_s9:
11580b57cec5SDimitry Andric   case fpu_s10:
11590b57cec5SDimitry Andric   case fpu_s11:
11600b57cec5SDimitry Andric   case fpu_s12:
11610b57cec5SDimitry Andric   case fpu_s13:
11620b57cec5SDimitry Andric   case fpu_s14:
11630b57cec5SDimitry Andric   case fpu_s15:
11640b57cec5SDimitry Andric   case fpu_s16:
11650b57cec5SDimitry Andric   case fpu_s17:
11660b57cec5SDimitry Andric   case fpu_s18:
11670b57cec5SDimitry Andric   case fpu_s19:
11680b57cec5SDimitry Andric   case fpu_s20:
11690b57cec5SDimitry Andric   case fpu_s21:
11700b57cec5SDimitry Andric   case fpu_s22:
11710b57cec5SDimitry Andric   case fpu_s23:
11720b57cec5SDimitry Andric   case fpu_s24:
11730b57cec5SDimitry Andric   case fpu_s25:
11740b57cec5SDimitry Andric   case fpu_s26:
11750b57cec5SDimitry Andric   case fpu_s27:
11760b57cec5SDimitry Andric   case fpu_s28:
11770b57cec5SDimitry Andric   case fpu_s29:
11780b57cec5SDimitry Andric   case fpu_s30:
11790b57cec5SDimitry Andric   case fpu_s31:
11800b57cec5SDimitry Andric     value.SetUInt32(fpu.floats.s[reg], RegisterValue::eTypeFloat);
11810b57cec5SDimitry Andric     break;
11820b57cec5SDimitry Andric 
11830b57cec5SDimitry Andric   case fpu_fpscr:
11840b57cec5SDimitry Andric     value.SetUInt32(fpu.fpscr);
11850b57cec5SDimitry Andric     break;
11860b57cec5SDimitry Andric 
11870b57cec5SDimitry Andric   case exc_exception:
11880b57cec5SDimitry Andric     value.SetUInt32(exc.exception);
11890b57cec5SDimitry Andric     break;
11900b57cec5SDimitry Andric   case exc_fsr:
11910b57cec5SDimitry Andric     value.SetUInt32(exc.fsr);
11920b57cec5SDimitry Andric     break;
11930b57cec5SDimitry Andric   case exc_far:
11940b57cec5SDimitry Andric     value.SetUInt32(exc.far);
11950b57cec5SDimitry Andric     break;
11960b57cec5SDimitry Andric 
11970b57cec5SDimitry Andric   default:
11980b57cec5SDimitry Andric     value.SetValueToInvalid();
11990b57cec5SDimitry Andric     return false;
12000b57cec5SDimitry Andric   }
12010b57cec5SDimitry Andric   return true;
12020b57cec5SDimitry Andric }
12030b57cec5SDimitry Andric 
WriteRegister(const RegisterInfo * reg_info,const RegisterValue & value)12040b57cec5SDimitry Andric bool RegisterContextDarwin_arm::WriteRegister(const RegisterInfo *reg_info,
12050b57cec5SDimitry Andric                                               const RegisterValue &value) {
12060b57cec5SDimitry Andric   const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
12070b57cec5SDimitry Andric   int set = GetSetForNativeRegNum(reg);
12080b57cec5SDimitry Andric 
12090b57cec5SDimitry Andric   if (set == -1)
12100b57cec5SDimitry Andric     return false;
12110b57cec5SDimitry Andric 
12120b57cec5SDimitry Andric   if (ReadRegisterSet(set, false) != KERN_SUCCESS)
12130b57cec5SDimitry Andric     return false;
12140b57cec5SDimitry Andric 
12150b57cec5SDimitry Andric   switch (reg) {
12160b57cec5SDimitry Andric   case gpr_r0:
12170b57cec5SDimitry Andric   case gpr_r1:
12180b57cec5SDimitry Andric   case gpr_r2:
12190b57cec5SDimitry Andric   case gpr_r3:
12200b57cec5SDimitry Andric   case gpr_r4:
12210b57cec5SDimitry Andric   case gpr_r5:
12220b57cec5SDimitry Andric   case gpr_r6:
12230b57cec5SDimitry Andric   case gpr_r7:
12240b57cec5SDimitry Andric   case gpr_r8:
12250b57cec5SDimitry Andric   case gpr_r9:
12260b57cec5SDimitry Andric   case gpr_r10:
12270b57cec5SDimitry Andric   case gpr_r11:
12280b57cec5SDimitry Andric   case gpr_r12:
12290b57cec5SDimitry Andric   case gpr_sp:
12300b57cec5SDimitry Andric   case gpr_lr:
12310b57cec5SDimitry Andric   case gpr_pc:
12320b57cec5SDimitry Andric   case gpr_cpsr:
12330b57cec5SDimitry Andric     gpr.r[reg - gpr_r0] = value.GetAsUInt32();
12340b57cec5SDimitry Andric     break;
12350b57cec5SDimitry Andric 
12360b57cec5SDimitry Andric   case fpu_s0:
12370b57cec5SDimitry Andric   case fpu_s1:
12380b57cec5SDimitry Andric   case fpu_s2:
12390b57cec5SDimitry Andric   case fpu_s3:
12400b57cec5SDimitry Andric   case fpu_s4:
12410b57cec5SDimitry Andric   case fpu_s5:
12420b57cec5SDimitry Andric   case fpu_s6:
12430b57cec5SDimitry Andric   case fpu_s7:
12440b57cec5SDimitry Andric   case fpu_s8:
12450b57cec5SDimitry Andric   case fpu_s9:
12460b57cec5SDimitry Andric   case fpu_s10:
12470b57cec5SDimitry Andric   case fpu_s11:
12480b57cec5SDimitry Andric   case fpu_s12:
12490b57cec5SDimitry Andric   case fpu_s13:
12500b57cec5SDimitry Andric   case fpu_s14:
12510b57cec5SDimitry Andric   case fpu_s15:
12520b57cec5SDimitry Andric   case fpu_s16:
12530b57cec5SDimitry Andric   case fpu_s17:
12540b57cec5SDimitry Andric   case fpu_s18:
12550b57cec5SDimitry Andric   case fpu_s19:
12560b57cec5SDimitry Andric   case fpu_s20:
12570b57cec5SDimitry Andric   case fpu_s21:
12580b57cec5SDimitry Andric   case fpu_s22:
12590b57cec5SDimitry Andric   case fpu_s23:
12600b57cec5SDimitry Andric   case fpu_s24:
12610b57cec5SDimitry Andric   case fpu_s25:
12620b57cec5SDimitry Andric   case fpu_s26:
12630b57cec5SDimitry Andric   case fpu_s27:
12640b57cec5SDimitry Andric   case fpu_s28:
12650b57cec5SDimitry Andric   case fpu_s29:
12660b57cec5SDimitry Andric   case fpu_s30:
12670b57cec5SDimitry Andric   case fpu_s31:
12680b57cec5SDimitry Andric     fpu.floats.s[reg] = value.GetAsUInt32();
12690b57cec5SDimitry Andric     break;
12700b57cec5SDimitry Andric 
12710b57cec5SDimitry Andric   case fpu_fpscr:
12720b57cec5SDimitry Andric     fpu.fpscr = value.GetAsUInt32();
12730b57cec5SDimitry Andric     break;
12740b57cec5SDimitry Andric 
12750b57cec5SDimitry Andric   case exc_exception:
12760b57cec5SDimitry Andric     exc.exception = value.GetAsUInt32();
12770b57cec5SDimitry Andric     break;
12780b57cec5SDimitry Andric   case exc_fsr:
12790b57cec5SDimitry Andric     exc.fsr = value.GetAsUInt32();
12800b57cec5SDimitry Andric     break;
12810b57cec5SDimitry Andric   case exc_far:
12820b57cec5SDimitry Andric     exc.far = value.GetAsUInt32();
12830b57cec5SDimitry Andric     break;
12840b57cec5SDimitry Andric 
12850b57cec5SDimitry Andric   default:
12860b57cec5SDimitry Andric     return false;
12870b57cec5SDimitry Andric   }
12880b57cec5SDimitry Andric   return WriteRegisterSet(set) == KERN_SUCCESS;
12890b57cec5SDimitry Andric }
12900b57cec5SDimitry Andric 
ReadAllRegisterValues(lldb::WritableDataBufferSP & data_sp)12910b57cec5SDimitry Andric bool RegisterContextDarwin_arm::ReadAllRegisterValues(
129281ad6265SDimitry Andric     lldb::WritableDataBufferSP &data_sp) {
12930b57cec5SDimitry Andric   data_sp = std::make_shared<DataBufferHeap>(REG_CONTEXT_SIZE, 0);
12940b57cec5SDimitry Andric   if (data_sp && ReadGPR(false) == KERN_SUCCESS &&
12950b57cec5SDimitry Andric       ReadFPU(false) == KERN_SUCCESS && ReadEXC(false) == KERN_SUCCESS) {
12960b57cec5SDimitry Andric     uint8_t *dst = data_sp->GetBytes();
12970b57cec5SDimitry Andric     ::memcpy(dst, &gpr, sizeof(gpr));
12980b57cec5SDimitry Andric     dst += sizeof(gpr);
12990b57cec5SDimitry Andric 
13000b57cec5SDimitry Andric     ::memcpy(dst, &fpu, sizeof(fpu));
13010b57cec5SDimitry Andric     dst += sizeof(gpr);
13020b57cec5SDimitry Andric 
13030b57cec5SDimitry Andric     ::memcpy(dst, &exc, sizeof(exc));
13040b57cec5SDimitry Andric     return true;
13050b57cec5SDimitry Andric   }
13060b57cec5SDimitry Andric   return false;
13070b57cec5SDimitry Andric }
13080b57cec5SDimitry Andric 
WriteAllRegisterValues(const lldb::DataBufferSP & data_sp)13090b57cec5SDimitry Andric bool RegisterContextDarwin_arm::WriteAllRegisterValues(
13100b57cec5SDimitry Andric     const lldb::DataBufferSP &data_sp) {
13110b57cec5SDimitry Andric   if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) {
13120b57cec5SDimitry Andric     const uint8_t *src = data_sp->GetBytes();
13130b57cec5SDimitry Andric     ::memcpy(&gpr, src, sizeof(gpr));
13140b57cec5SDimitry Andric     src += sizeof(gpr);
13150b57cec5SDimitry Andric 
13160b57cec5SDimitry Andric     ::memcpy(&fpu, src, sizeof(fpu));
13170b57cec5SDimitry Andric     src += sizeof(gpr);
13180b57cec5SDimitry Andric 
13190b57cec5SDimitry Andric     ::memcpy(&exc, src, sizeof(exc));
13200b57cec5SDimitry Andric     uint32_t success_count = 0;
13210b57cec5SDimitry Andric     if (WriteGPR() == KERN_SUCCESS)
13220b57cec5SDimitry Andric       ++success_count;
13230b57cec5SDimitry Andric     if (WriteFPU() == KERN_SUCCESS)
13240b57cec5SDimitry Andric       ++success_count;
13250b57cec5SDimitry Andric     if (WriteEXC() == KERN_SUCCESS)
13260b57cec5SDimitry Andric       ++success_count;
13270b57cec5SDimitry Andric     return success_count == 3;
13280b57cec5SDimitry Andric   }
13290b57cec5SDimitry Andric   return false;
13300b57cec5SDimitry Andric }
13310b57cec5SDimitry Andric 
ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,uint32_t reg)13320b57cec5SDimitry Andric uint32_t RegisterContextDarwin_arm::ConvertRegisterKindToRegisterNumber(
13330b57cec5SDimitry Andric     lldb::RegisterKind kind, uint32_t reg) {
13340b57cec5SDimitry Andric   if (kind == eRegisterKindGeneric) {
13350b57cec5SDimitry Andric     switch (reg) {
13360b57cec5SDimitry Andric     case LLDB_REGNUM_GENERIC_PC:
13370b57cec5SDimitry Andric       return gpr_pc;
13380b57cec5SDimitry Andric     case LLDB_REGNUM_GENERIC_SP:
13390b57cec5SDimitry Andric       return gpr_sp;
13400b57cec5SDimitry Andric     case LLDB_REGNUM_GENERIC_FP:
13410b57cec5SDimitry Andric       return gpr_r7;
13420b57cec5SDimitry Andric     case LLDB_REGNUM_GENERIC_RA:
13430b57cec5SDimitry Andric       return gpr_lr;
13440b57cec5SDimitry Andric     case LLDB_REGNUM_GENERIC_FLAGS:
13450b57cec5SDimitry Andric       return gpr_cpsr;
13460b57cec5SDimitry Andric     default:
13470b57cec5SDimitry Andric       break;
13480b57cec5SDimitry Andric     }
13490b57cec5SDimitry Andric   } else if (kind == eRegisterKindDWARF) {
13500b57cec5SDimitry Andric     switch (reg) {
13510b57cec5SDimitry Andric     case dwarf_r0:
13520b57cec5SDimitry Andric       return gpr_r0;
13530b57cec5SDimitry Andric     case dwarf_r1:
13540b57cec5SDimitry Andric       return gpr_r1;
13550b57cec5SDimitry Andric     case dwarf_r2:
13560b57cec5SDimitry Andric       return gpr_r2;
13570b57cec5SDimitry Andric     case dwarf_r3:
13580b57cec5SDimitry Andric       return gpr_r3;
13590b57cec5SDimitry Andric     case dwarf_r4:
13600b57cec5SDimitry Andric       return gpr_r4;
13610b57cec5SDimitry Andric     case dwarf_r5:
13620b57cec5SDimitry Andric       return gpr_r5;
13630b57cec5SDimitry Andric     case dwarf_r6:
13640b57cec5SDimitry Andric       return gpr_r6;
13650b57cec5SDimitry Andric     case dwarf_r7:
13660b57cec5SDimitry Andric       return gpr_r7;
13670b57cec5SDimitry Andric     case dwarf_r8:
13680b57cec5SDimitry Andric       return gpr_r8;
13690b57cec5SDimitry Andric     case dwarf_r9:
13700b57cec5SDimitry Andric       return gpr_r9;
13710b57cec5SDimitry Andric     case dwarf_r10:
13720b57cec5SDimitry Andric       return gpr_r10;
13730b57cec5SDimitry Andric     case dwarf_r11:
13740b57cec5SDimitry Andric       return gpr_r11;
13750b57cec5SDimitry Andric     case dwarf_r12:
13760b57cec5SDimitry Andric       return gpr_r12;
13770b57cec5SDimitry Andric     case dwarf_sp:
13780b57cec5SDimitry Andric       return gpr_sp;
13790b57cec5SDimitry Andric     case dwarf_lr:
13800b57cec5SDimitry Andric       return gpr_lr;
13810b57cec5SDimitry Andric     case dwarf_pc:
13820b57cec5SDimitry Andric       return gpr_pc;
13830b57cec5SDimitry Andric     case dwarf_spsr:
13840b57cec5SDimitry Andric       return gpr_cpsr;
13850b57cec5SDimitry Andric 
13860b57cec5SDimitry Andric     case dwarf_s0:
13870b57cec5SDimitry Andric       return fpu_s0;
13880b57cec5SDimitry Andric     case dwarf_s1:
13890b57cec5SDimitry Andric       return fpu_s1;
13900b57cec5SDimitry Andric     case dwarf_s2:
13910b57cec5SDimitry Andric       return fpu_s2;
13920b57cec5SDimitry Andric     case dwarf_s3:
13930b57cec5SDimitry Andric       return fpu_s3;
13940b57cec5SDimitry Andric     case dwarf_s4:
13950b57cec5SDimitry Andric       return fpu_s4;
13960b57cec5SDimitry Andric     case dwarf_s5:
13970b57cec5SDimitry Andric       return fpu_s5;
13980b57cec5SDimitry Andric     case dwarf_s6:
13990b57cec5SDimitry Andric       return fpu_s6;
14000b57cec5SDimitry Andric     case dwarf_s7:
14010b57cec5SDimitry Andric       return fpu_s7;
14020b57cec5SDimitry Andric     case dwarf_s8:
14030b57cec5SDimitry Andric       return fpu_s8;
14040b57cec5SDimitry Andric     case dwarf_s9:
14050b57cec5SDimitry Andric       return fpu_s9;
14060b57cec5SDimitry Andric     case dwarf_s10:
14070b57cec5SDimitry Andric       return fpu_s10;
14080b57cec5SDimitry Andric     case dwarf_s11:
14090b57cec5SDimitry Andric       return fpu_s11;
14100b57cec5SDimitry Andric     case dwarf_s12:
14110b57cec5SDimitry Andric       return fpu_s12;
14120b57cec5SDimitry Andric     case dwarf_s13:
14130b57cec5SDimitry Andric       return fpu_s13;
14140b57cec5SDimitry Andric     case dwarf_s14:
14150b57cec5SDimitry Andric       return fpu_s14;
14160b57cec5SDimitry Andric     case dwarf_s15:
14170b57cec5SDimitry Andric       return fpu_s15;
14180b57cec5SDimitry Andric     case dwarf_s16:
14190b57cec5SDimitry Andric       return fpu_s16;
14200b57cec5SDimitry Andric     case dwarf_s17:
14210b57cec5SDimitry Andric       return fpu_s17;
14220b57cec5SDimitry Andric     case dwarf_s18:
14230b57cec5SDimitry Andric       return fpu_s18;
14240b57cec5SDimitry Andric     case dwarf_s19:
14250b57cec5SDimitry Andric       return fpu_s19;
14260b57cec5SDimitry Andric     case dwarf_s20:
14270b57cec5SDimitry Andric       return fpu_s20;
14280b57cec5SDimitry Andric     case dwarf_s21:
14290b57cec5SDimitry Andric       return fpu_s21;
14300b57cec5SDimitry Andric     case dwarf_s22:
14310b57cec5SDimitry Andric       return fpu_s22;
14320b57cec5SDimitry Andric     case dwarf_s23:
14330b57cec5SDimitry Andric       return fpu_s23;
14340b57cec5SDimitry Andric     case dwarf_s24:
14350b57cec5SDimitry Andric       return fpu_s24;
14360b57cec5SDimitry Andric     case dwarf_s25:
14370b57cec5SDimitry Andric       return fpu_s25;
14380b57cec5SDimitry Andric     case dwarf_s26:
14390b57cec5SDimitry Andric       return fpu_s26;
14400b57cec5SDimitry Andric     case dwarf_s27:
14410b57cec5SDimitry Andric       return fpu_s27;
14420b57cec5SDimitry Andric     case dwarf_s28:
14430b57cec5SDimitry Andric       return fpu_s28;
14440b57cec5SDimitry Andric     case dwarf_s29:
14450b57cec5SDimitry Andric       return fpu_s29;
14460b57cec5SDimitry Andric     case dwarf_s30:
14470b57cec5SDimitry Andric       return fpu_s30;
14480b57cec5SDimitry Andric     case dwarf_s31:
14490b57cec5SDimitry Andric       return fpu_s31;
14500b57cec5SDimitry Andric 
14510b57cec5SDimitry Andric     default:
14520b57cec5SDimitry Andric       break;
14530b57cec5SDimitry Andric     }
14540b57cec5SDimitry Andric   } else if (kind == eRegisterKindEHFrame) {
14550b57cec5SDimitry Andric     switch (reg) {
14560b57cec5SDimitry Andric     case ehframe_r0:
14570b57cec5SDimitry Andric       return gpr_r0;
14580b57cec5SDimitry Andric     case ehframe_r1:
14590b57cec5SDimitry Andric       return gpr_r1;
14600b57cec5SDimitry Andric     case ehframe_r2:
14610b57cec5SDimitry Andric       return gpr_r2;
14620b57cec5SDimitry Andric     case ehframe_r3:
14630b57cec5SDimitry Andric       return gpr_r3;
14640b57cec5SDimitry Andric     case ehframe_r4:
14650b57cec5SDimitry Andric       return gpr_r4;
14660b57cec5SDimitry Andric     case ehframe_r5:
14670b57cec5SDimitry Andric       return gpr_r5;
14680b57cec5SDimitry Andric     case ehframe_r6:
14690b57cec5SDimitry Andric       return gpr_r6;
14700b57cec5SDimitry Andric     case ehframe_r7:
14710b57cec5SDimitry Andric       return gpr_r7;
14720b57cec5SDimitry Andric     case ehframe_r8:
14730b57cec5SDimitry Andric       return gpr_r8;
14740b57cec5SDimitry Andric     case ehframe_r9:
14750b57cec5SDimitry Andric       return gpr_r9;
14760b57cec5SDimitry Andric     case ehframe_r10:
14770b57cec5SDimitry Andric       return gpr_r10;
14780b57cec5SDimitry Andric     case ehframe_r11:
14790b57cec5SDimitry Andric       return gpr_r11;
14800b57cec5SDimitry Andric     case ehframe_r12:
14810b57cec5SDimitry Andric       return gpr_r12;
14820b57cec5SDimitry Andric     case ehframe_sp:
14830b57cec5SDimitry Andric       return gpr_sp;
14840b57cec5SDimitry Andric     case ehframe_lr:
14850b57cec5SDimitry Andric       return gpr_lr;
14860b57cec5SDimitry Andric     case ehframe_pc:
14870b57cec5SDimitry Andric       return gpr_pc;
14880b57cec5SDimitry Andric     case ehframe_cpsr:
14890b57cec5SDimitry Andric       return gpr_cpsr;
14900b57cec5SDimitry Andric     }
14910b57cec5SDimitry Andric   } else if (kind == eRegisterKindLLDB) {
14920b57cec5SDimitry Andric     return reg;
14930b57cec5SDimitry Andric   }
14940b57cec5SDimitry Andric   return LLDB_INVALID_REGNUM;
14950b57cec5SDimitry Andric }
14960b57cec5SDimitry Andric 
NumSupportedHardwareBreakpoints()14970b57cec5SDimitry Andric uint32_t RegisterContextDarwin_arm::NumSupportedHardwareBreakpoints() {
14980b57cec5SDimitry Andric #if defined(__APPLE__) && defined(__arm__)
14990b57cec5SDimitry Andric   // Set the init value to something that will let us know that we need to
15000b57cec5SDimitry Andric   // autodetect how many breakpoints are supported dynamically...
15010b57cec5SDimitry Andric   static uint32_t g_num_supported_hw_breakpoints = UINT32_MAX;
15020b57cec5SDimitry Andric   if (g_num_supported_hw_breakpoints == UINT32_MAX) {
15030b57cec5SDimitry Andric     // Set this to zero in case we can't tell if there are any HW breakpoints
15040b57cec5SDimitry Andric     g_num_supported_hw_breakpoints = 0;
15050b57cec5SDimitry Andric 
15060b57cec5SDimitry Andric     uint32_t register_DBGDIDR;
15070b57cec5SDimitry Andric 
15080b57cec5SDimitry Andric     asm("mrc p14, 0, %0, c0, c0, 0" : "=r"(register_DBGDIDR));
15090b57cec5SDimitry Andric     g_num_supported_hw_breakpoints = Bits32(register_DBGDIDR, 27, 24);
15100b57cec5SDimitry Andric     // Zero is reserved for the BRP count, so don't increment it if it is zero
15110b57cec5SDimitry Andric     if (g_num_supported_hw_breakpoints > 0)
15120b57cec5SDimitry Andric       g_num_supported_hw_breakpoints++;
15130b57cec5SDimitry Andric   }
15140b57cec5SDimitry Andric   return g_num_supported_hw_breakpoints;
15150b57cec5SDimitry Andric #else
15160b57cec5SDimitry Andric   // TODO: figure out remote case here!
15170b57cec5SDimitry Andric   return 6;
15180b57cec5SDimitry Andric #endif
15190b57cec5SDimitry Andric }
15200b57cec5SDimitry Andric 
SetHardwareBreakpoint(lldb::addr_t addr,size_t size)15210b57cec5SDimitry Andric uint32_t RegisterContextDarwin_arm::SetHardwareBreakpoint(lldb::addr_t addr,
15220b57cec5SDimitry Andric                                                           size_t size) {
15230b57cec5SDimitry Andric   // Make sure our address isn't bogus
15240b57cec5SDimitry Andric   if (addr & 1)
15250b57cec5SDimitry Andric     return LLDB_INVALID_INDEX32;
15260b57cec5SDimitry Andric 
15270b57cec5SDimitry Andric   int kret = ReadDBG(false);
15280b57cec5SDimitry Andric 
15290b57cec5SDimitry Andric   if (kret == KERN_SUCCESS) {
15300b57cec5SDimitry Andric     const uint32_t num_hw_breakpoints = NumSupportedHardwareBreakpoints();
15310b57cec5SDimitry Andric     uint32_t i;
15320b57cec5SDimitry Andric     for (i = 0; i < num_hw_breakpoints; ++i) {
15330b57cec5SDimitry Andric       if ((dbg.bcr[i] & BCR_ENABLE) == 0)
15340b57cec5SDimitry Andric         break; // We found an available hw breakpoint slot (in i)
15350b57cec5SDimitry Andric     }
15360b57cec5SDimitry Andric 
15370b57cec5SDimitry Andric     // See if we found an available hw breakpoint slot above
15380b57cec5SDimitry Andric     if (i < num_hw_breakpoints) {
15390b57cec5SDimitry Andric       // Make sure bits 1:0 are clear in our address
15400b57cec5SDimitry Andric       dbg.bvr[i] = addr & ~((lldb::addr_t)3);
15410b57cec5SDimitry Andric 
15420b57cec5SDimitry Andric       if (size == 2 || addr & 2) {
15430b57cec5SDimitry Andric         uint32_t byte_addr_select = (addr & 2) ? BAS_IMVA_2_3 : BAS_IMVA_0_1;
15440b57cec5SDimitry Andric 
15450b57cec5SDimitry Andric         // We have a thumb breakpoint
15460b57cec5SDimitry Andric         // We have an ARM breakpoint
1547bdd1243dSDimitry Andric         dbg.bcr[i] = BCR_M_IMVA_MATCH | // Stop on address match
15480b57cec5SDimitry Andric                      byte_addr_select | // Set the correct byte address select
15490b57cec5SDimitry Andric                                         // so we only trigger on the correct
15500b57cec5SDimitry Andric                                         // opcode
15510b57cec5SDimitry Andric                      S_USER |    // Which modes should this breakpoint stop in?
15520b57cec5SDimitry Andric                      BCR_ENABLE; // Enable this hardware breakpoint
15530b57cec5SDimitry Andric                                  //                if (log) log->Printf
15540b57cec5SDimitry Andric         //                ("RegisterContextDarwin_arm::EnableHardwareBreakpoint(
15550b57cec5SDimitry Andric         //                addr = %8.8p, size = %u ) - BVR%u/BCR%u = 0x%8.8x /
15560b57cec5SDimitry Andric         //                0x%8.8x (Thumb)",
15570b57cec5SDimitry Andric         //                        addr,
15580b57cec5SDimitry Andric         //                        size,
15590b57cec5SDimitry Andric         //                        i,
15600b57cec5SDimitry Andric         //                        i,
15610b57cec5SDimitry Andric         //                        dbg.bvr[i],
15620b57cec5SDimitry Andric         //                        dbg.bcr[i]);
15630b57cec5SDimitry Andric       } else if (size == 4) {
15640b57cec5SDimitry Andric         // We have an ARM breakpoint
15650b57cec5SDimitry Andric         dbg.bcr[i] =
1566bdd1243dSDimitry Andric             BCR_M_IMVA_MATCH | // Stop on address match
15670b57cec5SDimitry Andric             BAS_IMVA_ALL | // Stop on any of the four bytes following the IMVA
15680b57cec5SDimitry Andric             S_USER |       // Which modes should this breakpoint stop in?
15690b57cec5SDimitry Andric             BCR_ENABLE;    // Enable this hardware breakpoint
15700b57cec5SDimitry Andric                            //                if (log) log->Printf
15710b57cec5SDimitry Andric         //                ("RegisterContextDarwin_arm::EnableHardwareBreakpoint(
15720b57cec5SDimitry Andric         //                addr = %8.8p, size = %u ) - BVR%u/BCR%u = 0x%8.8x /
15730b57cec5SDimitry Andric         //                0x%8.8x (ARM)",
15740b57cec5SDimitry Andric         //                        addr,
15750b57cec5SDimitry Andric         //                        size,
15760b57cec5SDimitry Andric         //                        i,
15770b57cec5SDimitry Andric         //                        i,
15780b57cec5SDimitry Andric         //                        dbg.bvr[i],
15790b57cec5SDimitry Andric         //                        dbg.bcr[i]);
15800b57cec5SDimitry Andric       }
15810b57cec5SDimitry Andric 
15820b57cec5SDimitry Andric       kret = WriteDBG();
15830b57cec5SDimitry Andric       //            if (log) log->Printf
15840b57cec5SDimitry Andric       //            ("RegisterContextDarwin_arm::EnableHardwareBreakpoint()
15850b57cec5SDimitry Andric       //            WriteDBG() => 0x%8.8x.", kret);
15860b57cec5SDimitry Andric 
15870b57cec5SDimitry Andric       if (kret == KERN_SUCCESS)
15880b57cec5SDimitry Andric         return i;
15890b57cec5SDimitry Andric     }
15900b57cec5SDimitry Andric     //        else
15910b57cec5SDimitry Andric     //        {
15920b57cec5SDimitry Andric     //            if (log) log->Printf
15930b57cec5SDimitry Andric     //            ("RegisterContextDarwin_arm::EnableHardwareBreakpoint(addr =
15940b57cec5SDimitry Andric     //            %8.8p, size = %u) => all hardware breakpoint resources are
15950b57cec5SDimitry Andric     //            being used.", addr, size);
15960b57cec5SDimitry Andric     //        }
15970b57cec5SDimitry Andric   }
15980b57cec5SDimitry Andric 
15990b57cec5SDimitry Andric   return LLDB_INVALID_INDEX32;
16000b57cec5SDimitry Andric }
16010b57cec5SDimitry Andric 
ClearHardwareBreakpoint(uint32_t hw_index)16020b57cec5SDimitry Andric bool RegisterContextDarwin_arm::ClearHardwareBreakpoint(uint32_t hw_index) {
16030b57cec5SDimitry Andric   int kret = ReadDBG(false);
16040b57cec5SDimitry Andric 
16050b57cec5SDimitry Andric   const uint32_t num_hw_points = NumSupportedHardwareBreakpoints();
16060b57cec5SDimitry Andric   if (kret == KERN_SUCCESS) {
16070b57cec5SDimitry Andric     if (hw_index < num_hw_points) {
16080b57cec5SDimitry Andric       dbg.bcr[hw_index] = 0;
16090b57cec5SDimitry Andric       //            if (log) log->Printf
16100b57cec5SDimitry Andric       //            ("RegisterContextDarwin_arm::SetHardwareBreakpoint( %u ) -
16110b57cec5SDimitry Andric       //            BVR%u = 0x%8.8x  BCR%u = 0x%8.8x",
16120b57cec5SDimitry Andric       //                    hw_index,
16130b57cec5SDimitry Andric       //                    hw_index,
16140b57cec5SDimitry Andric       //                    dbg.bvr[hw_index],
16150b57cec5SDimitry Andric       //                    hw_index,
16160b57cec5SDimitry Andric       //                    dbg.bcr[hw_index]);
16170b57cec5SDimitry Andric 
16180b57cec5SDimitry Andric       kret = WriteDBG();
16190b57cec5SDimitry Andric 
16200b57cec5SDimitry Andric       if (kret == KERN_SUCCESS)
16210b57cec5SDimitry Andric         return true;
16220b57cec5SDimitry Andric     }
16230b57cec5SDimitry Andric   }
16240b57cec5SDimitry Andric   return false;
16250b57cec5SDimitry Andric }
16260b57cec5SDimitry Andric 
NumSupportedHardwareWatchpoints()16270b57cec5SDimitry Andric uint32_t RegisterContextDarwin_arm::NumSupportedHardwareWatchpoints() {
16280b57cec5SDimitry Andric #if defined(__APPLE__) && defined(__arm__)
16290b57cec5SDimitry Andric   // Set the init value to something that will let us know that we need to
16300b57cec5SDimitry Andric   // autodetect how many watchpoints are supported dynamically...
16310b57cec5SDimitry Andric   static uint32_t g_num_supported_hw_watchpoints = UINT32_MAX;
16320b57cec5SDimitry Andric   if (g_num_supported_hw_watchpoints == UINT32_MAX) {
16330b57cec5SDimitry Andric     // Set this to zero in case we can't tell if there are any HW breakpoints
16340b57cec5SDimitry Andric     g_num_supported_hw_watchpoints = 0;
16350b57cec5SDimitry Andric 
16360b57cec5SDimitry Andric     uint32_t register_DBGDIDR;
16370b57cec5SDimitry Andric     asm("mrc p14, 0, %0, c0, c0, 0" : "=r"(register_DBGDIDR));
16380b57cec5SDimitry Andric     g_num_supported_hw_watchpoints = Bits32(register_DBGDIDR, 31, 28) + 1;
16390b57cec5SDimitry Andric   }
16400b57cec5SDimitry Andric   return g_num_supported_hw_watchpoints;
16410b57cec5SDimitry Andric #else
16420b57cec5SDimitry Andric   // TODO: figure out remote case here!
16430b57cec5SDimitry Andric   return 2;
16440b57cec5SDimitry Andric #endif
16450b57cec5SDimitry Andric }
16460b57cec5SDimitry Andric 
SetHardwareWatchpoint(lldb::addr_t addr,size_t size,bool read,bool write)16470b57cec5SDimitry Andric uint32_t RegisterContextDarwin_arm::SetHardwareWatchpoint(lldb::addr_t addr,
16480b57cec5SDimitry Andric                                                           size_t size,
16490b57cec5SDimitry Andric                                                           bool read,
16500b57cec5SDimitry Andric                                                           bool write) {
16510b57cec5SDimitry Andric   const uint32_t num_hw_watchpoints = NumSupportedHardwareWatchpoints();
16520b57cec5SDimitry Andric 
16530b57cec5SDimitry Andric   // Can't watch zero bytes
16540b57cec5SDimitry Andric   if (size == 0)
16550b57cec5SDimitry Andric     return LLDB_INVALID_INDEX32;
16560b57cec5SDimitry Andric 
16570b57cec5SDimitry Andric   // We must watch for either read or write
16580b57cec5SDimitry Andric   if (!read && !write)
16590b57cec5SDimitry Andric     return LLDB_INVALID_INDEX32;
16600b57cec5SDimitry Andric 
16610b57cec5SDimitry Andric   // Can't watch more than 4 bytes per WVR/WCR pair
16620b57cec5SDimitry Andric   if (size > 4)
16630b57cec5SDimitry Andric     return LLDB_INVALID_INDEX32;
16640b57cec5SDimitry Andric 
16650b57cec5SDimitry Andric   // We can only watch up to four bytes that follow a 4 byte aligned address
16660b57cec5SDimitry Andric   // per watchpoint register pair. Since we have at most so we can only watch
16670b57cec5SDimitry Andric   // until the next 4 byte boundary and we need to make sure we can properly
16680b57cec5SDimitry Andric   // encode this.
16690b57cec5SDimitry Andric   uint32_t addr_word_offset = addr % 4;
16700b57cec5SDimitry Andric   //    if (log) log->Printf
16710b57cec5SDimitry Andric   //    ("RegisterContextDarwin_arm::EnableHardwareWatchpoint() -
16720b57cec5SDimitry Andric   //    addr_word_offset = 0x%8.8x", addr_word_offset);
16730b57cec5SDimitry Andric 
16740b57cec5SDimitry Andric   uint32_t byte_mask = ((1u << size) - 1u) << addr_word_offset;
16750b57cec5SDimitry Andric   //    if (log) log->Printf
16760b57cec5SDimitry Andric   //    ("RegisterContextDarwin_arm::EnableHardwareWatchpoint() - byte_mask =
16770b57cec5SDimitry Andric   //    0x%8.8x", byte_mask);
16780b57cec5SDimitry Andric   if (byte_mask > 0xfu)
16790b57cec5SDimitry Andric     return LLDB_INVALID_INDEX32;
16800b57cec5SDimitry Andric 
16810b57cec5SDimitry Andric   // Read the debug state
16820b57cec5SDimitry Andric   int kret = ReadDBG(false);
16830b57cec5SDimitry Andric 
16840b57cec5SDimitry Andric   if (kret == KERN_SUCCESS) {
16850b57cec5SDimitry Andric     // Check to make sure we have the needed hardware support
16860b57cec5SDimitry Andric     uint32_t i = 0;
16870b57cec5SDimitry Andric 
16880b57cec5SDimitry Andric     for (i = 0; i < num_hw_watchpoints; ++i) {
16890b57cec5SDimitry Andric       if ((dbg.wcr[i] & WCR_ENABLE) == 0)
16900b57cec5SDimitry Andric         break; // We found an available hw breakpoint slot (in i)
16910b57cec5SDimitry Andric     }
16920b57cec5SDimitry Andric 
16930b57cec5SDimitry Andric     // See if we found an available hw breakpoint slot above
16940b57cec5SDimitry Andric     if (i < num_hw_watchpoints) {
16950b57cec5SDimitry Andric       // Make the byte_mask into a valid Byte Address Select mask
16960b57cec5SDimitry Andric       uint32_t byte_address_select = byte_mask << 5;
16970b57cec5SDimitry Andric       // Make sure bits 1:0 are clear in our address
16980b57cec5SDimitry Andric       dbg.wvr[i] = addr & ~((lldb::addr_t)3);
16990b57cec5SDimitry Andric       dbg.wcr[i] = byte_address_select |     // Which bytes that follow the IMVA
17000b57cec5SDimitry Andric                                              // that we will watch
17010b57cec5SDimitry Andric                    S_USER |                  // Stop only in user mode
17020b57cec5SDimitry Andric                    (read ? WCR_LOAD : 0) |   // Stop on read access?
17030b57cec5SDimitry Andric                    (write ? WCR_STORE : 0) | // Stop on write access?
17040b57cec5SDimitry Andric                    WCR_ENABLE;               // Enable this watchpoint;
17050b57cec5SDimitry Andric 
17060b57cec5SDimitry Andric       kret = WriteDBG();
17070b57cec5SDimitry Andric       //            if (log) log->Printf
17080b57cec5SDimitry Andric       //            ("RegisterContextDarwin_arm::EnableHardwareWatchpoint()
17090b57cec5SDimitry Andric       //            WriteDBG() => 0x%8.8x.", kret);
17100b57cec5SDimitry Andric 
17110b57cec5SDimitry Andric       if (kret == KERN_SUCCESS)
17120b57cec5SDimitry Andric         return i;
17130b57cec5SDimitry Andric     } else {
17140b57cec5SDimitry Andric       //            if (log) log->Printf
17150b57cec5SDimitry Andric       //            ("RegisterContextDarwin_arm::EnableHardwareWatchpoint(): All
17160b57cec5SDimitry Andric       //            hardware resources (%u) are in use.", num_hw_watchpoints);
17170b57cec5SDimitry Andric     }
17180b57cec5SDimitry Andric   }
17190b57cec5SDimitry Andric   return LLDB_INVALID_INDEX32;
17200b57cec5SDimitry Andric }
17210b57cec5SDimitry Andric 
ClearHardwareWatchpoint(uint32_t hw_index)17220b57cec5SDimitry Andric bool RegisterContextDarwin_arm::ClearHardwareWatchpoint(uint32_t hw_index) {
17230b57cec5SDimitry Andric   int kret = ReadDBG(false);
17240b57cec5SDimitry Andric 
17250b57cec5SDimitry Andric   const uint32_t num_hw_points = NumSupportedHardwareWatchpoints();
17260b57cec5SDimitry Andric   if (kret == KERN_SUCCESS) {
17270b57cec5SDimitry Andric     if (hw_index < num_hw_points) {
17280b57cec5SDimitry Andric       dbg.wcr[hw_index] = 0;
17290b57cec5SDimitry Andric       //            if (log) log->Printf
17300b57cec5SDimitry Andric       //            ("RegisterContextDarwin_arm::ClearHardwareWatchpoint( %u ) -
17310b57cec5SDimitry Andric       //            WVR%u = 0x%8.8x  WCR%u = 0x%8.8x",
17320b57cec5SDimitry Andric       //                    hw_index,
17330b57cec5SDimitry Andric       //                    hw_index,
17340b57cec5SDimitry Andric       //                    dbg.wvr[hw_index],
17350b57cec5SDimitry Andric       //                    hw_index,
17360b57cec5SDimitry Andric       //                    dbg.wcr[hw_index]);
17370b57cec5SDimitry Andric 
17380b57cec5SDimitry Andric       kret = WriteDBG();
17390b57cec5SDimitry Andric 
17400b57cec5SDimitry Andric       if (kret == KERN_SUCCESS)
17410b57cec5SDimitry Andric         return true;
17420b57cec5SDimitry Andric     }
17430b57cec5SDimitry Andric   }
17440b57cec5SDimitry Andric   return false;
17450b57cec5SDimitry Andric }
1746