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_x86.h" 0008 #include "debuglog.h" 0009 0010 #include <KLocalizedString> 0011 0012 using namespace KDevMI; 0013 0014 QVector<QStringList> RegisterControllerGeneral_x86::m_registerNames; 0015 FlagRegister RegisterControllerGeneral_x86::m_eflags; 0016 0017 void RegisterControllerGeneral_x86::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_eflags); 0022 } else { 0023 IRegisterController::updateValuesForRegisters(registers); 0024 } 0025 } 0026 0027 RegistersGroup RegisterControllerGeneral_x86::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> RegisterControllerGeneral_x86::namesOfRegisterGroups() const 0045 { 0046 static const QVector<GroupsName> registerGroups = QVector<GroupsName>{ 0047 enumToGroupName(General), 0048 enumToGroupName(Flags), 0049 enumToGroupName(FPU), 0050 enumToGroupName(XMM), 0051 enumToGroupName(Segment), 0052 }; 0053 0054 return registerGroups; 0055 } 0056 0057 void RegisterControllerGeneral_x86::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_eflags); 0063 } else if (group == enumToGroupName(FPU)) { 0064 setFPURegister(reg); 0065 } else if (group == enumToGroupName(XMM)) { 0066 setXMMRegister(reg); 0067 } else if (group == enumToGroupName(Segment)) { 0068 setSegmentRegister(reg); 0069 } 0070 } 0071 0072 void RegisterControllerGeneral_x86::setFPURegister(const Register& reg) 0073 { 0074 setGeneralRegister(reg, enumToGroupName(FPU)); 0075 } 0076 0077 void RegisterControllerGeneral_x86::setXMMRegister(const Register& reg) 0078 { 0079 setStructuredRegister(reg, enumToGroupName(XMM)); 0080 } 0081 0082 void RegisterControllerGeneral_x86::setSegmentRegister(const Register& reg) 0083 { 0084 setGeneralRegister(reg, enumToGroupName(Segment)); 0085 } 0086 0087 void RegisterControllerGeneral_x86::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 RegisterControllerGeneral_x86::enumToGroupName(X86RegisterGroups group) const 0099 { 0100 static const GroupsName groups[LAST_REGISTER] = { createGroupName(i18n("General"), General), createGroupName(i18n("Flags"), Flags, flag, m_eflags.registerName), createGroupName(i18n("FPU"), FPU, floatPoint), createGroupName(i18n("XMM"), XMM, structured), createGroupName(i18n("Segment"), Segment)}; 0101 0102 return groups[group]; 0103 } 0104 0105 RegisterController_x86::RegisterController_x86(MIDebugSession* debugSession, QObject* parent) 0106 : RegisterControllerGeneral_x86(debugSession, parent) 0107 { 0108 initRegisterNames(); 0109 } 0110 0111 RegisterController_x86_64::RegisterController_x86_64(MIDebugSession* debugSession, QObject* parent) 0112 : RegisterControllerGeneral_x86(debugSession, parent) 0113 { 0114 initRegisterNames(); 0115 } 0116 0117 RegisterControllerGeneral_x86::RegisterControllerGeneral_x86(MIDebugSession* debugSession, QObject* parent) 0118 : IRegisterController(debugSession, parent) 0119 { 0120 if (m_registerNames.isEmpty()) { 0121 const int registerCount = static_cast<int>(LAST_REGISTER); 0122 m_registerNames.resize(registerCount); 0123 initRegisterNames(); 0124 } 0125 0126 m_formatsModes.resize(namesOfRegisterGroups().size()); 0127 0128 m_formatsModes[XMM].formats = {Binary, Decimal, Hexadecimal, Octal, Unsigned}; 0129 m_formatsModes[XMM].modes = {v4_float, v2_double, v4_int32, v2_int64}; 0130 0131 m_formatsModes[Flags].formats.append(Raw); 0132 m_formatsModes[Flags].modes.append(natural); 0133 0134 m_formatsModes[FPU].formats.append(Decimal); 0135 m_formatsModes[FPU].modes.append(natural); 0136 0137 m_formatsModes[General].modes.append(natural); 0138 m_formatsModes[General].formats.append(Raw); 0139 m_formatsModes[General].formats << m_formatsModes[XMM].formats; 0140 0141 m_formatsModes[Segment] = m_formatsModes[General]; 0142 } 0143 0144 void RegisterControllerGeneral_x86::initRegisterNames() 0145 { 0146 for (int i = 0; i < 8; i++) { 0147 m_registerNames[FPU] << (QLatin1String("st") + QString::number(i)); 0148 } 0149 0150 m_registerNames[Flags] = QStringList{ 0151 QStringLiteral("C"), 0152 QStringLiteral("P"), 0153 QStringLiteral("A"), 0154 QStringLiteral("Z"), 0155 QStringLiteral("S"), 0156 QStringLiteral("T"), 0157 QStringLiteral("D"), 0158 QStringLiteral("O") 0159 }; 0160 0161 m_registerNames[Segment] = QStringList{ 0162 QStringLiteral("cs"), 0163 QStringLiteral("ss"), 0164 QStringLiteral("ds"), 0165 QStringLiteral("es"), 0166 QStringLiteral("fs"), 0167 QStringLiteral("gs"), 0168 }; 0169 0170 m_eflags.flags = m_registerNames[Flags]; 0171 m_eflags.bits = QStringList{ 0172 QStringLiteral("0"), 0173 QStringLiteral("2"), 0174 QStringLiteral("4"), 0175 QStringLiteral("6"), 0176 QStringLiteral("7"), 0177 QStringLiteral("8"), 0178 QStringLiteral("10"), 0179 QStringLiteral("11"), 0180 }; 0181 m_eflags.registerName = QStringLiteral("eflags"); 0182 m_eflags.groupName = enumToGroupName(Flags); 0183 } 0184 0185 void RegisterController_x86::initRegisterNames() 0186 { 0187 m_registerNames[General] = QStringList{ 0188 QStringLiteral("eax"), 0189 QStringLiteral("ebx"), 0190 QStringLiteral("ecx"), 0191 QStringLiteral("edx"), 0192 QStringLiteral("esi"), 0193 QStringLiteral("edi"), 0194 QStringLiteral("ebp"), 0195 QStringLiteral("esp"), 0196 QStringLiteral("eip") 0197 }; 0198 0199 m_registerNames[XMM].clear(); 0200 for (int i = 0; i < 8; i++) { 0201 m_registerNames[XMM] << (QLatin1String("xmm") + QString::number(i)); 0202 } 0203 } 0204 0205 void RegisterController_x86_64::initRegisterNames() 0206 { 0207 m_registerNames[General] = QStringList{ 0208 QStringLiteral("rax"), 0209 QStringLiteral("rbx"), 0210 QStringLiteral("rcx"), 0211 QStringLiteral("rdx"), 0212 QStringLiteral("rsi"), 0213 QStringLiteral("rdi"), 0214 QStringLiteral("rbp"), 0215 QStringLiteral("rsp"), 0216 QStringLiteral("r8"), 0217 QStringLiteral("r9"), 0218 QStringLiteral("r10"), 0219 QStringLiteral("r11"), 0220 QStringLiteral("r12"), 0221 QStringLiteral("r13"), 0222 QStringLiteral("r14"), 0223 QStringLiteral("r15"), 0224 QStringLiteral("rip") 0225 }; 0226 0227 m_registerNames[XMM].clear(); 0228 for (int i = 0; i < 16; i++) { 0229 m_registerNames[XMM] << (QLatin1String("xmm") + QString::number(i)); 0230 } 0231 } 0232 0233 QStringList RegisterControllerGeneral_x86::registerNamesForGroup(const GroupsName& group) const 0234 { 0235 for (int i = 0; i < static_cast<int>(LAST_REGISTER); i++) { 0236 if (group == enumToGroupName(static_cast<X86RegisterGroups>(i))) { 0237 return m_registerNames[i]; 0238 } 0239 } 0240 0241 return QStringList(); 0242 } 0243 0244 #include "moc_registercontroller_x86.cpp"