GDBRemoteRegisterContext.cpp revision 107e53da8bdca540db8b734ed237688eaeee85c5
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- GDBRemoteRegisterContext.cpp ----------------------------*- 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#include "GDBRemoteRegisterContext.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 17061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Scalar.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/StringExtractorGDBRemote.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ProcessGDBRemote.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ThreadGDBRemote.h" 2454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_GCC_Registers.h" 2554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_DWARF_Registers.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GDBRemoteRegisterContext constructor 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GDBRemoteRegisterContext 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadGDBRemote &thread, 3608d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton uint32_t concrete_frame_idx, 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo ®_info, 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool read_all_at_once 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) : 4008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton RegisterContext (thread, concrete_frame_idx), 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_info (reg_info), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid (), 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data (), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_read_all_at_once (read_all_at_once) 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resize our vector of bools to contain one bool for every register. 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We will use these boolean values to know when a register value 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is valid in m_reg_data. 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid.resize (reg_info.GetNumRegisters()); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a heap based buffer that is big enough to store all registers 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP reg_data_sp(new DataBufferHeap (reg_info.GetRegisterDataByteSize(), 0)); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.SetData (reg_data_sp); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::~GDBRemoteRegisterContext() 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerProcessGDBRemote & 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetGDBProcess() 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<ProcessGDBRemote &>(m_thread.GetProcess()); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadGDBRemote & 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetGDBThread() 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return static_cast<ThreadGDBRemote &>(m_thread); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 77a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::InvalidateAllRegisters () 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::SetAllRegisterValid (bool b) 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<bool>::iterator pos, end = m_reg_valid.end(); 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_reg_valid.begin(); pos != end; ++pos) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *pos = b; 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterCount () 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisters (); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterInfo * 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterInfoAtIndex (uint32_t reg) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterInfoAtIndex (reg); 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSetCount () 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisterSets (); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterSet * 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSet (uint32_t reg_set) 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterSet (reg_set); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 119061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value) 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the register 122107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (ReadRegisterBytes (reg_info, m_reg_data)) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const bool partial_data_ok = false; 125061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error error (value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok)); 126061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return error.Success(); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131c3c4661c6a7527580e605dbb69bef7634971fe13Greg Claytonbool 132a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response) 133a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{ 134a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 135c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton if (reg_info == NULL) 136c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return false; 137a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 138a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Invalidate if needed 139a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 140a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 141a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 142a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 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'); 143a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton bool success = bytes_copied == reg_byte_size; 144a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (success) 145a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 146a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = true; 147a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 148a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else if (bytes_copied > 0) 149a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 150a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Only set register is valid to false if we copied some bytes, else 151a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // leave it as it was. 152a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = false; 153a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 154c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return success; 155a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton} 156a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 159107e53da8bdca540db8b734ed237688eaeee85c5Greg ClaytonGDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, DataExtractor &data) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16161d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 164a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 165061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 166061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 167a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 173b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (thread_suffix_supported || GetGDBProcess().GetGDBRemote().SetCurrentThread(m_thread.GetID())) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 175c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[64]; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 177c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 181c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 182c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4x;", m_thread.GetID()); 183c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 184c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (packet_len < (sizeof(packet) - 1)); 186c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18861d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsNormalResponse()) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.GetHexBytes ((void *)m_reg_data.GetDataStart(), m_reg_data.GetByteSize(), '\xcc') == m_reg_data.GetByteSize()) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (true); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get each register individually 196061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 197c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 198c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4x;", reg, m_thread.GetID()); 199c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 200c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (packet_len < (sizeof(packet) - 1)); 202c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 203a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton PrivateSetRegisterValue (reg, response); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 207a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 208a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Make sure we got a valid register value after reading it 209a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 210a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (&data != &m_reg_data) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // If we aren't extracting into our own buffer (which 216a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // only happens when this function is called from 217a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // ReadRegisterValue(uint32_t, Scalar&)) then 218a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // we transfer bytes from our buffer into the data 219a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // buffer that was passed in 220a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetByteOrder (m_reg_data.GetByteOrder()); 221a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 223a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return true; 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 228061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::WriteRegister (const RegisterInfo *reg_info, 229061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue &value) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 231061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton DataExtractor data; 232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (value.GetData (data)) 233efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return WriteRegisterBytes (reg_info, data, 0); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 239efe0b80e66ce326b23ad070b4eebcd3070c310deGreg ClaytonGDBRemoteRegisterContext::WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset) 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24161d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: This check isn't right because IsRunning checks the Public state, but this 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// is work you need to do - for instance in ShouldStop & friends - before the public 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// state has been changed. 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (gdb_comm.IsRunning()) 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 248061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton // Grab a pointer to where we are going to put this register 251061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 253061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (dst == NULL) 254061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return false; 255061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 256061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 257061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (data.CopyByteOrderedData (data_offset, // src offset 258061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // src length 259061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton dst, // dst 260061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // dst length 261061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_data.GetByteOrder())) // dst byte order 262061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton { 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 266c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 267b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (thread_suffix_supported || GetGDBProcess().GetGDBRemote().SetCurrentThread(m_thread.GetID())) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t offset, end_offset; 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString packet; 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutChar ('G'); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset = 0; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner end_offset = m_reg_data.GetByteSize(); 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(), 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.GetByteSize(), 281cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder(), 282cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder()); 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 285c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet.Printf (";thread:%4.4x;", m_thread.GetID()); 286c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate all register values 288a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded (true); 289a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 29661d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get each register individually 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.Printf ("P%x=", reg); 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size), 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner reg_info->byte_size, 308cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder(), 309cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder()); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 311c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 312c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet.Printf (";thread:%4.4x;", m_thread.GetID()); 313c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate just this register 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid[reg] = false; 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32161d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33761d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 3394912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton 3404912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 3414912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 343c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[32]; 344c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (thread_suffix_supported || GetGDBProcess().GetGDBRemote().SetCurrentThread(m_thread.GetID())) 3464912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 347c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 348c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 349c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4x", m_thread.GetID()); 350c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 351c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 352c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton assert (packet_len < (sizeof(packet) - 1)); 353c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 354c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false)) 3554912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 35661d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsErrorResponse()) 3574912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return false; 358c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 359139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton std::string &response_str = response.GetStringRef(); 360139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (isxdigit(response_str[0])) 361c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton { 362139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.insert(0, 1, 'G'); 363139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (thread_suffix_supported) 364139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton { 365139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton char thread_id_cstr[64]; 366139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4x;", m_thread.GetID()); 367139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.append (thread_id_cstr); 368139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton } 369139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton data_sp.reset (new DataBufferHeap (response_str.c_str(), response_str.size())); 3703058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton return true; 3713058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 3724912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 3734912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3753058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton data_sp.reset(); 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 382f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) 383f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 384f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 38561d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 3874912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 3884912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 390c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 391b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (thread_suffix_supported || GetGDBProcess().GetGDBRemote().SetCurrentThread(m_thread.GetID())) 3924912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 393efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // The data_sp contains the entire G response packet including the 394efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // G, and if the thread suffix is supported, it has the thread suffix 395efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // as well. 396efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const char *G_packet = (const char *)data_sp->GetBytes(); 397efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton size_t G_packet_len = data_sp->GetByteSize(); 398efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton if (gdb_comm.SendPacketAndWaitForResponse (G_packet, 399efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton G_packet_len, 400efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton response, 401efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton false)) 4024912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 40361d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 4044912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 405efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton else if (response.IsErrorResponse()) 406efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 407efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton uint32_t num_restored = 0; 408efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // We need to manually go through all of the registers and 409efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // restore them manually 4103058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4113058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.GetStringRef().assign (G_packet, G_packet_len); 4123058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.SetFilePos(1); // Skip the leading 'G' 4133058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton DataBufferHeap buffer (m_reg_data.GetByteSize(), 0); 4143058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton DataExtractor restore_data (buffer.GetBytes(), 4153058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton buffer.GetByteSize(), 4163058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetByteOrder(), 4173058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetAddressByteSize()); 4183058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4193058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const uint32_t bytes_extracted = response.GetHexBytes ((void *)restore_data.GetDataStart(), 4203058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton restore_data.GetByteSize(), 4213058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton '\xcc'); 4223058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4233058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (bytes_extracted < restore_data.GetByteSize()) 4243058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton restore_data.SetData(restore_data.GetDataStart(), bytes_extracted, m_reg_data.GetByteOrder()); 425efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton 426efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton //ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, DataExtractor &data) 427efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const RegisterInfo *reg_info; 42804d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // We have to march the offset of each register along in the 42904d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // buffer to make sure we get the right offset. 43004d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton uint32_t reg_byte_offset = 0; 43104d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton for (uint32_t reg_idx=0; (reg_info = GetRegisterInfoAtIndex (reg_idx)) != NULL; ++reg_idx, reg_byte_offset += reg_info->byte_size) 432efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 433efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 434efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton 435efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // Only write down the registers that need to be written 436efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // if we are going to be doing registers individually. 437efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton bool write_reg = true; 438efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 4393058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4403058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *restore_src = (const char *)restore_data.PeekData(reg_byte_offset, reg_byte_size); 4413058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (restore_src) 442efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 4433058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (m_reg_valid[reg]) 4443058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 4453058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *current_src = (const char *)m_reg_data.PeekData(reg_byte_offset, reg_byte_size); 4463058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (current_src) 4473058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0; 4483058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 4493058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4503058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (write_reg) 4513058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 4523058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton StreamString packet; 4533058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.Printf ("P%x=", reg); 4543058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.PutBytesAsRawHex8 (restore_src, 4553058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton reg_byte_size, 4563058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder(), 4573058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder()); 4583058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4593058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (thread_suffix_supported) 4603058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.Printf (";thread:%4.4x;", m_thread.GetID()); 4613058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 4623058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_valid[reg] = false; 4633058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 4643058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.GetString().size(), 4653058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response, 4663058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton false)) 4673058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 4683058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (response.IsOKResponse()) 4693058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton ++num_restored; 4703058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 4713058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 472efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 473efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 474efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return num_restored > 0; 475efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 4764912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 4774912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteDynamicRegisterInfo::HardcodeARMRegisters() 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static RegisterInfo g_register_infos[] = { 493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton// NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton// ====== ====== === === ============= ============ =================== =================== ====================== === ==== 4958c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r0", "arg1", 4, 0, eEncodingUint, eFormatHex, { gcc_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1,0, 0 }}, 4968c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r1", "arg2", 4, 0, eEncodingUint, eFormatHex, { gcc_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2,1, 1 }}, 4978c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r2", "arg3", 4, 0, eEncodingUint, eFormatHex, { gcc_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3,2, 2 }}, 4988c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r3", "arg4", 4, 0, eEncodingUint, eFormatHex, { gcc_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4,3, 3 }}, 499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r4", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, 4, 4 }}, 500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r5", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, 5, 5 }}, 501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r6", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, 6, 6 }}, 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r7", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, 7, 7 }}, 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r8", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, 8, 8 }}, 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r9", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, 9, 9 }}, 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r10", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, 10, 10 }}, 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r11", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, 11, 11 }}, 507b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r12", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, 12, 12 }}, 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "sp", "r13", 4, 0, eEncodingUint, eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, 13, 13 }}, 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "lr", "r14", 4, 0, eEncodingUint, eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, 14, 14 }}, 510b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "pc", "r15", 4, 0, eEncodingUint, eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, 15, 15 }}, 511b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f0", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 16, 16 }}, 512b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f1", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 17, 17 }}, 513b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f2", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 18, 18 }}, 514b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f3", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 19, 19 }}, 515b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f4", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 20, 20 }}, 516b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f5", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 21, 21 }}, 517b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f6", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 22, 22 }}, 518b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "f7", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 23, 23 }}, 519b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "fps", NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 24, 24 }}, 5208c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "cpsr","flags", 4, 0, eEncodingUint, eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_INVALID_REGNUM, 25, 25 }}, 521b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s0", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, 26, 26 }}, 522b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s1", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, 27, 27 }}, 523b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s2", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, 28, 28 }}, 524b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s3", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, 29, 29 }}, 525b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s4", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, 30, 30 }}, 526b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s5", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, 31, 31 }}, 527b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s6", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, 32, 32 }}, 528b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s7", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, 33, 33 }}, 529b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s8", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, 34, 34 }}, 530b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s9", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, 35, 35 }}, 531b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s10", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, 36, 36 }}, 532b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s11", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, 37, 37 }}, 533b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s12", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, 38, 38 }}, 534b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s13", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, 39, 39 }}, 535b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s14", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, 40, 40 }}, 536b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s15", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, 41, 41 }}, 537b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s16", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, 42, 42 }}, 538b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s17", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, 43, 43 }}, 539b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s18", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, 44, 44 }}, 540b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s19", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, 45, 45 }}, 541b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s20", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, 46, 46 }}, 542b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s21", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, 47, 47 }}, 543b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s22", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, 48, 48 }}, 544b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s23", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, 49, 49 }}, 545b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s24", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, 50, 50 }}, 546b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s25", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, 51, 51 }}, 547b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s26", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, 52, 52 }}, 548b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s27", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, 53, 53 }}, 549b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s28", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, 54, 54 }}, 550b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s29", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, 55, 55 }}, 551b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s30", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, 56, 56 }}, 552b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "s31", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, 57, 57 }}, 553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "fpscr",NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 58, 58 }}, 554b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d16", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, 59, 59 }}, 555b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d17", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, 60, 60 }}, 556b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d18", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, 61, 61 }}, 557b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d19", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, 62, 62 }}, 558b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d20", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, 63, 63 }}, 559b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d21", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, 64, 64 }}, 560b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d22", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, 65, 65 }}, 561b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d23", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, 66, 66 }}, 562b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d24", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, 67, 67 }}, 563b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d25", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, 68, 68 }}, 564b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d26", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, 69, 69 }}, 565b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d27", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, 70, 70 }}, 566b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d28", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, 71, 71 }}, 567b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d29", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, 72, 72 }}, 568b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d30", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, 73, 73 }}, 569b9e8f6e7a374d9313f89193e90ae41ef91712e5bGreg Clayton { "d31", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, 74, 74 }}, 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 572b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static const uint32_t num_registers = sizeof (g_register_infos)/sizeof (RegisterInfo); 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString gpr_reg_set ("General Purpose Registers"); 574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static ConstString sfp_reg_set ("Software Floating Point Registers"); 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString vfp_reg_set ("Floating Point Registers"); 576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t i; 577b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Calculate the offsets of the registers 578b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (g_register_infos[2].byte_offset == 0) 579b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t byte_offset = 0; 581b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton g_register_infos[i].byte_offset = byte_offset; 584b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton byte_offset += g_register_infos[i].byte_size; 585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString alt_name; 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].name && g_register_infos[i].name[0]) 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.SetCString(g_register_infos[i].name); 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0]) 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner alt_name.SetCString(g_register_infos[i].alt_name); 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i <= 15 || i == 25) 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, gpr_reg_set); 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (i <= 24) 599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, sfp_reg_set); 600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, vfp_reg_set); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 605