GDBRemoteRegisterContext.cpp revision 8c2d6099c3b9973e26918f4e7f7819696efafc58
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 122061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (ReadRegisterBytes (reg_info, value, 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 159061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, 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)) 233061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return WriteRegisterBytes (reg_info, value, data, 0); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 239061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, const RegisterValue &value, 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 3594912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton response.GetStringRef().insert(0, 1, 'G'); 360c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 361c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton { 362c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char thread_id_cstr[64]; 363c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4x;", m_thread.GetID()); 364c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton response.GetStringRef().append (thread_id_cstr); 365c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton } 366c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton data_sp.reset (new DataBufferHeap (response.GetStringRef().c_str(), 367c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton response.GetStringRef().size())); 3684912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 3694912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 3704912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 378f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) 379f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 380f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 38161d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton GDBRemoteCommunicationClient &gdb_comm (GetGDBProcess().GetGDBRemote()); 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 3834912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 3844912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 386c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (thread_suffix_supported || GetGDBProcess().GetGDBRemote().SetCurrentThread(m_thread.GetID())) 3884912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 3894912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse((const char *)data_sp->GetBytes(), 3904912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton data_sp->GetByteSize(), 3914912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton response, 3924912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton false)) 3934912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 39461d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 3954912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 3964912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 3974912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num); 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteDynamicRegisterInfo::HardcodeARMRegisters() 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static RegisterInfo g_register_infos[] = { 413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton// NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB 414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton// ====== ====== === === ============= ============ =================== =================== ====================== === ==== 4158c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r0", "arg1", 4, 0, eEncodingUint, eFormatHex, { gcc_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1,0, 0 }}, 4168c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r1", "arg2", 4, 0, eEncodingUint, eFormatHex, { gcc_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2,1, 1 }}, 4178c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r2", "arg3", 4, 0, eEncodingUint, eFormatHex, { gcc_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3,2, 2 }}, 4188c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "r3", "arg4", 4, 0, eEncodingUint, eFormatHex, { gcc_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4,3, 3 }}, 419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r4", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, 4, 4 }}, 420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r5", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, 5, 5 }}, 421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r6", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, 6, 6 }}, 422b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r7", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, 7, 7 }}, 423b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r8", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, 8, 8 }}, 424b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r9", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, 9, 9 }}, 425b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r10", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, 10, 10 }}, 426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r11", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, 11, 11 }}, 427b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "r12", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, 12, 12 }}, 428b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "sp", "r13", 4, 0, eEncodingUint, eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, 13, 13 }}, 429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "lr", "r14", 4, 0, eEncodingUint, eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, 14, 14 }}, 430b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "pc", "r15", 4, 0, eEncodingUint, eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, 15, 15 }}, 431b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f0", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 16, 16 }}, 432b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f1", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 17, 17 }}, 433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f2", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 18, 18 }}, 434b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f3", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 19, 19 }}, 435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f4", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 20, 20 }}, 436b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f5", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 21, 21 }}, 437b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f6", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 22, 22 }}, 438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "f7", NULL, 12, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 23, 23 }}, 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "fps", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 24, 24 }}, 4408c2d6099c3b9973e26918f4e7f7819696efafc58Greg Clayton { "cpsr","flags", 4, 0, eEncodingUint, eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_INVALID_REGNUM, 25, 25 }}, 441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s0", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, 26, 26 }}, 442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s1", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, 27, 27 }}, 443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s2", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, 28, 28 }}, 444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s3", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, 29, 29 }}, 445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s4", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, 30, 30 }}, 446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s5", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, 31, 31 }}, 447b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s6", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, 32, 32 }}, 448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s7", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, 33, 33 }}, 449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s8", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, 34, 34 }}, 450b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s9", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, 35, 35 }}, 451b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s10", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, 36, 36 }}, 452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s11", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, 37, 37 }}, 453b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s12", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, 38, 38 }}, 454b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s13", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, 39, 39 }}, 455b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s14", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, 40, 40 }}, 456b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s15", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, 41, 41 }}, 457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s16", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, 42, 42 }}, 458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s17", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, 43, 43 }}, 459b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s18", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, 44, 44 }}, 460b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s19", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, 45, 45 }}, 461b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s20", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, 46, 46 }}, 462b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s21", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, 47, 47 }}, 463b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s22", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, 48, 48 }}, 464b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s23", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, 49, 49 }}, 465b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s24", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, 50, 50 }}, 466b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s25", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, 51, 51 }}, 467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s26", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, 52, 52 }}, 468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s27", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, 53, 53 }}, 469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s28", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, 54, 54 }}, 470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s29", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, 55, 55 }}, 471b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s30", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, 56, 56 }}, 472b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "s31", NULL, 4, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, 57, 57 }}, 473b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "fpscr",NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 58, 58 }}, 474b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d16", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, 59, 59 }}, 475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d17", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, 60, 60 }}, 476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d18", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, 61, 61 }}, 477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d19", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, 62, 62 }}, 478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d20", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, 63, 63 }}, 479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d21", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, 64, 64 }}, 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d22", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, 65, 65 }}, 481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d23", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, 66, 66 }}, 482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d24", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, 67, 67 }}, 483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d25", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, 68, 68 }}, 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d26", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, 69, 69 }}, 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d27", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, 70, 70 }}, 486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d28", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, 71, 71 }}, 487b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d29", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, 72, 72 }}, 488b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d30", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, 73, 73 }}, 489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { "d31", NULL, 8, 0, eEncodingIEEE754, eFormatHex, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, 74, 74 }}, 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 492b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static const uint32_t num_registers = sizeof (g_register_infos)/sizeof (RegisterInfo); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString gpr_reg_set ("General Purpose Registers"); 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static ConstString sfp_reg_set ("Software Floating Point Registers"); 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString vfp_reg_set ("Floating Point Registers"); 496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t i; 497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Calculate the offsets of the registers 498b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (g_register_infos[2].byte_offset == 0) 499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t byte_offset = 0; 501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 502b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton g_register_infos[i].byte_offset = byte_offset; 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton byte_offset += g_register_infos[i].byte_size; 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 507b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name; 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString alt_name; 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].name && g_register_infos[i].name[0]) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.SetCString(g_register_infos[i].name); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0]) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner alt_name.SetCString(g_register_infos[i].alt_name); 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i <= 15 || i == 25) 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, gpr_reg_set); 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (i <= 24) 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, sfp_reg_set); 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, vfp_reg_set); 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 525