[Lldb-commits] [PATCH 4/9] Support the reading of registers en masse via the linux ProcessMonitor.

Stephen Wilson wilsons at start.ca
Tue Jan 18 14:39:10 PST 2011


diff --git a/source/Plugins/Process/Linux/ProcessMonitor.cpp b/source/Plugins/Process/Linux/ProcessMonitor.cpp
index f21cb00..8fe7451 100644
--- a/source/Plugins/Process/Linux/ProcessMonitor.cpp
+++ b/source/Plugins/Process/Linux/ProcessMonitor.cpp
@@ -260,6 +260,58 @@ WriteRegOperation::Execute(ProcessMonitor *monitor)
 }
 
 //------------------------------------------------------------------------------
+/// @class ReadGPROperation
+/// @brief Implements ProcessMonitor::ReadGPR.
+class ReadGPROperation : public Operation
+{
+public:
+    ReadGPROperation(void *buf, bool &result)
+        : m_buf(buf), m_result(result)
+        { }
+
+    void Execute(ProcessMonitor *monitor);
+
+private:
+    void *m_buf;
+    bool &m_result;
+};
+
+void
+ReadGPROperation::Execute(ProcessMonitor *monitor)
+{
+    if (ptrace(PTRACE_GETREGS, monitor->GetPID(), NULL, m_buf) < 0)
+        m_result = false;
+    else
+        m_result = true;
+}
+
+//------------------------------------------------------------------------------
+/// @class ReadFPROperation
+/// @brief Implements ProcessMonitor::ReadFPR.
+class ReadFPROperation : public Operation
+{
+public:
+    ReadFPROperation(void *buf, bool &result)
+        : m_buf(buf), m_result(result)
+        { }
+
+    void Execute(ProcessMonitor *monitor);
+
+private:
+    void *m_buf;
+    bool &m_result;
+};
+
+void
+ReadFPROperation::Execute(ProcessMonitor *monitor)
+{
+    if (ptrace(PTRACE_GETFPREGS, monitor->GetPID(), NULL, m_buf) < 0)
+        m_result = false;
+    else
+        m_result = true;
+}
+
+//------------------------------------------------------------------------------
 /// @class ResumeOperation
 /// @brief Implements ProcessMonitor::Resume.
 class ResumeOperation : public Operation
@@ -876,6 +928,24 @@ ProcessMonitor::WriteRegisterValue(unsigned offset, const Scalar &value)
 }
 
 bool
+ProcessMonitor::ReadGPR(void *buf)
+{
+    bool result;
+    ReadGPROperation op(buf, result);
+    DoOperation(&op);
+    return result;
+}
+
+bool
+ProcessMonitor::ReadFPR(void *buf)
+{
+    bool result;
+    ReadFPROperation op(buf, result);
+    DoOperation(&op);
+    return result;
+}
+
+bool
 ProcessMonitor::Resume(lldb::tid_t tid)
 {
     bool result;
diff --git a/source/Plugins/Process/Linux/ProcessMonitor.h b/source/Plugins/Process/Linux/ProcessMonitor.h
index 431fab7..86aad23 100644
--- a/source/Plugins/Process/Linux/ProcessMonitor.h
+++ b/source/Plugins/Process/Linux/ProcessMonitor.h
@@ -108,6 +108,14 @@ public:
     bool
     WriteRegisterValue(unsigned offset, const lldb_private::Scalar &value);
 
+    /// Reads all general purpose registers into the specified buffer.
+    bool
+    ReadGPR(void *buf);
+
+    /// Reads all floating point registers into the specified buffer.
+    bool
+    ReadFPR(void *buf);
+
     /// Writes a siginfo_t structure corresponding to the given thread ID to the
     /// memory region pointed to by @p siginfo.
     bool
-- 
1.7.3.5




More information about the lldb-commits mailing list