File indexing completed on 2024-05-12 04:39:44
0001 /* 0002 SPDX-FileCopyrightText: 2013 Vlas Puhov <vlas.puhov@mail.ru> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #include "registercontroller_arm.h" 0008 #include "debuglog.h" 0009 0010 #include <KLocalizedString> 0011 0012 using namespace KDevMI; 0013 0014 QVector<QStringList> RegisterController_Arm::m_registerNames; 0015 FlagRegister RegisterController_Arm::m_cpsr; 0016 0017 void RegisterController_Arm::updateValuesForRegisters(RegistersGroup* registers) const 0018 { 0019 qCDebug(DEBUGGERCOMMON) << "Updating values for registers: " << registers->groupName.name(); 0020 if (registers->groupName == enumToGroupName(Flags)) { 0021 updateFlagValues(registers, m_cpsr); 0022 } else { 0023 IRegisterController::updateValuesForRegisters(registers); 0024 } 0025 } 0026 0027 RegistersGroup RegisterController_Arm::registersFromGroup(const GroupsName& group) const 0028 { 0029 RegistersGroup registers; 0030 0031 registers.groupName = group; 0032 registers.format = m_formatsModes[group.index()].formats.first(); 0033 const auto registerNames = registerNamesForGroup(group); 0034 registers.registers.reserve(registerNames.size()); 0035 for (const auto& name : registerNames) { 0036 registers.registers.append(Register(name, QString())); 0037 } 0038 0039 updateValuesForRegisters(®isters); 0040 0041 return registers; 0042 } 0043 0044 QVector<GroupsName> RegisterController_Arm::namesOfRegisterGroups() const 0045 { 0046 static const QVector<GroupsName> registerGroups = QVector<GroupsName>{ 0047 enumToGroupName(General), 0048 enumToGroupName(Flags), 0049 enumToGroupName(VFP_single), 0050 enumToGroupName(VFP_double), 0051 enumToGroupName(VFP_quad), 0052 }; 0053 0054 return registerGroups; 0055 } 0056 0057 void RegisterController_Arm::setRegisterValueForGroup(const GroupsName& group, const Register& reg) 0058 { 0059 if (group == enumToGroupName(General)) { 0060 setGeneralRegister(reg, group); 0061 } else if (group == enumToGroupName(Flags)) { 0062 setFlagRegister(reg, m_cpsr); 0063 } else if (group == enumToGroupName(VFP_single)) { 0064 setVFPS_Register(reg); 0065 } else if (group == enumToGroupName(VFP_double)) { 0066 setVFPD_Register(reg); 0067 } else if (group == enumToGroupName(VFP_quad)) { 0068 setVFPQ_Register(reg); 0069 } 0070 } 0071 0072 void RegisterController_Arm::setVFPS_Register(const Register& reg) 0073 { 0074 setGeneralRegister(reg, enumToGroupName(VFP_single)); 0075 } 0076 0077 void RegisterController_Arm::setVFPD_Register(const Register& reg) 0078 { 0079 setStructuredRegister(reg, enumToGroupName(VFP_double)); 0080 } 0081 0082 void RegisterController_Arm::setVFPQ_Register(const Register& reg) 0083 { 0084 setStructuredRegister(reg, enumToGroupName(VFP_quad)); 0085 } 0086 0087 void RegisterController_Arm::updateRegisters(const GroupsName& group) 0088 { 0089 if (!m_registerNamesInitialized) { 0090 if (initializeRegisters()) { 0091 m_registerNamesInitialized = true; 0092 } 0093 } 0094 0095 IRegisterController::updateRegisters(group); 0096 } 0097 0098 GroupsName RegisterController_Arm::enumToGroupName(ArmRegisterGroups group) const 0099 { 0100 static const GroupsName groups[LAST_REGISTER] = { createGroupName(i18n("General"), General) , createGroupName(i18n("Flags"), Flags, flag, m_cpsr.registerName), createGroupName(i18n("VFP single-word"), VFP_single, floatPoint), createGroupName(i18n("VFP double-word"), VFP_double, structured), createGroupName(i18n("VFP quad-word"), VFP_quad, structured)}; 0101 0102 return groups[group]; 0103 } 0104 0105 RegisterController_Arm::RegisterController_Arm(MIDebugSession* debugSession, QObject* parent) : IRegisterController(debugSession, parent) 0106 { 0107 if (m_registerNames.isEmpty()) { 0108 const int registerCount = static_cast<int>(LAST_REGISTER); 0109 m_registerNames.resize(registerCount); 0110 initRegisterNames(); 0111 } 0112 0113 m_formatsModes.resize(namesOfRegisterGroups().size()); 0114 0115 m_formatsModes[VFP_double].formats = {Binary, Decimal, Hexadecimal, Octal, Unsigned}; 0116 m_formatsModes[VFP_double].modes = {u32, u64, f32, f64}; 0117 0118 m_formatsModes[Flags].formats.append(Raw); 0119 m_formatsModes[Flags].modes.append(natural); 0120 0121 m_formatsModes[VFP_single].formats.append(Decimal); 0122 m_formatsModes[VFP_single].modes.append(natural); 0123 0124 m_formatsModes[VFP_quad] = m_formatsModes[VFP_double]; 0125 0126 m_formatsModes[General].formats.append(Raw); 0127 m_formatsModes[General].formats << m_formatsModes[VFP_double].formats; 0128 m_formatsModes[General].modes.append(natural); 0129 } 0130 0131 void RegisterController_Arm::initRegisterNames() 0132 { 0133 for (int i = 0; i < 32; i++) { 0134 m_registerNames[VFP_single] << (QLatin1Char('s') + QString::number(i)); 0135 } 0136 0137 m_cpsr.registerName = QStringLiteral("cpsr"); 0138 m_cpsr.flags = QStringList{ 0139 QStringLiteral("Q"), 0140 QStringLiteral("V"), 0141 QStringLiteral("C"), 0142 QStringLiteral("Z"), 0143 QStringLiteral("N"), 0144 }; 0145 m_cpsr.bits = QStringList{ 0146 QStringLiteral("27"), 0147 QStringLiteral("28"), 0148 QStringLiteral("29"), 0149 QStringLiteral("30"), 0150 QStringLiteral("31"), 0151 }; 0152 m_cpsr.groupName = enumToGroupName(Flags); 0153 0154 m_registerNames[Flags] = m_cpsr.flags; 0155 0156 for (int i = 0; i < 13; i++) { 0157 m_registerNames[General] << (QLatin1Char('r') + QString::number(i)); 0158 } 0159 m_registerNames[General] << QStringLiteral("sp") << QStringLiteral("lr") << QStringLiteral("pc"); 0160 0161 for (int i = 0; i < 32; i++) { 0162 m_registerNames[VFP_double] << (QLatin1Char('d') + QString::number(i)); 0163 } 0164 0165 for (int i = 0; i < 16; i++) { 0166 m_registerNames[VFP_quad] << (QLatin1Char('q') + QString::number(i)); 0167 } 0168 } 0169 0170 QStringList RegisterController_Arm::registerNamesForGroup(const GroupsName& group) const 0171 { 0172 0173 for (int i = 0; i < static_cast<int>(LAST_REGISTER); i++) { 0174 if (group == enumToGroupName(static_cast<ArmRegisterGroups>(i))) { 0175 return m_registerNames[i]; 0176 } 0177 } 0178 0179 return QStringList(); 0180 } 0181 0182 #include "moc_registercontroller_arm.cpp"