124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- GDBRemoteRegisterContext.h ------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef lldb_GDBRemoteRegisterContext_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define lldb_GDBRemoteRegisterContext_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 203a4ea24572fad1e22525f8efb718d49d41e30398Jason Molenda#include "lldb/lldb-enumerations.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 2474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen#include "GDBRemoteCommunicationClient.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadGDBRemote; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ProcessGDBRemote; 28a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Claytonclass StringExtractor; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass GDBRemoteDynamicRegisterInfo 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo () : 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_regs (), 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets (), 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_reg_nums (), 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_names (), 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_alt_names (), 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_names (), 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data_byte_size (0) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~GDBRemoteDynamicRegisterInfo () 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 494c32029943b762dbba4750137d606c59adf26fe8Jason Molenda AddRegister (lldb_private::RegisterInfo reg_info, 50b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton lldb_private::ConstString ®_name, 51b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton lldb_private::ConstString ®_alt_name, 52b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton lldb_private::ConstString &set_name) 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const uint32_t reg_num = (uint32_t)m_regs.size(); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_names.push_back (reg_name); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_alt_names.push_back (reg_alt_name); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_info.name = reg_name.AsCString(); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (reg_info.name); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_info.alt_name = reg_alt_name.AsCString(NULL); 60c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton uint32_t i; 61c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg_info.value_regs) 62c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 63c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton for (i=0; reg_info.value_regs[i] != LLDB_INVALID_REGNUM; ++i) 64c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton m_value_regs_map[reg_num].push_back(reg_info.value_regs[i]); 65c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton m_value_regs_map[reg_num].push_back(LLDB_INVALID_REGNUM); 66c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg_info.value_regs = m_value_regs_map[reg_num].data(); 67c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 68c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg_info.invalidate_regs) 69c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 70c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton for (i=0; reg_info.invalidate_regs[i] != LLDB_INVALID_REGNUM; ++i) 71c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton m_invalidate_regs_map[reg_num].push_back(reg_info.invalidate_regs[i]); 72c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton m_invalidate_regs_map[reg_num].push_back(LLDB_INVALID_REGNUM); 73c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg_info.invalidate_regs = m_invalidate_regs_map[reg_num].data(); 74c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_regs.push_back (reg_info); 7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton uint32_t set = GetRegisterSetIndexByName (set_name); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (set < m_sets.size()); 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (set < m_set_reg_nums.size()); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (set < m_set_names.size()); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_reg_nums[set].push_back(reg_num); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t end_reg_offset = reg_info.byte_offset + reg_info.byte_size; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_reg_data_byte_size < end_reg_offset) 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data_byte_size = end_reg_offset; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Finalize () 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t set = 0; set < m_sets.size(); ++set) 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (m_sets.size() == m_set_reg_nums.size()); 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets[set].num_registers = m_set_reg_nums[set].size(); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets[set].registers = &m_set_reg_nums[set][0]; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetNumRegisters() const 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_regs.size(); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetNumRegisterSets() const 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_sets.size(); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterDataByteSize() const 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_data_byte_size; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 115b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const lldb_private::RegisterInfo * 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterInfoAtIndex (uint32_t i) const 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (i < m_regs.size()) 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_regs[i]; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 123b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const lldb_private::RegisterSet * 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterSet (uint32_t i) const 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (i < m_sets.size()) 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_sets[i]; 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 13236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetRegisterSetIndexByName (lldb_private::ConstString &set_name) 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name_collection::iterator pos, end = m_set_names.end(); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_set_names.begin(); pos != end; ++pos) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (*pos == set_name) 13836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton return static_cast<uint32_t>(std::distance (m_set_names.begin(), pos)); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_names.push_back(set_name); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_reg_nums.resize(m_set_reg_nums.size()+1); 143b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton lldb_private::RegisterSet new_set = { set_name.AsCString(), NULL, 0, NULL }; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.push_back (new_set); 14536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton return static_cast<uint32_t>(m_sets.size() - 1); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_collection::const_iterator pos, end = m_regs.end(); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_regs.begin(); pos != end; ++pos) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos->kinds[kind] == num) 15536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton return static_cast<uint32_t>(std::distance (m_regs.begin(), pos)); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return LLDB_INVALID_REGNUM; 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear() 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_regs.clear(); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sets.clear(); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_reg_nums.clear(); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_names.clear(); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_alt_names.clear(); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_set_names.clear(); 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 172b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen HardcodeARMRegisters(bool from_scratch); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from GDBRemoteRegisterContext can see and modify these 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 178b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton typedef std::vector <lldb_private::RegisterInfo> reg_collection; 179b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton typedef std::vector <lldb_private::RegisterSet> set_collection; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector <uint32_t> reg_num_collection; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector <reg_num_collection> set_reg_num_collection; 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector <lldb_private::ConstString> name_collection; 183c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton typedef std::map<uint32_t, reg_num_collection> reg_to_regs_map; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_collection m_regs; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_collection m_sets; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_reg_num_collection m_set_reg_nums; 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name_collection m_reg_names; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name_collection m_reg_alt_names; 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name_collection m_set_names; 191c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg_to_regs_map m_value_regs_map; 192c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg_to_regs_map m_invalidate_regs_map; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t m_reg_data_byte_size; // The number of bytes required to store all registers 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass GDBRemoteRegisterContext : public lldb_private::RegisterContext 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Constructors and Destructors 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteRegisterContext (ThreadGDBRemote &thread, 20308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton uint32_t concrete_frame_idx, 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo ®_info, 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool read_all_at_once); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~GDBRemoteRegisterContext (); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Subclasses must override these functions 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 214a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateAllRegisters (); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual size_t 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterCount (); 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 219b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton virtual const lldb_private::RegisterInfo * 22036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetRegisterInfoAtIndex (size_t reg); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual size_t 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterSetCount (); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 225b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton virtual const lldb_private::RegisterSet * 22636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton GetRegisterSet (size_t reg_set); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 229061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegister (const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value); 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegister (const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value); 233061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ReadAllRegisterValues (lldb::DataBufferSP &data_sp); 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WriteAllRegisterValues (const lldb::DataBufferSP &data_sp); 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num); 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 244a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton friend class ThreadGDBRemote; 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 246c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton bool 247061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegisterBytes (const lldb_private::RegisterInfo *reg_info, 248061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb_private::DataExtractor &data); 249061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 250061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 251061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, 252061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb_private::DataExtractor &data, 253061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t data_offset); 254061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 255061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 256a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton PrivateSetRegisterValue (uint32_t reg, StringExtractor &response); 257a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 258a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton void 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (bool b); 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 261c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton bool 262c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton GetRegisterIsValid (uint32_t reg) const 263c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 264c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG) 265c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton assert (reg < m_reg_valid.size()); 266c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#endif 267c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg < m_reg_valid.size()) 268c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton return m_reg_valid[reg]; 269c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton return false; 270c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 271c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 272c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton void 273c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid (const lldb_private::RegisterInfo *reg_info, bool valid) 274c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 275c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg_info) 276c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton return SetRegisterIsValid (reg_info->kinds[lldb::eRegisterKindLLDB], valid); 277c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 278c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 279c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton void 280c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid (uint32_t reg, bool valid) 281c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 282c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#if defined (LLDB_CONFIGURATION_DEBUG) 283c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton assert (reg < m_reg_valid.size()); 284c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton#endif 285c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg < m_reg_valid.size()) 286c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton m_reg_valid[reg] = valid; 287c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 288c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 28973f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham void 29073f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham SyncThreadState(lldb_private::Process *process); // Assumes the sequence mutex has already been acquired. 29173f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo &m_reg_info; 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<bool> m_reg_valid; 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::DataExtractor m_reg_data; 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_read_all_at_once; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 29874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Helper function for ReadRegisterBytes(). 29974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen bool GetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 30074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm); 30174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Helper function for WriteRegisterBytes(). 30274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen bool SetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 30374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm); 30474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For GDBRemoteRegisterContext only 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (GDBRemoteRegisterContext); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // lldb_GDBRemoteRegisterContext_h_ 312