Updated GDB register write command handler to account for larger than expected register values.

This commit is contained in:
Nav
2021-12-28 02:44:00 +00:00
parent c29db60b4c
commit 76fcc385f3

View File

@@ -134,14 +134,35 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::WriteRegister& packet) {
Logger::debug("Handling WriteRegister packet"); Logger::debug("Handling WriteRegister packet");
try { try {
auto registerDescriptor = this->getTargetRegisterDescriptorFromNumber(packet.registerNumber); auto targetRegisterDescriptor = this->getTargetRegisterDescriptorFromNumber(packet.registerNumber);
const auto valueSize = packet.registerValue.size();
if (valueSize > 0 && valueSize > targetRegisterDescriptor.size) {
// Attempt to trim the higher zero-value bytes from the register value, until we reach the correct size.
for (auto i = packet.registerValue.size() - 1; i >= targetRegisterDescriptor.size; i--) {
if (packet.registerValue.at(i) != 0x00) {
// If we reach a non-zero byte, we cannot trim anymore without changing the data
break;
}
packet.registerValue.erase(packet.registerValue.begin() + i);
}
if (packet.registerValue.size() > targetRegisterDescriptor.size) {
const auto& gdbRegisterDescriptor = this->getRegisterDescriptorFromNumber(packet.registerNumber);
throw Exception("Cannot set value for " + gdbRegisterDescriptor.name
+ " - value size exceeds register size."
);
}
}
this->targetControllerConsole.writeRegisters({ this->targetControllerConsole.writeRegisters({
TargetRegister(registerDescriptor, packet.registerValue) TargetRegister(targetRegisterDescriptor, packet.registerValue)
}); });
this->clientConnection->writePacket(ResponsePacket({'O', 'K'})); this->clientConnection->writePacket(ResponsePacket({'O', 'K'}));
} catch (const Exception& exception) { } catch (const Exception& exception) {
Logger::error("Failed to write general registers - " + exception.getMessage()); Logger::error("Failed to write registers - " + exception.getMessage());
this->clientConnection->writePacket(ResponsePacket({'E', '0', '1'})); this->clientConnection->writePacket(ResponsePacket({'E', '0', '1'}));
} }
} }