1a63d08c9SGreg Clayton //===-- RegisterContextDarwin_arm.cpp ---------------------------*- C++ -*-===// 2a63d08c9SGreg Clayton // 3a63d08c9SGreg Clayton // The LLVM Compiler Infrastructure 4a63d08c9SGreg Clayton // 5a63d08c9SGreg Clayton // This file is distributed under the University of Illinois Open Source 6a63d08c9SGreg Clayton // License. See LICENSE.TXT for details. 7a63d08c9SGreg Clayton // 8a63d08c9SGreg Clayton //===----------------------------------------------------------------------===// 9a63d08c9SGreg Clayton 10a67dd8fcSPeter Collingbourne #if defined(__APPLE__) 11a67dd8fcSPeter Collingbourne 12a63d08c9SGreg Clayton #include "RegisterContextDarwin_arm.h" 13a63d08c9SGreg Clayton 14a63d08c9SGreg Clayton // C Includes 15a63d08c9SGreg Clayton #include <mach/mach_types.h> 16a63d08c9SGreg Clayton #include <mach/thread_act.h> 17a63d08c9SGreg Clayton 18a63d08c9SGreg Clayton // C++ Includes 19a63d08c9SGreg Clayton // Other libraries and framework includes 20a63d08c9SGreg Clayton #include "lldb/Core/DataBufferHeap.h" 21a63d08c9SGreg Clayton #include "lldb/Core/DataExtractor.h" 22a63d08c9SGreg Clayton #include "lldb/Core/Log.h" 23a63d08c9SGreg Clayton #include "lldb/Core/RegisterValue.h" 24a63d08c9SGreg Clayton #include "lldb/Core/Scalar.h" 25a63d08c9SGreg Clayton #include "lldb/Host/Endian.h" 2612a19904SDaniel Dunbar #include "llvm/Support/Compiler.h" 2712a19904SDaniel Dunbar 28dce502edSGreg Clayton #include "Plugins/Process/Utility/InstructionUtils.h" 29dce502edSGreg Clayton 3012a19904SDaniel Dunbar // Support building against older versions of LLVM, this macro was added 3112a19904SDaniel Dunbar // recently. 3212a19904SDaniel Dunbar #ifndef LLVM_EXTENSION 3312a19904SDaniel Dunbar #define LLVM_EXTENSION 3412a19904SDaniel Dunbar #endif 35a63d08c9SGreg Clayton 36a63d08c9SGreg Clayton // Project includes 37a63d08c9SGreg Clayton #include "ARM_DWARF_Registers.h" 3863bd0db0SJason Molenda #include "Utility/ARM_ehframe_Registers.h" 39a63d08c9SGreg Clayton 4028606954SSaleem Abdulrasool #include "llvm/ADT/STLExtras.h" 4128606954SSaleem Abdulrasool 42a63d08c9SGreg Clayton using namespace lldb; 43a63d08c9SGreg Clayton using namespace lldb_private; 44a63d08c9SGreg Clayton 45*b9c1b51eSKate Stone enum { 46a63d08c9SGreg Clayton gpr_r0 = 0, 47a63d08c9SGreg Clayton gpr_r1, 48a63d08c9SGreg Clayton gpr_r2, 49a63d08c9SGreg Clayton gpr_r3, 50a63d08c9SGreg Clayton gpr_r4, 51a63d08c9SGreg Clayton gpr_r5, 52a63d08c9SGreg Clayton gpr_r6, 53a63d08c9SGreg Clayton gpr_r7, 54a63d08c9SGreg Clayton gpr_r8, 55a63d08c9SGreg Clayton gpr_r9, 56a63d08c9SGreg Clayton gpr_r10, 57a63d08c9SGreg Clayton gpr_r11, 58a63d08c9SGreg Clayton gpr_r12, 59*b9c1b51eSKate Stone gpr_r13, 60*b9c1b51eSKate Stone gpr_sp = gpr_r13, 61*b9c1b51eSKate Stone gpr_r14, 62*b9c1b51eSKate Stone gpr_lr = gpr_r14, 63*b9c1b51eSKate Stone gpr_r15, 64*b9c1b51eSKate Stone gpr_pc = gpr_r15, 65a63d08c9SGreg Clayton gpr_cpsr, 66a63d08c9SGreg Clayton 67a63d08c9SGreg Clayton fpu_s0, 68a63d08c9SGreg Clayton fpu_s1, 69a63d08c9SGreg Clayton fpu_s2, 70a63d08c9SGreg Clayton fpu_s3, 71a63d08c9SGreg Clayton fpu_s4, 72a63d08c9SGreg Clayton fpu_s5, 73a63d08c9SGreg Clayton fpu_s6, 74a63d08c9SGreg Clayton fpu_s7, 75a63d08c9SGreg Clayton fpu_s8, 76a63d08c9SGreg Clayton fpu_s9, 77a63d08c9SGreg Clayton fpu_s10, 78a63d08c9SGreg Clayton fpu_s11, 79a63d08c9SGreg Clayton fpu_s12, 80a63d08c9SGreg Clayton fpu_s13, 81a63d08c9SGreg Clayton fpu_s14, 82a63d08c9SGreg Clayton fpu_s15, 83a63d08c9SGreg Clayton fpu_s16, 84a63d08c9SGreg Clayton fpu_s17, 85a63d08c9SGreg Clayton fpu_s18, 86a63d08c9SGreg Clayton fpu_s19, 87a63d08c9SGreg Clayton fpu_s20, 88a63d08c9SGreg Clayton fpu_s21, 89a63d08c9SGreg Clayton fpu_s22, 90a63d08c9SGreg Clayton fpu_s23, 91a63d08c9SGreg Clayton fpu_s24, 92a63d08c9SGreg Clayton fpu_s25, 93a63d08c9SGreg Clayton fpu_s26, 94a63d08c9SGreg Clayton fpu_s27, 95a63d08c9SGreg Clayton fpu_s28, 96a63d08c9SGreg Clayton fpu_s29, 97a63d08c9SGreg Clayton fpu_s30, 98a63d08c9SGreg Clayton fpu_s31, 99a63d08c9SGreg Clayton fpu_fpscr, 100a63d08c9SGreg Clayton 101a63d08c9SGreg Clayton exc_exception, 102a63d08c9SGreg Clayton exc_fsr, 103a63d08c9SGreg Clayton exc_far, 104a63d08c9SGreg Clayton 105a63d08c9SGreg Clayton dbg_bvr0, 106a63d08c9SGreg Clayton dbg_bvr1, 107a63d08c9SGreg Clayton dbg_bvr2, 108a63d08c9SGreg Clayton dbg_bvr3, 109a63d08c9SGreg Clayton dbg_bvr4, 110a63d08c9SGreg Clayton dbg_bvr5, 111a63d08c9SGreg Clayton dbg_bvr6, 112a63d08c9SGreg Clayton dbg_bvr7, 113a63d08c9SGreg Clayton dbg_bvr8, 114a63d08c9SGreg Clayton dbg_bvr9, 115a63d08c9SGreg Clayton dbg_bvr10, 116a63d08c9SGreg Clayton dbg_bvr11, 117a63d08c9SGreg Clayton dbg_bvr12, 118a63d08c9SGreg Clayton dbg_bvr13, 119a63d08c9SGreg Clayton dbg_bvr14, 120a63d08c9SGreg Clayton dbg_bvr15, 121a63d08c9SGreg Clayton 122a63d08c9SGreg Clayton dbg_bcr0, 123a63d08c9SGreg Clayton dbg_bcr1, 124a63d08c9SGreg Clayton dbg_bcr2, 125a63d08c9SGreg Clayton dbg_bcr3, 126a63d08c9SGreg Clayton dbg_bcr4, 127a63d08c9SGreg Clayton dbg_bcr5, 128a63d08c9SGreg Clayton dbg_bcr6, 129a63d08c9SGreg Clayton dbg_bcr7, 130a63d08c9SGreg Clayton dbg_bcr8, 131a63d08c9SGreg Clayton dbg_bcr9, 132a63d08c9SGreg Clayton dbg_bcr10, 133a63d08c9SGreg Clayton dbg_bcr11, 134a63d08c9SGreg Clayton dbg_bcr12, 135a63d08c9SGreg Clayton dbg_bcr13, 136a63d08c9SGreg Clayton dbg_bcr14, 137a63d08c9SGreg Clayton dbg_bcr15, 138a63d08c9SGreg Clayton 139a63d08c9SGreg Clayton dbg_wvr0, 140a63d08c9SGreg Clayton dbg_wvr1, 141a63d08c9SGreg Clayton dbg_wvr2, 142a63d08c9SGreg Clayton dbg_wvr3, 143a63d08c9SGreg Clayton dbg_wvr4, 144a63d08c9SGreg Clayton dbg_wvr5, 145a63d08c9SGreg Clayton dbg_wvr6, 146a63d08c9SGreg Clayton dbg_wvr7, 147a63d08c9SGreg Clayton dbg_wvr8, 148a63d08c9SGreg Clayton dbg_wvr9, 149a63d08c9SGreg Clayton dbg_wvr10, 150a63d08c9SGreg Clayton dbg_wvr11, 151a63d08c9SGreg Clayton dbg_wvr12, 152a63d08c9SGreg Clayton dbg_wvr13, 153a63d08c9SGreg Clayton dbg_wvr14, 154a63d08c9SGreg Clayton dbg_wvr15, 155a63d08c9SGreg Clayton 156a63d08c9SGreg Clayton dbg_wcr0, 157a63d08c9SGreg Clayton dbg_wcr1, 158a63d08c9SGreg Clayton dbg_wcr2, 159a63d08c9SGreg Clayton dbg_wcr3, 160a63d08c9SGreg Clayton dbg_wcr4, 161a63d08c9SGreg Clayton dbg_wcr5, 162a63d08c9SGreg Clayton dbg_wcr6, 163a63d08c9SGreg Clayton dbg_wcr7, 164a63d08c9SGreg Clayton dbg_wcr8, 165a63d08c9SGreg Clayton dbg_wcr9, 166a63d08c9SGreg Clayton dbg_wcr10, 167a63d08c9SGreg Clayton dbg_wcr11, 168a63d08c9SGreg Clayton dbg_wcr12, 169a63d08c9SGreg Clayton dbg_wcr13, 170a63d08c9SGreg Clayton dbg_wcr14, 171a63d08c9SGreg Clayton dbg_wcr15, 172a63d08c9SGreg Clayton 173a63d08c9SGreg Clayton k_num_registers 174a63d08c9SGreg Clayton }; 175a63d08c9SGreg Clayton 176a63d08c9SGreg Clayton #define GPR_OFFSET(idx) ((idx)*4) 177a63d08c9SGreg Clayton #define FPU_OFFSET(idx) ((idx)*4 + sizeof(RegisterContextDarwin_arm::GPR)) 178*b9c1b51eSKate Stone #define EXC_OFFSET(idx) \ 179*b9c1b51eSKate Stone ((idx)*4 + sizeof(RegisterContextDarwin_arm::GPR) + \ 180*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::FPU)) 181*b9c1b51eSKate Stone #define DBG_OFFSET(reg) \ 182*b9c1b51eSKate Stone ((LLVM_EXTENSION offsetof(RegisterContextDarwin_arm::DBG, reg) + \ 183*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::GPR) + \ 184*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::FPU) + \ 185*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::EXC))) 186a63d08c9SGreg Clayton 187*b9c1b51eSKate Stone #define DEFINE_DBG(reg, i) \ 188*b9c1b51eSKate Stone #reg, NULL, sizeof(((RegisterContextDarwin_arm::DBG *) NULL)->reg[i]), \ 189*b9c1b51eSKate Stone DBG_OFFSET(reg[i]), eEncodingUint, eFormatHex, \ 190*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \ 191*b9c1b51eSKate Stone LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, \ 192*b9c1b51eSKate Stone LLDB_INVALID_REGNUM }, \ 193*b9c1b51eSKate Stone nullptr, nullptr, nullptr, 0 194*b9c1b51eSKate Stone #define REG_CONTEXT_SIZE \ 195*b9c1b51eSKate Stone (sizeof(RegisterContextDarwin_arm::GPR) + \ 196*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::FPU) + \ 197*b9c1b51eSKate Stone sizeof(RegisterContextDarwin_arm::EXC)) 198a63d08c9SGreg Clayton 199a63d08c9SGreg Clayton static RegisterInfo g_register_infos[] = { 200a63d08c9SGreg Clayton // General purpose registers 201*b9c1b51eSKate Stone // NAME ALT SZ OFFSET ENCODING FORMAT 202*b9c1b51eSKate Stone // EH_FRAME DWARF GENERIC 203*b9c1b51eSKate Stone // PROCESS PLUGIN LLDB NATIVE 204*b9c1b51eSKate Stone // ====== ======= == ============= ============= ============ 205*b9c1b51eSKate Stone // =============== =============== ========================= 206*b9c1b51eSKate Stone // ===================== ============= 207*b9c1b51eSKate Stone {"r0", 208*b9c1b51eSKate Stone NULL, 209*b9c1b51eSKate Stone 4, 210*b9c1b51eSKate Stone GPR_OFFSET(0), 211*b9c1b51eSKate Stone eEncodingUint, 212*b9c1b51eSKate Stone eFormatHex, 213*b9c1b51eSKate Stone {ehframe_r0, dwarf_r0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r0}, 214*b9c1b51eSKate Stone nullptr, 215*b9c1b51eSKate Stone nullptr, 216*b9c1b51eSKate Stone nullptr, 217*b9c1b51eSKate Stone 0}, 218*b9c1b51eSKate Stone {"r1", 219*b9c1b51eSKate Stone NULL, 220*b9c1b51eSKate Stone 4, 221*b9c1b51eSKate Stone GPR_OFFSET(1), 222*b9c1b51eSKate Stone eEncodingUint, 223*b9c1b51eSKate Stone eFormatHex, 224*b9c1b51eSKate Stone {ehframe_r1, dwarf_r1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r1}, 225*b9c1b51eSKate Stone nullptr, 226*b9c1b51eSKate Stone nullptr, 227*b9c1b51eSKate Stone nullptr, 228*b9c1b51eSKate Stone 0}, 229*b9c1b51eSKate Stone {"r2", 230*b9c1b51eSKate Stone NULL, 231*b9c1b51eSKate Stone 4, 232*b9c1b51eSKate Stone GPR_OFFSET(2), 233*b9c1b51eSKate Stone eEncodingUint, 234*b9c1b51eSKate Stone eFormatHex, 235*b9c1b51eSKate Stone {ehframe_r2, dwarf_r2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r2}, 236*b9c1b51eSKate Stone nullptr, 237*b9c1b51eSKate Stone nullptr, 238*b9c1b51eSKate Stone nullptr, 239*b9c1b51eSKate Stone 0}, 240*b9c1b51eSKate Stone {"r3", 241*b9c1b51eSKate Stone NULL, 242*b9c1b51eSKate Stone 4, 243*b9c1b51eSKate Stone GPR_OFFSET(3), 244*b9c1b51eSKate Stone eEncodingUint, 245*b9c1b51eSKate Stone eFormatHex, 246*b9c1b51eSKate Stone {ehframe_r3, dwarf_r3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r3}, 247*b9c1b51eSKate Stone nullptr, 248*b9c1b51eSKate Stone nullptr, 249*b9c1b51eSKate Stone nullptr, 250*b9c1b51eSKate Stone 0}, 251*b9c1b51eSKate Stone {"r4", 252*b9c1b51eSKate Stone NULL, 253*b9c1b51eSKate Stone 4, 254*b9c1b51eSKate Stone GPR_OFFSET(4), 255*b9c1b51eSKate Stone eEncodingUint, 256*b9c1b51eSKate Stone eFormatHex, 257*b9c1b51eSKate Stone {ehframe_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r4}, 258*b9c1b51eSKate Stone nullptr, 259*b9c1b51eSKate Stone nullptr, 260*b9c1b51eSKate Stone nullptr, 261*b9c1b51eSKate Stone 0}, 262*b9c1b51eSKate Stone {"r5", 263*b9c1b51eSKate Stone NULL, 264*b9c1b51eSKate Stone 4, 265*b9c1b51eSKate Stone GPR_OFFSET(5), 266*b9c1b51eSKate Stone eEncodingUint, 267*b9c1b51eSKate Stone eFormatHex, 268*b9c1b51eSKate Stone {ehframe_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r5}, 269*b9c1b51eSKate Stone nullptr, 270*b9c1b51eSKate Stone nullptr, 271*b9c1b51eSKate Stone nullptr, 272*b9c1b51eSKate Stone 0}, 273*b9c1b51eSKate Stone {"r6", 274*b9c1b51eSKate Stone NULL, 275*b9c1b51eSKate Stone 4, 276*b9c1b51eSKate Stone GPR_OFFSET(6), 277*b9c1b51eSKate Stone eEncodingUint, 278*b9c1b51eSKate Stone eFormatHex, 279*b9c1b51eSKate Stone {ehframe_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r6}, 280*b9c1b51eSKate Stone nullptr, 281*b9c1b51eSKate Stone nullptr, 282*b9c1b51eSKate Stone nullptr, 283*b9c1b51eSKate Stone 0}, 284*b9c1b51eSKate Stone {"r7", 285*b9c1b51eSKate Stone NULL, 286*b9c1b51eSKate Stone 4, 287*b9c1b51eSKate Stone GPR_OFFSET(7), 288*b9c1b51eSKate Stone eEncodingUint, 289*b9c1b51eSKate Stone eFormatHex, 290*b9c1b51eSKate Stone {ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM, 291*b9c1b51eSKate Stone gpr_r7}, 292*b9c1b51eSKate Stone nullptr, 293*b9c1b51eSKate Stone nullptr, 294*b9c1b51eSKate Stone nullptr, 295*b9c1b51eSKate Stone 0}, 296*b9c1b51eSKate Stone {"r8", 297*b9c1b51eSKate Stone NULL, 298*b9c1b51eSKate Stone 4, 299*b9c1b51eSKate Stone GPR_OFFSET(8), 300*b9c1b51eSKate Stone eEncodingUint, 301*b9c1b51eSKate Stone eFormatHex, 302*b9c1b51eSKate Stone {ehframe_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r8}, 303*b9c1b51eSKate Stone nullptr, 304*b9c1b51eSKate Stone nullptr, 305*b9c1b51eSKate Stone nullptr, 306*b9c1b51eSKate Stone 0}, 307*b9c1b51eSKate Stone {"r9", 308*b9c1b51eSKate Stone NULL, 309*b9c1b51eSKate Stone 4, 310*b9c1b51eSKate Stone GPR_OFFSET(9), 311*b9c1b51eSKate Stone eEncodingUint, 312*b9c1b51eSKate Stone eFormatHex, 313*b9c1b51eSKate Stone {ehframe_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, gpr_r9}, 314*b9c1b51eSKate Stone nullptr, 315*b9c1b51eSKate Stone nullptr, 316*b9c1b51eSKate Stone nullptr, 317*b9c1b51eSKate Stone 0}, 318*b9c1b51eSKate Stone {"r10", 319*b9c1b51eSKate Stone NULL, 320*b9c1b51eSKate Stone 4, 321*b9c1b51eSKate Stone GPR_OFFSET(10), 322*b9c1b51eSKate Stone eEncodingUint, 323*b9c1b51eSKate Stone eFormatHex, 324*b9c1b51eSKate Stone {ehframe_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 325*b9c1b51eSKate Stone gpr_r10}, 326*b9c1b51eSKate Stone nullptr, 327*b9c1b51eSKate Stone nullptr, 328*b9c1b51eSKate Stone nullptr, 329*b9c1b51eSKate Stone 0}, 330*b9c1b51eSKate Stone {"r11", 331*b9c1b51eSKate Stone NULL, 332*b9c1b51eSKate Stone 4, 333*b9c1b51eSKate Stone GPR_OFFSET(11), 334*b9c1b51eSKate Stone eEncodingUint, 335*b9c1b51eSKate Stone eFormatHex, 336*b9c1b51eSKate Stone {ehframe_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 337*b9c1b51eSKate Stone gpr_r11}, 338*b9c1b51eSKate Stone nullptr, 339*b9c1b51eSKate Stone nullptr, 340*b9c1b51eSKate Stone nullptr, 341*b9c1b51eSKate Stone 0}, 342*b9c1b51eSKate Stone {"r12", 343*b9c1b51eSKate Stone NULL, 344*b9c1b51eSKate Stone 4, 345*b9c1b51eSKate Stone GPR_OFFSET(12), 346*b9c1b51eSKate Stone eEncodingUint, 347*b9c1b51eSKate Stone eFormatHex, 348*b9c1b51eSKate Stone {ehframe_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 349*b9c1b51eSKate Stone gpr_r12}, 350*b9c1b51eSKate Stone nullptr, 351*b9c1b51eSKate Stone nullptr, 352*b9c1b51eSKate Stone nullptr, 353*b9c1b51eSKate Stone 0}, 354*b9c1b51eSKate Stone {"sp", 355*b9c1b51eSKate Stone "r13", 356*b9c1b51eSKate Stone 4, 357*b9c1b51eSKate Stone GPR_OFFSET(13), 358*b9c1b51eSKate Stone eEncodingUint, 359*b9c1b51eSKate Stone eFormatHex, 360*b9c1b51eSKate Stone {ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM, 361*b9c1b51eSKate Stone gpr_sp}, 362*b9c1b51eSKate Stone nullptr, 363*b9c1b51eSKate Stone nullptr, 364*b9c1b51eSKate Stone nullptr, 365*b9c1b51eSKate Stone 0}, 366*b9c1b51eSKate Stone {"lr", 367*b9c1b51eSKate Stone "r14", 368*b9c1b51eSKate Stone 4, 369*b9c1b51eSKate Stone GPR_OFFSET(14), 370*b9c1b51eSKate Stone eEncodingUint, 371*b9c1b51eSKate Stone eFormatHex, 372*b9c1b51eSKate Stone {ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM, 373*b9c1b51eSKate Stone gpr_lr}, 374*b9c1b51eSKate Stone nullptr, 375*b9c1b51eSKate Stone nullptr, 376*b9c1b51eSKate Stone nullptr, 377*b9c1b51eSKate Stone 0}, 378*b9c1b51eSKate Stone {"pc", 379*b9c1b51eSKate Stone "r15", 380*b9c1b51eSKate Stone 4, 381*b9c1b51eSKate Stone GPR_OFFSET(15), 382*b9c1b51eSKate Stone eEncodingUint, 383*b9c1b51eSKate Stone eFormatHex, 384*b9c1b51eSKate Stone {ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM, 385*b9c1b51eSKate Stone gpr_pc}, 386*b9c1b51eSKate Stone nullptr, 387*b9c1b51eSKate Stone nullptr, 388*b9c1b51eSKate Stone nullptr, 389*b9c1b51eSKate Stone 0}, 390*b9c1b51eSKate Stone {"cpsr", 391*b9c1b51eSKate Stone "psr", 392*b9c1b51eSKate Stone 4, 393*b9c1b51eSKate Stone GPR_OFFSET(16), 394*b9c1b51eSKate Stone eEncodingUint, 395*b9c1b51eSKate Stone eFormatHex, 396*b9c1b51eSKate Stone {ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM, 397*b9c1b51eSKate Stone gpr_cpsr}, 398*b9c1b51eSKate Stone nullptr, 399*b9c1b51eSKate Stone nullptr, 400*b9c1b51eSKate Stone nullptr, 401*b9c1b51eSKate Stone 0}, 402a63d08c9SGreg Clayton 403*b9c1b51eSKate Stone {"s0", 404*b9c1b51eSKate Stone NULL, 405*b9c1b51eSKate Stone 4, 406*b9c1b51eSKate Stone FPU_OFFSET(0), 407*b9c1b51eSKate Stone eEncodingIEEE754, 408*b9c1b51eSKate Stone eFormatFloat, 409*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 410*b9c1b51eSKate Stone fpu_s0}, 411*b9c1b51eSKate Stone nullptr, 412*b9c1b51eSKate Stone nullptr, 413*b9c1b51eSKate Stone nullptr, 414*b9c1b51eSKate Stone 0}, 415*b9c1b51eSKate Stone {"s1", 416*b9c1b51eSKate Stone NULL, 417*b9c1b51eSKate Stone 4, 418*b9c1b51eSKate Stone FPU_OFFSET(1), 419*b9c1b51eSKate Stone eEncodingIEEE754, 420*b9c1b51eSKate Stone eFormatFloat, 421*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 422*b9c1b51eSKate Stone fpu_s1}, 423*b9c1b51eSKate Stone nullptr, 424*b9c1b51eSKate Stone nullptr, 425*b9c1b51eSKate Stone nullptr, 426*b9c1b51eSKate Stone 0}, 427*b9c1b51eSKate Stone {"s2", 428*b9c1b51eSKate Stone NULL, 429*b9c1b51eSKate Stone 4, 430*b9c1b51eSKate Stone FPU_OFFSET(2), 431*b9c1b51eSKate Stone eEncodingIEEE754, 432*b9c1b51eSKate Stone eFormatFloat, 433*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 434*b9c1b51eSKate Stone fpu_s2}, 435*b9c1b51eSKate Stone nullptr, 436*b9c1b51eSKate Stone nullptr, 437*b9c1b51eSKate Stone nullptr, 438*b9c1b51eSKate Stone 0}, 439*b9c1b51eSKate Stone {"s3", 440*b9c1b51eSKate Stone NULL, 441*b9c1b51eSKate Stone 4, 442*b9c1b51eSKate Stone FPU_OFFSET(3), 443*b9c1b51eSKate Stone eEncodingIEEE754, 444*b9c1b51eSKate Stone eFormatFloat, 445*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 446*b9c1b51eSKate Stone fpu_s3}, 447*b9c1b51eSKate Stone nullptr, 448*b9c1b51eSKate Stone nullptr, 449*b9c1b51eSKate Stone nullptr, 450*b9c1b51eSKate Stone 0}, 451*b9c1b51eSKate Stone {"s4", 452*b9c1b51eSKate Stone NULL, 453*b9c1b51eSKate Stone 4, 454*b9c1b51eSKate Stone FPU_OFFSET(4), 455*b9c1b51eSKate Stone eEncodingIEEE754, 456*b9c1b51eSKate Stone eFormatFloat, 457*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 458*b9c1b51eSKate Stone fpu_s4}, 459*b9c1b51eSKate Stone nullptr, 460*b9c1b51eSKate Stone nullptr, 461*b9c1b51eSKate Stone nullptr, 462*b9c1b51eSKate Stone 0}, 463*b9c1b51eSKate Stone {"s5", 464*b9c1b51eSKate Stone NULL, 465*b9c1b51eSKate Stone 4, 466*b9c1b51eSKate Stone FPU_OFFSET(5), 467*b9c1b51eSKate Stone eEncodingIEEE754, 468*b9c1b51eSKate Stone eFormatFloat, 469*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 470*b9c1b51eSKate Stone fpu_s5}, 471*b9c1b51eSKate Stone nullptr, 472*b9c1b51eSKate Stone nullptr, 473*b9c1b51eSKate Stone nullptr, 474*b9c1b51eSKate Stone 0}, 475*b9c1b51eSKate Stone {"s6", 476*b9c1b51eSKate Stone NULL, 477*b9c1b51eSKate Stone 4, 478*b9c1b51eSKate Stone FPU_OFFSET(6), 479*b9c1b51eSKate Stone eEncodingIEEE754, 480*b9c1b51eSKate Stone eFormatFloat, 481*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 482*b9c1b51eSKate Stone fpu_s6}, 483*b9c1b51eSKate Stone nullptr, 484*b9c1b51eSKate Stone nullptr, 485*b9c1b51eSKate Stone nullptr, 486*b9c1b51eSKate Stone 0}, 487*b9c1b51eSKate Stone {"s7", 488*b9c1b51eSKate Stone NULL, 489*b9c1b51eSKate Stone 4, 490*b9c1b51eSKate Stone FPU_OFFSET(7), 491*b9c1b51eSKate Stone eEncodingIEEE754, 492*b9c1b51eSKate Stone eFormatFloat, 493*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 494*b9c1b51eSKate Stone fpu_s7}, 495*b9c1b51eSKate Stone nullptr, 496*b9c1b51eSKate Stone nullptr, 497*b9c1b51eSKate Stone nullptr, 498*b9c1b51eSKate Stone 0}, 499*b9c1b51eSKate Stone {"s8", 500*b9c1b51eSKate Stone NULL, 501*b9c1b51eSKate Stone 4, 502*b9c1b51eSKate Stone FPU_OFFSET(8), 503*b9c1b51eSKate Stone eEncodingIEEE754, 504*b9c1b51eSKate Stone eFormatFloat, 505*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 506*b9c1b51eSKate Stone fpu_s8}, 507*b9c1b51eSKate Stone nullptr, 508*b9c1b51eSKate Stone nullptr, 509*b9c1b51eSKate Stone nullptr, 510*b9c1b51eSKate Stone 0}, 511*b9c1b51eSKate Stone {"s9", 512*b9c1b51eSKate Stone NULL, 513*b9c1b51eSKate Stone 4, 514*b9c1b51eSKate Stone FPU_OFFSET(9), 515*b9c1b51eSKate Stone eEncodingIEEE754, 516*b9c1b51eSKate Stone eFormatFloat, 517*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 518*b9c1b51eSKate Stone fpu_s9}, 519*b9c1b51eSKate Stone nullptr, 520*b9c1b51eSKate Stone nullptr, 521*b9c1b51eSKate Stone nullptr, 522*b9c1b51eSKate Stone 0}, 523*b9c1b51eSKate Stone {"s10", 524*b9c1b51eSKate Stone NULL, 525*b9c1b51eSKate Stone 4, 526*b9c1b51eSKate Stone FPU_OFFSET(10), 527*b9c1b51eSKate Stone eEncodingIEEE754, 528*b9c1b51eSKate Stone eFormatFloat, 529*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 530*b9c1b51eSKate Stone fpu_s10}, 531*b9c1b51eSKate Stone nullptr, 532*b9c1b51eSKate Stone nullptr, 533*b9c1b51eSKate Stone nullptr, 534*b9c1b51eSKate Stone 0}, 535*b9c1b51eSKate Stone {"s11", 536*b9c1b51eSKate Stone NULL, 537*b9c1b51eSKate Stone 4, 538*b9c1b51eSKate Stone FPU_OFFSET(11), 539*b9c1b51eSKate Stone eEncodingIEEE754, 540*b9c1b51eSKate Stone eFormatFloat, 541*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 542*b9c1b51eSKate Stone fpu_s11}, 543*b9c1b51eSKate Stone nullptr, 544*b9c1b51eSKate Stone nullptr, 545*b9c1b51eSKate Stone nullptr, 546*b9c1b51eSKate Stone 0}, 547*b9c1b51eSKate Stone {"s12", 548*b9c1b51eSKate Stone NULL, 549*b9c1b51eSKate Stone 4, 550*b9c1b51eSKate Stone FPU_OFFSET(12), 551*b9c1b51eSKate Stone eEncodingIEEE754, 552*b9c1b51eSKate Stone eFormatFloat, 553*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 554*b9c1b51eSKate Stone fpu_s12}, 555*b9c1b51eSKate Stone nullptr, 556*b9c1b51eSKate Stone nullptr, 557*b9c1b51eSKate Stone nullptr, 558*b9c1b51eSKate Stone 0}, 559*b9c1b51eSKate Stone {"s13", 560*b9c1b51eSKate Stone NULL, 561*b9c1b51eSKate Stone 4, 562*b9c1b51eSKate Stone FPU_OFFSET(13), 563*b9c1b51eSKate Stone eEncodingIEEE754, 564*b9c1b51eSKate Stone eFormatFloat, 565*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 566*b9c1b51eSKate Stone fpu_s13}, 567*b9c1b51eSKate Stone nullptr, 568*b9c1b51eSKate Stone nullptr, 569*b9c1b51eSKate Stone nullptr, 570*b9c1b51eSKate Stone 0}, 571*b9c1b51eSKate Stone {"s14", 572*b9c1b51eSKate Stone NULL, 573*b9c1b51eSKate Stone 4, 574*b9c1b51eSKate Stone FPU_OFFSET(14), 575*b9c1b51eSKate Stone eEncodingIEEE754, 576*b9c1b51eSKate Stone eFormatFloat, 577*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 578*b9c1b51eSKate Stone fpu_s14}, 579*b9c1b51eSKate Stone nullptr, 580*b9c1b51eSKate Stone nullptr, 581*b9c1b51eSKate Stone nullptr, 582*b9c1b51eSKate Stone 0}, 583*b9c1b51eSKate Stone {"s15", 584*b9c1b51eSKate Stone NULL, 585*b9c1b51eSKate Stone 4, 586*b9c1b51eSKate Stone FPU_OFFSET(15), 587*b9c1b51eSKate Stone eEncodingIEEE754, 588*b9c1b51eSKate Stone eFormatFloat, 589*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 590*b9c1b51eSKate Stone fpu_s15}, 591*b9c1b51eSKate Stone nullptr, 592*b9c1b51eSKate Stone nullptr, 593*b9c1b51eSKate Stone nullptr, 594*b9c1b51eSKate Stone 0}, 595*b9c1b51eSKate Stone {"s16", 596*b9c1b51eSKate Stone NULL, 597*b9c1b51eSKate Stone 4, 598*b9c1b51eSKate Stone FPU_OFFSET(16), 599*b9c1b51eSKate Stone eEncodingIEEE754, 600*b9c1b51eSKate Stone eFormatFloat, 601*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 602*b9c1b51eSKate Stone fpu_s16}, 603*b9c1b51eSKate Stone nullptr, 604*b9c1b51eSKate Stone nullptr, 605*b9c1b51eSKate Stone nullptr, 606*b9c1b51eSKate Stone 0}, 607*b9c1b51eSKate Stone {"s17", 608*b9c1b51eSKate Stone NULL, 609*b9c1b51eSKate Stone 4, 610*b9c1b51eSKate Stone FPU_OFFSET(17), 611*b9c1b51eSKate Stone eEncodingIEEE754, 612*b9c1b51eSKate Stone eFormatFloat, 613*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 614*b9c1b51eSKate Stone fpu_s17}, 615*b9c1b51eSKate Stone nullptr, 616*b9c1b51eSKate Stone nullptr, 617*b9c1b51eSKate Stone nullptr, 618*b9c1b51eSKate Stone 0}, 619*b9c1b51eSKate Stone {"s18", 620*b9c1b51eSKate Stone NULL, 621*b9c1b51eSKate Stone 4, 622*b9c1b51eSKate Stone FPU_OFFSET(18), 623*b9c1b51eSKate Stone eEncodingIEEE754, 624*b9c1b51eSKate Stone eFormatFloat, 625*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 626*b9c1b51eSKate Stone fpu_s18}, 627*b9c1b51eSKate Stone nullptr, 628*b9c1b51eSKate Stone nullptr, 629*b9c1b51eSKate Stone nullptr, 630*b9c1b51eSKate Stone 0}, 631*b9c1b51eSKate Stone {"s19", 632*b9c1b51eSKate Stone NULL, 633*b9c1b51eSKate Stone 4, 634*b9c1b51eSKate Stone FPU_OFFSET(19), 635*b9c1b51eSKate Stone eEncodingIEEE754, 636*b9c1b51eSKate Stone eFormatFloat, 637*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 638*b9c1b51eSKate Stone fpu_s19}, 639*b9c1b51eSKate Stone nullptr, 640*b9c1b51eSKate Stone nullptr, 641*b9c1b51eSKate Stone nullptr, 642*b9c1b51eSKate Stone 0}, 643*b9c1b51eSKate Stone {"s20", 644*b9c1b51eSKate Stone NULL, 645*b9c1b51eSKate Stone 4, 646*b9c1b51eSKate Stone FPU_OFFSET(20), 647*b9c1b51eSKate Stone eEncodingIEEE754, 648*b9c1b51eSKate Stone eFormatFloat, 649*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 650*b9c1b51eSKate Stone fpu_s20}, 651*b9c1b51eSKate Stone nullptr, 652*b9c1b51eSKate Stone nullptr, 653*b9c1b51eSKate Stone nullptr, 654*b9c1b51eSKate Stone 0}, 655*b9c1b51eSKate Stone {"s21", 656*b9c1b51eSKate Stone NULL, 657*b9c1b51eSKate Stone 4, 658*b9c1b51eSKate Stone FPU_OFFSET(21), 659*b9c1b51eSKate Stone eEncodingIEEE754, 660*b9c1b51eSKate Stone eFormatFloat, 661*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 662*b9c1b51eSKate Stone fpu_s21}, 663*b9c1b51eSKate Stone nullptr, 664*b9c1b51eSKate Stone nullptr, 665*b9c1b51eSKate Stone nullptr, 666*b9c1b51eSKate Stone 0}, 667*b9c1b51eSKate Stone {"s22", 668*b9c1b51eSKate Stone NULL, 669*b9c1b51eSKate Stone 4, 670*b9c1b51eSKate Stone FPU_OFFSET(22), 671*b9c1b51eSKate Stone eEncodingIEEE754, 672*b9c1b51eSKate Stone eFormatFloat, 673*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 674*b9c1b51eSKate Stone fpu_s22}, 675*b9c1b51eSKate Stone nullptr, 676*b9c1b51eSKate Stone nullptr, 677*b9c1b51eSKate Stone nullptr, 678*b9c1b51eSKate Stone 0}, 679*b9c1b51eSKate Stone {"s23", 680*b9c1b51eSKate Stone NULL, 681*b9c1b51eSKate Stone 4, 682*b9c1b51eSKate Stone FPU_OFFSET(23), 683*b9c1b51eSKate Stone eEncodingIEEE754, 684*b9c1b51eSKate Stone eFormatFloat, 685*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 686*b9c1b51eSKate Stone fpu_s23}, 687*b9c1b51eSKate Stone nullptr, 688*b9c1b51eSKate Stone nullptr, 689*b9c1b51eSKate Stone nullptr, 690*b9c1b51eSKate Stone 0}, 691*b9c1b51eSKate Stone {"s24", 692*b9c1b51eSKate Stone NULL, 693*b9c1b51eSKate Stone 4, 694*b9c1b51eSKate Stone FPU_OFFSET(24), 695*b9c1b51eSKate Stone eEncodingIEEE754, 696*b9c1b51eSKate Stone eFormatFloat, 697*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 698*b9c1b51eSKate Stone fpu_s24}, 699*b9c1b51eSKate Stone nullptr, 700*b9c1b51eSKate Stone nullptr, 701*b9c1b51eSKate Stone nullptr, 702*b9c1b51eSKate Stone 0}, 703*b9c1b51eSKate Stone {"s25", 704*b9c1b51eSKate Stone NULL, 705*b9c1b51eSKate Stone 4, 706*b9c1b51eSKate Stone FPU_OFFSET(25), 707*b9c1b51eSKate Stone eEncodingIEEE754, 708*b9c1b51eSKate Stone eFormatFloat, 709*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 710*b9c1b51eSKate Stone fpu_s25}, 711*b9c1b51eSKate Stone nullptr, 712*b9c1b51eSKate Stone nullptr, 713*b9c1b51eSKate Stone nullptr, 714*b9c1b51eSKate Stone 0}, 715*b9c1b51eSKate Stone {"s26", 716*b9c1b51eSKate Stone NULL, 717*b9c1b51eSKate Stone 4, 718*b9c1b51eSKate Stone FPU_OFFSET(26), 719*b9c1b51eSKate Stone eEncodingIEEE754, 720*b9c1b51eSKate Stone eFormatFloat, 721*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 722*b9c1b51eSKate Stone fpu_s26}, 723*b9c1b51eSKate Stone nullptr, 724*b9c1b51eSKate Stone nullptr, 725*b9c1b51eSKate Stone nullptr, 726*b9c1b51eSKate Stone 0}, 727*b9c1b51eSKate Stone {"s27", 728*b9c1b51eSKate Stone NULL, 729*b9c1b51eSKate Stone 4, 730*b9c1b51eSKate Stone FPU_OFFSET(27), 731*b9c1b51eSKate Stone eEncodingIEEE754, 732*b9c1b51eSKate Stone eFormatFloat, 733*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 734*b9c1b51eSKate Stone fpu_s27}, 735*b9c1b51eSKate Stone nullptr, 736*b9c1b51eSKate Stone nullptr, 737*b9c1b51eSKate Stone nullptr, 738*b9c1b51eSKate Stone 0}, 739*b9c1b51eSKate Stone {"s28", 740*b9c1b51eSKate Stone NULL, 741*b9c1b51eSKate Stone 4, 742*b9c1b51eSKate Stone FPU_OFFSET(28), 743*b9c1b51eSKate Stone eEncodingIEEE754, 744*b9c1b51eSKate Stone eFormatFloat, 745*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 746*b9c1b51eSKate Stone fpu_s28}, 747*b9c1b51eSKate Stone nullptr, 748*b9c1b51eSKate Stone nullptr, 749*b9c1b51eSKate Stone nullptr, 750*b9c1b51eSKate Stone 0}, 751*b9c1b51eSKate Stone {"s29", 752*b9c1b51eSKate Stone NULL, 753*b9c1b51eSKate Stone 4, 754*b9c1b51eSKate Stone FPU_OFFSET(29), 755*b9c1b51eSKate Stone eEncodingIEEE754, 756*b9c1b51eSKate Stone eFormatFloat, 757*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 758*b9c1b51eSKate Stone fpu_s29}, 759*b9c1b51eSKate Stone nullptr, 760*b9c1b51eSKate Stone nullptr, 761*b9c1b51eSKate Stone nullptr, 762*b9c1b51eSKate Stone 0}, 763*b9c1b51eSKate Stone {"s30", 764*b9c1b51eSKate Stone NULL, 765*b9c1b51eSKate Stone 4, 766*b9c1b51eSKate Stone FPU_OFFSET(30), 767*b9c1b51eSKate Stone eEncodingIEEE754, 768*b9c1b51eSKate Stone eFormatFloat, 769*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 770*b9c1b51eSKate Stone fpu_s30}, 771*b9c1b51eSKate Stone nullptr, 772*b9c1b51eSKate Stone nullptr, 773*b9c1b51eSKate Stone nullptr, 774*b9c1b51eSKate Stone 0}, 775*b9c1b51eSKate Stone {"s31", 776*b9c1b51eSKate Stone NULL, 777*b9c1b51eSKate Stone 4, 778*b9c1b51eSKate Stone FPU_OFFSET(31), 779*b9c1b51eSKate Stone eEncodingIEEE754, 780*b9c1b51eSKate Stone eFormatFloat, 781*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 782*b9c1b51eSKate Stone fpu_s31}, 783*b9c1b51eSKate Stone nullptr, 784*b9c1b51eSKate Stone nullptr, 785*b9c1b51eSKate Stone nullptr, 786*b9c1b51eSKate Stone 0}, 787*b9c1b51eSKate Stone {"fpscr", 788*b9c1b51eSKate Stone NULL, 789*b9c1b51eSKate Stone 4, 790*b9c1b51eSKate Stone FPU_OFFSET(32), 791*b9c1b51eSKate Stone eEncodingUint, 792*b9c1b51eSKate Stone eFormatHex, 793*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 794*b9c1b51eSKate Stone LLDB_INVALID_REGNUM, fpu_fpscr}, 795*b9c1b51eSKate Stone nullptr, 796*b9c1b51eSKate Stone nullptr, 797*b9c1b51eSKate Stone nullptr, 798*b9c1b51eSKate Stone 0}, 799a63d08c9SGreg Clayton 800*b9c1b51eSKate Stone {"exception", 801*b9c1b51eSKate Stone NULL, 802*b9c1b51eSKate Stone 4, 803*b9c1b51eSKate Stone EXC_OFFSET(0), 804*b9c1b51eSKate Stone eEncodingUint, 805*b9c1b51eSKate Stone eFormatHex, 806*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 807*b9c1b51eSKate Stone LLDB_INVALID_REGNUM, exc_exception}, 808*b9c1b51eSKate Stone nullptr, 809*b9c1b51eSKate Stone nullptr, 810*b9c1b51eSKate Stone nullptr, 811*b9c1b51eSKate Stone 0}, 812*b9c1b51eSKate Stone {"fsr", 813*b9c1b51eSKate Stone NULL, 814*b9c1b51eSKate Stone 4, 815*b9c1b51eSKate Stone EXC_OFFSET(1), 816*b9c1b51eSKate Stone eEncodingUint, 817*b9c1b51eSKate Stone eFormatHex, 818*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 819*b9c1b51eSKate Stone LLDB_INVALID_REGNUM, exc_fsr}, 820*b9c1b51eSKate Stone nullptr, 821*b9c1b51eSKate Stone nullptr, 822*b9c1b51eSKate Stone nullptr, 823*b9c1b51eSKate Stone 0}, 824*b9c1b51eSKate Stone {"far", 825*b9c1b51eSKate Stone NULL, 826*b9c1b51eSKate Stone 4, 827*b9c1b51eSKate Stone EXC_OFFSET(2), 828*b9c1b51eSKate Stone eEncodingUint, 829*b9c1b51eSKate Stone eFormatHex, 830*b9c1b51eSKate Stone {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 831*b9c1b51eSKate Stone LLDB_INVALID_REGNUM, exc_far}, 832*b9c1b51eSKate Stone nullptr, 833*b9c1b51eSKate Stone nullptr, 834*b9c1b51eSKate Stone nullptr, 835*b9c1b51eSKate Stone 0}, 836a63d08c9SGreg Clayton 837a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 0)}, 838a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 1)}, 839a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 2)}, 840a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 3)}, 841a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 4)}, 842a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 5)}, 843a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 6)}, 844a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 7)}, 845a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 8)}, 846a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 9)}, 847a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 10)}, 848a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 11)}, 849a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 12)}, 850a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 13)}, 851a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 14)}, 852a63d08c9SGreg Clayton {DEFINE_DBG(bvr, 15)}, 853a63d08c9SGreg Clayton 854a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 0)}, 855a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 1)}, 856a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 2)}, 857a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 3)}, 858a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 4)}, 859a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 5)}, 860a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 6)}, 861a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 7)}, 862a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 8)}, 863a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 9)}, 864a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 10)}, 865a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 11)}, 866a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 12)}, 867a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 13)}, 868a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 14)}, 869a63d08c9SGreg Clayton {DEFINE_DBG(bcr, 15)}, 870a63d08c9SGreg Clayton 871a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 0)}, 872a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 1)}, 873a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 2)}, 874a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 3)}, 875a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 4)}, 876a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 5)}, 877a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 6)}, 878a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 7)}, 879a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 8)}, 880a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 9)}, 881a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 10)}, 882a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 11)}, 883a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 12)}, 884a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 13)}, 885a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 14)}, 886a63d08c9SGreg Clayton {DEFINE_DBG(wvr, 15)}, 887a63d08c9SGreg Clayton 888a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 0)}, 889a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 1)}, 890a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 2)}, 891a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 3)}, 892a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 4)}, 893a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 5)}, 894a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 6)}, 895a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 7)}, 896a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 8)}, 897a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 9)}, 898a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 10)}, 899a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 11)}, 900a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 12)}, 901a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 13)}, 902a63d08c9SGreg Clayton {DEFINE_DBG(wcr, 14)}, 903*b9c1b51eSKate Stone {DEFINE_DBG(wcr, 15)}}; 904a63d08c9SGreg Clayton 905a63d08c9SGreg Clayton // General purpose registers 906*b9c1b51eSKate Stone static uint32_t g_gpr_regnums[] = { 907*b9c1b51eSKate Stone gpr_r0, gpr_r1, gpr_r2, gpr_r3, gpr_r4, gpr_r5, gpr_r6, gpr_r7, gpr_r8, 908*b9c1b51eSKate Stone gpr_r9, gpr_r10, gpr_r11, gpr_r12, gpr_sp, gpr_lr, gpr_pc, gpr_cpsr}; 909a63d08c9SGreg Clayton 910a63d08c9SGreg Clayton // Floating point registers 911*b9c1b51eSKate Stone static uint32_t g_fpu_regnums[] = { 912*b9c1b51eSKate Stone fpu_s0, fpu_s1, fpu_s2, fpu_s3, fpu_s4, fpu_s5, fpu_s6, 913*b9c1b51eSKate Stone fpu_s7, fpu_s8, fpu_s9, fpu_s10, fpu_s11, fpu_s12, fpu_s13, 914*b9c1b51eSKate Stone fpu_s14, fpu_s15, fpu_s16, fpu_s17, fpu_s18, fpu_s19, fpu_s20, 915*b9c1b51eSKate Stone fpu_s21, fpu_s22, fpu_s23, fpu_s24, fpu_s25, fpu_s26, fpu_s27, 916*b9c1b51eSKate Stone fpu_s28, fpu_s29, fpu_s30, fpu_s31, fpu_fpscr, 917a63d08c9SGreg Clayton }; 918a63d08c9SGreg Clayton 919a63d08c9SGreg Clayton // Exception registers 920a63d08c9SGreg Clayton 921*b9c1b51eSKate Stone static uint32_t g_exc_regnums[] = { 922*b9c1b51eSKate Stone exc_exception, exc_fsr, exc_far, 923a63d08c9SGreg Clayton }; 924a63d08c9SGreg Clayton 92528606954SSaleem Abdulrasool static size_t k_num_register_infos = llvm::array_lengthof(g_register_infos); 926a63d08c9SGreg Clayton 927*b9c1b51eSKate Stone RegisterContextDarwin_arm::RegisterContextDarwin_arm( 928*b9c1b51eSKate Stone Thread &thread, uint32_t concrete_frame_idx) 929*b9c1b51eSKate Stone : RegisterContext(thread, concrete_frame_idx), gpr(), fpu(), exc() { 93063bd0db0SJason Molenda uint32_t i; 931*b9c1b51eSKate Stone for (i = 0; i < kNumErrors; i++) { 93263bd0db0SJason Molenda gpr_errs[i] = -1; 93363bd0db0SJason Molenda fpu_errs[i] = -1; 93463bd0db0SJason Molenda exc_errs[i] = -1; 93563bd0db0SJason Molenda } 93663bd0db0SJason Molenda } 93763bd0db0SJason Molenda 938*b9c1b51eSKate Stone RegisterContextDarwin_arm::~RegisterContextDarwin_arm() {} 93963bd0db0SJason Molenda 940*b9c1b51eSKate Stone void RegisterContextDarwin_arm::InvalidateAllRegisters() { 941a63d08c9SGreg Clayton InvalidateAllRegisterStates(); 942a63d08c9SGreg Clayton } 943a63d08c9SGreg Clayton 944*b9c1b51eSKate Stone size_t RegisterContextDarwin_arm::GetRegisterCount() { 945a63d08c9SGreg Clayton assert(k_num_register_infos == k_num_registers); 946a63d08c9SGreg Clayton return k_num_registers; 947a63d08c9SGreg Clayton } 948a63d08c9SGreg Clayton 949a63d08c9SGreg Clayton const RegisterInfo * 950*b9c1b51eSKate Stone RegisterContextDarwin_arm::GetRegisterInfoAtIndex(size_t reg) { 951a63d08c9SGreg Clayton assert(k_num_register_infos == k_num_registers); 952a63d08c9SGreg Clayton if (reg < k_num_registers) 953a63d08c9SGreg Clayton return &g_register_infos[reg]; 954a63d08c9SGreg Clayton return NULL; 955a63d08c9SGreg Clayton } 956a63d08c9SGreg Clayton 957*b9c1b51eSKate Stone size_t RegisterContextDarwin_arm::GetRegisterInfosCount() { 958a63d08c9SGreg Clayton return k_num_register_infos; 959a63d08c9SGreg Clayton } 960a63d08c9SGreg Clayton 961*b9c1b51eSKate Stone const RegisterInfo *RegisterContextDarwin_arm::GetRegisterInfos() { 962a63d08c9SGreg Clayton return g_register_infos; 963a63d08c9SGreg Clayton } 964a63d08c9SGreg Clayton 965a63d08c9SGreg Clayton // Number of registers in each register set 96628606954SSaleem Abdulrasool const size_t k_num_gpr_registers = llvm::array_lengthof(g_gpr_regnums); 96728606954SSaleem Abdulrasool const size_t k_num_fpu_registers = llvm::array_lengthof(g_fpu_regnums); 96828606954SSaleem Abdulrasool const size_t k_num_exc_registers = llvm::array_lengthof(g_exc_regnums); 969a63d08c9SGreg Clayton 970a63d08c9SGreg Clayton //---------------------------------------------------------------------- 971a63d08c9SGreg Clayton // Register set definitions. The first definitions at register set index 972a63d08c9SGreg Clayton // of zero is for all registers, followed by other registers sets. The 973a63d08c9SGreg Clayton // register information for the all register set need not be filled in. 974a63d08c9SGreg Clayton //---------------------------------------------------------------------- 975*b9c1b51eSKate Stone static const RegisterSet g_reg_sets[] = { 976a63d08c9SGreg Clayton { 977*b9c1b51eSKate Stone "General Purpose Registers", "gpr", k_num_gpr_registers, g_gpr_regnums, 978*b9c1b51eSKate Stone }, 979a63d08c9SGreg Clayton {"Floating Point Registers", "fpu", k_num_fpu_registers, g_fpu_regnums}, 980*b9c1b51eSKate Stone {"Exception State Registers", "exc", k_num_exc_registers, g_exc_regnums}}; 981a63d08c9SGreg Clayton 98228606954SSaleem Abdulrasool const size_t k_num_regsets = llvm::array_lengthof(g_reg_sets); 983a63d08c9SGreg Clayton 984*b9c1b51eSKate Stone size_t RegisterContextDarwin_arm::GetRegisterSetCount() { 985a63d08c9SGreg Clayton return k_num_regsets; 986a63d08c9SGreg Clayton } 987a63d08c9SGreg Clayton 988*b9c1b51eSKate Stone const RegisterSet *RegisterContextDarwin_arm::GetRegisterSet(size_t reg_set) { 989a63d08c9SGreg Clayton if (reg_set < k_num_regsets) 990a63d08c9SGreg Clayton return &g_reg_sets[reg_set]; 991a63d08c9SGreg Clayton return NULL; 992a63d08c9SGreg Clayton } 993a63d08c9SGreg Clayton 994a63d08c9SGreg Clayton //---------------------------------------------------------------------- 995aaa0ba31SBruce Mitchener // Register information definitions for 32 bit i386. 996a63d08c9SGreg Clayton //---------------------------------------------------------------------- 997*b9c1b51eSKate Stone int RegisterContextDarwin_arm::GetSetForNativeRegNum(int reg) { 998a63d08c9SGreg Clayton if (reg < fpu_s0) 999a63d08c9SGreg Clayton return GPRRegSet; 1000a63d08c9SGreg Clayton else if (reg < exc_exception) 1001a63d08c9SGreg Clayton return FPURegSet; 1002a63d08c9SGreg Clayton else if (reg < k_num_registers) 1003a63d08c9SGreg Clayton return EXCRegSet; 1004a63d08c9SGreg Clayton return -1; 1005a63d08c9SGreg Clayton } 1006a63d08c9SGreg Clayton 1007*b9c1b51eSKate Stone int RegisterContextDarwin_arm::ReadGPR(bool force) { 1008a63d08c9SGreg Clayton int set = GPRRegSet; 1009*b9c1b51eSKate Stone if (force || !RegisterSetIsCached(set)) { 1010a63d08c9SGreg Clayton SetError(set, Read, DoReadGPR(GetThreadID(), set, gpr)); 1011a63d08c9SGreg Clayton } 1012a63d08c9SGreg Clayton return GetError(GPRRegSet, Read); 1013a63d08c9SGreg Clayton } 1014a63d08c9SGreg Clayton 1015*b9c1b51eSKate Stone int RegisterContextDarwin_arm::ReadFPU(bool force) { 1016a63d08c9SGreg Clayton int set = FPURegSet; 1017*b9c1b51eSKate Stone if (force || !RegisterSetIsCached(set)) { 1018a63d08c9SGreg Clayton SetError(set, Read, DoReadFPU(GetThreadID(), set, fpu)); 1019a63d08c9SGreg Clayton } 1020a63d08c9SGreg Clayton return GetError(FPURegSet, Read); 1021a63d08c9SGreg Clayton } 1022a63d08c9SGreg Clayton 1023*b9c1b51eSKate Stone int RegisterContextDarwin_arm::ReadEXC(bool force) { 1024a63d08c9SGreg Clayton int set = EXCRegSet; 1025*b9c1b51eSKate Stone if (force || !RegisterSetIsCached(set)) { 1026a63d08c9SGreg Clayton SetError(set, Read, DoReadEXC(GetThreadID(), set, exc)); 1027a63d08c9SGreg Clayton } 1028a63d08c9SGreg Clayton return GetError(EXCRegSet, Read); 1029a63d08c9SGreg Clayton } 1030a63d08c9SGreg Clayton 1031*b9c1b51eSKate Stone int RegisterContextDarwin_arm::ReadDBG(bool force) { 1032a63d08c9SGreg Clayton int set = DBGRegSet; 1033*b9c1b51eSKate Stone if (force || !RegisterSetIsCached(set)) { 1034a63d08c9SGreg Clayton SetError(set, Read, DoReadDBG(GetThreadID(), set, dbg)); 1035a63d08c9SGreg Clayton } 1036a63d08c9SGreg Clayton return GetError(DBGRegSet, Read); 1037a63d08c9SGreg Clayton } 1038a63d08c9SGreg Clayton 1039*b9c1b51eSKate Stone int RegisterContextDarwin_arm::WriteGPR() { 1040a63d08c9SGreg Clayton int set = GPRRegSet; 1041*b9c1b51eSKate Stone if (!RegisterSetIsCached(set)) { 1042a63d08c9SGreg Clayton SetError(set, Write, -1); 1043a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1044a63d08c9SGreg Clayton } 1045a63d08c9SGreg Clayton SetError(set, Write, DoWriteGPR(GetThreadID(), set, gpr)); 1046a63d08c9SGreg Clayton SetError(set, Read, -1); 1047a63d08c9SGreg Clayton return GetError(GPRRegSet, Write); 1048a63d08c9SGreg Clayton } 1049a63d08c9SGreg Clayton 1050*b9c1b51eSKate Stone int RegisterContextDarwin_arm::WriteFPU() { 1051a63d08c9SGreg Clayton int set = FPURegSet; 1052*b9c1b51eSKate Stone if (!RegisterSetIsCached(set)) { 1053a63d08c9SGreg Clayton SetError(set, Write, -1); 1054a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1055a63d08c9SGreg Clayton } 1056a63d08c9SGreg Clayton SetError(set, Write, DoWriteFPU(GetThreadID(), set, fpu)); 1057a63d08c9SGreg Clayton SetError(set, Read, -1); 1058a63d08c9SGreg Clayton return GetError(FPURegSet, Write); 1059a63d08c9SGreg Clayton } 1060a63d08c9SGreg Clayton 1061*b9c1b51eSKate Stone int RegisterContextDarwin_arm::WriteEXC() { 1062a63d08c9SGreg Clayton int set = EXCRegSet; 1063*b9c1b51eSKate Stone if (!RegisterSetIsCached(set)) { 1064a63d08c9SGreg Clayton SetError(set, Write, -1); 1065a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1066a63d08c9SGreg Clayton } 1067a63d08c9SGreg Clayton SetError(set, Write, DoWriteEXC(GetThreadID(), set, exc)); 1068a63d08c9SGreg Clayton SetError(set, Read, -1); 1069a63d08c9SGreg Clayton return GetError(EXCRegSet, Write); 1070a63d08c9SGreg Clayton } 1071a63d08c9SGreg Clayton 1072*b9c1b51eSKate Stone int RegisterContextDarwin_arm::WriteDBG() { 1073a63d08c9SGreg Clayton int set = DBGRegSet; 1074*b9c1b51eSKate Stone if (!RegisterSetIsCached(set)) { 1075a63d08c9SGreg Clayton SetError(set, Write, -1); 1076a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1077a63d08c9SGreg Clayton } 1078a63d08c9SGreg Clayton SetError(set, Write, DoWriteDBG(GetThreadID(), set, dbg)); 1079a63d08c9SGreg Clayton SetError(set, Read, -1); 1080a63d08c9SGreg Clayton return GetError(DBGRegSet, Write); 1081a63d08c9SGreg Clayton } 1082a63d08c9SGreg Clayton 1083*b9c1b51eSKate Stone int RegisterContextDarwin_arm::ReadRegisterSet(uint32_t set, bool force) { 1084*b9c1b51eSKate Stone switch (set) { 1085*b9c1b51eSKate Stone case GPRRegSet: 1086*b9c1b51eSKate Stone return ReadGPR(force); 1087*b9c1b51eSKate Stone case GPRAltRegSet: 1088*b9c1b51eSKate Stone return ReadGPR(force); 1089*b9c1b51eSKate Stone case FPURegSet: 1090*b9c1b51eSKate Stone return ReadFPU(force); 1091*b9c1b51eSKate Stone case EXCRegSet: 1092*b9c1b51eSKate Stone return ReadEXC(force); 1093*b9c1b51eSKate Stone case DBGRegSet: 1094*b9c1b51eSKate Stone return ReadDBG(force); 1095*b9c1b51eSKate Stone default: 1096*b9c1b51eSKate Stone break; 1097a63d08c9SGreg Clayton } 1098a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1099a63d08c9SGreg Clayton } 1100a63d08c9SGreg Clayton 1101*b9c1b51eSKate Stone int RegisterContextDarwin_arm::WriteRegisterSet(uint32_t set) { 1102a63d08c9SGreg Clayton // Make sure we have a valid context to set. 1103*b9c1b51eSKate Stone if (RegisterSetIsCached(set)) { 1104*b9c1b51eSKate Stone switch (set) { 1105*b9c1b51eSKate Stone case GPRRegSet: 1106*b9c1b51eSKate Stone return WriteGPR(); 1107*b9c1b51eSKate Stone case GPRAltRegSet: 1108*b9c1b51eSKate Stone return WriteGPR(); 1109*b9c1b51eSKate Stone case FPURegSet: 1110*b9c1b51eSKate Stone return WriteFPU(); 1111*b9c1b51eSKate Stone case EXCRegSet: 1112*b9c1b51eSKate Stone return WriteEXC(); 1113*b9c1b51eSKate Stone case DBGRegSet: 1114*b9c1b51eSKate Stone return WriteDBG(); 1115*b9c1b51eSKate Stone default: 1116*b9c1b51eSKate Stone break; 1117a63d08c9SGreg Clayton } 1118a63d08c9SGreg Clayton } 1119a63d08c9SGreg Clayton return KERN_INVALID_ARGUMENT; 1120a63d08c9SGreg Clayton } 1121a63d08c9SGreg Clayton 1122*b9c1b51eSKate Stone void RegisterContextDarwin_arm::LogDBGRegisters(Log *log, const DBG &dbg) { 1123*b9c1b51eSKate Stone if (log) { 1124a63d08c9SGreg Clayton for (uint32_t i = 0; i < 16; i++) 1125*b9c1b51eSKate Stone log->Printf("BVR%-2u/BCR%-2u = { 0x%8.8x, 0x%8.8x } WVR%-2u/WCR%-2u = { " 1126*b9c1b51eSKate Stone "0x%8.8x, 0x%8.8x }", 1127*b9c1b51eSKate Stone i, i, dbg.bvr[i], dbg.bcr[i], i, i, dbg.wvr[i], dbg.wcr[i]); 1128a63d08c9SGreg Clayton } 1129a63d08c9SGreg Clayton } 1130a63d08c9SGreg Clayton 1131*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::ReadRegister(const RegisterInfo *reg_info, 1132*b9c1b51eSKate Stone RegisterValue &value) { 1133a63d08c9SGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 1134a63d08c9SGreg Clayton int set = RegisterContextDarwin_arm::GetSetForNativeRegNum(reg); 1135a63d08c9SGreg Clayton 1136a63d08c9SGreg Clayton if (set == -1) 1137a63d08c9SGreg Clayton return false; 1138a63d08c9SGreg Clayton 1139a63d08c9SGreg Clayton if (ReadRegisterSet(set, false) != KERN_SUCCESS) 1140a63d08c9SGreg Clayton return false; 1141a63d08c9SGreg Clayton 1142*b9c1b51eSKate Stone switch (reg) { 1143a63d08c9SGreg Clayton case gpr_r0: 1144a63d08c9SGreg Clayton case gpr_r1: 1145a63d08c9SGreg Clayton case gpr_r2: 1146a63d08c9SGreg Clayton case gpr_r3: 1147a63d08c9SGreg Clayton case gpr_r4: 1148a63d08c9SGreg Clayton case gpr_r5: 1149a63d08c9SGreg Clayton case gpr_r6: 1150a63d08c9SGreg Clayton case gpr_r7: 1151a63d08c9SGreg Clayton case gpr_r8: 1152a63d08c9SGreg Clayton case gpr_r9: 1153a63d08c9SGreg Clayton case gpr_r10: 1154a63d08c9SGreg Clayton case gpr_r11: 1155a63d08c9SGreg Clayton case gpr_r12: 1156a63d08c9SGreg Clayton case gpr_sp: 1157a63d08c9SGreg Clayton case gpr_lr: 1158a63d08c9SGreg Clayton case gpr_pc: 1159a63d08c9SGreg Clayton case gpr_cpsr: 1160a63d08c9SGreg Clayton value.SetUInt32(gpr.r[reg - gpr_r0]); 1161a63d08c9SGreg Clayton break; 1162a63d08c9SGreg Clayton 1163a63d08c9SGreg Clayton case fpu_s0: 1164a63d08c9SGreg Clayton case fpu_s1: 1165a63d08c9SGreg Clayton case fpu_s2: 1166a63d08c9SGreg Clayton case fpu_s3: 1167a63d08c9SGreg Clayton case fpu_s4: 1168a63d08c9SGreg Clayton case fpu_s5: 1169a63d08c9SGreg Clayton case fpu_s6: 1170a63d08c9SGreg Clayton case fpu_s7: 1171a63d08c9SGreg Clayton case fpu_s8: 1172a63d08c9SGreg Clayton case fpu_s9: 1173a63d08c9SGreg Clayton case fpu_s10: 1174a63d08c9SGreg Clayton case fpu_s11: 1175a63d08c9SGreg Clayton case fpu_s12: 1176a63d08c9SGreg Clayton case fpu_s13: 1177a63d08c9SGreg Clayton case fpu_s14: 1178a63d08c9SGreg Clayton case fpu_s15: 1179a63d08c9SGreg Clayton case fpu_s16: 1180a63d08c9SGreg Clayton case fpu_s17: 1181a63d08c9SGreg Clayton case fpu_s18: 1182a63d08c9SGreg Clayton case fpu_s19: 1183a63d08c9SGreg Clayton case fpu_s20: 1184a63d08c9SGreg Clayton case fpu_s21: 1185a63d08c9SGreg Clayton case fpu_s22: 1186a63d08c9SGreg Clayton case fpu_s23: 1187a63d08c9SGreg Clayton case fpu_s24: 1188a63d08c9SGreg Clayton case fpu_s25: 1189a63d08c9SGreg Clayton case fpu_s26: 1190a63d08c9SGreg Clayton case fpu_s27: 1191a63d08c9SGreg Clayton case fpu_s28: 1192a63d08c9SGreg Clayton case fpu_s29: 1193a63d08c9SGreg Clayton case fpu_s30: 1194a63d08c9SGreg Clayton case fpu_s31: 1195a63d08c9SGreg Clayton value.SetUInt32(fpu.floats.s[reg], RegisterValue::eTypeFloat); 1196a63d08c9SGreg Clayton break; 1197a63d08c9SGreg Clayton 1198a63d08c9SGreg Clayton case fpu_fpscr: 1199a63d08c9SGreg Clayton value.SetUInt32(fpu.fpscr); 1200a63d08c9SGreg Clayton break; 1201a63d08c9SGreg Clayton 1202a63d08c9SGreg Clayton case exc_exception: 1203a63d08c9SGreg Clayton value.SetUInt32(exc.exception); 1204a63d08c9SGreg Clayton break; 1205a63d08c9SGreg Clayton case exc_fsr: 1206a63d08c9SGreg Clayton value.SetUInt32(exc.fsr); 1207a63d08c9SGreg Clayton break; 1208a63d08c9SGreg Clayton case exc_far: 1209a63d08c9SGreg Clayton value.SetUInt32(exc.far); 1210a63d08c9SGreg Clayton break; 1211a63d08c9SGreg Clayton 1212a63d08c9SGreg Clayton default: 1213a63d08c9SGreg Clayton value.SetValueToInvalid(); 1214a63d08c9SGreg Clayton return false; 1215a63d08c9SGreg Clayton } 1216a63d08c9SGreg Clayton return true; 1217a63d08c9SGreg Clayton } 1218a63d08c9SGreg Clayton 1219*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::WriteRegister(const RegisterInfo *reg_info, 1220*b9c1b51eSKate Stone const RegisterValue &value) { 1221a63d08c9SGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 1222a63d08c9SGreg Clayton int set = GetSetForNativeRegNum(reg); 1223a63d08c9SGreg Clayton 1224a63d08c9SGreg Clayton if (set == -1) 1225a63d08c9SGreg Clayton return false; 1226a63d08c9SGreg Clayton 1227a63d08c9SGreg Clayton if (ReadRegisterSet(set, false) != KERN_SUCCESS) 1228a63d08c9SGreg Clayton return false; 1229a63d08c9SGreg Clayton 1230*b9c1b51eSKate Stone switch (reg) { 1231a63d08c9SGreg Clayton case gpr_r0: 1232a63d08c9SGreg Clayton case gpr_r1: 1233a63d08c9SGreg Clayton case gpr_r2: 1234a63d08c9SGreg Clayton case gpr_r3: 1235a63d08c9SGreg Clayton case gpr_r4: 1236a63d08c9SGreg Clayton case gpr_r5: 1237a63d08c9SGreg Clayton case gpr_r6: 1238a63d08c9SGreg Clayton case gpr_r7: 1239a63d08c9SGreg Clayton case gpr_r8: 1240a63d08c9SGreg Clayton case gpr_r9: 1241a63d08c9SGreg Clayton case gpr_r10: 1242a63d08c9SGreg Clayton case gpr_r11: 1243a63d08c9SGreg Clayton case gpr_r12: 1244a63d08c9SGreg Clayton case gpr_sp: 1245a63d08c9SGreg Clayton case gpr_lr: 1246a63d08c9SGreg Clayton case gpr_pc: 1247a63d08c9SGreg Clayton case gpr_cpsr: 1248a63d08c9SGreg Clayton gpr.r[reg - gpr_r0] = value.GetAsUInt32(); 1249a63d08c9SGreg Clayton break; 1250a63d08c9SGreg Clayton 1251a63d08c9SGreg Clayton case fpu_s0: 1252a63d08c9SGreg Clayton case fpu_s1: 1253a63d08c9SGreg Clayton case fpu_s2: 1254a63d08c9SGreg Clayton case fpu_s3: 1255a63d08c9SGreg Clayton case fpu_s4: 1256a63d08c9SGreg Clayton case fpu_s5: 1257a63d08c9SGreg Clayton case fpu_s6: 1258a63d08c9SGreg Clayton case fpu_s7: 1259a63d08c9SGreg Clayton case fpu_s8: 1260a63d08c9SGreg Clayton case fpu_s9: 1261a63d08c9SGreg Clayton case fpu_s10: 1262a63d08c9SGreg Clayton case fpu_s11: 1263a63d08c9SGreg Clayton case fpu_s12: 1264a63d08c9SGreg Clayton case fpu_s13: 1265a63d08c9SGreg Clayton case fpu_s14: 1266a63d08c9SGreg Clayton case fpu_s15: 1267a63d08c9SGreg Clayton case fpu_s16: 1268a63d08c9SGreg Clayton case fpu_s17: 1269a63d08c9SGreg Clayton case fpu_s18: 1270a63d08c9SGreg Clayton case fpu_s19: 1271a63d08c9SGreg Clayton case fpu_s20: 1272a63d08c9SGreg Clayton case fpu_s21: 1273a63d08c9SGreg Clayton case fpu_s22: 1274a63d08c9SGreg Clayton case fpu_s23: 1275a63d08c9SGreg Clayton case fpu_s24: 1276a63d08c9SGreg Clayton case fpu_s25: 1277a63d08c9SGreg Clayton case fpu_s26: 1278a63d08c9SGreg Clayton case fpu_s27: 1279a63d08c9SGreg Clayton case fpu_s28: 1280a63d08c9SGreg Clayton case fpu_s29: 1281a63d08c9SGreg Clayton case fpu_s30: 1282a63d08c9SGreg Clayton case fpu_s31: 1283a63d08c9SGreg Clayton fpu.floats.s[reg] = value.GetAsUInt32(); 1284a63d08c9SGreg Clayton break; 1285a63d08c9SGreg Clayton 1286a63d08c9SGreg Clayton case fpu_fpscr: 1287a63d08c9SGreg Clayton fpu.fpscr = value.GetAsUInt32(); 1288a63d08c9SGreg Clayton break; 1289a63d08c9SGreg Clayton 1290a63d08c9SGreg Clayton case exc_exception: 1291a63d08c9SGreg Clayton exc.exception = value.GetAsUInt32(); 1292a63d08c9SGreg Clayton break; 1293a63d08c9SGreg Clayton case exc_fsr: 1294a63d08c9SGreg Clayton exc.fsr = value.GetAsUInt32(); 1295a63d08c9SGreg Clayton break; 1296a63d08c9SGreg Clayton case exc_far: 1297a63d08c9SGreg Clayton exc.far = value.GetAsUInt32(); 1298a63d08c9SGreg Clayton break; 1299a63d08c9SGreg Clayton 1300a63d08c9SGreg Clayton default: 1301a63d08c9SGreg Clayton return false; 1302a63d08c9SGreg Clayton } 1303a63d08c9SGreg Clayton return WriteRegisterSet(set) == KERN_SUCCESS; 1304a63d08c9SGreg Clayton } 1305a63d08c9SGreg Clayton 1306*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::ReadAllRegisterValues( 1307*b9c1b51eSKate Stone lldb::DataBufferSP &data_sp) { 1308a63d08c9SGreg Clayton data_sp.reset(new DataBufferHeap(REG_CONTEXT_SIZE, 0)); 1309*b9c1b51eSKate Stone if (data_sp && ReadGPR(false) == KERN_SUCCESS && 1310*b9c1b51eSKate Stone ReadFPU(false) == KERN_SUCCESS && ReadEXC(false) == KERN_SUCCESS) { 1311a63d08c9SGreg Clayton uint8_t *dst = data_sp->GetBytes(); 1312a63d08c9SGreg Clayton ::memcpy(dst, &gpr, sizeof(gpr)); 1313a63d08c9SGreg Clayton dst += sizeof(gpr); 1314a63d08c9SGreg Clayton 1315a63d08c9SGreg Clayton ::memcpy(dst, &fpu, sizeof(fpu)); 1316a63d08c9SGreg Clayton dst += sizeof(gpr); 1317a63d08c9SGreg Clayton 1318a63d08c9SGreg Clayton ::memcpy(dst, &exc, sizeof(exc)); 1319a63d08c9SGreg Clayton return true; 1320a63d08c9SGreg Clayton } 1321a63d08c9SGreg Clayton return false; 1322a63d08c9SGreg Clayton } 1323a63d08c9SGreg Clayton 1324*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::WriteAllRegisterValues( 1325*b9c1b51eSKate Stone const lldb::DataBufferSP &data_sp) { 1326*b9c1b51eSKate Stone if (data_sp && data_sp->GetByteSize() == REG_CONTEXT_SIZE) { 1327a63d08c9SGreg Clayton const uint8_t *src = data_sp->GetBytes(); 1328a63d08c9SGreg Clayton ::memcpy(&gpr, src, sizeof(gpr)); 1329a63d08c9SGreg Clayton src += sizeof(gpr); 1330a63d08c9SGreg Clayton 1331a63d08c9SGreg Clayton ::memcpy(&fpu, src, sizeof(fpu)); 1332a63d08c9SGreg Clayton src += sizeof(gpr); 1333a63d08c9SGreg Clayton 1334a63d08c9SGreg Clayton ::memcpy(&exc, src, sizeof(exc)); 1335a63d08c9SGreg Clayton uint32_t success_count = 0; 1336a63d08c9SGreg Clayton if (WriteGPR() == KERN_SUCCESS) 1337a63d08c9SGreg Clayton ++success_count; 1338a63d08c9SGreg Clayton if (WriteFPU() == KERN_SUCCESS) 1339a63d08c9SGreg Clayton ++success_count; 1340a63d08c9SGreg Clayton if (WriteEXC() == KERN_SUCCESS) 1341a63d08c9SGreg Clayton ++success_count; 1342a63d08c9SGreg Clayton return success_count == 3; 1343a63d08c9SGreg Clayton } 1344a63d08c9SGreg Clayton return false; 1345a63d08c9SGreg Clayton } 1346a63d08c9SGreg Clayton 1347*b9c1b51eSKate Stone uint32_t RegisterContextDarwin_arm::ConvertRegisterKindToRegisterNumber( 1348*b9c1b51eSKate Stone lldb::RegisterKind kind, uint32_t reg) { 1349*b9c1b51eSKate Stone if (kind == eRegisterKindGeneric) { 1350*b9c1b51eSKate Stone switch (reg) { 1351*b9c1b51eSKate Stone case LLDB_REGNUM_GENERIC_PC: 1352*b9c1b51eSKate Stone return gpr_pc; 1353*b9c1b51eSKate Stone case LLDB_REGNUM_GENERIC_SP: 1354*b9c1b51eSKate Stone return gpr_sp; 1355*b9c1b51eSKate Stone case LLDB_REGNUM_GENERIC_FP: 1356*b9c1b51eSKate Stone return gpr_r7; 1357*b9c1b51eSKate Stone case LLDB_REGNUM_GENERIC_RA: 1358*b9c1b51eSKate Stone return gpr_lr; 1359*b9c1b51eSKate Stone case LLDB_REGNUM_GENERIC_FLAGS: 1360*b9c1b51eSKate Stone return gpr_cpsr; 1361a63d08c9SGreg Clayton default: 1362a63d08c9SGreg Clayton break; 1363a63d08c9SGreg Clayton } 1364*b9c1b51eSKate Stone } else if (kind == eRegisterKindDWARF) { 1365*b9c1b51eSKate Stone switch (reg) { 1366*b9c1b51eSKate Stone case dwarf_r0: 1367*b9c1b51eSKate Stone return gpr_r0; 1368*b9c1b51eSKate Stone case dwarf_r1: 1369*b9c1b51eSKate Stone return gpr_r1; 1370*b9c1b51eSKate Stone case dwarf_r2: 1371*b9c1b51eSKate Stone return gpr_r2; 1372*b9c1b51eSKate Stone case dwarf_r3: 1373*b9c1b51eSKate Stone return gpr_r3; 1374*b9c1b51eSKate Stone case dwarf_r4: 1375*b9c1b51eSKate Stone return gpr_r4; 1376*b9c1b51eSKate Stone case dwarf_r5: 1377*b9c1b51eSKate Stone return gpr_r5; 1378*b9c1b51eSKate Stone case dwarf_r6: 1379*b9c1b51eSKate Stone return gpr_r6; 1380*b9c1b51eSKate Stone case dwarf_r7: 1381*b9c1b51eSKate Stone return gpr_r7; 1382*b9c1b51eSKate Stone case dwarf_r8: 1383*b9c1b51eSKate Stone return gpr_r8; 1384*b9c1b51eSKate Stone case dwarf_r9: 1385*b9c1b51eSKate Stone return gpr_r9; 1386*b9c1b51eSKate Stone case dwarf_r10: 1387*b9c1b51eSKate Stone return gpr_r10; 1388*b9c1b51eSKate Stone case dwarf_r11: 1389*b9c1b51eSKate Stone return gpr_r11; 1390*b9c1b51eSKate Stone case dwarf_r12: 1391*b9c1b51eSKate Stone return gpr_r12; 1392*b9c1b51eSKate Stone case dwarf_sp: 1393*b9c1b51eSKate Stone return gpr_sp; 1394*b9c1b51eSKate Stone case dwarf_lr: 1395*b9c1b51eSKate Stone return gpr_lr; 1396*b9c1b51eSKate Stone case dwarf_pc: 1397*b9c1b51eSKate Stone return gpr_pc; 1398*b9c1b51eSKate Stone case dwarf_spsr: 1399*b9c1b51eSKate Stone return gpr_cpsr; 1400a63d08c9SGreg Clayton 1401*b9c1b51eSKate Stone case dwarf_s0: 1402*b9c1b51eSKate Stone return fpu_s0; 1403*b9c1b51eSKate Stone case dwarf_s1: 1404*b9c1b51eSKate Stone return fpu_s1; 1405*b9c1b51eSKate Stone case dwarf_s2: 1406*b9c1b51eSKate Stone return fpu_s2; 1407*b9c1b51eSKate Stone case dwarf_s3: 1408*b9c1b51eSKate Stone return fpu_s3; 1409*b9c1b51eSKate Stone case dwarf_s4: 1410*b9c1b51eSKate Stone return fpu_s4; 1411*b9c1b51eSKate Stone case dwarf_s5: 1412*b9c1b51eSKate Stone return fpu_s5; 1413*b9c1b51eSKate Stone case dwarf_s6: 1414*b9c1b51eSKate Stone return fpu_s6; 1415*b9c1b51eSKate Stone case dwarf_s7: 1416*b9c1b51eSKate Stone return fpu_s7; 1417*b9c1b51eSKate Stone case dwarf_s8: 1418*b9c1b51eSKate Stone return fpu_s8; 1419*b9c1b51eSKate Stone case dwarf_s9: 1420*b9c1b51eSKate Stone return fpu_s9; 1421*b9c1b51eSKate Stone case dwarf_s10: 1422*b9c1b51eSKate Stone return fpu_s10; 1423*b9c1b51eSKate Stone case dwarf_s11: 1424*b9c1b51eSKate Stone return fpu_s11; 1425*b9c1b51eSKate Stone case dwarf_s12: 1426*b9c1b51eSKate Stone return fpu_s12; 1427*b9c1b51eSKate Stone case dwarf_s13: 1428*b9c1b51eSKate Stone return fpu_s13; 1429*b9c1b51eSKate Stone case dwarf_s14: 1430*b9c1b51eSKate Stone return fpu_s14; 1431*b9c1b51eSKate Stone case dwarf_s15: 1432*b9c1b51eSKate Stone return fpu_s15; 1433*b9c1b51eSKate Stone case dwarf_s16: 1434*b9c1b51eSKate Stone return fpu_s16; 1435*b9c1b51eSKate Stone case dwarf_s17: 1436*b9c1b51eSKate Stone return fpu_s17; 1437*b9c1b51eSKate Stone case dwarf_s18: 1438*b9c1b51eSKate Stone return fpu_s18; 1439*b9c1b51eSKate Stone case dwarf_s19: 1440*b9c1b51eSKate Stone return fpu_s19; 1441*b9c1b51eSKate Stone case dwarf_s20: 1442*b9c1b51eSKate Stone return fpu_s20; 1443*b9c1b51eSKate Stone case dwarf_s21: 1444*b9c1b51eSKate Stone return fpu_s21; 1445*b9c1b51eSKate Stone case dwarf_s22: 1446*b9c1b51eSKate Stone return fpu_s22; 1447*b9c1b51eSKate Stone case dwarf_s23: 1448*b9c1b51eSKate Stone return fpu_s23; 1449*b9c1b51eSKate Stone case dwarf_s24: 1450*b9c1b51eSKate Stone return fpu_s24; 1451*b9c1b51eSKate Stone case dwarf_s25: 1452*b9c1b51eSKate Stone return fpu_s25; 1453*b9c1b51eSKate Stone case dwarf_s26: 1454*b9c1b51eSKate Stone return fpu_s26; 1455*b9c1b51eSKate Stone case dwarf_s27: 1456*b9c1b51eSKate Stone return fpu_s27; 1457*b9c1b51eSKate Stone case dwarf_s28: 1458*b9c1b51eSKate Stone return fpu_s28; 1459*b9c1b51eSKate Stone case dwarf_s29: 1460*b9c1b51eSKate Stone return fpu_s29; 1461*b9c1b51eSKate Stone case dwarf_s30: 1462*b9c1b51eSKate Stone return fpu_s30; 1463*b9c1b51eSKate Stone case dwarf_s31: 1464*b9c1b51eSKate Stone return fpu_s31; 1465a63d08c9SGreg Clayton 1466a63d08c9SGreg Clayton default: 1467a63d08c9SGreg Clayton break; 1468a63d08c9SGreg Clayton } 1469*b9c1b51eSKate Stone } else if (kind == eRegisterKindEHFrame) { 1470*b9c1b51eSKate Stone switch (reg) { 1471*b9c1b51eSKate Stone case ehframe_r0: 1472*b9c1b51eSKate Stone return gpr_r0; 1473*b9c1b51eSKate Stone case ehframe_r1: 1474*b9c1b51eSKate Stone return gpr_r1; 1475*b9c1b51eSKate Stone case ehframe_r2: 1476*b9c1b51eSKate Stone return gpr_r2; 1477*b9c1b51eSKate Stone case ehframe_r3: 1478*b9c1b51eSKate Stone return gpr_r3; 1479*b9c1b51eSKate Stone case ehframe_r4: 1480*b9c1b51eSKate Stone return gpr_r4; 1481*b9c1b51eSKate Stone case ehframe_r5: 1482*b9c1b51eSKate Stone return gpr_r5; 1483*b9c1b51eSKate Stone case ehframe_r6: 1484*b9c1b51eSKate Stone return gpr_r6; 1485*b9c1b51eSKate Stone case ehframe_r7: 1486*b9c1b51eSKate Stone return gpr_r7; 1487*b9c1b51eSKate Stone case ehframe_r8: 1488*b9c1b51eSKate Stone return gpr_r8; 1489*b9c1b51eSKate Stone case ehframe_r9: 1490*b9c1b51eSKate Stone return gpr_r9; 1491*b9c1b51eSKate Stone case ehframe_r10: 1492*b9c1b51eSKate Stone return gpr_r10; 1493*b9c1b51eSKate Stone case ehframe_r11: 1494*b9c1b51eSKate Stone return gpr_r11; 1495*b9c1b51eSKate Stone case ehframe_r12: 1496*b9c1b51eSKate Stone return gpr_r12; 1497*b9c1b51eSKate Stone case ehframe_sp: 1498*b9c1b51eSKate Stone return gpr_sp; 1499*b9c1b51eSKate Stone case ehframe_lr: 1500*b9c1b51eSKate Stone return gpr_lr; 1501*b9c1b51eSKate Stone case ehframe_pc: 1502*b9c1b51eSKate Stone return gpr_pc; 1503*b9c1b51eSKate Stone case ehframe_cpsr: 1504*b9c1b51eSKate Stone return gpr_cpsr; 1505a63d08c9SGreg Clayton } 1506*b9c1b51eSKate Stone } else if (kind == eRegisterKindLLDB) { 1507a63d08c9SGreg Clayton return reg; 1508a63d08c9SGreg Clayton } 1509a63d08c9SGreg Clayton return LLDB_INVALID_REGNUM; 1510a63d08c9SGreg Clayton } 1511a63d08c9SGreg Clayton 1512*b9c1b51eSKate Stone uint32_t RegisterContextDarwin_arm::NumSupportedHardwareBreakpoints() { 1513a63d08c9SGreg Clayton #if defined(__arm__) 1514a63d08c9SGreg Clayton // Set the init value to something that will let us know that we need to 1515a63d08c9SGreg Clayton // autodetect how many breakpoints are supported dynamically... 1516a63d08c9SGreg Clayton static uint32_t g_num_supported_hw_breakpoints = UINT32_MAX; 1517*b9c1b51eSKate Stone if (g_num_supported_hw_breakpoints == UINT32_MAX) { 1518a63d08c9SGreg Clayton // Set this to zero in case we can't tell if there are any HW breakpoints 1519a63d08c9SGreg Clayton g_num_supported_hw_breakpoints = 0; 1520a63d08c9SGreg Clayton 1521a63d08c9SGreg Clayton uint32_t register_DBGDIDR; 1522a63d08c9SGreg Clayton 1523a63d08c9SGreg Clayton asm("mrc p14, 0, %0, c0, c0, 0" : "=r"(register_DBGDIDR)); 1524dce502edSGreg Clayton g_num_supported_hw_breakpoints = Bits32(register_DBGDIDR, 27, 24); 1525a63d08c9SGreg Clayton // Zero is reserved for the BRP count, so don't increment it if it is zero 1526a63d08c9SGreg Clayton if (g_num_supported_hw_breakpoints > 0) 1527a63d08c9SGreg Clayton g_num_supported_hw_breakpoints++; 1528*b9c1b51eSKate Stone // if (log) log->Printf ("DBGDIDR=0x%8.8x (number BRP pairs = %u)", 1529*b9c1b51eSKate Stone // register_DBGDIDR, g_num_supported_hw_breakpoints); 1530a63d08c9SGreg Clayton } 1531a63d08c9SGreg Clayton return g_num_supported_hw_breakpoints; 1532a63d08c9SGreg Clayton #else 1533a63d08c9SGreg Clayton // TODO: figure out remote case here! 1534a63d08c9SGreg Clayton return 6; 1535a63d08c9SGreg Clayton #endif 1536a63d08c9SGreg Clayton } 1537a63d08c9SGreg Clayton 1538*b9c1b51eSKate Stone uint32_t RegisterContextDarwin_arm::SetHardwareBreakpoint(lldb::addr_t addr, 1539*b9c1b51eSKate Stone size_t size) { 1540a63d08c9SGreg Clayton // Make sure our address isn't bogus 1541a63d08c9SGreg Clayton if (addr & 1) 1542a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1543a63d08c9SGreg Clayton 1544a63d08c9SGreg Clayton int kret = ReadDBG(false); 1545a63d08c9SGreg Clayton 1546*b9c1b51eSKate Stone if (kret == KERN_SUCCESS) { 1547a63d08c9SGreg Clayton const uint32_t num_hw_breakpoints = NumSupportedHardwareBreakpoints(); 1548a63d08c9SGreg Clayton uint32_t i; 1549*b9c1b51eSKate Stone for (i = 0; i < num_hw_breakpoints; ++i) { 1550a63d08c9SGreg Clayton if ((dbg.bcr[i] & BCR_ENABLE) == 0) 1551a63d08c9SGreg Clayton break; // We found an available hw breakpoint slot (in i) 1552a63d08c9SGreg Clayton } 1553a63d08c9SGreg Clayton 1554a63d08c9SGreg Clayton // See if we found an available hw breakpoint slot above 1555*b9c1b51eSKate Stone if (i < num_hw_breakpoints) { 1556a63d08c9SGreg Clayton // Make sure bits 1:0 are clear in our address 1557a63d08c9SGreg Clayton dbg.bvr[i] = addr & ~((lldb::addr_t)3); 1558a63d08c9SGreg Clayton 1559*b9c1b51eSKate Stone if (size == 2 || addr & 2) { 1560a63d08c9SGreg Clayton uint32_t byte_addr_select = (addr & 2) ? BAS_IMVA_2_3 : BAS_IMVA_0_1; 1561a63d08c9SGreg Clayton 1562a63d08c9SGreg Clayton // We have a thumb breakpoint 1563a63d08c9SGreg Clayton // We have an ARM breakpoint 1564a63d08c9SGreg Clayton dbg.bcr[i] = BCR_M_IMVA_MATCH | // Stop on address mismatch 1565*b9c1b51eSKate Stone byte_addr_select | // Set the correct byte address select 1566*b9c1b51eSKate Stone // so we only trigger on the correct 1567*b9c1b51eSKate Stone // opcode 1568a63d08c9SGreg Clayton S_USER | // Which modes should this breakpoint stop in? 1569a63d08c9SGreg Clayton BCR_ENABLE; // Enable this hardware breakpoint 1570*b9c1b51eSKate Stone // if (log) log->Printf 1571*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareBreakpoint( 1572*b9c1b51eSKate Stone // addr = %8.8p, size = %u ) - BVR%u/BCR%u = 0x%8.8x / 1573*b9c1b51eSKate Stone // 0x%8.8x (Thumb)", 157489f138aeSGreg Clayton // addr, 157589f138aeSGreg Clayton // size, 157689f138aeSGreg Clayton // i, 157789f138aeSGreg Clayton // i, 157889f138aeSGreg Clayton // dbg.bvr[i], 157989f138aeSGreg Clayton // dbg.bcr[i]); 1580*b9c1b51eSKate Stone } else if (size == 4) { 1581a63d08c9SGreg Clayton // We have an ARM breakpoint 1582*b9c1b51eSKate Stone dbg.bcr[i] = 1583*b9c1b51eSKate Stone BCR_M_IMVA_MATCH | // Stop on address mismatch 1584a63d08c9SGreg Clayton BAS_IMVA_ALL | // Stop on any of the four bytes following the IMVA 1585a63d08c9SGreg Clayton S_USER | // Which modes should this breakpoint stop in? 1586a63d08c9SGreg Clayton BCR_ENABLE; // Enable this hardware breakpoint 1587*b9c1b51eSKate Stone // if (log) log->Printf 1588*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareBreakpoint( 1589*b9c1b51eSKate Stone // addr = %8.8p, size = %u ) - BVR%u/BCR%u = 0x%8.8x / 1590*b9c1b51eSKate Stone // 0x%8.8x (ARM)", 159189f138aeSGreg Clayton // addr, 159289f138aeSGreg Clayton // size, 159389f138aeSGreg Clayton // i, 159489f138aeSGreg Clayton // i, 159589f138aeSGreg Clayton // dbg.bvr[i], 159689f138aeSGreg Clayton // dbg.bcr[i]); 1597a63d08c9SGreg Clayton } 1598a63d08c9SGreg Clayton 1599a63d08c9SGreg Clayton kret = WriteDBG(); 1600*b9c1b51eSKate Stone // if (log) log->Printf 1601*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareBreakpoint() 1602*b9c1b51eSKate Stone // WriteDBG() => 0x%8.8x.", kret); 1603a63d08c9SGreg Clayton 1604a63d08c9SGreg Clayton if (kret == KERN_SUCCESS) 1605a63d08c9SGreg Clayton return i; 1606a63d08c9SGreg Clayton } 160789f138aeSGreg Clayton // else 160889f138aeSGreg Clayton // { 1609*b9c1b51eSKate Stone // if (log) log->Printf 1610*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareBreakpoint(addr = 1611*b9c1b51eSKate Stone // %8.8p, size = %u) => all hardware breakpoint resources are 1612*b9c1b51eSKate Stone // being used.", addr, size); 161389f138aeSGreg Clayton // } 1614a63d08c9SGreg Clayton } 1615a63d08c9SGreg Clayton 1616a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1617a63d08c9SGreg Clayton } 1618a63d08c9SGreg Clayton 1619*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::ClearHardwareBreakpoint(uint32_t hw_index) { 1620a63d08c9SGreg Clayton int kret = ReadDBG(false); 1621a63d08c9SGreg Clayton 1622a63d08c9SGreg Clayton const uint32_t num_hw_points = NumSupportedHardwareBreakpoints(); 1623*b9c1b51eSKate Stone if (kret == KERN_SUCCESS) { 1624*b9c1b51eSKate Stone if (hw_index < num_hw_points) { 1625a63d08c9SGreg Clayton dbg.bcr[hw_index] = 0; 1626*b9c1b51eSKate Stone // if (log) log->Printf 1627*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::SetHardwareBreakpoint( %u ) - 1628*b9c1b51eSKate Stone // BVR%u = 0x%8.8x BCR%u = 0x%8.8x", 162989f138aeSGreg Clayton // hw_index, 163089f138aeSGreg Clayton // hw_index, 163189f138aeSGreg Clayton // dbg.bvr[hw_index], 163289f138aeSGreg Clayton // hw_index, 163389f138aeSGreg Clayton // dbg.bcr[hw_index]); 1634a63d08c9SGreg Clayton 1635a63d08c9SGreg Clayton kret = WriteDBG(); 1636a63d08c9SGreg Clayton 1637a63d08c9SGreg Clayton if (kret == KERN_SUCCESS) 1638a63d08c9SGreg Clayton return true; 1639a63d08c9SGreg Clayton } 1640a63d08c9SGreg Clayton } 1641a63d08c9SGreg Clayton return false; 1642a63d08c9SGreg Clayton } 1643a63d08c9SGreg Clayton 1644*b9c1b51eSKate Stone uint32_t RegisterContextDarwin_arm::NumSupportedHardwareWatchpoints() { 1645a63d08c9SGreg Clayton #if defined(__arm__) 1646a63d08c9SGreg Clayton // Set the init value to something that will let us know that we need to 1647a63d08c9SGreg Clayton // autodetect how many watchpoints are supported dynamically... 1648a63d08c9SGreg Clayton static uint32_t g_num_supported_hw_watchpoints = UINT32_MAX; 1649*b9c1b51eSKate Stone if (g_num_supported_hw_watchpoints == UINT32_MAX) { 1650a63d08c9SGreg Clayton // Set this to zero in case we can't tell if there are any HW breakpoints 1651a63d08c9SGreg Clayton g_num_supported_hw_watchpoints = 0; 1652a63d08c9SGreg Clayton 1653a63d08c9SGreg Clayton uint32_t register_DBGDIDR; 1654a63d08c9SGreg Clayton asm("mrc p14, 0, %0, c0, c0, 0" : "=r"(register_DBGDIDR)); 1655dce502edSGreg Clayton g_num_supported_hw_watchpoints = Bits32(register_DBGDIDR, 31, 28) + 1; 1656*b9c1b51eSKate Stone // if (log) log->Printf ("DBGDIDR=0x%8.8x (number WRP pairs = %u)", 1657*b9c1b51eSKate Stone // register_DBGDIDR, g_num_supported_hw_watchpoints); 1658a63d08c9SGreg Clayton } 1659a63d08c9SGreg Clayton return g_num_supported_hw_watchpoints; 1660a63d08c9SGreg Clayton #else 1661a63d08c9SGreg Clayton // TODO: figure out remote case here! 1662a63d08c9SGreg Clayton return 2; 1663a63d08c9SGreg Clayton #endif 1664a63d08c9SGreg Clayton } 1665a63d08c9SGreg Clayton 1666*b9c1b51eSKate Stone uint32_t RegisterContextDarwin_arm::SetHardwareWatchpoint(lldb::addr_t addr, 1667*b9c1b51eSKate Stone size_t size, 1668*b9c1b51eSKate Stone bool read, 1669*b9c1b51eSKate Stone bool write) { 1670*b9c1b51eSKate Stone // if (log) log->Printf 1671*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareWatchpoint(addr = %8.8p, size 1672*b9c1b51eSKate Stone // = %u, read = %u, write = %u)", addr, size, read, write); 1673a63d08c9SGreg Clayton 1674a63d08c9SGreg Clayton const uint32_t num_hw_watchpoints = NumSupportedHardwareWatchpoints(); 1675a63d08c9SGreg Clayton 1676a63d08c9SGreg Clayton // Can't watch zero bytes 1677a63d08c9SGreg Clayton if (size == 0) 1678a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1679a63d08c9SGreg Clayton 1680a63d08c9SGreg Clayton // We must watch for either read or write 1681a63d08c9SGreg Clayton if (read == false && write == false) 1682a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1683a63d08c9SGreg Clayton 1684a63d08c9SGreg Clayton // Can't watch more than 4 bytes per WVR/WCR pair 1685a63d08c9SGreg Clayton if (size > 4) 1686a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1687a63d08c9SGreg Clayton 1688a63d08c9SGreg Clayton // We can only watch up to four bytes that follow a 4 byte aligned address 1689a63d08c9SGreg Clayton // per watchpoint register pair. Since we have at most so we can only watch 1690a63d08c9SGreg Clayton // until the next 4 byte boundary and we need to make sure we can properly 1691a63d08c9SGreg Clayton // encode this. 1692a63d08c9SGreg Clayton uint32_t addr_word_offset = addr % 4; 1693*b9c1b51eSKate Stone // if (log) log->Printf 1694*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareWatchpoint() - 1695*b9c1b51eSKate Stone // addr_word_offset = 0x%8.8x", addr_word_offset); 1696a63d08c9SGreg Clayton 1697a63d08c9SGreg Clayton uint32_t byte_mask = ((1u << size) - 1u) << addr_word_offset; 1698*b9c1b51eSKate Stone // if (log) log->Printf 1699*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareWatchpoint() - byte_mask = 1700*b9c1b51eSKate Stone // 0x%8.8x", byte_mask); 1701a63d08c9SGreg Clayton if (byte_mask > 0xfu) 1702a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1703a63d08c9SGreg Clayton 1704a63d08c9SGreg Clayton // Read the debug state 1705a63d08c9SGreg Clayton int kret = ReadDBG(false); 1706a63d08c9SGreg Clayton 1707*b9c1b51eSKate Stone if (kret == KERN_SUCCESS) { 1708a63d08c9SGreg Clayton // Check to make sure we have the needed hardware support 1709a63d08c9SGreg Clayton uint32_t i = 0; 1710a63d08c9SGreg Clayton 1711*b9c1b51eSKate Stone for (i = 0; i < num_hw_watchpoints; ++i) { 1712a63d08c9SGreg Clayton if ((dbg.wcr[i] & WCR_ENABLE) == 0) 1713a63d08c9SGreg Clayton break; // We found an available hw breakpoint slot (in i) 1714a63d08c9SGreg Clayton } 1715a63d08c9SGreg Clayton 1716a63d08c9SGreg Clayton // See if we found an available hw breakpoint slot above 1717*b9c1b51eSKate Stone if (i < num_hw_watchpoints) { 1718a63d08c9SGreg Clayton // Make the byte_mask into a valid Byte Address Select mask 1719a63d08c9SGreg Clayton uint32_t byte_address_select = byte_mask << 5; 1720a63d08c9SGreg Clayton // Make sure bits 1:0 are clear in our address 1721a63d08c9SGreg Clayton dbg.wvr[i] = addr & ~((lldb::addr_t)3); 1722*b9c1b51eSKate Stone dbg.wcr[i] = byte_address_select | // Which bytes that follow the IMVA 1723*b9c1b51eSKate Stone // that we will watch 1724a63d08c9SGreg Clayton S_USER | // Stop only in user mode 1725a63d08c9SGreg Clayton (read ? WCR_LOAD : 0) | // Stop on read access? 1726a63d08c9SGreg Clayton (write ? WCR_STORE : 0) | // Stop on write access? 1727a63d08c9SGreg Clayton WCR_ENABLE; // Enable this watchpoint; 1728a63d08c9SGreg Clayton 1729a63d08c9SGreg Clayton kret = WriteDBG(); 1730*b9c1b51eSKate Stone // if (log) log->Printf 1731*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareWatchpoint() 1732*b9c1b51eSKate Stone // WriteDBG() => 0x%8.8x.", kret); 1733a63d08c9SGreg Clayton 1734a63d08c9SGreg Clayton if (kret == KERN_SUCCESS) 1735a63d08c9SGreg Clayton return i; 1736*b9c1b51eSKate Stone } else { 1737*b9c1b51eSKate Stone // if (log) log->Printf 1738*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::EnableHardwareWatchpoint(): All 1739*b9c1b51eSKate Stone // hardware resources (%u) are in use.", num_hw_watchpoints); 1740a63d08c9SGreg Clayton } 1741a63d08c9SGreg Clayton } 1742a63d08c9SGreg Clayton return LLDB_INVALID_INDEX32; 1743a63d08c9SGreg Clayton } 1744a63d08c9SGreg Clayton 1745*b9c1b51eSKate Stone bool RegisterContextDarwin_arm::ClearHardwareWatchpoint(uint32_t hw_index) { 1746a63d08c9SGreg Clayton int kret = ReadDBG(false); 1747a63d08c9SGreg Clayton 1748a63d08c9SGreg Clayton const uint32_t num_hw_points = NumSupportedHardwareWatchpoints(); 1749*b9c1b51eSKate Stone if (kret == KERN_SUCCESS) { 1750*b9c1b51eSKate Stone if (hw_index < num_hw_points) { 1751a63d08c9SGreg Clayton dbg.wcr[hw_index] = 0; 1752*b9c1b51eSKate Stone // if (log) log->Printf 1753*b9c1b51eSKate Stone // ("RegisterContextDarwin_arm::ClearHardwareWatchpoint( %u ) - 1754*b9c1b51eSKate Stone // WVR%u = 0x%8.8x WCR%u = 0x%8.8x", 175589f138aeSGreg Clayton // hw_index, 175689f138aeSGreg Clayton // hw_index, 175789f138aeSGreg Clayton // dbg.wvr[hw_index], 175889f138aeSGreg Clayton // hw_index, 175989f138aeSGreg Clayton // dbg.wcr[hw_index]); 1760a63d08c9SGreg Clayton 1761a63d08c9SGreg Clayton kret = WriteDBG(); 1762a63d08c9SGreg Clayton 1763a63d08c9SGreg Clayton if (kret == KERN_SUCCESS) 1764a63d08c9SGreg Clayton return true; 1765a63d08c9SGreg Clayton } 1766a63d08c9SGreg Clayton } 1767a63d08c9SGreg Clayton return false; 1768a63d08c9SGreg Clayton } 1769a63d08c9SGreg Clayton 1770a67dd8fcSPeter Collingbourne #endif 1771