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(&registers);
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"