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" 20f4124deeb9532044a38c0774ced872f2709347daGreg Clayton#include "lldb/Target/ExecutionContext.h" 21b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen#include "lldb/Utility/Utils.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/StringExtractorGDBRemote.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ProcessGDBRemote.h" 25c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton#include "ProcessGDBRemoteLog.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ThreadGDBRemote.h" 2754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_GCC_Registers.h" 2854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_DWARF_Registers.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GDBRemoteRegisterContext constructor 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GDBRemoteRegisterContext 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadGDBRemote &thread, 3908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton uint32_t concrete_frame_idx, 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo ®_info, 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool read_all_at_once 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) : 4308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton RegisterContext (thread, concrete_frame_idx), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_info (reg_info), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid (), 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data (), 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_read_all_at_once (read_all_at_once) 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resize our vector of bools to contain one bool for every register. 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We will use these boolean values to know when a register value 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is valid in m_reg_data. 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid.resize (reg_info.GetNumRegisters()); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a heap based buffer that is big enough to store all registers 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP reg_data_sp(new DataBufferHeap (reg_info.GetRegisterDataByteSize(), 0)); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.SetData (reg_data_sp); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::~GDBRemoteRegisterContext() 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 68a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::InvalidateAllRegisters () 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::SetAllRegisterValid (bool b) 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<bool>::iterator pos, end = m_reg_valid.end(); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_reg_valid.begin(); pos != end; ++pos) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *pos = b; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterCount () 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisters (); 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterInfo * 8836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonGDBRemoteRegisterContext::GetRegisterInfoAtIndex (size_t reg) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterInfoAtIndex (reg); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSetCount () 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisterSets (); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 101b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterSet * 10236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonGDBRemoteRegisterContext::GetRegisterSet (size_t reg_set) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterSet (reg_set); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 110061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value) 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the register 113107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (ReadRegisterBytes (reg_info, m_reg_data)) 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 115061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const bool partial_data_ok = false; 116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error error (value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok)); 117061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return error.Success(); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122c3c4661c6a7527580e605dbb69bef7634971fe13Greg Claytonbool 123a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response) 124a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{ 125a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 126c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton if (reg_info == NULL) 127c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return false; 128a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 129a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Invalidate if needed 130a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 131a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 132a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 133a875b64ab8d258b28959d05eea37cb5dfdd72730Greg 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'); 134a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton bool success = bytes_copied == reg_byte_size; 135a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (success) 136a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 137c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid(reg, true); 138a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 139a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else if (bytes_copied > 0) 140a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 141402607fe513617c06282d4ae479522e244a53b71Johnny Chen // Only set register is valid to false if we copied some bytes, else 142a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // leave it as it was. 143c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid(reg, false); 144a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 145c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return success; 146a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton} 147a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 14874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen// Helper function for GDBRemoteRegisterContext::ReadRegisterBytes(). 14974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenbool 15074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny ChenGDBRemoteRegisterContext::GetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 15174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm) 15274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{ 15374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen char packet[64]; 15474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StringExtractorGDBRemote response; 15574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen int packet_len = 0; 15674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 15774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.GetThreadSuffixSupported()) 158a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4" PRIx64 ";", reg, m_thread.GetProtocolID()); 15974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen else 16074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg); 1613e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs assert (packet_len < ((int)sizeof(packet) - 1)); 16274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 16374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return PrivateSetRegisterValue (reg, response); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return false; 16674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen} 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 168107e53da8bdca540db8b734ed237688eaeee85c5Greg ClaytonGDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, DataExtractor &data) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 170f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 171402607fe513617c06282d4ae479522e244a53b71Johnny Chen 172f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 173f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 174f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 175f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 176f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 177f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 179a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 180a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 181061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 182061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 183c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (!GetRegisterIsValid(reg)) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 186088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for read register.")) 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 188c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 189f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 190a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID())) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 192c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[64]; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 194c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 198c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 199a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 200c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 201c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 2023e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs assert (packet_len < ((int)sizeof(packet) - 1)); 203c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20561d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsNormalResponse()) 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.GetHexBytes ((void *)m_reg_data.GetDataStart(), m_reg_data.GetByteSize(), '\xcc') == m_reg_data.GetByteSize()) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (true); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 210c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton else if (reg_info->value_regs) 21174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 21274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Process this composite register request by delegating to the constituent 21374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // primordial registers. 214c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 21574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Index of the primordial register. 21674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen bool success = true; 217c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton for (uint32_t idx = 0; success; ++idx) 21874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 219c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton const uint32_t prim_reg = reg_info->value_regs[idx]; 220c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (prim_reg == LLDB_INVALID_REGNUM) 221c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton break; 22274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // We have a valid primordial regsiter as our constituent. 22374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Grab the corresponding register info. 224c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg); 225c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (prim_reg_info == NULL) 22674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen success = false; 227c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton else 228c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 229c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // Read the containing register if it hasn't already been read 230c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (!GetRegisterIsValid(prim_reg)) 231c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton success = GetPrimordialRegister(prim_reg_info, gdb_comm); 23274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 23374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 234c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 23574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (success) 23674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 23774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // If we reach this point, all primordial register requests have succeeded. 23874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Validate this composite register. 239c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid (reg_info, true); 24074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 242c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton else 243c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 244c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // Get each register individually 245c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton GetPrimordialRegister(reg_info, gdb_comm); 246c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 249c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton else 250c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton { 25192e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham#if LLDB_CONFIGURATION_DEBUG 25292e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham StreamString strm; 25392e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham gdb_comm.DumpHistory(strm); 25492e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham Host::SetCrashDescription (strm.GetData()); 25592e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham assert (!"Didn't get sequence mutex for read register."); 25692e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham#else 257952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS)); 258c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton if (log) 2593355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 2603355946190428830d0fe7b51a4433b0aefc64362Greg Clayton if (log->GetVerbose()) 2613355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 2623355946190428830d0fe7b51a4433b0aefc64362Greg Clayton StreamString strm; 2633355946190428830d0fe7b51a4433b0aefc64362Greg Clayton gdb_comm.DumpHistory(strm); 2643355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending read register for \"%s\":\n%s", reg_info->name, strm.GetData()); 2653355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 2663355946190428830d0fe7b51a4433b0aefc64362Greg Clayton else 2673355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 2683355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending read register for \"%s\"", reg_info->name); 2693355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 2703355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 27192e6acda6b19fdb3359b7496c765245c99733c05Jim Ingham#endif 272c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton } 273a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 274a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Make sure we got a valid register value after reading it 275c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (!GetRegisterIsValid(reg)) 276a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (&data != &m_reg_data) 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 281a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // If we aren't extracting into our own buffer (which 282a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // only happens when this function is called from 283a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // ReadRegisterValue(uint32_t, Scalar&)) then 284a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // we transfer bytes from our buffer into the data 285a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // buffer that was passed in 286a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetByteOrder (m_reg_data.GetByteOrder()); 287a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size); 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 289a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return true; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 293061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::WriteRegister (const RegisterInfo *reg_info, 294061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue &value) 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 296061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton DataExtractor data; 297061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (value.GetData (data)) 298efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return WriteRegisterBytes (reg_info, data, 0); 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen// Helper function for GDBRemoteRegisterContext::WriteRegisterBytes(). 30374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenbool 30474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny ChenGDBRemoteRegisterContext::SetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 30574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm) 30674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{ 30774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StreamString packet; 30874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StringExtractorGDBRemote response; 30974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 31074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.Printf ("P%x=", reg); 31174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size), 31274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen reg_info->byte_size, 31374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen lldb::endian::InlHostByteOrder(), 31474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen lldb::endian::InlHostByteOrder()); 31574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 31674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.GetThreadSuffixSupported()) 317a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 31874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 31974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Invalidate just this register 320c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid(reg, false); 32174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 32274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.GetString().size(), 32374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen response, 32474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen false)) 32574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 32674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (response.IsOKResponse()) 32774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return true; 32874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 32974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return false; 33074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen} 33173f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 33273f6b49b568f48755bb5058a3db679c3b9093682Jim Inghamvoid 33373f6b49b568f48755bb5058a3db679c3b9093682Jim InghamGDBRemoteRegisterContext::SyncThreadState(Process *process) 33473f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham{ 33573f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham // NB. We assume our caller has locked the sequence mutex. 33673f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 33773f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *) process)->GetGDBRemote()); 33873f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham if (!gdb_comm.GetSyncThreadStateSupported()) 33973f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham return; 34073f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 34173f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham StreamString packet; 34273f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham StringExtractorGDBRemote response; 343a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet.Printf ("QSyncThreadState:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 34473f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 34573f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham packet.GetString().size(), 34673f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham response, 34773f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham false)) 34873f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham { 34973f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham if (response.IsOKResponse()) 35073f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham InvalidateAllRegisters(); 35173f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham } 35273f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham} 35373f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 355efe0b80e66ce326b23ad070b4eebcd3070c310deGreg ClaytonGDBRemoteRegisterContext::WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset) 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 357f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 358402607fe513617c06282d4ae479522e244a53b71Johnny Chen 359f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 360f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 361f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 362f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 363402607fe513617c06282d4ae479522e244a53b71Johnny Chen 364f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: This check isn't right because IsRunning checks the Public state, but this 366402607fe513617c06282d4ae479522e244a53b71Johnny Chen// is work you need to do - for instance in ShouldStop & friends - before the public 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// state has been changed. 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (gdb_comm.IsRunning()) 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton // Grab a pointer to where we are going to put this register 372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (dst == NULL) 375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return false; 376402607fe513617c06282d4ae479522e244a53b71Johnny Chen 377402607fe513617c06282d4ae479522e244a53b71Johnny Chen 378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (data.CopyByteOrderedData (data_offset, // src offset 379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // src length 380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton dst, // dst 381061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // dst length 382061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_data.GetByteOrder())) // dst byte order 383061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton { 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 385088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write register.")) 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 387c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 388f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 389a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID())) 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString packet; 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 393c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Set all registers in one packet 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutChar ('G'); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(), 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.GetByteSize(), 400cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder(), 401cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder()); 402402607fe513617c06282d4ae479522e244a53b71Johnny Chen 403c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 404a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 405c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate all register values 407a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded (true); 408a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 41561d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 423c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton bool success = true; 42474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 425c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg_info->value_regs) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 427c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // This register is part of another register. In this case we read the actual 428c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // register data for any "value_regs", and once all that data is read, we will 429c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // have enough data in our register context bytes for the value of this register 430c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 431c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // Invalidate this composite register first. 432c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 433c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton for (uint32_t idx = 0; success; ++idx) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 435c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton const uint32_t reg = reg_info->value_regs[idx]; 436c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg == LLDB_INVALID_REGNUM) 437c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton break; 438c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // We have a valid primordial regsiter as our constituent. 439c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // Grab the corresponding register info. 440c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton const RegisterInfo *value_reg_info = GetRegisterInfoAtIndex(reg); 441c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (value_reg_info == NULL) 442c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton success = false; 443c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton else 444c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton success = SetPrimordialRegister(value_reg_info, gdb_comm); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 447c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton else 448c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton { 449c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // This is an actual register, write it 450c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton success = SetPrimordialRegister(reg_info, gdb_comm); 451c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton } 45274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 453c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // Check if writing this register will invalidate any other register values? 454c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton // If so, invalidate them 455c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (reg_info->invalidate_regs) 45674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 457c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton for (uint32_t idx = 0, reg = reg_info->invalidate_regs[0]; 458c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg != LLDB_INVALID_REGNUM; 459c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton reg = reg_info->invalidate_regs[++idx]) 46074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 461c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid(reg, false); 46274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 46374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 464c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton 46574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return success; 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 469c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton else 470c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton { 471952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS)); 472c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton if (log) 4733355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 4743355946190428830d0fe7b51a4433b0aefc64362Greg Clayton if (log->GetVerbose()) 4753355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 4763355946190428830d0fe7b51a4433b0aefc64362Greg Clayton StreamString strm; 4773355946190428830d0fe7b51a4433b0aefc64362Greg Clayton gdb_comm.DumpHistory(strm); 4783355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending write register for \"%s\":\n%s", reg_info->name, strm.GetData()); 4793355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 4803355946190428830d0fe7b51a4433b0aefc64362Greg Clayton else 4813355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending write register for \"%s\"", reg_info->name); 4823355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 483c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton } 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 492f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 493402607fe513617c06282d4ae479522e244a53b71Johnny Chen 494f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 495f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 496f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 497f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 498402607fe513617c06282d4ae479522e244a53b71Johnny Chen 499f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 500f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 502402607fe513617c06282d4ae479522e244a53b71Johnny Chen 5034912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 504088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for read all registers.")) 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50673f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham SyncThreadState(process); 50773f6b49b568f48755bb5058a3db679c3b9093682Jim Ingham 508c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[32]; 509c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 510f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 511a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID())) 5124912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 513c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 514c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 515a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64, m_thread.GetProtocolID()); 516c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 517c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 5183e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs assert (packet_len < ((int)sizeof(packet) - 1)); 519c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 520c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false)) 5214912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 52261d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsErrorResponse()) 5234912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return false; 524402607fe513617c06282d4ae479522e244a53b71Johnny Chen 525139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton std::string &response_str = response.GetStringRef(); 526139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (isxdigit(response_str[0])) 527c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton { 528139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.insert(0, 1, 'G'); 529139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (thread_suffix_supported) 530139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton { 531139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton char thread_id_cstr[64]; 532a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 533139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.append (thread_id_cstr); 534139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton } 535139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton data_sp.reset (new DataBufferHeap (response_str.c_str(), response_str.size())); 5363058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton return true; 5373058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 5384912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 5394912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 541c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton else 542c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton { 543952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS)); 544c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton if (log) 5453355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 5463355946190428830d0fe7b51a4433b0aefc64362Greg Clayton if (log->GetVerbose()) 5473355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 5483355946190428830d0fe7b51a4433b0aefc64362Greg Clayton StreamString strm; 5493355946190428830d0fe7b51a4433b0aefc64362Greg Clayton gdb_comm.DumpHistory(strm); 5503355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending read all registers:\n%s", strm.GetData()); 5513355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 5523355946190428830d0fe7b51a4433b0aefc64362Greg Clayton else 5533355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending read all registers"); 5543355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 555c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton } 556c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton 5573058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton data_sp.reset(); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 564f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) 565f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 566f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 567f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 568402607fe513617c06282d4ae479522e244a53b71Johnny Chen 569f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 570f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 571f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 572f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 573402607fe513617c06282d4ae479522e244a53b71Johnny Chen 574f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 575f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 5774912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 578088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write all registers.")) 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 580c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 581f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 582a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID())) 5834912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 584efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // The data_sp contains the entire G response packet including the 585efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // G, and if the thread suffix is supported, it has the thread suffix 586efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // as well. 587efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const char *G_packet = (const char *)data_sp->GetBytes(); 588efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton size_t G_packet_len = data_sp->GetByteSize(); 589402607fe513617c06282d4ae479522e244a53b71Johnny Chen if (gdb_comm.SendPacketAndWaitForResponse (G_packet, 590402607fe513617c06282d4ae479522e244a53b71Johnny Chen G_packet_len, 591402607fe513617c06282d4ae479522e244a53b71Johnny Chen response, 592efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton false)) 5934912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 59461d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 5954912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 596efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton else if (response.IsErrorResponse()) 597efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 598efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton uint32_t num_restored = 0; 599efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // We need to manually go through all of the registers and 600efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // restore them manually 601402607fe513617c06282d4ae479522e244a53b71Johnny Chen 6023058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.GetStringRef().assign (G_packet, G_packet_len); 6033058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.SetFilePos(1); // Skip the leading 'G' 6043058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton DataBufferHeap buffer (m_reg_data.GetByteSize(), 0); 605402607fe513617c06282d4ae479522e244a53b71Johnny Chen DataExtractor restore_data (buffer.GetBytes(), 606402607fe513617c06282d4ae479522e244a53b71Johnny Chen buffer.GetByteSize(), 6073058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetByteOrder(), 6083058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetAddressByteSize()); 609402607fe513617c06282d4ae479522e244a53b71Johnny Chen 610402607fe513617c06282d4ae479522e244a53b71Johnny Chen const uint32_t bytes_extracted = response.GetHexBytes ((void *)restore_data.GetDataStart(), 611402607fe513617c06282d4ae479522e244a53b71Johnny Chen restore_data.GetByteSize(), 6123058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton '\xcc'); 6133058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 6143058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (bytes_extracted < restore_data.GetByteSize()) 6153058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton restore_data.SetData(restore_data.GetDataStart(), bytes_extracted, m_reg_data.GetByteOrder()); 616efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton 617efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton //ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, DataExtractor &data) 618efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const RegisterInfo *reg_info; 61904d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // We have to march the offset of each register along in the 62004d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // buffer to make sure we get the right offset. 62104d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton uint32_t reg_byte_offset = 0; 62204d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton for (uint32_t reg_idx=0; (reg_info = GetRegisterInfoAtIndex (reg_idx)) != NULL; ++reg_idx, reg_byte_offset += reg_info->byte_size) 623efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 624efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 625402607fe513617c06282d4ae479522e244a53b71Johnny Chen 62674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Skip composite registers. 62774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (reg_info->value_regs) 62874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen continue; 62974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 630402607fe513617c06282d4ae479522e244a53b71Johnny Chen // Only write down the registers that need to be written 631efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // if we are going to be doing registers individually. 632efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton bool write_reg = true; 633efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 6343058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 6353058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *restore_src = (const char *)restore_data.PeekData(reg_byte_offset, reg_byte_size); 6363058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (restore_src) 637efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 638c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton if (GetRegisterIsValid(reg)) 6393058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 6403058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *current_src = (const char *)m_reg_data.PeekData(reg_byte_offset, reg_byte_size); 6413058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (current_src) 6423058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0; 6433058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 644402607fe513617c06282d4ae479522e244a53b71Johnny Chen 6453058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (write_reg) 6463058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 6473058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton StreamString packet; 6483058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.Printf ("P%x=", reg); 6493058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.PutBytesAsRawHex8 (restore_src, 6503058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton reg_byte_size, 6513058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder(), 6523058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder()); 6533058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 6543058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (thread_suffix_supported) 655a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID()); 6563058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 657c290ba49b79c88ace8e5c58917489415e429ef01Greg Clayton SetRegisterIsValid(reg, false); 6583058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 6593058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.GetString().size(), 6603058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response, 6613058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton false)) 6623058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 6633058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (response.IsOKResponse()) 6643058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton ++num_restored; 6653058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 6663058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 667efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 668efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 669efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return num_restored > 0; 670efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 6714912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 6724912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 674c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton else 675c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton { 676952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS)); 677ceb7a52eaeb9d4265a577c55f7262d4e78063566Jim Ingham if (log) 6783355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 679ceb7a52eaeb9d4265a577c55f7262d4e78063566Jim Ingham if (log->GetVerbose()) 6803355946190428830d0fe7b51a4433b0aefc64362Greg Clayton { 6813355946190428830d0fe7b51a4433b0aefc64362Greg Clayton StreamString strm; 6823355946190428830d0fe7b51a4433b0aefc64362Greg Clayton gdb_comm.DumpHistory(strm); 6833355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending write all registers:\n%s", strm.GetData()); 6843355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 6853355946190428830d0fe7b51a4433b0aefc64362Greg Clayton else 6863355946190428830d0fe7b51a4433b0aefc64362Greg Clayton log->Printf("error: failed to get packet sequence mutex, not sending write all registers"); 6873355946190428830d0fe7b51a4433b0aefc64362Greg Clayton } 688c8dd570dddf0b73b74db5c1ecb8f18f023f864e7Greg Clayton } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num); 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 700b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny ChenGDBRemoteDynamicRegisterInfo::HardcodeARMRegisters(bool from_scratch) 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 702402607fe513617c06282d4ae479522e244a53b71Johnny Chen // For Advanced SIMD and VFP register mapping. 703402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d0_regs[] = { 26, 27, LLDB_INVALID_REGNUM }; // (s0, s1) 704402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d1_regs[] = { 28, 29, LLDB_INVALID_REGNUM }; // (s2, s3) 705402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d2_regs[] = { 30, 31, LLDB_INVALID_REGNUM }; // (s4, s5) 706402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d3_regs[] = { 32, 33, LLDB_INVALID_REGNUM }; // (s6, s7) 707402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d4_regs[] = { 34, 35, LLDB_INVALID_REGNUM }; // (s8, s9) 708402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d5_regs[] = { 36, 37, LLDB_INVALID_REGNUM }; // (s10, s11) 709402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d6_regs[] = { 38, 39, LLDB_INVALID_REGNUM }; // (s12, s13) 710402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d7_regs[] = { 40, 41, LLDB_INVALID_REGNUM }; // (s14, s15) 711402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d8_regs[] = { 42, 43, LLDB_INVALID_REGNUM }; // (s16, s17) 712402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d9_regs[] = { 44, 45, LLDB_INVALID_REGNUM }; // (s18, s19) 713402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d10_regs[] = { 46, 47, LLDB_INVALID_REGNUM }; // (s20, s21) 714402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d11_regs[] = { 48, 49, LLDB_INVALID_REGNUM }; // (s22, s23) 715402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d12_regs[] = { 50, 51, LLDB_INVALID_REGNUM }; // (s24, s25) 716402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d13_regs[] = { 52, 53, LLDB_INVALID_REGNUM }; // (s26, s27) 717402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d14_regs[] = { 54, 55, LLDB_INVALID_REGNUM }; // (s28, s29) 718402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d15_regs[] = { 56, 57, LLDB_INVALID_REGNUM }; // (s30, s31) 719f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q0_regs[] = { 26, 27, 28, 29, LLDB_INVALID_REGNUM }; // (d0, d1) -> (s0, s1, s2, s3) 720f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q1_regs[] = { 30, 31, 32, 33, LLDB_INVALID_REGNUM }; // (d2, d3) -> (s4, s5, s6, s7) 721f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q2_regs[] = { 34, 35, 36, 37, LLDB_INVALID_REGNUM }; // (d4, d5) -> (s8, s9, s10, s11) 722f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q3_regs[] = { 38, 39, 40, 41, LLDB_INVALID_REGNUM }; // (d6, d7) -> (s12, s13, s14, s15) 723f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q4_regs[] = { 42, 43, 44, 45, LLDB_INVALID_REGNUM }; // (d8, d9) -> (s16, s17, s18, s19) 724f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q5_regs[] = { 46, 47, 48, 49, LLDB_INVALID_REGNUM }; // (d10, d11) -> (s20, s21, s22, s23) 725f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q6_regs[] = { 50, 51, 52, 53, LLDB_INVALID_REGNUM }; // (d12, d13) -> (s24, s25, s26, s27) 726f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q7_regs[] = { 54, 55, 56, 57, LLDB_INVALID_REGNUM }; // (d14, d15) -> (s28, s29, s30, s31) 727402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q8_regs[] = { 59, 60, LLDB_INVALID_REGNUM }; // (d16, d17) 728402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q9_regs[] = { 61, 62, LLDB_INVALID_REGNUM }; // (d18, d19) 729402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q10_regs[] = { 63, 64, LLDB_INVALID_REGNUM }; // (d20, d21) 730402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q11_regs[] = { 65, 66, LLDB_INVALID_REGNUM }; // (d22, d23) 731402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q12_regs[] = { 67, 68, LLDB_INVALID_REGNUM }; // (d24, d25) 732402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q13_regs[] = { 69, 70, LLDB_INVALID_REGNUM }; // (d26, d27) 733402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q14_regs[] = { 71, 72, LLDB_INVALID_REGNUM }; // (d28, d29) 734402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q15_regs[] = { 73, 74, LLDB_INVALID_REGNUM }; // (d30, d31) 735402607fe513617c06282d4ae479522e244a53b71Johnny Chen 736b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // This is our array of composite registers, with each element coming from the above register mappings. 737b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen static uint32_t *g_composites[] = { 738b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_d0_regs, g_d1_regs, g_d2_regs, g_d3_regs, g_d4_regs, g_d5_regs, g_d6_regs, g_d7_regs, 739b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_d8_regs, g_d9_regs, g_d10_regs, g_d11_regs, g_d12_regs, g_d13_regs, g_d14_regs, g_d15_regs, 740b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_q0_regs, g_q1_regs, g_q2_regs, g_q3_regs, g_q4_regs, g_q5_regs, g_q6_regs, g_q7_regs, 741b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_q8_regs, g_q9_regs, g_q10_regs, g_q11_regs, g_q12_regs, g_q13_regs, g_q14_regs, g_q15_regs 742b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen }; 743b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen 744b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static RegisterInfo g_register_infos[] = { 745402607fe513617c06282d4ae479522e244a53b71Johnny Chen// NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB VALUE REGS INVALIDATE REGS 746402607fe513617c06282d4ae479522e244a53b71Johnny Chen// ====== ====== === === ============= ============ =================== =================== ====================== === ==== ========== =============== 747402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r0", "arg1", 4, 0, eEncodingUint, eFormatHex, { gcc_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1,0, 0 }, NULL, NULL}, 748402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r1", "arg2", 4, 0, eEncodingUint, eFormatHex, { gcc_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2,1, 1 }, NULL, NULL}, 749402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r2", "arg3", 4, 0, eEncodingUint, eFormatHex, { gcc_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3,2, 2 }, NULL, NULL}, 750402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r3", "arg4", 4, 0, eEncodingUint, eFormatHex, { gcc_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4,3, 3 }, NULL, NULL}, 751402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r4", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, 4, 4 }, NULL, NULL}, 752402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r5", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, 5, 5 }, NULL, NULL}, 753402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r6", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, 6, 6 }, NULL, NULL}, 754402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r7", "fp", 4, 0, eEncodingUint, eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, 7, 7 }, NULL, NULL}, 755402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r8", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, 8, 8 }, NULL, NULL}, 756402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r9", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, 9, 9 }, NULL, NULL}, 757402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r10", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, 10, 10 }, NULL, NULL}, 758402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r11", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, 11, 11 }, NULL, NULL}, 759402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r12", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, 12, 12 }, NULL, NULL}, 760402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "sp", "r13", 4, 0, eEncodingUint, eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, 13, 13 }, NULL, NULL}, 761402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "lr", "r14", 4, 0, eEncodingUint, eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, 14, 14 }, NULL, NULL}, 762402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "pc", "r15", 4, 0, eEncodingUint, eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, 15, 15 }, NULL, NULL}, 763402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f0", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 16, 16 }, NULL, NULL}, 764402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f1", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 17, 17 }, NULL, NULL}, 765402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f2", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 18, 18 }, NULL, NULL}, 766402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f3", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 19, 19 }, NULL, NULL}, 767402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f4", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 20, 20 }, NULL, NULL}, 768402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f5", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 21, 21 }, NULL, NULL}, 769402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f6", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 22, 22 }, NULL, NULL}, 770402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f7", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 23, 23 }, NULL, NULL}, 771402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "fps", NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 24, 24 }, NULL, NULL}, 772402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "cpsr","flags", 4, 0, eEncodingUint, eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_INVALID_REGNUM, 25, 25 }, NULL, NULL}, 773402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s0", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, 26, 26 }, NULL, NULL}, 774402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s1", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, 27, 27 }, NULL, NULL}, 775402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s2", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, 28, 28 }, NULL, NULL}, 776402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s3", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, 29, 29 }, NULL, NULL}, 777402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s4", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, 30, 30 }, NULL, NULL}, 778402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s5", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, 31, 31 }, NULL, NULL}, 779402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s6", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, 32, 32 }, NULL, NULL}, 780402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s7", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, 33, 33 }, NULL, NULL}, 781402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s8", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, 34, 34 }, NULL, NULL}, 782402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s9", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, 35, 35 }, NULL, NULL}, 783402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s10", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, 36, 36 }, NULL, NULL}, 784402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s11", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, 37, 37 }, NULL, NULL}, 785402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s12", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, 38, 38 }, NULL, NULL}, 786402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s13", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, 39, 39 }, NULL, NULL}, 787402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s14", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, 40, 40 }, NULL, NULL}, 788402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s15", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, 41, 41 }, NULL, NULL}, 789402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s16", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, 42, 42 }, NULL, NULL}, 790402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s17", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, 43, 43 }, NULL, NULL}, 791402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s18", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, 44, 44 }, NULL, NULL}, 792402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s19", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, 45, 45 }, NULL, NULL}, 793402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s20", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, 46, 46 }, NULL, NULL}, 794402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s21", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, 47, 47 }, NULL, NULL}, 795402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s22", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, 48, 48 }, NULL, NULL}, 796402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s23", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, 49, 49 }, NULL, NULL}, 797402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s24", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, 50, 50 }, NULL, NULL}, 798402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s25", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, 51, 51 }, NULL, NULL}, 799402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s26", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, 52, 52 }, NULL, NULL}, 800402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s27", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, 53, 53 }, NULL, NULL}, 801402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s28", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, 54, 54 }, NULL, NULL}, 802402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s29", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, 55, 55 }, NULL, NULL}, 803402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s30", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, 56, 56 }, NULL, NULL}, 804402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s31", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, 57, 57 }, NULL, NULL}, 805402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "fpscr",NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 58, 58 }, NULL, NULL}, 806402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d16", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, 59, 59 }, NULL, NULL}, 807402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d17", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, 60, 60 }, NULL, NULL}, 808402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d18", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, 61, 61 }, NULL, NULL}, 809402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d19", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, 62, 62 }, NULL, NULL}, 810402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d20", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, 63, 63 }, NULL, NULL}, 811402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d21", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, 64, 64 }, NULL, NULL}, 812402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d22", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, 65, 65 }, NULL, NULL}, 813402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d23", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, 66, 66 }, NULL, NULL}, 814402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d24", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, 67, 67 }, NULL, NULL}, 815402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d25", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, 68, 68 }, NULL, NULL}, 816402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d26", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, 69, 69 }, NULL, NULL}, 817402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d27", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, 70, 70 }, NULL, NULL}, 818402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d28", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, 71, 71 }, NULL, NULL}, 819402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d29", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, 72, 72 }, NULL, NULL}, 820402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d30", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, 73, 73 }, NULL, NULL}, 821402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d31", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, 74, 74 }, NULL, NULL}, 822402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d0", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, 75, 75 }, g_d0_regs, NULL}, 823402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d1", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, 76, 76 }, g_d1_regs, NULL}, 824402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d2", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, 77, 77 }, g_d2_regs, NULL}, 825402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d3", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, 78, 78 }, g_d3_regs, NULL}, 826402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d4", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, 79, 79 }, g_d4_regs, NULL}, 827402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d5", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, 80, 80 }, g_d5_regs, NULL}, 828402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d6", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, 81, 81 }, g_d6_regs, NULL}, 829402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d7", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, 82, 82 }, g_d7_regs, NULL}, 830402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d8", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, 83, 83 }, g_d8_regs, NULL}, 831402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d9", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, 84, 84 }, g_d9_regs, NULL}, 832402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d10", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, 85, 85 }, g_d10_regs, NULL}, 833402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d11", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, 86, 86 }, g_d11_regs, NULL}, 834402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d12", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, 87, 87 }, g_d12_regs, NULL}, 835402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d13", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, 88, 88 }, g_d13_regs, NULL}, 836402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d14", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, 89, 89 }, g_d14_regs, NULL}, 837402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d15", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, 90, 90 }, g_d15_regs, NULL}, 838402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q0", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q0, LLDB_INVALID_REGNUM, 91, 91 }, g_q0_regs, NULL}, 839402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q1", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q1, LLDB_INVALID_REGNUM, 92, 92 }, g_q1_regs, NULL}, 840402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q2", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q2, LLDB_INVALID_REGNUM, 93, 93 }, g_q2_regs, NULL}, 841402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q3", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q3, LLDB_INVALID_REGNUM, 94, 94 }, g_q3_regs, NULL}, 842402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q4", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q4, LLDB_INVALID_REGNUM, 95, 95 }, g_q4_regs, NULL}, 843402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q5", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q5, LLDB_INVALID_REGNUM, 96, 96 }, g_q5_regs, NULL}, 844402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q6", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q6, LLDB_INVALID_REGNUM, 97, 97 }, g_q6_regs, NULL}, 845402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q7", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q7, LLDB_INVALID_REGNUM, 98, 98 }, g_q7_regs, NULL}, 846402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q8", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q8, LLDB_INVALID_REGNUM, 99, 99 }, g_q8_regs, NULL}, 847402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q9", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q9, LLDB_INVALID_REGNUM, 100, 100 }, g_q9_regs, NULL}, 848402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q10", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q10, LLDB_INVALID_REGNUM, 101, 101 }, g_q10_regs, NULL}, 849402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q11", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q11, LLDB_INVALID_REGNUM, 102, 102 }, g_q11_regs, NULL}, 850402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q12", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q12, LLDB_INVALID_REGNUM, 103, 103 }, g_q12_regs, NULL}, 851402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q13", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q13, LLDB_INVALID_REGNUM, 104, 104 }, g_q13_regs, NULL}, 852402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q14", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q14, LLDB_INVALID_REGNUM, 105, 105 }, g_q14_regs, NULL}, 853402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q15", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q15, LLDB_INVALID_REGNUM, 106, 106 }, g_q15_regs, NULL} 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 855b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 85608af5983cb349e7167f3832d00d36ca611bfa2f1Johnny Chen static const uint32_t num_registers = llvm::array_lengthof(g_register_infos); 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString gpr_reg_set ("General Purpose Registers"); 858b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static ConstString sfp_reg_set ("Software Floating Point Registers"); 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString vfp_reg_set ("Floating Point Registers"); 86036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t i; 861b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (from_scratch) 862b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 863b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // Calculate the offsets of the registers 864b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // Note that the layout of the "composite" registers (d0-d15 and q0-q15) which comes after the 865b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // "primordial" registers is important. This enables us to calculate the offset of the composite 866b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // register by using the offset of its first primordial register. For example, to calculate the 867b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // offset of q0, use s0's offset. 868b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (g_register_infos[2].byte_offset == 0) 869b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 870b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen uint32_t byte_offset = 0; 871b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen for (i=0; i<num_registers; ++i) 872f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen { 873b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // For primordial registers, increment the byte_offset by the byte_size to arrive at the 874b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // byte_offset for the next register. Otherwise, we have a composite register whose 875b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // offset can be calculated by consulting the offset of its first primordial register. 876b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (!g_register_infos[i].value_regs) 877b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 878b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_register_infos[i].byte_offset = byte_offset; 879b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen byte_offset += g_register_infos[i].byte_size; 880b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 881b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen else 882b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 883b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen const uint32_t first_primordial_reg = g_register_infos[i].value_regs[0]; 884b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen g_register_infos[i].byte_offset = g_register_infos[first_primordial_reg].byte_offset; 885b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 886f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen } 887b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 888b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen for (i=0; i<num_registers; ++i) 889b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 890b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen ConstString name; 891b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen ConstString alt_name; 892b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (g_register_infos[i].name && g_register_infos[i].name[0]) 893b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen name.SetCString(g_register_infos[i].name); 894b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0]) 895b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen alt_name.SetCString(g_register_infos[i].alt_name); 896b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen 897b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen if (i <= 15 || i == 25) 898b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen AddRegister (g_register_infos[i], name, alt_name, gpr_reg_set); 899b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen else if (i <= 24) 900b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen AddRegister (g_register_infos[i], name, alt_name, sfp_reg_set); 901f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen else 902b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen AddRegister (g_register_infos[i], name, alt_name, vfp_reg_set); 903b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 904b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 905b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen else 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 907b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen // Add composite registers to our primordial registers, then. 90836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_composites = llvm::array_lengthof(g_composites); 909ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton const size_t num_dynamic_regs = GetNumRegisters(); 910ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton const size_t num_common_regs = num_registers - num_composites; 911ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton RegisterInfo *g_comp_register_infos = g_register_infos + num_common_regs; 912ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton 913ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // First we need to validate that all registers that we already have match the non composite regs. 914ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // If so, then we can add the registers, else we need to bail 915ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton bool match = true; 916ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (num_dynamic_regs == num_common_regs) 917b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 918ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton for (i=0; match && i<num_dynamic_regs; ++i) 919b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 920ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // Make sure all register names match 921ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (m_regs[i].name && g_register_infos[i].name) 922b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 923ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (strcmp(m_regs[i].name, g_register_infos[i].name)) 924b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen { 925ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton match = false; 926ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton break; 927ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 928ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 929ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton 930ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // Make sure all register byte sizes match 931ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (m_regs[i].byte_size != g_register_infos[i].byte_size) 932ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 933ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton match = false; 934ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton break; 935ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 936ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 937ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 938ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton else 939ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 940ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // Wrong number of registers. 941ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton match = false; 942ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 943ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // If "match" is true, then we can add extra registers. 944ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (match) 945ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 946ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton for (i=0; i<num_composites; ++i) 947ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 948ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton ConstString name; 949ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton ConstString alt_name; 950ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton const uint32_t first_primordial_reg = g_comp_register_infos[i].value_regs[0]; 951ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton const char *reg_name = g_register_infos[first_primordial_reg].name; 952ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (reg_name && reg_name[0]) 953ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 954ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton for (uint32_t j = 0; j < num_dynamic_regs; ++j) 955ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 956ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton const RegisterInfo *reg_info = GetRegisterInfoAtIndex(j); 957ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // Find a matching primordial register info entry. 958ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton if (reg_info && reg_info->name && ::strcasecmp(reg_info->name, reg_name) == 0) 959ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton { 960ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // The name matches the existing primordial entry. 961ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton // Find and assign the offset, and then add this composite register entry. 962ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton g_comp_register_infos[i].byte_offset = reg_info->byte_offset; 963ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton name.SetCString(g_comp_register_infos[i].name); 964ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton AddRegister(g_comp_register_infos[i], name, alt_name, vfp_reg_set); 965ca97fbbe67ff8c59f5a2ed76d1c5f6a3c93d1a57Greg Clayton } 966b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 967b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 968b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 969b7cdd6ce21c735292d468510c95f7d2316f54b9cJohnny Chen } 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 972