summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp')
-rw-r--r--lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp74
1 files changed, 44 insertions, 30 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
index 978daa7e9ca..eaf91eb98b1 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
@@ -39,7 +39,6 @@ GDBRemoteRegisterContext::GDBRemoteRegisterContext
RegisterContext (thread, concrete_frame_idx),
m_reg_info (reg_info),
m_reg_valid (),
- m_reg_valid_stop_id (),
m_reg_data (),
m_read_all_at_once (read_all_at_once)
{
@@ -74,7 +73,7 @@ GDBRemoteRegisterContext::GetGDBThread()
}
void
-GDBRemoteRegisterContext::Invalidate ()
+GDBRemoteRegisterContext::InvalidateAllRegisters ()
{
SetAllRegisterValid (false);
}
@@ -179,25 +178,41 @@ GDBRemoteRegisterContext::ReadRegisterValue (uint32_t reg, Scalar &value)
return false;
}
+void
+GDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response)
+{
+ const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
+ assert (reg_info);
+
+ // Invalidate if needed
+ InvalidateIfNeeded(false);
+
+ const uint32_t reg_byte_size = reg_info->byte_size;
+ const size_t bytes_copied = response.GetHexBytes (const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_byte_size)), reg_byte_size, '\xcc');
+ bool success = bytes_copied == reg_byte_size;
+ if (success)
+ {
+ m_reg_valid[reg] = true;
+ }
+ else if (bytes_copied > 0)
+ {
+ // Only set register is valid to false if we copied some bytes, else
+ // leave it as it was.
+ m_reg_valid[reg] = false;
+ }
+}
+
bool
GDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data)
{
GDBRemoteCommunication &gdb_comm = GetGDBProcess().GetGDBRemote();
-// FIXME: This check isn't right because IsRunning checks the Public state, but this
-// is work you need to do - for instance in ShouldStop & friends - before the public
-// state has been changed.
-// if (gdb_comm.IsRunning())
-// return false;
- if (m_reg_valid_stop_id != m_thread.GetProcess().GetStopID())
- {
- Invalidate();
- m_reg_valid_stop_id = m_thread.GetProcess().GetStopID();
- }
+ InvalidateIfNeeded(false);
+
const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
assert (reg_info);
- if (m_reg_valid[reg] == false)
+ if (!m_reg_valid[reg])
{
Mutex::Locker locker;
if (gdb_comm.GetSequenceMutex (locker))
@@ -225,28 +240,27 @@ GDBRemoteRegisterContext::ReadRegisterBytes (uint32_t reg, DataExtractor &data)
packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg);
assert (packet_len < (sizeof(packet) - 1));
if (gdb_comm.SendPacketAndWaitForResponse(packet, response, 1, false))
- if (response.GetHexBytes (const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)), reg_info->byte_size, '\xcc') == reg_info->byte_size)
- m_reg_valid[reg] = true;
+ PrivateSetRegisterValue (reg, response);
}
}
}
+
+ // Make sure we got a valid register value after reading it
+ if (!m_reg_valid[reg])
+ return false;
}
- bool reg_is_valid = m_reg_valid[reg];
- if (reg_is_valid)
+ if (&data != &m_reg_data)
{
- if (&data != &m_reg_data)
- {
- // If we aren't extracting into our own buffer (which
- // only happens when this function is called from
- // ReadRegisterValue(uint32_t, Scalar&)) then
- // we transfer bytes from our buffer into the data
- // buffer that was passed in
- data.SetByteOrder (m_reg_data.GetByteOrder());
- data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size);
- }
+ // If we aren't extracting into our own buffer (which
+ // only happens when this function is called from
+ // ReadRegisterValue(uint32_t, Scalar&)) then
+ // we transfer bytes from our buffer into the data
+ // buffer that was passed in
+ data.SetByteOrder (m_reg_data.GetByteOrder());
+ data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size);
}
- return reg_is_valid;
+ return true;
}
@@ -323,8 +337,8 @@ GDBRemoteRegisterContext::WriteRegisterBytes (uint32_t reg, DataExtractor &data,
eByteOrderHost);
// Invalidate all register values
- Invalidate ();
-
+ InvalidateIfNeeded (true);
+
if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
packet.GetString().size(),
response,
OpenPOWER on IntegriCloud