From 76fcc385f346cd00e887c1f98d36b79e595464ae Mon Sep 17 00:00:00 2001 From: Nav Date: Tue, 28 Dec 2021 02:44:00 +0000 Subject: [PATCH] Updated GDB register write command handler to account for larger than expected register values. --- src/DebugServers/GdbRsp/GdbRspDebugServer.cpp | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp b/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp index 674c985d..a512fe9a 100644 --- a/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp +++ b/src/DebugServers/GdbRsp/GdbRspDebugServer.cpp @@ -134,14 +134,35 @@ void GdbRspDebugServer::handleGdbPacket(CommandPackets::WriteRegister& packet) { Logger::debug("Handling WriteRegister packet"); 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({ - TargetRegister(registerDescriptor, packet.registerValue) + TargetRegister(targetRegisterDescriptor, packet.registerValue) }); this->clientConnection->writePacket(ResponsePacket({'O', 'K'})); } 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'})); } }